
Hostim
io.github.hostimdevPublished by GitHub account hostimdevv0.1.56Updated Nov 3, 2026
Deploy and manage apps, databases, volumes and domains on Hostim, an EU cloud hosting platform.
Overview
Hostim's local MCP server; no sign-in required; STDIO.
No AI overview yet: these facts come from the registry entry and the server itself.
Installation
In SourceWeft
- Open Hostim in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
hostim CLI
Command-line interface for the Hostim.dev cloud platform.
Create and manage projects, apps, databases (MySQL / Postgres / Redis), volumes
and domains from a terminal or a CI pipeline, over the public REST API at
https://api.hostim.dev.
An app can deploy from a local directory (uploaded and built from its
Dockerfile, or served as a static site), a git repository, or a Docker image.
A local directory needs no git remote and no registry:
hostim deploy web --source . --plan sa-1-1 --port 8080. See deploy.
This file is the complete manual. The binary carries the same text: run
hostim agent to print it to stdout, so an agent or a script can read the
whole manual without network access.
Commands, flags, output and API responses can change between releases. Check the release notes before you upgrade.
Contents
- Install
- Log in
- Configuration
- Global flags
- Output and exit codes
- Command reference
- Template files
- Deploy from CI
- Reporting problems
- Development
- License
Install
The script downloads the release binary for the current OS and architecture
(Linux and macOS, amd64 and arm64) and installs it into /usr/local/bin, using
sudo when that directory is not writable. When it is not writable and sudo
is not installed either — a plain container, for example — the script falls back
to ~/.local/bin and tells you if that directory is not on your PATH. Set
PREFIX to choose the location yourself:
Some agents and CI policies refuse to pipe a downloaded script into a shell. The script is not required. Use Homebrew (macOS and Linux):
Or npm (Node 18+). npx downloads the release binary for your platform on the
first run, checks it against the release checksums and caches it:
Or fetch the release binary directly:
Build from source instead (Go 1.26+):
Check the install:
Log in
hostim login uses a device code. It prints a URL and a short code, you approve
the request in the browser, and the token is saved automatically:
hostim login polls until you approve and saves the token itself, so there is
no need to write a waiting loop around it or to run it a second time. The
browser step does not need a terminal, so an agent can run hostim login and
show you the code. If you already have a token, store it directly instead —
create one in the dashboard at https://console.hostim.dev:
login validates the token against the API before saving it to
~/.config/hostim/config.yml (mode 0600). In CI, skip login and export
HOSTIM_TOKEN instead — no file is written.
Most commands act on one project. Set a default once:
Configuration
Values are resolved as flag → environment variable → config file, with a built-in default for the API URL.
The config file lives at ~/.config/hostim/config.yml, or
$XDG_CONFIG_HOME/hostim/config.yml when XDG_CONFIG_HOME is set:
Projects and apps can be named by name or by ID everywhere.
Global flags
Available on every command:
Destructive commands (rm, templates apply) ask for confirmation and take
-y / --yes to skip the prompt.
Output and exit codes
Default output is an aligned text table meant for a human. -o json switches
every command to machine output and is the right mode for scripts and agents:
- read commands print the API object or list as indented JSON;
- write commands print a single result object naming what happened, for example
{"status":"created","kind":"app","name":"web"}or{"status":"ok","kind":"env","set":1}; - failures print a JSON object on stderr, for example
{"status":"error","error":"..."}, and exit non-zero. When a command is short of several requirements, the object carries a"missing"array listing all of them at once.
Exit codes:
Command reference
Every example below is runnable as written once a token and a project are set.
login, logout, whoami, use
projects
--region is required on create; see hostim regions ls for the values.
projects export writes a desired-state template, not a backup: volume and
database contents (data) are not exported. That data is backed up on a
schedule anyway: Postgres and MySQL databases and volumes, see
backups (hostim backups). Costs, IDs, built-in domains and
unused source blocks are stripped, and env var values are exported RAW — the
file holds secrets (passwords, API keys), so store and share it like a
password file. Docker registry passwords and git tokens are not readable
through the API and are left out (registry usernames are kept); set them
again after applying.
Redeploy with hostim templates apply -f prod.yml --new-project prod-clone.
deploy
hostim deploy <app> creates the app when it does not exist (from --source,
--git or --docker-image) and otherwise updates its source and triggers a
rebuild. It waits for the build and exits non-zero if the build fails, so it
drops straight into a pipeline. hostim apps deploy is the same command.
Flags:
With --source . the directory is packed into a .tar.gz and uploaded before
the build. These paths are always left out: .git/, node_modules/ (at any
depth), .env and .env.* files (except .env.example, .env.sample and
.env.template). A .dockerignore at the directory root is applied too; the
Dockerfile and .dockerignore are always kept. Symlinked directories are not
followed, and a symlink is skipped when its target is outside the directory.
The archive is limited to 500 MiB after compression. The same files always give
the same archive hash, so an unchanged directory is not uploaded twice. The
platform keeps an uploaded archive for 7 days; after that, run the deploy with
--source <dir> again to re-upload it.
A directory with an index.html and no Dockerfile is a static site: the CLI
adds an nginx Dockerfile and config, so --port is not needed (the app listens
on 80). --static forces this mode when the directory has a Dockerfile (Jekyll
copies one into _site); the directory's own Dockerfile and .dockerignore
are then ignored. In static mode every file in the directory is uploaded, even
inside a git work tree whose .gitignore lists the build folder. The nginx
config serves /about from about.html or about/index.html, uses the site's
404.html, gzips text, and caches /_astro/, /_next/static/ and /assets/
for a year. On success the deploy prints the app's URL.
Plan IDs are per resource kind and look like sa-1-1 (shared app, 1 core, 1 GB
RAM). List the ones a region offers with hostim regions pricing <region> --for apps.
deploy handles one app. An app that also needs a database, a Redis or a
volume is deployed as a template — see templates.
apps
status, logs, events, overview
status shows the current value; events shows how it got there, which is
where to look when an app went unhealthy and came back. --build works for apps
built from git; an app that runs a prebuilt docker image has no build logs.
env
Environment variables belong either to one app (-a/--app) or to the whole
project (--global). Apps see the global set plus their own.
Changing environment variables restarts the app.
To reach another app in the same project, use its internal DNS name
app-<name>-service on its HTTP port, for example
API_URL=http://app-api-service:8080. hostim status <app> shows it as
"Internal DNS". Apps without an HTTP port have none.
Values can reference database variables with $(...), also inside a longer
value such as a DSN. They are expanded at container start, so hostim env get
shows the literal text. See Placeholders in envVars
for every variable name.
domain
Add the printed record at the DNS provider, then re-run hostim domain status
until it reports the domain as active; the certificate is issued automatically.
exec
Runs a command inside an app's container, or opens an interactive shell when no
command is given. The connection goes through the project's SSH bastion, so the
project has to authorize your public SSH key. The first hostim exec against a
project offers to add the key for you; pass -y to add it without the prompt,
which is what a script or a CI job needs.
Aliases: shell, ssh. The exit status of the remote command becomes the exit
status of hostim exec.
db
Three engines, the same command shape: hostim db mysql|postgres|redis ls|get|create|credentials|status|rm. pg is an alias for postgres.
--plan is required on create. Plan IDs differ per engine — sp-* for
Postgres, sm-* for MySQL, sr-* for Redis — and hostim regions pricing <region> --for postgres|mysql|redis lists them with their storage and price.
Postgres extensions:
Load a plain-SQL dump (pg_dump --format=plain). It goes through the project's
SSH bastion into psql. SQL errors are printed and counted but do not stop the
import, because dumps from other hosts carry a few harmless ones (event
triggers, extension owners, unknown settings). It exits non-zero only when psql
cannot run the dump at all, for example when it cannot connect. Like exec, it
offers to authorize your SSH key; -y adds it without asking.
Read the credentials into an app's environment in one step:
volumes
The plan sets the size (vol-1 is 5 GB); list plans with hostim regions pricing <region> --for volume.
Mount a volume on an app with hostim deploy <app> --volume data:/var/lib/app.
backups
hostim backups lists every database and volume with the time of its last
backup, then the schedule and the retention policy. Times are in your local
time zone. hostim backups create starts a manual backup; without a resource
it backs up the whole project. --wait polls until the run finishes and exits
non-zero if it did not succeed. hostim backups ls shows the size of the data
before compression;
the downloaded file is smaller. hostim backups ls needs
the resource name; if a database and a volume share a name, pass
--kind postgres|mysql|volume. hostim backups download --latest <resource>
skips the ID lookup and takes the newest backup. hostim backups download prepares the file
first, which can take minutes for a large backup, then downloads it. If the
transfer is interrupted, run the same command again: it resumes from the partial
<file>.part on disk. -f - writes to stdout and cannot resume.
Downloads are compressed with zstd. A database backup is a .sql.zst file
(unpack with zstd -d <file>), a volume backup a .tar.zst archive (unpack
with tar --zstd -xf <file>; it unpacks into a folder named after the volume).
templates
A template is one YAML description of a whole stack — volumes, databases, Redis
and apps — that apply creates in dependency order, waiting for each resource.
apply prints the resources it will create and asks for confirmation
(-y skips it). If any resource already exists in the target project it aborts
before creating anything, so it never overwrites a configured or scaled
resource; --skip-existing creates only what is missing.
Custom domains from the template are attached only after all resources are up:
a domain already held by another project (for example the project a template
was exported from) is reported per-domain and the rest of the apply still
succeeds — add it later with hostim domain add <domain> --app <app>.
Flags for apply:
regions
Use this to find valid --plan and --region values before creating anything.
completion
agent
The binary embeds this README, so the manual an agent reads is exactly the manual shipped with the installed version. Feed it to a coding agent before it writes Hostim commands, and the agent stops guessing flags.
For agents that load skills (Claude Code and others), the same knowledge ships
as a skill: skills/hostim/SKILL.md. Put it at
.claude/skills/hostim/SKILL.md in your repository, or let the installer do it:
That installs the CLI, writes the skill and points AGENTS.md at it.
mcp
hostim mcp speaks the Model Context Protocol on stdin/stdout, so a coding
agent can inspect and provision Hostim resources as tools. It is the same
binary, the same token and the same public API as every other command.
Read-only tools are always available: list_projects, list_apps, get_app,
get_app_status, get_app_logs, get_app_events, list_databases,
get_database_credentials, list_volumes, list_backups, list_regions,
list_templates and list_region_plans. Tools that create, change or delete
anything — projects, apps, databases, volumes, env vars, domains, backups and
backup downloads — are only registered with --allow-write. create_app can
also upload a local directory with source.type: upload, and
deploy_app_source re-uploads one for an existing upload app.
Point an MCP client at it. For Claude Desktop, in
claude_desktop_config.json:
Cursor, VS Code and other MCP clients use the same command + args shape.
Claude Desktop can also install it without the CLI: download
hostim.mcpb
from the latest release and open it. Claude Desktop asks for the token and
whether to allow changes.
Because the token comes from the same place as every other command, you can
also leave env out and rely on hostim login's saved token.
version
Template files
A template file is either one template object or a list of them. Field names match the API's JSON (camelCase). Minimal example:
A git-based app uses this source instead:
An upload-based app points at a local directory, relative to the template file:
path is a CLI-only field: apply uploads that directory and sends only the
archive hash to the API. hostim templates validate -f <file> checks names,
plans, upload paths and Dockerfiles offline, before any resource is created.
Placeholders in envVars
Two kinds of placeholder are resolved for you, so a template never has to carry a hostname or a hand-written secret.
GENERATE_ME_<n> is replaced by a fresh random secret of <n> characters when
the template is applied. It is expanded by the CLI, so the value that reaches
the API is already the real secret:
$(NAME) references another variable present in the container. These are
expanded at container start, not by the CLI, so hostim env get still shows the
literal $(...) text — that is expected, and the app sees the resolved value:
$(BUILTIN_DOMAIN)— the app's built-in hostname, without a scheme (myapp-abc123.hostim.app).$(GIT_COMMIT)and$(GIT_COMMIT_SHORT)— the full and 7-character SHA of the commit the running image was built from. Git apps only;hostim statusshows the short one.- Managed databases in the same project publish connection variables prefixed
with the database's name, upper-cased and with
-turned into_. A Postgres namedmaingives$(MAIN_POSTGRES_HOST),$(MAIN_POSTGRES_PORT),$(MAIN_POSTGRES_DATABASE),$(MAIN_POSTGRES_USER),$(MAIN_POSTGRES_PASSWORD). MySQL uses_MYSQL_with the same five fields; Redis uses$(<NAME>_REDIS_HOST),$(<NAME>_REDIS_PORT),$(<NAME>_REDIS_DB)and$(<NAME>_REDIS_PASSWORD).
Deploy from CI
GitHub Actions:
The step fails when the build fails, because deploy waits and exits non-zero.
There is also a ready-made GitHub Action at
https://github.com/hostimdev/action.
Any other CI works the same way: export HOSTIM_TOKEN and HOSTIM_PROJECT,
install the binary, run hostim deploy with -o json.
Reporting problems
If a Hostim tool, CLI command or API call returns a wrong or confusing result
that your own input did not cause, tell the user and offer to report it.
Preferred: a GitHub issue at https://github.com/hostimdev/cli/issues. Draft the
title and body, show them to the user, and open the issue with
gh issue create only after the user says yes. Otherwise the user can write to
the support chat in the console (https://console.hostim.dev) or email
[email protected]. Include the tool or command you called, what came back and
what you expected. Leave out secrets and env var values.
Development
The API client (api/client.gen.go) is generated from the live public spec
at https://api.hostim.dev/openapi.public.json — the spec is not vendored:
CI (.github/workflows/generate.yml) re-runs make generate against the live
API and fails if api/client.gen.go has drifted, keeping the committed client
in sync with the deployed API.
This README is the single source for the CLI documentation: it is embedded in
the binary and printed by hostim agent. Edit it here, nowhere else.
License
MIT. See LICENSE.
Source: README.md at commit 1769f38
Tools
0Version history
16- v0.1.56LatestNov 3, 2026
- v0.1.54Oct 29, 2026
- v0.1.52Oct 22, 2026
- v0.1.51Oct 21, 2026
- v0.1.48Oct 20, 2026
- v0.1.47Oct 19, 2026
- v0.1.46Oct 16, 2026
- v0.1.45Oct 14, 2026
- v0.1.42Oct 12, 2026
- v0.1.41Oct 11, 2026
- v0.1.40Oct 6, 2026
- v0.1.39Oct 2, 2026
- v0.1.38Sep 29, 2026
- v0.1.37Sep 27, 2026
- v0.1.36Sep 24, 2026
- v0.1.33Sep 23, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts