Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
A Vagou mostra quantas vagas cada shopping tem, quantas estão livres agora e a planta do estacionamento, piso por piso.
Translation pending
LifestyleTypeScript · CSSGitHub @Donati157OnlineOwner 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
Vagou — plataforma inteligente que ajuda motoristas a encontrar estacionamentos com vagas disponíveis perto do seu destino.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Abra a Vagou e descubra onde tem vaga para estacionar. A Vagou é uma plataforma de descoberta e visualização de vagas em estacionamentos de shoppings. O motorista escolhe o shopping (pelo nome, bairro ou localização) e vê quantas vagas ele tem, quantas estão livres agora e a planta do estacionamento, piso por piso e setor por setor. A Vagou não exibe preços. Shoppings digitalizam seus estacionamentos a partir da planta e conectam fontes de ocupação.Read the full README ↗
Abra a Vagou e descubra onde tem vaga para estacionar.
A Vagou é uma plataforma de descoberta e visualização de vagas em estacionamentos de shoppings. O motorista escolhe o shopping (pelo nome, bairro ou localização) e vê quantas vagas ele tem, quantas estão livres agora e a planta do estacionamento, piso por piso e setor por setor. A Vagou não exibe preços. Shoppings digitalizam seus estacionamentos a partir da planta e conectam fontes de ocupação.
A Vagou não é um marketplace de reservas: não há reserva, checkout ou pagamento pela plataforma.
A definição de produto completa está em docs/PRODUCT.md (fonte da verdade).
Status: V1 — fluxos de motorista, empresa (incluindo Mapa Inteligente, operação e analytics) e admin implementados.
| Camada | Escolha |
|---|---|
| App | Next.js 16 (App Router, Server Components, Server Actions, proxy.ts), React 19, TypeScript |
| UI | Tailwind CSS v4 com tokens próprios, componentes em src/components/ui (padrão shadcn, sem dependência extra), Lucide |
| Mapas | Leaflet + react-leaflet com tiles OpenStreetMap (carregados sob demanda) |
| Gráficos | Recharts |
| Banco | PostgreSQL via Drizzle ORM. Local: PGlite (PostgreSQL embutido, zero instalação). Produção: qualquer PostgreSQL/Supabase via DATABASE_URL |
| Auth | Sessões próprias em cookie httpOnly (token com hash SHA-256 no banco), senhas com scrypt, RBAC no servidor |
| Validação | Zod (cliente e servidor), React Hook Form |
| Testes | Vitest (unitários + integração com banco em memória) |
src/
app/ Rotas (UI). Páginas finas que chamam serviços.
components/ Design system (ui/), layout, gráficos, marca
modules/ Domínios — regras de negócio e acesso a dados
auth/ sessão, RBAC, cadastro, recuperação de senha, privacidade (LGPD)
facilities/ consultas públicas, horários, tarifas, isolamento por empresa, favoritos
occupancy/ OccupancyProvider, simulação, eventos/snapshots, disponibilidade pública
floorplans/ layout padrão, ParkingPlanAnalyzer (mock), rota demonstrativa
search/ parâmetros e componentes da busca (lista + mapa sincronizados)
geo/ distâncias, geocodificação local (gazetteer de SP)
storage/ armazenamento de arquivos com validação por assinatura
server/ db (schema, cliente), logger estruturado, erros, auditoria
scripts/ migrate, seed, gerador da planta de exemplo
drizzle/ migrations SQL
tests/ unit/ e integration/
Camadas: UI → serviços do módulo → regras puras (sem I/O, testadas) → acesso a dados (Drizzle) → banco/serviços externos. Toda autorização sensível é validada no servidor (layouts, server actions e route handlers).
Organization → Facility → Floor → Sector → ParkingSpace, mais FloorPlan, FloorPlanElement,
OccupancyEvent, OccupancySnapshot, ParkingRate, OperatingHours, FacilityEntrance, DataSource,
e de apoio User, Profile, OrganizationMember, Favorite, AuditLog, Notification.
Ver src/server/db/schema.ts (FKs, índices, enums, constraints, timestamps).
OccupancyProvider desacopla a origem dos dados da visualização:
SimulationOccupancyProvider — simulada; usada quando não há fonte real. Sempre sinalizada como “simulado” (também na interface pública).ManualOccupancyProvider — funcional; operador altera o status das vagas.Mudanças de status geram OccupancyEvent; contagens periódicas viram OccupancySnapshot.
Dados antigos (>15 min; >3 h para contagem manual) aparecem como “Sem dados de ocupação”, nunca como atuais.
Pré-requisitos: Node.js 20+ (testado com 24) e npm.
git clone <url-do-repositorio> vagou && cd vagou
npm install
cp .env.example .env.local
npm run db:seed # aplica migrations e cria dados de demonstração
npm run dev # http://localhost:3000
Sem DATABASE_URL, o banco é um PostgreSQL embutido (PGlite) salvo em .data/pglite.
Ele aceita um processo por vez: pare o npm run dev antes de rodar db:seed/db:migrate
(há uma trava que avisa se outro processo estiver usando o banco).
DATABASE_URL=postgres://usuario:senha@host:5432/vagou npm run db:migrate
DATABASE_URL=... npm run db:seed # opcional: dados de demonstração
| Comando | O que faz |
|---|---|
npm run dev | servidor de desenvolvimento |
npm run build / npm start | build e execução de produção |
npm run lint | ESLint |
npm run typecheck | TypeScript (tsc --noEmit) |
npm test | testes (Vitest) |
npm run db:generate | gera migration a partir do schema |
npm run db:migrate | aplica migrations |
npm run db:seed | migrations + dados de demonstração (apaga dados existentes) |
npm run db:reset | apaga o banco embutido e recria com seed |
Ver .env.example. Principais: NEXT_PUBLIC_APP_URL, APP_SECRET, DATABASE_URL,
UPLOADS_DIR, PLAN_ANALYZER, NEXT_PUBLIC_DEMO_MODE. Nenhum segredo é exposto ao frontend.
Criadas pelo seed, senha Vagou@2026 (configurável via DEMO_PASSWORD):
| Perfil | |
|---|---|
| Motorista | [email protected] |
| Empresa (Aurora Shoppings) | [email protected] |
| Empresa (EstaPark) | [email protected] |
| Admin Vagou | [email protected] |
Com NEXT_PUBLIC_DEMO_MODE=true (e fora de produção) a tela de login mostra atalhos para essas contas.
O seed se recusa a rodar com NODE_ENV=production (a menos que ALLOW_DEMO_SEED=true).
Nunca use essas credenciais em produção.
A Vagou roda em hospedagem serverless. Requisitos de produção:
DATABASE_URL automaticamente; Supabase também funciona — POSTGRES_URL é aceito). Conexões via pooler funcionam (prepare: false).engines).stored_files) quando há banco configurado — não há dependência de disco. STORAGE_DRIVER=local|database força um driver.O build da Vercel executa automaticamente npm run vercel-build:
tsx scripts/migrate.ts && tsx scripts/seed.ts --if-empty --demo && next build
DATABASE_URL não existir);A única variável obrigatória é DATABASE_URL (criada pela integração Neon). As demais são opcionais:
| Variável | Valor |
|---|---|
DEMO_PASSWORD | senha das contas demo (mín. 10 caracteres, diferente da senha de desenvolvimento). Sem ela as contas demo são criadas bloqueadas; ao definir e fazer novo deploy, elas são liberadas (e a senha é sincronizada a cada deploy) |
NEXT_PUBLIC_APP_URL | URL pública customizada; se ausente, usa o domínio de produção da Vercel |
NEXT_PUBLIC_DEMO_MODE | deixe ausente ou false em produção |
Para não carregar dados de demonstração num ambiente real, remova --demo do script vercel-build.
| Perfil | Fluxo |
|---|---|
| Motorista | Home → buscar destino (ou "perto de mim") → mapa + lista de estacionamentos → Ver estacionamento → vagas por piso / mapa do piso → Ir até lá · favoritos e perfil em /app |
| Shopping | Login → /company (dashboard) → shopping → Pisos e mapas → importar planta → análise → corrigir no editor → publicar → Operação (mapa ao vivo) → Analytics |
| Admin | Login → /admin → usuários → empresas → estacionamentos → fontes de dados → atividade |
/, /buscar, /estacionamentos/[slug], /estacionamentos/[slug]/pisos/[floorId], /empresas, /entrar, /cadastro, /recuperar-senha/app (favoritos), /app/perfil/company, /company/estacionamentos/novo, /company/estacionamentos/[id] (visão geral, operacao, pisos, pisos/[floorId] = Mapa Inteligente, analytics, cadastro, entradas, dados)/admin, /admin/usuarios, /admin/empresas, /admin/estacionamentos, /admin/fontes, /admin/atividadeFuncional
/public, autorização por organização; plantas só ficam públicas quando publicadas)Simulado (sempre identificado na interface)
SimulationOccupancyProvider (selo "simulado" no público e "Modo demonstração" nos painéis)MockParkingPlanAnalyzer, "análise simulada")Preparado para integração
OccupancyProvider; exibidos como "integração sob demanda")AIParkingPlanAnalyzer via ParkingPlanAnalyzer (PLAN_ANALYZER)setErrorReporter), storage em nuvem (FileStorage)A tabela parking_rates permanece no schema (sem uso desde que a Vagou deixou de exibir preços); pode ser removida numa migration futura.
O banco embutido (PGlite) atende um processo por vez; em produção é obrigatório um PostgreSQL.
Arquivos no PostgreSQL atendem a escala da V1; para grande volume, implemente um driver de object storage (interface FileStorage).
Em desenvolvimento o reactStrictMode está desligado porque o react-leaflet v5 não suporta a dupla execução de efeitos do modo estrito.
npm test
Cobrem: semântica de disponibilidade pública (simulado, desatualizado, lotado), simulação, analytics, horários, tarifas, isolamento entre organizações, autorização do admin, contas suspensas, login sem enumeração de e-mails, o pipeline de ocupação (com PostgreSQL em memória) e um guarda contra colunas não qualificadas em subconsultas SQL.