Synaplan
기업을 위한 오픈소스 AI 플랫폼
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.