个人 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)