The project is under NDA, so below is strictly the engineering side without the UI, client details, or business domain.
This is a full-featured CRM built as an outsourced project by a team of two—a backend developer and myself, with the entire frontend on me. Directories with many-to-many relationships, an Excel-style drag-select permissions matrix, contract generation in `.docx` and `.pdf` based on stored records, a Ctrl+K command palette with configurable shortcuts, a report parser, an activity log, a dashboard with charts, token-based authentication with a role-based model, dark mode, and URL-synced table state where filters and sorting persist across page reloads and link sharing.
For the first six months, the project barely made progress. The stack was React with Inertia, which made the frontend entirely dependent on the backend, and there was no fixed API contract to rely on—requirements were being refined through ongoing discussions within the team and with the client. Almost everything had to be redone more than once. As a result, to keep moving forward, we decoupled the project into an SPA and a standalone API, allowing frontend development to proceed at its own pace.
The contract continued to change anyway: at one point, it was rewritten three times in two weeks. Because of this, mapping lives in a dedicated DTO layer that I assembled based on routes, database schema, and request logs. Alongside it runs a FastAPI mock server that mirrors the real API, including its inconsistencies, so frontend development never stalls waiting for a live environment. There was no backend pagination, so pagination and sorting were implemented on the client, switchable to server-side mode via a single flag once backend support is added.
I covered the adaptation layer—which normalizes unstable responses into reliable structures the frontend can depend on—with unit tests, and I keep the codebase under strict type-checking and linting.