Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
O único app que ensina você a vender marmita fit e ainda cuida da gestão do seu negócio no dia a dia — de calcular macro a fechar pedido. Conteúdo e ferramenta vivem no mesmo lugar: a aula sobre precificação abre ao lado da calculadora de precificação, e a aula sobre cardápio abre ao lado do banco de receitas. A concorrência vende PDF; aqui o usuário aprende e executa na mesma tela. Público: pessoas de 25 a 45 anos, com pouco ou nenhum conhecimento de nutrição, precificação e gestão, querendo gerar renda vendendo marmitas fit. Toda a interface e todo o conteúdo estão em português do Brasil.檢視完整 README ↗
O único app que ensina você a vender marmita fit e ainda cuida da gestão do seu negócio no dia a dia — de calcular macro a fechar pedido.
Conteúdo e ferramenta vivem no mesmo lugar: a aula sobre precificação abre ao lado da calculadora de precificação, e a aula sobre cardápio abre ao lado do banco de receitas. A concorrência vende PDF; aqui o usuário aprende e executa na mesma tela.
Público: pessoas de 25 a 45 anos, com pouco ou nenhum conhecimento de nutrição, precificação e gestão, querendo gerar renda vendendo marmitas fit.
Toda a interface e todo o conteúdo estão em português do Brasil.
| Rota | O que faz |
|---|---|
/ | Página de vendas pública, com a promessa, o problema, as ferramentas, prova social, planos e FAQ |
/design-system | Fonte da verdade visual: paleta, tipografia, componentes e estados. Só em desenvolvimento |
/entrar, /cadastro | Autenticação pelo Clerk, com as telas estilizadas na identidade do produto |
/onboarding | Quiz de quatro passos que define o destino do usuário |
/app | Painel: progresso na trilha, próxima aula, atalhos e receitas salvas |
/app/curso | Trilha com cinco módulos e 27 aulas, progresso persistido por aula |
/app/curso/[modulo]/[aula] | Aula em texto rico, player de vídeo opcional e botão de concluir |
/app/macros | Calculadora de macros com 67 ingredientes brasileiros, totais e por porção |
/app/precificacao | Calculadora de precificação com a conta aberta e cenários salvos |
/app/receitas | Banco de receitas com busca e filtro por objetivo |
/app/receitas/[slug] | Ficha completa: ingredientes, preparo, ficha nutricional e custo |
/app/pedidos, /app/comunidade | Stubs reservados para a fase 2 (ver ROADMAP.md) |
Sem state manager global: o estado de servidor vive em Server Components e o
estado de interface vive na URL ou em useState local.
npm install
cp .env.example .env.local
Abra .env.local e preencha:
Clerk — em https://dashboard.clerk.com, crie uma aplicação, ative e-mail/senha e copie as duas chaves de API keys:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYCLERK_SECRET_KEYSupabase — em https://supabase.com/dashboard, crie um projeto e copie de Project Settings → API:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYEnquanto essas variáveis não estiverem preenchidas, a landing e o design system continuam funcionando normalmente, e as rotas do app mostram uma tela dizendo exatamente o que falta.
Com a CLI do Supabase:
npx supabase link --project-ref SEU_PROJECT_REF
npx supabase db push
npx supabase db execute --file supabase/seed.sql
Sem a CLI, o caminho manual funciona igual: abra o SQL Editor do painel do Supabase e execute, nesta ordem, o conteúdo de
supabase/migrations/20260907120000_esquema_inicial.sqlsupabase/migrations/20260907120100_politicas_rls.sqlsupabase/migrations/, em ordem de nomesupabase/seed.sqlO seed é idempotente: pode rodar de novo sem duplicar nada.
O pagamento é do Asaas, com checkout dentro do app:
o cliente paga em /app/assinatura, no cartão, no Pix ou no boleto, sem ir para uma
página externa. Enquanto ASAAS_API_KEY não existir, o checkout aparece
desligado e nada é bloqueado — o app roda como antes.
$aact_hmlg_
ou $aact_prod_, e o app deduz o ambiente por esse prefixo.https://SEU-DOMINIO/api/webhooks/asaas, com um token de autenticação, e
copie esse token para ASAAS_WEBHOOK_TOKEN. É ele que chega no header
asaas-access-token de cada aviso.20260929120000_assinaturas.sql antes de publicar a
chave: sem a tabela subscriptions, o checkout quebra.Em sandbox, o Asaas não alcança localhost. A tela do Pix contorna isso
perguntando ao Asaas se a cobrança foi paga enquanto está aberta; para testar
o webhook de verdade, exponha a porta local com um túnel (ngrok, cloudflared)
e cadastre essa URL.
Para cobrar no cartão em produção, o checkout transparente precisa ser liberado pelo gerente da sua conta no Asaas. Em sandbox ele já funciona.
No Pix, o checkout tenta primeiro o Pix Automático (um QR que paga o
primeiro período e autoriza os débitos seguintes no banco do cliente). O Asaas
só libera o Pix Automático para conta de Pessoa Jurídica com CNPJ ativo há pelo
menos seis meses; enquanto a conta não cumprir isso, o checkout cai sozinho no
Pix comum, e o motivo aparece nos logs da Vercel como [pix-automatico]. Para
o app saber quando o cliente autoriza ou cancela no banco, o webhook precisa
dos eventos PIX_AUTOMATIC_RECURRING_AUTHORIZATION_* e
PIX_AUTOMATIC_RECURRING_PAYMENT_INSTRUCTION_REFUSED.
O Asaas já avisa o cliente por e-mail e SMS: 10 dias antes, no vencimento,
no dia do atraso e 7 dias depois. No cartão, ele tenta cobrar até seis vezes
em dois dias. O app completa com o que só ele pode fazer
(lib/pagamentos/inadimplencia.ts):
| Quando | O que acontece |
|---|---|
| 3 dias antes | faixa no topo do app, só para Pix comum e boleto, com "Pagar agora" |
| vencimento + 3 dias | fim da carência: ferramentas bloqueiam, a trilha continua aberta |
| vencimento + 15 dias | a rotina diária cancela a assinatura no Asaas |
Pagando antes do cancelamento, o acesso volta na hora. Os dados nunca são
apagados. A rotina também cancela assinaturas abertas e nunca pagas há 15
dias (quem gerou um Pix ou boleto e desistiu). Ela roda todo dia às 9h de
Brasília pelo Vercel Cron (vercel.json) e exige a variável CRON_SECRET;
sem ela, a rota responde 503 e não cancela nada.
Contas que usam o app completo sem pagar (o dono, contas de teste) ficam na
tabela access_grants, por e-mail. O e-mail é dado, não código — entra direto
no SQL Editor do Supabase:
insert into public.access_grants (email, motivo)
values ('[email protected]', 'Conta de teste');
Para tirar, marque a revogação em vez de apagar, e fica o registro:
update public.access_grants set revogado_em = now()
where email = '[email protected]' and revogado_em is null;
O e-mail é sempre em minúsculas, e valido_ate opcional limita a cortesia a
uma data.
npm run dev
Abra http://localhost:3000.
npm run dev
npm run build
npm start
npm run lint
npm run typecheck
npm run icons
npm run icons regenera os PNGs do PWA a partir do desenho da marca em
scripts/gerar-icones.mjs. Rode depois de mexer nas cores da identidade.
app/
(auth)/ telas do Clerk com layout próprio
app/ área logada, protegida pelo middleware
design-system/ vitrine visual, bloqueada em produção
onboarding/ quiz de quatro passos
components/
ui/ primitivas do shadcn/ui, reescritas
app/ casca da área logada
landing/ seções da página de vendas
...
lib/
calculos/ regras de macros e de precificação
data/ leitura do banco
actions/ Server Actions, todas validadas com Zod
validacao/ schemas Zod compartilhados
content/ copy e conteúdo estático
supabase/
migrations/ schema versionado
seed.sql conteúdo real em português
types/
database.ts tipos do banco
Regra que vale para o projeto inteiro: nenhum componente carrega dado
embutido. Tudo vem do banco ou de um módulo em lib/.
Os tokens vivem em app/globals.css e são a única fonte de cor, espaço e raio.
Nenhum componente escreve cor direto — o tema escuro é uma troca de valores, não
uma segunda folha de estilo.
opsz, WONK e SOFT ativos--primary) é a cor de ação--accent) aparece só em progresso e badges, nunca em botãoA página /design-system mostra tudo isso em funcionamento e serve de checklist
antes de subir qualquer tela nova.
lib/data e lib/actions.auth.jwt() ->> 'sub', o
identificador do Clerk. Se você registrar o Clerk como provedor de terceiros
no Supabase (Authentication → Sign In / Providers), o acesso direto pelo
navegador também fica seguro. Sem essa integração, as chaves públicas não leem
nenhuma linha — que é o comportamento desejado.asaas-access-token com comparação de
tempo constante e recusa 401 sem ele. Cada evento é gravado uma vez em
asaas_events, então reentrega do mesmo aviso não credita duas vezes..env.example em Settings → Environment
Variables, com NEXT_PUBLIC_APP_URL apontando para o domínio de produção.
ASAAS_API_KEY e ASAAS_WEBHOOK_TOKEN são segredos: marque como Secret e
nunca use o prefixo NEXT_PUBLIC_ neles.npm run build) já funciona sem ajuste.Em produção /design-system responde 404 por decisão de projeto.
Os valores nutricionais vêm de tabelas de composição de alimentos e são estimativas técnicas para orientar cardápio e comunicação com o cliente. Não substituem laudo laboratorial exigido em rotulagem obrigatória.
Os três depoimentos da landing são fictícios e estão marcados como tal na própria página. Substitua por depoimentos reais, com autorização de uso, antes de publicar.