Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Changelog

Notable changes in every released version, newest first. Versions follow
the crates.io releases; from 0.7.0 on each one is also a git tag and a
GitHub release with prebuilt binaries. The Homebrew tap, the AUR and the
apt repository joined later, and carry every version since.

## 0.40.0 - 2026-11-07

- Calendar now combines macro releases with AlphAI's batched earnings calendar
  for watchlist and portfolio tickers. Scheduled, reported with a read pending,
  and read available states show sessions, filing times and earnings verdicts.
- `f` filters All / Reports / Macro; `v` opens full event details. Enter opens
  the exact linked read, preserving the selected share class and portfolio
  context. Pending reads keep the displayed document until an explicit refresh.
- A shared near window replaces the per-company full-history sweep. Default
  continuous Calendar polling for up to 50 names uses about 32 calendar requests
  per day including macro, before other activity. Corporate polling has one-hour
  and six-hour floors; errors wait for manual retry.

## 0.39.0 - 2026-11-07

- Named color presets now paint their own background and body text across
  every view, panel and dialog. Dark colors no longer wash out on a light
  terminal, and light presets stay readable on a dark terminal. Choose
  `catppuccin-latte` or `gruvbox-light` for a light app.
- `[theme] background` overrides the app background. Set it to `"reset"`
  to keep the terminal background with a matching preset; `text = "reset"`
  also keeps the terminal foreground. The `default` preset continues to
  use the terminal's colors.

## 0.38.0 - 2026-11-06

- Every view now shows `A alert` beside the selection keys in its footer,
  making price alerts easier to discover. The hint follows custom
  keybindings and is visible at 80 columns with the default keys.
- Shorter navigation labels keep all footer actions within 110 columns.

## 0.37.0 - 2026-11-06

- `A` sets a session-only price alert for the selected ticker or Portfolio
  holding: `>= 150` for an upward crossing, `<= 140` for a downward one.
  `Enter` arms or rearms it, an empty line clears it, and `Esc` cancels.
  One level per ticker uses the existing quote updates, including available
  pre/post-market prices, without extra requests. It fires once until
  explicitly rearmed; cached prices and older prints cannot trigger it.
- A fired alert shows its ticker, level, observed price and feed in a
  bottom-row banner, including in bare mode, and sends one terminal bell.
  Multiple events queue without moving the views, and close arrivals
  share a bell. The alert dialog retains the provider and detection times.
- Levels appear as dotted lines within the chart's existing scale and
  exact labels above it. The quote rail shows alert status; watchlist and
  Portfolio symbols mark armed, waiting and fired rules. Source changes
  keep the baseline so an after-hours gap or outage can cross the level;
  a change between known currencies pauses the rule.

## 0.36.0 - 2026-10-27

- Mouse support, on by default. A click on a header pill switches the
  view; a click on a ticker in the quote rail, in the watchlist, on a
  Summary card or on a Portfolio row selects it; a click on a news or
  insider row selects it, and a second click on the same row opens its
  card; a click on a row of the Split news strip opens the News view on
  that article; a click on a Calendar row selects the event. The wheel
  moves the cursor in lists and scrolls the article card, the earnings
  read, the help and the settings. Inside the category picker a click
  ticks a row, inside the ticker search it picks a result, and a click
  outside the help or the article card closes it. The wheel never loads
  another feed page and never changes the chart preset, so a trackpad
  flick costs no requests.
- `M` hands the mouse back to the terminal, which then selects text as
  usual, and takes it again. The new **Mouse** row in settings does the
  same and Save remembers it as `[ui] mouse = false`. The action is
  `toggle_mouse` in `[keybindings]`.

## 0.35.0 - 2026-10-19

- Ticker news now groups reprints into one row per story by default, like
  the market feed, with an outlet count such as `×4`. The new **Collapse news**
  setting controls both feeds; turn it off and Save to see every article.
  The same choice is available as `[ui] collapse_news` in the config file.
  Changing the option refreshes the news feed without restarting.
  Grouped stories also stay together across pages and live updates when
  their representative article changes. Trending remains grouped.

## 0.34.0 - 2026-10-16

- `/` finds a watchlist ticker from any view.
  Type part of its symbol or company name, move with the arrow keys and
  press Enter to select it; Esc leaves the ticker and reading position
  alone. Exact symbols come first, then prefixes and other matches. The
  results show regular-session quotes, daily changes and cached or stale
  labels where needed. Company names come with Yahoo quotes and survive
  in the quote cache; other sources can still be searched by symbol.
  Searching adds no requests and does not edit the saved watchlist.
  Portfolio selects the matching holding, or opens the chart if it is not held.
  The opening key can be changed with `find_ticker` in `[keybindings]`.
- Split gives the chart 70% of the height, with the watchlist and news
  sharing the remaining 30% below it.
- Update the locked transitive `chacha20` dependency from the yanked
  0.10.1 release to 0.10.2, removing the packaging warning.

## 0.33.0 - 2026-10-16

- Instrument names containing spaces are rejected before being added to the
  watchlist or sent to a data provider. The add-ticker prompt explains the
  correction; CLI arguments and saved ticker entries use the same check.
  A saved watchlist with an invalid entry stops startup and names the entry
  to correct. Ticker punctuation is preserved, and surrounding whitespace
  is trimmed consistently when loading or editing the watchlist.

## 0.32.0 - 2026-10-16

- Calendar opens with a summary of the remaining macro events and watchlist
  reports today and over the next seven ET dates, including today. It
  separates high-importance releases and marks counts based on incomplete
  checks or cached data as known. An unloaded macro schedule is labelled
  loading or unavailable instead of showing a zero count.
- The selected calendar event has a detail area below the list with its
  full name, schedule status, reference period, press-conference time,
  source and freshness. It gives space back to the agenda in short panes;
  narrow panes use a compact summary. Both additions use data already
  loaded, with no extra requests or new keys.

## 0.31.0 - 2026-10-13

- News can be filtered by category. `C` in the News and Split views opens
  a checklist of the feed's fourteen categories: `space` toggles one, `o`
  keeps only the one under the cursor, `a` brings them all back and
  `Enter` applies the choice. The server does the filtering, as it does
  for the score, so a hidden category takes no slot on the page, and
  applying a choice refetches the feed once. The panel title names what is left
  (`without movers, other`). `news_categories` (only these) or
  `news_exclude_categories` (all but these) in `[ui]` set the starting
  choice. The trending scope is a curated top ten and is not filtered.
- Every row of the news list names its category. Articles filed as "other"
  used to leave the column blank, which on a ticker feed could be a third
  of the rows or more, and some labels were cut to three letters (`reg`,
  `geo`, `corp`). The column now spells them out and is as wide as the
  longest label in the feed. The article card shows the full name.
- The News footer shows `C category` in place of `r refresh` to stay
  within 110 columns; `?` still lists every key.

## 0.30.1 - 2026-10-09

- A config file that does not load is no longer written over. Such a file
  used to start the session on the defaults with a warning only visible
  after exit, and the next `a`, `d` or `p` saved those defaults over it,
  API keys included. Now the footer names the file and the error, those
  keys leave it alone, and Save in the settings screen keeps a copy as
  `config.toml.broken` before replacing it. A file fixed while the app
  runs is not overwritten by Save either: it asks for a restart.
- A `[[positions]]` entry with a missing or mistyped field is skipped with a
  warning instead of failing the whole file, and stays in the file as
  typed, a misspelled field name included.
- `a`, `d` and `p` apply their one change to the config as it is on disk,
  under a lock file beside it (`config.toml.lock`), so two panes on one
  config no longer drop each other's tickers and holdings. Save in the
  settings screen keeps the holdings on disk too. A change that could not
  be written is kept and goes in with the next write that succeeds.
- The config file is created user-only before any key is written to it,
  instead of being restricted right after the write. The quote cache uses
  a temporary file per process, so two panes cannot swap in each other's
  half-written cache.
- Building from source needs Rust 1.89, for the standard library's file
  locks.

## 0.30.0 - 2026-10-05

- Fade price colors over 900 ms without changing text weight or decoration,
  and show a fixed-width ASCII indicator while requests are in progress.
  The new Animations settings row previews and saves an off switch; ANSI
  themes retain their own palette and use a brief color highlight.
- Render on input, data and clock changes, with a frame limit during
  effects and slower refresh activity. Idle screens no longer rebuild ten
  times a second, and slow terminals skip missed animation frames.
- Reserve space for changing quote values and session countdowns on wide
  rails. Truncate headlines by display cells without splitting graphemes.
  Settings keep the selected row visible even in small panes.
- Use synchronized output only when the current Unix terminfo entry
  advertises a compatible Sync capability. End each frame on render errors
  and unwinding too; missing support keeps ordinary output. The file-only
  `ui.synchronized_output` switch can disable the extension.

## 0.29.0 - 2026-10-01

- Separate the current quote from the last chart bar: the quote rail shows
  the quote's currency, feed and trade time, while the chart names the last
  bar's close, feed and start time. Price markers distinguish quotes,
  extended trades and bar closes. The header focuses on navigation and
  connection status; hiding the rail restores quote details in the chart.
- News cards lead with the selected company's AI impact and explanation,
  before the general summary and other companies. The selected company
  stays visible even when it appears after several others in the analysis.
- Calendar gives long event names more room and reserves stronger color
  for the event and its importance. Status labels remain visible on narrow
  terminals.
- Insider filings use a ledger with transaction date, side, value, owner
  and a plan flag. Cards lead with the company, owner and trade facts,
  followed by a separately labelled AI interpretation. Unknown trade dates
  stay unknown, and buy/sell labels follow the filing rather than sentiment.
- Shorten the README, bring installation and quick start forward, and
  collapse the screenshot galleries while keeping the configuration,
  scripting examples and provider limitations available.

## 0.28.0 - 2026-09-30

- Where the premarket and after-hours price comes from is a setting of its
  own: `extended_source` in the config and a Pre/after hours row in the
  settings screen. IEX, behind Tiingo and Alpaca's free feed, barely
  trades before the open: one CoreWeave morning showed a single IEX trade
  of 11 shares against 581,000 on the whole market, at a price more than
  a dollar away. `auto`, the default, now takes the whole market for any
  source that sees one exchange or none: Alpaca's consolidated feed,
  15 minutes behind, when Alpaca keys are set, otherwise Yahoo. That
  gives Tiingo and Finnhub a real premarket for the first time. `same`
  keeps the source's own, `alpaca` and `yahoo` name the provider.
- A borrowed extended print now always replaces the source's own while it
  covers the session under way, instead of losing to a newer-looking IEX
  one. On Alpaca's IEX feed this shows the consolidated print, 15 minutes
  late, where a fresher single-venue trade used to win; `same` brings
  that back.
- Tiingo dates an extended print by the bar that traded it: its quote row
  carries the time of the request, so an hour-old trade read as current.
  Outside the session the price no longer moves the last candle between
  refreshes either, which drew flat bars nobody traded.
- The settings screen is grouped into prices, API keys, news and look.
  Each key row says what the current choices use it for, the Pre/after
  hours row says what `auto` resolves to, and the bottom of the box
  explains the row under the cursor. A short terminal drops the spacing
  and the footer before the rows.

## 0.27.0 - 2026-09-30

- Tiingo is a fourth price source: `-s tiingo`, a key row in the settings
  screen, `[keys] tiingo` or `TIINGO_API_KEY`. Quotes and intraday bars
  come from IEX in real time, pre and post market included from 08:00 to
  17:30 ET. Daily charts use Tiingo's consolidated end-of-day history with
  the whole market's volume, and crypto works as `BTC-USD`. One request per
  poll quotes the whole watchlist; bars and daily history are cached, and
  the live price moves the last candle between refreshes. The free plan's
  50 requests an hour suit a couple of tickers polled every few minutes; a
  paid plan covers a live dashboard. The README explains how the IEX
  reference price and IEX's volume are shown.

## 0.26.0 - 2026-09-29

- `[ui] borders = "none"` draws panels as tinted surfaces separated by a
  small gutter, with the title above each one, instead of frame lines.
  Rounded frames stay the default; a new Panels row in the settings screen
  switches between the three looks live. Overlays keep their frame either
  way. On the `default` theme, which cannot know the terminal's
  background, tinted panels are told apart by the gutter and their titles
  alone.
- News shows the ticker's chart over the list, next to the article card.
  The article under the cursor is the highlighted mark on the chart and the
  chart's bottom line names it, so the story and the move it came with are
  on one screen. It costs no requests. It needs 120 columns and the ticker
  scope; elsewhere the list and the card stand side by side as before. `x`
  cycles to the stacked and the side-by-side layouts, and a new News layout
  row in the settings screen saves the choice to `[ui] news_layout`.
  There `v` reads the article in place: the chart stays on top, full
  width, and the card takes the list's room below it, instead of a card
  over the whole screen.
- The Split view puts the chart across the full width of the top half, with
  the watchlist and the news feed side by side under it. The chart shows
  twice the candles, and a short watchlist no longer leaves half of its
  panel empty.
- The Insider view shows the selected filing's full card beside the list:
  the trade, who made it, the AI read and the stake it moved. `v` hides the
  card for a full-width list and brings it back; on a terminal too narrow
  for both, the short pane under the list stays and `v` opens the card
  over the screen as before.
- Secondary text is readable. Sources, ages, axis labels, key hints and the
  analysis in the article card used the terminal's dim attribute, which
  several terminals render close to the background. The presets now draw
  them in their palette's secondary text color (catppuccin's subtext,
  gruvbox's fg3), checked against WCAG contrast in the tests. The analysis
  text in the card is body text again. The `default` theme keeps dim, the
  one muted shade that works on both dark and light terminals.
- The cursor row in lists keeps its colors: presets mark it with a
  background instead of reverse video, so a green arrow or a yellow score
  stays green or yellow under the cursor.
- Pre-market and after-hours shading is tinted from the panel color, so
  it stands apart from the regular session on tinted panels as well.
- Five new `[theme]` slots (`text`, `subtle`, `faint`, `selection`,
  `surface`) cover the new colors.
- A feed refresh that brings a new story to the top no longer swaps the
  article being read: the cursor stays on it.
- The Theme row in the settings screen named the old `p` key; it now says
  `}` and `{`.
- The README shows every preset side by side, each on a terminal wearing
  its palette, instead of a gif cycling them on one. `YAHOO_CHART_URL`
  joins the env-only debug overrides, and the recording tapes write their
  throwaway key file with private permissions.

## 0.25.0 - 2026-09-27

- `a` and `d` save the watchlist to the config straight away, the way a
  holding is saved. Before, an added ticker was gone on the next start
  unless Save in the settings screen came first. A session started on
  tickers from the command line leaves a saved watchlist alone, so that
  `alphai-tui TSLA` and one keypress cannot replace it, and the footer says
  the change was not saved.
- `E` says why when it has nothing to draw: daily candles cover the regular
  session only, crypto trades around the clock, pre and post market are
  drawn for US listings only, and Finnhub has no candle history at all. On
  Finnhub the chart title reads `EXT: n/a` instead of `EXT: no data`, which
  looked like a gap the next poll might fill.
- Daily charts on Alpaca's IEX feed draw the consolidated daily bars. IEX
  is one exchange with a few percent of the tape, so its daily volume was
  some thirty times too small (0.84M against 30.1M for AAPL on 25
  September) and its high and low were one venue's. The current day keeps
  its live IEX close. This costs one request per ticker a minute; if it is
  refused, the chart keeps IEX's own bars and labels the volume `IEX only`
  as before.
- A notice in the footer, such as the one about switching to another price
  source, now comes before the key hints for its minute on screen. Behind
  them it started past column 95 and a common terminal cut it off.

## 0.24.1 - 2026-09-22

- The `1mo / 60m` preset works on Yahoo again. Yahoo keeps bars finer than
  an hour for 60 days and refused the three months the preset's indicator
  warm-up asked for, ever since 0.23.0 started fetching hourly bars as half
  hours. The request now asks for 59 trading days, which reaches about
  twelve weeks back. On Alpaca the same request serves as the extended
  hours fallback, so its refusal had also switched that fallback off for
  two minutes at a time.
- A preset or session change no longer redraws the bars already on screen
  on the new window while the source answers. The chart keeps drawing the
  rows it has on the window they were fetched for and names the one on its
  way in the title, `loading 1mo / 60m` or `EXT: loading`, or says the
  request failed once it has actually been refused. Switching extended
  hours off takes effect at once. On Alpaca, which pages consolidated
  history, the old rows had shown for a few seconds as 15m bars on an
  hourly axis and then jumped.
- Alpaca's extended hours candles arrive sooner after a refused request. An
  answer that left the chart with nothing to draw is asked for again after
  15 seconds instead of a minute, and a history walk that lost a page on
  the way is walked again rather than marked complete, which had left the
  older sessions without consolidated bars until a restart.

## 0.24.0 - 2026-09-17

- Add `9:Calendar`, combining US macro releases and confirmed watchlist
  report dates, with countdowns, source links and a cursor that stays on
  the selected event while new dates arrive. Dates without a time remain
  dates in ET; estimated, postponed and cancelled events are labelled.
- Show a fresh upcoming-event flag in the quote rail. A confirmed report
  date for the selected ticker takes priority over macro releases.
- Share one cached macro window across all views and check report dates
  gradually while Calendar is open. Preserve successful rows on an update
  failure, show partial progress, and pause the sweep on access/limit errors.
  Calendar refresh retries missing, stale and failed dates while retaining
  fresh successful company dates.
- Document Calendar with a screenshot and refresh the chart screenshot
  with daily candles, moving averages, volume and RSI.

## 0.23.2 - 2026-09-17

- A bar is its interval at every width. A plot too narrow for the whole
  window now shows its newest bars and counts the rest in the title, such
  as `last 70 of 192 bars`, instead of merging bars into larger candles,
  which the chart had done since its first version and 0.23.1 had only
  labelled. The split view's half-width chart draws the same bars as the
  chart view, fewer of them, and the price axis follows the bars on
  screen. To see more of the window, widen the terminal or pick a coarser
  interval with `t`.

## 0.23.1 - 2026-09-17

- Volume on Alpaca's IEX mode sits on one scale. Once consolidated
  extended-hours candles are on the chart, the regular IEX candles take the
  consolidated count of the same bar instead of IEX's own few percent of
  the tape, which had made the regular session read as the quietest part
  of the day next to the closing auction. The newest 15 minutes wait for
  the delayed feed. With extended hours off the panel keeps IEX's counts
  and says `IEX only`.
- Consolidated history is paged back to the start of the IEX series once
  per chart window. Alpaca sizes a bars page by the minute bars behind it,
  about two weeks of extended hours, so a month-long window used to get
  consolidated candles and volume for its newest two weeks only.
- Volume bars are drawn in eighths of a row, so a regular session next to
  a closing auction no longer collapses to the minimum height.
- Narrow charts merge bars into larger candles on clock boundaries: 10m,
  15m, 30m, 1h and so on from the session's opening, then whole sessions,
  and daily bars into weeks, months, quarters and years. The title names
  the size, such as `30m candles`. The same window draws the same candles
  in the split and chart views, and a new bar changes only the newest
  candle; before, groups of equal count shifted with every bar and the
  two views disagreed on what a candle was.

## 0.23.0 - 2026-09-14

- Premarket and after-hours candles are enabled by default. Warm and cool
  backgrounds distinguish them from regular trading across price, volume
  and RSI, in both candle and line charts. `Shift+E` toggles them, with a
  hint beside `EXT` that remains visible when the sessions are hidden and
  follows custom keybindings.
- Alpaca's IEX mode supplements extended trading with consolidated SIP
  data delayed by 15 minutes, then Yahoo when SIP is unavailable or missing
  the relevant session. Supplemental results are cached; failed refreshes
  retain known data, and Yahoo rate limits pause its fallback requests.
  The regular quote and regular candles retain their original feed.
- Extended quotes carry their source, timestamp, age and reference close.
  A zero-percent move remains visible, and a new premarket retires the
  previous after-hours quote. Portfolio valuations and JSON use the same
  validated price and reference; JSON includes the extended feed and session.
- Charts now start at `5d / 15m`, the same full-history preset available
  through `t` and `T`. The header shows both the history window and candle
  size alongside the switch hint. Short intraday histories fill the plot
  width instead of leaving a large empty area on the left. Explicit
  `range`, `interval` and `[chart] extended_hours` settings still apply.
- A shared time axis adds more clock labels, dates, opening and closing
  markers and aligned vertical grid lines across all three chart panels.
  US stocks default to New York time, with `local` and `utc` alternatives
  under `[chart] timezone`. Session shading and the grid are configurable.
- Session boundaries account for holidays, half days and daylight-saving
  changes. Hourly and display aggregation keep different sessions and feeds
  apart, and future time labels skip closed US sessions.
- A live quote updates only its own candle interval, session and feed.
  Late poll responses from an old chart selection are ignored, preventing
  a regular close or an outdated fetch from overwriting extended history.

## 0.22.1 - 2026-09-13

- Brand spelling in the interface text and docs is now `AlphAI`, the form on
  the logo. Nothing functional changed: the binary, the crate and the config
  keys are untouched.

## 0.22.0 - 2026-09-11

- Portfolio valuations include premarket and after-hours prices whenever
  the source reports them, independently of the extended-candle toggle.
  The portfolio, holding columns, quote rail and JSON use the same price;
  `Last` marks an extended price with `*`, and JSON exposes it as
  `position.price`. Premarket `Day` is measured from the latest regular
  close; after hours it includes the regular session's move as well.
- A Portfolio view, `8`, for what you actually hold: quantity, average
  price, value, the day's move in money, the profit or loss since you
  bought and the share of the portfolio each ticker carries, with a total
  underneath. It was the one thing the widely used tools here are built
  around and this one had no answer to.
- `p` sets the holding for the ticker under the cursor, from any view: a
  quantity and an average price on one line, prefilled with what is held,
  an empty line clearing it. Unlike every other runtime change, it is
  written to the config file straight away, because a quantity and a price
  are your data rather than a display preference.
- Holdings can be written by hand as `[[positions]]` entries with
  `symbol`, `qty` and `avg_price`. A fractional quantity is fine, and a
  negative one is a short, which profits when the price falls.
- A held ticker that is not on the watchlist is polled all the same, so
  every row can be valued; the startup warning about a source's request
  budget counts those tickers too. A row whose first price has not arrived
  says so instead of being summed in as zero, and the total states how
  many rows it covers.
- The watchlist table grows `Value` and `P&L` columns, and the quote rail
  a zone with the same numbers, but only for tickers you hold. Totals that
  span several currencies are labelled `mixed currencies`: there is no
  conversion here, and a sum across currencies should not look exact.
- `--json` carries a `position` object for a held ticker, with the cost,
  the value, the profit or loss and its percentage, so a status bar can
  show the money instead of the price.
- **The color presets moved from `p` and `P` to `}` and `{`**, which is
  what freed `p`. The old keys are two lines away in the config:
  `[keybindings] next_theme = "p"` and `prev_theme = "P"`.
- The config file is now written to a temporary file and renamed into
  place. It holds API keys, and it is written on every position edit, so a
  half-finished write should never be able to replace it.
- Prices that survive a source fallback are labelled with their real age
  instead of passing as live: a quote carries the source it came from, and
  a row inherited from the abandoned one keeps the time it was fetched.
  Adding credentials in the settings screen also makes a fallback search
  that had run out of options worth trying again.
- The quote cache is written out when the app exits, so a session shorter
  than its flush interval still leaves its prices behind for the next
  start, and a failed write backs off like a successful one.
- News marks respect the length of a candle: a mark lands on the bar whose
  interval actually contains its publish time, so an overnight gap or a
  missing recent bar no longer pins unrelated news to the last candle.

## 0.21.0 - 2026-09-11

Never tagged on its own: everything below shipped with 0.22.0, whose
release notes carry it too.

- The price chart marks the ticker's news on the candles it was published
  in: `▲` or `▼` for the AI sentiment call, `◆` when it is neutral, dimmer
  or brighter with the relevance score, and the freshest of them named on
  the chart's bottom border. The scored news was the one thing here no
  other terminal stock tool has, and it lived in a view of its own, so a
  chart-first reader never saw it; now the move and its reason share a
  column. `n` toggles the marks, `[chart] news_markers = false` starts
  without them, and the action is rebindable as `news_markers`.
- The marks cost no API request. They are drawn from the news bundle the
  Split and News views already keep fresh for the selected ticker, which
  also means they are absent until one of those views has loaded it.
- Rows older than the first candle on screen are dropped rather than
  pinned to the left edge, and a candle that carried several stories keeps
  the highest-scoring one, so a busy day stays readable.
- The Split view's footer drops its `s settings` hint to stay inside 110
  columns, the way the News footer already does. `?` still lists it.
- A blocked or throttled price source no longer means an empty screen. The
  last good quotes and candles are kept in the platform cache directory and
  drawn while the first poll is in flight, labelled `cached 2h ago` on the
  quote rail until live data lands. Entries older than a week, or taken
  with a different range and interval, are ignored.
- Yahoo's `429` now says what it is: an IP block that lasts tens of minutes
  (measured: 19 minutes after about ten requests, over an hour for the
  second one that day), with the advice to switch source. It is also no
  longer retried, since another request only feeds the counter that holds
  the block open. Alpaca's 429, which is a genuine transient refusal, keeps
  its retries.
- When every ticker has been failing for 45 seconds, the app switches to
  another source that has its credentials, keeps the rows already on
  screen, and says so in the footer. It never switches back on its own and
  never returns to a source that failed this session; `source_fallback =
  false` in the config turns it off.
- `--json` prints the one-shot quote run as a JSON array instead of a text
  table, for status bars and cron jobs: price, the move from the previous
  close, the extended print with its own move from the regular close, the
  day and 52 week ranges, volume and the source. It implies `--once`.
  Absent figures are left out rather than sent as null, a symbol that
  failed gets a row carrying its error, and warnings stay on stderr so
  stdout is a valid document.

## 0.20.0 - 2026-09-10

- `E` draws the pre and post market candles on the chart, not just the
  extended price beside it. `[chart] extended_hours = true` starts that
  way. Yahoo is the only source that can answer it: Alpaca's free IEX feed
  carries no extended-hours bars at all, and Finnhub has no candle history
  to extend.
- The day range on the quote rail now comes from the source's own figure
  for the regular session rather than being folded out of the candles,
  which stopped being the same number once the extended ones could be
  drawn.
- A Summary view (`7`): the whole watchlist as small charts at once, in a
  grid sized to the terminal. The Table view already lists every ticker,
  but a sparkline squeezed into one row answers up or down and nothing
  else; this spends real rows on each name, so one glance covers the shape
  of the session across the watchlist. Cards keep a sane height rather
  than stretching to fill a tall terminal, where the session's own jitter
  would read as noise instead of a path. `↑` `↓` move between cards and
  page the grid when the watchlist outgrows the screen.

- The watchlist is editable while the app runs. `a` opens a prompt, the
  typed ticker joins the list and is polled from the next tick; `d` removes
  the selected one. Until now the watchlist could only be set with command
  line arguments or by hand-editing the config, so following a name someone
  mentioned meant quitting first. Both keys are rebindable as `add_ticker`
  and `remove_ticker`, and both are session-only like every other runtime
  change: Save in the settings screen writes the watchlist to the config.
- The last ticker cannot be removed. Every view is scoped to a selected
  ticker, so an empty watchlist needs empty states before it can be
  reached.

- Extended-hours prices. After the closing bell the quote rail carries the
  late print as its own zone, labelled `AH` (or `PRE` before the open), with
  the move measured against the close the way a broker screen reads it. The
  headline price stays the regular close, so the two facts no longer
  overwrite each other: on 9 September AAPL closed down 0.28% and traded up
  0.68% after hours, and only the first of those was visible. This is the
  half that was missing from the news views, where a filing lands at 20:00
  and the price beside it could not move until the next morning. The
  watchlist table grows an `Ext Δ%` column when any row has a late print,
  and gives the width back during the session, when there is nothing to
  show.
- The year's range and the day's volume at the end of the rail, on sources
  that report them. Like every other zone they are dropped first as the
  terminal narrows.
- All of it rides in the request each source already makes, so a poll still
  costs exactly what it did.
- Sources differ in what they can answer, and now say so rather than
  guessing. Yahoo reports all three. Alpaca's free IEX feed is one exchange
  rather than the whole tape: it has no extended-hours prints, and its
  share count is a few percent of the day's volume, so that figure is no
  longer shown as the volume (it returns on `ALPACA_FEED=sip`). Finnhub's
  quote endpoint is regular session only.

## 0.17.2 - 2026-09-10

- Prices no longer drop out when the source refuses a request. Alpaca's data
  edge turns down roughly one request in seven with a bare "too many
  requests", and it does so no matter how slowly you ask: twenty requests
  sent as fast as the socket allowed were refused twice, and the same twenty
  paced at two per second were refused four times. Nothing was over any
  published limit. One refusal used to be enough to leave a ticker showing an
  error until the next poll, and to make `--once` print nothing but the
  error; watching two symbols failed that way half the time. A refused
  request is now retried, briefly and up to twice, which brings the same
  check to twenty nine runs in thirty. Gateway errors are retried the same
  way. A wrong key, an unknown symbol and a source that is genuinely down
  still answer immediately, as before.

## 0.17.1 - 2026-09-08

- The first refresh of a feed no longer lifts an old article to the top of it.
  That first check asks the server for the newest rows by arrival, and a page
  cut that way ends at a different article than the page ordered by
  publication, so the two disagree at the bottom edge. What sits below that
  edge is old news the first page cut off, and it was landing above everything
  else: a ticker feed whose twenty rows spanned two weeks showed a twelve day
  old article above one published an hour ago. Those rows now stay out, and
  paging down still reaches them in their own place. Later refreshes are
  unchanged, so an article that reaches the feed behind its own publish time
  still goes to the top carrying the new row marker, which is the reason to
  refresh by arrival at all.

## 0.17.0 - 2026-09-06

- Bare mode: `z` hides the header and the footer and gives both rows to the
  view, `--bare` starts that way and `[ui] bare = true` makes it the
  default. A tmux pane carries its own status bar and its own idea of which
  window it is, so the app's chrome is two rows it can put to better use.
  The quote rail stays, so a bare pane still names its ticker and its price,
  and the frame titles still name the view.
- The `[keybindings]` example in the README moves off `z`, which now has a
  default binding of its own.

## 0.16.0 - 2026-09-05

- New quote rail: one line under the tabs, in every view, with the selected
  ticker's price and change, where that price sits between the session low
  and high, the state of the US market and the rest of the watchlist as
  percentages. Until now only the Split, Table and Chart views showed a
  price at all, so in News, Insider and Earnings the ticker was a name in a
  frame title, moving between tickers was a blind jump, and the pulse that
  marks a fresh price was invisible. The line drops its parts one at a time
  as the terminal narrows and keeps the symbol and the price to the last;
  `[ui] quote_rail = false` turns it off, and a terminal under 12 rows
  keeps the row for the view.
- The rail says what the US market is doing (pre, live, post or closed) and
  how long until the next bell, holidays and Good Friday included, so a
  price that has not moved in hours reads as a closed market rather than as
  a broken feed. Crypto is marked as trading around the clock instead.
- A source whose prices are delayed (Yahoo, or Alpaca on
  `ALPACA_FEED=delayed_sip`) now says so on the rail.
- The app checks the poll budget: a watchlist and interval that together
  exceed the data plan's requests a minute warn on startup and under the
  interval in the settings screen, naming an interval that fits. Going over
  the ceiling turned tickers into `error` rows with nothing explaining why.

## 0.15.0 - 2026-09-02

- New Earnings view (`6`): AlphaAI's structured read of the selected
  ticker's own earnings filing. The verdict and the reason for it, the
  metric table with prior quarter, prior year and both changes, segments,
  the outlook, concerns, what to watch and the analysis. Every figure was
  checked against the filing text before publication and prints as the
  filing wrote it, with units shortened and nothing rounded into a new
  number. American 8-K item 2.02 filings and foreign private issuers' 6-K
  releases are both covered, and older quarters continue below the newest
  read. The metric table is banded row by row and led by dots from each
  name across to its figures, and it is only as wide as its own content,
  so a wide terminal does not leave half a screen between a name and its
  numbers. Paragraphs stop at a readable width for the same reason.
- A ticker with no read yet shows the date of its next report when the
  company has confirmed one, instead of an empty screen.
- The bottom line of the view carries the next US macro releases (CPI, the
  jobs report, FOMC decisions and the rest), with estimated dates named as
  estimated.
- News feed: the earnings filing itself is now marked `8-K` or `6-K` in
  place of its category, which tells it apart from the coverage around it,
  and its article card carries a short form of the read once the Earnings
  view has loaded one. The card still makes no requests of its own.
- New `--earnings TICKER` flag prints the latest read to stdout and exits,
  for a pipe or a tmux pane.
- The view tabs in the header shrink to their hotkeys on narrow terminals,
  so the clock and the chart interval stay visible.
- Budget: one request per ticker while the Earnings view is on screen,
  cached for an hour, plus one shared macro-calendar request every six
  hours. Both are silent about failures that no retry would fix.

## 0.14.0 - 2026-08-26

- Feeds now poll for arrivals instead of refetching the published head of
  the list, so articles that reach the feed after they were published (a
  Form 4 lands days after its trade) are no longer missed. New rows are
  merged at the top of the list and carry the unseen marker.
- Polling also runs while you are scrolled down the feed. Until now a
  reader who had moved off the first row got no updates at all.
- A failed poll leaves the feed on screen with a note under the list
  instead of replacing the view with an error.
- The request budget is unchanged: one request per cache lifetime per
  visible feed.

## 0.13.0 - 2026-08-11

- Insider view: a chart panel of Form 4 events with weekly dollar bars,
  `g` cycles the window between 3 months, 12 months and off. Sales,
  purchases and buybacks get their own markers, 10b5-1 trades are dimmed.
- The selected filing is highlighted on the chart, and the detail pane
  gains the stake change, the tranche count and a late filing flag.
- The view header is now a 12 month rollup. The panel rides along with
  the feed request, so it costs no extra API calls.

## 0.12.0 - 2026-08-03

- Volume bars under the price chart, `b` toggles the panel.
- `e` switches the two moving averages between simple and exponential.

## 0.11.0 - 2026-07-26

- Nine named color presets, `--theme` at startup, `p` and `P` to cycle
  them live, and a row in the settings form.
- Rounded panel frames and a themed border color slot.
- Fix: on narrow terminals the watchlist drops columns instead of
  squeezing all of them.
- Fix: the left arrow steps back through a settings row's choices.
- Packaging: apt repository for Debian and Ubuntu.

## 0.10.2 - 2026-07-25

- Fix: feeds page at 20 rows, the widest page every AlphaAI plan allows.
  The window was half that, because it used the server default.
- Packaging: AUR package `alphai-tui-bin`, published from CI.

## 0.10.1 - 2026-07-23

- Fix: the live quote is folded into the newest candle, so the chart and
  the price in the header no longer disagree between candle closes.

## 0.10.0 - 2026-07-22

- The chart keeps a margin to the right of the last candle with a line
  and a tag at the live price. `[chart] right_margin_pct` sizes it.
- A price change flashes in the header, the price tag and the quotes
  table.
- The poll interval is editable in the settings form and applies live.

## 0.9.0 - 2026-07-21

- `[keybindings]` config section: every action can be remapped, with
  named keys and modifiers. A bad binding is a warning, not a failure.
- `?` opens a help overlay listing every action with its current keys and
  the name to use in the config file.
- Packaging: releases publish to crates.io and the Homebrew tap on their
  own, without a manual step.

## 0.8.0 - 2026-07-12

- Rows that appeared since you last looked at a feed carry a `●` marker
  that goes out once the cursor rests on them.
- `[ui] alphai_ttl_secs` sets how long news, sentiment and insider data
  stay cached.

## 0.7.0 - 2026-07-11

- `+` and `-` set the score filter of the visible feed live: relevance
  for news, trade size for insider rows. `[ui] news_min_score` and
  `[ui] insider_min_score` set the startup values.
- Insider rows read the trade from the structured Form 4 fields, so the
  side, the 10b5-1 flag and the filer's title come from the filing
  instead of the headline.
- Moving averages and reference lines draw as continuous braille lines
  over the candles.
- `[theme]` colors every semantic slot, `[ui]` and `[chart]` set startup
  defaults, and `--config PATH` picks a different config file.
- Prebuilt binaries for five platforms on every release, and `--version`.

## 0.5.0 - 2026-07-10

First public release.

- Views: quotes table, chart, news, insider and a split dashboard.
- Prices from Yahoo without a key, or from Finnhub or Alpaca with one.
- Candlestick or line chart with SMA 20 and 100, an RSI(14) panel and
  interval presets, drawn with enough warm-up history for the overlays
  to be correct from the first visible candle.
- AlphaAI news with the full analysis card, market and trending scopes,
  paging, sentiment and SEC Form 4 insider activity.
- In-app settings, a config file holding keys and the watchlist.