Install and sign in
Requires Node.js 22 or newer.@amerged/ohmyhost-cli and @amerged/ohmyhost-mcp. Both sources install the ohmyhost and ohmyhost-mcp commands, so keep one source per computer and upgrade from the one already installed (npm ls --global names it). To switch, first remove the other pair: npm uninstall --global @ohmyhost/product-cli @ohmyhost/mcp for the archives, npm uninstall --global @amerged/ohmyhost-cli @amerged/ohmyhost-mcp for npm.
Release manifest and checksums · Current release
Run ohmyhost login --json and open the returned sign-in URL. Check that the page shows the confirmation code returned by the CLI; the link carries it, so you do not type one. Sign in there, or create your account on that same page if you do not have one yet; signing up is open. Use the organizations returned by whoami; when several are available, select the one for this project. If none exists, create one through the get-started Skill.
Authenticate
The CLI accepts two credentials and picks in this order:OHMYHOST_TOKEN— a user API token. Set it and the CLI works immediately. No browser, no login.- A login saved by
ohmyhost login— used only whenOHMYHOST_TOKENis unset. With several, choose--profile-name NAMEorOHMYHOST_PROFILE=NAME(saved accounts).
OHMYHOST_TOKEN wins whenever set; no saved login is read. Naming another account or a checkout linked for another organization fails environment_token_context_mismatch before execution. If the value is not a valid sk_… token the command fails with invalid_environment_token and does not fall back.
These commands need the interactive login and refuse a token: login, logout, organization create|list|use, and token create|list|revoke. Run those in a process without OHMYHOST_TOKEN; preserve the existing private token file. Other commands use the token’s current permissions and workspace role.
Inspect and select a project
Run inside the repository:ohmyhost.yaml, run ohmyhost init --json once blockers are resolved; --root DIR selects a nested app and --region eu prepares EU storage. Save the file in your managed version, or commit and push it for a GitHub source. Init never overwrites an existing configuration. Reuse an existing project, or create one after choosing isolated or shared data, protected or public Dev access, and setting HOSTING_REGION to the chosen us or eu:
ORGANIZATION_ID comes from whoami. Create a unique PROJECT_REQUEST_KEY once and retain it for retries. PROJECT_OPERATION_ID is the creation response’s operation.id. After success, select the created project’s ID from the list as PROJECT_ID.
Init’s runtime contract lists the actual values the enabled capabilities need, deduplicating shared names. Storage needs OHMYHOST_STORAGE_GATEWAY_URL, OHMYHOST_STORAGE_KEY, OHMYHOST_PROJECT_ID and OHMYHOST_ENVIRONMENT_ID; mail needs OHMYHOST_MAIL_GATEWAY_URL, OHMYHOST_MAIL_KEY and OHMYHOST_PROJECT_ID. Both clients use (request) => fetch(request) in server code. The database keeps its OHMYHOST_DATABASE binding.
gateway_binding_unsupported identifies source still referencing a legacy mail/storage gateway binding; replace that transport with the injected URL, runtime key and global fetch. storage_client_missing means storage is declared but the application does not construct createPrivateStorageClient. These are local init checks, not evidence that a real upload or send has succeeded. Use the current CLI so its guidance matches the deployed runtime, then verify the application’s actual flow.
Connect and deploy
Read the saved source first and keep its binding:Save managed source
Inspect the local files before saving them. For an unbound project with no pending initialization, choose and retain a uniqueSOURCE_REQUEST_KEY for this save:
--mode commit with its current --expected-source-generation and --expected-source-connection. Keep the checkout’s confirmed base; supply --expected-commit only after merging newer saved changes into these files. --mode switch replaces a GitHub binding only when you explicitly request that change. Exclude credentials, private env files, dependencies, caches and build output. Saving source starts no build and imports no Git history.
Retain the accepted operation and key after an uncertain response; SOURCE_OPERATION_ID is its operation.id. Observe that operation, then use ohmyhost source publish complete --project "$PROJECT_ID" --operation "$SOURCE_OPERATION_ID" --json in the same directory and login to confirm a pending publication. Use the committed upload receipt’s own commit_sha as COMMIT_SHA; a candidate SHA before completion is not a saved version. Save current local files.
Connect GitHub source
Read the workspace’s GitHub connection first. If it is not connected, an Owner or Admin runs connect:authorization.authorization_url, then repeat the same connect request/key after browser confirmation until status is connected. This link handles installation/user authorization when needed. A failed or expired attempt needs the reported last_failure resolved and a new connect key for the same workspace.
Set GITHUB_OWNER and GITHUB_REPOSITORY to a repository covered by that installation. Retain one unique SOURCE_REQUEST_KEY for this source link:
github.connection.settings_url returned by GitHub status, then the same link command/key. No build starts until you deploy a plan. From the repository root, link also records .ohmyhost/ and adds /.ohmyhost/ to .gitignore. Later commands may omit --project; the CLI names the selected project on stderr. A checkout keeps one link per organization: when several match, supply --project or --profile-name (linked_project_selection_required).
Deploy the saved commit
Use the full SHA of the saved managed version or pushed GitHub commit asCOMMIT_SHA:
PLAN_ID from plan.id, retain a new DEPLOY_REQUEST_KEY, and execute the approved plan:
Verify progress and the application
OPERATION_ID is the deploy response’s operation.id. A wait timeout leaves the accepted operation running; inspect it without submitting another deployment. Follow returned polling guidance. If dev_access_mode is protected, the clean URL answers 404 without a session: open the reusable share_url first, then test the clean Dev URL. If it is public, open the clean Dev URL directly. Keep the share link out of logs and project notes. The Owner can change the mode with ohmyhost project dev-access mode, replace the link with ohmyhost project dev-share rotate, or revoke it with ohmyhost project dev-share revoke.
Common follow-ups
PROJECT_ETAG is project.etag from project status. Renaming breaks links to the old address; read project addresses first.
For later automation, create a token from Profile → API Tokens or the token commands. New tokens stay valid until revoked. MCP setup uses the same account access.