Omastonk
Omastonk is a multi-symbol market widget for the Omarchy bar. It rotates through a watchlist of symbols, showing the current quote and daily direction for each, with a chart panel (one day to five years) per symbol.
<img width="766" height="750" alt="preview" src="https://github.com/user-attachments/assets/caaef0c6-9584-4f2a-9696-2a0f2b7f0f83" /> <img width="756" height="566" alt="screenshot-2026-08-21_10-11-24" src="https://github.com/user-attachments/assets/e0a6a192-6562-4005-baed-fe6880807a29" />Forked from brianblakely/omastonk.
Install
omarchy plugin add https://github.com/LucaNerlich/omastonk.git --enable --yes
Update to the latest release:
omarchy plugin update luca.omastonk
Usage
Omastonk starts with an empty watchlist. Right-click it to add symbols; the
bar rotates through them every rotateSeconds seconds (default 5). Left-click
the widget to open the chart panel. Scroll the wheel or middle-click to cycle
symbols without opening the panel.
In the chart panel:
- Click a symbol tab or press
Up/Down(orJ/K) to switch symbols. - Press
1–9to jump to the Nth symbol. - Click an interval or press
Left/Right(orH/L) to switch between 5Y, 1Y, YTD, 6M, 1M, 5D, and 1D (the last choice is remembered). - Press
Escapeto close.
Right-click the widget to edit the watchlist: add symbols in the field at
the bottom (space-separated works too; suggestions appear as you type),
rename rows inline, reorder with ▲/▼, and remove entries with the ✕
button. Save commits whatever is typed in the add field.
Each widget instance keeps its own watchlist, so multiple instances can track
different markets. Enable extra instances with
omarchy plugin enable luca.omastonk (the manifest sets allowMultiple).
Overlapping symbols share one backend poller automatically.
Settings
Widget settings live inline on the entry in ~/.config/omarchy/shell.json:
| Key | Default | Description |
|---|---|---|
symbols |
[] |
Watchlist of market symbols to rotate through, e.g. AAPL, SPY, BTC-USD, ^GSPC. A legacy single symbol string is migrated to this list on first save. |
activeSymbol |
first symbol | Symbol shown when the widget loads. |
rotateSeconds |
5 |
Seconds each symbol stays on the bar before rotating. 0 disables rotation. |
displayMode |
full |
Bar label density: full (symbol, price, daily %, glyph), symbolPrice, priceOnly, or symbolOnly. |
pollIntervalSecs |
60 |
Seconds between refreshes of each individual symbol (minimum 5). |
chartInterval |
1D |
Last selected chart range (5Y, 1Y, YTD, 6M, 1M, 5D, 1D). |
Quotes are fetched from Yahoo Finance and refreshed on the poll interval per symbol, staggered so requests are spread out.
Architecture
- Rust backend (
omastonk-qs): fetches Yahoo Finance quotes for the whole watchlist with staggered round-robin polling and streams JSON lines; also serves chart close-series and symbol search. Multiplewatchclients share one localservedaemon over a Unix socket (in-process fallback if the socket cannot start). - QML frontend (
omarchy/): abar-widgetplugin.BarWidget.qmlrunsomastonk-qs watchonce and updates from its JSON lines;Panel.qmlrenders charts viaomastonk-qs chart, offerssearchautocomplete, and owns the watchlist editor. All data collection stays in Rust; the QML is pure presentation.
omastonk-qs watch ──(JSON lines)──▶ BarWidget ─▶ Panel
omastonk-qs chart ──(JSON line)───▶ Panel
omastonk-qs search ─(JSON line)───▶ Panel editor
The plugin bundles a statically linked x86_64 musl build of its backend
(omarchy/bin/omastonk-qs). If the bundled binary cannot start, the widget
falls back to an omastonk-qs binary on PATH (cargo install --path .).
Development
make test # cargo tests
make plugin-test # node omarchy/model.test.mjs
make clippy # clippy -D warnings
make fmt # rustfmt
make validate # omarchy plugin validate . + qmllint (on an Omarchy machine)
make bundle # rebuild omarchy/bin/omastonk-qs + hashes
make verify-bundle # marketplace attestation (reproducible musl rebuild)
Any edit under src/, Cargo.toml, Cargo.lock, or rust-toolchain.toml
changes the bundled ELF — including comments. Run make bundle in the same
change as the Rust edit; do not merge while the marketplace bundle CI job
is red.
Releasing
- Bump
versioninCargo.tomlandmanifest.json(they must match), add a## [X.Y.Z]section toCHANGELOG.md, then runmake bundle. - Open a PR and wait for CI — including the independent marketplace bundle job — to pass on the merged SHA.
- Tag the merged commit
vX.Y.Zand push it. The Release workflow re-runs the bundle checks, packagesomastonk-qs-X.Y.Z-linux-x86_64.tar.gz, and publishes the GitHub Release with the changelog section as release notes.
Uninstall
omarchy plugin remove luca.omastonk
License
MIT. Original single-symbol widget by Brian Blakely, also MIT.