Перейти к содержимому

Возможности

Всё, что есть в 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
  • Неверные пароли считаются по имени для входа, с короткой блокировкой, с любого сетевого адреса
Читать код входа
Страница безопасности профиля: способы входа, двухфакторная аутентификация (2FA) и открытые сеансы.

Группы

Группы с ролями с первой минуты

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

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

Обзор

Обзор для каждой группы

Ключевые цифры и график за любой период. Каждый сам скрывает и переставляет виджеты, и раскладка следует за ним на другие устройства.

  • Каждая цифра сравнивается с предыдущим периодом, без оценки цветом
  • Только количества: ни текста заметок, ни рейтинга людей
  • Каждый виджет загружается, падает и повторяет попытку сам по себе
  • Новый агрегат добавляет свои виджеты, и админ-панель тоже их показывает
Читать виджеты обзора

Деньги

Оплата за участника через Stripe

Люди видят таблицу цен, бесплатный тариф с лимитами и 14-дневный пробный период платного тарифа. Владелец видит, сколько стоит ещё один участник, до того как его пригласить, и получает понятное уведомление с датой, если карта не прошла.

  • Stripe Checkout и клиентский портал; вебхук — единственный источник данных о тарифе
  • Количество в подписке следует за числом участников
  • Отсрочка после неудачного платежа, по умолчанию 7 дней
  • Лимиты тарифа проверяются на сервере, а не только в приложении
  • Тарифы хранятся в одном файле каталога; страница цен читает его
Ещё не сделано
  • Платёжные провайдеры, кроме Stripe
Читать docs/billing.md
Вкладка тарифа и оплаты группы-примера, по примерным ценам демо: тариф Pro с датой продления, 36,00 € в месяц за 4 участников по 9,00 € каждый, включая владельца, с кнопками смены карты, просмотра счетов и отмены тарифа.

Конфиденциальность

Аккаунты, из которых можно уйти

Люди скачивают копию своих данных и удаляют аккаунт в профиле, а на раздумья у них 7 дней. Прочитанные уведомления удаляются через 90 дней.

  • «Скачать мои данные»: ZIP с файлами JSON и CSV, готовится в фоне и хранится 7 дней
  • Удаление ждёт 7 дней; повторный вход его отменяет
  • Ночная уборка прочитанных уведомлений, просроченных приглашений и старых событий аудита
Читать код удаления аккаунта

Экспорт

Ваши данные уходят вместе с вами

Экспортируйте любую группу в открытый JSON-файл и импортируйте его позже как новую группу. Исходная группа никогда не перезаписывается.

  • Экспортирует владелец; импортировать может любой, кому можно создавать группы
  • Весь файл проверяется до того, как что-то будет записано, а затем импортируется за один шаг
  • Каждая заметка и тег получают новый id, поэтому импорт никогда не конфликтует с тем, что уже есть
  • Каждый агрегат регистрирует свою часть файла
Читать код экспорта

Языки

Шесть языков с самого начала

Приложение, админ-панель и этот сайт говорят на языках: английский, русский, испанский, немецкий, бразильский португальский и арабский. Каждый выбирает язык в приложении, и он сохраняется вместе с аккаунтом. У каждой страницы этого сайта свой адрес на каждом языке.

  • Один JSON-каталог на язык; тест называет каждое отсутствующее или устаревшее сообщение
  • Множественное число, числа и даты через встроенный в платформу Intl, без i18n-библиотеки
  • Ссылки hreflang на каждой странице сайта и sitemap, в котором есть каждый язык
  • Арабские страницы читаются справа налево
Ещё не сделано
  • Письма на языке читателя (issue #277)
  • Вёрстка справа налево, доделанная на каждом экране (issue #215)
Читать руководство по переводу

Готово, когда понадобится

Реальное время, офлайн и фоновая работа

То, что большинство стартеров пропускают, потому что это сложно: живые обновления, приложение, которое работает без сети, и работа, которая не должна потеряться.

Работает сегодняОфлайн-запись работает для заметок и тегов; любой другой список открывается офлайн с тем, что показывал в последний раз.

Реальное время

Изменения видны без перезагрузки

Изменение участника появляется в каждой открытой вкладке группы, а ноутбук, проснувшись, догоняет всё, что пропустил.

  • Обычный WebSocket, с порядковым номером у каждого изменения
  • Вкладка, снова показанная после сна, переподключается и подтягивает пропущенное
  • Реальное время можно выключить: тогда приложение опрашивает сервер по таймеру и работает так же
Читать устройство реального времени
Первое окно: редактор заметки, заголовок изменён на «План на Q4: онбординг, оплата и счета».
Второе окно, отдельный вход: сразу после сохранения новый заголовок появляется вверху списка заметок, без перезагрузки.

Офлайн

Приложение, которое открывается без сети

Приложение устанавливается как нативное, открывается без сети и отправляет изменения из очереди, когда сеть возвращается. Устаревшее изменение показывается как конфликт, который нужно решить, а не как тихая перезапись.

  • Копия каждого списка в IndexedDB и очередь записи с ключами идемпотентности
  • «Оставить моё» или «Взять с сервера» для каждого конфликта
  • Выключается одной настройкой или убирается удалением одной папки по готовому списку шагов
Читать docs/offline.md
Изменение, сделанное офлайн, встречает более новое на сервере: «1 изменение ждёт вашего выбора» показывает обе версии заметки рядом, с кнопками «Оставить моё» и «Взять с сервера».

Клавиатура

Горячие клавиши в приложении и админ-панели

Нажмите ?, чтобы увидеть все сочетания. N добавляет заметку с любой страницы, не уходя с неё, а G и затем буква открывают раздел. Пока вы печатаете в поле, клавиши не мешают.

  • Ctrl K (⌘K на Mac) или / открывает поиск
  • Один список на приложение назначает клавиши и заполняет окно ?, поэтому там никогда нет клавиши, которая ничего не делает
  • Однобуквенные сочетания можно выключить на устройстве; Ctrl K и Escape продолжают работать
  • В админ-панели G и затем буква открывают каждый модуль
Читать код горячих клавиш

Уведомления

Уведомления в приложении, на телефоне, на компьютере и в Telegram

Люди получают уведомление, когда их приглашают, дают новую роль или передают группу: в приложении, веб-пушем на телефон или компьютер и в Telegram, если они его подключат.

  • Веб-пуш с вашими собственными ключами, которые создаёт одна задача: deno task vapid-key:create
  • Счётчик непрочитанного в приложении и «Отметить всё как прочитанное»
  • Пуш-подписка каждого устройства видна в профиле
  • Бот в Telegram, выключен, пока вы не зададите его токен: подключается одноразовым кодом, а свои команды продукта добавляются в одном файле
Читать сервис веб-пуша
Страница уведомлений: три непрочитанных уведомления — о новом владельце группы, о смене роли и о приглашении; каждая строка открывает то, о чём она.

Фоновая работа

Работа, которая переживёт сбой

Письма и уведомления уходят, даже если сервер перезапустится на полпути, потому что работа сохраняется до того, как выполнена. Ваши собственные задачи запускаются сразу, позже или по расписанию.

  • Каждая команда записывает своё событие в той же транзакции базы данных, что и изменение
  • Worker разбирает этот outbox и отправляет письма, пуши и живые обновления
  • Задача — это одно определение: имя, обработчик и, если она повторяется, расписание
  • Неудачная попытка повторяется со всё большими паузами; операторы видят каждый запуск в админке
Читать docs/jobs.md
Одна транзакция: сохраняется либо всё, либо ничегоИзменениезаметка, участникЕго событиестрока outboxWorkerразбирает outboxПочтакоды, уведомленияПуштелефон, компьютерВживуюдругие вкладки

Ваш продукт

Добавьте фичу, скопировав готовую

Заметки — законченная фича на каждом уровне: база данных, API, экран, офлайн и тесты. Новая фича копирует их файл за файлом по списку, где каждый файл назван по порядку.

  • Одна форма для каждой фичи, поэтому код легко найти
  • У каждого уровня свои тесты, которые копируются вместе с ним
  • Каждый id — упорядоченный по времени UUID (версия 7)
Читать docs/aggregates.md
1 libs/domain/notes/+lib.ts 2 libs/server/db/migrations/…_notes.sql 3 libs/server/notes/ 4 apps/api/features/notes/handlers.ts 5 apps/api/features/notes/operations.ts 6 libs/ui/notes-screen.tsx 7 apps/spa/src/state/notes.ts 8 e2e/notes.e2e.ts

Эксплуатация

Запускайте, наблюдайте, поддерживайте пользователей

Один арендованный сервер, инструменты, чтобы видеть, что он делает, и раздел, где ваши операторы помогают людям, которые пользуются продуктом.

Работает сегодняКаждый модуль ниже доступен уже сегодня. Что ещё не сделано, указано под каждым.

Поддержка

Админ-панель для ваших операторов

Ваши операторы находят человека по имени или адресу и видят его способы входа, сеансы, группы и историю. Там же они управляют группами, возвращают платёж, следят за подписчиками рассылки, видят каждую фоновую задачу, перезапускают упавшую и проверяют состояние системы. Посмотреть за 59 секунд.

  • Отдельное приложение на своём хосте, со своей сессионной cookie
  • Девять модулей, от дашборда до API-токенов
  • Рискованные действия требуют подтверждения, и каждое действие записывается в журнал аудита
Ещё не сделано
  • Вход от имени человека, чтобы видеть то же, что он
Читать код админки

Деплой

Один сервер, одна команда

Seed работает на любом арендованном Linux-сервере, с Docker Compose и для разработки, и для продакшена. Несколько продуктов могут делить один сервер.

  • Traefik спереди, с автоматическими сертификатами
  • Postgres и Valkey рядом с приложениями
  • Garage, файловое хранилище S3: в нём заметки хранят изображения и PDF, а люди — фото профиля; загрузка идёт по подписанным ссылкам с проверкой по байтам. Фото, включая HEIC, превращается в небольшие варианты AVIF и WebP без геопозиции и других метаданных
  • VictoriaMetrics, VictoriaLogs и Grafana, с оповещениями
  • Ежедневный зашифрованный бэкап базы через restic по желанию и описанное восстановление
  • Релизные образы публикуются из CI, когда вы пушите тег версии
Читать файлы Compose
$ deno task deploy Copying files... Copying infra/envs/.env.prod to infra/envs/.env... Creating web push keys if missing... Starting the app... Deploy completed.
Сокращено: вывод rsync и Compose между шагами опущен.
  • 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 это?

Можно ли запустить 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 и десктопа в планах.

Посмотрите в работе за минуту

Демо — это то приложение, которое вы получаете в первый же день. Откройте его без регистрации и начните в группах, полных примеров заметок.