Demo Sample data only, not connected to any live business data. Every name, supplier and figure below is invented.

Bright Cleaners — Ledger

Loading saved records…

WhatsApp import

?

Import a WhatsApp chat export (.txt) — drag & drop it below, or click to browse. Already-added day-records are skipped automatically, so it's safe to drop the whole, latest full export every time rather than trimming it down.

Drop WhatsApp .txt file(s) here, or

Or paste WhatsApp text instead

App import

?

Import an app export — .csv or .xlsx — drag & drop it below, or click to browse. Same dedupe rule applies: rows already saved are skipped.

Drop app export file(s) here, or

Or paste app CSV text instead

Include the header row: Date, Category, Amount, Note, Account.

Bank import

?

Import a bank statement export (Santander's .xls download, a .csv with Date / Description / Money in / Money Out columns, or a Barclays .pdf statement). A .pdf is parsed locally and shown in a preview table for you to check before anything is added — nothing is imported until you confirm. Incoming card-processor payouts (PayPal, Zettle…) are ignored — that money is already counted via the till and app. SumUp and WorldPay are the exceptions: their settlement amounts (already net of the processor's own fees — the same figure that lands in the bank) are added as Card income at face value. SumUp only counts from 1 June 2026 onwards (earlier SumUp dates are skipped — already entered by hand). WorldPay has no date cutoff, but every month up to and including June 2025 already has WorldPay income/fees entered by hand in App Records, so those months are always sent to the Flags tab for review instead of being added automatically; from July 2025 onwards WorldPay payouts are added automatically (a WorldPay-labelled App row found in a later month is still flagged too, as a safety net). Named client payments up to £2000 are added as income; anything over £2000, or with no identifiable payer, goes to the Flags tab for review. Outgoing payments already recorded in WhatsApp or the app on the same date for the same amount are marked "matched" and not double-counted; everything else is added as a Bank expense. Safe to re-drop the same statement — already-imported rows are skipped.

Drop bank statement file(s) here, or

Ignored payout / processor names (editable)

Any incoming bank transaction whose description contains one of these terms is skipped entirely — card-machine settlements and utility refunds, not client payments. Add a term if your statement wording changes or you start using another processor. (SumUp and WorldPay are handled separately — their payouts are recorded as Card income, so they're intentionally not on this list. SumUp counts from 1 June 2026 onwards; WorldPay counts from July 2025 onwards — months up to and including June 2025 already have WorldPay entered by hand in App Records, so those are always flagged for review instead.)

Quick add

?

Quick-add a single app record — no CSV formatting needed. Use a negative amount for an expense, positive for income.

Backup & reset

?

This ledger works on this device from the browser's local storage. If Cloud sync is set up, an encrypted copy is also stored on your server. "Download backup" saves a plain, unencrypted JSON copy of everything to this device — keep it somewhere safe; it is your only recovery path if you forget your sync password. "Clear all saved data" is permanent.

The JSON backup is not encrypted. Anyone who opens the file can read your ledger — store it somewhere private (not a shared/cloud folder you don't control). "Restore" replaces all data currently on this device with the file's contents.

Cloud sync (end-to-end encrypted)

?

Sync this ledger across your devices through your own website. Your data is encrypted in this browser with your password before it ever leaves the device — the server only ever holds unreadable ciphertext and never sees your password. Enter the endpoint URL and access token from your server setup, then reload and set a password. The password is required each time you open the page and is never saved anywhere.

Disabled in demo — in the live app this syncs across devices through a private server, end-to-end encrypted in the browser with a password that never leaves the device. The public demo has no backend, so everything here stays in this browser's local storage.

Prune old history

?

Permanently prune old history you no longer need. Everything dated on or after the cutoff date is kept; every WhatsApp day-record and app row dated strictly before it is deleted from both sources. Export a backup first if unsure — this cannot be undone.

+ Add till entry
+ Add expense
+ Add app record

Same as Quick add on Add data — negative amount for an expense, positive for income.

+ Add bank record

Enters the same bank pipeline as statement import. Positive amount = income, negative = expense.

Compares each month's App raw total — the unconditional sum of every negative row in your imported app data, exactly what your own spending app shows as its Expense figure — against this ledger's already-computed Ledger total (the same Expenses Total shown on Monthly summary). Sorted worst mismatch first. Click a month to see exactly which lines are causing the gap — not every expense, just what's unmatched on either side.

Read a staff timesheet

Upload a photo of a handwritten timesheet.

  • Read with AI = highest accuracy
  • Read offline = no internet required
  • Timesheets never affect your ledger until you press Save.
Staff

Drop a timesheet photo here

A clear, straight photo of the whole timesheet works best.

or

JPG, PNG, HEIC, WebP and other common image formats

This sends the photo (not your ledger) to Anthropic's API for reading — usually much more accurate on handwriting. Read offline keeps everything on this device.

Staff & hourly rates

Add or remove staff here. Rates are used only for the suggested pay figure on this tab — changing a rate never changes a timesheet you already saved (each one keeps the rate it was saved with). Removing a name does not delete their saved timesheets.

Saved timesheets

Compare with recorded wage payments

Read-only. Puts the suggested pay from the timesheets above next to what your ledger already holds under that name over the same dates — a plain name-and-date filter, so you can eyeball the two. It changes nothing: no record is matched, linked, tagged, excluded or edited, and no total anywhere else in the app moves.

Type a plain instruction to change how records are categorized — for example include Worldpay as income, don't include PayPal, exclude Petra's bank transfers from expenses, or always categorize Northgate Leather as Supplies. Rules are matched locally by keyword — nothing is sent anywhere. You'll see a plain-English confirmation before anything is applied, and rules re-run across all imported history.

Active & custom rules

Applied top-to-bottom; a later rule overrides an earlier one where they touch the same record.

Built-in safeguards (locked)

These protect known calculations. They can't be broken by a typed rule — unlock to change, with a second confirmation.

Records you deleted with any × in the app — global search, Till log, Expense detail, App records, Bank, Reconciliation, Flags, or a Monthly-summary breakdown. A deleted record is removed from every total — Monthly summary, breakdowns, Reconciliation, search and the Excel export — but is kept in storage so you can restore it here at any time. Restoring brings it back into all totals immediately.

Read-only coverage of what has been imported so far — so you can spot gaps without changing any totals. Pulled directly from the existing raw stores; nothing here is editable.