Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Portal público para transportadores agregados cadastrarem veículos, documentos e fotos, com área interna para a equipe GRF analisar, aprovar e exportar. Stack: TanStack Start (React 19 + SSR) · Vite 8 · Tailwind 4 · shadcn/ui · Supabase. Abra o .env e preencha apenas o SUPABASE_SERVICE_ROLE_KEY. Pegue em: Supabase → Project Settings → API Keys → service_role / secret. O .env está no .gitignore. Nunca coloque o prefixo VITE_ no service role: tudo com esse prefixo vai para o bundle público do navegador.檢視完整 README ↗
Portal público para transportadores agregados cadastrarem veículos, documentos e fotos, com área interna para a equipe GRF analisar, aprovar e exportar.
Stack: TanStack Start (React 19 + SSR) · Vite 8 · Tailwind 4 · shadcn/ui · Supabase.
cp .env.example .env
Abra o .env e preencha apenas o SUPABASE_SERVICE_ROLE_KEY.
Pegue em: Supabase → Project Settings → API Keys → service_role / secret.
| Variável | Onde é usada |
|---|---|
VITE_SUPABASE_URL / VITE_SUPABASE_PUBLISHABLE_KEY | navegador (login e upload) |
SUPABASE_URL / SUPABASE_PUBLISHABLE_KEY | SSR e validação de token |
SUPABASE_SERVICE_ROLE_KEY | segredo — server functions, ignora RLS |
O .env está no .gitignore. Nunca coloque o prefixo VITE_ no service role:
tudo com esse prefixo vai para o bundle público do navegador.
A base yxvzbcqtcfgmsptrqsfa já tem as 6 tabelas e o bucket privado
grf-documentos. Falta só um passo, obrigatório para o login funcionar:
Abra o SQL Editor do Supabase e rode supabase/migrations/01_user_roles.sql.
Ele apenas cria a tabela user_roles, o enum app_role e a função has_role()
— não altera nem apaga nada do que já existe.
npm install
npm run dev # http://localhost:8080
Primeiro acesso da equipe: vá em /login. Enquanto não existir nenhum usuário,
a tela oferece criar o primeiro administrador. Depois disso essa rotina se
desativa sozinha e novos usuários precisam ser criados no painel do Supabase
com a linha correspondente em user_roles.
git init
git add .
git commit -m "Portal GRF - cadastro de veiculos"
git branch -M main
git remote add origin [email protected]:SEU_USUARIO/SEU_REPO.git
git push -u origin main
vercel.json já define o resto..env
(as três públicas e as duas de servidor) em Production e Preview.O build usa o preset vercel do Nitro e gera .vercel/output (Build Output
API), que a Vercel reconhece sozinha. A região está fixada em gru1 (São Paulo)
para reduzir latência até a base em sa-east-1.
Para rodar em Node puro (VPS, Docker) em vez da Vercel:
NITRO_PRESET=node-server npm run build
npm start # http://localhost:3000
O formulário é público e o bucket é privado, então o upload acontece em duas etapas:
createUploadTicket (server function) valida tipo e tamanho, monta o caminho
e emite uma URL assinada com o service role.Isso evita depender de política RLS no bucket e não passa o arquivo pela função serverless — a Vercel limita o corpo da requisição a ~4,5 MB, bem abaixo dos 10 MB por arquivo aceitos aqui.
Fotos são convertidas para JPEG e reduzidas para no máximo 1920px antes do envio. Isso resolve o HEIC do iPhone, que o bucket rejeitaria, e as fotos de 12 MP que estourariam o limite de tamanho.
| Chave | Item | Obrigatório |
|---|---|---|
CRLV | CRLV do veículo | sim |
DOC_PROPRIETARIO | Documento do proprietário | sim |
CNH | CNH do motorista | sim |
FOTO_FRENTE | Foto frontal, placa legível | sim |
FOTO_LATERAL | Foto lateral, carroceria visível | sim |
FOTO_CARROCERIA | Interior da carroceria | não |
Para mudar essa lista, edite DOC_TYPES e PHOTO_TYPES em
src/lib/grf-domain.ts — o formulário, a validação de servidor e a tela de
análise se ajustam sozinhos. A obrigatoriedade é checada também no servidor,
em submitRegistration, porque o formulário do navegador pode ser burlado.
src/
routes/ páginas (index, cadastro, consulta, login, admin/*)
lib/
grf-domain.ts constantes, validações e tipos de anexo
grf.functions.ts server functions (cadastro, consulta, análise)
grf-upload.ts upload e normalização de imagem (navegador)
grf-server-helpers.ts schemas Zod
integrations/supabase/
env.ts leitura de env e constantes
client.ts cliente do navegador (chave publicável)
client.server.ts cliente service role — só no servidor
auth-middleware.ts valida o bearer token da área GRF
supabase/migrations/ scripts SQL (ver 00_LEIA-ME.md)
public/grf-logo.png é um placeholder derivado do favicon (64px).
Substitua pela arte oficial em alta resolução.grf-documentos. Com o fluxo de URL assinada ela virou porta aberta sem
uso. Depois de confirmar os uploads em produção, rode
supabase/migrations/02_opcional_endurecer_storage.sql para removê-la.@tanstack/react-start e @tanstack/react-router precisam ficar
alinhados. Versões descasadas causam erro de MISSING_EXPORT no build ou um
ciclo de import que derruba o SSR em todas as rotas.codveiculo_sankhya, status_integracao e
mensagem_integracao já existem e são exibidos na tela de análise, mas o
envio real ainda não foi implementado.