Lynx PDF Studio for VS Code
Agentic, git-native PDF automation.
Edit an OpenPDF Workflow file; a deterministic engine renders the PDF.
You don't click around a PDF editor — you edit an OpenPDF Workflow (OPW) file,
and a deterministic engine renders the PDF. The workflow is the source of truth;
the PDF is a build artifact; git is your undo stack.
# workflow.opw.yaml
version: 1
kind: pdf
inputs:
- input/contract.pdf
- input/appendix.pdf
operations:
- merge: {}
- delete_pages: { pages: [10, 11] }
- watermark: { text: INTERNAL, opacity: 0.15 }
- add_page_numbers: { format: "Page {n} of {total}", position: bottom-right }
- set_metadata: { title: Contract, author: Legal }
output:
file: output/contract_final.pdf
See it in action
Save the file and the PDF re-renders. Diff it, revert it, review it in a PR —
it's just code.
Why it's different
- Code-first, not click-first. Every change is a line in a human-readable
YAML file — versionable, diffable, reproducible. No opaque binary edits.
- Deterministic pipeline.
parse → validate → optimize → plan → render. The
same workflow always produces the same PDF; the plan is previewable and hashable.
- Agent-native. A local MCP server exposes deterministic OPW helpers so any
MCP-capable coding agent can edit your workflow safely — with a generated
CLAUDE.md / AGENTS.md that teaches it your project.
- Batteries included, nothing required. The bundled engine renders many
operations with zero external dependencies; advanced ones light up when their
optional backend is present.
Discover and build without memorizing YAML
|
Searchable Operations panel — all 77 operations grouped by category. Search,
click to open the docs, or + to add one to the active workflow.
Guided Add Operation — pick an operation and fill its parameters with native
controls: dropdowns for choices, validated number boxes, list inputs. No hand-typing
raw YAML.
Per-operation Documentation — every op has a page with a summary, a parameter
table, and a complete, copy-pasteable example workflow.
Live preview & color-coded Dependencies — the output re-renders on save; every
backend shows green when ready, amber with a one-click install hint when not.
|
|
77 operations, thirteen categories
Every operation is one line in the operations: list. A quick reference:
Pages & layout (15)
merge — concatenate all inputs into one PDF
split — split into multiple PDFs by page ranges
split_invoices — split a multi-invoice PDF into one file per invoice (auto-named)
delete_pages — remove the given pages
reorder_pages — reorder pages to a new order
rotate_pages — rotate pages by a multiple of 90°
flip_pages — mirror pages horizontally or vertically
insert_blank — insert a blank page at a position
extract_pages — keep only the given pages
crop — crop pages to a rectangle
scale_pages — resize to A4/Letter/Legal or by a factor
n_up — place multiple source pages per sheet in a grid
booklet — impose 2-up in saddle-stitch booklet order
poster — split each page into a grid of tiles (also halves a 2-up scan)
single_page — combine every page into one tall page
Stamps & overlays (5)
watermark — stamp a diagonal text/image watermark
stamp — stamp positioned text or an image
annotate — add text, highlights, notes, shapes, or images
add_page_numbers — stamp page numbers on every page
overlay — overlay another PDF's pages on top
Metadata, bookmarks & tables (8)
set_metadata — set title/author/subject/keywords
set_bookmarks — replace the outline/bookmarks
extract_bookmarks — export the outline as JSON
extract_fields — export form fields to CSV
extract_tables — detect tables and export each as CSV
pdf_info — write a JSON report (pages, sizes, metadata, fonts, security)
compare_pdfs — page-aligned text + visual diff of two PDFs
set_view_preferences — control how a PDF opens (layout, full-screen, zoom)
Text, image & Markdown extraction (5)
extract_text — extract page text (optional header/footer + reflow cleanup)
extract_markdown — extract content as Markdown (tables included)
extract_images — extract embedded images
render_pages — render pages to PNG/JPG or vector SVG
replace_image — replace an embedded image object
Redaction & cleanup (8)
redact — permanently remove content in regions
auto_redact — find and truly delete matching text / PII patterns
sanitize — strip JavaScript, embedded files, metadata, and links
remove_annotations — remove all annotations
remove_images — remove all images
remove_blank_pages — detect and delete blank pages
ocr — add a searchable text layer via OCR
extract_js — report embedded JavaScript for inspection (read-only)
Forms (4)
fill_form — fill a known form from your records (see the supported forms below)
fill_field — set a single form field's value
flatten — bake form fields + annotations into the page
unlock_forms — clear the read-only flag so fields can be filled
Attachments (2)
extract_attachments — extract embedded file attachments
add_attachments — embed a file as an attachment
Encryption & permissions (3)
encrypt — password-protect with AES-256
decrypt — remove password protection (supply the password)
set_permissions — restrict print/copy/modify via an owner password
Optimize, repair & archival (8)
compress — reduce file size (deep compression when available)
linearize — linearize for fast web view
repair — repair/rewrite a broken PDF
decompress — uncompress content streams (debuggable PDF)
rasterize — flatten every page to an image
recolor — dark mode / invert / grayscale (dark mode keeps photos intact)
scanner_effect — make a clean PDF look scanned (skew, softening, grain)
pdf_to_pdfa — convert to PDF/A for archival
Convert to PDF (7)
images_to_pdf — build a PDF from images (PNG/JPEG/WEBP/TIFF/SVG/HEIC)
html_to_pdf — render an HTML file to PDF
markdown_to_pdf — render Markdown to a styled PDF
url_to_pdf — fetch a web page and render it to PDF
eml_to_pdf — render an .eml email to PDF (remote images blocked)
epub_to_pdf — convert an EPUB ebook to PDF
office_to_pdf — convert docx/xlsx/pptx/odt to PDF
Convert from PDF (6)
pdf_to_docx — convert a PDF to Word
pdf_to_pptx — convert a PDF to PowerPoint
pdf_to_xlsx — convert a PDF to Excel
pdf_to_html — convert a PDF to HTML
pdf_to_markdown — convert a PDF to Markdown (tables included)
pdf_to_epub — convert a PDF to a reflowable EPUB (Kindle)
Document intelligence (AI) (3) — local LLM (Ollama) by default, or Claude with an API key; opt-in, private
summarize — LLM Markdown summary of the document
translate — LLM translation to a target language
semantic_search — ask a PDF a question; ranked passages with page numbers (local embeddings)
Digital signatures (3)
sign — digitally sign with a PKCS#12 certificate
validate_signature — validate signatures; emit a JSON report
timestamp — add an RFC-3161 trusted timestamp
fill_form fills these real forms from a local, gitignored people.yaml (or inline
values:), mapping friendly keys to each form's actual fields — 9 forms across 4 categories:
- Passport —
ds11 (U.S. Passport Application) · ds82 (U.S. Passport Renewal)
- Tax —
f1040 (IRS 1040) · w9 (IRS W-9) · w4 (IRS W-4) · w7 (IRS W-7 / ITIN) · nec1099 (IRS 1099-NEC)
- Employment —
i9 (USCIS I-9, Employment Eligibility)
- Immigration —
i765 (USCIS I-765, Employment Authorization / EAD)
The PDF Fill sidebar and the form_fields MCP tool show each form's fields plus a
copy-paste starter workflow. New forms are drop-in JSON packs.
Batch — one workflow over many files
Put a glob in inputs and the whole workflow runs once per matched file:
inputs:
- "invoices/*.pdf" # each match runs the ops below
operations:
- compress: {}
- watermark: { text: PAID }
output:
folder: output/processed # → output/processed/<input-name>.pdf per file
The output is per-input — an output.folder (named by the input) or a templated
output.file ({stem}/{name}/{ext}/{i}). One bad file is skipped and reported,
not fatal; progress shows "file i/N".
Markdown / HTML / URL → PDF, high fidelity, no bloat
markdown_to_pdf, html_to_pdf, url_to_pdf, and eml_to_pdf render through a
system Chrome or Edge in headless print mode for full-fidelity output — no
200 MB bundled browser. When no browser is present they fall back to WeasyPrint and
then a pure-Python engine, so they always work.
Scanned books & documents → Markdown (AI OCR)
Old scans with a poor or missing text layer? extract_markdown and
pdf_to_markdown can run Marker (Surya OCR + layout models) to rebuild clean,
GitHub-flavored Markdown — headings, lists, and tables intact — straight from the
page images:
operations:
- extract_markdown: { engine: marker }
Marker is accurate but heavy. For a full book, offload it to a GPU box over SSH
with one parameter — minutes on a GPU vs hours on a CPU:
operations:
- extract_markdown: { engine: marker, remote: user@gpu-box } # 138-page scan → ~1 min on a 4090
The PDF is uploaded, Marker runs on the remote GPU, and the Markdown is downloaded.
Off by default — enable pdfStudio.allowRemoteRender; it runs over key-based SSH,
and the host is validated to block command injection. For lighter scans,
ocr_first: true runs an OCRmyPDF/Tesseract pass before extraction — no GPU needed.
Convert any file to Markdown
Beyond PDFs: right-click any file in the Explorer → Convert File to
Markdown, or run it from the palette. Powered by Microsoft MarkItDown, it
turns Word / PowerPoint / Excel / HTML / EPUB / CSV / images and more into clean
Markdown — handy for docs, diffs, and LLM ingestion. (Install MarkItDown when
prompted; it's an optional backend.)
Execution backends
The bundled pdf-lib backend runs page layout, stamps, watermarks, metadata, and
image→PDF with zero external dependencies. Advanced operations use optional
backends the extension auto-detects:
| Backend |
Unlocks |
| Python (PyMuPDF / pikepdf / OCRmyPDF / pymupdf4llm) |
extraction, redaction, sanitize, forms, encryption, OCR, PDF/A, info |
| Marker (Surya OCR + layout) |
AI OCR: scanned books / PDFs → clean Markdown; optional remote GPU render |
| Ghostscript / qpdf |
deep compression, linearization |
| Tesseract |
OCR text layer |
| LibreOffice |
Office ⇆ PDF conversion |
| Chrome / Edge |
high-fidelity Markdown / HTML / URL → PDF |
| pyHanko |
digital signatures, timestamps |
Until a backend is installed, opw_compile reports its operations as
unsatisfied — nothing fails silently.
Getting started
- Lynx PDF Studio: Initialize Project — seeds
workflow.opw.yaml + sample inputs.
- Edit the workflow — by hand, the Operations panel, guided Add Operation…,
or your coding agent.
- Render Workflow (▶ in the sidebar) — writes
output/*.pdf.
- Open Preview — see the result; it re-renders on save.
Agent-native (MCP)
A local MCP server exposes deterministic OPW helpers — opw_validate,
opw_compile, opw_optimize, opw_diff, opw_scaffold, opw_operations — so an
MCP-capable agent can author and check workflows without ever touching the PDF
directly. The server never renders and never writes files. Set Up MCP for This
Workspace wires it into your project in one step.
Security & trust model
A workflow is treated as potentially untrusted — it may be cloned, shared, or
agent-authored. Input/output/asset paths are confined to the project directory,
${ENV_VAR} expands only in password params (never into text/url/metadata), the
Python interpreter is pinned, and webviews use a strict CSP. Because url_to_pdf /
html_to_pdf fetch network and local resources by design, review an untrusted
workflow before rendering it. Full details:
docs/security.md.
Telemetry
Lynx PDF Studio collects anonymous, non-identifying usage events (which
features and operations are used, and whether a render succeeded) to help
prioritize development. It never collects file paths, document contents,
names, or any personal data — only vscode.env.machineId (an anonymized
per-install id). Events are only sent when VS Code's global telemetry setting
(telemetry.telemetryLevel) is enabled; you can also turn off just this
extension's analytics with pdfStudio.telemetry.enabled. Set
pdfStudio.telemetry.debug to see exactly what is sent.
About
Lynx PDF Studio is built by Lynx DI. Explore more at
lynxdi.com.
License
Proprietary — Copyright © 2026 Lynx DI. All rights reserved. See LICENSE.
Bundled third-party components remain under their own licenses (see NOTICE).