Svelte Commerce
A standalone open-source storefront built with SvelteKit, headless across 26 commerce backends. MIT licensed.
Pedidos digitais por QR Code. Menos espera. Mais serviço.
Translation pending
CommerceTypeScript · JavaScriptGitHub @rosryfernandes-cloudOnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Plataforma SaaS B2B de pedidos à mesa para restaurantes em Portugal, com integração ao POS (ZoneSoft ZS Rest, via adaptador abstrato) e modelo de comissão de 1% sobre o valor faturado.
Estado: Fase 3 em curso — o cliente lê o QR/NFC, escolhe na ementa e envia o pedido; o pedido fica gravado em Postgres e uma fila entrega-o ao POS (MockPOS), com reenvios e rate limit.
Requisitos: Node.js ≥ 20.9. Não é preciso instalar Postgres: sem DATABASE_URL, a app usa PGlite em .data/pglite (apague a pasta para recomeçar).
npm install
npm run check # typecheck + testes + build de produção
npm run dev # http://localhost:3000
npm run demo:urls # URLs das 10 mesas de demonstração
Abra http://localhost:3000 (página comercial da MESVIO) ou http://localhost:3000/demo para escolher uma mesa de demonstração, ou vá diretamente a um URL de mesa (ex.: /m/jG6WQHgwr4fQ5qQEOKtZJw).
/central: todos os restaurantes, pedidos e comissões do mês (estimativa sobre o valor sem IVA dos pedidos confirmados), alertas (pedidos que não chegaram ao POS, POS com falhas ou por configurar, restaurantes sem dono ou sem mesas) e Novo restaurante (empresa, espaço, POS, comissão, mesas e espreguiçadeiras com QR Code, e convite ao dono). Cada restaurante tem a sua ficha, com mais lugares, outros donos e a folha de QR Codes para imprimir.
platform_admins), com 2FA obrigatório (TOTP: Google Authenticator, 1Password…), configurado com um código de ativação de uso único dado pelo script (fora do email). Segredos cifrados com PLATFORM_SECRET_KEY; cada código só serve uma vez; 5 tentativas a cada 5 min; sessão verificada de 8 h. Quem não é administrador vê "não encontrado".npm run admin:criar, admin:repor-2fa, admin:remover (ver docs/14-PUBLICAR.md). Em desenvolvimento entra-se como "Paula (plataforma, demo)".O cliente vê a ementa, o pedido e a conta em português ou inglês: telemóveis em português abrem em português, todos os outros em inglês, e há um seletor na ementa (a escolha fica num cookie). Botões, avisos, alergénios e etiquetas estão em src/lib/i18n/; pratos e categorias vêm da tabela menu_translations (por restaurante, com RLS). A demo tem inglês completo. O POS e o painel continuam em português.
Passo a passo (domínio, Supabase, GitHub, Vercel) em docs/14-PUBLICAR.md.
Identidade, cores, logótipos e regras de uso em docs/13-MARCA.md. Os nomes internos (pasta restaurante-saas, tabelas, chaves de armazenamento mesa-digital:*) mantêm-se para não quebrar dados existentes.
/painel (ou o link em /demo). Com a Supabase configurada, entra-se com um código de 6 dígitos enviado por email (só pessoas convidadas). Sem Supabase (desenvolvimento), escolhe-se um utilizador de demonstração: Ana (dona), Bruno (gerente) ou Carla (staff).
menu_images, RLS) e servida com cache permanente em /api/imagens/<id>. Tem prioridade sobre a foto do POS./painel/qr): imprimir e gerar um QR novo se um for fotografado e usado de fora (o antigo deixa logo de funcionar).Cada lugar tem um modo: as mesas pagam a conta no fim; as espreguiçadeiras (zona "Praia" na demo) pagam cada pedido ao pedir. O botão do carrinho passa a "Pagar e pedir"; o pedido fica "por pagar" e só segue para a cozinha quando o pagamento é confirmado. Sem pagamento em 15 min, é cancelado. No painel, as mesas aparecem agrupadas por zona e os pedidos por pagar num grupo à parte.
/m/[token]/conta (botão "Conta da mesa" no topo da ementa): todos os pedidos da mesa desde que abriu, de todos os telemóveis, com o total. Com pagamentos ligados no painel (separador Mesas), o cliente paga o que falta com Apple Pay, MB WAY ou cartão; a mesa aparece "Paga" no painel. Sem chaves Stripe (desenvolvimento), o pagamento é simulado.
npm run dev -- -H 0.0.0.0 (telemóvel e computador na mesma rede Wi-Fi).http://<IP-do-computador>:3000/qr — os QR Codes passam a apontar para esse endereço.Para NFC: grave o URL da mesa (mostrado por baixo de cada QR) numa etiqueta NTAG213/215 como registo URI (ex.: app NFC Tools).
/m/[token] (ementa + carrinho guardado no telemóvel) → POST /api/orders (cabeçalho Idempotency-Key; rate limit; o servidor recalcula preços e grava pedido + tarefa na mesma transação) → fila outbox (envio ao POS, até 8 tentativas em ~3 min) → /m/[token]/pedido/[id] (estado; "Confirmado" só com aceitação do POS).
docs/ PRD, arquitetura, BD, integração POS, riscos, plano, decisões, deployment
src/app/ Next.js App Router
page.tsx Índice de demonstração (10 mesas)
m/[token]/ Ementa do cliente + carrinho (token seguro da mesa)
m/[token]/pedido/[id]/ Estado do pedido
api/orders/ Criar pedido (POST) e consultar estado (GET)
api/cron/outbox/ Processar a fila a partir de um cron (alojamento serverless)
qr/ Folha imprimível de QR Codes / URLs NFC
painel/ Painel do staff (entrada por email/código) + api/painel/*
api/health/ Health check
src/components/menu/ Componentes da ementa
src/components/order/ Carrinho, detalhe de produto, estado do pedido
src/components/staff/ Painel do staff
src/lib/ Utilitários (dinheiro, IVA, preço de variantes/extras)
src/server/ Domínio (só servidor)
db/ Schema Drizzle (multi-tenant) e cliente
pos/ PosAdapter, MockPOS, esqueleto ZoneSoft
menu/ Serviço de ementa por mesa
orders/ Criação de pedidos, idempotência, fila de envio ao POS (outbox)
security/ Rate limit e pseudonimização de IP
auth/ Supabase Auth, modo dev, convites
staff/ Contexto e permissões do painel, ações do staff, equipa
db/tenant.ts withTenant: cada pedido corre com RLS no restaurante certo
catalog/ Esgotados do painel aplicados ao catálogo do POS
tables/ Tokens de mesa
commissions/ Motor de comissões
scripts/ Utilitários de desenvolvimento