No description
The banner was wired off session.user.isEmailVerified, which lives on the JWT cookie. If a user verified their email in another tab or was auto-verified by the invite flow after an existing session was issued, the token kept saying unverified until sign-out, so the banner hung around indefinitely. - Add GET /api/auth/verify-email/status, a tiny authenticated endpoint that returns the authoritative emailVerified state straight from the DB. - Banner now fetches that on mount and only renders if the DB agrees the user is unverified. If the DB says verified but the cookie is stale, we call useSession().update() to refresh the JWT so the rest of the app sees the correct state on the next render. Made-with: Cursor |
||
|---|---|---|
| prisma | ||
| public | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| components.json | ||
| docker-compose.yml | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| prisma.config.ts | ||
| README.md | ||
| start.sh | ||
| tsconfig.json | ||
| vercel.json | ||
Echo OCR
OCR-powered response card scanner and management tool for Echo Life Church.
Scans front/back of paper response cards (PDF or images), extracts structured data using a local Ollama vision model, stores results in PostgreSQL, and serves them through a modern filterable table UI.
Stack
- Next.js 15 (App Router) + Tailwind CSS v4 + shadcn/ui
- TanStack Table for data tables with filtering, sorting, pagination
- Prisma + PostgreSQL for data storage
- Ollama (local LLM) for OCR via vision models (LLaVA 7B recommended)
- MinIO (S3-compatible) for PDF/image storage
- Docker for deployment via Coolify
Local Development
Prerequisites
- Node.js 18+
- Docker + Docker Compose (for PostgreSQL + MinIO)
- Ollama running locally with a vision model (
ollama pull llava:7b) - GraphicsMagick (
brew install graphicsmagick) for PDF-to-image conversion
Setup
# Install dependencies
npm install
# Start local PostgreSQL + MinIO
docker compose up -d postgres minio
# Create MinIO bucket (visit http://localhost:9001, login minioadmin/minioadmin)
# Push database schema
npm run db:push
# Start dev server
npm run dev
Open http://localhost:3000.
Environment Variables
Copy .env.example to .env and configure:
cp .env.example .env
Deployment (Coolify)
See the deployment section in the project plan for step-by-step Coolify setup instructions including PostgreSQL, MinIO bucket creation, Ollama configuration, and Traefik routing.
API Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/cards |
List cards (filters, pagination, search) |
| POST | /api/cards |
Create a card |
| GET | /api/cards/[id] |
Get card with presigned image URLs |
| PUT | /api/cards/[id] |
Update card fields |
| DELETE | /api/cards/[id] |
Delete card and images |
| POST | /api/cards/[id]/export |
Mark card as exported |
| POST | /api/upload |
Upload PDF/images for OCR |
| GET | /api/jobs |
List processing jobs |
| GET | /api/stats |
Card count statistics |
| GET/PUT | /api/settings |
App settings |
| POST | /api/watch |
Start/stop folder monitoring |
| GET | /api/images/[...path] |
Proxy images from MinIO |