Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Sistema web com login que centraliza pendências de trabalho por categoria (Processos, Empresa BFF, E-mails, Viagens), com quadro estilo Kanban de colunas totalmente customizáveis (criar, renomear, reordenar e excluir), filtros, ditado por voz (inclusive um "ditado inteligente" que organiza uma frase falada nos campos certos) e sincronização automática de e-mails pendentes do Gmail.
Fase 1: uso individual, um único login (painel pessoal — Processos,
Empresa BFF, E-mails, Viagens).
Fase 2 (em construção): aba BFF Fitness — mapa da empresa por setor
(Financeiro, Marketing/Vendas, Estoque/Logística, Clientes, Suporte,
Jurídico, Desenvolvimento de Produto), com login por pessoa e acesso
configurável por setor (/admin/usuarios). Ver seção 9.
@anthropic-ai/sdk, modelo claude-opus-5) — organiza o
texto ditado nos campos certos da pendência ("ditado inteligente")npm install
cp .env.example .env
Preencha o .env:
| Variável | Como gerar |
|---|---|
DATABASE_URL | URL de um Postgres (local, Neon ou Supabase — veja seção 2) |
AUTH_SECRET | npx auth secret ou openssl rand -base64 32 |
TOKEN_ENCRYPTION_KEY | openssl rand -base64 32 |
SEED_USER_EMAIL / SEED_USER_PASSWORD | o e-mail e senha que você vai usar pra logar |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | veja seção 4 (Gmail) — pode deixar em branco por enquanto |
CRON_SECRET | openssl rand -hex 32 |
ANTHROPIC_API_KEY | console.anthropic.com/settings/keys — opcional; sem ela o app funciona normal, só o "Ditar pendência" fica desativado |
Depois:
npx prisma db push # cria as tabelas no banco
npm run seed # cria seu usuário de login
npm run dev # http://localhost:3000
Neon (recomendado, mais simples pra Postgres puro):
postgresql://...) — já vem com
?sslmode=require, mantenha assim.DATABASE_URL no .env (local) e depois nas variáveis de
ambiente da Vercel (produção).Supabase (alternativa, se já usa Supabase por outro motivo):
?sslmode=require.Depois de configurar, rode npx prisma db push para criar as tabelas.
barrofelipe-gif/dream, branch claude/painel-pendencias-jcv4lq — dá
pra abrir um PR pra main/produção quando estiver satisfeito)..env
(menos as que são só de seed, se preferir rodar o seed uma vez local
apontando pro banco de produção) — inclusive TRAY_STORE_URL,
TRAY_CONSUMER_KEY, TRAY_CONSUMER_SECRET e TRAY_CALLBACK_URL (essa
última só depois do passo 4, quando você já souber a URL final).painel-pendencias.vercel.app.DATABASE_URL="<url de produção>" npm run seed
O vercel.json já configura o cron job de sincronização do Gmail (roda 1x
por dia, às 11h UTC / 8h em Brasília — plano Hobby da Vercel só permite cron
diário; pra sincronizar de hora em hora precisa do plano Pro) — a Vercel
ativa automaticamente ao detectar o arquivo. Enquanto isso, o botão
"Sincronizar agora" em /conectar-gmail sempre funciona na hora.
AUTH_SECRET, TOKEN_ENCRYPTION_KEY,
CRON_SECRET) — nunca reaproveite os valores do .env local/dev.TRAY_CONSUMER_SECRET, TOKEN_ENCRYPTION_KEY, AUTH_SECRET e
DATABASE_URL ao ambiente Production apenas (desmarque Preview/
Development na hora de criar) — assim nenhuma preview branch de PR expõe
segredo de produção.?sslmode=require na DATABASE_URL (Neon já
vem assim por padrão) — nunca conexão sem TLS em produção.TRAY_CALLBACK_URL e GOOGLE_REDIRECT_URI de produção têm que ser
https:// — ambas as plataformas recusam callback sem TLS.painel.seudominio.com.br).CNAME
apontando pro subdomínio, ou um A se for o domínio raiz).Decisão em aberto: qual domínio/subdomínio exato usar — me diga quando for configurar essa parte.
Critério adotado para "e-mail pendente": o próprio Gmail com uma label chamada "Pendente". Você marca manualmente (ou com um filtro automático do Gmail) os e-mails que quer ver no painel, e o sistema cria essa label sozinho na primeira sincronização, se ela ainda não existir.
Passo a passo pra criar as credenciais OAuth:
gmail.readonly e gmail.labels.http://localhost:3000/api/gmail/callback (para testar local)https://SEU_DOMINIO/api/gmail/callback (produção)GOOGLE_CLIENT_ID e GOOGLE_CLIENT_SECRET (local e na Vercel), e
ajuste GOOGLE_REDIRECT_URI para a URL de produção.Se você reconectar depois de já ter autorizado uma vez, o Google às vezes não reenvia o
refresh_token. Se isso acontecer, revogue o acesso em myaccount.google.com/permissions e conecte de novo.
Cada categoria (Processos, Empresa BFF, E-mails, Viagens) tem seu próprio conjunto de colunas — nascem 3 padrão (Pendente / Em andamento / Concluído) na primeira vez que você abre a categoria, e dali pra frente:
Como colunas são por categoria, a visão "Todas as categorias" não dá pra misturar quadros diferentes num só — ela vira um resumo somente-leitura em 2 grupos (Em aberto / Concluído). Pra arrastar cards e editar colunas, escolhe uma categoria no menu lateral.
Dois níveis, os dois grátis de usar (só o segundo depende da chave da Anthropic):
Aba separada do painel pessoal, pra acompanhar a saúde da empresa por setor (Financeiro, Marketing/Vendas, Estoque, Logística, Clientes, Suporte e Pós-venda, Jurídico, Desenvolvimento de Produto — RH ainda não entrou).
Visão Central (/empresa): visual de "central de comando" — os
setores aparecem como nós conectados ao redor do núcleo BFF, cada um com
semáforo (verde/amarelo/vermelho/cinza-sem-dado); um setor em vermelho
pulsa, e o núcleo assume a pior cor entre os setores visíveis. Clica num
nó pra abrir o detalhe daquele setor.
Detalhe de setor e preenchimento manual (/empresa/[sector],
src/lib/sectorMetrics.ts): cada setor tem uma lista de blocos esperados
(ex: Financeiro → fluxo de caixa, DRE, chargebacks...). Clica num bloco
pra abrir um formulário — status (dentro do esperado/na borda/precisa de
atenção), valor livre ("R$ -3.200", "18 dias") e observação. Isso
funciona sem depender de nenhuma API externa — é como o app fica
utilizável hoje, antes da Tray (ou qualquer outra fonte) estar ligada de
verdade. getStatusBySector() calcula o pior status por setor a partir
desses blocos e alimenta a Visão Central — quando a Tray (ou outra fonte)
começar a escrever nessa mesma tabela (SectorMetric) automaticamente, a
tela não muda nada, só passa a atualizar sozinha em vez de manual.
Acesso por setor: /admin/usuarios (só visível pra quem é role=admin)
— cria login pra cada pessoa e marca quais setores ela vê. Admin sempre vê
todos os setores; membro só vê o que foi liberado. A Visão Central mostra
só os setores daquele usuário.
Fonte de dado — Tray Commerce (src/lib/tray.ts): integração OAuth2
direta com a API REST da Tray (confirmada contra developers.tray.com.br).
Fluxo: /conectar-tray (admin-only) → /api/tray/connect redireciona pro
auth.php da loja → depois de autorizar, /api/tray/callback troca o
code por access_token/refresh_token (guardados criptografados em
TrayConnection, uma única linha — é conexão da empresa, não por usuário).
getValidAccessToken() renova sozinho quando o token expira. Falta
testar o handshake completo de verdade — só dá pra fechar o login
clicando num navegador de verdade, com HTTPS (o app precisa estar
publicado; não rola de dentro da sandbox de dev). Assim que estiver
conectado, tudo que consome a API (CRM de Clientes abaixo, e depois os
outros setores) passa a puxar dado real sem precisar mudar nada de código.
Manter a conexão viva (/api/cron/sync-tray, agendado em
vercel.json): o access_token da Tray dura só algumas horas e o
refresh_token só é renovado quando algo de fato chama a API — sem uso,
ele fica parado até vencer e a conexão morre sem avisar ninguém. Esse
cron roda 1x/dia só pra manter o uso constante (chama getValidAccessToken()
e atualiza lastSyncAt), independente de alguém abrir as telas que
dependem da Tray. A tela /conectar-tray mostra um aviso quando o
refresh_token está perto de vencer; se vencer de vez, a correção é
sempre desconectar e reautorizar por ali — nunca colar token manualmente.
CRM de Clientes (/empresa/clientes, src/lib/trayCustomers.ts):
lista de clientes com busca, e ao clicar abre o histórico de pedidos,
ticket médio, total gasto e recência (Ativo ≤30d / Esfriando 31–90d /
Sumido 90+d), tudo calculado a partir de /customers e /orders da
Tray (campos confirmados contra a doc oficial). Sem a Tray conectada,
mostra um aviso claro com CTA pra /conectar-tray em vez de tela de erro.
Ainda não ligado: os outros setores (Estoque, Logística, Marketing/Vendas)
que também vão consumir trayGet() depois.
No painel pessoal, ao criar uma pendência aparece "Atribuir para" quando existe mais de um usuário no sistema. Escolhendo outra pessoa:
createdAt) e quando foi concluída (completedAt, marcado
sozinho ao mover o card pra uma coluna "concluído").Serve pra não perder pendência delegada no meio do trabalho — o pedido original foi justamente esse: "toda vez que ele entrar, vai aparecer alerta [...] isso cria um histórico de trabalho e hora de envio e hora de execução".
prisma/schema.prisma modelo de dados (User, Item, Column, SectorAccess, SectorMetric, GmailConnection, TrayConnection)
prisma/seed.ts cria o usuário inicial
src/auth.ts configuração do NextAuth (credentials)
src/proxy.ts protege as rotas (redireciona pra /login)
src/lib/gmail.ts OAuth + sincronização do Gmail
src/lib/tray.ts OAuth + client REST da Tray Commerce
src/lib/trayCustomers.ts CRM: lista/detalhe de clientes e pedidos, cálculo de recência/ticket médio
src/lib/crypto.ts criptografia de tokens (AES-256-GCM) — Gmail e Tray
src/lib/columns.ts colunas padrão criadas sob demanda por categoria
src/lib/anthropic.ts ditado inteligente (Claude API)
src/lib/sectors.ts setores da aba BFF Fitness (nomes/descrições/ícones)
src/lib/sectorStatus.ts paleta do semáforo (verde/amarelo/vermelho/sem-dado)
src/lib/sectorMetrics.ts blocos de cada setor: ler/gravar status manual, status consolidado por setor
src/lib/permissions.ts quem vê qual setor (admin = tudo, membro = SectorAccess)
src/components/EmpresaHub.tsx visual de rede/central de comando da Visão Central
src/app/painel/ painel pessoal (Kanban)
src/app/empresa/ Visão Central + detalhe de cada setor (BFF Fitness)
src/app/admin/usuarios/ criar usuário e marcar acesso por setor
src/app/conectar-gmail/ tela de conexão com o Gmail
src/app/conectar-tray/ tela de conexão com a Tray (admin-only)
src/app/empresa/clientes/ CRM de clientes (lista + histórico de pedidos, puxado da Tray)
src/app/api/items/ CRUD de pendências + ditado inteligente + atribuição
src/app/api/columns/ CRUD de colunas do Kanban (própria + de quem você atribui)
src/app/api/admin/users/ CRUD de usuários e acesso por setor
src/app/api/gmail/ conectar/sincronizar/desconectar Gmail
src/app/api/tray/ conectar/status/desconectar Tray + CRM (customers)
src/app/api/cron/sync-gmail/ endpoint chamado pelo cron da Vercel
vercel.json agenda do cron (a cada hora)
Item.due e Column.isDone).