The travel agency migration that was mid-flight in Day 9 has landed. The developer stepped back. The client built the second half alone: portal, AI, hotels, proposals, email relay. 596 more commits. 65 migrations. 50 kanban tasks — almost all written by the client. The real deliverable: a system the client could extend without the developer.
The Travel Agency Ships
Day 9 ended with a warning. "This post is a progress marker, not a conclusion." Testing was ahead. Data migration was ahead. The FileMaker production database still ran the business.
It does not anymore.
The application is live. The data is migrated. Users are on the system. And the developer is hands off.
What happened between
Day 9 captured the build: 528 commits, 14 feature modules, 5 architecture reviews, 31,836 lines of code. The architecture cleanup was complete. The monoliths were broken into domain files. The duplication was extracted into shared modules. Twenty database migrations defined the schema.
That was the handoff point.
The testing phase caught edge cases that clean code alone cannot surface. Budget math that matched the spec but not the twenty-year-old FileMaker calculations. Tiered pricing that broke on cloned itineraries with historical rate overrides. Virtual scroll that handled 500 activities but choked on 800. Each fix was small. None were architectural. The architecture had already been proven by five reviews.
The data migration pipeline ran against the production DDR. The migrate-filemaker toolkit — the same one I expanded during this project, documented in Day 10 — handled the schema translation. The ETL mapped legacy field names to the new column structure, resolved edge cases in two decades of trip records, and verified referential integrity across imported foreign keys. A fresh D1 database received the imported data.
Then the developer stepped back.
The client built the second half of the project alone.
A client portal: login, trip selector, itinerary view, messaging, document access, password reset. Eight portal views, new auth middleware separating staff from client sessions. Thirty-one kanban tasks, from database schema through API routes to frontend pages.
An AI layer: spell check, activity description generation, voice command routing, itinerary search. Cloudflare AI Gateway with usage logging and caching. Eight library files, three API routes, two frontend panels.
Hotels graduated from a flat FileMaker table to a full reservation system: rooming lists, booking manager, cancellation deadlines, terminal status tracking, audit logging. Five database migrations, six kanban tasks, a complete page overhaul.
A proposal system with PDF generation. An email relay worker that processes inbound replies. Archive ingest with full-text search over attachments. A feedback module with screenshots.
The database hit 65 migrations. The kanban board shows 50 tasks completed and 9 more in the inbox. The commit count crossed 1,100. The client wrote almost all of them.
Clean cutover. No parallel operation. The client's team trained on the new system while still operating the old one, then switched.
The retainer runs four months, recurring. Month two just processed.
What this proves
A FileMaker migration is not done when the code compiles. It is done when the client no longer needs the developer.
The migrate-filemaker toolkit handled the DDR analysis at scale. Before this project, it was tested on sample DDRs. After, it has ingested a production FileMaker solution with twenty-five years of layered development, produced a complete migration plan, and that plan was executed — first by a two-person team, then by the client alone.
The Cloudflare stack — D1, Hono, Vue 3, PrimeVue, Vite — eliminated infrastructure decisions. No servers. No containers. Code ships to the edge. When the project expanded from internal tool to client-facing portal, the same stack absorbed the new surface without architectural changes. The client navigated this without the developer in the room.
The architecture review loop — five audits across five days, each re-verifying type checks and builds — caught sprawl before it became debt. The developer built the scaffold and enforced the boundaries. The client built features at velocity inside those boundaries. The next 596 commits did not produce new monoliths. The division of labor held because the architecture did.
The project moved from intake to live production in under two months. The second half — portal, AI, hotels, proposals, email relay, feedback, archive — was built by the client on the foundation the developer laid.
The real deliverable was not the code. It was a system the client could extend without the developer.
The boat sailed. The client is at the helm.

