Open source · Apache 2.0

Two sets of books.
One set of numbers.

The accounting console we built for our own company. Enter a transaction once, and it lands in the right books on its own — no second spreadsheet to keep in step, no month-end surprise.

Run it on your own server·Free forever

The same three transactions, kept two ways

One entry Verdant Biosciences — data dashboard add-on Both books NT$260,000
Internal bookin syncinternal.xlsx
08/14Morningside Creative60,000
08/11Verdant Biosciences260,000280,000
08/05Monthly payroll run−201,000
External bookin syncexternal.xlsx
08/14Morningside Creative60,000
08/12Team software subscriptions−9,800
08/11Verdant Biosciences260,000
Agreeing One entry, marked as belonging to both. Change it once and both books change with it. Off by NT$20,000 Someone corrected one file. Nobody corrected the other.

You already know how this goes wrong

Three things that happen to every small company that keeps its own books.

The two files stopped matching

Someone fixed a number in one place and not the other. You find out in March, when it is far too late to remember which one was right.

The invoice never went out

The work shipped in May. The invoice went out in August, after the client asked about it. Nobody was watching the gap in between.

Nobody can say what you are owed

Not without opening four files, filtering each one and adding it up by hand — and getting a slightly different answer every time.

Dual books

Mark it once. It files itself.

Every transaction says which books it belongs to — internal, external, or both. The two views read from the same rows, so they cannot drift apart.

  • Salaries stay internal. A pay run marked internal never appears in the external view. You do not delete it, and you do not keep a second copy of it.
  • Client income counts twice, on purpose. Revenue that belongs in both books is entered once and shows up in both.
  • Two currencies, two totals. New Taiwan dollars and US dollars are added up separately. Nothing invents an exchange rate for you.

Dual books

The ledger listing transactions, each marked as internal, external or both
Billing board

One page for everything you are owed

Who should be billed, who has been billed, and who still has not paid — with the next thing to do sitting on every row.

Billing board

The billing board, with summary cards and every billing item alongside its next step

Nothing sits in limbo

An item moves forward on its own as dates pass and payments arrive. You never set a status by hand, so it is never quietly wrong.

1
Upcoming
2
Time to bill
3
Billed
4
Part paid
5
Paid
Overdue Past the deadline and still not paid. It leaves the queue and gets counted on its own card, where you cannot miss it.

Two kinds of money, one list

A contract is signed once and billed in stages. A subscription bills every month, forever. On a Tuesday morning they are the same job, so they share the same list.

Contract · billed in stages
30%
40%
30%
Subscription · every month
Due, in date order
05/31Phase 1 — build kickoff800,000
06/01Platform operations40,000
07/01POS maintenance25,000
07/31Interim payment 30%360,000
08/01Platform operations40,000
Reminders

Nagging that reaches you

A reminder inside the app only works if someone opens the app. These go into a Google Calendar instead — so they turn up on your phone at nine in the morning, next to your meetings.

Connect the calendar once. Dates move when the work moves. There is nothing to keep running in the background.

August 2026
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Send the bill. The date a stage of a contract comes due.
Chase the payment. The deadline you gave the client.
Issue the invoice. The end of a tax period you still owe paperwork for.
Overview & reports

Where the money is, and who is late

Two questions you ask constantly, answered on two pages instead of in a spreadsheet you rebuild every quarter.

Overview

Overview page showing balances per account, monthly cash flow and the balance trend
  • Every account, every currency. Balances sit side by side, unconverted, so the number you read is the number in the bank.
  • Money in against money out, month by month, with the trend behind it.

Reports

Reports page with receivables ageing, tax periods and contract coverage
  • How old the debt is, per client — not just how big it is.
  • Work you agreed to but never billed for. A signed contract nobody scheduled is money you will forget to ask for.
AI assistant

Ask your books a question

Point an AI assistant at it and ask in plain words. It reads exactly what you can read, and nothing you cannot.

It can write, too — “log that NT$18,500 cloud bill as an external expense” is a sentence, not a form.

Assistant
you Which clients are overdue, and by how much?
reading the billing board…
 
Highbridge Construction · Phase 1 · NT$800,000 · 82 days late
Northwind Labs · Data pipeline · US$6,500 · 31 days late
 
Two clients. Totals kept in their own currency.

Nobody has to work in a language they are guessing at

Switch, and the whole thing follows — buttons, tables, even error messages. Try it:

The page address never changes — your bookmarks keep working.
Due to bill
3
NT$545,000
Due date has passed, not yet billed
Awaiting payment
2
NT$420,000
Billed, not yet fully collected
Overdue
2
NT$800,000 · US$6,500
Past the payment deadline, still not collected
Invoice pending
8
NT$636,000
Billed or paid, invoice not issued yet

The rest of the month

Bookkeeping is not only ledgers and invoices. These are the parts that make it survivable.

Clients and suppliers

Everyone you deal with is a proper record, so a name is never typed twice or spelled two ways.

Money people fronted

Someone paid out of their own pocket. Track what the company owes them and settle it properly.

Checking against the bank

Match what the bank says against what you recorded, and write down the difference instead of arguing with it.

Payroll

Staff, pay items and pay runs, posting straight into the internal books where salaries belong.

Receipts on file

Upload the receipt or the contract and attach it to the entry it justifies. No shoebox.

More than one company

Run several companies from one install. Each one only ever sees its own numbers, and you switch with a click.

For whoever sets it up

Three commands, your own server

It is an ordinary web app with an ordinary database behind it. Put it wherever you already put things.

01 Install it
bun install
02 Point it at your database
cp .env.example .env.local
# database address, a secret, Google sign-in
03 Start it
bun dev   # then open localhost:3000

The first person to sign in sets up the company. There is a Docker setup in the repo if you would rather not think about versions.

Built with
Next.js 16, React 19, Tailwind CSS
Database
Any PostgreSQL — nothing in it is tied to one provider
Sign-in
Google, with invites and owner & admin roles
Hosting
Your server, a container, or a serverless platform — the repo does not insist
Licence
Apache 2.0. Use it, change it, sell what you build with it

Stop reconciling your own files

It is the tool we run our own company on — not a general-purpose accounting suite, and not trying to be. If you keep two sets of books and chase your own invoices, it will probably fit.

Already using it? Log in here.