Engineering case study · solo build

From Zero
to Eight.

One engineer. Five months. Eight integrated modules, an AI analysis layer, and a company now running on top of it.

Solo architect & engineer · live in production
~0
Staff reached
0
Live projects
0+
Tasks tracked
0
Modules

Every ERP covered the generic 80%.

None covered the 20% that mattered. Operations lived in spreadsheets, chat threads and standalone apps, with no single source of truth and no audit trail. So I built one from scratch.

GENERIC, ALREADY SOLVED
20%
what every ERP sellswhat the org actually needed

Eight modules. One source of truth.

Identity flows down. Everything converges on Project Management. Every event lands in one output layer.

Identity flows down from Employee Management into eight core modules centred on Project Management, then events and records flow out to a notification, calendar, logging, AI analysis and dashboard layer. GChat and LINE notifications are marked on the modules that emit them. Google OAuth · sign-in Employee Management identity · org · roles · global reference account lifecycle CRM clients · contacts Attendance leave · overtime Rental rooms · vehicles Project Management project → item → task → work log Meeting Record → task review/assign Announcements standalone Subscriptions standalone Quotation manpower · cost Aggregation & output notifications · calendar · logging · AI analysis · dashboard / snapshot
tap a chip to highlight · tap a box to trace links

Written Once.
Only Archived, Never Deleted.

Business data can change. Work logs cannot. The platform even managed its own development from day one.

An AI layer grounded in the company's own data.

A configurable LLM layer reads live Firestore data and returns structured analysis leadership can act on. One real weekly run:

0 tokens model GPT-4o · in 6,961 / out 822
cost ~NT$0.82 per analysis
Provider-agnostic
One interface across multiple LLM providers. Swap models without touching the product.
RAG + context engineering
Grounded in the org's own knowledge, summarized first to keep token cost near zero.
Versioned, never overwritten
Every run is stored as a tabbed version. Analysis history is itself immutable.

Five layers. Four govern the truth, one consumes it.

InterfaceReact PWA · dark / light tokens · offline-readable
Applicationpermission engine · Firestore transactions, all-or-nothing
DataFirestore · immutable logs · composite indexes
InfrastructureGoogle Cloud · Firebase Functions · Vercel · cron
Derived intelligenceAI analysis · dashboards · exports, write-once like everything above

Same role. Different data.

RBAC crossed with ABAC: a role hierarchy, then project, department and identity attributes on top. Two managers with the same role can see entirely different slices of the system.

MANAGER · DEPT A
MANAGER · DEPT B
CHAIRMAN CEO DIRECTOR MANAGER GENERAL / HR / FIN / OPS
The permission engine validates independently of Firestore security rules. Defense in depth.

Every ID reads itself. No joins required.

Project, item, task, work log, leave request — every entity carries a structured, human-readable ID. Once written, it never changes.

ProjectYYYYMMDD-PNN → 20260307-P01
Item…-PNN-INN → 20260307-P01-I01
Task…-PNN-INN-TNN → …-P01-I01-T01
Work LogYYMMDD-WLNNNN → 260328-WL0001
Leave RequestYYYYMMDD-TYPE-NNN → 20260310-OFF-001

Meeting users where they already are.

Four integration surfaces turn scattered conversations and calendars into tracked, assignable work.

Meeting → Task
Decisions captured in a meeting record link straight into the work pipeline — what's agreed and what's tracked never drift apart.
Voice → Transcript → Task
Recorded in one tap, transcribed via Vertex AI (Gemini 2.5 Flash), then dispatched into assignable tasks with no minutes typed by hand.
Calendar, full lifecycle
Google Calendar API manages create, update and delete with dynamic attendee sync, not just event creation.
Bots + absence-aware routing
GChat for office staff, LINE for field staff. Approvals auto-escalate when an approver is on leave or traveling.

A PWA, designed — not decorated.

Designed independently, informed by a background in graphic design. Visual consistency across every module — spacing, hierarchy, color, interaction — was a first-class requirement, not an afterthought.

Installable
Desktop and mobile, no app store required.
Responsive
Purpose-built layouts across mobile, tablet, desktop.
Dark & light mode
One color-token architecture, defined once, zero per-component overrides.
Offline-capable
Core reads work offline via service worker caching.

Fast where it counts. Untouched where it doesn't.

0
useMemo
expensive derived values
0
useCallback
only where a reference matters
0
React.memo
deliberately absent
0
virtualization
deferred until ~10k rows

Event-driven cache invalidation: reads sit near zero on a normal day. When someone edits, exactly one collection refreshes, on every client.

mock-data~2.3 MB
xlsx~1.1 MB
index, before+880 KB
production build · the two heaviest packages now load on demand
01 · write
A write lands in any collection
and bumps that collection's version number in one shared doc.
02 · broadcast
One document fans out
Every client holds exactly one listener, on that doc.
03 · invalidate
One key expires
Only the changed collection goes stale. The rest stays warm.
04 · refetch
The next read pays, once
A single collection re-reads, on every client.
05 · remember
Versions persist locally
A reload never re-invalidates data that is still fresh.
event-driven cache invalidation · a 180-day TTL that still updates in seconds
7 / 12 functions used
bulk data never touches the API · what remains multiplexes into 7 functions

The layer most frontend engineers never touch.

Shipping to a live organization meant owning the Google infrastructure end to end, not just writing frontend code.

Google Cloud ConsoleWorkspace AdminFirebase FunctionsVercel · Preview / ProdScheduled Cron JobsSecrets & Env Isolation

Designing for every role at once.

A staffer needs frictionless logging. A manager needs a cross-project view. Finance needs an audit trail. Same record, different definitions of "done" — shaped through UAT with staff before every launch, not upfront design alone.

"I can't believe an architecture this large was actually finished."
The CEO, at the first full demo

Leadership greenlit continued development on the spot. The leave module went company-wide within a week; a parallel scheduling prototype was folded into this platform's roadmap. It passed the only validation that matters: the people closest to the alternative chose to build on this one.

Everything under the hood.

TypeScriptReactViteTailwind CSSPWA / Service WorkerFramer MotionFirestoreFirebase AuthFirestore TransactionsEvent-Driven Cache InvalidationFirebase FunctionsVercelGoogle OAuthGoogle Calendar APIVertex AIGemini 2.5 FlashGChat BotLINE BotRBAC + ABACLLM API · Multi-ProviderRAGContext EngineeringToken OptimizationPDF / Excel Export TypeScriptReactViteTailwind CSSPWA / Service WorkerFramer MotionFirestoreFirebase AuthFirestore TransactionsEvent-Driven Cache InvalidationFirebase FunctionsVercelGoogle OAuthGoogle Calendar APIVertex AIGemini 2.5 FlashGChat BotLINE BotRBAC + ABACLLM API · Multi-ProviderRAGContext EngineeringToken OptimizationPDF / Excel Export