Matthew Jackson 7775641fe7 Show actual GPS coordinates and place name in removed metadata
Reverse geocodes GPS coords via Nominatim to show the real location
that was embedded in the photo, making it clear what was stripped.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 18:27:01 -07:00
2026-01-22 08:30:14 -08:00
2026-01-22 16:39:18 +00:00
2026-01-22 08:31:44 -08:00
2026-01-22 08:22:24 -08:00

PostConvert Robust Image & PDF → JPEG Conversion Service

PostConvert is a small, production-oriented HTTP service for converting images and PDFs into JPEGs, with strong emphasis on robustness, predictable resource usage, and operational safety.

It supports:

  • JPEG → JPEG (resize + recompress)
  • PNG / WebP / TIFF → JPEG
  • HEIC / HEIF → JPEG (via WASM fallback)
  • PDF → JPEG (first page or all pages as a ZIP)

The service is designed to run well in containers, serverless-ish environments, and small VMs where disk, memory, and runaway workloads matter.


Primary Use Cases

  • Normalize user uploads (receipts, photos, scans) into JPEG
  • Resize and recompress images server-side for storage or ML pipelines
  • Convert PDFs (receipts, invoices, statements) into images
  • Handle HEIC uploads from iOS devices without native libheif dependencies
  • Safely process untrusted user uploads with bounded resource usage

Key Design Goals

  • Always JPEG out
  • Bounded /tmp usage (PDFs rendered page-by-page)
  • No stack traces leaked to clients
  • Fast path for common formats
  • Graceful abort on client disconnect
  • Predictable limits (size, pages, DPI, timeouts)

Endpoints

POST /convert

Converts a single image or the first page of a PDF to a JPEG.

Supported inputs

  • JPEG, PNG, WebP, TIFF, etc. (anything Sharp can decode)
  • HEIC / HEIF
  • PDF (first page only)

Response

  • 200 image/jpeg on success
  • JSON error on failure

POST /convert/pdf

Converts all pages of a PDF into JPEGs and returns a ZIP archive.

Pages are rendered one at a time to keep disk usage bounded.


Authentication

All endpoints require a bearer token.

Authorization: Bearer <CONVERTER_TOKEN>

Image Resize & JPEG Options (Headers)

Header Type Default Description
x-jpeg-quality 0100 100 JPEG compression quality
x-max-dimension px none Max width/height, aspect preserved
x-width px none Explicit output width
x-height px none Explicit output height
x-fit enum inside inside, cover, contain, fill, outside
x-without-enlargement bool true Prevent upscaling smaller images

Environment Variables

Variable Default Description
PORT 8080 Server port
CONVERTER_TOKEN (required) Bearer auth token

Runtime Dependencies

  • Node.js 18+
  • pdftoppm (Poppler utils) required for PDFs
  • Sharp native dependencies (per Sharp docs)
Description
No description provided
Readme 11 MiB
Languages
JavaScript 77.7%
Shell 21.1%
Dockerfile 1.2%