Full-stack · 2026
Manyue
See where it went. Without typing it in. Photograph a receipt, or say one sentence. Manyue writes the entry, files it under the right category, and remembers the shop for next time.
The part nobody keeps doing
Bookkeeping tools mostly fail at the same point: the typing. A shoebox of receipts turns into an evening of data entry, so the ledger goes stale and the numbers stop being worth reading.
Manyue removes that step. A photograph or a spoken sentence becomes a draft entry with a payee, a category and a split, and the ledger still balances to the cent. Categories are one level deep on purpose, because two is a filing system nobody keeps up.
How a receipt becomes an entry
The upload answers immediately and the model call happens behind the response, so a slow extraction never holds the camera open.
A retry of a failed receipt is reset to extracting first, so nobody is
shown the previous failure as though it were this attempt's.
Bring your own key
Users can store their own Gemini API key and pay their own way.
The interface
Screenshots go here.
Built out of
apps/web
Vue 3 with Pinia, vue-router and vue-i18n. IndexedDB via idb for local state, Zod for shared contracts.
apps/api
Fastify with helmet, cors, rate-limit and multipart. Drizzle over MySQL, Argon2 for passwords, jose for tokens.
packages/ocr
Receipt extraction, isolated from both the API and the web app so it can be tested on its own.
packages/shared
Zod schemas and uuidv7 ids, imported by every other workspace so the contract has one home.
A slice of the API surface
| /v1/receipts | Upload a photograph; answers 202 while extraction runs behind the response. |
|---|---|
| /v1/assistant/interpret | One sentence in, a structured transaction out. |
| /v1/accounts/:id/reconciliation | Statement reconciliation against the recorded ledger. |
| /v1/accounts/:id/balances | Balances per currency, which is why the home screen can add up. |
| /v1/auth/google/drive/callback | Drive connection, kept separate from sign-in. |
| /v1/categories | One level deep, by design. |