Deploy It's a Plan
Self-hosted project tracker with boards, cycles and AI agents
Just deployed
/var/lib/postgresql/data
Just deployed
Just deployed
worker
Just deployed
Just deployed
attachments
Bucket
Just deployed
Deploy and Host It's a Plan on Railway
It's a Plan is a self-hosted project tracker. It holds projects, issues, boards, cycles and initiatives, and every project defines its own columns, issue types, labels and custom fields. Dashboards, webhooks, a Telegram bot, an MCP server and AI agents that work on issues are included. The source is AGPL-3.0.
About Hosting It's a Plan
The stack is four services built from one repository, plus a database and a bucket. api is an Elysia server on Bun that applies its own database migrations on startup and serves the REST API, the MCP endpoint and the auth handler. web is a Next.js app rendered on the server; the API origin is compiled into its bundle, so it rebuilds whenever that origin changes. worker delivers webhooks and notifications and runs agent schedules. bot runs Telegram long polling and stays at a single replica. Postgres holds all data and the bucket holds issue attachments. Secrets are generated at deploy time — you supply two hostnames and nothing else.
Common Use Cases
- Teams that want an issue tracker on their own infrastructure, with data in a database they control
- Instances where AI agents pick up issues and work through them under human review
- Projects that drive their tracker from code, through the MCP server or the REST API
Dependencies for It's a Plan Hosting
- PostgreSQL for all application data
- An S3-compatible bucket for issue attachments
- A domain you control, with two hostnames pointing at this project
- Source: https://github.com/croffasia/itsaplan (AGPL-3.0)
Implementation Details
A domain of your own is required. Railway's generated *.up.railway.app hostnames are on the Public Suffix List, so the browser treats each service as a separate site and rejects the session cookie: sign-in returns 200 and then bounces straight back to the login page. Two hostnames under one registrable domain fix this, because the cookie is then issued on their shared parent.
Deploying takes three steps:
- Enter
API_DOMAINandAPP_DOMAIN, for exampleapi.example.comandapp.example.com. - After the deploy, add
API_DOMAINas a custom domain on theapiservice andAPP_DOMAINon thewebservice, then create the CNAME records Railway gives you. Keep them unproxied. - Open the web app and register. The first account becomes the instance administrator.
SMTP, AI provider keys and the Telegram bot token are configured in the interface after sign-in, not through environment variables.
Why Deploy It's a Plan on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying It's a Plan on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.
Template Content
worker
croffasia/itsaplanAPI_URL
Public origin of the API, e.g. https://api.example.com. Attach this hostname to the api service after deploy.
APP_URL
Public origin of this web app, e.g. https://app.example.com. Attach this hostname to this service after deploy.
attachments
Bucket
