Plodder is a standalone local plot digitizer. Upload a graph image, calibrate axes with multiple X/Y markers, verify with phantom points, digitize with a smoothed line overlay, refine with Best Fit (snap + simplify + undo), and export CSV, JSON, or Python.
- Multiple axis calibration points — piecewise fit for accurate scales
- Phantom verification points — place or auto-generate grid phantoms labeled with interpolated X/Y
- Main-image zoom & pan — scroll to zoom, Space/Alt+drag to pan
- Smoothed Trace line overlay — Catmull-Rom curve through points
- Best Fit — snap points onto the ink using local curve slope; simplify redundant points; undo stack
- Save / load project — resume calibration and digitized points (
.plodder.json) - Linear, Log₁₀, Logₑ, Log₂, reciprocal, √x, x², and asinh scales
- Node.js 20+
- A modern browser (runs entirely client-side; no backend)
npm install
npm run devThen open the URL Vite prints (usually http://localhost:5173).
npm run build # typecheck + production build → dist/
npm run preview # serve the production build locally
npm run lint # oxlint- Upload or drop a plot image (or load from URL)
- Calibrate X / Y — markers are seeded on a detected plot rectangle when possible; drag/add markers and enter known values (≥2 per axis). Use Log₁₀ (etc.) for log plots.
- Phantoms — optional checks on known ticks
- Trace line — left-click to add points; right-click to delete; click near the line to insert
- Best Fit — Snap to curve, Simplify, Undo
- Save project and/or export CSV · JSON · Python
Save downloads a self-contained .plodder.json with the image, X/Y calibration markers, phantoms, and digitized points. Load (or drop the file) restores the session so you don’t recalibrate.
src/
App.tsx # UI composition
types.ts # Shared domain types
hooks/ # Session, Best Fit, view transform
components/ # Canvas, panels, toolbar
lib/ # Calibration, export, geometry, project I/O
All digitizing math lives in this repo (no external CV or charting libraries). Runtime dependency: React only.
Pushes to main build and deploy via .github/workflows/pages.yml.
- Ensure the repository name matches
PAGES_BASE_PATHin the workflow (default/plotter/). - In the repo: Settings → Pages → Source: GitHub Actions.
- Push
main(or run Actions → Deploy to GitHub Pages → Run workflow).
Local production build with the Pages base path:
# PowerShell
$env:VITE_BASE_PATH="/plotter/"; npm run build; npm run preview# bash
VITE_BASE_PATH=/plotter/ npm run build && npm run previewLicensed under the Apache License 2.0.
