Коробочная CRM (Bitrix24, amoCRM) закрывает 60–70% типовых процессов, а на остальное упирается в ограничения платформы: свою логику воронки, нестандартные роли, глубокую интеграцию с учётом. Задача сделать CRM, которая закрывает недостающие процессы с учетом специфики бизнеса.
Собрал систему целиком — бэкенд, фронтенд, инфраструктуру, тесты, дизайн. Один ответственный за весь стек.
Архитектура — прагматичный DDD. Домен разбит на 6 ограниченных контекстов: Identity, Customer, Sales, Task, Analytics, Notification. Бизнес-логика живёт в rich-моделях Eloquent с Value Objects (Money, Email, PhoneNumber, PersonName), доступ к данным — через Repository (интерфейсы в слое Domain, реализации в Infrastructure), побочные эффекты (уведомления, индексация поиска, audit log) развязаны через Domain Events. Без ритуального event sourcing — стандартная персистентность плюс события там, где они реально нужны.
Рантайм — Laravel 11 на Octane (Swoole): приложение держится в памяти между запросами, 4 воркера + 6 task-воркеров. Это накладывает дисциплину — никаких синглтонов с мутабельным состоянием, иначе состояние утекает между запросами. Кэш многослойный: L1 в памяти Octane, L2 в Redis, инвалидация по тегам. Поиск — Meilisearch через Laravel Scout: мгновенные результаты, устойчивость к опечаткам, асинхронная переиндексация очередями. Кастомные поля клиентов — на JSONB с GIN-индексом, чтобы не плодить миграции под каждый бизнес. Real-time (изменения сделок, задач, уведомления) — Laravel Reverb по WebSocket. Авторизация — OAuth2 через Passport, права — 5 ролей на Spatie Permission, soft delete и audit log на всех сущностях.
Фронтенд — Vue 3 + TypeScript: серверное состояние на TanStack Query, клиентское на Pinia, интерфейс на shadcn-vue + Tailwind. Kanban сделок с drag&drop, merge-wizard контактов, дашборды на ApexCharts с PDF-экспортом, импорт/экспорт CSV/XLSX с маппингом полей и дедупликацией, командная палитра Cmd+K, i18n (ru/en), тёмная тема. Дизайн интерфейса довёл до продуктового вида через AI-агента (связка студии Open Design с Claude Code по MCP) — переписал визуальный слой по дизайн-системе, без правок бизнес-логики; отдельного дизайнера не привлекал.
Собрано в AI-first процессе: Claude Code как исполнитель внутри выстроенного контекста (спецификация, правила проекта, TDD — тесты вперёд кода), а архитектурные решения, ревью и ответственность — за мной. Это граница, которая отличает инженерию от вайб-кодинга. Весь стек в Docker, CI/CD на GitHub Actions.
В одиночку собран полный CRM-контур production-уровня: ~35 000 строк собственного кода (бэкенд + фронтенд + тесты), 6 ограниченных контекстов, 28 миграций. 1338 автотестов зелёные — 856 Pest (backend), 464 Vitest (frontend), 18 Playwright (E2E), писались вперёд кода. Функционал: контакты и компании, воронка сделок с Kanban, задачи с чеклистами и упоминаниями, аналитика с дашбордами и PDF, импорт/экспорт, полнотекстовый поиск, real-time, RBAC, audit log, две темы, два языка. Редизайн через AI-агента — 13 и 15 изменённых файлов фронта, ноль правок логики, все тесты зелёные: два разных интерфейса из одной кодовой базы.