# Dawnrose > Hosted deployment platform with an AI-first API. Deploy GitHub repos, Docker images or uploaded files; add databases from templates; manage variables, domains, volumes, logs, metrics, backups and environments. ## Connect an AI agent - MCP (Streamable HTTP): https://app.dawnrose.ai/mcp with header Authorization: Bearer - Claude Code: claude mcp add --transport http dawnrose https://app.dawnrose.ai/mcp --header "Authorization: Bearer " - Local stdio bridge: dawn mcp - Create a token: Dashboard → Connect Claude, or POST https://app.dawnrose.ai/api/tokens {"name":"Claude","kind":"agent"} ## REST API (same token) - GET /api/projects · POST /api/projects - GET /api/projects/{id}?env=production (canvas: services, status, edges, pending changes) - POST /api/environments/{envId}/services {name, source:{repo|image}, variables, deploy} - PATCH /api/services/{id} · PATCH /api/services/{id}/variables {variables:{K:V}} - POST /api/services/{id}/deploy · POST /api/services/{id}/files {files:[{path,content}]} · POST /api/services/{id}/upload (tar.gz body) - GET /api/deployments/{id}/wait · GET /api/deployments/{id}/logs · GET /api/services/{id}/logs?filter=@level:error - POST /api/services/{id}/domains · POST /api/environments/{envId}/templates/{templateId} Dawnrose is a hosted deployment platform (like Railway). You can do everything a user can do in the dashboard; your actions appear live in their dashboard with your name. Model: workspace → project → environment (production, staging, pr-N) → services. A service runs a GitHub repo, a Docker image, or files you upload. Databases come from templates. Typical flow: 1. whoami, then list_projects or create_project. 2. Databases: deploy_template (postgres | mysql | redis | mongo). They expose DATABASE_URL / REDIS_URL / MYSQL_URL / MONGO_URL. 3. App: create_service with repo= or image=, or create an empty service and deploy_files with code you write. Wire config with references, e.g. DATABASE_URL=${{ Postgres.DATABASE_URL }}. The app must listen on $PORT (injected). 4. wait_for_deployment → if FAILED read logTail / get_build_logs, fix, deploy again. 5. Verify with http_request (private, no domain needed), then generate_domain for a public URL. 6. Tell the user what you did with notify_user. Rules: settings and variable changes apply on the next deploy (deploy or deploy_changes). Destructive tools need confirm=true; only use them when the user asked. Private networking: services reach each other at .dawnrose.internal. Errors include a hint field with the next step. # Variables - Service variables: per service per environment. - Shared variables: per environment, referenced as ${{ shared.KEY }}. - References: ${{ ServiceName.KEY }} reads another service's variable, ${{ KEY }} reads your own. - Generators (evaluated once when saved): ${{ secret(32) }}, ${{ secret(16, "abc123") }}, ${{ randomInt(1, 100) }}. - Sealed variables are write-only. Provided to every service: PORT, DAWNROSE_PUBLIC_DOMAIN, DAWNROSE_PRIVATE_DOMAIN, DAWNROSE_PROJECT_ID/NAME, DAWNROSE_ENVIRONMENT_ID/NAME, DAWNROSE_SERVICE_ID/NAME, DAWNROSE_DEPLOYMENT_ID, DAWNROSE_REPLICA_ID, DAWNROSE_GIT_COMMIT_SHA, DAWNROSE_GIT_BRANCH, DAWNROSE_TCP_PROXY_DOMAIN/PORT (with a TCP proxy), DAWNROSE_VOLUME_MOUNT_PATH/NAME (with a volume). # dawnrose.json Place in the repository root (or the service root directory). railway.json is read too. ```json { "build": { "builder": "DOCKERFILE", "dockerfilePath": "Dockerfile", "buildCommand": "npm run build", "watchPatterns": ["src/**"] }, "deploy": { "startCommand": "node server.js", "preDeployCommand": "npm run migrate", "healthcheckPath": "/health", "healthcheckTimeout": 120, "restartPolicyType": "ON_FAILURE", "restartPolicyMaxRetries": 5, "numReplicas": 2, "cronSchedule": "*/15 * * * *", "overlapSeconds": 10, "drainingSeconds": 10 } } ``` Builders: AUTO (zero-config detection for Node, Python, Go, static sites), DOCKERFILE, NIXPACKS, RAILPACK. # Log filters - free text and "quoted phrases" - @level:error (debug|info|warn|error), @replica:0, @service:api, @stream:stderr - @key:value for JSON log attributes, numeric comparisons @status:>=500 - -term negates, OR combines groups