The Office RPG — onde reuniões são masmorras e e-mails são armadilhas.
🎮 Jogar agora · 📖 Como funciona · 🛠️ Self-hosting · 🎲 Mecânicas · 📋 Changelog
Corporate Quest é um RPG de mesa digital ambientado no mundo corporativo. Você interpreta um executivo navegando reuniões absurdas, conflitos políticos e crises de carreira — com mecânicas de dado d20 estilo D&D e narração totalmente gerada por IA.
Cada sessão é única: a IA improvisa NPCs, diálogos e consequências baseadas nas suas escolhas. Nenhum encontro é igual ao anterior.
- 🎭 Narração 100% por IA — um mestre de RPG digital que se adapta ao seu estilo
- 🎲 Dados d20 e 2d10 — sistema de check com críticos, fumbles e vantagem/desvantagem
- 🧑💼 6 classes corporativas — PM, Engineer, Designer, Data Analyst, Sales e Manager
- 🗺️ 12+ encontros — de dailys que viram tribunal a leaks na imprensa
- ⚡ Sistema de energia — burnout real que afeta suas rolagens
- 🏛️ Capital político — gaste para comprar bônus antes de cada encontro
- 🔌 Multi-LLM — OpenAI, Anthropic, Google Gemini, Ollama ou custom
O onboarding em 7 passos guia você pela criação da sua "ficha corporativa":

Encontro em andamento — narrativa por IA, opções de ação com DC e tags de atributo, ficha na sidebar
O gameplay segue o formato de RPG de mesa digital:
- O mestre (IA) narra a cena com NPCs, diálogos e descrições
- Você escolhe sua ação entre as opções sugeridas ou digita uma ação criativa livre
- Um dado é rolado contra a DC do check — sucesso, falha ou crítico
- A narrativa avança baseada no resultado, consumindo energia
- Após todas as fases, você recebe XP, Capital Político e Reputação
| Classe | D&D ≈ | Primário | Bônus | Energia | Flavor |
|---|---|---|---|---|---|
| 📋 PM | Bard | INF | +2 INF, +1 AWA | 10 | "Você não escreve código nem fecha deal, mas sem você nada acontece." |
| 💻 Engineer | Wizard | TEC | +3 TEC, +1 EXE | 8 | "Você constrói o que outros só sonham. E conserta o que outros quebram." |
| 🎨 Designer | Sorcerer | CRE | +3 CRE, +1 INF | 10 | "Você vê o mundo como deveria ser." |
| 📊 Data Analyst | Cleric | TEC | +2 TEC, +2 AWA | 10 | "Enquanto outros opinam, você sabe." |
| 🤝 Sales | Rogue | INF | +3 INF, +1 CRE | 12 | "Você promete a lua. O resto é problema de produto." |
| 🛡️ Manager | Fighter | RES | +3 RES, +1 INF | 12 | "Você não brilha. Você faz os outros brilharem." |
| Atributo | Dado | O que mede |
|---|---|---|
| EXE — Execução | d20 | Velocidade, entrega, operacional |
| INF — Influência | d20 | Persuasão, negociação, política |
| TEC — Técnica | d20 | Profundidade técnica, código, dados |
| RES — Resiliência | d20 | Resistência a burnout e pressão |
| CRE — Criatividade | d20 | Pensamento lateral, soluções inesperadas |
| AWA — Percepção | d20 | Leitura de sala, timing político |
A energia é o recurso mais importante — ela limita quantas ações você pode tomar antes de entrar em colapso.
| Estado | Condição | Efeito |
|---|---|---|
| ✅ Normal | > 30% de energia | Sem penalidade |
| ≤ 30% de energia | Disadvantage em todos os checks | |
| 🔥 Burnout | 0 de energia | Disadvantage + penalidade −3 |
- Check normal: −1 energia
- Nat 20 (crítico): 0 energia (flow state)
- Nat 1 (fumble): −2 energia (esforço desperdiçado)
Antes de cada encontro, você pode gastar Capital Político para comprar bônus táticos:
- Bônus passivos — modificadores permanentes durante o encontro
- Bônus ativos — poderes com usos limitados (re-rolls, vantagem, etc.)
- Tendência — escolha entre ético, neutro e antiético para desbloquear bônus diferentes
pressureScore = level − reputation
Quanto maior a pressão, mais hostil o ambiente:
- Pressão baixa → NPCs amigáveis, DCs mais baixos
- Pressão alta → ameaças de PIP, REDACTED, reuniões com o Board
- Pressão máxima → encontros podem acabar com REDACTED por justa causa
O jogo tem 12 encontros com dificuldade progressiva. Cada um é narrado pela IA de forma única:
| Encontro | Dificuldade | Level mín. | XP | Descrição |
|---|---|---|---|---|
| A Daily que Virou Tribunal | 🟢 Fácil | 1 | 25 | Uma standup que escala quando um bug é descoberto |
| A Reunião que Podia Ser um Email | 🟢 Fácil | 1 | 20 | 2h sem pauta. Sobreviva ou transforme em algo útil |
| O Deploy de Sexta-Feira | 🟡 Médio | 1 | 30 | Alguém quer deployar às 17h de sexta |
| PR que Quebrou Produção no Natal | 🟡 Médio | 2 | 35 | Véspera de Natal, 20h. Produção caiu |
| Hackathon Corporativo | 🔴 Difícil | 2 | 40 | 24h para montar time, projeto e apresentar |
| All-Hands com Layoff Surpresa | 🔴 Difícil | 3 | 50 | CEO convocou all-hands, rumores de REDACTED |
| Cliente VIP no WhatsApp do CEO | 🔴 Difícil | 3 | 45 | Áudio de 7min do maior cliente, 23h |
| Auditoria Externa Sem Aviso | 🔴 Difícil | 4 | 55 | Auditores na recepção pedindo acesso a tudo |
| Pitch para o Board com 5min de Aviso | 🔴 Difícil | 4 | 50 | VP "passou mal", você herda o pitch |
| Reorg às 23h59 de Sexta | ⚫ Absurdo | 5 | 65 | Novo chefe, nova área, time desfeito |
| Ex-funcionário Voltou como Seu Chefe | ⚫ Absurdo | 6 | 70 | O cara que você ajudou a demitir voltou. Como VP |
| Vazamento Interno na Imprensa | ⚫ Absurdo | 7 | 80 | Sua mensagem do Slack na capa de um portal tech |
Você pode hospedar sua própria instância com seu próprio Supabase e provedor de LLM.
- Bun (ou Node 18+)
- Conta no Supabase (plano gratuito é suficiente)
- Chave de API de um LLM (OpenAI, Anthropic, Gemini, etc.) ou Ollama rodando localmente
git clone https://github.com/leonardovalim/corporate-quest.git
cd corporate-quest
bun installcp .env.example .envEdite .env com seus valores:
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=your_supabase_anon_keyCaso não tenha uma conta, crie sua conta no Supabase em https://supabase.com/ e clique em Connect para copiar as variáveis acima.
- Crie um novo projeto em supabase.com
- Vá em Settings → API e copie a Project URL e a anon/public key
- No painel do Supabase, abra o SQL Editor e execute todas as migrations em ordem:
supabase/migrations/*.sql → execute cada arquivo no SQL Editor (ordem cronológica)
- Acesse
/admincom usuárioadmine senhaadmin(padrão pós-instalação). Vá em Segurança e troque a senha imediatamente.
As migrations criam:
profiles— dados de perfil dos usuáriosgame_saves— saves de partida com RLS (somente o dono acessa)admin_config— configuração global de LLM + senha do admingame_logs— logs de eventos por turno
O jogo suporta múltiplos provedores. Você pode configurar de duas formas:
A) Via painel in-game (recomendado para uso pessoal)
Após fazer login, clique no ícone de engrenagem → Configurações de IA e insira sua chave. A chave fica salva apenas no localStorage do seu navegador.
B) Via painel admin (força um provedor para todos os usuários)
Acesse /admin e na aba Configuração de IA, selecione o provedor e modelo.
| Provedor | Modelos | Necessita chave? |
|---|---|---|
| OpenAI | gpt-4o, gpt-4o-mini, o1, o1-mini | Sim |
| Anthropic | claude-sonnet-4, claude-3-opus | Sim |
| Google Gemini | gemini-2.5-flash, gemini-2.5-pro | Sim |
| Ollama | qualquer modelo local | Não |
| Custom | qualquer endpoint OpenAI-compatible | Opcional |
Para Ollama local, defina a base URL como http://localhost:11434 e o modelo desejado (ex: llama3, gemma4).
bun run dev
# Abre em http://localhost:8080Faça deploy como qualquer app Vite. Configure as variáveis de ambiente no painel da plataforma — não faça commit do .env no repositório.
bun run build # Gera dist/corporate-quest/
├── src/
│ ├── components/ # Componentes React (UI)
│ │ ├── HomeScreen.tsx # Tela inicial / menu
│ │ ├── OnboardingWizard.tsx # Criação de personagem (7 passos)
│ │ ├── GameScreen.tsx # Tela principal de jogo
│ │ ├── NarrativeChat.tsx # Chat com a IA (35KB — o coração do jogo)
│ │ ├── CharacterSidebar.tsx # Ficha do personagem
│ │ └── EncounterResultScreen.tsx # Tela de resultado + próxima aventura
│ ├── game/ # Lógica de jogo pura (sem React)
│ │ ├── types.ts # Tipos TypeScript do sistema
│ │ ├── gameData.ts # Classes, origens, alinhamentos, feats
│ │ ├── encounter.ts # Templates de encontros + seleção ponderada
│ │ ├── dice.ts # Motor de dados (d20, 2d10, vantagem)
│ │ ├── checks.ts # Sistema de checks (DC, energia, status)
│ │ ├── politicalCapital.ts # Sistema de bônus por Capital Político
│ │ ├── leveling.ts # XP, level-up, progressão
│ │ ├── systemPrompt.ts # Prompt do mestre de RPG para a IA
│ │ └── streamChat.ts # Streaming multi-provedor (SSE)
│ ├── hooks/ # React hooks customizados
│ └── integrations/ # Supabase client + auth
├── supabase/
│ └── migrations/ # SQL para criar tabelas + RLS
└── docs/
└── screenshots/ # Prints para o README
graph LR
A[Player] -->|ação| B[NarrativeChat]
B -->|check request| C[dice.ts + checks.ts]
C -->|resultado| B
B -->|contexto + resultado| D[streamChat.ts]
D -->|SSE stream| E[LLM Provider]
E -->|narrativa| B
B -->|atualiza| F[GameContext]
F -->|autosave| G[Supabase]
bun run dev # Servidor na porta 8080
bun run build # Build de produção
bun run lint # ESLint
bun run test # Vitest (execução única)
bun run test:watch # Vitest em modo watch| Camada | Tecnologia |
|---|---|
| Frontend | React 18 + TypeScript + Vite |
| UI | Tailwind CSS + Radix UI / shadcn |
| Backend | Supabase (PostgreSQL + Auth + Edge Functions + RLS) |
| LLM | Multi-provider streaming (OpenAI, Anthropic, Gemini, Ollama, Custom) |
| Testes | Vitest |
- Fork o repositório
- Crie uma branch (
git checkout -b feature/novo-encontro) - Commit suas mudanças (
git commit -m 'Adiciona encontro: nome') - Push para a branch (
git push origin feature/novo-encontro) - Abra um Pull Request
Adicione um template em src/game/encounter.ts:
{
name: 'Nome do Encontro',
description: 'Descrição curta para o card de seleção',
totalPhases: 4,
rewards: { xp: 30, pc: 2, reputation: 1 },
openingPrompt: 'Instrução para a IA iniciar a narração...',
difficulty: 'medium',
minLevel: 1,
}A IA faz o resto — inventa NPCs, diálogos, consequências e rolagens.
GPL v3






