CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# 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.