
Aldine
io.github.trahloff由 GitHub 帳號 trahloff 發布v1.9.1更新於 Nov 7, 2026
Self-hosted collaborative LaTeX editor: read and edit files, typeset, get the errors and the PDF.
概覽
Aldine 內建的 MCP 端點讓助理讀取與編輯 LaTeX 專案檔案、排版編譯,並取得編譯錯誤與 PDF。
- 可以做什麼
- 讀取並編輯 Aldine 執行個體中的 LaTeX 專案檔案
- 排版專案並取得附行號的編譯錯誤
- 取回產生的 PDF,在對話中內嵌顯示或透過簽章連結查看
- 變更以作者為「Claude」的 git 提交落地,編輯器內可審閱並還原
- 適用情境
- 適合在自架的 Aldine 執行個體中撰寫或修改 LaTeX 論文,並希望助理不必離開對話就能改原始碼、編譯並檢查輸出時使用。
- 執行需求
- 需要 Aldine 示範主機的遠端 MCP 端點,或自行部署並啟用、可連線 MCP 服務的 Aldine 執行個體。驗證使用 X-Aldine-Token 標頭;公開示範權杖為共用權杖,示範沙箱每天 04:00 UTC 清空。自架需開啟驗證或設定靜態 MCP 權杖。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Aldine,將其新增到工作區。
- 連接 X-Aldine-Token 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
交給代理程式安裝
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/io.github.trahloff%2Faldine/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"aldine": {
"type": "http",
"url": "https://demo.aldine.dev/mcp",
"headers": {
"X-Aldine-Token": "<YOUR_API_KEY>"
}
}
}
}README
Aldine
Write LaTeX together. Fast, versioned, yours.
[CI] [License: AGPL v3] [PRs welcome] [Buy Me a Coffee]
Aldine is a self-hosted, open-source collaborative LaTeX editor and an Overleaf alternative. It is slim and built for speed: real-time multi-cursor editing, every project a real git repo with branches, native Zotero, ~2s warm recompiles. Two containers and one SQLite file by default: no database server to run, nothing to babysit.
Homepage · Try the live demo (resets nightly) · Quick start · How Aldine compares · Screenshots · Self-hosting · Contributing
Guides on aldine.dev: Self-hosting Overleaf (Community Edition, Server Pro) compared with Aldine · Git with Overleaf and a git-native alternative · A LaTeX MCP server for Claude
[Aldine editor: LaTeX source on the left, live PDF on the right]Live collaboration, a recompile, and a SyncTeX jump, in one real recording (compile wait trimmed):
Status: Aldine reached 1.0 in October 2026, three months after its first release. Within 1.x an upgrade starts on older data with no manual step, and stable settings, MCP tools and the plugin API keep their names until 2.0 (docs/STABILITY.md). That is a promise about upgrades, not a long track record. It compiles real papers daily and every headline feature has a Playwright end-to-end test; CI runs those on every pull request, next to typecheck, build and the integration suites. Expect rough edges, and file issues generously.
Features
-
Bring your Overleaf projects, and take them with you: download any Overleaf project as a ZIP, drop it on the home screen, keep writing — root file detected, first typeset automatic.
-
Real-time collaboration: CRDT-based (Yjs), multi-cursor with live presence, conflict-free by construction. Unlimited collaborators.
-
Git-native with branches: every project is a real git repository. Create branches, edit them independently, merge back from the UI. Publish a project to GitHub, GitLab, Gitea or Forgejo and a co-author can clone it and keep using VS Code; their commits come back with one Pull.
-
Fast, sandboxed compiles: TeX Live + latexmk with persistent incremental builds (~2s warm recompiles) in a no-egress container with restricted shell-escape; errors surfaced with line numbers and click-to-jump.
-
GitHub/GitLab/Gitea/Forgejo sync: import from GitHub, GitLab, Gitea or Forgejo as a project or publish a local project to a fresh repo, push/pull with ahead/behind indicators, branches, a conflicting pull that lists the files and keeps your version until you take the remote's, server-side autopush, and open a pull or merge request, all from the editor. gitlab.com and self-hosted GitLab, any Gitea or Forgejo instance (Codeberg included); a personal access token needs no OAuth app. A team instance can create every new project in a GitLab group automatically and push every autosave from the server.
-
Native Zotero integration: link your whole Zotero library or a single collection, from My Library or any of your group libraries, no premium tier required; keep a
.bibin sync with cheap version-aware refresh, insert citations from a search panel or via\cite{autocomplete. -
Claude as a collaborator (optional,
ALDINE_MCP=1): Aldine has a built-in MCP server. Connect your instance to claude.ai, Claude Desktop, Cowork or Claude Code over MCP and Claude edits, typesets and shows the PDF in the chat (inline on claude.ai, Claude Desktop and Cowork; a signed link elsewhere); every change is a git commit authored "Claude" with a review-and-revert toast in the editor. Setup, reachability and the security model: docs/AGENT_API.md.
Everything else: visual editor, review mode, AI error fix, SyncTeX, plugins, auth, scaling…
- Visual editing mode: LaTeX renders as formatted text while the source
stays authoritative and byte-stable (it never rewrites source you didn't
deliberately edit). WYSIWYG math (click a formula to edit it in a MathLive
popover; a formula MathLive would rewrite, such as one with a
\label, alignment, a comment or a line break inside, opens as source), editable tables, inline tracked changes from review suggestions, paste-rich-text-to-LaTeX, image-previewing figure chips, and an outline. From the keyboard, Ctrl+Enter (⌘Enter on a Mac) with the caret in a formula's or a table's source opens its editor. Cursor-reveal shows raw source under the caret, including a remote collaborator's. Switch between Source and Visual in the toolbar or the command palette (⌘K); a.texfile opens as source until you pick Visual, and your browser remembers the last choice. - Review mode: select text and leave an anchored, threaded comment; optionally attach a suggested replacement the author accepts with one click. Comments highlight in the editor, resolve/reopen, and track edits.
- AI error fix (optional, BYO key): on a failed typeset, get a
plain-English diagnosis and one-click fixes. Set
OPENROUTER_API_KEY,OPENAI_API_KEY, orANTHROPIC_API_KEYon the server to enable (that precedence order if several are set;ALDINE_AI_MODELoverrides the model). WithALDINE_AI_AUTOFIX=1a typeset someone asks for that fails runs the diagnosis without a click, once per new error (auto-typeset runs never do). The key stays server-side and never reaches the browser. Unset the key and Aldine is a 100% AI-free editor. - Find and cite papers without leaving the editor: search the literature
by title or author (OpenAlex), or paste a DOI / arXiv id — one click appends
the BibTeX and inserts the
\cite(no account, free public APIs). - SyncTeX both ways: double-click the PDF to jump to source; ⌘J to jump the PDF to your cursor, with a highlight flash.
- Plugin system: manifest + ES module plugins add sidebar panels and write into the editor. Zotero, references, and AI-fix ship as plugins; write your own.
- Templates & import: article, IAC conference paper, beamer and
report/thesis; a template for each publisher class the compiler's TeX Live
carries (Elsevier, IEEE, ACM, REVTeX, LNCS and more: 15 in the published
images); 25 official conference and journal kits (NeurIPS, ICML, ACL, CVPR,
Springer Nature, Wiley, …) downloaded from the publisher when you create
the project; plus your group's own templates from any git repository
(
TEMPLATE_REPOS). Or import an existing project from an Overleaf ZIP. - Editor niceties: auto-typeset on idle, live whole-document word count, spellcheck, Vim keybindings, PDF zoom + download, selectable PDF text with Find (⌘F in the preview), drag-drop figure upload, previews of images and PDFs from the file tree, plain-English error hints + raw log, command palette (⌘K / Ctrl+K).
- Search and replace across the project: every text file on the branch, open or not, with match case, whole word and regular expressions; Replace all changes open documents live for everyone and lands as one commit.
- Multi-user auth (optional): set
AUTH_ENABLED=1for login, per-project ownership, and sharing (invite-only or link). Google, GitHub & ORCID SSO, your own OpenID Connect provider (Keycloak, Authentik, Authelia, Pocket ID; docs/OIDC.md), or email/password (scrypt-hashed, revocable HTTP-only-cookie sessions);ALDINE_SSO_ONLY=1disables passwords entirely. Off by default (single-tenant); the collab socket is access-checked.[email protected]opens/admin: accounts, active users (7 / 30 days, editing now), projects, compile time, and per account disable, confirm address, password reset and delete. Never project content. No compose file passes this variable through; add it underenvironment:of theappservice.ALDINE_SIGNUP=approvalkeeps every new account, password or single sign-on, waiting until an administrator approves it on/admin; with email set up, the administrators get a mail when one starts waiting. - Scales when you need it: one SQLite file by default; set
DATABASE_URLfor Postgres andREDIS_URLfor shared rate limits and cross-node collab events. One app node is still the supported topology; docs/SCALING.md says exactly what is and isn't built. - Apple-style UI: system fonts, hairline borders, light & dark mode, keyboard-first (⌘S typeset, ⌘J jump, ⌘K command palette).
Quick start
No clone, no build: save this as docker-compose.yml and run docker compose up -d:
Open http://localhost:8080. That's it. Projects live in the aldine-data
volume, and everything else (auth, SSO, AI fix, email) is opt-in via
environment variables when you want it.
That is equivalent to the repo-root docker-compose.yml (same services,
images and sandbox settings), so a clone works identically: git clone https://github.com/trahloff/Aldine && cd Aldine && docker compose up -d. Keep the name: aldine line wherever you save it: it
fixes the volume names, which is what lets you switch compose files later and
what deploy/backup.sh looks for.
-
You are pinned to a version. The block above says
${ALDINE_VERSION:-1.9.1}, so a fresh copy installs the current release and nothing under a running install changes on its own. To upgrade, read the CHANGELOG, back up (deploy/backup.sh), write the new version into a.envfile next todocker-compose.yml, then pull:Compose reads
.envon every call, so a laterupstays on that version. A prefix (ALDINE_VERSION=… docker compose pull && docker compose up -d) reaches only the first command, andupstarts the old version again. To roll back, put the previous release in.envand run the same two commands. Your projects live in thealdine-dataandaldine-secretsvolumes and an image swap does not touch them.:lateststill exists and points at the newest release; pinning is what lets you choose when to move. -
Stability. Versions follow SemVer. A 1.x release starts on data from an earlier 1.x, or from 0.14 or later, with no manual step, and nothing covered is removed before 2.0. Every release is built from a commit that passed CI, and its images are booted and made to typeset a real document before
:latestmoves to them. Before that, it is also started on volumes left by the previous release and by 0.14.4, on the JSON store and on Postgres, and the projects, comments, shares and tokens have to survive. Back up first anyway. Watch the repo's Releases for security fixes: per SECURITY.md, only the latest release gets them. Which data, settings and APIs every 1.x keeps working, and how each promise is checked, is in docs/STABILITY.md. -
The first pull is big. TeX Live lives in the compiler image: about 2.4 GB to download, about 5 GB on disk. It carries TeX Live's medium scheme plus the pictures, latexextra and bibtexextra collections (pgfplots, tikz-cd, cleveref, todonotes, minted, biblatex, …), the publisher classes, and the Arabic, Persian, Cyrillic and Greek scripts; the one family it leaves out is CJK. After the first pull, starts take seconds. Ready when
curl localhost:8080/api/healthreturns{"ok":true,"name":"aldine"}. -
Need a package it does not have? The missing-package error in the editor names it. Two ways to get it, and project settings show which image you are on:
- Add just that package. Put a
docker-compose.override.ymlnext todocker-compose.ymlthat builds a derived compiler image, thendocker compose up -d --build.tlmgrinstalls from the same dated TeX Live snapshot the release was built from, so this keeps working after the release ages: Bump theFROMtag when you bumpALDINE_VERSION. Compose builds the image on your machine, so this works forarm64servers as well. - Get everything. Every release from 0.4.0 also ships all of TeX Live as
-full(about 2.8 GB compressed, 9 GB on disk; CJK is only here). AddALDINE_TEXLIVE=-fullnext toALDINE_VERSIONand pull again.
- Add just that package. Put a
-
Port 8080 taken? Change the left side of
ports:; withdocker-compose.full.yml, setALDINE_PORT=8081in.envinstead. -
On a NAS, with the same compiler sandbox:
- CasaOS and ZimaOS: import
deploy/casaos/docker-compose.ymlunder App Store → Custom Install. - TrueNAS 24.10 and later: docs/TRUENAS.md (Install via YAML).
- Unraid: docs/UNRAID.md (Compose Manager Plus).
- CasaOS and ZimaOS: import
-
Everything beyond the minimum: building from source (latest
main, not a release), auth/SSO/AI/email options, TLS, Postgres/Redis. All of it lives indocker-compose.full.yml, which carries the same compiler sandbox and the same volumes, so you can switch without losing data:docker compose -f docker-compose.full.yml up -d --build. The first build installs TeX Live into the compiler image; expect 20–60 minutes (thetlmgr installstep is most of it), then seconds per start.ALDINE_TEXLIVE_SCHEME=fullbuilds the all-of-TeX-Live variant instead.
How Aldine compares
If Overleaf CE fits you, use it; it's good software. Aldine exists for people who want review comments with suggested edits, git and Zotero without paid tiers, in a deployment they can hold in their head.
Every Overleaf CE cell except "Not measured" links to the Overleaf page it was checked against on 2026-10-12. For GitHub synchronization and Zotero we found no Overleaf page that states them for the on-premises editions, so those cells quote what Overleaf does say. A longer, dated version of this comparison is at aldine.dev/self-hosted-overleaf.
Screenshots
[Home: the project list as a shelf of first pages, each from the project's last typeset]Home: every project shows page 1 of its last typeset. Search, sort, or start a new one from a template, a ZIP or a git host.
[Visual editing mode: the same LaTeX paper rendered as formatted text with typeset math, next to the live PDF]Visual editing: the source rendered as formatted text, byte-stable, with math and tables editable in place. Switch with Source/Visual in the toolbar.
Development
Tests
End-to-end (Playwright; covers compile, collab, branches, plugins, Zotero). The
suite starts its own app on :3100 but not the compiler, and it runs against
.data-e2e, so the compiler has to point at that directory or every compile
test fails against a healthy-looking compiler:
Production deploy
Settings live in a .env file next to the compose files, so every later
docker compose call picks them up. Give each comment its own line: anything
after a value becomes part of the value, and AUTH_ENABLED=1 multi-user login
is not 1, so auth silently stays off.
Every variable Aldine reads is listed in deploy/README.md.
Isolation & limits. The compiler runs on an internal-only Docker network
(no internet egress), drops all Linux capabilities, and is bounded on CPU /
memory / PIDs; LaTeX compiles with restricted shell-escape (whitelist
only) and openin_any=p. Per-client rate limits guard login, AI, and
reference lookups; compiles are concurrency-capped, with optional per-user
compile quotas (ALDINE_COMPILE_QUOTA_MIN) if you host for a group.
See deploy/README.md for the full single-VPS runbook (nginx/Traefik/Caddy ingress, backups, SSO setup, Postgres/Redis, every config variable), deploy/aws for a Terraform/Fargate deployment, and SECURITY.md for the threat model and how to report vulnerabilities.
Architecture
- One Yjs document per file per branch (
project::branch::path), persisted straight to the git worktree with debounced writes and auto-commits. - Branches are git worktrees, so every branch is editable concurrently.
- Compile output stays inside the project tree (
.aldine-out/, kept out of git history) which keeps latexmk's incremental cache warm.
Data & storage
Two separate concerns, behind two seams:
- Project files: real git repos + worktrees on disk (
store.ts). This is what gives you branches and history. - Relational/metadata: users, sessions, project metadata, review comments,
and usage go through the
DataStoreinterface (db/). Three backends:- SQLite (default): one file,
META_DIR/aldine.db, through thenode:sqlitemodule built into Node, so no dependency. On its first start it copies the JSON files of an earlier release and leaves them as they were. - JSON files (
ALDINE_DATASTORE=json): the default before 1.7, kept for anyone who wants plain files. - Postgres (set
DATABASE_URL): the horizontally-scalable backend, and the prerequisite for ever running multiple app nodes.pgis an optional dependency; the same conformance suite runs against all three.
- SQLite (default): one file,
For how this scales past one box (and what the remaining walls are), see docs/SCALING.md.
Plugins
A plugin is a folder in plugins/:
The aldine API exposes ui.registerSidebarPanel (with an optional
onShow, called each time the panel comes into view), ui.showPanel (select
one of the plugin's own panels), ui.registerCommand (a palette command),
ui.confirm (a question in the app's own dialog),
editor.insertAtCursor, editor.insertCitation, project context,
compile(), toast(), and fetch(). See
plugins/zotero for a complete example.
Templates
A template is a folder with a template.json and the files to start from;
the shipped ones live in templates/. A group that keeps its own thesis,
poster or report templates puts the same layout in any git repository
(GitHub, GitLab, Gitea, a bare repo over https), lists it in
TEMPLATE_REPOS, and the templates appear in the gallery under the
repository's name, refreshed on an interval or with "Refresh templates", with
{{PROJECT_NAME}}, {{AUTHOR}}, {{DATE}} and {{YEAR}} filled in on
create. Layout, manifest fields, placeholders and private-repository tokens:
templates/README.md.
License
Copyright (C) 2026 Tobias Rahloff.
AGPL-3.0: self-host freely; if you offer a modified Aldine as a
service, share your changes. Third-party plugins interact with Aldine over its
plugin API and may use any license. Each folder under templates/ carries its
own LICENSE and states it in template.json (the gallery shows it on the
tile): the generic templates are MIT, and templates/iac-paper is LPPL-1.3c,
the customary license for a LaTeX class file. Venue templates are generated
from the classes installed in the compiler image, with the license tlmgr
reports. Venue kits are downloaded from the publisher when a project is
created, and their tile links the publisher's terms instead of naming a
license. No publisher file is stored in this repository. Overleaf is a
trademark of its owner. Claude, Zotero, GitHub, GitLab and other names are
trademarks of their respective owners. Aldine is an independent project, not
affiliated with or endorsed by any of them.
Two things stated plainly, because finding them out later feels like a bait-and-switch. A hosted Aldine service is planned, and contributions are accepted under a CLA that permits relicensing, so a commercially licensed edition is possible in future. What will not change: the self-hosted edition stays AGPL-3.0, and no feature that works today moves behind a paid tier. The name is handled separately in TRADEMARK.md.
來源:README.md,提交 7abc10a
工具
0版本歷史
5- v1.9.1最新Nov 7, 2026
- v1.8.0Nov 5, 2026
- v1.7.0Nov 3, 2026
- v1.6.0Nov 1, 2026
- v1.5.0Oct 31, 2026
評分
已滿足適用檢查項的 85%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通必需25 分
- 已宣告認證方式必需10 分
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分