In production

The portal a car repair business runs its day on

Quotes, work orders, invoices, customers and vehicles, planning, a shared inbox, accounting and bank connections in one system. Used at the front desk, in the workshop and by the owner.

Role
Lead developer
Period
Since August 2024
Stack
TypeScript, Next.js, React, tRPC, Prisma, MySQL, Docker, GitHub Actions
Status
In production
InboxQuoteWork orderInvoiceBank matchingAccountingmail and WhatsApp, with AI draftsmatched automatically, never booked twiceMechanics clock in with a signed NFC tag.21 background jobs behind a lock: never twice,not even during a release.
A sketch instead of screens: the client stays anonymous.

The problem

The business worked with separate spreadsheets and separate back-office tools. Quotes, work orders, payments and customer contact were not connected to each other.

What I built

One system, from a quote with its vehicle, through approval and work order, to the invoice and the matching bank transaction. Mechanics clock in with an NFC tag on the wall and work from a tablet: uploading photos, completing tasks.

Mail and WhatsApp arrive in one inbox, and the accounting is matched to the bank accounts and posted automatically.

What matters technically

  1. Releases nobody notices

    A new version starts on the company's own hardware next to the old one and only takes over once the health check reports exactly that version. A rollback skips the schema step, and the deploy script has its own test suite.

  2. Background jobs that never run twice

    During a release two versions run side by side. Every job where a double run does harm, such as the bank sync and the bookings, therefore takes a lock in the database first: 21 jobs in total.

  3. Clocking in with signed NFC tags

    Mechanics tap an NFC tag on the wall. The server checks the cryptographic signature the chip produces on every tap, so a valid tap can only come from the real tag.

  4. A shared inbox that keeps up

    A separate worker keeps the mail connections open live and feeds the same synchronisation as the scheduled run and the manual button, so they never drift apart. Mail passwords are stored encrypted in the database.

  5. The AI proposes, the server decides

    In the inbox an AI assistant prepares drafts and quote proposals. The model reads and chooses; the server checks every price and every licence plate again against the source.

  6. Banking and accounting without double bookings

    Transactions from four payment sources are normalised and matched to invoices. Bookings go through a scheduled run with a check up front and a fingerprint per source, so nothing is booked twice.

  7. An AI assistant that works on the user's behalf

    Through its own OAuth connection an AI assistant works in the portal with the user's rights, limited per role and scope. Every change is recorded with its before and after state and can be undone in one step.

Measured

Counted in the repository, files in git only.

first commit
17-08-2024
pages
64
data models in the schema
158
test files
1,377
background jobs with a database lock
21
How measured
git log --reverse --format='%ad' --date=short | head -1
git ls-files 'app/**/page.tsx' | wc -l
grep -c '^model ' prisma/schema.prisma
git ls-files | grep -E '\.(test|spec)\.(ts|tsx)$' | wc -l
count of JOB_LOCKS in app/lib/jobLock.ts

Measured on 27-10-2026.

Need something similar, or a team that builds systems like this?

info@bitvire.com