{"id":49882139,"url":"https://github.com/chenle02/overleaf-manage","last_synced_at":"2026-05-15T15:34:50.954Z","repository":{"id":350762357,"uuid":"1208166951","full_name":"chenle02/overleaf-manage","owner":"chenle02","description":"Manage Overleaf projects from the terminal - create, invite, tag, clone, archive, delete. The missing gh for Overleaf.","archived":false,"fork":false,"pushed_at":"2026-04-12T01:03:05.000Z","size":26,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-12T01:12:38.041Z","etag":null,"topics":["academic-writing","cli","collaboration","latex","overleaf","project-management","terminal"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chenle02.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-11T22:59:20.000Z","updated_at":"2026-04-12T01:03:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chenle02/overleaf-manage","commit_stats":null,"previous_names":["chenle02/overleaf-manage"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/chenle02/overleaf-manage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenle02%2Foverleaf-manage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenle02%2Foverleaf-manage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenle02%2Foverleaf-manage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenle02%2Foverleaf-manage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenle02","download_url":"https://codeload.github.com/chenle02/overleaf-manage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenle02%2Foverleaf-manage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33071307,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic-writing","cli","collaboration","latex","overleaf","project-management","terminal"],"created_at":"2026-05-15T15:34:50.041Z","updated_at":"2026-05-15T15:34:50.947Z","avatar_url":"https://github.com/chenle02.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/logo.svg\" alt=\"overleaf-manage\" width=\"680\"\u003e\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n**Create projects, invite collaborators, tag, clone, archive, delete — all from your terminal.**\n\n\u003cbr/\u003e\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-3776AB.svg?logo=python\u0026logoColor=white)](https://python.org)\n[![Version](https://img.shields.io/badge/version-0.4.0-4ecca3.svg)](#-installation)\n[![Platform](https://img.shields.io/badge/platform-linux%20%7C%20macOS%20%7C%20WSL-lightgrey.svg)](#-installation)\n[![No dependencies](https://img.shields.io/badge/deps-requests%20only-green.svg)](#-installation)\n[![Git bridge](https://img.shields.io/badge/git-bridge%20support-orange.svg?logo=git\u0026logoColor=white)](#-git-integration)\n\n[![LLM friendly](https://img.shields.io/badge/%F0%9F%A4%96_LLM-friendly-blueviolet.svg)](#-llm--ai-agent-integration)\n[![JSON output](https://img.shields.io/badge/output-JSON%20%7C%20human-informational.svg)](#-llm--ai-agent-integration)\n[![Tool-use ready](https://img.shields.io/badge/tool--use-ready-ff69b4.svg)](#-llm--ai-agent-integration)\n\n\u003cbr/\u003e\n\n[Installation](#-installation) · [Quick Start](#-quick-start) · [Commands](#-command-reference) · [Git](#-git-integration) · [Tags](#%EF%B8%8F-tag-system) · [LLM Integration](#-llm--ai-agent-integration) · [How It Works](#%EF%B8%8F-how-it-works)\n\n\u003c/div\u003e\n\n---\n\n## Why?\n\nGitHub has [`gh`](https://cli.github.com/) — create repos, manage PRs, invite collaborators, automate workflows, all from your shell.\n\n**Overleaf has 25 million+ users — and no CLI for project management.**\n\nTools like [`olcli`](https://github.com/iamhyc/Overleaf-CLI) and [`pyoverleaf`](https://github.com/jkulhanek/pyoverleaf) cover file sync and PDF compilation. But you still can't do the basics from a terminal:\n\n- **Create a project** → must open browser\n- **Invite a collaborator** → must open browser\n- **Tag and organize projects** → must open browser\n\n`overleaf-manage` fills this gap. One script, zero config beyond `olcli` auth, every command outputs JSON for scripting.\n\n## Feature Comparison\n\n| Feature | Overleaf Web | olcli | **overleaf-manage** |\n|:--------|:---:|:---:|:---:|\n| Create project | ✅ | ❌ | ✅ |\n| Invite collaborator | ✅ | ❌ | ✅ |\n| Remove collaborator | ✅ | ❌ | ✅ |\n| List collaborators | ✅ | ❌ | ✅ |\n| Tag / label projects | ✅ | ❌ | ✅ |\n| Clone project | ✅ | ❌ | ✅ |\n| Rename project | ✅ | ❌ | ✅ |\n| Archive / trash | ✅ | ❌ | ✅ |\n| Git clone / push | ✅ | ❌ | ✅ *(via git bridge)* |\n| Pull / push files | ✅ | ✅ | — *(use olcli)* |\n| Compile PDF | ✅ | ✅ | — *(use olcli)* |\n| JSON output | ❌ | ❌ | ✅ |\n| LLM tool-use ready | ❌ | ❌ | ✅ |\n\n\u003e **`overleaf-manage` + `olcli` = complete terminal-first Overleaf workflow.**\n\n## 📦 Installation\n\n```bash\n# 1. Download the script\ncurl -fsSL https://raw.githubusercontent.com/chenle02/overleaf-manage/main/overleaf-manage \\\n  -o ~/.local/bin/overleaf-manage\nchmod +x ~/.local/bin/overleaf-manage\n\n# 2. Install the one dependency\npip install requests\n\n# 3. Authenticate (one-time — shares cookie with olcli)\nnpm install -g @aloth/olcli\nolcli auth --cookie \"YOUR_SESSION_COOKIE\"\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🔑 How to get your session cookie\u003c/strong\u003e\u003c/summary\u003e\n\n\u003cbr/\u003e\n\n1. Log into [overleaf.com](https://www.overleaf.com) in your browser\n2. Open DevTools (`F12`) → **Application** → **Cookies** → `www.overleaf.com`\n3. Copy the value of `overleaf_session2`\n4. Run: `olcli auth --cookie \"paste_value_here\"`\n\n**Auto-extract from Firefox (Linux):**\n\n```bash\n# Find your profile directory\nls ~/.mozilla/firefox/                                # standard install\nls ~/snap/firefox/common/.mozilla/firefox/             # snap install\n\n# Extract \u0026 authenticate in one shot (replace YOUR_PROFILE)\nCOOKIE=$(python3 -c \"\nimport sqlite3, shutil\nshutil.copy(\n    '$HOME/snap/firefox/common/.mozilla/firefox/YOUR_PROFILE.default/cookies.sqlite',\n    '/tmp/ff_cookies.sqlite')\nconn = sqlite3.connect('/tmp/ff_cookies.sqlite')\nprint(conn.execute(\n    \\\"SELECT value FROM moz_cookies WHERE host LIKE '%overleaf%' AND name='overleaf_session2'\\\"\n).fetchone()[0])\nconn.close()\n\") \u0026\u0026 olcli auth --cookie \"$COOKIE\"\n```\n\nThe cookie stays valid for **weeks**. Re-run when auth fails.\n\n\u003c/details\u003e\n\n## 🚀 Quick Start\n\n```bash\n# Create a project and invite collaborators\noverleaf-manage create \"Article-New-Idea\"\noverleaf-manage invite \"Article-New-Idea\" alice@mit.edu\noverleaf-manage invite \"Article-New-Idea\" bob@stanford.edu --role viewer\n\n# Organize with tags\noverleaf-manage tag \"Article-New-Idea\" SPDE\noverleaf-manage tag \"Article-New-Idea\" Draft\n\n# Work locally with olcli\nolcli pull \"Article-New-Idea\"\nvim main.tex\nolcli sync \u0026\u0026 olcli pdf\n\n# Browse your portfolio\noverleaf-manage ls --tag SPDE --sort name\noverleaf-manage info \"Article-New-Idea\"\n```\n\n## 📖 Command Reference\n\n### Project Lifecycle\n\n| Command | Description | Example |\n|:--------|:------------|:--------|\n| `create \u003cname\u003e` | Create a new project | `overleaf-manage create \"My Paper\"` |\n| `clone \u003cproject\u003e \u003cname\u003e` | Duplicate a project | `overleaf-manage clone \"My Paper\" \"v2\"` |\n| `rename \u003cproject\u003e \u003cname\u003e` | Rename a project | `overleaf-manage rename \"Old\" \"New\"` |\n| `archive \u003cproject\u003e` | Archive (hide from list) | `overleaf-manage archive \"Done Paper\"` |\n| `unarchive \u003cproject\u003e` | Restore from archive | `overleaf-manage unarchive \"Done Paper\"` |\n| `trash \u003cproject\u003e` | Soft-delete | `overleaf-manage trash \"Scratch\"` |\n| `untrash \u003cproject\u003e` | Restore from trash | `overleaf-manage untrash \"Scratch\"` |\n| `delete \u003cproject\u003e` | **Permanent** delete | `overleaf-manage delete \"Bad\" --confirm` |\n\n### Collaboration\n\n| Command | Description | Example |\n|:--------|:------------|:--------|\n| `invite \u003cproject\u003e \u003cemail\u003e` | Send invite (editor) | `overleaf-manage invite \"Paper\" alice@mit.edu` |\n| `invite ... --role viewer` | Invite as viewer | `overleaf-manage invite \"Paper\" bob@mit.edu --role viewer` |\n| `invite ... --role reviewer` | Invite as reviewer | `overleaf-manage invite \"Paper\" carol@mit.edu --role reviewer` |\n| `collaborators \u003cproject\u003e` | List all members | `overleaf-manage collaborators \"Paper\"` |\n| `remove-collaborator \u003cproject\u003e \u003cemail\u003e` | Remove member | `overleaf-manage remove-collaborator \"Paper\" bob@mit.edu` |\n\n### Tags \u0026 Organization\n\n| Command | Description | Example |\n|:--------|:------------|:--------|\n| `tag \u003cproject\u003e \u003ctag\u003e` | Add tag (auto-creates) | `overleaf-manage tag \"Paper\" SPDE` |\n| `untag \u003cproject\u003e \u003ctag\u003e` | Remove tag | `overleaf-manage untag \"Paper\" SPDE` |\n| `tags` | List all tags | `overleaf-manage tags` |\n| `tags \u003ctag\u003e` | Show projects in tag | `overleaf-manage tags Research` |\n| `tag-create \u003cname\u003e` | Create empty tag | `overleaf-manage tag-create \"Exam\"` |\n| `tag-rename \u003cold\u003e \u003cnew\u003e` | Rename tag | `overleaf-manage tag-rename \"Old\" \"New\"` |\n| `tag-delete \u003cname\u003e` | Delete tag (keeps projects) | `overleaf-manage tag-delete \"Bad Tag\"` |\n\n### Listing \u0026 Filtering\n\n| Command | Description | Example |\n|:--------|:------------|:--------|\n| `ls` | List active projects | `overleaf-manage ls` |\n| `ls --owner` | Only your projects | `overleaf-manage ls --owner` |\n| `ls --shared` | Only shared with you | `overleaf-manage ls --shared` |\n| `ls --tag \u003ctag\u003e` | Filter by tag | `overleaf-manage ls --tag SPDE` |\n| `ls --untagged` | Untagged projects only | `overleaf-manage ls --untagged` |\n| `ls --search \u003cq\u003e` | Search by name | `overleaf-manage ls --search \"Article\"` |\n| `ls --sort name\\|date` | Sort results | `overleaf-manage ls --sort name` |\n| `ls --all` | Include archived/trashed | `overleaf-manage ls --all` |\n| `info \u003cproject\u003e` | Detailed project info | `overleaf-manage info \"My Paper\"` |\n\n\u003e 💡 **Every command** accepts `--json` for machine-readable output.\n\n## 🔀 Git Integration\n\nClone and sync Overleaf projects with standard `git` — no `olcli` required. Uses Overleaf's [git bridge](https://www.overleaf.com/learn/how-to/Git_integration) (requires premium plan).\n\n```bash\n# One-time setup: store credentials for passwordless access\noverleaf-manage git-setup\n\n# Clone any project by name\noverleaf-manage git-clone \"My Paper\"\ncd My_Paper/\n\n# Standard git workflow — edits sync to Overleaf\nvim main.tex\ngit add -A \u0026\u0026 git commit -m \"edits\" \u0026\u0026 git push\n\n# Pull collaborators' changes\ngit pull\n```\n\n### Git Commands\n\n| Command | Description | Example |\n|:--------|:------------|:--------|\n| `git-setup` | Store Overleaf credentials for passwordless git | `overleaf-manage git-setup` |\n| `git-clone \u003cproject\u003e` | Clone project via git | `overleaf-manage git-clone \"My Paper\"` |\n| `git-clone \u003cproject\u003e \u003cdir\u003e` | Clone into specific directory | `overleaf-manage git-clone \"Paper\" ~/papers/paper` |\n| `git-url \u003cproject\u003e` | Show git clone URL | `overleaf-manage git-url \"My Paper\"` |\n\n### How `git-setup` works\n\n1. Detects your Overleaf email from your session\n2. Prompts for your Overleaf password (stored locally, mode `0600`)\n3. Configures `git credential-store` for `git.overleaf.com` only\n4. After setup, `git clone/pull/push` work without prompts\n\n```\nCredentials: ~/.config/overleaf-manage/git-credentials (mode 0600)\nScope:       git.overleaf.com only — does not affect GitHub/GitLab\n```\n\n\u003e **Note:** Git bridge requires an Overleaf premium plan. The `info` command always shows the git URL regardless of plan.\n\n## 🏷️ Tag System\n\nTags are lightweight labels for organizing your Overleaf portfolio — the same tags you see in Overleaf's web sidebar, fully manageable from the terminal.\n\n```bash\n# Tag by workflow stage\noverleaf-manage tag \"Paper A\" Draft\noverleaf-manage tag \"Paper B\" Submitted\noverleaf-manage tag \"Paper C\" Accepted\n\n# Tag by topic\noverleaf-manage tag \"Paper A\" SPDE\noverleaf-manage tag \"Paper A\" KPZ\n\n# Filter and browse\noverleaf-manage ls --tag SPDE              # all SPDE papers\noverleaf-manage ls --tag Draft --sort date # drafts by recency\noverleaf-manage ls --untagged              # what needs organizing?\n\n# Tags auto-create — no need for tag-create first\noverleaf-manage tag \"Midterm\" Exam         # creates \"Exam\" on the fly\n```\n\n**Example tag sets:**\n\n| Academic | Teaching | Status |\n|:---------|:---------|:-------|\n| `SPDE`, `KPZ`, `Probability` | `Course`, `Lecture`, `Homework`, `Exam` | `Draft`, `Submitted`, `Revision`, `Accepted` |\n\n## 🤖 LLM / AI Agent Integration\n\nEvery command supports `--json` for structured, deterministic output — designed for **LLM tool-use pipelines**, MCP servers, and scripting.\n\n```bash\n# Structured project listing\noverleaf-manage ls --owner --json\n\n# Machine-readable project info\noverleaf-manage info \"My Paper\" --json\n```\n\n**Example JSON response:**\n\n```json\n{\n  \"ok\": true,\n  \"action\": \"info\",\n  \"project_id\": \"abcdef1234567890abcdef12\",\n  \"name\": \"My Paper\",\n  \"url\": \"https://www.overleaf.com/project/abcdef1234567890abcdef12\",\n  \"accessLevel\": \"owner\",\n  \"tags\": [\"SPDE\", \"Draft\"],\n  \"archived\": false,\n  \"trashed\": false\n}\n```\n\n**Why this matters for AI agents:**\n\n- 🔧 **Tool-use ready** — AI coding assistants can create Overleaf projects, invite collaborators, and organize work via function calls\n- 📊 **Deterministic JSON** — no HTML scraping, no table parsing, just structured data\n- ✅ **Reliable error handling** — every response includes `\"ok\": true/false`\n- 🔗 **Composable** — combine with `olcli` for end-to-end LaTeX automation\n\n```bash\n# An AI agent setting up a new collaboration:\noverleaf-manage create \"New Paper\" --json        # → {\"ok\": true, \"project_id\": \"...\"}\noverleaf-manage invite \"New Paper\" coauthor@university.edu --json\noverleaf-manage tag \"New Paper\" Research --json\n```\n\n## ⚙️ How It Works\n\n`overleaf-manage` calls the same internal HTTP endpoints that Overleaf's browser UI uses. No scraping, no headless browser — just clean REST calls authenticated with your session cookie.\n\n```\n┌──────────────┐             ┌──────────────────┐             ┌──────────────┐\n│              │   cookie    │                  │  HTTP API   │              │\n│  Terminal    │────────────▶│  overleaf-manage  │────────────▶│   Overleaf   │\n│              │◀────────────│                  │◀────────────│   Server     │\n│              │  JSON/text  │  (Python script) │  responses  │              │\n└──────────────┘             └──────────────────┘             └──────────────┘\n```\n\nAuthentication is shared with `olcli` via `~/.config/olcli-nodejs/config.json`.\n\n## ⚠️ Limitations\n\n| Limitation | Detail |\n|:-----------|:-------|\n| **Unofficial** | Not an Overleaf product. Independently developed. |\n| **Internal APIs** | Uses undocumented endpoints that may change without notice. |\n| **Cookie auth** | No official API keys. Cookies last weeks, then need refresh. |\n| **No file sync** | File operations are handled by [`olcli`](https://github.com/iamhyc/Overleaf-CLI). |\n\n## 🔗 See Also\n\n| Tool | What it does |\n|:-----|:-------------|\n| [`olcli`](https://github.com/iamhyc/Overleaf-CLI) | Pull, push, sync files, compile PDF, download output |\n| [`pyoverleaf`](https://github.com/jkulhanek/pyoverleaf) | Python API for file operations |\n| [Overleaf](https://www.overleaf.com) | The collaborative LaTeX editor itself |\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**If this tool saves you time, consider giving it a ⭐**\n\nMade with 🖥️ by [Le Chen](https://github.com/chenle02)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenle02%2Foverleaf-manage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenle02%2Foverleaf-manage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenle02%2Foverleaf-manage/lists"}