Accounting System
Internal accounting product: org-scoped Next.js UI, imports, reporting, and Go services on Postgres with Redis for background jobs.
Stack
Frontend
- Next.js
- React
- TypeScript
- Node.js
- Tailwind CSS
- MUI
- Material React Table (MRT)
- Recharts
- Claude
- Cursor
- Claude Design
- Google Stitch
Backend
- Go
- chi
- PostgreSQL
- Redis
- Excelize
- gorilla/websocket
- Testcontainers
- Newman
- Claude
- Cursor
What was my role?
I led the fullstack thread from operator workflows in the browser through service contracts and persistence: org-scoped screens, import orchestration, ledger reads, and reporting stakeholders could trust during closes—not a thin UI layer on someone else’s opaque API.
Practically that meant shaping the Next.js workspace, pairing Postgres modeling with Go HTTP handlers, and keeping Redis-backed jobs visible in-product so failures were explained instead of buried in logs.
Situation
The client's financial operators still stitched together spreadsheets, one-off exports, and several older tools whenever they needed balances scoped to an org or a clean period cut.
There was no single workspace that enforced tenancy end-to-end, surfaced import problems in plain language, and kept leadership views inside the same audited path.
Task
Ship a 2026 internal accounting product with an operator-first experience: bulk CSV/XLS intake, org-scoped authorization, persisted ledgers, and charts that stay tied to the same source of truth through month-end.
Action
On the client I built a Next.js workspace with TypeScript, MUI tables (including MRT), Recharts summaries, and Tailwind-driven layout tokens so dense finance screens stayed readable.
On the server I implemented Go services behind chi routers, PostgreSQL for core entities and audit-friendly reads, Redis where async work and fan-out helped, Excelize-driven parsing for workbook-shaped uploads, and gorilla/websocket for live job feedback during long imports.
Across the stack I wired Vitest on the SPA side, service tests with Testcontainers, and Newman checks so regressions were caught before they reached operators.
Result
The company's team could load, validate, and reconcile work inside one product instead of re-exporting everything for every question, while engineering kept a testable full path from browser to database.
Latency-sensitive aggregation stayed in Go and Postgres instead of the browser, org boundaries held consistently, and the roadmap could grow new reporting without rewriting the ingestion story each time.