Website · Features · Notebooks · Shortcuts · Download · Build · Development · License
Scribe is a desktop editor for LaTeX papers. A paper, the Python notebooks behind it and the figures they make live in one project folder, and the figures and numbers in the PDF come straight from the notebooks. Everything compiles on your machine with Tectonic or TeX Live. There is no account and nothing is uploaded.
- Writing LaTeX
- Notebooks in the paper
- TikZ, drawn and written
- An assistant, with your own model
- Track changes and comments
- Revisions and the response to reviewers
- Before submitting
- References
- Notes, reading and revision cards
- Looks
- Projects
The editor is CodeMirror 6 and knows LaTeX.
- Completion for commands, environments, packages,
\reflabels,\citekeys, figures and notebook values, from every file of the paper. - Snippets: type
fig,tab,eq,ali,sec,thmand others, then Tab, and fill in the fields. Add your own in Settings, or import a VS Codelatex.json. - Hover over
\refto see the equation typeset, the figure drawn or the section's title; over\citefor the paper's title, authors and year; over\nbvalfor the value. - Writing checks underline eleven common slips, each with a one-click fix: a breakable space
before
\ref, a repeated word, straight quotes,$$ … $$,\bfand friends,..., a space before\footnote,\labelbefore\caption, unbalanced\left/\right, the space after "e.g." and after a sentence ending in capitals. Each can be turned off. - Maths: a preview of the formula under the cursor, a symbol palette, and an equation editor
(⌥⌘E) where maths is typed as it looks, with a keyboard of symbols; it writes back
LaTeX and keeps the environment and
\label. - Tables edited as a grid: alignment, rules, rows and columns, paste from a spreadsheet.
- Compiling on demand, on save, or as you type, with Tectonic or
latexmk. Errors are explained in plain words and underlined in the source. Click in the PDF to find the line, and the other way round (SyncTeX). Spell check uses the system dictionary on macOS. Vim keys are there if you want them.
Python files with # %% cells and Jupyter .ipynb notebooks open as cells and run in a Python
kernel that Scribe keeps running. A figure cell saves figures/<id>.pdf; nbval and nbtable
send numbers and tables to the paper, typeset with siunitx. When a notebook changes, its figures
are marked out of date and rerun on the next compile. Each run records the Python version,
packages, seed and git commit, which the paper can print with \nbenv.
A cell marked as a figure in notebooks/experiment.py:
# %% [figure: fig-loss]
fig, ax = plt.subplots()
ax.semilogy(epochs, loss)
nbval("best-acc", 96.4, unit="%", err=0.3)and the paper that uses it:
\usepackage{scribe-figures}
...
The best run reaches \nbval{best-acc} (Figure~\ref{fig:loss}).
\begin{figure}
\centering
\nbfig{fig-loss}
\caption{Training loss.}\label{fig:loss}
\end{figure}Compiling runs the notebook if it changed, writes figures/fig-loss.pdf and the values, and
typesets the paper. The example project in example/ is a complete paper built this
way. CSV and TSV files open as a table, with a quick plot and "Insert as LaTeX table".
Put the cursor in a tikzpicture and press ⌥⌘K: the picture is compiled on its own,
with the paper's preamble, and drawn beside the source in about half a second, again after every
edit.
- Drag any point or node; the coordinates change in the source.
- Draw lines, arrows, polylines, curves, rectangles, circles, ellipses, arcs, nodes, text and
points on a grid, with snapping. A line drawn between two nodes is written as
(a) -- (b). - Style the selection from a bar: colours, fill, line width and dash, arrow tips, node shape, font size, opacity. Select several, move, duplicate, delete, undo.
- Export as PDF, SVG or PNG, or replace the picture with the image and keep its TikZ in a
.tikzfile. Pictures also show as thumbnails in the Figures panel.
The source stays the one truth: every change is a plain edit to the TikZ, which you can undo.
demo/tikz/ has pictures to try.
Claude, GPT, Gemini, any OpenAI-compatible service (OpenRouter, Groq, LM Studio), or a model running on your computer with Ollama: you choose, with your own key, which stays in the system keychain. Nothing is sent until you set a provider.
- Ask about the paper in a side panel (⌥⌘A). It knows the outline, the open section and the bibliography keys; LaTeX it suggests goes in with one click.
- Edit with AI (⌥⌘I) on a selection: improve, shorten, fix grammar, make it more formal or simpler, translate to English, tidy the LaTeX, or say what to do. The change is shown word by word before you accept it.
- Fix a compile error from the Problems list.
- Suggestions as you type, in grey; Tab takes them. Off unless you turn it on.
Only what a request needs is sent, and the panel says what that is.
With Track Changes on (⇧⌘E), what you type is marked as \added, what you delete as
\deleted, with your initials, using the standard changes package. The marks live in the
source, so they show in colour in the PDF, travel with git, and work for co-authors in any
editor, Overleaf included.
- Comments (⌥⌘M) on a selection or at the cursor, shown in the PDF's margin.
- Review panel: every change and comment across the paper, with Accept, Reject and Resolve, or all of a file at once. ⌥⌘. goes to the next one.
- Show Changes in PDF switches between the marked-up paper and the paper as if every change were accepted.
- Compare with an earlier version: pick a git commit or a version Scribe saved, and latexdiff marks what changed, in the PDF.
- Response to Reviewers starts a letter from a template, one reply per point; text selected in the marked-up PDF is quoted into it with its page.
- History: earlier versions of every file are kept on save, to compare with now or restore.
One command lists missing citations and labels, figures the text never refers to, notebooks that
are out of date, leftover TODOs, and what arXiv would object to (file names, size). Each is a
click away from its place in the source. Export makes a zip a publisher can compile: one .tex
with everything inlined, the figures and the bibliography. % TODO and \todo{} notes are
gathered in the Review panel.
Add a BibTeX entry from a DOI or an arXiv ID (⇧⌘C), or pick it from a running Zotero 7,
including while typing in \cite{}. The References panel lists the bibliography.
- Markdown notes with maths, headings, checkboxes, images and code rendered in place,
[[links]]between notes,@keycitations and tags. Today's note and a quick note are a shortcut away; a note copies as LaTeX or exports to PDF. - A reader for PDFs in
papers/: select text, highlight it, and the quote lands in the paper's note with a link to its page. - Revision cards from
Q:andA:lines, reviewed with spaced repetition, exported for Anki. - Sketches: a drawing canvas for notes (⌥⌘D).
- Eleven themes: Scribe Dark and Light, Gruvbox, Solarized Dark and Light, Nord, Catppuccin Mocha and Latte, GitHub Dark and Light, Tokyo Night. Or follow the system's light and dark.
- Your own theme from a theme editor, every colour live, shared as a JSON file. Any accent colour on any theme.
- Fonts: JetBrains Mono, Fira Code, IBM Plex Mono, Iosevka, Source Code Pro, or any font installed on your system; ligatures, line height and interface size.
- Dark PDF: the paper shown light on dark, with its figures and images kept in their colours.
- Focus mode (⌥⌘F): only the text, centred, the line you write kept mid-screen, and today's word count against a goal.
- Templates: a plain article, IEEE and ACM conference papers, a thesis, slides, lecture notes, an article with a notebook.
- Import an Overleaf project from its zip, or clone a git repository.
- Git panel: changes, diffs, commit, push, history.
- A terminal in the project folder, a file tree with drag and drop, search across the
project, an outline that follows
\input, and a side pane for a second file. - Open tabs, cursors and panels come back when the project opens again.
On Windows and Linux, Ctrl takes the place of ⌘ and Alt of ⌥. Every command is also in the command palette (⇧⌘P).
| Command | Keys |
|---|---|
| Compile | ⌘↵ |
| Run notebooks / the cell | ⇧⌘↵ / ⇧↵ |
| Show the cursor's place in the PDF | ⇧⌘J |
| Go to file / command palette | ⌘P / ⇧⌘P |
| Find in project / in the PDF | ⇧⌘F / ⇧⌘G |
| Preview TikZ | ⌥⌘K |
| Equation editor | ⌥⌘E |
| Citation from DOI or arXiv | ⇧⌘C |
| Assistant / Edit with AI | ⌥⌘A / ⌥⌘I |
| Track changes / add a comment / next change | ⇧⌘E / ⌥⌘M / ⌥⌘. |
| Focus mode | ⌥⌘F |
| Today's note / quick note / sketch | ⌥⌘T / ⌥⌘N / ⌥⌘D |
| Sidebar / log | ⌘B / ⌘J |
Installers for macOS, Windows and Linux are attached to each release. Scribe updates itself from there: when a new version is out, it offers to install it.
The macOS app isn't notarized by Apple yet, so the first time macOS says it can't verify Scribe. Press Done, open System Settings > Privacy & Security, and press Open Anyway at the bottom; Scribe opens normally from then on. Or, in Terminal:
xattr -dr com.apple.quarantine /Applications/Scribe.appScribe is a Tauri 2 app: a TypeScript front end and a Rust back end. On every system you need:
- Node.js 20 or later
- Rust (stable)
- a TeX engine: Tectonic, which the app can install for
you on first run, or a TeX distribution with
latexmk - Python 3 with matplotlib, for notebooks (optional)
Then, in a clone of this repository:
npm install
npm run tauri dev # run it, with hot reload
npm run tauri build # an installable build, in src-tauri/target/release/bundle/xcode-select --install # Apple's compilers
brew install node rustup tectonic
rustup default stablenpm run tauri build -- --bundles app makes Scribe.app alone, without a disk image. macOS is
where Scribe is used every day.
- Install the Microsoft C++ Build Tools with the "Desktop development with C++" workload.
- WebView2 ships with Windows 10 and 11; on older systems install the Evergreen runtime.
- Install Rust with
rustup(the default MSVC toolchain) and Node.js. - For TeX, let Scribe install Tectonic, or install MiKTeX or TeX Live;
latexmkon MiKTeX also needs Perl.
npm run tauri build produces an .msi and an .exe installer.
Debian and Ubuntu:
sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev libdbus-1-dev pkg-configFedora:
sudo dnf install webkit2gtk4.1-devel openssl-devel curl wget file \
libappindicator-gtk3-devel librsvg2-devel dbus-devel
sudo dnf group install "c-development"Arch:
sudo pacman -S webkit2gtk-4.1 base-devel curl wget file openssl \
appmenu-gtk-module libappindicator-gtk3 librsvg xdotool dbusnpm run tauri build produces .deb, .rpm and AppImage packages.
Apps opened from the desktop don't always see the PATH your shell has. Scribe reads it from
your login shell at start-up; to see what it finds, run the binary with --check-tools:
src-tauri/target/release/bundle/macos/Scribe.app/Contents/MacOS/scribe --check-tools| Path | What is there |
|---|---|
src/ |
The front end: TypeScript and the DOM, no framework. CodeMirror 6, pdf.js, xterm.js. |
src-tauri/src/lib.rs |
The back end: files, compiling, the Python kernel, git, search, settings. |
example/ |
A short paper with its notebook, used by the tests and as a first project. |
demo/tikz/ |
Pictures for trying the TikZ preview and canvas. |
Every command that touches files takes the project folder and a path inside it, and refuses any path that leaves the folder, symlinks included. Saves are written to a temporary file and renamed, so a crash can't leave half a file.
cd src-tauri && cargo test # back end tests; compiles the example paper
npx tsc --noEmit # type-check the front endEvery push runs both on GitHub Actions. A release is a tag: node scripts/version.mjs 0.2.0
sets the version everywhere, the notes go in CHANGELOG.md, and pushing the tag
v0.2.0 builds and drafts the release.