a52244af390308936aac5c4a58c37401747502ea
docker-compose pulls :latest but the workflow only pushed branch-name tags (e.g. :main) and SHA tags -- never :latest. Portainer stacks reported "manifest unknown" when trying to pull the image. Add type=raw,value=latest scoped to the default branch so pushes to main now also tag the image as :latest.
ezcheck
Self-hosted web app for printing checks on blank check stock. Replaces ezCheckPrinting (Halfpricesoft).
Stack
- Runtime: Node.js 20
- Framework: Express
- Database: SQLite via
better-sqlite3 - PDF generation: PDFKit with embedded MICR E-13B font
- Frontend: Vanilla JS, no framework
- Container: Docker Compose
Project Structure
ezcheck/
├── src/
│ ├── routes/
│ │ ├── checks.js # CRUD for check records
│ │ ├── accounts.js # Account config (Phase 2)
│ │ └── pdf.js # PDF generation endpoint
│ ├── services/
│ │ └── pdfService.js # PDFKit rendering logic
│ ├── db/
│ │ ├── schema.sql # SQLite schema
│ │ └── database.js # DB connection + helpers
│ └── app.js # Express app
├── migrations/
│ └── import-mdb.js # One-time .mdb import script
├── public/
│ ├── css/style.css
│ ├── js/app.js
│ └── index.html
├── fonts/ # MICR E-13B TTF goes here
├── docker/
│ └── Dockerfile
├── docker-compose.yml
├── package.json
└── .env.example
Getting Started
Development (local)
npm install
cp .env.example .env
node migrations/import-mdb.js --file /path/to/YourAccount.mdb
npm run dev
Production (Docker)
docker compose up -d
Migration
The import script reads a single .mdb file and populates the SQLite database.
It requires mdbtools to be installed on the host or available in the container.
node migrations/import-mdb.js --file "Montana Dinosaur Center.mdb"
Printing
- Select 1–3 checks from the ledger
- Click "Print PDF"
- App generates a 3-up 8.5"×11" PDF (three 3.667" check slots)
- PDF opens in browser, user sends to printer
- Checks are marked as printed in the ledger
Check Layout Coordinate Space
Coordinates are in inches. Origin is top-left of each check slot. Check slot dimensions: 8.5" wide × 3.667" tall (three per letter page). MICR line is hardcoded at Y = 3.4" (0.267" from bottom of slot).
MICR Font
Place micrenc.ttf or GnuMICR.ttf in the fonts/ directory.
Update MICR_FONT_PATH in .env if using a different filename.
Description
Languages
JavaScript
78.2%
HTML
13.7%
CSS
8%
Dockerfile
0.1%