Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Transforme ideias em iniciativas ESG acompanháveis.
Translation pending
BusinessTypeScript · PLpgSQLGitHub @arthurasantos6-lgtmOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Aplicação SaaS multiempresa em Next.js, TypeScript e Supabase. Esta primeira entrega implementa uma base de ambiente de cliente para autenticação, isolamento de dados, registro e acompanhamento de ideias e triagem ESG indicativa.
Crie um projeto Supabase e copie .env.example para .env.local.
Preencha NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY (ou publishable key compatível) e NEXT_PUBLIC_SITE_URL. Não coloque a chave service_role no frontend nem em variáveis NEXT_PUBLIC_*.
No SQL Editor do Supabase, execute a migração inicial.
Em Authentication, crie ou convide o primeiro usuário administrador da empresa. O cadastro público não está habilitado.
Associe o usuário a uma organização usando o SQL Editor com um UUID real do usuário:
insert into public.organizations (name, status)
values ('Organização de demonstração', 'active')
returning id;
Use o id retornado e o id do usuário exibido em Authentication > Users:
insert into public.memberships (organization_id, user_id, role)
values ('UUID_DA_ORGANIZACAO', 'UUID_DO_USUARIO', 'company_admin');
Esses comandos são apenas para provisionamento inicial feito por uma pessoa autorizada no painel Supabase; não os exponha em páginas públicas.
Configure em Authentication > URL Configuration a URL do site e o redirect http://localhost:3000/auth/callback (e a URL de produção correspondente).
Execute também a migração do administrador da plataforma no SQL Editor.
Para promover um usuário já criado a administrador da plataforma (perfil separado de qualquer empresa cliente), rode no SQL Editor:
update auth.users
set raw_app_meta_data = raw_app_meta_data || jsonb_build_object('platform_admin', true)
where id = 'UUID_DO_USUARIO';
Depois, peça para essa pessoa encerrar a sessão e entrar novamente: o token de acesso só reflete a permissão após um novo login. Esse usuário acessa /admin e não precisa de membership em nenhuma organização.
Execute a migração de critérios ESG e base de conhecimento. Ela cria uma versão ativa de critérios equivalente à triagem original, então nada muda até o administrador da plataforma publicar uma nova versão.
(Opcional, habilita a IA) Defina SUPABASE_SERVICE_ROLE_KEY (Supabase > Project Settings > API Keys) e um provedor de IA em .env.local (veja os exemplos em .env.example):
ollama pull qwen2.5:7b) e use AI_PROVIDER=ollama e AI_MODEL=qwen2.5:7b. Precisa de um computador com memória suficiente e não funciona em hospedagens como a Vercel (só onde o Ollama estiver acessível).AI_PROVIDER=gemini ou groq, AI_MODEL e AI_API_KEY. Verifique os termos: camadas gratuitas podem usar o conteúdo enviado.ANTHROPIC_API_KEY e, opcionalmente, ANTHROPIC_MODEL.AI_PROVIDER=openai-compatible, AI_BASE_URL, AI_MODEL, AI_API_KEY.As chaves são lidas apenas no servidor; nunca use o prefixo NEXT_PUBLIC_ nelas. Sem IA configurada, o fluxo de ideias funciona sem copiloto e sem avaliação por IA, e a interface informa isso.
Execute a migração de decisões gerenciais.
Execute a migração de acesso por link e, em Authentication > Sign In / Providers, habilite Allow anonymous sign-ins (necessário para colaboradores entrarem sem cadastro). Recomenda-se habilitar também CAPTCHA (Authentication > Attack Protection) para reduzir abuso.
Execute a migração de uso da plataforma.
Execute a migração que restringe ideias aos colaboradores por link.
Instale dependências e inicie:
npm install
npm run dev
Abra http://localhost:3000.
auth.users.raw_app_meta_data.platform_admin = true): acessa /admin. Gerencia empresas clientes (cadastro, situação da conta, módulos habilitados), vincula usuários já existentes a empresas e consulta indicadores agregados (contagens) de todas as empresas. Vê uma lista resumida das ideias enviadas (título, área, situação, data e pilares), pela função platform_list_ideas. Não tem acesso ao texto das ideias, à análise, às conversas, aos autores nem aos projetos de nenhuma empresa — isso é reforçado por Row Level Security no banco, não apenas pela interface.memberships.role = 'company_admin'): acesso completo aos dados da própria organização (/dashboard, /ideas, /projects), avaliando e decidindo sobre as ideias enviadas pelos colaboradores e conduzindo os projetos. A gestão não cadastra ideias: ideias só são criadas por colaboradores que entraram pelo link de acesso (regra garantida no banco por is_link_collaborator).memberships.role = 'member'): entra pelo link de acesso da empresa, sem cadastro nem senha (sessão anônima do Supabase Auth vinculada a uma única empresa). Registra ideias, conversa com o copiloto e acompanha apenas as próprias ideias (situação, próxima ação e mensagens da gestão). Não vê ideias de outros colaboradores, justificativas internas nem avaliações humanas da gestão.Cada empresa pode ter os módulos "Ideias" e "Projetos" habilitados ou desabilitados individualmente pelo administrador da plataforma; a aplicação bloqueia o acesso no backend (não apenas oculta o menu) quando um módulo está desligado.
app_metadata/membership no backend (não apenas na interface)./admin): cadastro e edição de empresas clientes, situação da conta, módulos habilitados por empresa, vínculo de usuários já cadastrados a uma empresa e trocas de perfil/situação, indicadores agregados (contagens) por situação de empresas, ideias e projetos, e trilha de auditoria das ações administrativas./dashboard e /admin), calculados apenas com dados registrados:
platform_usage_overview)./ideas (gestão): Ambiental, Social, Governança e Sem classificação, com contagem e ordenação pelo potencial. Uma ideia pode estar em mais de uma pasta. A lista carrega até 1.000 ideias.A migração inicial cria organizations, memberships, ideas, idea_activity, esg_projects e esg_indicators. A migração 20261024_idea_decisions.sql adiciona a situação "priorizada", responsável, prazo e prioridade às ideias; cria idea_status_transitions (fluxo configurável), idea_decisions (histórico interno, visível só à gestão) e idea_feedback (mensagens entre gestão e autor). Mudanças de situação, responsável, prazo e prioridade só ocorrem pelas funções record_idea_decision e respond_to_info_request: um trigger bloqueia updates diretos, inclusive de administradores da empresa, para que nenhuma decisão fique sem justificativa e histórico. A mesma migração restringe a leitura de ideias ao autor e à gestão da empresa. A migração 20261023_idea_copilot.sql adiciona a ideas o texto original, a proposta estruturada e a data de envio; torna rascunhos privados do autor; cria idea_copilot_messages (conversa) e idea_evaluations (avaliações da IA). Usuários autenticados não têm política de escrita para respostas do copiloto nem para avaliações: elas são gravadas apenas pelo servidor com a chave service role, depois de verificar a permissão do usuário com a sessão dele, o que impede forjar uma avaliação por chamada direta à API. A gestão da empresa lê a conversa somente após o envio (o colaborador é avisado antes de confirmar). O conteúdo enviado à IA inclui título, área e texto da ideia, sem e-mail ou identificação do autor; o texto do colaborador é tratado como dado não confiável no prompt. Logs de falha registram apenas o identificador da ideia e o código do erro. A migração 20261022_esg_criteria.sql cria esg_criteria_versions (com índice que garante uma única versão ativa e a função platform_activate_criteria_version, que arquiva a anterior de forma atômica) e esg_knowledge_items; ambas podem ser lidas por usuários autenticados (a triagem roda com a sessão de quem envia a ideia) e só são alteradas pelo administrador da plataforma, com registro na trilha de auditoria. A migração 20261021_platform_admin.sql adiciona display_name e enabled_modules a organizations, a tabela platform_audit_log e funções security definer (platform_dashboard_stats, platform_list_organizations, platform_find_user_by_email, platform_list_organization_members) que retornam apenas contagens e metadados administrativos — nunca o conteúdo de ideias, conversas ou projetos de uma empresa cliente. Ideias, projetos, indicadores e trilha de auditoria carregam ; as políticas RLS validam a membership ativa no servidor PostgreSQL. As operações da aplicação usam a chave pública do Supabase e sessão do usuário, sem service role.
O modelo inicial associa cada conta de empresa a uma organização. Administradores de empresa podem rever todas as ideias do próprio ambiente; colaboradores podem enviar ideias, e só o autor pode editar uma ideia ainda em rascunho. Ideias submetidas são preservadas e não têm operação de exclusão na interface. Alterações de situação são limitadas ao administrador da empresa e registradas sem copiar descrição ou conteúdo confidencial para a auditoria. O administrador da plataforma não possui membership em nenhuma organização e não tem select liberado nas tabelas ideas, esg_projects ou esg_indicators — apenas nas tabelas administrativas (organizations, memberships) e nas funções agregadas.
SUPABASE_SERVICE_ROLE_KEY em uma rotina de servidor) nem configuração de provedores de IA. Os critérios são por palavra-chave (sem pesos por termo nem critérios específicos por empresa), e a base de conhecimento ainda não é exibida às empresas clientes nem usada na triagem. A edição de um registro de conhecimento incrementa o número de versão, mas o conteúdo anterior não é guardado.ideas.analysis) do próprio rascunho no momento do envio; a avaliação por IA não tem esse problema. A triagem por termos é exibida como sinal auxiliar.idea_status_transitions); ainda não há tela para o administrador da plataforma configurá-lo. Não há notificações por e-mail de decisões ou pedidos de complementação./admin. Antes de produção, habilite MFA/políticas de senha no Supabase, restrinja redirects, configure domínio HTTPS, monitoramento e revisão de segurança.Com .env.local configurado, execute npm test, npm run lint, npx tsc --noEmit e npm run build. O teste usa node --experimental-strip-types (Node.js 22.6+). Para publicar na Vercel ou plataforma Node compatível, configure as mesmas variáveis no ambiente de produção, aplique a migração ao projeto Supabase de produção e cadastre a URL de callback correspondente em Auth. Nunca exponha credenciais de administração do Supabase.
src/lib/esg-nlp.ts, esg-lexicon.ts, esg-classifier.ts, esg-assessment.ts, esg-questions.ts): sem IA externa. Classifica por regras versionadas e similaridade TF-IDF, trata acentos, plural, negação e contexto, cita evidências do texto e se abstém sem base. Oito critérios recebem nota só com base explícita; sem base, ficam pendentes e nunca viram zero, e a pontuação final só existe com todos avaliados. Os escores são heurísticos: pesos e limiares ainda não foram calibrados com especialistas, e o resultado fica em ideas.analysis, congelado no envio. Consulta e simulador em /admin/esg-engine; edição do dicionário ainda não existe.src/lib/esg-project-proposal.ts, só para a gestão): a partir da ideia e da análise, monta objetivo, situação atual, solução, recursos, indicadores possíveis e próximos passos, sem inventar fatos, custos ou retorno financeiro. Indica o potencial de adesão (estimativa pelo que o texto define) e recomenda "Aceitar", "Aceitar com condições" ou "Não aceitar por enquanto", com os motivos. Não muda a situação da ideia: a decisão continua humana, com justificativa. Temas sensíveis sempre pedem especialista. Ao criar o projeto de uma ideia aprovada, o formulário já vem preenchido.ESG_EXTERNAL_AI=true.src/lib/esg-engine.ts): a avaliação por IA classifica pilar principal, secundários e 12 subcategorias e dá notas de 0 a 5 em oito critérios. O sistema calcula a pontuação de 0 a 100, a faixa e os motivos de revisão humana e congela isso na avaliação, com a versão do prompt e os registros de conhecimento usados. Não aprova ideias nem substitui a triagem v1, que continua ativa. Pesos e taxonomia ainda ficam no código; não há editor nem perfil por empresa.20261101_seed_knowledge_base.sql importa 40 registros iniciais, sem duplicar nem sobrescrever (reversão em supabase/scripts/rollback_knowledge_seed.sql). A IA recebe as regras de classificação e os registros relacionados à ideia, não a base inteira.ideas.author_name, ideas.author_email). Aparecem para a gestão, que pode usar o e-mail para contato; a plataforma não envia e-mails automáticos. Nenhum dos dois é enviado à IA, e nenhum é verificado./acesso/[token]): a gestão da empresa (/equipe) ou o administrador da plataforma (detalhe da empresa) gera links com identificação e validade; cada link pertence a uma única empresa, concede apenas o perfil de colaborador e pode ser revogado. O vínculo é feito no banco (join_organization_with_link): uma sessão nunca fica em duas empresas, e empresas suspensas ou inativas não aceitam entradas. A gestão vê quem entrou por link e pode bloquear colaboradores. Limite de 20 novas ideias por pessoa em 24 horas./ideas/new): a ideia nasce como rascunho visível só para o autor; o texto original é preservado e não pode ser alterado (garantido por trigger no banco)./ideas/[id]/copilot; provedor configurável: Ollama local, Gemini, Groq, outra API compatível com OpenAI ou Anthropic Claude): faz perguntas progressivas, ajuda a identificar beneficiários, relações E/S/G, indicadores e riscos, usando a versão ativa dos critérios ESG e os registros ativos da base de conhecimento. Limite de 30 mensagens do colaborador por ideia. A conversa pode ser retomada depois./ideas/[id]/review): o copiloto organiza a conversa em campos (problema, solução, contexto, beneficiários, dimensões ESG, benefícios, indicadores, riscos, próximos passos); campos sem informação ficam como "não informado". O colaborador edita, salva o rascunho e confirma o envio explicitamente./ideas/[id], painel "Registrar decisão"): aceitar, solicitar complementação, encaminhar para avaliação técnica, priorizar, aprovar, não priorizar, iniciar e concluir implementação, reabrir e arquivar, conforme as transições da tabela idea_status_transitions. Toda decisão exige justificativa interna, pode definir responsável, prazo e prioridade e registrar uma avaliação humana (concordância com a IA, potencial e dimensões) sem apagar a avaliação da IA. O histórico identifica quem decidiu e quando. Ideias aprovadas têm atalho para criar projeto./admin/esg-criteria: termos-chave, explicação e indicadores sugeridos por dimensão (E, S, G) e limites de potencial. Versões nascem como rascunho; apenas uma fica ativa por vez, e versões ativas ou arquivadas são imutáveis (para ajustá-las, duplique). Cada ideia registra na análise qual versão de critérios a avaliou, exibida no detalhe da ideia. Se não houver versão ativa válida, a triagem usa os critérios padrão embutidos em src/lib/esg-analysis.ts./admin/knowledge): conceitos, critérios de avaliação, regras de classificação, referências, perguntas orientadoras e recomendações, com categoria, fonte, situação e número de versão incrementado a cada edição. Nesta entrega o conteúdo é consultivo e não altera a triagem automática.organization_id