Railway

Deploy as docker image to Railway. Similar approach works to other PaaS / container-based hosting environments (Heroku, Render, Fly.io).

Railway runs the plugin exactly as the starter kit builds it: a long-lived Node container where the whole project directory — skills/, agents/, public/, README.md, the generated metadata — sits on disk next to the server. No adapter change, no file lists. This makes Railway the simplest target for a Quartal Plugin.

1. Add a start script

The scaffolded package.json has dev, build and preview; Railway needs start:

"scripts": {
  "dev": "astro dev",
  "build": "astro build",
  "preview": "astro preview",
  "start": "node ./dist/server/entry.mjs"
}

2. Bind to all interfaces

Railway routes traffic to your container’s PORT, so the server must not listen on localhost only. In astro.config.mjs, add one line:

export default defineConfig({
  output: "server",
  adapter: node({ mode: "standalone" }),
  server: { host: true },
  integrations: [qrtlPlugin()],
});

The Node adapter reads PORT from the environment automatically.

3. Create the service and deploy

npm i -g @railway/cli
railway login
railway init            # create a project (or `railway link` an existing one)
railway add --service my-plugin
railway up

Railway builds the uploaded sources (npm install → npm run build) and starts the server with npm start. Watch the build logs the CLI streams back.

4. Give it a URL

railway domain

This assigns a *.up.railway.app domain; custom domains are added in the service settings (a CNAME record).

5. Environment variables (auth plugins only)

If your plugin uses auth: "custom", set the OAUTH_* variables from Authentication on the service:

railway variables --set "OAUTH_ISSUER=https://iam.example.com/realms/my-realm"

6. Verify

curl https://<your-service>.up.railway.app/plugin.json

Then open the URL in a browser: the docs site should show your tools, skills and agents. A good health-check path for the service settings is /plugin.json.

Test and production

Run two services from the same repo (for example my-plugin-test and my-plugin), each with its own variables and domain — or use Railway’s per-environment feature within one project. Deploy to a specific service with railway up --service my-plugin-test.