environment
Environment Configuration
Read and edit Railway environment configuration using the CLI.
Prerequisites
Requires Railway CLI v4.27.3+. Check with:
railway --version
If below 4.27.3, upgrade:
railway upgrade
Quick Actions
When user asks "what's the config" or "show configuration":
railway environment config --json
Present: source (repo/image), build settings, deploy settings, variables per service.
When user asks "what variables" or "show env vars":
Same command — railway environment config --json includes variables per service and shared variables.
For rendered (resolved) variable values: railway variables --json
When to Use
- User wants to create a new environment
- User wants to duplicate an environment (e.g., "copy production to staging")
- User wants to switch to a different environment
- User asks about current build/deploy settings, variables, replicas, health checks, domains
- User asks to change service source (Docker image, branch, commit, root directory)
- User wants to connect a service to a GitHub repo
- User wants to deploy from a GitHub repo (create empty service first via
newskill, then use this) - User asks to change build or start command
- User wants to add/update/delete environment variables
- User wants to change replica count or configure health checks
- User asks to delete a service, volume, or bucket
- Auto-fixing build errors detected in logs
Create Environment
Create a new environment in the linked project:
railway environment new <name>
Duplicate an existing environment:
railway environment new staging --duplicate production
With service-specific variables:
railway environment new staging --duplicate production --service-variable api PORT=3001
Switch Environment
Link a different environment to the current directory:
railway environment <name>
Or by ID:
railway environment <environment-id>
Get Context
JSON output — project/environment IDs and service list:
railway status --json
Extract:
project.id— project IDenvironment.id— environment ID
Plain output — linked service name:
railway status
Shows Service: <name> line with the currently linked service.
Resolve Service ID
Get service IDs from the environment config:
railway environment config --json | jq '.services | keys'
Map service IDs to names via status:
railway status --json
The project.services array contains { id, name } for each service. Match against the service keys from environment config.
Read Configuration
Fetch current environment configuration:
railway environment config --json
Response Structure
{
"services": {
"<serviceId>": {
"source": { "repo": "...", "branch": "main" },
"build": { "buildCommand": "npm run build", "builder": "NIXPACKS" },
"deploy": {
"startCommand": "npm start",
"multiRegionConfig": { "us-west2": { "numReplicas": 1 } }
},
"variables": { "NODE_ENV": { "value": "production" } },
"networking": { "serviceDomains": {}, "customDomains": {} }
}
},
"sharedVariables": { "DATABASE_URL": { "value": "..." } }
}
For complete field reference, see reference/environment-config.md.
For variable syntax and service wiring patterns, see reference/variables.md.
Get Rendered Variables
environment config returns unrendered variables — template syntax like ${{shared.DOMAIN}} is preserved. This is correct for management/editing.
To see rendered (resolved) values as they appear at runtime:
# Current linked service
railway variables --json
# Specific service
railway variables --service <service-name> --json
When to use:
- Debugging connection issues (see actual URLs/ports)
- Verifying variable resolution is correct
- Viewing Railway-injected values (RAILWAY_*)
Edit Configuration
Pass a JSON patch to railway environment edit to apply changes. The patch is merged with existing config and committed immediately, triggering deploys.
railway environment edit --json <<< '<json-patch>'
With a commit message:
railway environment edit -m "description of change" --json <<< '<json-patch>'
Examples
Set build command:
railway environment edit --json <<< '{"services":{"SERVICE_ID":{"build":{"buildCommand":"npm run build"}}}}'
Add variable:
railway environment edit -m "add API_KEY" --json <<< '{"services":{"SERVICE_ID":{"variables":{"API_KEY":{"value":"secret"}}}}}'
Delete variable:
railway environment edit --json <<< '{"services":{"SERVICE_ID":{"variables":{"OLD_VAR":null}}}}'
Delete service:
railway environment edit --json <<< '{"services":{"SERVICE_ID":{"isDeleted":true}}}'
Set replicas:
railway environment edit --json <<< '{"services":{"SERVICE_ID":{"deploy":{"multiRegionConfig":{"us-west2":{"numReplicas":3}}}}}}'
Add shared variable:
railway environment edit --json <<< '{"sharedVariables":{"DATABASE_URL":{"value":"postgres://..."}}}'
Batching Multiple Changes
Include multiple fields in a single patch to apply them atomically:
railway environment edit -m "configure build, start, and env" --json <<< '{"services":{"SERVICE_ID":{"build":{"buildCommand":"npm run build"},"deploy":{"startCommand":"npm start"},"variables":{"NODE_ENV":{"value":"production"}}}}}'
Error Handling
Command Not Found
If railway environment edit is not recognized, upgrade the CLI:
railway upgrade
Service Not Found
Service "foo" not found in project. Available services: api, web, worker
Invalid Configuration
Common issues:
buildCommandandstartCommandcannot be identicalbuildCommandonly valid with NIXPACKS builderdockerfilePathonly valid with DOCKERFILE builder
No Permission
You don't have permission to modify this environment. Check your Railway role.
No Linked Project
No project linked. Run `railway link` to link a project.
Composability
- Create service: Use
serviceskill - View logs: Use
deploymentskill - Add domains: Use
domainskill - Deploy local code: Use
deployskill