factcircuit
FactCircuit: an auditable claim-and-evidence verification loop with immutable provenance, staged checks, bounded retrieval, and reproducible evaluation.
A free, offline desktop digitizer for scientific figures. Graph in, reliable data out.
Translation pending
DataTypeScript · JavaScriptGitHub @katalystnordOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Free, offline, cross-platform desktop app for extracting data from the figures in scientific papers. AGPL-3.0, based on WebPlotDigitizer.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A fully offline, cross-platform desktop application for extracting quantitative data from charts and graphs. Load a figure, calibrate the axes, place or auto-trace points, export to CSV / JSON / Excel / LaTeX / MATLAB / Python / R - no account, no internet connection, no browser required.
PlotTracer's calibration engine began as an extraction of WebPlotDigitizer by Ankit Rohatgi (AGPL-3.0); the application - its interface, interaction model, and workflow - is a ground-up rebuild in TypeScript + React + Electron.Read the full README ↗A fully offline, cross-platform desktop application for extracting quantitative data from charts and graphs. Load a figure, calibrate the axes, place or auto-trace points, export to CSV / JSON / Excel / LaTeX / MATLAB / Python / R - no account, no internet connection, no browser required.
PlotTracer's calibration engine began as an extraction of WebPlotDigitizer by Ankit Rohatgi (AGPL-3.0); the application - its interface, interaction model, and workflow - is a ground-up rebuild in TypeScript + React + Electron.
An enormous amount of quantitative knowledge exists only as figures. Stress-strain curves, load-displacement data, fatigue life plots, statistical distributions, economic time series, dose-response relationships - published in papers, reports, standards, and regulatory filings, locked inside raster images, unavailable for reanalysis unless someone manually re-extracts the numbers. Plot digitisation is not an exotic edge case; it is a routine part of working with any published or legacy dataset.
Engineers, analysts, and researchers doing this work need a tool they can trust. That means:
No account required, no data sent to any server, and no dependency on any company's continued interest in keeping the lights on.
Chart / axes types - XY, Bar, Polar, Spider / Radar (every spoke calibrated separately, so each axis keeps its own range), Pie / Donut (calibrated from the outline, so the centre is fitted rather than clicked - which is what makes a donut, an exploded slice and a tilted 3D pie readable), Heatmap (x and y each independently a category or a value, with the colour key calibrated as a third axis), Ternary, Map (scale bar), Circular Chart Recorder, Histogram (captures true bin edges, not just centres), Box Plot, Span chart (a bar that floats clear of the axis - a temperature range, a tornado chart - reporting both measured ends, and carrying its own error bars on each end), Candlestick (four marks per candle, walked bottom-up by position, with each period's direction measured from the body's own colour and a single tick to flip a figure drawn the other way round), Line with a categorical X axis. Error bars are not a graph type - they are a rail tool, captured on top of whichever series they belong to.
Getting points off a figure
Analysis - curve fitting (polynomial degree 1–9, plus exponential, power-law, logarithmic, Gaussian and logistic models solved by Levenberg–Marquardt; optional x-range), geometry & statistics (arc length, enclosed area, curvature), and a Check-Calibration overlay that draws the calibrated axis box back onto the image.
Measurements - distance, angle, area, slope, and a px→real-unit "Set scale" reference, kept as a separate collection from the series data.
Images & documents - PNG, JPG, GIF, BMP, WEBP, SVG, PDF (multi-page), and TIFF / multipage TIFF (historic scans). Rotate, flip, crop, and fine-angle deskew - all undoable.
Multi-figure projects - one project holds several figures (e.g. every page of a paper), each with its own image, calibration, graph type, and series; flip between them and extract another from the retained source.
Export - CSV, TSV, JSON, OpenDocument (.ods), Excel (.xlsx), LaTeX, MATLAB, Python, R (data.frame), plus a WYSIWYG PNG of the digitised figure. Any text format can be saved to a file or copied straight to the clipboard. Exported numbers report at a sensible precision (never finer than the pixel grid), and fitted curves export as their own labelled blocks. Where a series has them, exports also carry a role column - anchor for a point you judged by eye, interpolated for one the app filled in between - so the provenance the project file keeps survives the hand-off to someone else.
Durable record - undo/redo across everything, project save/load as a self-contained .zip (optionally bundling the source PDF/TIFF), and one-way import of projects written by other digitizers - the format is recognised from the file's own bytes, never its name, and more formats are added as entries in one registry. Import only: PlotTracer does not write other tools' formats, and could not carry a third of what it records into them.
Fully offline - no account, no telemetry, no cloud calls.
| Left button | the active tool (place / calibrate / trace / measure …) |
| Ctrl + Left, or Middle button | pan |
| Scroll wheel | zoom |
| Right-click | quick context menu (delete point, edit value, fit to view, …) |
Enter | accept the current step (apply crop, finish area, run calibration) |
Esc | back out of the current step / clear the selection |
Del / Backspace | delete the active point or measurement |
0–9 | switch tools (mirrors the rail) |
| Arrow keys | nudge the selected point/handle (Shift = coarse) |
Q / W | step to the previous / next point |
Ctrl+Z / Ctrl+Shift+Z | undo / redo |
Installers for Linux (AppImage + .deb), Windows (NSIS .exe), and macOS (.dmg) are built by GitHub Actions. Grab them from the artifacts of a Build desktop binaries run, or from a tagged release.
The mac and Windows builds are currently unsigned - on first launch macOS Gatekeeper needs a right-click → Open, and Windows SmartScreen a More info → Run anyway. Code-signing is a planned follow-up.
chmod +x plottracer_<version>_x86_64.AppImage
./plottracer_<version>_x86_64.AppImage
sudo dpkg -i plottracer_<version>_amd64.deb
The post-install step sets the chrome-sandbox permissions Chromium's SUID sandbox needs, so no manual chown/chmod is required.
git clone https://github.com/katalystnord/plottracer.git
cd plottracer
npm install
npm start # builds the UI and launches the app (= npm run ui:start)
npm run ui:dist:linux # AppImage + deb
npm run ui:dist:mac # dmg + zip (must run on macOS)
npm run ui:dist:win # nsis .exe (must run on Windows)
macOS and Windows installers can only be produced on their own OS, which is why CI builds all three on GitHub-hosted runners.
npm test # vitest (unit + Electron e2e)
npm run lint
npm run typecheck
PlotTracer is a single Electron application built from four framework-independent layers plus a React shell:
plottracer/
├── core/ ← calibration math + data model (the axes classes, Dataset,
│ the WebPlotDigitizer project-format reader), ported to TypeScript
├── algorithms/ ← pure functions: segment fill, colour trace, blob detect,
│ interpolation, grid removal, curve fit, geometry, histogram, error bars
├── engine/ ← canvas/Konva rendering, the tool state machine, sessions,
│ import/export, paged-document (PDF/TIFF) rendering
├── ui/ ← the React shell + the Electron entry/preload/menu (electron-*.cjs)
├── icons/ ← the SVG icon set
├── build/ ← electron-builder config, app icons, packaging hooks
└── samples/ ← bundled example figures (with committed ground-truth values)
core/ and algorithms/ have no browser dependency; the interactive layer lives in engine/ and ui/.
PlotTracer's calibration engine is a TypeScript port of WebPlotDigitizer by Ankit Rohatgi, and the whole project is distributed under the same licence.
WebPlotDigitizer - Copyright 2010–2025 Ankit Rohatgi Licensed under the GNU Affero General Public License v3.0 https://github.com/automeris-io/WebPlotDigitizer
The import filters are verified against other tools' own project files - a fixture we authored ourselves would only prove that we agree with ourselves.
Where the licence allows redistribution, those files are committed here unmodified; see engine/__tests__/fixtures/wpd/PROVENANCE.md for their source and terms. Where it does not, they are not: Engauge Digitizer's test corpus is GPL-2.0, which is incompatible with this project's AGPL-3.0, so none of it lives in this tree. Its reader was instead verified against all 44 of those files locally, and the fixtures committed for it are ones we wrote from the format itself.
Several algorithms (flood-fill curve tracing, grid-line removal, curve fitting, geometry/statistics) are clean-room reimplementations of ideas from Engauge Digitizer (Mark Mitchell, Jason Nicholson; GPL-2.0) - written from the algorithm descriptions, not translated from the C++ source.
PlotTracer also reads StarryDigitizer projects (MATO Tomoya; MIT). Its licence permits literal reuse with attribution, but none is taken: only the file FORMAT is read, and the reader is our own code.
StarryDigitizer - Copyright (c) 2021 MATO Tomoya Licensed under the MIT License https://github.com/t29mato/starry-digitizer
The icon set is derived from Ketcher by EPAM Systems (Apache-2.0).
Reading text off a figure (category names, axis labels) uses Tesseract.js (Apache-2.0) and the Tesseract English training data (Apache-2.0 engine, MIT-licensed data package). Both are bundled, and the engine is configured against local files only: no part of a figure, and no request of any kind, leaves the machine to read a label. That is verified rather than asserted - the test removes fetch, http.request and https.request outright and the labels still read.
Tesseract.js - Copyright (c) 2015 Kevin Kwok, Guillermo Webster and contributors Licensed under the Apache License 2.0 https://github.com/naptha/tesseract.js
Issues and pull requests are welcome. Please note:
GNU Affero General Public License v3.0 - see LICENSE for the full text. This licence is inherited from WebPlotDigitizer upstream and must be preserved in all distributions.