CRM-платформа
Проект под NDA, поэтому ниже — только инженерная часть: без интерфейса, без деталей бизнеса, без имени клиента.
Фронтенд — SPA-админка с нуля: Vue 3, TypeScript в strict-режиме, Pinia для состояния, TanStack Table для таблиц, shadcn-vue и Tailwind для UI-слоя, поверх Laravel REST API. Функционально — справочники с CRUD и связями многие-ко-многим, генерация документов по хранимым записям, корзина с мягким удалением и undo вместо подтверждающих модалок, токенная аутентификация с ролевой моделью, тёмная тема и синхронизация состояния таблиц с URL — фильтры и сортировка переживают перезагрузку страницы или шаринг ссылки.
Сложнее всего было с самим бэкендом — не мой код, а его контракт постоянно менялся прямо по ходу разработки. Использовал LLM поверх кодовой базы бэкенда — роуты, схема БД, логи запросов, неформальные заметки об изменениях — чтобы быстро синхронизировать TypeScript-типы при каждом сдвиге и на лету пересобирать приоритеты, по мере того как прояснялась реальная форма API. Конкретное ограничение: у бэкенда нет пагинации. Сделал клиентскую пагинацию и сортировку с переключением на серверный режим одним флагом — в день, когда бэкенд её добавит, фронт переписывать не придётся.
Чтобы фронтенд-работа не простаивала в ожидании живого стенда, написал mock-бэкенд на FastAPI, воспроизводящий реальный API один в один — включая его несостыковки — для изолированной разработки на post-MVP этапе. Всё потом сверялось с живой системой заново. Самая хрупкая логика (слой, который приводит нестабильные ответы бэкенда к тому, чему фронт может доверять) покрыта unit-тестами, всё работает под strict-тайпчеком и линтерами.