Open-source Project Management Platform
0
stars
27
commits
TypeScript
primary language
Sep 11, 2026
updated
Hopya is a self-hosted task manager for teams that want a private, straightforward workspace without a mandatory cloud service. Organize work into projects, folders, and lists, then use List, Board, Calendar, Gallery, or Timeline views over the same tasks.
Hopya is an early release. Back up your data and review the security and deployment guidance before using it for important workloads.
You need Docker Engine and Docker Compose. Node.js 24 is optional and only needed for the easiest configuration initializer and local development.
Generate a private .env:
npm run init:env
Without Node.js on the host, run the initializer through Docker:
docker run --rm --network none --read-only --cap-drop ALL \
--security-opt no-new-privileges:true --user "$(id -u):$(id -g)" \
-v "$PWD:/work" -w /work node:24-bookworm-slim \
node --experimental-strip-types ops/init-env.ts
Start Hopya:
docker compose up -d --build --wait
Open http://localhost:8888, then create the first administrator using SETUP_TOKEN from .env.
The default deployment listens only on 127.0.0.1. For remote access, place Hopya behind a trusted HTTPS reverse proxy and set APP_URL to the exact public origin. Do not expose the private API or web containers directly.
Useful commands:
docker compose ps
docker compose logs -f api web proxy
docker compose up -d --build --wait
docker compose down
Each Git tag publishes ghcr.io/<owner>/<repository>-api:<tag> and ghcr.io/<owner>/<repository>-web:<tag>. To deploy those exact images instead of building locally, set HOPYA_API_IMAGE and HOPYA_WEB_IMAGE in .env, then run docker compose pull api web followed by docker compose up -d --no-build --wait. Branch pushes do not publish containers.
docker compose down removes containers but leaves the ignored ./data directory intact. Do not delete that directory unless you intentionally want to delete all Hopya data.
See the user guide for everyday workflows and permissions.
The generated .env contains the required private values. Keep it out of Git and backups that are not encrypted.
| Setting | Purpose |
|---|---|
APP_URL | Exact browser origin, including HTTPS and a nonstandard port if used |
APP_KEY | Stable application secret; changing it invalidates signed state |
SETUP_TOKEN | One-time secret used to create the first administrator |
AUTOMATION_KEYRING | API-only encryption keys for optional write-only automation credentials |
AUTOMATION_NETWORK_EXCEPTIONS | Exact origins exempted from default automation destination restrictions |
BIND_ADDRESS, HTTP_PORT | Host listener; defaults to 127.0.0.1:8888 |
LANDING_ENABLED | Enable the optional public landing page; off by default |
REGISTRATION_ENABLED | Allow public local-account registration; off by default |
SMTP_URL, SMTP_FROM | Enable password recovery and email delivery |
STORAGE_DRIVER, S3_*, AWS_* | Select filesystem or private S3-compatible attachments |
OIDC_* | Configure an optional standards-compliant OIDC provider |
AI_* | Configure an optional AI provider and model |
DB_CONNECTION, DATABASE_URL | Select SQLite (default) or PostgreSQL |
All integrations are optional. Empty provider settings keep the cloud-free core operational. SQLite needs no database configuration. To use the bundled PostgreSQL profile, set COMPOSE_PROFILES=postgres and DB_CONNECTION=pg; the initializer already generates matching private DATABASE_URL and POSTGRES_PASSWORD values. See deployment, integrations, and OIDC setup for details.
The public landing page is disabled by default, so / redirects to sign-in. To enable it, set LANDING_ENABLED=true in .env, recreate the API and web services, and enable Landing page under Administration > Site settings if an administrator previously disabled it.
To change its headline, description, button label, or footer note, edit the four plain-text values in apps/web/src/landing.json. Keep the file valid JSON; HTML is not supported.
Rebuild the web image after editing:
docker compose up -d --build web
Set LANDING_ENABLED=false and recreate the API and web services to force the landing page off again. The operator setting takes precedence over the administrator control.
Filesystem attachments and the default SQLite database are stored in the ignored ./data directory. PostgreSQL data uses the hopya_postgres-data volume. Workspace exports do not include account credentials or attachment bytes and are not complete backups.
For a reliable backup:
./data and, when selected, take a consistent PostgreSQL backup..env separately.Follow the backup and restore guide for commands and recovery cautions.
Use Node.js 24, pinned in .node-version.
npm run init:env -- --development
npm ci
npm run dev
Open http://localhost:4321. Before submitting changes, run:
npm run check
The normal check runs TypeScript validation, API/unit tests, and production builds. Browser tests are separate:
npm run test:browser
Additional deployment and browser verification remain available for deliberate local runs with npm run test:deployment and npm run test:browser.
The REST API is available under /api/v1. Create a personal token in Settings and send it as Authorization: Bearer <token>. See the REST reference.
MCP supports a local stdio process:
Command: node
Arguments: apps/api/build/bin/mcp.js
Working directory: /absolute/path/to/hopya
Environment:
HOPYA_API_URL=http://localhost:8888
HOPYA_API_TOKEN=<personal token>
MCP is read-only by default. For Docker Compose, set HOPYA_MCP_ALLOW_WRITES=true in .env and recreate the API service to expose mutation tools; the MCP client must still obtain explicit human approval for each write.
Site administrators may also enable the disabled-by-default SSE transport in Administration > Site settings. Connect an SSE-compatible MCP client to https://your-hopya.example/api/v1/mcp/sse and configure Authorization: Bearer <personal token> as a header. Never place the token in the URL. Disabling SSE immediately closes active sessions; sessions otherwise expire after 30 minutes. Both transports expose the same tools and enforce the token owner's current workspace permissions.
Hopya is available under the MIT License.
27 commits
TypeScript
93.7%
CSS
5.9%
Open-source Project Management Platform
0
stars
27
commits
TypeScript
primary language
Sep 11, 2026
updated
Hopya is a self-hosted task manager for teams that want a private, straightforward workspace without a mandatory cloud service. Organize work into projects, folders, and lists, then use List, Board, Calendar, Gallery, or Timeline views over the same tasks.
Hopya is an early release. Back up your data and review the security and deployment guidance before using it for important workloads.
You need Docker Engine and Docker Compose. Node.js 24 is optional and only needed for the easiest configuration initializer and local development.
Generate a private .env:
npm run init:env
Without Node.js on the host, run the initializer through Docker:
docker run --rm --network none --read-only --cap-drop ALL \
--security-opt no-new-privileges:true --user "$(id -u):$(id -g)" \
-v "$PWD:/work" -w /work node:24-bookworm-slim \
node --experimental-strip-types ops/init-env.ts
Start Hopya:
docker compose up -d --build --wait
Open http://localhost:8888, then create the first administrator using SETUP_TOKEN from .env.
The default deployment listens only on 127.0.0.1. For remote access, place Hopya behind a trusted HTTPS reverse proxy and set APP_URL to the exact public origin. Do not expose the private API or web containers directly.
Useful commands:
docker compose ps
docker compose logs -f api web proxy
docker compose up -d --build --wait
docker compose down
Each Git tag publishes ghcr.io/<owner>/<repository>-api:<tag> and ghcr.io/<owner>/<repository>-web:<tag>. To deploy those exact images instead of building locally, set HOPYA_API_IMAGE and HOPYA_WEB_IMAGE in .env, then run docker compose pull api web followed by docker compose up -d --no-build --wait. Branch pushes do not publish containers.
docker compose down removes containers but leaves the ignored ./data directory intact. Do not delete that directory unless you intentionally want to delete all Hopya data.
See the user guide for everyday workflows and permissions.
The generated .env contains the required private values. Keep it out of Git and backups that are not encrypted.
| Setting | Purpose |
|---|---|
APP_URL | Exact browser origin, including HTTPS and a nonstandard port if used |
APP_KEY | Stable application secret; changing it invalidates signed state |
SETUP_TOKEN | One-time secret used to create the first administrator |
AUTOMATION_KEYRING | API-only encryption keys for optional write-only automation credentials |
AUTOMATION_NETWORK_EXCEPTIONS | Exact origins exempted from default automation destination restrictions |
BIND_ADDRESS, HTTP_PORT | Host listener; defaults to 127.0.0.1:8888 |
LANDING_ENABLED | Enable the optional public landing page; off by default |
REGISTRATION_ENABLED | Allow public local-account registration; off by default |
SMTP_URL, SMTP_FROM | Enable password recovery and email delivery |
STORAGE_DRIVER, S3_*, AWS_* | Select filesystem or private S3-compatible attachments |
OIDC_* | Configure an optional standards-compliant OIDC provider |
AI_* | Configure an optional AI provider and model |
DB_CONNECTION, DATABASE_URL | Select SQLite (default) or PostgreSQL |
All integrations are optional. Empty provider settings keep the cloud-free core operational. SQLite needs no database configuration. To use the bundled PostgreSQL profile, set COMPOSE_PROFILES=postgres and DB_CONNECTION=pg; the initializer already generates matching private DATABASE_URL and POSTGRES_PASSWORD values. See deployment, integrations, and OIDC setup for details.
The public landing page is disabled by default, so / redirects to sign-in. To enable it, set LANDING_ENABLED=true in .env, recreate the API and web services, and enable Landing page under Administration > Site settings if an administrator previously disabled it.
To change its headline, description, button label, or footer note, edit the four plain-text values in apps/web/src/landing.json. Keep the file valid JSON; HTML is not supported.
Rebuild the web image after editing:
docker compose up -d --build web
Set LANDING_ENABLED=false and recreate the API and web services to force the landing page off again. The operator setting takes precedence over the administrator control.
Filesystem attachments and the default SQLite database are stored in the ignored ./data directory. PostgreSQL data uses the hopya_postgres-data volume. Workspace exports do not include account credentials or attachment bytes and are not complete backups.
For a reliable backup:
./data and, when selected, take a consistent PostgreSQL backup..env separately.Follow the backup and restore guide for commands and recovery cautions.
Use Node.js 24, pinned in .node-version.
npm run init:env -- --development
npm ci
npm run dev
Open http://localhost:4321. Before submitting changes, run:
npm run check
The normal check runs TypeScript validation, API/unit tests, and production builds. Browser tests are separate:
npm run test:browser
Additional deployment and browser verification remain available for deliberate local runs with npm run test:deployment and npm run test:browser.
The REST API is available under /api/v1. Create a personal token in Settings and send it as Authorization: Bearer <token>. See the REST reference.
MCP supports a local stdio process:
Command: node
Arguments: apps/api/build/bin/mcp.js
Working directory: /absolute/path/to/hopya
Environment:
HOPYA_API_URL=http://localhost:8888
HOPYA_API_TOKEN=<personal token>
MCP is read-only by default. For Docker Compose, set HOPYA_MCP_ALLOW_WRITES=true in .env and recreate the API service to expose mutation tools; the MCP client must still obtain explicit human approval for each write.
Site administrators may also enable the disabled-by-default SSE transport in Administration > Site settings. Connect an SSE-compatible MCP client to https://your-hopya.example/api/v1/mcp/sse and configure Authorization: Bearer <personal token> as a header. Never place the token in the URL. Disabling SSE immediately closes active sessions; sessions otherwise expire after 30 minutes. Both transports expose the same tools and enforce the token owner's current workspace permissions.
Hopya is available under the MIT License.
27 commits
TypeScript
93.7%
CSS
5.9%