Tags

Tags give the ability to mark specific points in history as being important
  • 10.4

    Steady budget lines, and a pace to hold them to. A budget line can be marked steady — spent or
    earned evenly across the year — and the Budgets screen then follows its pace, measured in whole
    months through the last month that is both imported and fully allocated: Actual/month and the
    cumulative chart for steady lines only, a gold status from 10% over pace and a red one from 25%
    with where the line is heading, an overspent line's actual in red, and a note when a month still
    to allocate is holding pace back. Today now comes from the server instead of each browser, in
    the server's time zone — set TZ on the container — and henkui.today can pin it; the demo is
    pinned to December 15, 2025 and says so on every page. Every amount is written the same way,
    from its currency, and the fonts are served by Henkui itself. Migration V7 adds
    budget_line.steady, false for every existing line, and applies on startup.
    
    📝 Sharpen Marc's persona
    📝 Walk Marc, branch A — an existing PostgreSQL
    📝 Stop printing a version to copy in the admin guide
    🔒 Serve the fonts ourselves instead of from Google
    📝 Refocus Claire & Jonas on the monthly session
    📝 Couple Jonas's engagement to Claire's, and add December
    📝 Name the three things Jonas has to be able to point at
    📝 Warn walkers to let the charts finish animating
    📝 Walk Claire & Jonas — both sessions
    📝 Rewrite Claire & Jonas's scorecard, and score the run against it
    ✨ Generate the Claire & Jonas walking fixtures
    📝 Rewalk Claire & Jonas on their own fixtures
    🐛 Format every amount the same way, from the currency
    🐛 Let signed-out pages load the bundled fonts
    📝 Document the single amount formatter and the monospace face
    ✨ Take today from the server, and let henkui.today pin it
    🌱 Pin the demo to mid-December 2025, and give Sarah her robot vacuum
    🌱 Let the kids name the robot vacuum
    📝 Settle the vocabulary for steady budget lines
    ✨ Mark budget lines steady and say how far a budget is allocated through
    ✨ Follow the pace of steady budget lines, and warn when one goes over
    📝 Document steady lines and pace
    🌱 Mark the everyday spending of the demo and the fixtures steady
    ♻️ Take the chart's today from the server
    🌱 Let Sarah's takeaway coffee run a little over its pace
    💄 Turn an overspent line's actual red, and let its pace rest
    💄 Stop flagging extra income as a warning
    ✏️ Write in US English
    💬 Say on every page when today's date is pinned
  • 10.3

    Data leaves as easily as it arrives. Henkui read five formats and wrote none — the only way out
    was the operator's pg_dump, which restores an instance rather than a person's data. The person
    menu now carries "Export data": pick a budget year, press Export, get one CSV of that year's
    transactions, one row each, allocations included. Its first three columns are the ones Generic
    CSV reads, so an export is also an import — a year taken out of one account goes straight back
    into another, or into another instance, with nothing to edit first. No migration: the database
    schema is unchanged since 9.
    
    ✨ Export a budget year of transactions as CSV
    ⬆️ Build the frontend on Node 26
  • 10.2

    The frontend catches up. Angular 18 through 22 in one run, change detection without Zone.js,
    and every screen but the landing page loaded on demand, which halves what a first visit
    downloads. Along the way the screens gained a little: the budget listing says how many
    transactions each budget holds, the budget you are reading follows you from screen to screen,
    and changing a transaction filter returns you to the first page instead of an empty one. Charts
    follow the window again, unhandled errors reach Angular's handler, and a signed-out browser can
    fetch the favicon. No migration: the database schema is unchanged since 9.
    
    🐛 Debounce the transactions screen's live filters
    📝 Publish the demo database image and streamline the docs
    🔧 Modernize the Angular 18 build tooling and add ESLint
    ⬆️ Update to Angular 19 core and CLI
    ♻️ Replace APP_INITIALIZER with provideAppInitializer
    ⬆️ Update Angular Material/CDK to 19 and ngx-charts to 24
    ✨ Use @let for repeated template reads
    ✨ Convert AccountScreenComponent to signals + OnPush
    ✨ Add OnPush to components with no mutable local state
    ✨ Add OnPush to the already signal-driven auth screens
    ✨ Convert small dialogs to signals + OnPush
    ✨ Convert transaction-edit, overview-screen and remaining dialogs to signals + OnPush
    ✨ Convert BudgetScreenComponent to signals + OnPush
    ✨ Convert AccountImportDialogComponent to signals + OnPush
    ✨ Convert TransactionScreenComponent to signals + OnPush
    ✨ Adopt withComponentInputBinding() for the transactions screen's linked filters
    ⬆️ Upgrade to Angular 20
    🔥 Drop fp-ts for a plain ternary
    ⬆️ Bring jasmine/karma up to Angular 20's own scaffold pins
    ✨ Adopt linkedSignal() for the transactions screen's budget-line filter
    ✨ Forward unhandled window errors to Angular's ErrorHandler
    ⬆️ Upgrade to Angular 21
    ⬆️ Bump ngx-charts to 25.0.1 now that it fits Angular 21
    ⬆️ Bring jasmine/karma up to Angular 21's own scaffold pins
    🔥 Drop provideAnimations() — Material no longer needs it
    🐛 Bump the Docker build image from node:18 to node:24
    ⬆️ Bump typescript-eslint to 8.68 for TypeScript 6 support
    ⬆️ Upgrade to Angular 22
    ⬆️ Bump angular-eslint to 22
    🐛 Bring the arm64 build image to node:24 and build with the pinned CLI
    🔥 Keep v22's new template diagnostics switched on
    🔥 Adopt v22's fetch backend for HttpClient
    🔥 Drop src/test.ts and let the builder bootstrap the tests
    🔥 Go zoneless
    ⬆️ Build with @angular/build instead of the webpack facade
    🔥 Drop the color attributes M3 ignores
    ♻️ Move to Material's unified button selectors
    🔥 Drop the redundant standalone: true
    ⚡ Load every screen but the landing page on demand
    ♻️ Hold the accounts list in an rxResource
    ♻️ Give the account dialog a typed result
    🐛 Recompute the year's progress when the budget changes
    ♻️ Hold the budget screen's three fetches in resources
    ✨ Count each budget's transactions on the listing
    ✨ Open every screen on the same budget
    ♻️ Build BudgetRm rather than count its arguments
    ♻️ Hold the overview screen's three fetches in resources
    ♻️ Make the last five transaction filters signals
    ♻️ Derive the transaction screen's budget lines from the year
    🐛 Send a filter of zero rather than dropping it
    ♻️ Derive the transaction screen's accounts and page currencies
    ♻️ Derive the transactions page from its filters
    ✨ Return to the first page when a filter changes
    ♻️ Hold the dialogs' reads in resources
    🐛 Provide the animations ngx-charts still asks for
    🐛 Watch the cumulative chart's size instead of reading it once
    🔒 Let signed-out browsers fetch the favicon
    🐛 Stop confirmation snackbars rejecting when nobody answers
    👷 Run the frontend in CI
    🐛 Let the budget pie charts follow the window
    ♻️ Replace ngClass with class bindings
  • 10.1

    Reads a file as it arrives — separator, decimal mark, date order and encoding sniffed rather
    than fixed — and asks only where the file genuinely does not say, such as every date landing on
    or before the 12th. Any import can be run as a preview first: it reads the file, checks currency
    and duplicates, and shows what it would create without writing any of it, offered ticked for
    importers whose shape is inferred. The demo dataset moves from hand-edited SQL to a generated
    one: db/generator/story.py declares the family, the budget and the merchants, and the shipped
    seed was regenerated from it. No migration: the database schema is unchanged since 9.
    
    📝 Write down how the UI should talk to people
    ✨ Read a CSV in whatever shape it arrives in
    💄 Say less in the import dialog
    🔨 Generate the demo dataset from a story spec
    🌱 Regenerate the demo year in Fairview
  • 10

    Interchange formats. Statements now import from OFX/QFX, CAMT.053, QIF and Excel
    workbooks, so most banks are read from a published format instead of a CSV they can
    reshape without notice. A statement whose currency is pegged to the account's is
    offered the conversion, at the legal parity. Two removals make this a major: the
    euro American Express CSV importer is gone — download the OFX behind Amex's "Quicken"
    button instead — and with it the `american-express-eur` slug, which now answers 404;
    `docker-compose.yml` is replaced by `compose.yml` (development database) and
    `compose-demo.yml` (full demo stack). Failed logins are throttled. No migration: the
    database is unchanged since 9.
    
    📝 Add repeatable security-testing checklist
    💄 Keep the last rows clear of the floating FABs
    💄 Brighten the tab icon so Safari stops plating it white
    ♻️ Rename CsvImporter to StatementImporter
    ✨ Import OFX and QFX statements
    ✨ Import CAMT.053 statements
    ✨ Import QIF registers
    🚑 Stop the QIF importer's name pointing at OFX files
    ♻️ Organise the importer package by format and bank
    📝 Record that package segments are snake_case
    🔥 Drop the euro American Express importer
    🐛 Convert Amex euros by the legal peg, not a rounded rate
    ✨ Offer the conversion when a statement's currency is pegged
    💄 Colour the currency step as a question, not a problem
    🐛 Let the import past the currency step
    ✨ Import Excel workbooks (.xlsx)
    📝 Simulate eight personas, and walk two of them
    📝 Refresh the project guidelines
    📝 update .gitignore
    🚚 Split the demo stack out of the development compose
    👷 Move :latest to the newest release on every tag
    ⚡️ Cut the Docker build context from 4.3 GB to 3.7 MB
    📝 Organise self-hosting around the database, not the container
    📝 Write the personas against intent, not the repository's layout
    📝 Refresh the project guidelines for the new layout
    🔒️ Throttle failed logins instead of letting them run free
  • 9.2

    Allocation suggestions. The allocate dialog now proposes a budget line drawn from your
    own past allocations — recurring bills and income, identical and similar descriptions —
    as a hint you accept with one click or ignore; nothing is ever allocated without you. No
    migration: the database is unchanged since 9. The API gains a read-only
    `GET monetary-accounts/{accountId}/transactions/{transactionId}/allocation-suggestion`,
    answering `204 No Content` when no suggestion is confident enough to show.
    
    ✨ Suggest budget lines from past allocations
    💬 Word a recurring salary as income, not as a bill
    ✏️ Fix a typo in the suggestion examples
  • 9.1

    Henkui in the browser tab, drill-down from the overview, and imports that
    no longer double an account's figures. No migration: the database is
    unchanged since 9. Anything scripting the import endpoint should note it now
    takes a `duplicates` parameter and answers with `{created, skipped}` rather
    than a bare array.
    
    💄 Name the browser tab Henkui, not Gui
    🍱 Put the Henkui mark in the browser tab
    🍱 Add the logo as SVG, traced from the Illustrator source
    ✨ Serve the tab icon as SVG, with the .ico as fallback
    💄 Hand-draw the 16px favicon so the leaves stay legible
    💄 Show the vector logo on the home screen
    🔥 Drop assets nothing has referenced since v6
    ✨ Drill from an overview amount into the transactions behind it
    💄 Merge the category and budget-line filters into one list
    🐛 Sum the overview from the budget, not from the year
    ✨ Filter transactions by currency
    ✨ Keep a category either whole or split, and offer the fix
    ✨ Stop an import from doubling what an account already holds
    💄 Give the duplicates step room, and fill sticky table headers
  • 9

    Multi-currency support. An account and a budget each carry a currency now:
    creating either requires one, existing data is backfilled to XPF, and the
    American Express importer splits into two paths. Read readme-admin.md before
    upgrading across this tag.
    
    ✨ Hold accounts and budgets in several currencies
    ♻️ Turn the importers into a registry, split by currency
    ✨ Show and pick currencies across the app
    ✨ Name the currency only when the transaction page mixes them
    ✨ Warn that a bank can break its own importer
    🔥 Drop the padding formatter, keep a currency's decimals
    🐛 Keep data editable when its currency leaves circulation
    🐛 Format cumulative summaries with the budget's decimals
    📝 Document multi-currency accounts, budgets and importers
    📝 Tell users what to click, not what the file looks like
    ✨ Let users sign up, change their password and delete their account
    🔒️ Enforce a real password policy with a live checklist
    💄 Fill the delete buttons with the themed error colour
    🐛 Stop the delete dialog's warning icon from being clipped
    🐛 Proxy the new account paths in ng serve
    ✅ Overhaul test suite: phase split, coverage, and mechanism-based taxonomy
    🔒 Cover the security testing requirements across all endpoints
    👷 Report integration coverage in CI
  • 8.1

    ✨ Move authentication into the app with a title-bar session widget
    💄 Refine the session widget: account menu and consistent login wording
    💄 Hide the account menu's Manage item until #36 lands
  • 8.0.1

    🔒️ Enforce user-account ownership as NOT NULL
  • 8

    ✨ Add multi-user support with per-user data isolation
    💄 Separate Home from the main sections in the nav
    💄 Add onboarding empty states for Accounts, Budgets and Overview
    ✨ Streamline the new-budget dialog for the first budget
    ✨ Guide new users through the Transactions screen
    ✨ Filter transactions by amount range
    🚚 Rename the spending-rate API and internals to cumulative
    💄 Rework the spending-rate dialog into a cumulative chart
    🚚 Rename budget entry to budget line, earnings to income
    💄 Dark M3 redesign with mint/gold theme and reworked screens
    🐛 Fix blank error snackbar in the import dialog
    🐛 Return 400 instead of 500 for bad CSV imports
    ✨ Standardize API errors as RFC 9457 Problem Details
    📝 Rework the readme and manual, add license disclaimer
    📝 Point the readme roadmap at GitLab work items
    📝 Capture vocabulary, DB-migration and docs conventions in CLAUDE.md
  • 7.1

    - ✨ Add editable notes to transactions
    - ♻️ Factor withCredentials into an HTTP interceptor
    - 🔥 Remove Spring HATEOAS; return plain lists and a PageRm
    - ✨ Show latest transactions in account import dialog
    - ✨ uses flyway
    - ⬆️ Upgrade Java 21 -> 25
    - ⬆️ Update Spring Boot to 4.1.0 and jacoco to 0.8.1
  • 7.0.14

    - fixes CI
  • 7.0.13

    - fixes CI
  • 7.0.12

    - fixes CI
  • 7.0.11

    - fixes target architecture
  • 7.0.10

    - fixes deploy
  • 7.0.9

    - fixes CI
  • 7.0.8

    - fixes CI
  • 7.0.7

    - fixes CI