Featured
Freelance · NDA · admin panel from scratch, Vue 3 + Laravel2025

CRM Platform

NDA TypeScriptPiniaTanStack TableTailwindLaravel APIFastAPIVitest

This one's under NDA, so what follows is the engineering side only — no interface, no business specifics, no client name.

The frontend is an SPA admin panel built from scratch: Vue 3, TypeScript in strict mode, Pinia for state, TanStack Table for data grids, shadcn-vue and Tailwind for the UI layer, talking to a Laravel REST API. Functionally, it covers CRUD reference tables with many-to-many relations, document generation from stored records, a trash flow with soft delete and undo instead of confirm dialogs, token-based auth with a role model, a dark theme, and table state synced to the URL — filters and sort survive a page reload or a shared link.

The harder part was the backend itself: not mine to fix, and its contract kept moving under development. I used an LLM against the backend's own codebase — routes, DB schema, request logs, informal changelog notes — to keep TypeScript types in sync fast whenever something shifted, and to reprioritize what to build next as the real shape of the API became clear. One concrete constraint: the backend has no pagination. I built client-side pagination and sorting that can flip to server mode behind a single flag, so the day the backend adds it, the frontend doesn't need a rewrite.

To stop frontend work from blocking on a live staging environment, I wrote a mock backend in FastAPI that reproduces the real API's exact shape — including its inconsistencies — for isolated, post-MVP development. Everything got re-validated against the live system afterward. The trickiest logic (the layer that adapts the backend's inconsistent response shapes into something the frontend can trust) is covered by unit tests, and the whole thing runs under strict typechecking and linting.

Since you're here, let's connect.

Fonts
Golos Text · Onest · JetBrains Mono
Built with
Nuxt · Vue · TypeScript
CMS
Sanity
Analytics
Umami — cookie-free
Language
EN · RU
Feed
RSS