Downloads

Every StockDock release, newest first. Once installed, the app updates itself, so you only need this page for a new Mac or to go back to an older version. The .dmg is the easy one: open it and drag StockDock into Applications. All builds are signed and notarized by Apple.

brew install simonsruggi/tap/stockdock

A menu bar that adds up

  • The menu bar P&L now matches the window. With short or leveraged positions, the profit and loss in the menu bar used the plain average price times quantity, while the window used the real cost basis. Both now use the same valuation.
  • Short-only portfolios show their percentage. A portfolio made only of short positions always showed 0% in the menu bar; it now shows its real change.

StockDock speaks Chinese

  • Simplified Chinese is the seventh language. Every string in the popover, the window and Settings is translated; pick 简体中文 from Settings → Language.

With thanks to Chuhan1112, whose pull request added this.

A popover that holds its shape

  • Long holding lists stay inside the popover. With many positions across your portfolios, the per-symbol list used to grow past the popover, pushing the tabs off the top and the portfolio list and Import/Export off the bottom. It now scrolls within its own area, and everything else stays in reach.
  • Short lists take only the room they need. With a handful of symbols the panel shrinks to its content instead of leaving an empty gap.

Price alerts, organised

  • Alerts are grouped by symbol. A ladder of levels on the same stock used to fill Settings with one row per level. Each symbol is now a single row with a count; click the arrow to open it.
  • Above and Below have their own groups. Inside a symbol, levels are split by condition and sorted by price, so a ladder reads top to bottom. A group only gets an arrow when it holds more than one alert.
  • Re-arm a whole group at once. The switch on an Above or Below group re-arms every alert in it, or turns them all off.
  • Edit and duplicate from the right-click menu. Right-click an alert to change its condition or price, or to use it as the starting point for a new one. An edited alert is armed again.

Prices in the currency they say they're in

  • The Portfolio window converts the price columns. Last and Change printed the stock's native figure under your portfolio currency's symbol, while Value and P&L on the very same row were genuinely converted — a $190 holding read "€190" next to a real euro value. Both columns now carry the conversion.
  • Your average price is shown next to a comparable one. The 3×190 under a converted Last was still in the stock's own currency, so the two prices on a row could not be compared. It converts now, in the positions list and in the cross-portfolio view.
  • A price and its currency symbol can no longer disagree. Switching currency in Settings clears the exchange rates before fetching the new ones, and in that gap every price was printed unconverted under the new symbol. Prices now stay in the stock's own currency, symbol included, until the rate lands — then switch over on their own. A dropped rate request is retried instead of stranding the display until the next poll.
  • The average price field names its currency. It has always been stored in the stock's own currency whatever the display settings say, but the field just said "Avg price" — so people converted the figure by hand before typing it in, and it was counted twice. It now reads "Avg price (USD)".

Arrange the watchlist from the menu bar

  • The compact list opens in your own order. It always sorted by the day's change and offered no way back, so the order you had arranged in the main window was unreachable there.
  • Drag a row to move it, or use Move Up / Move Down from the right-click menu — the same actions the main window has. Dragging is withheld while a column sort or a search filter is active, so a drag can never move the wrong row.
  • A column sort is no longer a one-way door. Clicking a header a third time returns to your own order.

With thanks to Indianhedgehog and nez329, whose issues drove this release.

See the day's move on every position

  • A Change column in the Portfolio window. The holdings list showed Last, Value, P&L and Weight, but not the one figure that changes minute to minute — how much each position has moved today. There's now a Change column between Last and Value, with the day's move in your currency and the percent below it, coloured green or red like the rest of the app.

The figures drop any trailing zeros, so a move reads as +12 rather than +12.00.

The 24H chart stops going blank

  • 24H draws a chart outside market hours. Every evening, all weekend and on holidays, the 24H range showed "Value history builds up day by day" instead of a curve — even on a portfolio with years of history, and even while the other ranges drew perfectly. The intraday data source returns nothing until the session actually starts trading, so StockDock now falls back to the most recent session that traded, the way Stocks shows the previous session when the market is shut.
  • Chart gridlines you can actually see. They were drawn at a tenth of the contrast they needed, which left the plot area looking empty. Gridlines now have their own colour, tuned separately for the light and dark themes, on both axes of both charts. The portfolio value chart had no vertical gridlines at all — it does now.

With thanks to Pete Kasson, whose issue drove this release.

Name your symbols, and a portfolio that doesn't count

  • Give a symbol the name you actually call it. CAD/USD and ^GSPC tell you nothing at a glance and eat menu bar space. Right-click any symbol in your watchlist → Rename… and call it CAD or S&P. The name shows in the menu bar ticker and in your lists; the real ticker is still there, on the second line. Clearing the field puts the ticker back.
  • A portfolio can sit outside your total. Right-click a portfolio → Count in Total and uncheck it. Paper-trade an idea, or follow a position you haven't taken, without it moving what you're actually worth. It stays a real portfolio — its own chart, history, notifications and export are untouched — it just doesn't reach the menu bar, "All Portfolios" or the total at the bottom of the window. Excluded portfolios are greyed in the list so you can see it at a glance.
  • Your positions show how many shares you hold. The share count was only in the compact list and the holding detail; it's now on the positions row in the Portfolio window, next to the company name.
  • Charts open where you left them. The range picker used to snap back to 1M (or All, for the portfolio chart) every single time. It now remembers the last range you picked, separately for each kind of chart.

With thanks to macOS-Mavericks and Pete Kasson, whose issues drove this release.

Today's P&L in the menu bar

  • A new "Daily P&L" display option. The menu bar could show your total P&L, its percentage or the portfolio value — but not the one figure you check most during the session: how much you are up or down today. Pick it under Settings → Display.
  • It counts what your positions really are. The daily figure converts every holding into your preferred currency, follows short positions in the right direction, applies leverage, and uses the extended-hours price when you have extended hours turned on — exactly like the Portfolio window's TODAY row.

With thanks to Jérôme Siau, who contributed this feature.

The value chart starts when you actually bought

  • "All" no longer invents decades of history. The estimated portfolio curve was reconstructed from each stock's full price history, so a position opened this year could be charted all the way back to the 1990s or 2000s — whenever that symbol first traded. It now starts at your oldest purchase.
  • Each position joins the curve on its own purchase date. The chart steps up as you actually built the portfolio, instead of pretending you always held today's shares. Holdings saved without a purchase date are unchanged.
  • A finer curve on "All". With a realistic window, the range now draws the daily series when your oldest purchase fits inside it, rather than a handful of monthly steps.
  • Clearer dates on the axis. Labels follow the period actually drawn, and the year is spelled out in full — "Jan 05" could be read as the 5th of January rather than January 2005.

Your figures are unaffected: total P&L, invested amount and the all-time percentage have always come from your real cost and current value, never from the estimated curve. Only the shape of the chart was wrong.

Much lighter on your Mac

  • Idle CPU use is down to near zero. With the Portfolio window open, StockDock used to sit around 60-70% CPU for as long as the market was open — enough to warm up the machine and slow everything else down. In the background it now measures about 0.1%.
  • Live prices no longer animate non-stop. Price-driven animations were slower to settle than the once-a-second price feed, so the app was redrawing continuously and never went idle. They are now short and snappy, and finish between updates.
  • The Portfolio window does far less work per update. Positions are valued once per refresh instead of a dozen times, and the value chart no longer re-animates every mark on every tick.
  • Updates slow down when you're in another app. Prices refresh once a second while you're looking at StockDock, and less often when you're not — bringing the app back to the front shows the latest figures immediately.

No feature or visual changes: everything looks and behaves exactly as before, it just costs a fraction of the CPU.

Current price next to your average buy price

  • Cost and market price side by side. Each line of the per-stock average buy price block now shows the live price too — avg is what you paid, now is what it trades at — so you can read your entry and the market in one glance, without opening the position.
  • Same currency, same precision. The current price uses the stock's own price currency and follows your extended-hours setting, exactly like the rest of the app.

Average buy price across all your portfolios

  • Global cost at a glance. The portfolios list now shows, right under the overall Total value, one line per stock with its average buy price — weighted across every portfolio you own it in — and the current price return next to it, in green or red.
  • See your true entry. If you hold the same ticker in more than one portfolio, you no longer have to average it by hand: the number you see is the real blended cost.

Edit a holding from its detail page

  • Edit button where you expect it. Open any position from a portfolio and there's now a pencil in the header — tap it to edit shares, price, date, or leverage. Previously editing was only reachable by right-clicking the row, so it was easy to miss.

Portfolio performance — fixed

  • "Today" now counts pre/post-market. The portfolio value already used the extended-hours price, but the daily change only looked at the regular session — so on a gap day the value could be up while "today" showed down. They now share the same baseline and always agree.
  • Accurate performance pills. The header pill now shows the real figure for each range: today on 24H (matching the TODAY stat), and your true all-time P&L on All (no more inflated numbers from the reconstructed curve).
  • Cleaner 24H chart. The intraday curve is pinned to your live portfolio value, so it no longer ends below the headline total.

Gain/loss colors, everywhere

  • Your custom colors now apply across the whole app — the gain and loss colors you pick (Settings › Menu Bar › Colors) are no longer limited to the menu bar. They now color the watchlist, portfolios, movers and every P&L figure in the app.
  • Always editable — the color pickers stay available even when "use system color in the menu bar" is on, so you can keep the menu bar text neutral while still theming the rest of the app.
  • Leave a color unset to fall back to the classic emerald / terracotta.

Portfolio chart

  • Change now follows the selected period — the percentage next to your portfolio value updates with the range you pick (24H, 7D, 1M, 1Y, All) instead of always showing the day's move.
  • No more text over the curve — the value and change now sit above the chart, so the line never hides behind them, on any period.
  • Smoother transitions — switching periods crossfades and the curve settles in gently as data loads.

Settings, tidied up

  • Collapsible categories — the menu bar Settings are grouped (General, Currency, Positions & Market, Watchlist, Menu Bar, Notifications, About) and each section expands only when you need it.
  • Support options — you can now star the repo on GitHub as well as sponsor. StockDock stays free and open source.

Your app, your way

  • Dark mode is back — Settings › Appearance now has a Theme control: follow the system, or force Light or Dark. No more being stuck on the bright theme.
  • Hide the News tab — a new "Show News tab" switch removes the Home/News feed entirely. For the record, the feed never ran in the background: it only fetched while its tab was open, throttled, no battery or data drain when hidden.

Fixed

  • Tab bar label — the Settings tab no longer shows a stray "Portfolios" label next to it.

Improved: a clearer watchlist

  • Every price now shows its own % move right below it — the regular price carries today's change, the after-hours price carries the pre/post-market change. No more guessing which percentage belongs to which number.
  • The live session leads — during pre/post-market the after-hours price and its % move come forward, while the previous close steps back to context. In regular hours it's the other way around, so what's moving now always reads first.
  • Sort by what you see — clicking a column header sorts by that column's % move (not the raw after-hours price). Biggest movers on top.

Fixed

  • “Show extended hours” now works in the watchlist — turning it off hides the after-hours column and shows only regular market values.

New: the full desktop window

  • Try the new desktop app — StockDock now has a complete window, not just the menu-bar popover. Open the popover and click the “Open” button to try the new view: News, Watchlist, Portfolios and Settings in a spacious, redesigned interface. Everything stays in sync with the menu bar.

Added

  • Watchlist — Price & After-hours side by side — separate columns for the regular price and the pre/post-market price (with its own % move). Every column is sortable.
  • Search your news — filter stories by headline, ticker or publisher.
  • Add to portfolio from a stock’s detail — open any symbol and add it as a position in one click.
  • More price precision — forex pairs and sub-dollar prices now show extra decimals (e.g. 0.7119 instead of 0.71).
  • Decimal controls — choose how many decimals to show for percentages and for values, and a menu-bar option to hide the percentage entirely.

Fixed

  • Prices no longer freeze — fixed a bug where live prices could stop updating after your Mac woke from sleep or after the app had been running for a long time. StockDock now detects a stalled connection and reconnects automatically.
  • Correct price outside market hours — with extended hours turned off, prices now stay on the last regular close during pre-market and after-hours instead of briefly showing the extended-hours price.

Improved

  • Ticker on every news story — each story in the Home feed now shows a clear ticker badge for the stock it's about (the one you follow), plus any other related tickers, so you can tell at a glance which of your holdings the news concerns.
  • Faster update checks — StockDock now checks for new versions a few times a day, so you get improvements sooner.

New

  • Home tab — finance news — a new Home tab shows the latest finance news for the stocks you follow (and general market news when your watchlist is empty). Each story shows the source, when it was published and related tickers; tap to open it in your browser. No account, no API keys — same privacy-first approach as the rest of the app.
  • Support the project — StockDock is free and open source, and always will be. If it's useful to you, there's now a "Become a Sponsor" button in Settings to help fund development. Every feature stays free for everyone.

Fixed

  • More reliable price updates — a single delisted or suspended ticker in your watchlist could stop live prices from loading for every other symbol. Prices now load reliably even when one ticker returns incomplete data.

New

  • Long / Short picker — when Advanced positions is on, add/edit holding now has a clear Long / Short selector instead of typing a negative quantity. Works in the quick "Add to Portfolio" sheet from the watchlist right-click too.
  • Clear all — one-tap buttons to delete all price alerts, and all portfolio notifications, from Settings → Notifications.

Fixed

  • Too many portfolio notifications — the "Daily move ≥ %/amount" notification fired at every step (+1%, +2%, +3%…) on a trending day. It now fires at most once per direction per day: once when today's move first crosses +threshold and once when it crosses −threshold.

New

  • Short positions & leverage — enable them in Settings → Advanced, then enter a negative quantity for a short and an optional leverage multiplier per holding. P&L, exposure and daily change are computed correctly in every case, so a portfolio can be tracked as a relative long/short basket. Long-only stays the default and untouched.

New

  • Show name instead of symbol — optional toggle so the menu bar ticker shows the readable name (e.g. "S&P 500") instead of the raw symbol ("^GSPC"). Settings → Menu Bar Display, in the Ticker modes.
  • Ticker order — choose how watchlist entries cycle in the menu bar: as added, grouped by type (stocks, ETFs, indices, futures…), or alphabetical.

Fixed

  • No currency symbol on indices — index values (e.g. S&P 500, DAX) no longer show a currency prefix, since an index has no associated currency.

Fixed

  • Pre-market alerts — price alerts no longer fire against the previous day's close while pre-market or after-hours data hasn't arrived yet. An alert now waits for the real extended-hours price, so you won't get a spurious "now $1,100" notification at the previous close.

New

  • Languages — StockDock is now localized in English, German, French, Spanish, Italian and Portuguese. Pick one in Settings → Language (English stays the default).
  • Custom menu bar colors — set your own gain/loss colors in Settings → Menu Bar Colors, or switch on "Use system text color" to stay readable on any background (up/down is still shown by + / − and ▲ ▼).
  • Ticker + Portfolio cycle — a new menu bar mode that rotates through your watchlist and a portfolio summary in the same cycle.
  • 2-decimal percentages — optional toggle to show percentages with two decimals instead of one (off by default to keep the bar compact).

Fixed

  • Portfolio cost line — the quantity × average price line no longer wraps and hides its decimals for large positions.

Improved

  • Thousands separator — numbers above 1,000 are now grouped for readability across the menu bar, watchlist, portfolio, alerts and notifications (e.g. €23.922,36 instead of €23922,36). Grouping and decimal separators follow your system locale.

Fixed

  • No more notification spam — portfolio notifications (daily move and value milestones) now fire only on genuinely new highs or lows. When your portfolio hovers around a threshold or bounces back and forth, you'll no longer get a flood of repeat alerts. You still get one ping for each new step up or down.

Improved

  • Version shown in the header — the popover header now always shows the app version next to the StockDock title.

Improved

  • Portfolio notifications now show what moved — daily move alerts and the daily summary list your holdings with their change % and value (biggest movers first), instead of just a single top mover. At a glance you can see which stocks drove the change. Works in the macOS notification and in your Discord/Slack mirror.

New

  • Portfolio notifications — get notified when a whole portfolio moves, not just single stocks. Right-click a portfolio → "Notifications…" and pick a mode: daily move over a % or amount, a value milestone, or a once-a-day summary with today's P&L and top mover.
  • Discord & Slack — mirror every notification to a Discord or Slack channel so you get them on your phone too. Set your webhook in Settings → Notifications and hit "Send test". Messages arrive as StockDock with the app icon, colored green/red by direction.
  • Unified Notifications settings — webhook channels, price alerts and portfolio notifications are now all in one place, with toggles and delete for each.

Improved

  • Currency symbol now appears before the amount everywhere (e.g. €42,300.00, +€820.00).

Fixed

  • Fixed crash on launch caused by missing font resource bundle
  • Fixed Sparkle auto-update dialog closing immediately
  • Fixed Sparkle appcast parse error
  • Popover now preserves state when closed and reopened

New

  • Inter font: bundled Inter Variable as default app font
  • Font customization: pick from 15 font families and adjust size (7–13) in Settings
  • 3-column watchlist: Symbol, Price (with day range), and Change — click headers to sort
  • Grand total: combined value and P&L across all portfolios shown at the top of the Portfolios tab
  • Ticker mode: menu bar cycles through watchlist stocks every 5 seconds showing price + change %
  • Portfolio recap mode: menu bar shows total portfolio value + P&L %
  • Asset type badges: search results now display type (EQUITY, ETF, MUTUALFUND, etc.)
  • Reset to Default Settings: one-click reset with confirmation dialog (preserves watchlist & portfolios)
  • Tab persistence: reopening the popover restores the last viewed tab
  • Release notes: Sparkle update dialog now shows What's New changelog

Fixed

  • Crash: replaced fatalError with fallback directory when Application Support is unavailable
  • Safety: converted force-unwrapped statusItem/popover to proper Optionals
  • Sleep: tick batch timer now invalidated on system sleep, preventing stale data flush on wake
  • Popover: fixed height mismatch (580 → 520px)
  • Holdings: avg price now pre-filled with current quote when adding a holding from AddHoldingView
  • Watchlist: absolute change value now colored green/red (was only the percentage)
  • Menu bar: Best & Worst mode no longer shows duplicate when watchlist has a single stock
  • Thread safety: fixed isRefreshing TOCTOU race condition in symbol observer
  • Thread safety: panel callbacks now use Task { @MainActor in } instead of DispatchQueue.main.async
  • Cleanup: added NotificationCenter.default.removeObserver in applicationWillTerminate

Fixed

  • Popover: fixed gap below menu bar by using zero-height rect anchor (#4)
  • Thread safety: import callback and debounce Task now run on @MainActor
  • Validation: added qty > 0 and price > 0 checks on all holding forms
  • ISIN: tightened heuristic to exactly 12 characters
  • Removed all debug print() statements

Changed

  • Portfolio tab: standardized font sizes to match watchlist tab (#5)
  • Exchange rates: added bounds checks on pair parsing
  • Performance: DateFormatter is now a static let (avoids re-allocation per render)

Fixed

  • Real-time balance: REST polling now refreshes quotes every 60s as fallback for non-US stocks that don't receive WebSocket ticks
  • Sparkle: skip initialization when SUFeedURL is missing, preventing crash in dev mode (swift run)

New

  • Portfolio export: save all portfolios or a single one to a JSON file via NSSavePanel
  • Portfolio import: load portfolios from JSON with automatic UUID regeneration and duplicate name handling

Fixed

  • Sparkle: Check for Updates button now works correctly via EnvironmentObject
  • Memory: reduced footprint by disabling URLSession cache on StockService and WebSocketService
  • Popover: contentViewController is now created on open and released on close, preventing memory leaks
  • Event monitor: fixed cleanup for transient popover auto-close path

Changed

  • App icon updated from SB to SD branding

New

  • Real-time stock prices via Yahoo Finance WebSocket
  • Multiple portfolios with P&L tracking in your preferred currency
  • Watchlist with daily performance sorting
  • Currency conversion with historical exchange rates for accurate cost basis
  • Extended hours support (pre-market & after-hours prices)
  • 8 customizable menu bar display modes (P&L, Total Value, Best/Worst Stock, Ticker, Icon Only)
  • Sparkle auto-update built in
  • Homebrew install support