All personal projects
FinTech / Expense ManagementLive

PassaNota

Every receipt recorded. Every expense under control.

Next.js 16React 19TypeScriptTailwind CSS 4Supabase Authshadcn/uiRechartsFastAPIPython 3.13PostgreSQLpgvectorOpenCVCloud RunCloud Tasks

Cost control via fiscal invoices

PassaNota

Interactive preview — try the live demo for the full experience

Next.js 16 + FastAPIStack
Vision LLM + OpenCVAI pipeline
pgvector HNSWSearch
GCP Cloud RunDeploy

PassaNota is a B2B expense-control platform for Brazilian businesses. Teams photograph fiscal receipts on desktop or paired mobile devices; a vision LLM pipeline extracts structured data — vendor, line items, totals, and dates — without manual entry. Managers get dashboards with spend trends, category breakdowns, and top products, while operators capture receipts in the field. The system supports multi-company tenancy, role-based access, and platform-level admin tooling, deployed on GCP Cloud Run with Supabase auth and service-to-service IAM between frontend and API.

End-to-end AI receipt pipeline — OpenCV document preprocessing plus multi-provider vision LLM extraction

Production BFF architecture — Next.js proxy with Cloud Run IAM, Supabase JWT forwarding, and multi-tenant headers

Multi-tenant SaaS design — gestor/operador roles, QR + PIN device pairing, platform admin overview

Split architecture — Next.js frontend (`passanota-web`) and FastAPI backend (`passanota-api`) on GCP

  • AI-powered receipt capture via file upload or live camera with document detection
  • Async background processing with capture status tracking via Cloud Tasks
  • Spend dashboard — totals, average ticket, period comparison, category and emitter charts
  • Paginated invoice list with detailed line-item views and AI confidence badges
  • Manual item editing and categorization when extraction needs correction
  • Semantic product search over invoice line items using pgvector embeddings
  • Multi-company support with empresa switcher and isolated tenant data
  • Mobile device pairing (QR code + PIN) for field operators without full login
  • Passwordless Supabase magic-link authentication with profile completion flow
  • Platform admin panel — company metrics, usage tracking, and tenant management

The Next.js app routes all API calls through a BFF proxy at `/api/proxy/*`, forwarding the Supabase Bearer token, `X-Empresa-Id`, and device tokens. In production, the proxy swaps the user JWT for a Cloud Run IAM ID token to reach the private FastAPI service. The API runs an async pipeline: store photo in Supabase Storage, enqueue Cloud Tasks, OpenCV preprocess, vision LLM extract, persist items, then SQL-normalize categories with keyword and embedding refinement. Semantic search uses pgvector HNSW indexes on multilingual sentence embeddings.

  • 01Vision LLMs handle messy thermal receipts better than template OCR — preprocessing with OpenCV still matters for extraction quality
  • 02A BFF layer with Cloud Run IAM is the cleanest way to keep the API private while forwarding Supabase user context
  • 03Hybrid categorization — LLM first pass plus SQL keyword/embedding refinement — keeps taxonomy consistent across tenants