個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A modern, collaborative web platform for LaTeX, built in Rust with the Topcoat framework. NeoLeaf brings native versioning and storage through GitHub, 100% WebAssembly compilation in the browser (or through the Local Agent), real-time collaboration (CRDT/Yjs) and zero server cost for compilation.
🌐 Try the production version: neoleaf.science
neoleaf topic.isomorphic-git and lightning-fs in the browser, backed by the Rust server..sty, .cls) and font families from TeX Live / CTAN and downloads them on demand.neoleaf-agent):
irm https://neoleaf.science/install.ps1 | iex): curl -fsSL https://neoleaf.science/install.sh | sh (checks the SHA-256, no sudo).tlmgr, a system tray icon and secure pairing through a local token.The server does not compile and does not store projects: the project lives only in the browser (local Git clone) and on your GitHub. The server handles authentication, relays Git and the GitHub API (stateless proxy), downloads packages from CTAN/TeX Live and relays live editing in memory.
\cite), labels and cross-references (\ref)./admin panel, the 🚫 Block button ends the person's sessions, prevents new logins and disconnects them from live editing. The "Blocked users" section shows the reason, who blocked and when, lets you block by login (for someone who has not signed in yet) and unblock. The block applies by GitHub id and is kept in blocked.json (variable BLOCKLIST_FILE).my-paper-deleted-20261009-031507) and gets the deleted tag. The Trash view (side menu) lists the deleted projects, with the date, and the Restore button brings back the original name and removes the tag. Nothing is erased; only the repository owner can delete and restore.+ tag button..zip files (read in the browser itself) and export the source code as .zip (the GitHub one when there is nothing to push, or built in the browser) or just the compiled .bbl file..otf, .ttf, .sty, .cls) with project or global scope.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
scripts/).To connect and sync your repositories with GitHub:
NeoLeafhttp://localhost:3000http://localhost:3000/auth/callback.env file in the project root (use .env.example as a base):GITHUB_CLIENT_ID=your_client_id_here
GITHUB_CLIENT_SECRET=your_client_secret_here
REDIRECT_URI=http://localhost:3000/auth/callback
PORT=3000
# Administrators, by numeric GitHub id (comma-separated; replace with your own).
# When set and not empty, only these ids are administrators and the login/e-mail rules (ADMIN_EMAILS) are ignored.
# ADMIN_GITHUB_IDS=123456,7890123
Without ADMIN_GITHUB_IDS, administrators are the logins or e-mails listed in ADMIN_EMAILS (which can change hands) and the server prints a warning at startup; with neither set, nobody is an administrator. Set ADMIN_GITHUB_IDS in production. Session cookies are Secure unless REDIRECT_URI explicitly starts with http://localhost or http://127.0.0.1.
💡 Developing without a GitHub account: run
mise run dev:fake. It starts a local "fake GitHub" (API, login and Git protocol) and points NeoLeaf to it; click "Start with GitHub" and you sign in as thedemouser, with a sample project. None of this exists in production, and NeoLeaf does not store projects on the server in any mode.
Download dependencies and run the server:
cargo run
Open it in the browser:
http://localhost:3000
neoleaf-agent)The repository includes a companion agent in Rust located in the agent/ folder:
cd agent
cargo build --release
It runs as a user daemon (./neoleaf-agent install), listening on 127.0.0.1:47474, and connects the compilers installed on your machine to the web editor without sending your files to third-party compilation servers.
neoleaf/
├── Cargo.toml # Rust project manifest and dependencies
├── mise.toml # Development, test and quality tasks
├── .env.example # Example environment variable configuration
├── agent/ # Local companion daemon in Rust (neoleaf-agent)
│ ├── src/
│ └── README.md
├── scripts/ # Download and packaging scripts for WASM/TeXMF assets
│ ├── fetch_xelatex_assets.py
│ ├── fetch_lualatex_assets.py
│ ├── fetch_bibtex_assets.py
│ └── build_font_packs.py
├── src/
│ ├── main.rs # Entry point: only builds the Topcoat router
│ ├── routes/ # HTTP handlers (pages, admin, auth, catalog, projects, Git proxy, lookups, static files)
│ ├── assets.rs # List of the static files embedded in the binary
│ ├── admin.rs # Metrics, administrative panel and telemetry
│ ├── collab.rs # Yjs WebSocket server and collaboration CRDTs
│ ├── ctan.rs # Stateless CTAN/TeX Live proxy: downloads packages and indexes file -> package
│ ├── deps.rs # List of the files the browser compiler already ships with
│ ├── import.rs # New project name (the rest of the import happens in the browser)
│ ├── session.rs # User session management
│ ├── auth/ # GitHub OAuth 2.0 authentication
│ │ └── github.rs
│ ├── drive/ # GitHub API client (repos, topics, invitations, permissions)
│ │ └── client.rs
│ ├── templates/ # Starter templates (.tex) for new papers
│ └── views/ # SSR screens in Topcoat (reactive HTML)
│ ├── dashboard_page.rs # Dashboard for projects, tags and invitations
│ ├── editor_page.rs # Monaco editor interface, PDF and tools
│ ├── login_page.rs # Login and presentation page (landing)
│ ├── admin_page.rs # System metrics panel
│ └── agent_page.rs # Local agent guide and download
└── static/
├── css/editor.css # Complete styling of the editor and components
├── img/ # Logos and icons
├── js/ # Client scripts (Monaco, Yjs, SyncTeX, PDF.js, etc.)
└── texlive/ # WebAssembly modules (TeX Live, bibtexu)