The PDF toolkit your files never leave. A fast, free, fully offline PDF app for macOS, Windows, and Linux.
Slab is a desktop PDF app that runs entirely on your machine. No accounts. No uploads. No cloud round‑trips. Open a PDF, do something useful with it, save the result — same as any other app on your computer.
Eight pillars, all local:
| Pillar | What it does |
|---|---|
| Read & navigate | Open PDFs, thumbnails, outline, find, highlights, sticky notes, recents |
| Manipulate | Merge / Split / Pages / Compress / Extract / Encrypt / Watermark / Convert / Metadata / Numbers / Sign / Crop / Insert / Headers&Footers / Redact / N‑up |
| Document tools | Markdown→PDF · Grayscale · Page Labels · Auto‑Redact · Polyglot (.docx/.xlsx/.epub/.html/...) · Flatten · Sanitize · Repair · Edit Text |
| OCR & vision | Tesseract OCR plus batch queue, table extraction, language packs, preflight, and vision Q&A in Beacon |
| AI (local) | Beacon — Chat · Summary · Semantic Search · PII Redact · Smart Outline · Citations · Study Mode · Glossary · Voice Mode (TTS + STT), on‑device only |
| Productivity | PDF Library · line‑level diff · presenter mode · settings + keyboard shortcuts · detachable panels |
| Reach | Modal Vim mode · WCAG‑level a11y audit + fixes · i18n foundation |
| Extensible | Foundry + Bench — declarative plugin system with a signed, in‑app marketplace |
A full Rust test suite (730+ tests) passing, clippy‑clean with -D warnings, type‑checked Svelte 5 front‑end. Cross‑platform CI on macOS, Windows, and Linux.
Jump to any tool from anywhere. Type a few letters and hit Enter.
PDF viewing done right: thumbnails, outline, find, zoom, fit‑width / fit‑page.
A browsable library view across every PDF you've imported — folders, tags, search‑within‑library, thumbnail grid, watched‑folder auto‑indexing.
Eleven AI features that run entirely on your machine by default. No API keys, no cloud, no telemetry — the same air‑gap promise as every other Slab tool.
Core (since v0.10):
Reading & study (post‑Bench):
[12], and bracket‑key [smith2024] inline cites, extracts the end‑matter bibliography with the LLM, and links every mention to its reference. Mention‑count badges, expandable inline‑cite chips, one‑click jump‑to‑page. Regex‑only fallback works offline.~/.slab/study.sqlite. Click a card's page number to jump straight back to the source.Voice Mode (v1.9):
say on macOS, espeak-ng on Linux, PowerShell SpeechSynthesizer on Windows. Voice + words‑per‑minute slider. Pressing speak twice cancels the in‑flight utterance — single‑slot, no queue.sox to capture, Linux uses arecord, Windows uses PowerShell SoundRecorder; the WAV is unlinked unconditionally on every code path. Nothing is uploaded, nothing lingers on disk.send it) auto‑submits your dictated prompt for true hands‑free chat; and a Whisper model picker (tiny.en / base.en / small.en, plus any custom ggml-*.bin dropped into ~/.slab/models/) so you can swap models per‑recording or set a default.Pluggable AI provider — Ollama is the default; any OpenAI‑compatible endpoint is a config away (LM Studio, vLLM, a remote host, or a Foundry plugin).
Powered by local embeddings + an on‑device chat model (configurable). The first model download is the only thing that hits the network; after that, Beacon works offline.
Drop multiple PDFs, drag to reorder, save the combined file anywhere.
Pull out a page range, or chop a PDF into chunks of N pages.
Regex‑driven or outline‑driven chapter splitting; one PDF in, one PDF per chapter out.
Rotate any page 90°/180°/270°, delete pages, reorder by drag, duplicate, blank inserts (A4/Letter/Legal).
In‑place PDF text editing. Click a word, change it, save. Slab rewrites the content stream while preserving fonts, positioning, and surrounding layout.
Lossless content‑stream re‑compression with bytes‑saved report.
Page‑by‑page text preview. Copy snippets or save the whole thing as .txt.
Lock with a password (RC4‑40, universally compatible). Unlock just as easily.
Text at any angle, with opacity and gray controls. Whole document or specific pages.
Two‑way conversion: PDF → PNG/JPG/WebP, or images → PDF.
View every Info‑dictionary field (Title, Author, Subject, Keywords, Creator, Producer), edit them, or hit one button to strip everything (plus XMP) for a truly anonymous PDF.
Stamp page numbers with a template like Page {n} of {total}, in any of 6 positions, with custom font size, gray level, starting number, and a "skip first N pages" option for covers.
Drop a signature scan, company logo, or APPROVED stamp onto any page. Position, scale, and opacity all live‑tweakable.
Trim margins by percentage from each edge. Optionally rewrite the MediaBox so downstream tools see the new size, not just a clipped view.
Splice blank A4/Letter/Legal pages or pages from another PDF at any 1‑indexed position. Insert before or after, in bulk.
Stamp templated text bands across every page. {n}, {total}, {date}, {filename} tokens, six anchor positions, custom font size + opacity.
Paint solid black rectangles over sensitive regions. Page‑by‑page, drag to draw, burned into the content stream — no scrubbing reveals the original.
Find and cover sensitive content automatically. Built‑in presets for emails, US SSNs, phone numbers, and credit cards. Add your own regex patterns. Adjustable bar color. Line‑level bounding boxes drawn over each match.
Compose 2, 4, 6, or 9 pages onto a single sheet for printing — landscape or portrait, configurable spacing, exact reproductions of each source page.
Write or paste Markdown, click Convert, get a clean PDF. Headings, bold, italic, code, lists, blockquotes, code blocks, horizontal rules — all rendered with standard Helvetica. No font embedding means tiny output files (~1 KB per page).
Convert RGB and CMYK fills and strokes to gray inside PDF content streams. Vector‑true — no rasterization — using ITU‑R BT.601 luminance. Range‑selectable. Embedded raster images are unchanged in this pass.
Control how PDF readers display page numbers: roman numerals for front matter, arabic for the body, custom prefixes for chapters. Multiple ranges in one shot, live preview of exactly what each style produces. Sets the catalog's /PageLabels number tree per the PDF spec.
Bake form fields and annotations into the page so the output PDF has no editable layers. Visual appearance preserved; interactivity gone.
Make a PDF safe to forward. Strips JavaScript, embedded files, launch actions, /OpenAction, /AA, XFA, and (by default) external URI links. Pixel‑identical output.
Rebuild the xref table and drop unreachable indirect objects. Fixes most "this PDF won't open" files and shrinks PDFs bloated by incremental edits.
Tesseract‑backed OCR turns scanned documents into searchable, copyable text. Language packs managed in‑app. Batch queue, preflight diagnostics, and vision Q&A in Beacon for figures and charts.
Ruled and unruled grid detection across the open PDF. Pick a page, pick a region, export to CSV.
Line‑level text diff between any two PDFs, with optional Beacon‑powered "Explain Changes" plain‑English summaries. Export a Change Report as PDF for review workflows. The diff itself, like everything else, never leaves your machine.
Turn any PDF into a deck. Full‑screen slideshow, speaker notes view, live annotation on top of slides, save the annotated deck back out as a new PDF, and a remote keyboard shortcut layout.
A proper Settings system with theme + accent color + density (compact / cozy / comfortable), a customizable keymap, global toast notifications, pinned recent files.
Foundry is the declarative plugin system: drop a folder containing a plugin.toml manifest into ~/.slab/plugins/, restart, done. No Rust compile, no native code. Five contribution kinds:
| Kind | What it does | Backed by |
|---|---|---|
| Theme | Override CSS variables to restyle Slab. | CSS file in themes/. |
| Locale | Add or override an interface language. | JSON file in locales/. |
| Command | Run a shell command or open a URL from the palette. | TOML entry; quoting‑aware tokenizer. |
| AI provider | Register any OpenAI‑compatible endpoint. Appears in Beacon. | TOML entry; Chat Completions wire format. |
| PDF action | Reader toolbar dropdown that pipes the open PDF through a CLI. | TOML with {in} / {out} placeholders. |
Bench (v1.4) is the in‑app marketplace on top of Foundry: a curated, Ed25519‑signed index of plugins users can browse and install in one click — no terminal needed. Every entry is signed by the maintainer; before install Slab verifies the entry signature against the embedded public key, then verifies the tarball's SHA‑256 matches the signed manifest_sha256. If any step fails, install aborts and nothing is written. Provenance end‑to‑end.
A Settings → Plugins panel lists every installed plugin with toggle, version, author, contribution counts, expandable drilldown, raw manifest errors, plus a 📁 Open plugins directory button. A Browse tab surfaces the Bench index with one‑click install, update badges, and an uninstall affordance.
Honest security framing: Foundry plugins run with Slab's permissions — there's no sandbox. Bench gives you who shipped it, not what it can do. Treat a plugin like a bash script you downloaded. Read the manifest before enabling; the panel shows the on‑disk path so you can cat it first.
📖 Author guide: docs/PLUGINS.md
A customizable keymap and a ? overlay that lists every keybinding.
A separate slab binary ships in every bundle alongside the GUI. Every op available from the terminal — no Tauri runtime, no IPC, direct library calls.
slab md2pdf input.md output.pdf --page-size Letter
slab grayscale input.pdf output.pdf
slab autoredact input.pdf output.pdf --preset email,ssn
slab info report.pdf
Point Slab at:
.docx .xlsx .pptx .xls.html .htm .csv .json .xml .rtf .odt.epub.png .jpg .gif .bmp .tif .webp (EXIF + OCR text).wav .mp3 .m4a .flac .ogg (EXIF + transcription)Under the hood Slab shells out to Microsoft's markitdown (MIT) to extract Markdown, then renders to PDF through the same md2pdf engine. Zero new Rust dependencies; PDF → PDF round‑tripping is deliberately refused (lossy).
Requires: pipx install 'markitdown[all]' (one‑time, optional — Slab still works without it for PDF input).
slab polyglot report.docx -o report.pdf
slab polyglot data.xlsx -o data.pdf --page-size Letter
slab polyglot book.epub -o book.pdf
Any sidebar panel detaches into its own native window. Drop Beacon on a second monitor while the Reader stays on the first. Open three Library views, each filtered to a different folder. Run Diff next to two side‑by‑side Readers. Cross‑window events keep it coherent. Window geometry + which‑panels‑were‑open survives app restart (~/.slab/windows.json).
A modal Vim mode built from a clean pure state machine — gg/G/j/k/Ctrl-d/Ctrl-u, count prefixes (10j), /foo<CR> + n/N, :42<CR> to jump to a page, :q to close. Reader, Library, and Beacon all wired. Cmd/Ctrl shortcuts are reserved for the app — Vim never eats your Cmd‑F.
A built‑in accessibility audit (pnpm a11y:audit, zero deps) flags icon buttons missing labels, unlabelled form inputs, and images without alt. The strict variant runs in CI on every push. Plus a global :focus-visible ring tied to your accent color, prefers-reduced-motion overrides, prefers-contrast: more border thickening, and proper <nav aria-label="Primary"> + aria-current on the sidebar.
An i18n foundation: every string in the UI passes through a t(key) function backed by JSON locale files. English ships today; community translations welcome.
Pre‑built installers ship with each release: .dmg (macOS Apple Silicon + Intel), .msi + .exe (Windows), .deb + .AppImage + .rpm (Linux).
Slab's macOS builds are currently ad‑hoc signed (we don't have a $99/year Apple Developer ID yet). The app and its signature are inspectable, but Gatekeeper doesn't trust the signer, so you'll see a security warning on the first launch only:
To verify the signature integrity yourself:
codesign -dvv /Applications/Slab.app
If you'd like to help fund a Developer ID certificate (so this prompt goes away for everyone), see SIGNING.md. CI is already wired to switch to full Developer ID signing + notarization the moment the six GitHub secrets are configured.
Prereqs: Rust ≥ 1.75, Node ≥ 20, pnpm ≥ 9.
git clone https://github.com/Sanjays2402/slab
cd slab
pnpm install
pnpm tauri dev # run in dev mode
pnpm tauri build # produce an installer / app bundle for your platform
Optional runtime deps for the AI side:
ollama pull llama3.2:3b (or any chat model). Slab also accepts any OpenAI‑compatible endpoint via Settings.say ships with macOS; Linux: apt install espeak-ng; Windows: built‑in PowerShell SAPI.brew install whisper-cpp sox (macOS), apt install whisper-cpp alsa-utils (Linux). The capability probe in Beacon Voice settings tells you exactly what's missing.cd src-tauri && cargo test
cargo clippy --all-targets -- -D warnings
cd .. && pnpm exec svelte-check # type-check the UI
Foundry is Slab's declarative plugin system. Drop a folder into ~/.slab/plugins/ containing a plugin.toml manifest and Slab can pick up custom themes, additional UI languages, shell/URL commands, OpenAI-compatible AI providers, and CLI-backed PDF actions — no compilation, no native code.
docs/PLUGINS.md — full manifest reference, contribution kinds, troubleshooting.examples/plugins/hello-slab/ — copy-paste-edit reference plugin that exercises all five contribution kinds.Cmd-K → "Open Settings → Plugins").lopdf (pure Rust) for manipulation, pdfjs-dist for rendering in the Reader, pdf-lib for client‑side composition (stamps, image embedding), pulldown-cmark for Markdown → PDF, pdfium-render + tesseract-rs for OCR.say / espeak-ng / PowerShell SAPI) for TTS and whisper.cpp for on‑device STT — Slab itself never holds your audio on disk longer than the transcription call.Slab will never ask for an email. Will never call home. Will never gate a feature behind a paywall. If it ever does any of those things, you have my permission to fork it and rip the offending lines out.
Made with 🍰 by @Sanjays2402.