Hoja
One self-hosted place where people and agents plan, assign and review work.
Hoja is a workspace for issues, projects, cycles and teams. Keep your editor,
terminal and harness; reach the same work through the browser app, the hoja
CLI, a Linear-compatible GraphQL API and a read-only MCP server.
Self-host it under the MIT license, or use Hoja Cloud at $15 per organization each month. Neither path is priced per seat.
Why teams use it
- One record for people and agents. A person triages in the browser, an agent updates the same issue from a shell, and everyone sees one current state.
- Your harness stays yours. Hoja is a shared work record, not an agent runtime. It does not run, host or watch your agents.
- Self-hosted and offline-first. SQLite for a laptop or a single box, PostgreSQL for a team server. No Linear Cloud account required.
- Scriptable by default. Every CLI response is a validated model, and
--output json/--output idsare built for scripts, CI and agents.
Plan in Hoja. Build in your existing harness.
Three ways in
| Surface | What it gives you |
|---|---|
| Workspace | Inbox, My issues, Projects, Cycles, Teams and saved Views in the browser. Create, assign, discuss and review issues; group them into projects; use cycles as time-bounded reviews of what shipped, what is open and what was canceled. |
| CLI | me, auth, init, team, issue, project, cycle, comment, label, memory, raw and update — enough to drive real work from a terminal or a script. |
| API | A GraphQL endpoint with Linear-compatible names. Point your own tools at HOJA_API_URL with a workspace token. |
| Agents | An optional stdio MCP server with one guide tool, seven read-only resources and six workflow prompts. It has no mutation tools; changes go through the CLI or API. |
Install the CLI
uv tool install hoja-cli # or: python -m pip install hoja-cli
hoja --version
The PyPI distribution is hoja-cli and it installs the commands hoja,
hoja-serve and the optional hoja-mcp. The distribution carries the
-cli suffix because the hoja project on PyPI is unrelated software: install
hoja-cli, then run hoja.
Point it at a workspace with HOJA_API_URL and HOJA_TOKEN, or configure an
account once in ~/.config/hoja/config.toml:
[accounts.local]
base_url = "http://127.0.0.1:8787/graphql"
token_env = "HOJA_TOKEN"
[defaults]
default_account = "local"
hoja me
hoja issue list --assignee me
hoja issue create --team ENG --title "Review onboarding flow"
hoja -o json issue list --state Todo
hoja <command> --help # current flags for every command
HOJA_TOKEN and HOJA_API_URL are canonical. The former LINEAR_TOKEN and
LINEAR_API_URL names are still read as deprecated aliases, and the GraphQL type
names match Linear, so compatible clients can target Hoja without a rewrite.
Run the workspace
Docker Compose (recommended)
Docker Desktop, or Docker Engine with the Compose plugin, builds the web app and starts it against PostgreSQL. The first build pulls base images and frontend and Python dependencies, so it needs internet access.
-
Create
.envin the repository root.POSTGRES_PASSWORDis required; Compose refuses to start without it.POSTGRES_PASSWORD=replace-with-a-long-random-password
Keep this file private and do not commit it. Use letters and numbers: Compose interpolates the password into the PostgreSQL connection URL. If port
8787is taken, addHOJA_PORT=8788. -
Build and start:
docker compose up --build -d
Compose waits for PostgreSQL to pass its health check, then the app applies database migrations before serving.
-
Open http://localhost:8787. A fresh database starts the setup wizard: language, your admin profile and password, then your workspace and first team. Existing databases go straight to sign-in.
curl -i http://localhost:8787/healthreports liveness andcurl -i http://localhost:8787/readyreports schema readiness. -
The wizard can add teammates. Hoja creates each member and hands you a single-use invite link valid for 72 hours; it does not send invitation email. The finish step shows the admin API key once for CLI setup. Browser sign-in uses an HttpOnly cookie.
SQLite, no Docker
python -m pip install 'hoja-cli[server]'
hoja-serve seed --tenant local --org "Local Workspace" \
--org-key local --team-key ENG --email user@example.test
hoja-serve serve --tenant local --host 127.0.0.1 --port 8787
hoja-serve seed prints the token to export as HOJA_TOKEN.
Operating it
docker compose downstops the stack and keeps data in thehoja-postgresvolume;docker compose up -dbrings it back.docker compose down -vdeletes the volume and every record in it. It cannot be undone without a backup.- If the app is not ready, read
docker compose logs app dbbefore touching the volume. The container runs migrations on start. - If
docker composeis not a command, enable the Compose v2 plugin and check it withdocker compose version. This guide does not use legacydocker-compose.
Connect an agent
python -m pip install 'hoja-cli[mcp]'
which hoja-mcp
Register hoja-mcp as a stdio server in your client, passing the token through
that client's environment. Use an absolute path when the client does not inherit
your shell PATH:
{
"mcpServers": {
"hoja": {
"command": "/absolute/path/to/hoja-mcp",
"env": { "HOJA_TOKEN": "<workspace-token>" }
}
}
}
The server reads the same account configuration as the CLI. It exposes one guide tool, seven read-only resources and six workflow prompts, and it deliberately has no mutation tools.
The repository also ships an agent skill:
bash skills/install.sh --claude-only # or --swarm-only
bash skills/install.sh --copy # copy instead of symlink
Where Hoja stops
Honest boundaries keep the product predictable:
- Hoja does not run or monitor agents. Your harness does that; Hoja holds the work record they read and update.
- The MCP server is read-only. Mutations belong to the CLI and the API, where a token and its permissions are explicit.
- No prebuilt GitHub, Slack or meeting sync connectors are included. Use the CLI or API for your own integrations.
- Linear compatibility covers the GraphQL surface Hoja implements, not every Linear feature. Unsupported screens say so instead of pretending to work.
- Saved Views live in the browser, not in the shared workspace.
Development
Python 3.10 or newer.
uv sync --extra dev --extra server
uv run pytest
cd frontend && npm ci && npm run build
bash scripts/e2e-local-backend.shruns the backend integration pass against a disposable local database.bash scripts/e2e-test.shruns the live CLI matrix and needsHOJA_TOKEN,HOJA_TEST_TEAMandHOJA_TEST_ISSUE.python3 scripts/check_docs.pyis the documentation check CI enforces.
Contributor and agent operations are in AGENTS.md.
Documentation
- Design — product and architecture.
- Deployment — databases, migrations, readiness, tokens and release publishing.
- Remote MCP — the experimental OAuth-protected remote server; the stdio server is covered above.
- Cycle metrics and meetings.
- Changelog — release-level behavior changes.
License
MIT. See LICENSE.
Metadata
Release files for hoja-cli 0.21.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| hoja_cli-0.21.5.tar.gz | 4.6 MB | Without provenance | Details for hoja_cli-0.21.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| hoja_cli-0.21.5-py3-none-any.whl | Python 3 | none | any | Details for hoja_cli-0.21.5-py3-none-any.whl |
Total release size: 4.9 MB
Release files / hoja_cli-0.21.5.tar.gz
| Download URL | hoja_cli-0.21.5.tar.gz |
|---|---|
| Size | 4.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4084eb21d6f72f4c1b3449e5ecf3d866b02dc3d73779c39f66a4546bee7d1437
|
|
BLAKE2b-256 checksum How to use checksums |
4551d7376cb34fb71c7131d8c272a2665817bbc9e1f15a5d52cf752fa00de1e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / hoja_cli-0.21.5-py3-none-any.whl
| Download URL | hoja_cli-0.21.5-py3-none-any.whl |
|---|---|
| Size | 308.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
599eaec91ade7aab531a71ca87885870bb5ef7dddb7e4b33429d9ba425d470a3
|
|
BLAKE2b-256 checksum How to use checksums |
8d0d288b167fc460d8a3e6b050fb7e5d79c153597d777df92f040744315a3b3d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for hoja-cli 0.21.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.