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

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

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
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
- Provedores de pagamento além do Stripe

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
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
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
- E-mails no idioma de quem lê (issue #277)
- Layouts da direita para a esquerda prontos em todas as telas (issue #215)
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


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

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
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

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
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)
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
- Entrar como uma pessoa para ver o que ela vê
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
- 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
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
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.

