No description
Find a file
Randall Stillwell eabfb4935d Fix nullable Json field in reprocess and Prisma import path
Use Prisma.DbNull instead of null for the cardIds Json? field,
and correct the generated client import path.

Made-with: Cursor
2026-03-11 11:49:33 -05:00
prisma Switch to Vercel AI Gateway for multi-provider OCR 2026-03-11 11:05:38 -05:00
public Add public directory required by Next.js standalone output 2026-03-10 08:28:43 -05:00
src Fix nullable Json field in reprocess and Prisma import path 2026-03-11 11:49:33 -05:00
.dockerignore Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
.env.example Switch to Vercel AI Gateway for multi-provider OCR 2026-03-11 11:05:38 -05:00
.gitignore Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
components.json feat: initial commit 2026-03-09 15:31:45 -05:00
docker-compose.yml Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
Dockerfile Fix prisma CLI in production container for db push 2026-03-10 13:45:04 -05:00
eslint.config.mjs Initial commit from Create Next App 2026-03-09 15:31:21 -05:00
next.config.ts Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
package-lock.json Switch to Vercel AI Gateway for multi-provider OCR 2026-03-11 11:05:38 -05:00
package.json Switch to Vercel AI Gateway for multi-provider OCR 2026-03-11 11:05:38 -05:00
postcss.config.mjs Initial commit from Create Next App 2026-03-09 15:31:21 -05:00
prisma.config.ts Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
README.md Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
start.sh Remove --skip-generate flag from prisma db push 2026-03-10 14:03:20 -05:00
tsconfig.json Initial commit from Create Next App 2026-03-09 15:31:21 -05:00

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