by aloth
Overleaf CLI - pull, push, sync, compile LaTeX projects from your terminal. Git remote helper, MCP server for AI agents, and TypeScript library.
# Add to your Claude Code skills
git clone https://github.com/aloth/olcliLast scanned: 7/3/2026
{
"issues": [
{
"type": "npm-audit",
"message": "ajv: ajv has ReDoS when using `$data` option",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "fast-uri: fast-uri vulnerable to path traversal via percent-encoded dot segments",
"severity": "high"
},
{
"type": "npm-audit",
"message": "undici: Undici: Malicious WebSocket 64-bit length overflows parser and crashes the client",
"severity": "high"
}
],
"status": "WARNING",
"scannedAt": "2026-07-03T07:21:13.745Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}olcli is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by aloth. Overleaf CLI - pull, push, sync, compile LaTeX projects from your terminal. Git remote helper, MCP server for AI agents, and TypeScript library. It has 100 GitHub stars.
olcli returned warnings in SkillsLLM's automated security scan. It has no critical vulnerabilities, but review the flagged issues in the Security Report section before adding it to your workflow.
Clone the repository with "git clone https://github.com/aloth/olcli" and add it to your Claude Code skills directory (see the Installation section above). olcli ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
olcli is primarily written in JavaScript. It is open-source under aloth on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh olcli against similar tools.
No comments yet. Be the first to share your thoughts!
Requires a passing catalog security scan. Resolve the flagged issues and resubmit to enable featuring.
Manage Overleaf LaTeX projects via the olcli CLI, native git remote, or MCP server.
| Mode | Best for | How |
|---|---|---|
CLI (olcli) |
Interactive workflows, sync, compile, arXiv prep | olcli pull/push/sync/pdf |
| Git remote | Version control, commits, diffs, CI/CD pipelines | git clone overleaf::… then standard git |
| MCP server | AI agents with MCP support (Claude, Cursor, Windsurf) | Connect via olcli-mcp stdio transport |
Use CLI when you need bidirectional sync with conflict detection, compilation, or comment management. Use Git remote when you want proper git history, branches, and standard git push/pull. Use MCP when an AI agent has native MCP support and doesn't need to shell out.
# Homebrew (recommended)
brew tap aloth/tap && brew install olcli
# npm
npm install -g @aloth/olcli
Get your session cookie from Overleaf:
overleaf_session2olcli auth --cookie "YOUR_SESSION_COOKIE"
Verify with:
olcli whoami
Debug authentication issues:
olcli check
Clear stored credentials:
olcli logout
olcli config set-url https://overleaf.yourcompany.com
olcli config set-cookie-name overleaf.sid # if different from default
olcli auth --cookie "YOUR_COOKIE"
Or pass per-command: olcli --base-url https://overleaf.yourcompany.com list
Use Overleaf projects as native git remotes. No wrapper scripts needed.
# Clone
git clone overleaf::https://www.overleaf.com/project/<id>
cd <project>
# Edit, commit, push — standard git workflow
vim main.tex
git add . && git commit -m "update introduction"
git push
# Pull latest from Overleaf
git pull
Authentication: reads OVERLEAF_SESSION env var, ~/.olauth file, or stored config (same as CLI).
For self-hosted instances, just use your instance URL:
git clone overleaf::https://overleaf.yourcompany.com/project/<id>
Debug with: GIT_REMOTE_OVERLEAF_DEBUG=1 git push
Built-in Model Context Protocol server for AI assistant integration.
# Run standalone
olcli-mcp
# Or via npx
npx @aloth/olcli-mcp
Available MCP tools: list_projects, get_project_info, pull_project, push_file, compile, download_pdf, list_comments, get_entities, download_file, add_comment, reply_to_comment, resolve_comment, delete_entity, rename_entity, compile_with_outputs.
Auth: set OVERLEAF_SESSION env var in MCP config, or use stored credentials from olcli auth.
olcli pull "My Paper"
cd My_Paper/
# After editing files locally
olcli push # Upload changes only
olcli sync # Bidirectional sync (pull + push, propagates local deletions)
olcli sync --no-delete # Sync without propagating local deletions to remote
olcli delete chapters/old.tex # remove a file from the project
olcli rm figures/old.pdf # alias
olcli rename old.tex new.tex # rename a file
olcli mv chapters/draft.tex chapters/intro.tex # alias
olcli ignored # list active patterns (built-ins + .olignore + .olignore.local)
olcli push --show-ignored # see what was filtered on this run
olcli sync --no-ignore # escape hatch: upload everything
olcli pdf # Compile and download
olcli pdf -o paper.pdf # Custom output name
olcli compile # Just compile (no download)
olcli output bbl # Download compiled .bbl
olcli output bbl -o main.bbl # Custom filename
olcli output --list # List all available outputs
olcli upload figure1.png "My Paper" # Upload to project root
olcli upload diagram.pdf # Auto-detect project from .olcli.json
olcli download main.tex "My Paper" # Download single file
olcli zip "My Paper" # Download entire project as zip
olcli comments list # List all comments (current project)
olcli comments list --status open # Filter by status (open/resolved/all)
olcli comments list --context # Include surrounding text
olcli comments add main.tex "Fix this citation" --from 10 --to 15 # Add comment
olcli comments reply <thread-id> "Done!" # Reply to thread
olcli comments resolve <thread-id> # Mark as resolved
olcli comments reopen <thread-id> # Reopen a resolved thread
olcli comments delete <thread-id> # Delete entire thread
Complete workflow for preparing an arXiv submission:
# 1. Pull your project
olcli pull "Research Paper"
cd Research_Paper
# 2. Compile to ensure everything builds
olcli compile
# 3. Download the .bbl file (arXiv requires .bbl, not .bib)
olcli output bbl -o main.bbl
# 4. Download any other needed outputs
olcli output aux -o main.aux # If needed
# 5. Package for submission
zip arxiv.zip *.tex main.bbl figures/*.pdf
# 6. Verify the package compiles locally (optional)
# Then upload arxiv.zip to arxiv.org
| Command | Description |
|---|---|
olcli auth --cookie <value> |
Authenticate with session cookie |
olcli auth --email <e> --password <p> |
Authenticate with password (self-hosted) |
olcli whoami |
Check authentication status |
olcli logout |
Clear stored credentials |
olcli check |
Show config paths and credential sources |
olcli list |
List all projects |
olcli info [project] |
Show project details |
olcli pull [project] [dir] |
Download project files |
olcli push [dir] |
Upload local changes |
olcli sync [dir] |
Bidirectional sync |
olcli upload <file> [project] |
Upload a single file |
olcli download <file> [project] |
Download a single file |
olcli delete <file> [project] |
Delete a remote file or folder (alias: rm) |
olcli rename <old> <new> [project] |
Rename a remote file or folder (alias: mv) |
olcli ignored [dir] |
List active ignore patterns |
olcli zip [project] |
Download as zip archive |
olcli compile [project] |
Trigger compilation |
olcli pdf [project] |
Compile and download PDF |
olcli output [type] |
Download compile outputs |
olcli comments list [project] |
List review comments |
olcli comments add <file> <msg> |
Add a comment |
olcli comments reply <id> <body> |
Reply to a thread |
olcli comments resolve <id> |
Resolve a thread |
olcli comments reopen <id> |
Reopen a thread |
olcli comments delete <id> |
Delete a thread |
olcli config set-url <url> |
Set self-hosted base URL |
olcli config set-cookie-name <name> |
Set cookie name |
olcli config set-timeout <ms> |
Set HTTP timeout |
.olcli.json) to skip the project argumentolcli push --dry-run or olcli sync --dry-run to preview before applyingolcli pull --force to overwrite local changesolcli sync propagates local deletions to the remote; use --no-delete to opt out per run.aux, .bbl, .log, .synctex.gz etc. are filtered by default. Add custom patterns to a .olignore file (gitignore-style)thesis.pdf next to thesis.tex is auto-ignored; standalone figures/diagram.pdf is preservedolcli check to see where credentials are loaded fromolcli --timeout 60000 pull "Big Project" or olcli config set-timeout 60000Command-line interface for Overleaf — Sync, manage, and compile LaTeX projects from your terminal.
Work with Overleaf projects directly from your command line. Edit locally with your favorite editor, version control with Git, and sync seamlessly with Overleaf's cloud compilation.
.olignore.bbl, .log, .aux for arXiv submissions)Perfect for:
brew tap aloth/tap
brew install olcli
npm install -g @aloth/olcli
Or use with npx without installation:
npx @aloth/olcli list
npx skills add aloth/olcli
Session cookie (overleaf.com and self-hosted):
olcli auth --cookie "your_session_cookie_value"
Email/password (self-hosted without reCAPTCHA):
olcli auth --email "you@example.com" --password "your_password"
olcli list
olcli pull "My Thesis"
cd My_Thesis/
vim main.tex
olcli push
olcli pdf
git clone overleaf::https://www.overleaf.com/project/<id>
cd <project>
# edit, commit, push — standard git workflow
git push
See Git Remote Helper docs for details.
All commands auto-detect the project when run from a synced directory (contains .olcli.json).
| Command | Description |
|---|---|
olcli auth |
Set session cookie or login with email/password |
olcli whoami |
Check authentication status |
olcli logout |
Clear stored credentials |
olcli list |
List all projects |
olcli info [project] |
Show project details and file list |
olcli pull [project] [dir] |
Download project files to local directory |
olcli push [dir] |
Upload local changes to Overleaf |
olcli sync [dir] |
Bidirectional sync (pull + push) |
olcli upload <file> [project] |
Upload a single file |
olcli download <file> [project] |
Download a single file |
olcli delete <file> [project] |
Delete a remote file or folder (alias: rm) |
olcli rename <old> <new> [project] |
Rename a remote file or folder (alias: mv) |
olcli compile [project] |
Trigger PDF compilation |
olcli pdf [project] |
Compile and download PDF |
olcli output [type] |
Download compile output files |
olcli zip [project] |
Download project as zip archive |
olcli comments list [project] |
List comments (--status, --context) |
olcli comments add <file> <msg> |
Add a comment to selected text |
olcli comments reply <id> <body> |
Reply to a comment thread |
olcli comments resolve <id> |
Resolve a comment thread |
olcli comments reopen <id> |
Reopen a resolved thread |
olcli comments delete <id> |
Delete a comment thread |
olcli ignored [dir] |
List ignore patterns in effect |
olcli config set-url <url> |
Set self-hosted base URL |
olcli config set-cookie-name <name> |
Set session cookie name |
olcli config set-timeout <ms> |
Set default HTTP timeout |
olcli check |
Show config paths and credential sources |
| Flag | Description |
|---|---|
--verbose |
Print HTTP requests and responses to stderr |
--base-url <url> |
Override Overleaf instance URL |
--cookie-name <name> |
Override session cookie name |
--timeout <ms> |
Override HTTP timeout (default: 10000) |
--force to overwrite local changes--all to upload all files, --dry-run to preview--no-delete to opt out--dry-run to preview without applyingolcli records a manifest of remote files in .olcli.json. On next sync:
First-time syncs skip the deletion phase (no prior manifest to compare).
| Layer | Source | Purpose |
|---|---|---|
| 1 | Built-in | LaTeX intermediates, OS noise, build dirs. Always on. |
| 2 | .olignore |
Project-level patterns (gitignore syntax). |
| 3 | .olignore.local |
Machine-specific patterns. |
Later layers override earlier ones. Negation (!important.aux) is supported.
X.pdf is ignored only if X.tex (or .ltx) exists in the same folder.
olcli ignored # list patterns in effect
olcli push --show-ignored # see what was skipped
olcli sync --no-default-ignore # only .olignore applies
olcli sync --no-ignore # upload everything
Credentials are checked in order:
OVERLEAF_SESSION environment variable.olauth file in current directory~/.config/olcli-nodejs/config.jsonolcli config set-url https://latex.example.org
olcli config set-cookie-name overleaf.sid
Or pass per-command: olcli --base-url https://latex.example.org list
olcli config set-timeout 60000 # persist
olcli --timeout 60000 pull "Big Thesis" # one-off
export OVERLEAF_TIMEOUT=60000 # env var
Precedence: --timeout > OVERLEAF_TIMEOUT > config > default (10000ms).
# Daily thesis workflow
olcli pull "PhD Thesis" thesis && cd thesis
vim chapters/methods.tex
olcli sync && olcli pdf -o draft.pdf
# Quick PDF download
olcli pdf "Conference Paper" -o paper.pdf
# Upload figures
olcli upload figures/diagram.png
# arXiv submission prep
olcli output bbl -o main.bbl
olcli zip -o arxiv-submission.zip
# Backup all projects
for proj in $(olcli list --json | jq -r '.[].name'); do
olcli zip "$proj" -o "backups/${proj}.zip"
done
@aloth/olcli exposes OverleafClient and all public interfaces as a library.
npm install @aloth/olcli
import { OverleafClient } from '@aloth/olcli';
const client = await OverleafClient.fromSessionCookie(cookie);
const projects = await client.listProjects();
const info = await client.getProjectInfo(projectId);
const zipBuf = await client.downloadProject(projectId);
const pdfBuf = await client.downloadPdf(projectId);
await client.uploadFile(projectId, null, 'main.tex', readFileSync('main.tex'));
const comments = await client.listComments(projectId, { status: 'open' });
import {
OverleafClient,
// Types
Project, ProjectInfo, FolderEntry, DocEntry, FileEntry,
CommentMessage, ProjectComment, CommentContext, CommentStatus,
ListCommentsOptions, AddCommentOptions, Credentials, SessionCookiePair,
// Config utilities
getBaseUrl, setBaseUrl, getSessionCookie, setSessionCookie,
getSessionCookieName, setSessionCookieName, getCsrf, setCsrf,
getLastProject, setLastProject, clearConfig, getConfigPath, saveOlAuth,
getTimeout, setTimeout, getPasswordCredentials, setPasswordCredentials,
clearPasswordCredentials, type PasswordCredentials,
// Ignore utilities
DEFAULT_IGNORE_PATTERNS, loadIgnore, shouldIgnore, buildTexSiblingSet,
IgnoreContext, LoadIgnoreOptions,
} from '@aloth/olcli';
Session expired — Get a fresh cookie from the browser