Roadmap
Everything we've shipped so far. We put out small updates often, and plenty of them started life as feedback from the people using Coral Dash. Every release lands on both the cloud app and the self-hosted edition.
Latest releaseNew
v3.5.1Aug 2026
A Chart You Can Read
60
Releases shipped
Dec 2025
Shipping since · 8 months and counting
Shipped
60 releasesEvery release ships to both the cloud app and the self-hosted Docker edition.
v3.5.1Latest27 Aug 2026
A Chart You Can Read
- The net worth change figure now leads the chart card — a label naming the window, the pounds at full size, then the percentage and the date it measures from
- The label follows the range buttons ('Change over the past 3 months'), and reads 'Change since the earliest data' when your history is shorter than the range picked
- Fixed the chart's y axis incorrectly — negative values skipped the K suffix, and the axis now lands on round steps like -£10K, £0, £10K
- Assets and liabilities draw as lines rather than filled areas, so they stop blending into a wash over the net worth line the chart is about
- The chart legend is left-aligned at a readable size, and is dropped on account pages, where it was labelling a single line
- Cloud and self-hosted alike, with no migration. Self-hosted: update your image to get it — docker compose pull coraldash && docker compose up -d
v3.5.026 Aug 2026
Change Figures You Can Check
- The four percentage badges on the Net Worth page and every account page ('+114.8% 1m', '-94.8% 1y') are replaced by one figure in the chart header, reporting the movement across whatever range the chart is showing
- Pounds lead, percentage follows. Below a £100 starting value the percentage is dropped and the base is named instead ('was £40')
- It names the date it measures from ('since 26 Feb 2026'), and says 'earliest data' when your history is shorter than the range you picked
- The badges were wrong, not just noisy: '1m' compared the last monthly bucket to today, so it covered anywhere from a day to a month. A new account showed '+0.0%' for every period, which meant 'no data that old', not 'no change'
- Percentages are no longer taken off a base that cannot carry one — the old code divided by the absolute value, so a net worth moving from -£5,000 to +£5,000 read as '+200%'
- On a debt the figure keeps its real sign and the colour carries the meaning: a car loan falling £7,328 shows '-£7,328' in green. The 'Change Since Start' tile now matches
- Fixed accounts with more than 1,000 stored values losing their oldest history to a database row cap, which moved the start of the account's chart. Affects anything synced daily for about three years (Trading 212, precious metals, mortgages)
- Fixed the live demo: the chart range buttons did nothing, and the axis showed raw ISO dates ('2023-09-30') instead of 'Sep 2023'
- Cloud and self-hosted alike, with no migration. Self-hosted: update your image to get it — docker compose pull coraldash && docker compose up -d
v3.4.626 Aug 2026
Savings That Sync Overnight
- Your savings total in net worth now updates on the daily sync. It used to be recalculated only when a browser opened the Net Worth page or the dashboard card, so it sat a day behind the transactions beside it
- A manual 'Sync Transactions' refreshes it too, rather than only recalculating on first page load
- If your sheet has several tabs and one is renamed or no longer shared, the tabs that did sync still update your savings
- Nothing is written when the underlying figures cannot be read. A part-failed read is reported as a failure and your history is left alone, rather than saving a wrong balance that would stand as a permanent spike
- No empty 'Pot Total Savings' account is created if you have never used pots
- A savings refresh that fails inside the app now says so, instead of re-showing the previous figure as though it had just updated
- Cloud and self-hosted alike, with no migration. Self-hosted: update your image to get it — docker compose pull coraldash && docker compose up -d
v3.4.56 Aug 2026
Sync Counts That Tell the Truth
- Fixed nonsense counts after a sync: a sheet of about 860 rows with one new row could report 'Added 860, updated 0'. The read-back of your existing transactions could silently skip rows, so everything it missed looked brand new. It now reads them back in full, in a stable order
- Sync failures now report the real error instead of comparing against a partial list and claiming everything synced fine. One bad run never changes your schedule; dropping to a weekly retry still takes ten failures in a row
- Switching a tab between personal and joint in Settings now updates the transactions you already have — account type is part of the comparison at last, so a re-type shows as 'updated' exactly once
- Two sheet tabs claiming the same transaction now logs a warning naming both tabs, so the misconfiguration can be traced
- Your data was never at risk: transaction ids come from Monzo's own Transaction ID, so duplicates were impossible. The damage was wrong counts and needless rewrites
v3.4.44 Aug 2026
Sync Problems You Can Actually See
- The sidebar now warns 'No transactions since 20 May 2026' once a fortnight has passed with nothing new. Coral Dash only ever checked that the sync ran, never that anything arrived, so a bank that quietly stopped exporting still showed 'Last synced just now'
- The warning states only the date of your newest transaction rather than guessing at a cause, and stays quiet if you have no transactions yet
- You are now warned when Coral Dash genuinely cannot reach your sheet. A deleted, trashed or access-revoked spreadsheet used to fail silently every night
- Scheduled syncs drop to a weekly retry after ten failures in a row. Your connection is never switched off automatically, so a sheet you restore starts working again on its own
- Fixed a single stray invisible character in a Google Sheet being able to block a sync completely, every night
- The nightly sync now writes only the rows that actually changed, instead of rewriting every transaction it had ever seen
- Added the index the transactions table always needed, so looking up your most recent transaction is instant rather than a scan
- Cloud and self-hosted alike. The migration only adds an index, and re-running it does nothing
v3.4.34 Aug 2026
Accurate Net Worth Changes
- Fixed the 'Change' column in an account's Value History being wrong whenever you added a value dated before every entry you already had — the whole balance showed as that day's change, at 0.0%. On a backfilled debt account that bogus figure dominated 'Biggest Increase'
- The same fault hit inserting, deleting or re-dating an entry mid-history: the entry after it kept comparing against a row that was no longer its neighbour
- A change is now worked out as the page is drawn rather than stored when the value is saved. Existing histories correct themselves the next time you open them
- A new account's opening balance no longer counts as a change, so the Assets and Liabilities cards stop reading it as a gain or a loss
- The oldest entry in a history, and a percentage genuinely undefined because the previous value was 0, now show a dash instead of a made-up '0.0%'
- The Net Worth page loads far less data — it was fetching every account's entire value history just to read the two newest rows
- Fixed the debt tracker dropping the newest values on accounts with a very long history (a 1,000-row cap), leaving a stale balance on screen
- Cloud and self-hosted alike. The migration only recalculates derived columns nothing reads any more, and is a no-op on every run after the first
v3.4.228 Jul 2026
Unlimited Syncs When You Self-Host
- Self-hosted: the Sync Transactions button no longer has a cooldown or a daily cap
- Your own Google Cloud project still has a quota, so a tight sync loop can still be refused by Google. Re-syncing is safe either way: transactions match on a stable id, so rows update rather than duplicate
- Cloud is unchanged: 15 minutes between manual syncs, 24 a day. The daily automatic sync was never capped on either
- Fixed the cloud sync counter, invisible since a February navigation redesign dropped the section it lived on. It is back under Sync Transactions, and now also shows when the next sync is due
- Update your image to get it: docker compose pull coraldash && docker compose up -d
v3.4.128 Jul 2026
Same-Day Starting Balances
- Fixed transactions made on the same day as a pot's starting balance being treated as though they came before it, and left out of the total
- A starting balance for today now records the time as well as the date. An earlier date still means the balance at the end of that day
- The time is shown everywhere the starting balance appears
- Starting balances set before this update keep their end-of-day meaning — open that pot and save it again to give it a time
- Fixed the date picker refusing today between midnight and 1am during British Summer Time
v3.4.028 Jul 2026
Starting Balances for Older Pots
- You can now set a starting balance on a pot. Coral Dash takes it as the balance at the end of the date you choose and applies every later transaction on top
- This covers a gap in the data, not a mistake in the maths: Monzo only added a 'Pot name' column to its Sheets export in 2026, so older pot spending has nothing linking it to the pot and re-syncing cannot recover it. Affected pots count every top-up and none of their outgoings
- Pots with activity from before Monzo started tagging pot payments are now flagged, along with the date that starts for you
- A starting balance is always visible: on the pots table, in the pot's detail view, and above the first transaction it supersedes. Superseded transactions stay listed, marked as not counted. Clear it and the pot goes back to fully derived
- The savings chart and the monthly in and out figures follow the same cutoff, so the chart's end point matches the balance in the table
- Setting one moves your Total Savings and Net Worth to the corrected figure. Earlier net worth snapshots keep the values they were recorded with
- Fixed the pot 'Include in Net Worth' toggle resetting that pot's display name, category and savings goal — it sent only its own field and everything it omitted was overwritten with a default. The pots setup wizard cleared names the same way
- Fixed a pot's detail view showing stale figures after an edit until you closed and reopened it
- Cloud and self-hosted alike. The migration only adds optional columns and is a no-op until you actually set a starting balance
v3.3.028 Jul 2026
True Pot Balances & Editable Income Keywords
- Fixed pot balances being far too high for any pot that pays bills directly — if your bills, subscriptions or food budget come straight out of a pot rather than being moved back to your main account first, those payments were never deducted. The pot showed every top-up you had ever made and none of the spending, so a pot that should sit at £0 until payday could read several thousand pounds
- Those payments now count. A pot's balance is what went in, minus what you moved back out, minus what it paid for directly — and the pot's own detail view lists every one of those payments with the payee, so the number on screen always adds up to the transactions behind it
- If this affected you, your Total Savings and Net Worth will drop to the true figure the first time you open the app. That drop is the correction, not a loss — earlier net worth snapshots keep the values they were recorded with, so your history stays intact
- A pot can now legitimately show a negative balance if it has paid out more than your sheet's history shows going in — that usually just means the pot was already in use before your transaction history starts
- Pots now follow the Personal / Joint / Combined tabs on the dashboard. Previously all three tabs showed the same pots regardless of which account they belonged to; now each tab shows only its own, Combined shows everything with an Account column, and the totals add up between them
- Fixed being unable to change what an income source matches on when editing it — the keyword field simply wasn't there, so the only way to correct a rule was to delete it and add it again. You can now edit the name or reference an income source matches on, in both exact and keyword modes, and switch between matching on the name and matching on the reference
- Fixed the savings chart and 'this month' figures quietly disagreeing with the pots table on accounts with a long history — two of the underlying queries stopped at 1,000 rows
- Cloud and self-hosted alike. No database migration is needed — the information was already being recorded, it just wasn't being counted
v3.2.027 Jul 2026
Remembered Chart Ranges
- Per-chart time range memory — every chart with a time-range toggle now keeps the range you pick, saved to your account so it survives a refresh, navigation and a switch to another device, instead of resetting to a default each time
- Applies to the Net Worth overview, each account's own Net Worth detail, Savings and the Career income chart — each remembers its own range independently, across the full 1M, 3M, 6M, 1Y and All options (1y, 5y and All time on the Career chart)
- Defaults are untouched, so nothing moves until you actively pick a range — set it once and it stays set
- Fixed the dashboard Savings chart highlighting 'All' while it was actually showing three months — the highlighted range and the data on screen now always match
- Fixed the public self-hosting page not recognising a licence you already own, and gave its setup guide an accuracy pass
- Behind-the-scenes reliability improvements and visual fixes across the app
v3.1.1025 Jul 2026
Self-Hosted Sync Root Cause Fix
- Fixed the root cause of Google Sheets sync failing on every self-hosted install — the bundled database schema disagreed with what the app actually writes in three places. The big one: transaction IDs were stored as UUIDs while the sync writes text IDs, so the database rejected every sync save with 'invalid input syntax for type uuid' (code 22P02)
- The other two were in sync history — its allowed 'status' and 'triggered_by' values didn't match what the code writes, so sync history was never recorded and sync rate limiting silently never worked on self-hosted
- A new migration corrects all three automatically on the next container boot — it only changes what's actually wrong, is safe to re-run, and is a proven no-op on cloud and on any database that already conforms
- Found by firing every write the app makes at a fresh install built from the bundled schema — that battery reproduced exactly these three drifts and nothing else, and passes clean after the migration
- Fixed the mortgage and Trading 212 account-type autocomplete entries silently never being created — the save targeted the wrong uniqueness rule and failed without an error, on cloud and self-hosted alike
- Update with 'docker compose pull coraldash && docker compose up -d' — the migration runs itself on boot, no '.env' or compose changes needed
- Cloud is completely unaffected — the cloud database never had the drifted schema, and the migration was proven a no-op against a database in cloud's state (with data) before shipping
v3.1.925 Jul 2026
Readable Database Sync Errors
- Fixed database errors during a sync showing as 'Unknown error' — the database reports failures in a shape the on-screen error added in v3.1.8 couldn't read, so any database-level problem lost its reason. The real message, details, and hint now come through, on-screen and in the logs. Cloud and self-hosted alike
- Fixed a sheet containing the same transaction ID twice failing the entire sync — the database rejects a batch that updates the same row twice ('ON CONFLICT DO UPDATE command cannot affect row a second time'). Rows are now deduplicated by ID before saving, keeping the later sheet row, and the new/updated counts stay accurate
- Self-hosted troubleshooting updated — the log command now keeps six lines of context ('grep -A 6') because database errors span several lines
- Update with 'docker compose pull coraldash && docker compose up -d' — no '.env' or compose changes needed
- Verified cloud-safe before shipping — every consumer of the changed sync code was traced; for cloud accounts nothing breaks, they simply gain the same readable errors and the duplicate-ID protection
v3.1.825 Jul 2026
Real Sync Error Messages
- Sync failures now tell you what actually went wrong — the onboarding sync screen and the sidebar sync button show the real underlying reason (a Google API error, an unparseable date, a database problem) instead of the generic 'something went wrong during the sync process'. Cloud and self-hosted alike
- The two silent setup gaps get explicit messages too — no active Google Sheets connection points you to reconnect in Settings, and no sheet tabs selected tells you to pick at least one tab
- Self-hosted setup guide now lists the Google Sheets API alongside the Drive and Picker APIs in the Google Cloud steps — it's a separate switch, and without it the connection succeeds but every sync fails. A new troubleshooting entry covers 'Sync failed' after connecting, including the log command for the full error
- Update with 'docker compose pull coraldash && docker compose up -d' — no '.env' or compose changes needed
- Verified cloud-safe before shipping — the response shape only gained a field, and every screen that reads it was checked; cloud accounts simply get the same clearer sync errors
v3.1.725 Jul 2026
Self-Hosted Google Connection Fix
- Fixed connecting Google Sheets failing at the very last step on every self-hosted install — Google approved the connection, but the app then encrypted the received tokens for storage with a key that was never part of the self-hosted configuration, so the step failed with 'Failed to complete authentication. Please try again.' even though everything on the Google side was correct
- The encryption key is now derived automatically from the already-required 'JWT_SECRET', so no new configuration is needed — an optional 'ENCRYPTION_KEY' override (documented in '.env.example') lets you rotate it independently if you want
- The daily sync used the same key to read the stored tokens, so this unblocks sync as well
- Update with 'git pull' (updated compose file), then 'docker compose pull coraldash && docker compose up -d', and retry the Google connection in onboarding — no '.env' changes needed
- Cloud is completely unaffected
v3.1.625 Jul 2026
Self-Hosted Spreadsheet Picker Fix
- Fixed the spreadsheet-picker step of onboarding always failing with 'Google Picker API is not configured' on self-hosted installs — the browser-side Google settings never reached self-hosted browsers. Two new '.env' settings, 'GOOGLE_PICKER_API_KEY' and 'GOOGLE_APP_ID' (documented in '.env.example' and the setup guide), now flow through to the browser at runtime
- The Google setup docs are now complete — both required redirect URIs (Google sign-in and the previously undocumented Sheets connection one), plus guidance that the only scope needed is 'drive.file': no Google verification required, and you don't specify any file in the console — you pick the spreadsheet inside Coral Dash during onboarding
- The guide also tells you to publish the consent screen to Production — Testing mode expires the Google connection every 7 days, silently breaking the daily sync
- Update with 'git pull' (new compose file + docs), add the two new values to '.env', then 'docker compose pull coraldash && docker compose up -d'
- Cloud is completely unaffected
v3.1.524 Jul 2026
Self-Hosted Session & Page Fixes
- Fixed self-hosted email sign-in bouncing you straight back to the login page (or a mostly blank screen) even though the account existed — the browser and the server stored the login session under different cookie names, so the server never saw the login. They now share one fixed name
- Fixed a server error on some pages (onboarding, dashboard) on self-hosted — a payment-provider client was initialised at page load with credentials self-hosted installs intentionally don't have. It's now only created when actually needed (cloud checkout flows)
- Together these make the complete self-hosted journey work end to end — sign up, land on onboarding, and the dashboard renders
- Update with 'docker compose pull coraldash && docker compose up -d', then sign in again — one fresh login is needed because the session cookie name changed (hard refresh or clear site data if the page looks stale)
- Cloud is completely unaffected — cloud sessions keep their existing cookie name, so nobody gets logged out
v3.1.424 Jul 2026
Self-Hosted Login Redirect Fix
- Fixed self-hosted sign-in and account creation redirecting the browser to 'http://0.0.0.0:3000' instead of your server's address — login looked impossible even though the account was created. The production server rebuilds request URLs from its internal listen address (0.0.0.0), and auth redirects were built from that
- All auth redirects (email sign-in, OAuth callback, email confirmation links) now use relative addresses, so you stay on whatever address your browser is using — and the Google Sheets connect flow derives its Google redirect URL from 'SITE_URL'
- Accounts created before the fix are fine — update with 'docker compose pull coraldash && docker compose up -d', then just log in
- Cloud is completely unaffected
v3.1.324 Jul 2026
Self-Hosted Sign-In Address Fix
- Fixed self-hosted sign-in and sign-up failing with 'Failed to fetch' ('ERR_SSL_PROTOCOL_ERROR' in the browser console) when 'SITE_URL' in '.env' didn't match the address actually in the browser — e.g. 'https://' left over from a reverse-proxy setup while browsing over plain http
- The browser now always talks to the address in its own address bar for auth and data calls — the app routes those internally (v3.1.1), so that's correct on every access path and a 'SITE_URL' typo can no longer break sign-in
- Update with 'docker compose pull coraldash && docker compose up -d' — a normal refresh picks it up, since config now updates on every page load (v3.1.2)
- Cloud is completely unaffected
v3.1.223 Jul 2026
Self-Hosted Runtime Config Fix
- Fixed an issue where changing 'SITE_URL' in '.env' on a self-hosted install didn't reliably reach browsers that had visited before — the app's offline cache kept serving bundles with the old address, which surfaced as a 'Failed to fetch' error on sign-up or sign-in while every container looked healthy
- The app now loads its public configuration fresh on every page load, so address changes in '.env' apply after a normal refresh — no need to clear site data. Update with 'docker compose pull coraldash && docker compose up -d'
- One-time note: a browser that cached an older version may need a single 'Clear site data' (or a private window) after this update — from then on it heals itself automatically
- Cloud is completely unaffected
v3.1.123 Jul 2026
Self-Hosted Trials Without a Reverse Proxy
- Try self-hosted Coral Dash with no reverse proxy at all — set 'SITE_URL=http://your-server-ip:3000', open that address, and create an account with email and password. The app now routes the Supabase API paths ('/auth/v1/*', '/rest/v1/*') to the bundled gateway internally, so port 3000 is all you need
- Fixed the confusing 'Method Not Allowed' error when signing up or logging in without a reverse proxy — those auth requests used to reach the app instead of the API gateway. Update with 'docker compose pull coraldash && docker compose up -d' to get the fix
- A domain, HTTPS and a reverse proxy are still what you want for Google sign-in and production use — the setup guide now walks the no-proxy trial first and treats the reverse proxy as a production step
v3.1.022 Jul 2026
Exclude Debts From Net Worth
- Keep a debt out of your net worth — a new 'Don't count toward net worth' toggle on any liability (e.g. a student loan) keeps it tracked without counting toward your net-worth total or charts. Flip it on when adding the liability, or anytime from its detail page
- Excluded debts stay in your Liabilities list, muted with a 'Not in net worth' note, so nothing disappears — and the Debt Free Goal tracker is unchanged
- Self-hosted: fixed fresh installs on amd64 servers failing with 'container coraldash-rest-1 is unhealthy' — a health probe needed a shell the PostgREST image doesn't have. The corrected compose file is in the setup repo, so run 'git pull' in your setup folder to pick it up, along with longer first-boot grace periods, the METALPRICE_API_KEY pass-through for precious metal prices, and a smarter generate-keys.sh
- Fixed an issue where deleting your account could leave licence keys behind — they're now removed with the rest of your data
- Dependency updates and behind-the-scenes reliability improvements across the app
v3.0.228 Jun 2026
Unbudgeted Spend at a Glance
- The Dashboard's Variable Expenses card now shows how much of the month's spend sits in categories with no budget set, so your unbudgeted spending is visible at a glance
v3.0.125 Jun 2026
Income Matching Fixes
- Fixed an issue where an income source would silently stop picking up payments if the payer's text drifted even slightly (different capitalisation, a trailing space, or an added reference) — 'Exact' matching now tolerates casing and surrounding whitespace, so those payments are recognised automatically
- Switch a source to 'Contains keyword' matching straight from its edit panel — previously this was only offered when creating a source, so a drifting payer name meant deleting and recreating the rule
- New 'Needs attention' nudge on the Income page — a collapsed, dismissible one-line banner surfaces income the page isn't tracking: recent income payments linked to no source, and active sources whose expected payment is overdue. Expand it to see the detail and add or fix a source, so income can never silently stop being tracked again
- Fixed a bug where untracked-income detection mislabelled outgoings, refunds and transfers as income — it now uses the app's real income definition (category 'Income'), so only genuine income is flagged
- Behind-the-scenes reliability improvements and visual fixes across the app
v3.0.015 Jun 2026
Coral Dash 3.0 — Demo Mode & a Year of Refinements
- Demo mode — try the whole app from the homepage before you sign up for anything. One click drops you into a fully populated dashboard with a couple of years of sample data: spending, income, net worth, pots and the yearly view. Switch months and years, open every page, then exit whenever you're done. No account, no Google, no spreadsheet
- Email & password login — sign up with just an email and password; a Google account is no longer required. Continue with Google still works exactly as before, you can change your password from Settings, and reset it from your inbox if you forget it
- Yearly Overview — a whole page for your financial year: total in, total out, what's left over, and what went to savings, each set against the same point last year. Toggle between the calendar year and the UK tax year (6 Apr to 5 Apr), and overlay up to five years on one chart
- The Income page, rebuilt — a 'this month' summary of what's landed versus what's still expected, the pay rhythm and recent payments for every source, your full career earnings history, and automatic pay-frequency detection
- A cleaner Dashboard — a mobile hero that fits your whole month on one screen, a single condensed Savings & Pots card, and Net Worth now leading your Financial Position
- Smarter Pots — names and balances come straight from Monzo's own Pot labels, so they match the Monzo app exactly
- Net Worth, expanded — assets split into Active and Long-term, a mortgage tracker with instant property lookup, and Trading 212 portfolio sync, all rolling into a single figure
- Precious metals — add the gold, silver, platinum or palladium you hold in troy ounces and Coral Dash values it every day from the live spot price, so it moves with the market inside your net worth
- More ways to track — non-monthly fixed expenses, a financial calendar, custom categories, keyword matching for income, and Personal / Joint / Combined dashboard views
- Run it yourself — the self-hosted Docker edition gives you every cloud feature on your own server: £30 once, yours forever, and no data ever leaves your hardware
- A refreshed design system underneath it all, with full dark mode and accessible, contrast-checked UI across every page
Got a feature request or found a bug?
Your feedback shapes what gets built next. Tell us what would make Coral Dash work better for you.
Share your feedback