Release Notes
The full changelog lives in
RELEASE_NOTES.md
in the repository. Highlights of the current release below.
v5.6.0 — Inside Out
Section titled “v5.6.0 — Inside Out”- Insider activity (SEC Form 4). Recent open-market buys and sells by a company’s own officers and directors, in each stock’s expanded detail. Grants, gifts, and tax withholding are shown but never counted as conviction; funds have no insiders and say so.
- Financials over time (SEC XBRL). Revenue, net margin, and diluted EPS by fiscal year from filed numbers, with revenue history stitched across the 2018 GAAP tag change. Missing metrics stay blank, never a fabricated zero.
- Dividend income view. Annual cash your holdings pay you at your position size, blended yield, and an ex-dividend heads-up. Non-payers are named, never counted as $0.
- Filings in plain English. 8-K item codes are labelled by what they report (“Results announced,” “Officer or director change”) instead of raw numbers.
- Fixed: low-yield dividend yields read 100× too high. yfinance reports dividend yield in two fields 100× apart; a sub-1% yield rendered as tens of percent. Normalized once at the source — Apple now reads 0.32%, not 32%.
- Installing over v5.5.0 keeps the existing database, holdings, trades, DCA history, settings, and API key. No schema migration is required.
v5.5.0 — Straight From the Source
Section titled “v5.5.0 — Straight From the Source”- The filings, unfiltered. The News tab shows what your companies actually told the SEC — 8-K, 10-Q, 10-K — pulled from EDGAR and linked to the source document. Funds and crypto are named as non-filers, never shown as companies that filed nothing. No Claude key needed.
- The curve, and where fear actually sits. The market backdrop reads the US Treasury yield curve (2s10s, 3m10y) and reports where the VIX sits in its own five-year range. An inverted curve nudges verdicts toward quality; flat, normal, and steep are reported and left alone.
- What your funds cost you. Expense ratios as real dollars per year and over a decade, with the growth assumption stated next to the projection. A fee that can’t be read stays unknown — never a quiet $0.
- Whether your ETFs are the same bet. Pairwise overlap across your funds’ top 10 published holdings, labeled for exactly what it measures.
- Earnings with the bar attached. The radar carries the consensus EPS estimate and the recent beat record alongside the date.
- Fixed: fund fees read 100× too high. An expense ratio could be scored in the most expensive tier when it was among the cheapest, dragging that fund’s quality score. Ratios are now normalized once, at the source.
- Installing over v5.4.2 keeps the existing database, holdings, trades, DCA history, settings, and API key. No schema migration is required.
v5.4.2 — Honest Valuation, Safer Ledgers
Section titled “v5.4.2 — Honest Valuation, Safer Ledgers”- Return math now matches the full investment. Portfolio total-return percentage includes the cost basis of both open and already-sold shares, matching the realized + unrealized gain shown beside it.
- Bad quotes never become a confident read. Zero, non-finite, malformed, or missing prices are labeled unavailable; incomplete valuations do not write daily snapshots or generate portfolio-level Claude briefings, analytics narration, or action plans.
- Applied DCA buys stay traceable. Undo applied buys before deleting their plan so the contribution ledger and holding mutation cannot drift apart.
- Cleaner architecture and public docs. Lifecycle, valuation, DCA, and narrative caching now have focused service interfaces, while the landing page and docs share a sharper visual system.
- Installing over v5.4.1 keeps the existing database, holdings, trades, DCA history, settings, and API key. No schema migration is required.
v5.4.1 — Per-Portfolio Verdict History
Section titled “v5.4.1 — Per-Portfolio Verdict History”- Your track record follows the portfolio. The Signals “how did my past calls age?” report card and calibration stats now scope to the portfolio you’re viewing, instead of blending Add / Trim / Hold calls across all of them.
- Verdicts logged before this update are kept and attributed to your default portfolio (additive schema v4 migration). Installing over any 5.4.0 keeps everything in place.
v5.4.0 — More Than One Portfolio
Section titled “v5.4.0 — More Than One Portfolio”- Multiple portfolios. A switcher in the top bar lets you create, rename, delete, and switch between portfolios — give your taxable account, IRA, and experiments their own scoreboards.
- Everything re-scopes. Value, P&L, holdings, every analytics chart, news, DCA plans, and the AI briefings/action-plans all follow the portfolio you’re viewing. The Manage panel names the one you’re editing.
- Cleanly separated. Each portfolio’s data — including its cached AI narratives (namespaced per portfolio) — stays its own; switching never shows another portfolio’s content. “My Portfolio” is always present and can’t be deleted; new portfolios start empty.
- Installing over any 5.3.x keeps your holdings as the default portfolio.
v5.3.1 — Accurate Sales, Working Links
Section titled “v5.3.1 — Accurate Sales, Working Links”- Record a sale at the real price and date. Reducing a holding now lets you enter the actual sale price and date (pre-filled with today’s, but editable) — so a sale you made last month books into your realized P&L and year-end recap correctly, in the right tax year. Leave the price blank to use the live market price.
- External links work in the desktop app. Links like console.anthropic.com (to get a Claude key) and the docs now open in your real browser instead of a dead in-app frame.
- Installing over any 5.3.0 keeps everything in place.
v5.3.0 — Honest When Things Go Wrong
Section titled “v5.3.0 — Honest When Things Go Wrong”- Never a scary $0. If market data can’t be reached, the dashboard keeps your last-known values and shows an honest “unavailable” status instead of $0 with a green “synced” check — and it no longer writes that $0 into your performance history (which left a permanent fake cliff in the P&L/drawdown charts).
- Honest about your Claude key. Saving a key now verifies it actually reaches Anthropic before claiming “connected,” you can disconnect Claude from the key panel, and the offline setup steps point at the one-click panel instead of “edit .env and restart in a terminal.”
- No accidental sales from a typo. Reducing a holding’s share count now asks before booking a realized sale, and mid-typing keystrokes no longer book phantom sales.
- Smaller edges filed down. First-run/empty portfolios get an “Add your first holding” prompt; remove/world-markets/news failures surface clearly instead of silently; stale hero tiles clear on an empty portfolio; and Cmd/Ctrl shortcuts no longer double-fire.
- Installing over any 5.2.x keeps everything in place.
v5.2.1 — DCA, Polished
Section titled “v5.2.1 — DCA, Polished”- Bulk actions ask first. “Apply all” and “Skip all” now confirm with the count and dollar total, and each plan gets an Undo applied action that reverses a whole backfill in one move.
- Pause means pause. Resuming a paused plan no longer retroactively books the buys skipped while it was paused — it picks up from the resume date.
- Sharper edges filed down. Undoing a buy that empties a holding now retires that holding (no $0 leftover); an exact-duplicate plan is blocked; same-ticker plans are told apart in the bucket; large backfills render lightly; and double-taps can’t fire a duplicate action.
- Installing over any 5.2.0 keeps all plans, holdings, and settings (additive schema v3).
v5.2.0 — Auto-Invest, On Your Terms
Section titled “v5.2.0 — Auto-Invest, On Your Terms”- DCA auto-invest plans, simulated locally. The most-asked question — “can it sync my broker’s auto-invest?” — answered the local-first way. Set a ticker, a dollar amount, and a cadence (daily / weekly / monthly); each interval books a buy at that day’s real close into a review bucket. Weekends and holidays snap to the next trading day.
- Nothing moves until you say so. Every booked buy waits for you to Apply it (shares and average cost update), Skip it, or leave it. Applies are reversible with Undo; skips can be Restored. A past start date backfills the full history, with a double-count guard if you already hold the ticker.
- Catches up after you’ve been away. Reopen the app after a week and it fills in every missed buy, idempotently — never double-booking. A badge shows how many are waiting.
- Installing over any 5.1.x keeps all holdings, settings, and
.env. Still no brokerage connection; still not financial advice.
v5.1.0 — Looking Back, Honestly
Section titled “v5.1.0 — Looking Back, Honestly”- Year-end realized recap. The Realized gains tab now opens with a year-by-year recap of your closed trades — realized P&L and return, sales and tickers covered, winners vs losers, and the best and worst position of the year. Reads every stored trade from your local database; no live quotes. Switch years with the toggle.
- A verdict report card. The Signals tab grades FolioOrb’s own past Add / Trim / Hold calls by how each holding has done since the call — an overall “aged well” rate, a per-action breakdown, and a ledger with a ✓/✗ per call. A look-back, not a forward bet; small samples are noisy and it’s not financial advice.
- Installing over any 5.0.x keeps all holdings, settings, and
.env.
v5.0.0 — FolioOrb
Section titled “v5.0.0 — FolioOrb”FolioOrb is the native desktop app for local-first portfolio intelligence.
- FolioOrb everywhere — app window, installers (
FolioOrb-macOS-arm64-*.dmg,FolioOrb-Windows-x64-*-Setup.exe), docs, and repository at github.com/udhawan97/FolioOrb. - Data stays local in the normal per-user app data directory for your platform.
- Privacy posture stays clear — FolioOrb is local-first, Claude-optional, never places trades, and reports to nobody.
v4.5.2 — Reliability patch
Section titled “v4.5.2 — Reliability patch”A full-codebase bug audit and the fixes it surfaced — no new features, just sturdier numbers and safer data.
- Bad market data no longer poisons your analytics. A zero or negative close
(a halted or delisted ticker, a data glitch) used to contaminate annualized
return, volatility, and correlation with
NaN; those days are now treated as flat. Correlation reports “no data” honestly when a frozen price series makes it undefined, instead of faking a0.0. - Trim verdicts score the right way round — a cheap stock is no longer handed a high-confidence trim.
- A failed rollback can never leave you with no database. Restore now stages and re-verifies the backup before touching your live database, and tells you clearly if data restored but settings didn’t.
- Watchlist edits never fabricate P&L, the batch price-history endpoint
validates its
period, plus assorted updater, cache, and logging hardening.
No migration or .env change required.
v4.5.1 — Export That Actually Exports
Section titled “v4.5.1 — Export That Actually Exports”- Fixed: CSV export and the import template now download in the desktop app. The
packaged app is a native window with no download chrome, so Export CSV and Download
template used to open the file inline as raw text — no Save dialog, no back button. Both
now route through a native Save As… dialog and write a real
.csv(UTF-8 with the BOM Excel expects). Browsers download exactly as before. Either way, you get a file, not a dead end. - Website polish — Senpai gets his own animated spotlight above the footer, a refreshed one-liner pill, and CSV import is now called out in the workflow walkthrough.
- Installing over v4.5.0 keeps all holdings, settings, and
.env. Nothing about your data changes.
v4.5.0 — The Spreadsheet Release
Section titled “v4.5.0 — The Spreadsheet Release”- Export your holdings as CSV. One click in the portfolio manager downloads your active holdings and watchlist as a clean, Excel-ready CSV — with every cell escaped against spreadsheet formula injection. The file you get is the import template.
- Import holdings, two ways. Local (always available, no API key) does a strict, exact-schema parse of the template — deterministic, free, offline, and never gated. Claude assist (when a key is set) maps almost any brokerage export onto the FolioOrb format for you, and every mapped row still passes the same strict validation before it touches your book. Clean template files skip Claude entirely.
- A per-row report either way — added, skipped (duplicates are skipped, never overwritten), or errored with a plain-English reason — plus a Senpai-narrated recap in Claude mode. Safety as usual: a 256 KB / 200-row import cap and content-type checks.
v4.4.1 — Software Update, done right
Section titled “v4.4.1 — Software Update, done right”- Fixed: the updater falsely showing “You’re offline.” The packaged app’s bundled OpenSSL pointed at a build-machine certificate path that doesn’t exist on your Mac, so every update check failed TLS verification and was reported as “offline” even when you were connected. Now fixed at the root — the checker verifies against a CA bundle shipped inside the app — and failure states are told apart instead of lumped together (“Couldn’t securely check for updates,” “GitHub rate limit reached,” etc., each with its own diagnostic).
- Real in-app updates on macOS, not just “open the DMG.” Update Now downloads, verifies, backs up your data, swaps in the new app, and relaunches automatically. Windows keeps its one-click silent install.
- A consent-first in-app update system. FolioOrb checks quietly for new versions, shows a calm indicator when one’s available, and never downloads or installs without an explicit click. Check any time from Check for Updates… in the app menu or Settings → Software Update.
- Your holdings are protected at every step. A verified backup is taken before any update or migration; if the backup can’t be made or fails verification, the update pauses rather than risking your data. Restore previous version… rolls back safely, always snapshotting current data first so nothing is lost either way.
- Trustworthy downloads. SHA-256 verified against published checksums, with optional minisign authenticity signing. Release notes render as text, not raw HTML.
- Built in eight phases, then hardened through repeated rounds of adversarial review — against
both source and the actual installed app — that caught and fixed the offline/TLS root cause plus
nine other real issues, including a data-loss gap in backup verification, an XSS path in
release-notes rendering, and a macOS “quit unexpectedly” crash on every exit. 256 dedicated
tests,
pylint10.00.
v4.3.4 — Quieter Hot Paths
Section titled “v4.3.4 — Quieter Hot Paths”- Performance release — no feature changes. Targeted fixes to the code that runs most
often, so the dashboard stays smooth as portfolios and interactions scale up. Installing
over v4.3.3 or earlier keeps all holdings, settings, and
.env. - Currency formatting no longer allocates per value — every dollar figure was built with
a freshly constructed
Intl.NumberFormat, which is far more expensive than the formatting itself. The currency and world-market formatters are now built once and reused. Output is byte-for-byte identical. - The correlation heatmap stops rebuilding its canvas on hover — the hover redraw was reassigning the canvas’s pixel dimensions every time, which reallocates and clears the whole backing store even when the size is unchanged. It now only resizes the bitmap when the dimensions actually change.
- Hover and resize work is coalesced to one pass per frame — the heatmap’s
mousemovehandler and the two dashboard-zone indicator resize handlers are throttled torequestAnimationFrame, so at most one layout read/redraw runs per frame. - Fixed misleading “AI failed” warnings when no Claude API key is configured — running key-free (the default Local Intelligence mode) logged every briefing/insights/action-plan request as a warning-level failure, even though it’s the expected, harmless case. These now log at debug with an accurate message; a genuine failure with a key present still warns.
- Fixed the greyed-out Engine toggle opening the wrong panel — tapping the disabled “Local Intel” control (no API key set) opened the passive intro card instead of the interactive Connect Claude AI panel. It now opens that panel directly — paste a key, hit Save & Connect, no restart — and closes the menu first so it isn’t covered.
- Verified: the full 381-test suite passes,
pylintholds at 10.00/10, and the theme, spacing, typography, and animations are untouched — these changes affect only how existing work is scheduled and routed, not what is drawn.
v4.3.3 — One Range, Every Section
Section titled “v4.3.3 — One Range, Every Section”- Feature release. The Overview time-range switcher (Today / 1M / 3M / 6M / 1Y) gains a
1W option and now drives the sector/movers panel, the portfolio briefing, and the
allocation focus read — not just the P&L card. Installing over v4.3.2 or earlier keeps all
holdings, settings, and
.env. - One shared range. All four sections read from a single selected time range instead of managing their own state, so switching to 3M means Insights, Briefing, Allocation, and P&L all narrate the same three months.
- Fixed a real inconsistency caught during testing: the hero P&L card needed weeks of the app’s own usage history to compute longer ranges, so a newer portfolio could show “1M P&L: –” directly above a movers panel already showing a real number for that month from actual market price history. The hero card now falls back to the same price-history calculation so both agree.
- Performance: all five non-day ranges come from one new endpoint in a single request, cached per holdings set so revisiting a range is instant with no network call. Rapid switching never flashes stale data, each section fails independently with its own inline retry, and manual refresh now refreshes range data too.
v4.3.2 — Scrolling, Finished
Section titled “v4.3.2 — Scrolling, Finished”- Performance release — no feature changes. Second half of the v4.3.1 scroll fix,
this time aimed at portfolios with a real number of holdings in them. Installing over
v4.3.1 or earlier keeps all holdings, settings, and
.env. - Fixed a sparkline redraw bug — each holding’s 7-day trend canvas was repainting every time it scrolled into view, even when its price history hadn’t changed. It now only redraws when the data actually changes, verified pixel-for-pixel.
- Fixed the real cost — switching away from the Holdings tab hid it with
visibility: hidden, which keeps a hidden element fully “in play” for layout. With enough holdings, that table’s column-width math is expensive, and it was being recomputed on every scroll frame on every tab — not just Holdings. It’s now skipped entirely while off-screen (content-visibility: hidden) and restored instantly on switch. - Result: roughly 4× faster scrolling on Overview and Holdings with a 30-holding portfolio, with Analytics and News both meaningfully smoother too.
v4.3.1 — Smooth Scrolling in the Desktop App
Section titled “v4.3.1 — Smooth Scrolling in the Desktop App”- Performance release — no feature changes. The native app scrolled sluggishly on
macOS; v4.3.1 fixes it. Installing over v4.3.0 keeps all holdings, settings, and
.env. - Fixed the universal scroll killers — the ambient background moved off the scrolling
page onto a fixed, compositor-cached layer (
background-attachment: fixedrepainted the whole gradient every frame), and the drifting background orbs lost a heavyblur(40px)filter that was re-rasterized each frame. Both help the browser and from-source runs too. - Desktop-app rendering profile — inside the system WebView (WKWebView / WebView2) the
app now drops
backdrop-filterand freezes a few always-on ambient animations, which those engines render expensively. Frosted surfaces fall back to near-opaque fills, so the look holds up; the in-browser experience is left at full fidelity. - Result: ~3× smoother scroll frame rate on the overview and analytics views in throttled testing, with janky frames cut by roughly two-thirds.
v4.3 — FolioOrb Goes Desktop
Section titled “v4.3 — FolioOrb Goes Desktop”- One-click desktop installers — no Python, no terminal. Download a native app for macOS (Apple Silicon) or Windows (x64) and launch it like any other app. The FastAPI server runs in-process behind a native window
- Automated release pipeline — every tagged release builds, smoke-tests, and publishes
the
.dmgand.exeto GitHub Releases with aSHA256SUMS.txt, so a broken build can never replace a good download - Rolling
latest-mainbuilds — every merge tomainrefreshes a prerelease with the newest installers, available under “Development builds” on the site for early testers - Download-first website — the landing page detects your OS, links straight to the current installer, and shows live release version, date, and checksums
- Honest trust story — early builds aren’t code-signed yet, so the install guides walk through the expected macOS Gatekeeper / Windows SmartScreen warnings and how to verify your download
- Local data stays put — the installed app keeps your database and
.envin the per-user data directory (~/Library/Application Support/FolioOrbon macOS,%APPDATA%\FolioOrbon Windows), never inside the app bundle
v4.2 — Meet Senpai, and Never Get Lost on Day One
Section titled “v4.2 — Meet Senpai, and Never Get Lost on Day One”- Senpai — the dashboard orb formerly known as “dashboard pet” / “Portfolio Butler”
is now named Senpai everywhere: ids, classes, JS,
localStorage, and the visible label - Tips & tricks — Senpai’s quote rotation now surfaces genuinely useful one-liners (Research mode, hold-type icons, keyboard shortcuts) about 1 time in 4
- First-run welcome guide — a one-time modal on a fresh install with zero holdings, covering how to add a holding, what Research mode means, and what the four hold-type icons do — sourced straight from the same tooltips used elsewhere in the app
- Docs site fix — 5 internal links that 404’d on GitHub Pages (missing the site’s base path) are fixed, and a Documentation link was added to the app’s nav menu
v4.1 — The Dashboard Finally Knows Its Own Key
Section titled “v4.1 — The Dashboard Finally Knows Its Own Key”- In-dashboard API key configuration — paste a Claude key from the nav, validated and
written to
.env, reconnected without a restart - Live token cost tracking — the cost HUD now shows real accumulated input/output tokens and actual spend instead of a cache-based estimate
- First-click holding expand — rows expand their intelligence panel on the first click, with auto-refresh keeping prices current
- Overview sector graph rework — proportional weighted fills instead of absolute percentage bars, plus an overflow note when more sectors are held than the strip can show
- Assorted fixes: font resize regression, a scroll-interception bug, and ticker management now triggering a fresh quote load without a full reload
See the full RELEASE_NOTES.md
for prior versions and complete technical detail on each change.