The native mobile companion to Paperwork — Dutch bookkeeping for small businesses and the self-employed. Snap a receipt and on-device OCR pulls out the date, total and BTW (VAT); review your quarterly VAT filing risks on the go.
Website: paper-work.nl · Live app: app.paper-work.nl (login required) Get the app: App Store · Google Play
I designed and built Paperwork end to end — product, architecture, backend, web frontend and this native app — as part of my independent practice, Dev Artist. The companion web/API codebase is at paperwork-public.
Portfolio note. This is a public, read-only snapshot of a private production codebase, published as a work sample. It is source-available for viewing only — see LICENSE. Firebase config, signing material and customer data are not included.
- Receipt scanning — capture a receipt with the camera; on-device OCR extracts date, total and BTW (both 9% and 21% rates), tuned for real Dutch receipt layouts
- BTW (VAT) pre-check on mobile — view the latest quarterly filing-risk report, run a check on demand, and toggle which checks run and how you're notified
- Biometric authentication — Face ID / fingerprint login with a secure, opt-in flow
- Sync — captured receipts and their data flow to the Paperwork API
Receipts are scanned with the device camera and parsed on-device (@capacitor-community/image-to-text) — no image leaves the phone for the extraction step. The parser is tuned for real Dutch receipt formats, prioritising date detection (ISO and DD-MM-YYYY), total detection (totaal/total keywords), and 9% / 21% BTW amounts. The extracted fields are reviewed by the user before syncing to the Paperwork API.
The mobile half of Paperwork's agentic BTW pre-check: the app surfaces each quarter's findings (missing documents, VAT arithmetic issues, likely duplicates, and LLM-detected history anomalies) as a report card on the Taxes page, lets the user trigger a run on demand, and edits per-check and per-notification-channel preferences — wired against the live /api/btw-precheck contract. Findings carry a severity and Dutch copy, mapping cleanly onto Ionic's card/toggle patterns.
Design: specs/2026-07-04-btw-precheck/design.md
Opt-in Face ID / fingerprint login built as a loosely-coupled service + hook so the underlying plugin can be swapped without touching callers. Credentials are stored encrypted in Capacitor Preferences and cleared when biometrics are disabled; auth re-triggers on cold start, session timeout and app-resume, with password fallback always available.
- React 19 · TypeScript · Ionic React — cross-platform UI
- Capacitor — native iOS & Android, camera, biometrics, push
- Vite — build tooling
- Testing: Vitest · React Testing Library (unit/component) · Cypress (e2e)
- CI: GitHub Actions on every push and PR
Design specs live in specs/ and supporting notes in docs/. The app is fully typed, component- and unit-tested with Vitest + React Testing Library, end-to-end tested with Cypress, and gated by GitHub Actions CI. Native iOS and Android projects are included to show the full Capacitor integration.
Running & building locally (for reference — this is a view-only snapshot)
Prerequisites: Node 16+, npm 8+. iOS builds need Xcode 14+; Android needs Android Studio + SDK 33+.
npm install
npm run run:web # web dev
npm run run:ios # iOS (device/simulator)
npm run run:android # AndroidTests: npm run test.unit (Vitest) · npm run test.unit.coverage · npm run test.e2e (Cypress) · npm run typecheck · npm run lint
Android OCR / Firebase: the Android OCR path needs a Firebase google-services.json in android/app/ — create a Firebase project, add an Android app with package nl.paperwork.app, and drop in your own file (not committed).
Live on the App Store and Google Play, companion to paper-work.nl.
Built by Henry Cordes — devartist.nl · LinkedIn
Source-available for viewing and evaluation only. Not open source — see LICENSE.