# NALU AI — Site Brief > Reference doc for context after compaction. Last updated: 2026-05-09. > Comics/quadrinhos sections: placeholders only — user generates images in Gemini separately. > APIs: ALL 12 validators already implemented and functional in the backend. ## Stack - Razor Pages + TailwindCSS + HTMX (inside same ASP.NET Core 9 project) - Stripe (analyze qrrapido for patterns — price_data dynamic, idempotency keys) - Database: TBD (confirm schema before implementing) - MCP: Streamable HTTP primary + SSE fallback ## Pages ``` / Landing (one-page, all sections) /playground Public test, no auth, 50 calls/IP/day /docs Docs hub /docs/quickstart /docs/api-reference /docs/mcp /docs/state-machine State machine concept + Mermaid diagrams /validadores Grid of 12 validators /validadores/{id} Individual validator page /casos Use case hub (SEO) /casos/extrator-de-nome /casos/parcelas-48x /casos/cep-via-conversa /casos/cpf-em-chatbot /precos Plans + Stripe checkout /login /painel Dashboard + keys + plan + invoices /sobre ``` ## Identity / Branding - Name: **NALU AI** — NAtural Language Understanding - Color rule: NA (Natural) = light color, LU = dark color, same across logo + subtitle - Font: Inter or Plus Jakarta Sans (Google Fonts) - Minimal, developer-friendly, white background - Icons: Lucide (line icons) ## Landing sections (in order) 1. Hero — tagline "Seu chatbot está gravando 'Bom Dia' como nome do cliente" 2. Before/after demo (3 examples: name, parcelas 48x, CEP errado) 3. How it works (3 steps) 4. **[COMIC PLACEHOLDER 1]** — `` 5. Validator catalog grid (Universal 7 + Brasil 5) 6. State machine section — how validators chain into flows 7. **[COMIC PLACEHOLDER 2]** — `` 8. Code snippets (tabs: cURL | JS | C# | Python | n8n) 9. Pricing summary (3 cols) 10. FAQ (5 questions) 11. **[COMIC PLACEHOLDER 3 — optional]** — `` 12. Final CTA + footer ## Plans / Pricing | Plan | Price | Requests/month | |------------|------------|----------------| | Free | R$ 0 | 2.000 (100/day rolling) | | Indie | R$ 49/mês | 25.000 | | Pro | R$ 149/mês | 100.000 | | Enterprise | Consulta | 500k+ | ## Playground - Endpoint: `POST /v1/playground/extract/{validator}` (no auth, rate limit by IP) - Rate limit: 50 calls/IP/day — on exceed: prompt to sign up - Shows side-by-side: "bot tradicional" vs "NALU AI" - Dropdown with all validators + pre-loaded examples from `.md` files - "Ver código" button shows cURL/JS/C# equivalent ## Stripe (CRITICAL — replicate qrrapido patterns) - `price_data` dynamic — NO hardcoded `price_id` - Idempotency keys on all mutations - Webhooks with idempotence table (`webhook_events` with `event_id` PK) - Mandatory events: checkout.session.completed, subscription.updated, subscription.deleted, invoice.payment_failed - Validate `Stripe-Signature` header on every webhook ## API Keys - Prefix: `nalu_` + hash - Show full key ONCE after creation only - Store HASH only (not plaintext) - Allow multiple keys per account - Soft-delete for revocation (keep for audit) - Rate limit tied to PLAN, not to individual key ## MCP / Smithery - Analyze qrrapido for ALL adjustments made for Smithery compatibility - Transport: Streamable HTTP (`POST /mcp`) primary, SSE fallback (`GET /sse`) - Header required: `MCP-Protocol-Version: 2025-11-25` - `smithery.yaml` with API key config schema - CORS: allow Smithery origin + MCP client origins ## Database schema (to confirm before implementing) Tables needed: - `users` (id, email, plan, stripe_customer_id, created_at) - `api_keys` (id, user_id, key_hash, prefix, name, revoked_at, created_at) - `usage` (id, api_key_id, date, count) - `webhook_events` (event_id PK, event_type, processed_at) ## SEO pages (/casos) Template per page: 1. H1: "Como [resolver X] em chatbots" 2. Intro: real problem story 3. "O bug em ação" — dialogue diagram 4. "Como NALU resolve" — API response 5. Code tabs 6. CTA → playground ## Priority order Landing → Playground → Precos+Stripe → Painel → Docs → Casos ## DO NOT implement now (V2+) - Detailed call logs - Custom validators - Advanced analytics - Team management - Comic images (user generates externally)