- Railway CLI Skill
- Manage Railway deployments and infrastructure using the Railway CLI.
- Pre-flight Check
- Current status: !
- railway status 2>&1 || echo "NOT_LINKED"
- Auto-Recovery
- Before running any command, check the pre-flight status above:
- If "command not found"
-
- Run
- npm install -g @railway/cli
- If "Not logged in"
-
- Tell user to run
- railway login
- manually (requires browser)
- If "NOT_LINKED" or "No project linked"
- :
- Run
- railway list
- to show available projects
- Ask user which project to link, or auto-detect from package.json name
- Link with
- railway link -p
- Command Routing
- Based on
- $ARGUMENTS
- , execute the appropriate workflow:
- "status" (default when no args)
- railway status
- railway domain
- railway deployment list
- --limit
- 1
- Report: project info, URL, and last deployment status/time.
- "logs" [options]
- Parse natural language options:
- "errors" →
- --filter "@level:error"
- "last hour" / "1h" →
- --since 1h
- "build" →
- --build
- Number like "100" →
- --lines 100
- Default:
- railway logs --lines 30
- Summarize output - highlight errors, warnings, or interesting patterns.
- "deploy" / "up"
- railway up
- Then wait and check:
- Run
- railway deployment list --limit 1
- to get status
- If SUCCESS, fetch the domain URL and verify it responds:
- curl -s -o /dev/null -w "%{http_code}"
- If FAILED, show build logs:
- railway logs --build --lines 50
- "redeploy"
- railway redeploy
- Redeploys without rebuilding. Useful for env var changes.
- "restart"
- railway restart
- Restarts the service without rebuild or redeploy.
- "vars" / "env" [action]
- railway variables
- IMPORTANT
- When displaying variables, redact sensitive values:
API keys: show first 8 chars + "..."
Passwords: show "**"
Tokens: show first 8 chars + "..."
For setting:
railway variables set KEY=value
For deleting:
railway variables delete KEY
(ask for confirmation first!)
"deployments" / "history"
railway deployment list
--limit
10
Format as a table with: ID (short), Status, Time ago, Commit message (truncated)
"domain"
railway domain
Show the public URL. If none exists, offer to create one.
"health"
railway domain
Then curl the domain to check HTTP status:
curl
-s
-o
/dev/null
-w
"%{http_code}"
-m
10
<
domain-url
Report if healthy (2xx), unhealthy, or unreachable. "open" railway open Opens the Railway dashboard in browser. "switch " Switch to a different Railway project by name (fuzzy match).
List all projects
- railway list
- Find the project ID that matches the name, then:
- railway
- link
- -p
- <
- project-id
- >
- Confirm the switch with
- railway status
- .
- "db" / "connect"
- Connect to the project's database shell (Postgres, MongoDB, Redis, etc.)
- railway connect
- If multiple databases exist, Railway will prompt to select one.
- "link"
- List available projects and link one:
- railway list
- Show projects in a numbered list. Ask user which to link, then:
- railway
- link
- -p
- <
- project-id
- >
- Safety Guards
- Before destructive operations, ask for confirmation:
- railway down
- - removes deployment
- railway variables delete
- - removes env var
- railway unlink
- - unlinks project
- Format: "This will [action]. Are you sure? (y/n)"
- Response Format
- Always provide:
- Summary
-
- One-line status (✓ success / ✗ failure / ⚠ warning)
- Details
-
- Relevant information in a clean table or list
- URL
-
- Public URL if applicable
- Next steps
- If something failed, suggest how to fix it
Example Responses
Status check:
✓ MyApp is deployed and healthy
| Project | MyApp |
| Environment | production |
| Service | MyApp |
| URL | https://myapp-production.up.railway.app |
| Last deploy | 2 hours ago (SUCCESS) |
After deploy:
✓ Deployment successful
Build completed in 45s
URL: https://myapp-production.up.railway.app
Health check: 200 OK
On error:
✗ Deployment failed
Build error at line 23: Module not found 'xyz'
Suggested fix: Run
npm install xyzand redeploy