Ecommerce Template
Modern ecommerce template built with Next.js 16, React 19, Drizzle, Better Auth, Supabase, and Stripe.
MenuNext is the platform that allows your restaurant to have its own online store, receive orders and manage the operation.
AI translation
MenuNext é a plataforma que permite ao seu restaurante ter sua própria loja online, receber pedidos e administrar a operação.
CommerceHTML · TypeScriptGitHub @jonathagandrade-157OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Seu restaurante. Sua loja. Seus pedidos. SaaS B2B multi-tenant para restaurantes: cardápio digital, checkout próprio (Pix/dinheiro/cartão) e painel operacional, sem comissão por pedido. Stack: Next.js 16 (App Router) + React 19 + TypeScript + Tailwind CSS 4; Supabase (Postgres + Auth + Storage, com RLS) como backend; Sentry para monitoramento de erros; Vitest para testes unitários. Abra http://localhost:3000. Outros scripts: npm run build, npm run lint, npm test.Read the full README ↗
Seu restaurante. Sua loja. Seus pedidos.
SaaS B2B multi-tenant para restaurantes: cardápio digital, checkout próprio (Pix/dinheiro/cartão) e painel operacional, sem comissão por pedido.
Stack: Next.js 16 (App Router) + React 19 + TypeScript + Tailwind CSS 4; Supabase (Postgres + Auth + Storage, com RLS) como backend; Sentry para monitoramento de erros; Vitest para testes unitários.
cp .env.example .env.local # preencher com as credenciais do projeto Supabase (ver seção abaixo)
npm install
npm run dev
Abra http://localhost:3000.
Outros scripts: npm run build, npm run lint, npm test.
Ver .env.example (todas comentadas). Só as duas do Supabase são obrigatórias:
NEXT_PUBLIC_SUPABASE_URL e NEXT_PUBLIC_SUPABASE_ANON_KEY — projeto Supabase.GOOGLE_MAPS_GEOCODING_API_KEY — opcional; sem ela o frete "Por KM" fica indisponível e a taxa fixa continua funcionando.ASAAS_API_KEY e ASAAS_ENV (sandbox por padrão, ou production) — opcionais; sem a chave, "Assinar plano" mostra um aviso em vez de fingir sucesso. Nunca prefixar com NEXT_PUBLIC_.SUPABASE_SERVICE_ROLE_KEY e CRON_SECRET — só para a cobrança (registro da assinatura provada na API do Asaas e reconciliação diária). Sem elas a cobrança fica desligada. Servidor apenas: nunca prefixar com NEXT_PUBLIC_, nunca commitar.A assinatura do lojista é cobrada pelo Asaas (o pedido do cliente final continua sendo Pix direto, sem gateway). Para operar:
ASAAS_API_KEY (comece pelo sandbox), SUPABASE_SERVICE_ROLE_KEY e CRON_SECRET./master/assinaturas (nome e valor reais, nada é semeado)./master/assinaturas e configure o mesmo valor no webhook do Asaas (Integrações → Webhooks → Token de acesso), apontando para https://<seu-domínio>/api/webhooks/asaas. Sem token salvo, nenhum webhook é aceito. O roteiro de teste ponta a ponta com o sandbox está em docs/asaas-sandbox-e2e.md.npm test roda o Vitest. Os testes cobrem a lógica de src/lib/, o webhook e a rotina de reconciliação do Asaas e a Server Action de assinatura (com dependências simuladas). O vitest.config.ts resolve o alias @/. As demais Server Actions ainda não têm teste automatizado.
Isolamento entre restaurantes (banco): supabase/tests/tenant_isolation.sql verifica RLS e RPCs com quatro personas (dono da loja A, usuário sem loja, master fora da loja e visitante anônimo): ninguém lê nem altera dados de outra loja, o master só enxerga lojas alheias pelas RPCs master_*, e o checkout público recusa produto de outra loja. Cole o arquivo no SQL Editor do Supabase; ele roda numa transação que sempre é desfeita e o relatório vem na mensagem final (RESULTADO: OK | N verificacoes ou RESULTADO: FALHOU ...). Rode-o depois de qualquer mudança em policies ou RPCs. Ele ainda não roda no CI, que não tem banco.
Proteção das colunas de cobrança: supabase/tests/restaurant_billing_columns.sql (145 verificações) garante que nenhum usuário da API (OWNER, STAFF, outra loja ou anônimo) altera plan_id, subscription_status e demais colunas de cobrança de restaurants, que os fluxos legítimos continuam funcionando e que a segunda camada (trigger) barra mesmo com um GRANT amplo. Rode só em banco isolado (ele cria usuários em auth.users); não use contra a produção.
Cobrança de assinaturas: supabase/tests/billing_subscriptions.sql (192 verificações) garante que o acesso pago só é liberado por pagamento confirmado em evento autenticado do provedor: IDs inventados, cobrança pendente, atraso, duplicidade, evento fora de ordem, chargeback, cancelamento com período pago, renovação, reconciliação, webhook inválido, tentativas de OWNER/STAFF, isolamento entre restaurantes e checkout dos clientes intocado. Mesma regra: só em banco isolado. Modelo e regras de manutenção em docs/seguranca/cobranca-de-assinaturas.md.
Papéis OWNER e STAFF: supabase/tests/roles_owner_staff.sql (222 verificações) comprova que o STAFF só opera pedidos e liga/desliga a disponibilidade de produtos e adicionais, no banco (RLS e triggers), nas RPCs e nas Server Actions, e que o OWNER, o checkout público e a venda de balcão seguem funcionando. Regras e camadas em docs/seguranca/permissoes-owner-staff.md. Rode só em banco isolado.
Privilégios de tabela: supabase/tests/table_privileges.sql (153 verificações) garante que anon, authenticated e PUBLIC não têm TRUNCATE, TRIGGER, REFERENCES nem MAINTAIN nas tabelas de public (nem nas futuras), que o DML usado pelo app segue concedido e que service_role e o dono mantêm tudo. Migration: 20261009030000_harden_table_privileges.sql. Rode só em banco isolado.
Todo o schema (tabelas, RLS, RPCs) vive em supabase/migrations/ — esse diretório é a fonte de verdade do estado do banco em produção; qualquer alteração de schema deve ser adicionada ali como uma nova migration (nunca aplicada só em produção sem o arquivo correspondente).
Documentação relacionada: reconciliação do histórico de migrations (versões dos arquivos × versões registradas no Supabase), regras de manutenção das colunas de cobrança e modelo de cobrança de assinaturas.
/loja/[slug]): cardápio com categorias/adicionais/combos, carrinho, checkout e acompanhamento do pedido — sem exigir login do cliente final./painel): dashboard, pedidos (Kanban em tempo real), cozinha (KDS), frente de caixa (PDV), cadastro de produtos/categorias/adicionais/combos, cupons e marketing, clientes, configuração de delivery (inclui zonas por bairro)/horários/pagamentos/aparência, equipe (convites de STAFF), plano e assinatura, e ajuda./painel/plano continua acessível para regularizar). A regra vive no banco (função _restaurant_access_state) e vale também no create_order./master): acesso restrito a quem tem profiles.is_master (só concedível pelo editor SQL do Supabase). Telas reais: dashboard da plataforma, restaurantes (lista e detalhe), assinaturas (planos e token do webhook) e configurações. Ainda em branco: Usuários, Métricas, Suporte e Auditoria.src/app — rotas (App Router): fanpage (/), /cadastro, /onboarding, /convite/[token] (aceite de convite de equipe), /loja/[slug] (loja pública), /painel (lojista), /master (administração da plataforma).src/lib — acesso a dados (tenant.ts, store.ts), Server Actions (lib/actions/) e regras de negócio puras testadas em *.test.ts.src/components/ui — primitivos (Button, Badge, Card, Modal, estados de loading/vazio/erro).src/components/layout — sidebar (com menu mobile), topbar e banner de impersonation do Master.src/components/scaffold — placeholder usado nas rotas ainda não implementadas visualmente.supabase/migrations — schema do banco (ver seção acima).design-reference/stitch — export original do Stitch, preservado como referência visual (ver design-reference/README.md para o mapa tela → rota).