Возможности
Всё, что есть в Seed, и чего пока нет
Seed — бесплатный SaaS-стартер под лицензией MIT: вход по почте, через Google и GitHub, passkeys, magic links, гостевые аккаунты, 2FA, группы с ролями, оплата за участника через Stripe, обновления в реальном времени, офлайн-приложение, админ-панель, мониторинг и ежедневные зашифрованные бэкапы по желанию. Каждый раздел ниже ведёт к своему коду.
Автор: Anton ShubinОбновлено
Seed ещё в работе и создаётся публично. То, что ещё не сделано, помечено «Ещё не сделано» рядом с утверждением, которое оно ограничивает, со ссылкой на issue, если он открыт.
Уже решено за вас
SaaS-стартер, где группы и оплата уже подключены
Аккаунты, группы и деньги: то, что нужно каждому продукту до первой фичи, и то, в чём проще всего ошибиться.
Работает сегодняПроверено в CI. Вход через Google и GitHub и Stripe требуют ваших собственных ключей, поэтому в демо они выключены.
Аккаунты
Готовый вход
Люди регистрируются по почте и паролю, подтверждают адрес кодом из письма, сбрасывают забытый пароль, продолжают через Google или GitHub, получают по почте ссылку для входа, которая заодно регистрирует, входят по passkey или сначала пробуют приложение в гостевом аккаунте и добавляют способ входа позже. Приложение-аутентификатор добавляет двухфакторную аутентификацию (2FA). Люди видят каждое устройство, где выполнен вход, и могут выйти на остальных. Смена способа входа требует подтверждения и отправляет письмо.
- Пароли хешируются PBKDF2-SHA-256 через Web Crypto, по умолчанию 600 000 раундов
- Подписанные сессионные cookie и журнал аудита каждого события входа
- Личные API-токены, хранятся только как хеши с ключом
- Passkeys: хранится только открытый ключ, и каждый вызов входа срабатывает один раз
- Magic links: одна ссылка и входит, и регистрирует, работает один раз в течение 15 минут и хранится только как хеш
- Гостевые аккаунты (анонимный вход): посетитель начинает в один клик без способа входа, а потом добавляет к тому же аккаунту почту и пароль, Google, GitHub или passkey
- Неверные пароли считаются по имени для входа, с короткой блокировкой, с любого сетевого адреса

Группы
Группы с ролями с первой минуты
Каждый аккаунт получает личную группу при регистрации. Люди создают общие группы, приглашают других, дают им роли от читателя до владельца и передают владение в один шаг. Удалённую группу можно вернуть в течение 30 дней, и у каждой группы есть журнал действий.
- Группа — единственная граница между арендаторами: личные и общие данные проходят одну и ту же проверку
- Приложение, его код и этот сайт везде называют её группой
- Нет второй модели прав, которую нужно синхронизировать с первой
- Приглашения, смена ролей и передача владения, у каждого свои тесты

Обзор
Обзор для каждой группы
Ключевые цифры и график за любой период. Каждый сам скрывает и переставляет виджеты, и раскладка следует за ним на другие устройства.
- Каждая цифра сравнивается с предыдущим периодом, без оценки цветом
- Только количества: ни текста заметок, ни рейтинга людей
- Каждый виджет загружается, падает и повторяет попытку сам по себе
- Новый агрегат добавляет свои виджеты, и админ-панель тоже их показывает
Деньги
Оплата за участника через Stripe
Люди видят таблицу цен, бесплатный тариф с лимитами и 14-дневный пробный период платного тарифа. Владелец видит, сколько стоит ещё один участник, до того как его пригласить, и получает понятное уведомление с датой, если карта не прошла.
- Stripe Checkout и клиентский портал; вебхук — единственный источник данных о тарифе
- Количество в подписке следует за числом участников
- Отсрочка после неудачного платежа, по умолчанию 7 дней
- Лимиты тарифа проверяются на сервере, а не только в приложении
- Тарифы хранятся в одном файле каталога; страница цен читает его
- Платёжные провайдеры, кроме Stripe

Конфиденциальность
Аккаунты, из которых можно уйти
Люди скачивают копию своих данных и удаляют аккаунт в профиле, а на раздумья у них 7 дней. Прочитанные уведомления удаляются через 90 дней.
- «Скачать мои данные»: ZIP с файлами JSON и CSV, готовится в фоне и хранится 7 дней
- Удаление ждёт 7 дней; повторный вход его отменяет
- Ночная уборка прочитанных уведомлений, просроченных приглашений и старых событий аудита
Экспорт
Ваши данные уходят вместе с вами
Экспортируйте любую группу в открытый JSON-файл и импортируйте его позже как новую группу. Исходная группа никогда не перезаписывается.
- Экспортирует владелец; импортировать может любой, кому можно создавать группы
- Весь файл проверяется до того, как что-то будет записано, а затем импортируется за один шаг
- Каждая заметка и тег получают новый id, поэтому импорт никогда не конфликтует с тем, что уже есть
- Каждый агрегат регистрирует свою часть файла
Языки
Шесть языков с самого начала
Приложение, админ-панель и этот сайт говорят на языках: английский, русский, испанский, немецкий, бразильский португальский и арабский. Каждый выбирает язык в приложении, и он сохраняется вместе с аккаунтом. У каждой страницы этого сайта свой адрес на каждом языке.
- Один JSON-каталог на язык; тест называет каждое отсутствующее или устаревшее сообщение
- Множественное число, числа и даты через встроенный в платформу Intl, без i18n-библиотеки
- Ссылки hreflang на каждой странице сайта и sitemap, в котором есть каждый язык
- Арабские страницы читаются справа налево
- Письма на языке читателя (issue #277)
- Вёрстка справа налево, доделанная на каждом экране (issue #215)
Готово, когда понадобится
Реальное время, офлайн и фоновая работа
То, что большинство стартеров пропускают, потому что это сложно: живые обновления, приложение, которое работает без сети, и работа, которая не должна потеряться.
Работает сегодняОфлайн-запись работает для заметок и тегов; любой другой список открывается офлайн с тем, что показывал в последний раз.
Реальное время
Изменения видны без перезагрузки
Изменение участника появляется в каждой открытой вкладке группы, а ноутбук, проснувшись, догоняет всё, что пропустил.
- Обычный WebSocket, с порядковым номером у каждого изменения
- Вкладка, снова показанная после сна, переподключается и подтягивает пропущенное
- Реальное время можно выключить: тогда приложение опрашивает сервер по таймеру и работает так же


Офлайн
Приложение, которое открывается без сети
Приложение устанавливается как нативное, открывается без сети и отправляет изменения из очереди, когда сеть возвращается. Устаревшее изменение показывается как конфликт, который нужно решить, а не как тихая перезапись.
- Копия каждого списка в IndexedDB и очередь записи с ключами идемпотентности
- «Оставить моё» или «Взять с сервера» для каждого конфликта
- Выключается одной настройкой или убирается удалением одной папки по готовому списку шагов

Клавиатура
Горячие клавиши в приложении и админ-панели
Нажмите ?, чтобы увидеть все сочетания. N добавляет заметку с любой страницы, не уходя с неё, а G и затем буква открывают раздел. Пока вы печатаете в поле, клавиши не мешают.
- Ctrl K (⌘K на Mac) или / открывает поиск
- Один список на приложение назначает клавиши и заполняет окно ?, поэтому там никогда нет клавиши, которая ничего не делает
- Однобуквенные сочетания можно выключить на устройстве; Ctrl K и Escape продолжают работать
- В админ-панели G и затем буква открывают каждый модуль
Уведомления
Уведомления в приложении, на телефоне, на компьютере и в Telegram
Люди получают уведомление, когда их приглашают, дают новую роль или передают группу: в приложении, веб-пушем на телефон или компьютер и в Telegram, если они его подключат.
- Веб-пуш с вашими собственными ключами, которые создаёт одна задача: deno task vapid-key:create
- Счётчик непрочитанного в приложении и «Отметить всё как прочитанное»
- Пуш-подписка каждого устройства видна в профиле
- Бот в Telegram, выключен, пока вы не зададите его токен: подключается одноразовым кодом, а свои команды продукта добавляются в одном файле

Фоновая работа
Работа, которая переживёт сбой
Письма и уведомления уходят, даже если сервер перезапустится на полпути, потому что работа сохраняется до того, как выполнена. Ваши собственные задачи запускаются сразу, позже или по расписанию.
- Каждая команда записывает своё событие в той же транзакции базы данных, что и изменение
- Worker разбирает этот outbox и отправляет письма, пуши и живые обновления
- Задача — это одно определение: имя, обработчик и, если она повторяется, расписание
- Неудачная попытка повторяется со всё большими паузами; операторы видят каждый запуск в админке
Ваш продукт
Добавьте фичу, скопировав готовую
Заметки — законченная фича на каждом уровне: база данных, API, экран, офлайн и тесты. Новая фича копирует их файл за файлом по списку, где каждый файл назван по порядку.
- Одна форма для каждой фичи, поэтому код легко найти
- У каждого уровня свои тесты, которые копируются вместе с ним
- Каждый id — упорядоченный по времени UUID (версия 7)
Эксплуатация
Запускайте, наблюдайте, поддерживайте пользователей
Один арендованный сервер, инструменты, чтобы видеть, что он делает, и раздел, где ваши операторы помогают людям, которые пользуются продуктом.
Работает сегодняКаждый модуль ниже доступен уже сегодня. Что ещё не сделано, указано под каждым.
Поддержка
Админ-панель для ваших операторов
Ваши операторы находят человека по имени или адресу и видят его способы входа, сеансы, группы и историю. Там же они управляют группами, возвращают платёж, следят за подписчиками рассылки, видят каждую фоновую задачу, перезапускают упавшую и проверяют состояние системы. Посмотреть за 59 секунд.
- Отдельное приложение на своём хосте, со своей сессионной cookie
- Девять модулей, от дашборда до API-токенов
- Рискованные действия требуют подтверждения, и каждое действие записывается в журнал аудита
- Вход от имени человека, чтобы видеть то же, что он
Деплой
Один сервер, одна команда
Seed работает на любом арендованном Linux-сервере, с Docker Compose и для разработки, и для продакшена. Несколько продуктов могут делить один сервер.
- Traefik спереди, с автоматическими сертификатами
- Postgres и Valkey рядом с приложениями
- Garage, файловое хранилище S3: в нём заметки хранят изображения и PDF, а люди — фото профиля; загрузка идёт по подписанным ссылкам с проверкой по байтам. Фото, включая HEIC, превращается в небольшие варианты AVIF и WebP без геопозиции и других метаданных
- VictoriaMetrics, VictoriaLogs и Grafana, с оповещениями
- Ежедневный зашифрованный бэкап базы через restic по желанию и описанное восстановление
- Релизные образы публикуются из CI, когда вы пушите тег версии
- Traefik
- Postgres
- Valkey
- VictoriaMetrics
- VictoriaLogs
- Grafana
- Alertmanager
- Garage file store
- restic backups
Сайт
Публичный сайт, который можно доработать
Этот сайт: быстрый, рендерится на сервере и работает с выключенным JavaScript, с ценами, юридическими страницами, блогом и рассылкой.
- Fresh на сервере; каждое действие — настоящая ссылка или форма
- Цены берутся из каталога тарифов приложения
- Рассылка с двойным подтверждением и отпиской в один клик
- Блог, который пишется в админ-панели, с темами, RSS-лентой и структурированными данными статьи
- Контакты, заданные в админ-панели, показываются в подвале и в структурированных данных
- Необязательный каталог для магазина, который редактируется в админ-панели: товары с фото, цветами, размерами, таблицей размеров и распроданными размерами на каждом языке, на котором вы продаёте, с короткой ссылкой для отслеживания на каждый товар и место, где вы ею делитесь
- sitemap.xml, robots.txt, канонические ссылки и картинки Open Graph
- Необязательная аналитика без cookie в вашем собственном Umami, с событием на каждый призыв к действию
- Каждая страница на шести языках, у каждой свой адрес и ссылки hreflang; юридические страницы остаются на английском
Качество
Проверено там, где это важно
Подсчитано 16 октября 2026 года: 34 набора браузерных тестов для приложения, плюс модульные и экранные тесты, всё запускается в CI. Каждое изменение проходит через пул-реквест и ревью, прежде чем его вольют.
- Браузерные тесты на Playwright против настоящих API и базы данных
- Модульные и экранные тесты рядом с кодом, который они проверяют
- Интеграционные тесты на Postgres
Вопросы
Умеет ли Seed это?
Можно ли запустить Seed на Vercel или в serverless-функциях?
Нет. Seed работает как долгоживущие контейнеры под Docker Compose на одном арендованном Linux-сервере, потому что API держит открытыми WebSocket-соединения, а worker разбирает очередь.
Можно ли запустить Seed на Node.js или Bun?
Сегодня нет. Серверы Seed работают на Deno 2 в Docker, а его задачи и тесты используют Deno. Код построен на веб-стандартах, таких как fetch, Request и Web Crypto.
Может ли Seed работать с другой базой данных, не Postgres?
Нет. Seed построен на Postgres: его миграции, запросы и интеграционные тесты рассчитаны на него.
Можно ли выпустить Seed как мобильное или десктопное приложение?
Пока не как приложение в магазине. Сегодня веб-приложение устанавливается из браузера на телефоны и компьютеры и открывается без сети; приложения для Android и десктопа в планах.
Посмотрите в работе за минуту
Демо — это то приложение, которое вы получаете в первый же день. Откройте его без регистрации и начните в группах, полных примеров заметок.

