No description
Find a file
Randall Stillwell c879328775 Update npm packages and remove unused minio dependency
- Remove unused minio package (using @aws-sdk/client-s3 instead)
- Update @aws-sdk/client-s3, s3-request-presigner to latest
- Update react, react-dom to 19.2.4
- Update @types/node to v25
- Update shadcn to 4.0.5
- Run npm audit fix for non-breaking fixes
- Remaining 9 vulns are in Prisma's transitive deps (hono, lodash)
  and cannot be fixed without downgrading Prisma

Tested: local Docker build passes
Made-with: Cursor
2026-03-11 07:55:34 -05:00
prisma Add database auto-migration, storage cleanup, and startup fixes 2026-03-10 13:21:05 -05:00
public Add public directory required by Next.js standalone output 2026-03-10 08:28:43 -05:00
src Add /api/health endpoint to diagnose MinIO connectivity 2026-03-10 14:11:16 -05:00
.dockerignore Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -05:00
.env.example Build Echo OCR app: full-stack response card scanner 2026-03-10 07:17:45 -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 Update npm packages and remove unused minio dependency 2026-03-11 07:55:34 -05:00
package.json Update npm packages and remove unused minio dependency 2026-03-11 07:55:34 -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