Funciones
Todo lo que trae Seed, y lo que aún no
Seed es un starter SaaS gratuito con licencia MIT, con inicio de sesión por correo, Google y GitHub, passkeys, enlaces mágicos, cuentas de invitado, 2FA, grupos con roles, cobro por miembro con Stripe, actualizaciones en tiempo real, una app sin conexión, un área de administración, monitorización y copias de seguridad diarias cifradas opcionales. Cada sección enlaza a su código.
Por Anton ShubinActualizado
Seed está en desarrollo y se construye en público. Lo que aún no está hecho se marca como «Aún no está hecho» junto a la afirmación que limita, con su issue cuando hay uno abierto.
Resuelto por ti
Un starter SaaS con grupos y cobro ya conectados
Cuentas, grupos y dinero: las partes que todo producto necesita antes de su primera función, y las más fáciles de hacer mal.
Funciona hoyProbado en CI. El inicio de sesión con Google y GitHub y Stripe necesitan tus propias claves, así que están desactivados en la demo.
Cuentas
Inicio de sesión resuelto
Las personas se registran con un correo y una contraseña, confirman el correo con un código que reciben por email, restablecen una contraseña olvidada, siguen con Google o GitHub, reciben por correo un enlace de acceso que también las registra, entran con una passkey, o prueban primero la app en una cuenta de invitado y añaden después un método de inicio de sesión. Una app de autenticación añade la autenticación en dos pasos (2FA). Ven cada dispositivo con sesión iniciada y pueden cerrar la sesión en los demás. Cambiar un método de inicio de sesión pide una prueba y envía un correo.
- Contraseñas con hash PBKDF2-SHA-256 mediante Web Crypto, 600.000 rondas por defecto
- Cookies de sesión firmadas y un registro de auditoría de cada evento de inicio de sesión
- Tokens de API personales, guardados solo como hashes con clave
- Passkeys: solo se guarda la clave pública, y cada desafío de inicio de sesión funciona una vez
- Enlaces mágicos: un enlace inicia sesión o registra, funciona una vez, durante 15 minutos, y se guarda solo como hash
- Cuentas de invitado (inicio de sesión anónimo): un visitante empieza con un clic y sin método de inicio de sesión, y luego añade a la misma cuenta un correo y contraseña, Google, GitHub o una passkey
- Las contraseñas incorrectas se cuentan por nombre de inicio de sesión, con un bloqueo breve, desde cualquier dirección de red

Grupos
Grupos con roles, desde el primer minuto
Cada cuenta recibe un grupo personal al registrarse. Las personas crean grupos compartidos, invitan a otras, les dan roles de lector a propietario y traspasan la propiedad en un paso. Un grupo eliminado se puede recuperar durante 30 días, y cada grupo guarda un registro de actividad.
- El grupo es el único límite entre inquilinos: los datos personales y compartidos pasan la misma comprobación
- La app, su código y este sitio lo llaman grupo
- Sin un segundo modelo de permisos que mantener sincronizado con el primero
- Invitaciones, cambios de rol y traspaso de propiedad, cada uno con sus propias pruebas

Resumen
Un resumen para cada grupo
Cifras clave y un gráfico para cualquier rango de fechas. Cada persona oculta y reordena los widgets, y la disposición la sigue a sus otros dispositivos.
- Cada cifra se compara con el periodo anterior, sin un veredicto por colores
- Solo recuentos: ni el texto de las notas ni rankings de personas
- Cada widget carga, falla y reintenta por su cuenta
- Un agregado nuevo añade sus propios widgets, y el área de administración también los muestra
Dinero
Cobro por miembro, con Stripe
Las personas ven una tabla de precios, un plan gratuito con límites y una prueba de 14 días del plan de pago. El propietario ve lo que cuesta un miembro más antes de invitarlo, y un aviso claro con fecha cuando falla una tarjeta.
- Stripe Checkout y el portal del cliente; el webhook es la única fuente del plan
- Cantidades que siguen al número de miembros
- Un periodo de gracia tras un pago fallido, 7 días por defecto
- Límites del plan comprobados en el servidor, no solo en la app
- Los planes viven en un archivo de catálogo; la página de precios lo lee
- Proveedores de pago distintos de Stripe

Privacidad
Cuentas que se pueden dejar
Las personas descargan una copia de sus datos y eliminan su cuenta desde el perfil, con 7 días para cambiar de idea. Las notificaciones leídas se eliminan a los 90 días.
- Descargar mis datos: un ZIP de archivos JSON y CSV, preparado en segundo plano y guardado 7 días
- La eliminación espera 7 días; volver a iniciar sesión la cancela
- Limpieza nocturna de notificaciones leídas, invitaciones caducadas y eventos de auditoría antiguos
Exportar
Tus datos se van contigo
Exporta cualquier grupo a un archivo JSON abierto e impórtalo después como un grupo nuevo. El grupo original nunca se sobrescribe.
- El propietario exporta; importa cualquiera que pueda crear un grupo
- Se comprueba todo el archivo antes de escribir nada, y luego se importa en un solo paso
- Cada nota y etiqueta recibe un id nuevo, así que una importación nunca choca con lo que ya existe
- Cada agregado registra su propia parte del archivo
Idiomas
En seis idiomas desde el principio
La app, el área de administración y este sitio hablan inglés, ruso, español, alemán, portugués de Brasil y árabe. Cada persona elige su idioma en la app, y se guarda con su cuenta. Cada página de este sitio tiene su propia dirección en cada idioma.
- Un catálogo JSON por idioma, comprobado por una prueba que nombra cada mensaje que falta o está desactualizado
- Plurales, números y fechas con el propio Intl de la plataforma, sin biblioteca de i18n
- Enlaces hreflang en cada página del sitio, y un sitemap que lista cada idioma
- Las páginas en árabe se leen de derecha a izquierda
- Correos en el idioma del lector (issue #277)
- Diseños de derecha a izquierda terminados en cada pantalla (issue #215)
Listo cuando lo necesites
Tiempo real, sin conexión y trabajo en segundo plano
Las partes que la mayoría de los starters dejan fuera porque son difíciles: actualizaciones en vivo, una app que funciona sin red y trabajo que no se puede perder.
Funciona hoyLa escritura sin conexión cubre notas y etiquetas; cualquier otra lista se abre sin conexión con lo último que mostró.
Tiempo real
Los cambios aparecen sin recargar
El cambio de un miembro aparece en cada pestaña abierta del grupo, y un portátil que despierta de la suspensión se pone al día con lo que se perdió.
- Un WebSocket estándar, con una secuencia en cada cambio
- Una pestaña que vuelve a mostrarse tras la suspensión se reconecta y trae lo que se perdió
- El tiempo real se puede desactivar: la app consulta entonces cada cierto tiempo y funciona igual


Sin conexión
Una app que abre sin red
La app se instala como una nativa, abre sin red y envía los cambios en cola cuando vuelve la conexión. Un cambio desfasado aparece como un conflicto que resolver, nunca como una sobrescritura silenciosa.
- Una copia en IndexedDB de cada lista y una cola de escritura con claves de idempotencia
- «Mantener el mío» o «Usar el del servidor» para cada conflicto
- Se desactiva con un ajuste, o se elimina borrando una carpeta y siguiendo una lista escrita

Teclado
Atajos de teclado en la app y en el área de administración
Pulsa ? para ver todos los atajos. N añade una nota desde cualquier página sin salir de ella, y G seguida de una letra abre una sección. Los atajos no estorban mientras escribes en un campo.
- Ctrl K (⌘K en un Mac) o / abre la búsqueda
- Una lista por app asigna las teclas y llena el diálogo ?, así nunca muestra una tecla que no hace nada
- Los atajos de una sola tecla se pueden desactivar en un dispositivo; Ctrl K y Escape siguen funcionando
- En el área de administración, G seguida de una letra abre cada módulo
Notificaciones
Notificaciones en la app, en el móvil, en el escritorio y en Telegram
Las personas reciben un aviso cuando las invitan, les dan un rol nuevo o les traspasan un grupo: en la app, como web push en el móvil o el escritorio, y en Telegram cuando lo vinculan.
- Web push con tus propias claves, creadas con una tarea: deno task vapid-key:create
- Un contador de no leídas en la app, y «Marcar todo como leído»
- La suscripción push de cada dispositivo aparece en el perfil
- Un bot de Telegram, desactivado hasta que pones su token: se vincula con un código de un solo uso, y los comandos propios de tu producto se añaden en un archivo

Segundo plano
Trabajo que sobrevive a un fallo
Los correos y las notificaciones salen aunque el servidor se reinicie a mitad, porque el trabajo se guarda antes de hacerse. Tus propias tareas se ejecutan ahora, más tarde o según un calendario.
- Cada comando escribe su evento en la misma transacción de base de datos que el cambio
- Un worker vacía ese outbox y envía correos, push y actualizaciones en vivo
- Una tarea es una definición: un nombre, un handler y, si se repite, su calendario
- Un intento fallido se reintenta con esperas cada vez más largas; los operadores ven cada ejecución en la administración
Tu producto
Añade una función copiando otra
Las notas son una función completa en cada capa: base de datos, API, pantalla, modo sin conexión y pruebas. Una función nueva las copia archivo por archivo, siguiendo una lista que nombra cada archivo en orden.
- Una misma forma para cada función, así el código sigue siendo fácil de encontrar
- Cada capa tiene sus propias pruebas para copiar con ella
- Cada id es un UUID ordenado por tiempo (versión 7)
Operación
Ejecútalo, vigílalo y da soporte a quienes lo usan
Un servidor que alquilas, las herramientas para ver lo que hace y un área donde tus operadores ayudan a las personas que usan tu producto.
Funciona hoyCada módulo de abajo está disponible hoy. Lo que aún no está hecho aparece bajo cada uno.
Soporte
Un área de administración para tus operadores
Tus operadores buscan a una persona por nombre o dirección y ven sus métodos de inicio de sesión, sesiones, grupos e historial. Desde el mismo sitio gestionan grupos, reembolsan un pago, cuidan de los suscriptores del boletín, ven cada tarea en segundo plano, vuelven a ejecutar una fallida y revisan la salud del sistema. Míralo en 59 segundos.
- Una app aparte en su propio host, con su propia cookie de sesión
- Nueve módulos, del panel principal a los tokens de API
- Las acciones arriesgadas piden confirmación, y cada acción se escribe en el registro de auditoría
- Iniciar sesión como una persona para ver lo que ve
Despliegue
Un servidor, un comando
Seed funciona en cualquier servidor Linux que alquiles, con Docker Compose tanto para desarrollo como para producción. Varios productos pueden compartir un servidor.
- Traefik delante, con certificados automáticos
- Postgres y Valkey junto a las apps
- Garage, un almacén de archivos S3: las notas guardan ahí imágenes y PDF, y las personas sus fotos de perfil, subidas con enlaces firmados y comprobadas por sus bytes. Una foto, HEIC incluido, se convierte en tamaños pequeños AVIF y WebP sin la ubicación ni otros metadatos
- VictoriaMetrics, VictoriaLogs y Grafana, con alertas
- Una copia de seguridad diaria y cifrada de la base de datos con restic, opcional, y una restauración por escrito
- Imágenes de versión publicadas desde CI cuando subes una etiqueta de versión
- Traefik
- Postgres
- Valkey
- VictoriaMetrics
- VictoriaLogs
- Grafana
- Alertmanager
- Garage file store
- restic backups
Sitio web
Un sitio web público para adaptar
Este sitio: rápido, renderizado en el servidor y usable con JavaScript desactivado, con precios, páginas legales, un blog y un boletín.
- Fresh en el servidor; cada acción es un enlace o un formulario de verdad
- Precios leídos del catálogo de planes de la app
- Un boletín con doble confirmación y baja con un clic
- Un blog escrito en el panel de administración, con temas, un feed RSS y datos estructurados de artículo
- Enlaces de contacto definidos en el panel de administración, mostrados en el pie y en los datos estructurados
- Un catálogo opcional para una tienda, editado en el panel de administración: artículos con fotos, colores, tallas, una guía de tallas y tallas agotadas, en cada idioma en el que vendes, con un enlace corto de seguimiento por artículo y lugar donde lo compartes
- sitemap.xml, robots.txt, enlaces canónicos e imágenes Open Graph
- Analítica opcional sin cookies en tu propio Umami, con un evento en cada llamada a la acción
- Cada página en seis idiomas, cada una en su propia dirección con enlaces hreflang; las páginas legales siguen en inglés
Calidad
Probado donde importa
Contado el 16 de octubre de 2026: 34 suites de pruebas de navegador para la app, más pruebas unitarias y de pantalla, todas en CI. Cada cambio pasa por un pull request y una revisión antes de fusionarse.
- Pruebas de navegador con Playwright, contra la API y la base de datos reales
- Pruebas unitarias y de pantalla junto al código que prueban
- Pruebas de integración contra Postgres
Preguntas
¿Seed puede hacer eso?
¿Seed puede funcionar en Vercel o en funciones serverless?
No. Seed funciona como contenedores de larga duración con Docker Compose en un servidor Linux que alquilas, porque la API mantiene abiertas conexiones WebSocket y un worker vacía una cola.
¿Seed puede funcionar en Node.js o Bun?
Hoy no. Los servidores de Seed funcionan con Deno 2 en Docker, y sus tareas y pruebas usan Deno. El código se basa en estándares web como fetch, Request y Web Crypto.
¿Seed puede usar una base de datos que no sea Postgres?
No. Seed está construido sobre Postgres: sus migraciones, consultas y pruebas de integración lo dan por hecho.
¿Seed puede publicarse como app móvil o de escritorio?
Todavía no como app de tienda. Hoy la app web se instala desde el navegador en móviles y ordenadores y abre sin red; hay apps para Android y escritorio planeadas.
Míralo funcionar en un minuto
La demo es la app que tienes desde el primer día. Ábrela sin registrarte y empieza en grupos llenos de notas de ejemplo.

