Pular para o conteúdo

Recursos

Tudo o que o Seed entrega, e o que ainda não

O Seed é um starter SaaS gratuito sob licença MIT, com login por e-mail, Google e GitHub, passkeys, links mágicos, contas de visitante, 2FA, grupos com papéis, cobrança por membro no Stripe, atualizações em tempo real, um app offline, uma área de administração, monitoramento e backups diários criptografados opcionais. Cada seção abaixo leva ao seu código.

Por Anton ShubinAtualizado

O Seed está em desenvolvimento, construído em público. O que ainda não foi feito aparece como “Ainda não feito” ao lado da afirmação que ele limita, com a issue quando há uma aberta.

Resolvido para você

Um starter SaaS com grupos e cobrança já conectados

Contas, grupos e dinheiro: as partes de que todo produto precisa antes do primeiro recurso, e as mais fáceis de errar.

Funciona hojeTestado na CI. O login com Google e GitHub e o Stripe precisam das suas próprias chaves, por isso estão desligados na demo.

Contas

Login resolvido

As pessoas se cadastram com e-mail e senha, confirmam o endereço com um código enviado por e-mail, redefinem uma senha esquecida, continuam com Google ou GitHub, recebem por e-mail um link de acesso que também faz o cadastro, entram com uma passkey ou experimentam o app primeiro em uma conta de visitante e adicionam um método de login depois. Um app autenticador acrescenta a autenticação em dois fatores (2FA). Elas veem cada dispositivo conectado e podem desconectar os outros. Mudar um método de login pede uma confirmação e envia um e-mail.

  • Senhas com hash PBKDF2-SHA-256 via Web Crypto, 600.000 rodadas por padrão
  • Cookies de sessão assinados e uma trilha de auditoria de cada evento de login
  • Tokens de API pessoais, guardados só como hashes com chave
  • Passkeys: só a chave pública é guardada, e cada desafio de login funciona uma vez
  • Links mágicos: um link faz login ou cadastro, funciona uma vez, por 15 minutos, e é guardado só como hash
  • Contas de visitante (login anônimo): o visitante começa com um clique e sem método de login, e depois adiciona à mesma conta e-mail e senha, Google, GitHub ou uma passkey
  • Senhas erradas contadas por nome de login, com um bloqueio curto, de qualquer endereço de rede
Leia o código do login
A página de segurança de um perfil: os métodos de login, a autenticação em dois fatores (2FA) e as sessões abertas.

Grupos

Grupos com papéis, desde o primeiro minuto

Toda conta ganha um grupo pessoal no cadastro. As pessoas criam grupos compartilhados, convidam outras, dão papéis de leitor a proprietário e transferem a propriedade em um passo. Um grupo excluído pode ser recuperado por 30 dias, e cada grupo mantém um registro de atividades.

  • O grupo é o único limite entre inquilinos: dados pessoais e compartilhados passam pela mesma verificação
  • O app, o código dele e este site chamam tudo de grupo
  • Nenhum segundo modelo de permissões para manter em sincronia com o primeiro
  • Convites, mudanças de papel e transferência de propriedade, cada um com seus próprios testes
Leia o domínio de grupos
O registro de atividades de um grupo: quem adicionou qual nota ou tag e quando, com um link para abrir cada nota.

Visão geral

Uma visão geral para cada grupo

Números principais e um gráfico para qualquer intervalo de datas. Cada pessoa oculta e reordena os widgets, e o layout a acompanha nos outros dispositivos.

  • Cada número é comparado com o período anterior, sem veredito em cores
  • Só contagens: nenhum texto de nota e nenhum ranking de pessoas
  • Cada widget carrega, falha e tenta de novo por conta própria
  • Um novo agregado adiciona os próprios widgets, e a área de administração também os mostra
Leia os widgets da visão geral

Dinheiro

Cobrança por membro, pelo Stripe

As pessoas veem uma tabela de preços, um plano gratuito com limites e um teste de 14 dias do plano pago. O proprietário vê quanto custa mais um membro antes de convidá-lo, e um aviso claro com data quando um cartão falha.

  • Stripe Checkout e o portal do cliente; o webhook é a única fonte do plano
  • Quantidades que acompanham o número de membros
  • Um prazo de carência depois de um pagamento que falhou, 7 dias por padrão
  • Limites do plano verificados no servidor, não só no app
  • Os planos ficam em um arquivo de catálogo; a página de preços lê esse arquivo
Ainda não feito
  • Provedores de pagamento além do Stripe
Leia docs/billing.md
A aba de plano e cobrança de um grupo de exemplo, com os preços de exemplo da demo: plano Pro com a data de renovação, € 36,00 por mês, para 4 membros a € 9,00 cada, incluindo o proprietário, com botões para trocar o cartão, ver as faturas e cancelar o plano.

Privacidade

Contas que dá para deixar

As pessoas baixam uma cópia dos seus dados e excluem a conta pelo perfil, com 7 dias para mudar de ideia. Notificações lidas são apagadas depois de 90 dias.

  • Baixar meus dados: um ZIP de arquivos JSON e CSV, preparado em segundo plano e guardado por 7 dias
  • A exclusão espera 7 dias; entrar de novo a cancela
  • Limpeza noturna de notificações lidas, convites vencidos e eventos de auditoria antigos
Leia o código de exclusão de conta

Exportação

Seus dados vão com você

Exporte qualquer grupo para um arquivo JSON aberto e importe-o depois como um novo grupo. O grupo original nunca é sobrescrito.

  • O proprietário exporta; importa quem pode criar um grupo
  • O arquivo inteiro é verificado antes de qualquer gravação e depois importado em um passo
  • Cada nota e tag ganha um novo id, então uma importação nunca colide com o que já existe
  • Cada agregado registra a própria parte do arquivo
Leia o código de exportação

Idiomas

Em seis idiomas desde o início

O app, a área de administração e este site falam inglês, russo, espanhol, alemão, português (Brasil) e árabe. Cada pessoa escolhe o idioma no app, e ele fica salvo com a conta. Cada página deste site tem o próprio endereço em cada idioma.

  • Um catálogo JSON por idioma, verificado por um teste que aponta cada mensagem faltando ou desatualizada
  • Plurais, números e datas pelo próprio Intl da plataforma, sem biblioteca de i18n
  • Links hreflang em cada página do site, e um sitemap que lista cada idioma
  • As páginas em árabe são lidas da direita para a esquerda
Ainda não feito
  • E-mails no idioma de quem lê (issue #277)
  • Layouts da direita para a esquerda prontos em todas as telas (issue #215)
Leia o guia de tradução

Pronto quando você precisar

Tempo real, offline e trabalho em segundo plano

As partes que a maioria dos starters deixa de fora porque são difíceis: atualizações ao vivo, um app que funciona sem rede e um trabalho que não pode se perder.

Funciona hojeA escrita offline cobre notas e tags; qualquer outra lista abre offline com o que mostrou por último.

Tempo real

As mudanças aparecem sem recarregar

A mudança de um membro aparece em cada aba aberta do grupo, e um notebook que acorda do modo de suspensão recupera o que perdeu.

  • Um WebSocket padrão, com uma sequência em cada mudança
  • Uma aba exibida de novo depois da suspensão se reconecta e busca o que perdeu
  • O tempo real pode ser desligado: o app passa a consultar em intervalos e funciona do mesmo jeito
Leia o design do tempo real
Primeira janela: o editor de notas, com o título alterado para “Roadmap do 4º tri: onboarding, cobrança e faturas”.
Segunda janela, com outro login: logo depois de Salvar, a lista de notas mostra o novo título no topo, sem recarregar.

Offline

Um app que abre sem rede

O app se instala como um nativo, abre sem rede e envia as mudanças enfileiradas quando a rede volta. Uma mudança desatualizada aparece como um conflito a resolver, nunca como uma sobrescrita silenciosa.

  • Uma cópia em IndexedDB de cada lista e uma fila de gravação com chaves de idempotência
  • “Manter a minha” ou “Usar a do servidor” para cada conflito
  • Desligado com uma configuração, ou removido apagando uma pasta e seguindo uma lista escrita
Leia docs/offline.md
Uma mudança feita offline encontra uma mais nova no servidor: “1 mudança precisa da sua escolha” mostra as duas versões da nota lado a lado, com “Manter a minha” e “Usar a do servidor”.

Teclado

Atalhos de teclado no app e na área de administração

Aperte ? para ver todos os atalhos. N adiciona uma nota em qualquer página sem sair dela, e G seguido de uma letra abre uma seção. Os atalhos não atrapalham enquanto você digita em um campo.

  • Ctrl K (⌘K no Mac) ou / abre a busca
  • Uma lista por app define as teclas e preenche a janela ?, então ela nunca mostra uma tecla que não faz nada
  • Atalhos de uma tecla podem ser desligados em um dispositivo; Ctrl K e Escape continuam funcionando
  • Na área de administração, G seguido de uma letra abre cada módulo
Leia o código dos atalhos

Notificações

Notificações no app, no celular, no desktop e no Telegram

As pessoas recebem um aviso quando são convidadas, ganham um novo papel ou recebem um grupo: no app, como web push no celular ou no desktop, e no Telegram depois de vinculá-lo.

  • Web push com suas próprias chaves, geradas por uma tarefa: deno task vapid-key:create
  • Um contador de não lidas no app, e “Marcar todas como lidas”
  • A inscrição de push de cada dispositivo listada no perfil
  • Um bot do Telegram, desligado até você definir o token: vinculado com um código de uso único, e os comandos do seu produto adicionados em um arquivo
Leia o serviço de web push
A página de notificações: três avisos não lidos sobre um novo proprietário de grupo, uma mudança de papel e um convite; cada linha abre aquilo de que trata.

Segundo plano

Trabalho que sobrevive a uma queda

E-mails e notificações saem mesmo quando o servidor reinicia no meio do caminho, porque o trabalho é salvo antes de ser feito. Seus próprios jobs rodam agora, mais tarde ou em um agendamento.

  • Cada comando grava seu evento na mesma transação de banco de dados da mudança
  • Um worker esvazia esse outbox e envia e-mails, push e atualizações ao vivo
  • Um job é uma definição: um nome, um handler e, se ele se repete, seu agendamento
  • Uma tentativa que falha é repetida com esperas cada vez maiores; os operadores veem cada execução no admin
Leia docs/jobs.md
Uma transação: os dois são salvos, ou nenhumA mudançauma nota, um membroO evento delauma linha do outboxWorkeresvazia o outboxE-mailcódigos, avisosPushcelular, desktopAo vivooutras abas

Seu produto

Adicione um recurso copiando outro

As notas são um recurso completo em cada camada: banco de dados, API, tela, offline e testes. Um novo recurso as copia arquivo por arquivo, seguindo uma lista que cita cada arquivo em ordem.

  • Um mesmo formato para todo recurso, então o código continua fácil de achar
  • Cada camada tem os próprios testes para copiar junto
  • Todo id é um UUID ordenado no tempo (versão 7)
Leia 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

Operação

Rode, acompanhe e dê suporte a quem usa

Um servidor que você aluga, as ferramentas para ver o que ele faz e uma área onde seus operadores ajudam as pessoas que usam o seu produto.

Funciona hojeTodo módulo abaixo já está disponível hoje. O que ainda não foi feito aparece embaixo de cada um.

Suporte

Uma área de administração para seus operadores

Seus operadores encontram uma pessoa pelo nome ou endereço e veem os métodos de login, as sessões, os grupos e o histórico dela. No mesmo lugar, gerenciam grupos, reembolsam um pagamento, cuidam dos inscritos da newsletter, veem cada job em segundo plano, rodam de novo um que falhou e verificam a saúde do sistema. Assista em 59 segundos.

  • Um app separado, em um host próprio, com o próprio cookie de sessão
  • Nove módulos, do painel aos tokens de API
  • Ações arriscadas pedem confirmação, e cada ação é gravada no log de auditoria
Ainda não feito
  • Entrar como uma pessoa para ver o que ela vê
Leia o app de administração

Deploy

Um servidor, um comando

O Seed roda em qualquer servidor Linux que você alugar, com Docker Compose tanto para desenvolvimento quanto para produção. Vários produtos podem dividir um servidor.

  • Traefik na frente, com certificados automáticos
  • Postgres e Valkey ao lado dos apps
  • Garage, um armazenamento de arquivos S3: as notas guardam nele imagens e PDFs, e as pessoas, suas fotos de perfil, enviadas por links assinados e verificadas pelos bytes. Uma foto, inclusive HEIC, vira tamanhos pequenos em AVIF e WebP, sem a localização e outros metadados
  • VictoriaMetrics, VictoriaLogs e Grafana, com alertas
  • Um backup diário e criptografado do banco com restic, opcional, e uma restauração documentada
  • Imagens de release publicadas pela CI quando você envia uma tag de versão
Leia os arquivos do 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.
Resumido: a saída do rsync e do Compose entre os passos foi omitida.
  • Traefik
  • Postgres
  • Valkey
  • VictoriaMetrics
  • VictoriaLogs
  • Grafana
  • Alertmanager
  • Garage file store
  • restic backups

Site

Um site público para adaptar

Este site: rápido, renderizado no servidor e utilizável com JavaScript desligado, com preços, páginas legais, um blog e uma newsletter.

  • Fresh no servidor; cada ação é um link ou formulário de verdade
  • Preços lidos do catálogo de planos do app
  • Uma newsletter com confirmação dupla e cancelamento com um clique
  • Um blog escrito no painel de administração, com tópicos, um feed RSS e dados estruturados de artigo
  • Links de contato definidos no painel de administração, exibidos no rodapé e nos dados estruturados
  • Um catálogo opcional para uma loja, editado no painel de administração: itens com fotos, cores, tamanhos, uma tabela de medidas e tamanhos esgotados, em cada idioma em que você vende, com um link curto de rastreamento por item e lugar onde você o compartilha
  • sitemap.xml, robots.txt, links canônicos e imagens Open Graph
  • Análise opcional sem cookies no seu próprio Umami, com um evento em cada chamada para ação
  • Cada página em seis idiomas, cada uma em seu próprio endereço com links hreflang; as páginas legais ficam em inglês
Leia o código do site

Qualidade

Testado onde importa

Contado em 16 de outubro de 2026: 34 suítes de testes de navegador para o app, além de testes unitários e de tela, todos rodando na CI. Toda mudança passa por um pull request e uma revisão antes do merge.

  • Testes de navegador com Playwright, contra a API e o banco de dados reais
  • Testes unitários e de tela ao lado do código que testam
  • Testes de integração contra o Postgres
Leia os testes de navegador
Como o Seed se compara

Perguntas

O Seed consegue fazer isso?

O Seed roda na Vercel ou em funções serverless?

Não. O Seed roda como contêineres de longa duração com Docker Compose em um servidor Linux que você aluga, porque a API mantém conexões WebSocket abertas e um worker esvazia uma fila.

O Seed roda em Node.js ou Bun?

Hoje não. Os servidores do Seed rodam em Deno 2 no Docker, e as tarefas e os testes usam Deno. O código é construído sobre padrões da web como fetch, Request e Web Crypto.

O Seed pode usar um banco de dados além do Postgres?

Não. O Seed é construído sobre o Postgres: as migrações, as consultas e os testes de integração dependem dele.

O Seed pode virar um app para celular ou desktop?

Ainda não como app de loja. Hoje o app web se instala pelo navegador em celulares e desktops e abre sem rede; apps para Android e desktop estão planejados.

Veja funcionando em um minuto

A demo é o app que você recebe no primeiro dia. Abra sem cadastro e comece em grupos cheios de notas de exemplo.