Skip to content

v4.0

Latest

Choose a tag to compare

@31b4 31b4 released this 20 Oct 12:05
e50193c

v4.0

v4.0.mp4

GitHub release · Compare v3.3…v4.0

Highlights

  • Rebuilt Investments with a responsive portfolio overview, compact holding details, historical value charts, and HUF, USD and EUR reporting.
  • Record cash-linked purchases and sales with exact execution, fees and settlement; review cost basis, net invested and gains with explicit coverage for incomplete history.
  • One transaction composer supports single payments, category splits and balance adjustments; MCP can prepare whole split payments for review in the app.
  • A refreshed Dashboard combines balances, period activity and one review queue. This major upgrade requires six database migrations and a coordinated API, MCP and client rollout.

Investment rework

  • Redesigned portfolio overview and holding details. View portfolio value, net invested, gains, allocation and sortable holdings with native 30-day trends. Open a holding for its value/gain breakdown, position, price chart and trade history; charts and trade markers share a split-adjusted display basis without rewriting executions. Filters affect holdings while portfolio totals remain complete; privacy, responsive layouts and retained session snapshots work throughout. #144, #168, [#172](ht

tps://github.com//pull/172)

  • Direct cash-linked Buy/Sell. Preview purchases and sales using actual execution prices, fees and exact settlement amounts before saving. Version-protected edits and deletion update both cash and holdings together, with safeguards against repeated saves and overselling; new trades start from Investments, and existing linked cash rows open the same editor. #125, #139, #145, #172
  • Clearer investment performance. Distinguish remaining cost basis, net invested, realized/unrealized gains and covered daily/range return estimates. Dated exchange rates support historical costs; complete matching trades can explain existing positions, and a review flow completes missing legacy purchase facts without moving cash or units again. Price returns exclude dividends, and unknown costs or FX stay explicit. #142, #151, #162
  • Historical portfolio tracking. Compare portfolio value with net invested over calendar ranges using dated quantities, prices, manual observations and exchange rates, including sold and archived holdings during ownership. Cash-flow-adjusted return estimates require covered daily history; missing records remain visible as gaps rather than fabricated values. #143
  • Flexible holdings and dated manual values. Set up ETFs, stocks, crypto and manual assets with separate pricing and unit choices. Record dated openings, quantity corrections and total/per-unit appraisals, with valuation history and reminders; these create no invented cash movements, and a zero appraisal does not dispose of an owned asset. #137, #140
  • HUF, USD and EUR reporting with clearer market inputs. Switch currency across portfolio summaries, history, holdings and previews while prices retain their native currency and source time. Shared cached market/dated FX reads reduce repeated requests; delayed quotes have restrained indicators, older inputs retain warnings, and concurrent history reads preserve valid source data. #141, #160, #164, #166
  • Consistent investment reads across the app and MCP. API/client and independent MCP use shared valuation and accounting rules, with explicit missing-data coverage and MCP's warned partial-total policy. The complete redesign preserves locks, archive history, review-draft isolation and financial exports; MCP remains read-only for investments. #147

Added

  • One transaction composer with category splits. Record a single payment, divide it across categories, or record an account balance difference through the same controls. Splits save atomically and appear as one expandable row; Save and add another retains type, account and date for the next payment. Splits remain cash-only and are unavailable for transfers, recurring entries and future-dated ordinary payments. #154
  • MCP split review drafts. Prepare/create split payments with an optional receipt-total check, then preview edits or declines for a whole split. The app reviews, edits, confirms or declines all lines together; drafts affect neither balances nor projections until confirmed. MCP review lists and transaction search expose split grouping. #154

Changed

  • Dashboard combines a shared period picker, responsive balance/activity summaries, compact filters and one review queue with explicit confirmation actions and ready-item balance previews. Neutral transfer rows, daily cash-flow totals and native/converted amounts clarify activity; privacy and unavailable-data states follow the layout. #121
  • Income/expense amount fields show the selected account's currency immediately after the typed amount, preserving decimal input and caret behavior. #153
  • Maintenance: documented the investment accounting contract and rollout, expanded real Worker/D1 migration, rollback, concurrency and financial regression coverage, and verified compatibility of the independent split and investment migrations. #136, #146, #170
  • Contributor guidance explicitly forbids AI author/co-author attribution in repository and GitHub records. #156
  • Bumped the root application version to 4.0, used by the API version endpoint and sidebar. Independent MCP protocol/Worker versions are unchanged.

Fixed

  • Cash and investment balance changes use decimal arithmetic to prevent floating-point residue while preserving genuine fractional amounts. Payments, transfers, adjustments, splits, pending confirmations and recurring execution commit balances, ledger rows and audits together, with guards against duplicate or conflicting changes and narrowly verified legacy residue recovery. #146, #149, #170
  • Dashboard net worth respects investment holding exclusions while Investments continues to show all active holdings. #147
  • Enabled buttons, tabs, menus, selects, checkboxes and other clickable controls show a pointer cursor again after Tailwind CSS 4 reset them to an arrow. Disabled controls retain their default cursor. #158
  • Deployment accepts trailing SQL comments and validates every pending migration's final statement terminator before database changes, preventing false semicolon errors and avoidable partial upgrades. Retrying skips migrations already recorded under their complete names. #174

Removed

  • The separate bulk-add, balance-adjustment choice and split-adjustment dialogs are replaced by the composer. Per-row account/date, sliders, auto-balance and fill-with-total are retired; use Save and add another for unrelated payments. Dashboard's transfer creator now selects cash accounts; create investment trades from Investments. #154, #172

Migration and upgrade notes

  • Prepare a fresh SQL backup and rehearse the upgrade on a disposable copy before production rollout. Arrange a write-free window covering browser/API/MCP writers and scheduled execution; there is no built-in maintenance switch. Review the investment rollout and recovery guide. #147
  • Apply all missing migrations in the following order before deploying updated Workers. Preserve both original 017 filenames: the custom ledger tracks complete names, so already-applied files are skipped. Do not rename, edit or manually replay applied migrations; see the migration guide. #170, #174
    • 017-investment-transfer-links.sql: adds reciprocal links for verified cash/investment pairs without changing recorded amounts or quantities.
    • 017-transaction-splits.sql: adds split grouping and ordinary transaction membership; JSON exports include transaction_splits.
    • 018-investment-holding-metadata.sql: adds pricing/unit/provider metadata and immutable observed position anchors without inventing purchases or cost history.
    • 019-investment-trade-facts.sql: adds nullable execution, fee and settlement facts, event order, mutation versions and bounded retry receipts.
    • 020-manual-investment-valuations.sql: adds dated total/per-unit observations and explicit whole-asset ownership events.
    • 021-market-data-cache.sql: adds reconstructible provider data, excluded from financial exports and financial-source revision changes.
  • Deploy API → MCP → client against the same migrated D1 database, then refresh the frontend/PWA and rescan the ChatGPT app's actions for the new split tools. The full deployment path is npm run deploy -- --with-mcp; API/MCP-only deployments refuse pending migrations unless explicitly asked to apply them. Release publication does not deploy the app. #147, #154
  • Existing holdings do not need recreation, and recorded balances, units and history are preserved. Unknown legacy execution, fees, costs and currencies remain unavailable until supported facts are supplied; unsupported standalone/unlinked investment mutations are read-only. Use the dedicated trade editor and historical-detail review instead of ordinary cash entries or recurring schedules to change investments. #139, #151, #172
  • Check cash/units, reciprocal links, legacy coverage, manual valuation dates, exports and forecast freshness after rollout. On failure, stop writes and preserve the database before inspecting schema/history; an older Worker alone is not a proven database rollback. Market availability, bounded history and incomplete opening/FX/corporate-action coverage can limit returns; automated dividends/corporate actions and tax-lot accounting are outside this release. #147