K
Kodama Vault
knowledge hub
Vault
HomeBoardMap of ContentChatConversasAuditoria
Agentes
AgentsIssuesCriar IssueTerminalPreviews
Sistema
MCPSetup MCPSettings
Brain
amazon-arb-scoutcode-standards-auditordesign-master (subagent)erica-nardi-auditorfeature-auditorGlobal agent instructionskodama-hub-auditorAgente: kodama-hub-launch-qalanding-page-architect (subagent spec)meta-campaign-builder (subagent spec)need-context-auditorprospek-blog-auditor — gate editorial do blog do Prospekprospek-blog-author — autor do blog do Prospekprospek-campaign-manager — gerente de campanhas do Prospekprospek-content-director — diretor de conteúdo diário do blogProspek Demo RecorderSubagent — prospek-marketing-creativeprospek-qaprospek-social-producerprospek-social-publisherprospek-social-strategistroblox-sim-buildersageland-auditor (subagent spec)seo-geo-optimizerteam-leadervek1-auditor — subagent specvek1-styleguide-auditor
Análise custos migração — evitar senha no payloadLevantamento fluxo registro + duplicados StripeRelatório segurança + pentes finos (Cláudio)Revisão security concerns e race conditionsMagic link / esqueceu senha via SupabaseCorrigir erros pós-upgrade TypeScriptTestar PRs do agente Vault para mergeAnálise de 3 issues para iniciarErro no terminal do VSCodePR #173 — aguardando aprovação do LeoTestar fluxo ponta a ponta — criação de clients no StripePR #172 — testar e subir correção de funções deprecatedPitch de vendas SaaS — agendar call de conversãoOrganizar issues e bugs rápidos para a semanaMerge PR cadastro-novo — funcionalidades e correçõesCorrigir bugs PR #173 e #172 — image domainsPR mesosóico — página de acesso mobile + segurança OTPRefatoração de códigos — PR #202Ajustes em PRs abertos de ontemEstudo de jornada de compra e técnicas de fechamentoDefinir preço e entregável do produtoProspecção de reuniões para esta semanaAgente anti AI slop — centralização de conhecimento ConnfitPR #179 — resolver conflitos e erros de teste CLIAlinhamento de preços e usos da ConffitFix adicional para PR #183 — perfil do usuárioCorrigir estilização da Connfit para identidade visualSubir modificações no copy da ConnfitCriação de 4 campanhas no Meta AdsRevisão de PRs do GilinesExploração do Roblox EditorRelatório João — devolutiva TikTok ShopReunião presencial Zassi Uniformes — diagnóstico automaçõesCriar repositório de diagnósticos e relatórios de entrevistasDiagnóstico da ZassiGeração de relatórios para reuniões de fechamentoProposta Zassi — apresentação amanhãProspecção — Clínica Odontológica Dr. ButAlinhamento com ADRIANO sobre produtos e simulaçãoCombinar com Lauro os produtos do diagnósticoSolicitar recursos (vbucks) à INEDIA/ObiettoAnálise de issues do Kodama-Hub e início pelo vaultIssue KH03 — estudo de abordagem DockerKH-12 — script de correção e PR no kodama-hubTeste de despacho e agentes da vaultRemover issues 7, 9 e 10 do fluxo de trabalhoKH-15 — testar e preparar para Gilini testar em prod (Kodama Hub)VEK-1 — testar no WhatsAppBot local — testar localmenteEscrever issues para replicação do modelo de LPSwarm — modelar landing pages para tecnologias concorrentes (Google Ads)Configurar Docker no Windows para tarefas do Hub LisaLP de Suplementos — iniciar issue #96 (Vek)PR #93 git — subir para testar em prodPR #94 git — despachar agents pelo vaultTestes e documentação de bugs no site VEKPR #98 de LP — cosméticosRemover issues concluídas do board (#5, #10, #11, #12, #13)PRs de comparação vek1 vs LPs — correções e mergeDocumentação de uso e bugs na Vek1Criação de issues via Vault — bugs VekFix bug redirect botão Produtos na sidebar colapsada (vek)Planejamento de issues e mini sprint no site da Vek1facilitabusca — cron de fetch parado desde 05/08 (RESOLVIDO 11/08)
kodama-watchdog — self-heal + alerta pra todos os projetos da VPS HermesVPS Hermes — acesso e estrutura
Memory namespacing (multi-user)
OpenSpec -- Spec-Driven Development no VaultPlano de Teste — OpenSpec Vault Persistence
CaumzitoNyxzZanini
Sessions — rapidopagoRapidoPago — Design (plataforma de cardápios digitais)
Amazon Arb (atacado→varejo BR)
Claude Code — Setup MCP VaultClaude Desktop — Setup MCP Vault (remote)VS Code + Copilot — Setup MCP Vault
Skill — Carousel Designer (Paper Style)carousel-paperPlugin marketing-skills (coreyhaines31/marketingskills)
Standup 2026-05-14Standup 2026-05-15Standup 2026-05-16Standup 2026-05-17Standup 2026-05-18Standup 2026-05-19Standup 2026-05-20Standup 2026-05-21Standup 2026-05-22Standup 2026-05-25Standup 2026-05-26Standup 2026-05-27Standup 2026-05-28Standup 2026-05-29Standup 2026-06-01Standup 2026-06-02Standup 2026-06-03Standup 2026-06-05Standup 2026-06-11Standup 2026-06-15Standup 2026-06-16Standup 2026-06-17Standup 2026-06-18Standup 2026-06-22Standup 2026-06-23Standup 2026-06-29Standup 2026-06-30Standup 2026-07-01Standup 2026-07-02Standup 2026-07-03Standup 2026-07-06Standup 2026-07-07Standup 2026-07-08Standup 2026-07-09Standup 2026-07-10Standup 2026-07-13Standup 2026-07-14Standup 2026-07-15Standup 2026-07-16Standup 2026-07-17Standup 2026-07-21Standup 2026-07-22Standup 2026-07-23Standup 2026-07-28Standup 2026-07-29Standup 2026-07-30Standup 2026-07-31Standup 2026-08-03Standup 2026-08-06Standup 2026-08-07Standup 2026-08-10Standup 2026-08-11Standup 2026-08-12Standups
MOCStandup 2026 07 23Welcome
v0.3
K
Kodama Vault
brain / projects / rapidopago

RapidoPago — Design (plataforma de cardápios digitais)

RapidoPago — Design

Data: 2026-08-07 · Status: aprovado em brainstorm, aguardando plano de implementação

SaaS self-serve multi-tenant de cardápios digitais: lojista cria conta, monta a loja, cadastra produtos e recebe pedidos com pagamento online. Cada loja vive num subdomínio wildcard próprio com SEO forte.

Decisões de produto

Decisão Escolha
Modelo SaaS self-serve (qualquer pessoa cria loja)
Escopo MVP Vitrine + carrinho + pedido + pagamento online
Modalidades Delivery (zonas/taxas) + Retirada. Mesa/QR fica pra depois
Domínios {slug}.rapidopago.* (wildcard) no MVP; domínio próprio do lojista = fase 2 (resolução por hostname já pronta)
Customização Temas prontos (3-5 layouts) + tokens de marca (cores, logo, capa, fontes, ordem de seções)
Pagamento do pedido Pix via Woovi + cartão via Stripe Connect Express + "na entrega" opcional. Dinheiro vai direto pra loja, sem application fee
Monetização Assinatura mensal via Stripe Billing (Grátis limitado / Pro com trial)
Hosting VPS dedicada 147.93.1.106 (não é o Hermes), Docker Compose. Credencial em C:\Users\User\.cardapio-vps-credentials

Pendência aberta: TLD do domínio ainda não comprado (rapidopago.com.br? .com?) — confirmar e registrar na GoDaddy antes do setup DNS. No spec, rapidopago.* = o domínio que for escolhido.

Arquitetura

Monorepo Bun workspaces em C:\Users\User\rapidopago:

  • apps/web — Next.js 16 (App Router). Serve marketing (rapidopago.*), admin (app.rapidopago.*) e cardápios públicos ({slug}.rapidopago.*) num app só. Middleware lê Host → resolve tenant → rewrite pra /_sites/{slug}.
  • apps/api — Elysia (Bun). Pedidos, webhooks Stripe/Woovi, SSE do painel de pedidos, gating de plano.
  • packages/db — Drizzle + Postgres (schema único, tenant = store_id em toda query; sem RLS, API é a única camada de acesso).
  • packages/shared — tipos + cálculo de carrinho/preço/taxa (usado no web e na api).

Alternativas descartadas: Astro pro público (3 apps, tokens duplicados, ganho de perf não paga a complexidade — ISR já entrega Lighthouse 90+); tudo em Next API routes (webhooks + SSE + jobs desajeitados; padrão da casa é Elysia).

Modelo de dados

  • users — lojista, auth via Better Auth (email+senha; Google depois)
  • stores — tenant: slug único (= subdomínio), custom_domain (null até fase 2), nome, WhatsApp, endereço, theme jsonb (tema + tokens), hours jsonb, delivery_config jsonb (zonas/bairros com taxa, pedido mínimo), formas de pagamento aceitas
  • categories — nome, sort, ativa
  • products — nome, descrição, preço, imagem, ativo/esgotado, sort
  • option_groups / options — adicionais/variações reutilizáveis (single/multi, min/max, delta de preço)
  • orders — código curto, cliente jsonb (nome, WhatsApp, endereço), tipo delivery/retirada, items jsonb snapshot (preço congelado), subtotal, taxa, total, payment_method, payment_status (awaiting/paid/failed/refunded), order_status (awaiting_payment → received → confirmed → preparing → out_for_delivery|ready → done | canceled)
  • subscriptions — store ↔ Stripe Billing (customer, subscription, plano, status, trial_ends_at)
  • payment_accounts — por loja: Stripe Connect account id + status onboarding; conta/subconta Woovi

Wildcard, roteamento e SEO

DNS/TLS: *.rapidopago.* A record → VPS (GoDaddy API já disponível). Cert wildcard Let's Encrypt DNS-01 (certbot + GoDaddy API, renovação cron). nginx: wildcard vhost → web; /api/* e /webhooks/* → api; /uploads/* estático.

Roteamento: middleware Next por Host. Slugs reservados: app, www, api, admin, mail, etc. Domínio próprio (fase 2) = mesmo lookup por hostname, zero refactor.

SEO por loja:

  • ISR com revalidateTag(store) ao editar — HTML estático no primeiro byte
  • Metadata dinâmica ({Loja} — Cardápio | Delivery em {Cidade}), OG image da capa
  • JSON-LD Restaurant + hasMenu → MenuSection/MenuItem com preços
  • sitemap.xml/robots.txt por subdomínio, canonical por hostname
  • Página de produto com URL própria (/{categoria}/{produto-slug}) pra long-tail
  • next/image + sharp local (WebP/AVIF)

Checkout e pagamentos

  • Carrinho client-side (Zustand + localStorage por loja). Checkout: nome + WhatsApp; delivery valida zona/taxa; retirada só dados.
  • Pedido criado antes de pagar (awaiting_payment), expira em ~15min sem confirmação.
  • Pix (Woovi): charge via API → QR + copia-e-cola → webhook confirma (+ poll leve). Subconta/App ID da loja registrado no onboarding de pagamentos.
  • Cartão (Stripe Connect Express): onboarding hosted (KYC no Stripe), destination charge na conta da loja, Payment Element no checkout.
  • Assinatura (Stripe Billing): Checkout + Customer Portal, trial no Pro, gating por plano.
  • Webhooks (Elysia): /webhooks/stripe e /webhooks/woovi, idempotentes (event id gravado) → atualizam payment_status → SSE pro painel. Reconciliação por poll 5min nos awaiting_payment cobre webhook perdido.

Admin (app.rapidopago.*)

Onboarding wizard: conta → nome+slug (preview ao vivo, valida unicidade/reservados) → tema+marca → primeiros produtos → WhatsApp/endereço/horários → publicado. Pagamentos online ativam depois sem travar o wizard.

Gestão: CRUD categorias/produtos com drag-sort, toggle ativo/esgotado, duplicar produto, grupos de opcionais reutilizáveis, upload de imagem (sharp resize/WebP, nginx serve), horários por dia (fora do horário = banner "fechado, abre às X"), zonas de entrega, pedido mínimo.

Customização: temas + tokens com preview ao vivo (mesmo componente do cardápio real). Salvar → revalidateTag(store).

Painel de pedidos: SSE, som + badge em pedido novo, colunas por status com transição de 1 clique, botão WhatsApp do cliente, cancelamento com motivo + estorno via API (Stripe refund / Woovi refund).

Gating: grátis = limites (nº produtos etc.); inadimplente = cardápio continua no ar, admin bloqueia edição.

Erros

  • Copy nunca técnica: cliente vê "não conseguimos confirmar seu pagamento, tente de novo"; erro cru só em log de servidor.
  • Pedido pago com webhook falho → reconciliação marca pago retroativo.
  • Loja inexistente/suspensa → 404 amigável (não vaza existência de slug).

Infra e deploy

  • Docker Compose na VPS: web (Next standalone), api (Elysia/Bun), postgres, redis (cache, pub/sub do SSE, rate limit), nginx.
  • Primeiro acesso: SSH key, desabilitar password auth, ufw (22/80/443), fail2ban.
  • Backup: pg_dump diário + tar de uploads, retenção 7 dias (offsite depois).
  • Deploy: push main → GitHub Action → SSH → docker compose up -d --build.

Testes

  • Vitest packages/shared: cálculo de carrinho com opcionais, taxa por zona, pedido mínimo, expiração.
  • Vitest apps/api: webhooks idempotentes (duplicado, fora de ordem), gating de plano.
  • agent-browser smoke: cardápio → carrinho → checkout Pix mock.
  • Pós-MVP: subagent auditor no padrão dos outros projetos.

Decisões pós-launch (2026-08-08)

  • Redesign: design system "comanda de cozinha" (shadcn/ui, paleta brasa/carvão/sal/azulejo/mostarda AA, Bricolage + Inter + JetBrains Mono, cards-comanda com serrilha). Agente design-master criado e aplicado (auditoria WCAG AA completa).
  • Rascunho do cardápio é client-side (jotai): decisão do user — banco guarda SÓ o publicado. Edições vivem em atomWithStorage no navegador; preview (celular na página de produtos) renderiza direto dos atoms, sem rede; "Publicar alterações" = um PUT /stores/menu com reconcile replace-all (UUIDs gerados no cliente, upserts escopados no tenant). Modelo anterior (snapshot published_menu no banco) foi implementado e revertido — colunas dropadas na migration 0002.
  • Trade-off aceito: rascunho não cruza dispositivos (localStorage).

Fora do MVP (fase 2+)

Domínio próprio do lojista (Caddy on-demand TLS ou certbot por domínio + verificação DNS), pedido em mesa via QR, impressão de pedido, cupons/promoções, relatórios de vendas, app/PWA de gestão, application fee por pedido como alavanca extra.

notas relacionadas
carregando…