Shipped vs. planned

What's built, and what isn't yet

Wicker Money is pre-1.0 with a single maintainer. This page mirrors the project's ROADMAP.md directly rather than restating it loosely, so it can't drift into overpromising.

Shipped Through v0.7.0

Auth & ledger Users, accounts, categories, rules, transactions and splits — all under row-level security. Account balances are derived from the ledger, never stored.
App shell & plugin host Module Federation host with dashboard widgets contributed by plugins, and per-plugin database roles derived from each plugin’s manifest.
Import & categorization CSV import with saved column mappings, duplicate detection and batch undo. Category rules with a preview, plus triage on the Transactions page.
Self-hosting release (v0.1.0) A self-hosting quickstart, a published container image, the plugin SDK and UI kit on npm, and a light/dark/system theme switch.
Recurring items & Until payday (v0.2.0) A Recurring page for income, bills, debt payments and transfers, with split paychecks as one item. The Until payday widget shows what’s safe to spend before your next paycheck and warns, per account, before a balance drops below its buffer.
Forecast & time zone (v0.2.1) A Forecast page projecting one account’s daily balance from its recurring items, out to 90 days, 6 months or the end of the year. “Today” follows your own time zone.
Paid / landed matching (v0.3.0, v0.4.0) Match a transaction to the recurring item it paid, from the Recurring page or the Transactions page, so nothing is counted twice. Skip, move or change one occurrence, see late payments flagged, and dismiss a wrong suggestion with “Not this”.
Budgets plugin Per-category monthly budgets with per-line rollover, plus budget windows (v0.3.0): one amount for one category across a date range, like holiday gifts.
Plugin manager & roles (v0.4.0) The instance’s owner turns plugins on and off from Settings, applied live, with each plugin’s data kept while it’s off. The first account is the owner; later sign-ups are members.
Errors on the field (v0.4.0) Every form checks what it can before sending and shows each problem under the field it’s about.
Starter categories (v0.4.1) Memberships and Domains / web hosting join the starter set; “Run setup again” adds them to an account that’s already set up.
Phones & accessibility (v0.4.2) A navigation drawer and card layouts on small screens, collapsible Categories and Rules, icon row actions, a skip link and a title for every page.
Plugin platform hardening (v0.5.0) The plugin’s server contract in one place, stability tiers for the plugin SDK, one shared request for dashboard widgets, recurring matches that load their data once, add and edit forms in the shared dialog, and plain wording about what a plugin is and isn’t trusted to do.
Account allowances & owner setup (v0.5.0) A monthly amount measured against one checking account on the Budgets page, with rollover and categories you can leave out, for money that goes into an account “to spend on whatever”. Set BOOTSTRAP_OWNER_EMAIL to name the owner of a new instance.
Debt payoff (v0.6.0) List your loans and cards, choose snowball or avalanche and an extra monthly amount, and see the date you’ll be debt free and the interest it saves against paying only the minimums. A dashboard widget shows the date and the next debt in line.
Roles & erasing your data (v0.6.0) Owners change another account’s role from Settings → People. A danger zone at the bottom of Settings holds two separately-confirmed actions: “erase my data” (your own rows, across core and every plugin, keeping your login) and, for an owner, “erase this entire instance”.
Plugin isolation & a safer export (v0.6.0) Insights and Spending Trends now run in sandboxed frames that can’t reach your session, cookies or the page, and reach data only through the app with a short-lived token. An operator can add a third-party UI plugin by hand, as an experimental feature behind an integrity pin; there is no install flow yet. The sandbox has known gaps (it doesn’t stop prerender or WebRTC requests in Chromium) and hasn’t been independently reviewed. The data export now asks for your password again.
Speed, accessibility & tuning (v0.6.0) Core pages load on first visit, sorting the ledger uses new indexes, and responses are compressed. Focus handling, chart and table markup were fixed, and charts gain a “Show as table” view. New settings cover the database pool, statement timeouts and the CSV row limit (default 100,000).
Owner confirmation & a table that fits (v0.6.1) An owner is asked to confirm before a third-party plugin is switched on, with its origin and the tables it can read in front of them. The Transactions table keeps its date on one line and its row actions in view on narrower windows, with every column still there.
More plugins in sandboxed frames (v0.7.0) Until payday, Forecast and Debt payoff now run in sandboxed frames too, so only Budgets and Import CSV still run in the app’s own page. Frames on the dashboard start as you scroll to them. The sandbox has the same known gaps and hasn’t been independently reviewed.
Notifications & a quieter recurring column (v0.7.0) On Transactions, Recurring, Accounts, Categories and Settings the app says what an action did (“Deleted ‘Coffee’ (-$4.50).”) in a notification that stays until you close it, with no Undo. The Transactions recurring column shows a matched item as a pill and moves choosing, suggestions and dismissals into a list that a Link button opens.
Debt payoff controls (v0.7.0) Leave a debt out of the plan, give one debt its own monthly extra, model a loan in deferment, a promotional rate with optional deferred interest, and daily or simple daily interest. A debt that uses none of it gets the plan it got before.
Limits for a busy instance (v0.7.0) A per-user API rate limit, on by default and easy to raise or turn off, and a cap on how many CSV imports a process commits at once, so a few large files can’t take every database connection.

Two more bundled plugins, insights and spending-trends, also ship in the image — see the repo for what they currently cover.

Now After v0.7.0

  • Closing the known gaps in the plugin sandbox (prerender and WebRTC requests from a frame in Chromium). A test of the obvious browser controls found none that closes them yet, so they stay documented.

Next

  • Moving the last two bundled plugins (Budgets and Import CSV) into sandboxed frames. They still run in the app’s own page.
  • Faster deep amount-sorted pages and merchant search on very large ledgers.
  • More end-to-end browser tests of the app’s flows. A first set of smoke specs is in the repository, but it isn’t part of the regular test run and hasn’t been run under Docker yet.
  • A per-plugin theme contribution point, so a plugin can ship an additional theme alongside the built-in light/dark/system switcher.

Later

  • Cross-plugin data access — a plugin reading data another plugin owns, such as debt details feeding net worth or FIRE, or comparing two budgeting plugins side by side. Today a plugin only sees core tables.
  • An envelope budgeting plugin alongside the existing budgets plugin.
  • FIRE plugins (lean, fat, barista, coast), comparable side by side on a shared calculation module and light enough to run several at once.
  • Extending the shortfall warning to savings and other accounts, measured against each account’s buffer amount, for planning larger purchases.
  • Editing an occurrence from the calendar widget, and a month grid view.
  • Suggesting recurring items by detecting patterns in your transaction history.
  • Themes as a data-only plugin type: a validated set of design tokens, no code.
  • Third-party plugin installation — an install flow, a catalog and signing. Today an operator can add a UI plugin by hand and it runs only in a sandboxed frame with the table reads it is granted; an independent security review of the sandbox comes first. A plugin’s server-side code stays first-party only.
  • Freezing the plugin API (SDK_MAJOR_VERSION) ahead of 1.0. The SDK’s entry points now carry stability tiers; the freeze applies to the stable ones.

How the plugin model works

The core owns identity, money movement and the app shell. Everything that interprets money — budgets, forecasting, FIRE, importers — is a plugin built against @wickermoney/plugin-sdk. A fresh install is useful on its own; bundled plugins are built against the same SDK a third-party plugin would use. Two of them (Insights and Spending Trends) run in a sandboxed frame; the rest run in the app's own page, fully trusted. An operator can add a third-party plugin by hand as an experimental feature, and there's no install flow yet. The instance's owner can turn any plugin on or off from Settings, and a plugin that's off keeps its data until it's turned back on.

The app and bundled plugins are AGPL-3.0. plugin-sdk and ui-kit — the surface a plugin is built against — are Apache-2.0, which is what makes an independently-built, non-bundled plugin licensable on its own terms. A third-party plugin install flow and catalog aren't built yet; they wait for an independent review of the sandbox.