Несколько месяцев я писал здесь про принципы. Пора показать целиком то, о чём речь: на этой неделе DartWay выходит на
pub.dev, и я буду выкладывать его по пакету в день, с разбором каждого.
Сегодня — общая картина.
## Суть
Flutter-разработчик умеет делать фичи и экраны. Дальше начинается стена: сервер, база, миграции, эндпоинты, авторизация, права, реалтайм. Обычный ответ индустрии — «возьми Firebase/Supabase»: удобно, но чужая база, чужие модели, чужой язык и потолок ровно там, где начинается настоящая бизнес-логика.
DartWay отвечает иначе.
Единый декларативный слой данных от базы до виджета. На сервере фича описывается конфигом:
кто имеет право читать (
accessFilter), кто — писать (
allowSave), что считается валидным (
validateSave), что должно случиться в той же транзакции (
beforeSaveTransaction). Всё. Эндпоинтов не существует.
На клиенте эта же модель забирается одной строкой:
ref.watchModelList<Booking>() — типизированный живой список. Реалтайм-синхронизация, пагинация, фильтры, скелетные состояния загрузки — из коробки. Кто-то записал модель на сервере — виджет перестроился. Никаких сокетов руками, никаких инвалидаций кэша.
Фича целиком — от таблицы в базе до живого экрана — это примерно 40 строк конфига и виджет.
Формула:
Serverpod даёт тебе бэкенд. DartWay убирает необходимость его писать.## Структура: девять пакетов, три круга
Ядро (четыре пакета, версионируются вместе).Серверная половина — модуль Serverpod: generic CRUD для любой модели с реалтайм-подписками, декларативные конфиги доступа и валидации, беспарольная авторизация по телефону, файловое хранилище (S3/MinIO), алерты об ошибках. Клиентская половина — типизированный слой данных поверх этого:
watchModelList, сессии, переживающие перезапуск, обработка ошибок, которая отличает сетевой сбой от настоящей поломки.
Тулбокс приложения.Скелет, который есть у каждого приложения и который каждый раз пишут заново: запуск и сплэш, контракт отрисовки асинхронных состояний, защищённые действия (двойной тап не создаёт две записи, ошибка сама превращается в отчёт с контекстом), пайплайн уведомлений.
Тут же — принцип, за который я держусь:
фреймворк не поставляет дизайн-систему. Никаких
DwButton и
DwText. Дизайн-система — единственное, чем любой серьёзный проект в итоге владеет сам, и отдавать её зависимостью значит начать вечный спор про радиус скругления кнопки. UI-кит приезжает в твоё приложение исходником — и дальше он твой.
Обвязка.CLI (
dartway create — проект, который запускается, за считанные секунды), линты и чекер, которые машинно проверяют конвенции, опциональная интеграция с Telegram Mini Apps, мост в DartWay Studio.
## Три принципа, на которых всё держится
Фреймворк не владеет моделями приложения. Пользователь — это твой
UserProfile, в твоей базе, с твоими полями и ролями. Не «расширь наш UserInfo», не форк модуля. Это то, обо что разбиваются готовые батарейки: чужую модель не расширить, а форк тащится через каждое обновление.
Secure by default. Модель, для которой не описан доступ, не отдаётся никому. Не «открыто, пока не закрыл» — а «закрыто, пока не открыл». Для generic CRUD это единственный честный дефолт: забыть закрыть можно, забыть открыть — нельзя.
Архитектура, которую проверяет машина. Конвенции + линты + чекер + скиллы для ИИ-агентов. Это не украшение: агент, пишущий код в проекте с машинно-проверяемыми правилами, не разваливает его на третьей фиче. Ради этого всё и затевалось.
## Дальше
С завтрашнего дня выкладываю пакеты на
pub.dev и разбираю каждый: как устроен, зачем такой, где границы. Первым — серверное ядро: фича без единого написанного эндпоинта.
А
в субботу, 18 июля, в 14:00 МСК соберу на этом всём работающее приложение вживую — за 90 минут, с пустой папки: сервер, база, реалтайм, авторизация. Бесплатно, запись будет.