Naholosoft · Portfolio
The work
is the résumé.
Naholosoft. A B2B back office that runs a real business every day — planned, built, and operated end to end, solo.
Every stage — planning, design, implementation, deployment, operations — was driven by directing an AI coding agent in plain language: “vibe coding.” The AI wrote the code; every decision about what to build and how, and every check that it was right, was mine.
A B2B back office for an imported-fabric distributor. It binds the entire cycle of the fabric trade — order intake, inventory, pricing, invoice issuance, bank-deposit reconciliation, and sales analytics — into one system that runs a real business every day.
What I did
Not a single line of code by hand. Instead I defined the requirements, the data model, the screens, the pricing policy, and the edge cases in plain language, and directed the AI at every step. I read and verified the generated code, and re-steered it when it was wrong — hundreds of times. What to build, how it should behave, whether the data stays consistent — every decision and the responsibility were mine. I also chose and directed the stack: Next.js 16, React 19, TypeScript, Prisma 7, PostgreSQL (Neon), NextAuth v5, deployed on Vercel.
The live demo is a read-only environment filled with fictional data — sign in with demo / demo2026 and click around freely. The real client instance holds actual sales and inventory data and is kept private.
Not “the AI did it all.” Instead of typing code, I worked by driving the whole system end to end.
-
I write intent, not code
I describe the screens, rules, data model, and edge cases precisely in plain language and hand them to the AI. Good output comes from clear definitions — and the definitions were my job.
-
A human stays at the wheel
I read and verify every change the AI makes, then re-steer when it's wrong. Architecture, domain judgment, what to accept and what to throw away — that's the human's part. So is the final responsibility.
-
Domain knowledge is the skill
Because I understood a messy business like fabric distribution first-hand, I could direct the AI precisely and tell whether the result was right. You can't direct, or verify, what you don't understand.
-
Verified by integrity
The more code the AI writes, the harder I check it. Unit tests, an audit log, and 200+ integrity scripts continuously verify that money and inventory data never drift.
-
So it's fast
657 commits and 70 screens to production in about two months. When a human and an AI run together, the distance between a decision and its implementation almost disappears.
The AI was a fast, tireless pair of hands; direction, judgment, and responsibility were mine. This portfolio site and the live demo were built the same way.
The hardest parts of the system — which I defined and drove the AI to solve end to end.
-
Three-tier promotion pricing engine
Resolves a price from customer-specific promo, to a fabric's default promo, to list price — handling per-brand eligibility, expiry dates, season pinning, a branch inheriting its head office's policy, and excluding pre-cutover orders, all under one consistent rule.
-
Automatic bank-deposit reconciliation engine
Links bank deposits to order payments through a state machine: a learned alias that maps depositor names to customers, idempotent re-import keyed on deposit content (date, amount, depositor), and grouping of unnamed split deposits by date.
-
Audit-grade accounting
Freezes the cost and FX rate at the moment of each order, so past profit doesn't shift when the head office changes prices. Receivables are always computed as derived sums, and unreliable legacy data is excluded from P&L.
-
Invoice & statement generation
Produces both Chromium-rendered PDFs and ExcelJS-formatted output, with Korean and English print views, monthly / carryover / consolidated issuance, and an amend-and-void history chain.
-
Delivery route optimization
Geocodes delivery addresses with Kakao, dedupes them, then optimizes the visiting order with a TSP solver on the mobile delivery screen.
-
Working within serverless limits
Sidesteps Neon's short transaction limit by splitting work into smaller transactions, and renders PDFs reliably by separating Chromium into a runtime layer that stays under Vercel's function size cap.
Because real money and inventory ride on it, data correctness is verified continuously — with 53 test files, an audit log, soft-void (logical delete), and 200+ integrity-check scripts.
Every layer needed to take a single product all the way — handled by directing the AI.
| Frontend | Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS v4, shadcn/ui · Radix · Base UI, TanStack Table, charts I designed |
|---|---|
| Backend · Data | Server Actions, Prisma 7, PostgreSQL (Neon serverless), NextAuth v5 (role-based access), zod validation, raw SQL aggregation |
| Infra · Output | Vercel (serverless · cron), Vercel Blob, Puppeteer · Chromium PDF rendering, basePath operations |
| Integrations · Mobile | 17Track shipment tracking, Kakao Local geocoding, Excel (ExcelJS · SheetJS) I/O, Android, on-device OCR |
| Quality · Ops | Vitest unit tests, audit logging, Korean/English i18n, data-integrity scripts |
An Android business-card scanner where all processing finishes on the device. Card data never leaves the phone; it offers multilingual OCR and optional Google Contacts sync. Privacy-first by design — and built the same vibe-coding way, now live on Google Play.
See the BizCard product page →Open to hiring, freelance collaboration, and custom business-software inquiries. The live demo is right above, and the full commit history and code — plus how I directed the AI (my workflow) — are available on request. The person who built it reads and replies.
support@naholosoft.com