No description
Find a file
Randall Stillwell cf418bd197 Improve OCR checkbox detection prompts to reduce false positives
Strengthened system prompts and Zod schema descriptions in both ai-ocr.ts
and ollama.ts with explicit checkbox rules: only mark as checked when a
visible X/checkmark/fill is inside the box, treat empty boxes as unchecked,
and err on the side of unchecked when uncertain. Clarified the ambiguous
nextStep field to distinguish the two checkbox options from the section
heading.

Made-with: Cursor
2026-04-08 17:31:50 -05:00
prisma Add Monday.com board fields and expand column mapper 2026-04-07 12:50:03 -05:00
public Add public directory required by Next.js standalone output 2026-03-10 08:28:43 -05:00
src Improve OCR checkbox detection prompts to reduce false positives 2026-04-08 17:31:50 -05:00
.dockerignore Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
.env.example Add profile page, user dropdown, and Authentik SSO integration 2026-03-12 10:42:39 -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 Lower build memory ceiling to 1024MB and clean npm cache in deps layer 2026-04-07 23:14:09 -05:00
eslint.config.mjs Initial commit from Create Next App 2026-03-09 15:31:21 -05:00
next.config.ts Auto-resume email and folder watchers on server startup 2026-04-07 13:14:41 -05:00
package-lock.json Fix PDF page count detection and add processing diagnostics 2026-04-07 22:12:21 -05:00
package.json Fix PDF page count detection and add processing diagnostics 2026-04-07 22:12:21 -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