An extensible PDF editor. Open a PDF or scanned image, edit and add real text with true font metrics, mask regions, and inspect embedded text — then extend it with drop-in plugins.
Recto's core does one thing: it opens a document, renders its pages, and exposes a plugin API. Everything else is a plugin.
pdf_core— the shell. Opens the document, rasterizes pages, reads the embedded text and typography, and hosts the viewer. It runs no analysis of its own.text_tool— edit and add text with real font metrics (HarfBuzz-shaped widths).embedded_text_viewer— inspect the text already embedded in the PDF.extracted_text— backend text extraction and glyph calibration.
Optional plugins ship separately and are documented in guide/plugins/ —
nothing in the core or the list above depends on them.
Plugins are discovered by scanning for any directory containing an apps.py. Drop a
folder in to add a tool; delete the folder to remove it. A plugin registers itself with
@register_tool, declares the UI slots it fills (toolbar button, ribbon bar, sidebar,
scripts, styles), and subscribes to lifecycle events on the PDFHooks bus — so the core
never calls a plugin by name, and removing one leaves nothing dangling.
See guide/tool-expansion-guide.md to write one.
Requires: Python 3.10+ installed and on PATH.
Double-click run_app.bat — it installs dependencies and opens the app in your browser.
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver 5000Then open http://localhost:5000.
Full documentation is in guide/.