Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Conectando a indústria ao fornecedor certo. Marketplace industrial que liga indústrias que precisam de serviços a prestadores especializados. Região inicial: Sorocaba e interior de São Paulo. Next.js 15 (App Router) · TypeScript · Tailwind CSS 4 · shadcn/ui · Supabase (Postgres, Auth, Storage, RLS) · Zod · Vercel. Requisitos: Node 20+ e Docker (para o Supabase local). O build gera a home estaticamente, então precisa do banco acessível.Read the full README ↗
Conectando a indústria ao fornecedor certo.
Marketplace industrial que liga indústrias que precisam de serviços a prestadores especializados. Região inicial: Sorocaba e interior de São Paulo.
Next.js 15 (App Router) · TypeScript · Tailwind CSS 4 · shadcn/ui · Supabase (Postgres, Auth, Storage, RLS) · Zod · Vercel.
Requisitos: Node 20+ e Docker (para o Supabase local).
npm install
npx supabase start # sobe Postgres, Auth, Storage e API locais
npm run db:reset # aplica migrations e seed
cp .env.example .env.local # preencha com a saída de `npx supabase status`
npm run dev # http://localhost:3000
| Variável | Onde encontrar |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | API URL em npx supabase status, ou Project Settings > API |
NEXT_PUBLIC_SUPABASE_ANON_KEY | anon key (ou publishable key) na mesma saída |
NEXT_PUBLIC_SITE_URL | URL pública do site. Local: http://localhost:3000 |
O build gera a home estaticamente, então precisa do banco acessível.
| Script | O que faz |
|---|---|
npm run dev | Servidor de desenvolvimento |
npm run build | Build de produção |
npm run lint / npm run typecheck | ESLint e TypeScript |
npm run db:reset | Recria o banco local com migrations e seed |
npm run db:test | Testes pgTAP de RLS e regras de negócio |
npm run db:types | Regenera src/types/database.ts a partir do banco local |
npm run test:e2e | Fluxo completo no navegador (Playwright). Precisa do banco local com seed e de npm run build |
npx supabase link e npx supabase db push.https://<seu-dominio>/**.| Rota | Estado |
|---|---|
/ | Home com busca, categorias e destaques |
/buscar | Resultados com filtros, ordenação e paginação |
/prestador/[slug] | Perfil público completo |
/login, /login/recuperar, /login/nova-senha | Entrar e recuperar senha |
/cadastro | Escolha entre contratar ou oferecer serviços |
/cadastro/empresa, /cadastro/prestador | Cadastro em etapas com barra de progresso e rascunho salvo |
/painel | Métricas de 30 dias, gráfico, checklist do perfil, pedidos recentes |
/painel/perfil | Dados, área de atuação, logo e fotos, equipamentos, certificações, clientes |
/painel/orcamentos | Pedidos recebidos pelo prestador (novos, respondidos) |
/orcamentos | Pedidos do solicitante |
/orcamentos/novo | Novo pedido com anexos e prévia de quantos fornecedores recebem |
/orcamentos/[id] | Solicitante compara propostas, escolhe e avalia. Prestador responde |
src/
app/ rotas (Server Components por padrão)
components/ui/ componentes base (padrão shadcn)
components/layout/ header, footer, container
features/<domínio>/ queries, schemas e componentes por domínio
lib/ env, cliente Supabase, validação (CNPJ, telefone), formatação
types/database.ts tipos gerados do banco
supabase/ migrations, seed e testes
docs/adr/ decisões de arquitetura
Regra de camadas: componentes não acessam o banco. Páginas chamam features/*/queries.ts, que devolvem tipos de domínio.
Studio local: http://127.0.0.1:54323
Todo usuário do seed usa o e-mail <slug>@induxhub.test e a senha induxhub123.
| Perfil | |
|---|---|
| Prestador premium | [email protected] |
| Prestador sem avaliações | [email protected] |
| Contratante com pedidos | [email protected] |
company_members) edita só o próprio perfil. premium não é editável pelo cliente.create_quote_request, reply_to_quote, close_quote).set_company_buyer (único jeito de mudar tipo).track_event(), agregadas por dia.search_companies(query, cidade, categoria, ordenação, limite, offset). Premium sempre primeiro.Fotos do seed apontam para /seed/fotos/*.svg (placeholders em public/). Caminhos sem / inicial ficam no bucket company-media.