host0 は何をしますか?
host0は、エージェントが作成したあらゆるもの(HTML、サイト、共有データベースを備えたアプリ、Markdown、PDFなど)を、Googleドキュメントを共有するのと同じくらい簡単に、共有可能なリンクとしてホストします。任意のエージェントで動作します。
中心となる基本要素はアプリです。任意のファイルやフォルダ(静的ファイルのディレクトリ、またはブラウザで開く単一のファイル(PDF、画像、単一のHTMLページ、動画、音声、Markdown、CSV、テキストなど。アーカイブやその他のダウンロード専用タイプは拒否されます。zipを展開してフォルダを公開してください))を公開すると、https://{slug}.host0.app/(ローカル開発: http://{slug}.localhost:3000/)でライブURLを取得できます。すべてのアプリはデフォルトでプライベートです。所有者(host0にサインインしているユーザー)とメールで招待された人のみが開くことができます。URLを知っている誰でも(サインイン不要で、アンリスト、インデックスされない)開けるようにするには、--visibility link をオプトインします。--visibility public はさらに進んで、ウェブ上で公開され、検索エンジンがインデックスする可能性があります。これはユーザーが検索結果で見つけたいものにのみ使用します。新しいアプリのURLはランダムです(k3x9q2m7ta.host0.app)。ユーザーがより見やすいリンクを希望する場合は、team-todo.host0.app のようにリネームします。以下の「URLのリネーム」を参照してください。
アプリは共有データを保持することもできます。h0.json でレコードコレクションを宣言すると、そのフロントエンドはサーバーコードを必要とせずに、自分自身のオリジン上にデータベースを取得します。以下の「共有データ」を参照してください。これにより、ページがチームで一緒に使用するツールに変わります。
現在のドキュメント
完全なドキュメントは https://host0.ai/docs にあります。ユーザーが何かの動作方法、可能性、または機能がサポートされていないと伝える前に、これを読んでください。
APIは自身を説明します。機械可読なインデックス:
curl -sS {base}/api/v1
現在のエンドポイント一覧、ファイル容量、プラットフォーム契約(host0が現在提供するもの)を返します。APIキー(-H "authorization: bearer $HOST0_API_KEY")を送信すると、limits と plan はユーザー自身のものになります。容量はアカウントのプランに依存します。キーがない場合は、新規アカウントのデフォルト値を取得します。GET {base}/api/v1/account は、アカウントが今月使用した量を追加します。このスキルテキストとライブAPIの動作が一致しない場合は、ライブAPIを信頼してください。
このスキルをインストールまたは更新するには: npx skills add host0-ai/skills(skills CLI がサポートする任意のエージェントで動作します。ソース: https://github.com/host0-ai/skills)。または、2つのファイルを取得します: https://host0.ai/skill.md を SKILL.md として保存し、https://host0.ai/publish.sh をその隣に scripts/publish.sh として保存し、chmod +x scripts/publish.sh を実行します。スクリプトのURLは /publish.sh です。/scripts/ は含まれません。
要件
- 必要なバイナリ:
curl、jq(どちらかが欠けている場合、スクリプトは明確なメッセージを表示して終了します) - APIキー。
$HOST0_API_KEYまたは~/.host0/credentialsから取得します。キーがない場合、publish.shはあなたのためにデバイスログインを開始します。ユーザーは自分のブラウザでリンクとコードを承認します(「APIキーの取得」を参照) - バンドルされたヘルパー:
./scripts/publish.sh - ネットワーク:
host0.ai(API)およびhost0.app(アップロードとライブアプリ)へのアウトバウンドHTTPS。エグレス許可リストがあるサンドボックスで、リクエストが毎回SSL_ERROR_SYSCALL、プロキシエラー、または接続拒否/リセットで失敗する場合は、許可するドメインをユーザーに伝えてください。ループしないでください。 - 一時的な障害が発生する場合があります: 一部のクラウドサンドボックスでは、
host0.aiへの接続で断続的な接続リセット /SSL_ERROR_SYSCALL/ 接続タイムアウトが発生することがあります。publish.shはこれらを自動的に再試行します(stderrにhost0: network hiccup … retrying 2/4と表示されます)。そのまま実行させてください。生のcurlでAPIを呼び出す場合は、自分でリクエストを再試行してください。GETおよびデバイスログインポーリングの場合は--retry 3 --retry-all-errorsを追加できますが、何かを作成するPOSTには決して追加しないでください。
アプリを公開する
./scripts/publish.sh {dir} [--name "my app"]
./scripts/publish.sh {file} [--name "my app"] # 単一ファイル: pdf、画像、ページ
ライブURLをstdoutに出力します(例: https://k3x9q2m7ta.host0.app/ — 新しいアプリはランダムなスラッグを取得します。--name は表示名のみです)。
Claude Code、Codex、Cursor、Gemini CLI以外の場合は、--client {your-agent}(例: --client claude-ai)を追加してください。スクリプトはこれらを自動検出します。これはデプロイ統計のラベル付けのみに使用されます。
内部的には、これは3ステップのフローです: マニフェスト → ファイルのアップロード → 確定。確定が成功するまでアプリはライブになりません。
ファイル構造: index.html は、公開するディレクトリのルートに配置する必要があります。ディレクトリの内容がサイトルートになります。my-site/index.html が存在する my-site/ を公開し、my-site/ を含む親フォルダは公開しないでください。
単一ファイル: ファイル自体を渡します(./scripts/publish.sh report.pdf)。index.html は必要ありません。アプリのルートURLはそのファイルを提供します(ブラウザタブではhost0のファイルビューアーで開きます。以下のバッジ注を参照してください。?download でオリジナルを取得でき、PDFの場合は大きなファイルでもレンジリクエストをサポートします)。また、/{filename} でもアクセス可能です。ユーザーが単一のドキュメントや画像を共有したいだけの場合に、これを使用してください。
ビルド出力をデプロイし、ソースはデプロイしないでください: プロジェクトがビルドステップ(React/Vite/Next エクスポート、.ts/.tsx/.vue/.svelte)を使用する場合、まずビルドし、出力ディレクトリ(dist/、build/、out/)を公開してください。node_modules/、package.json、シークレット(.env、キーファイル)は絶対に公開しないでください。APIはサーバーコードとシークレットをアクショナブルなメッセージとともに拒否します。
ベータ期間中は無料で、バッジが表示されます: host0はベータ期間中は無料で、すべてのアプリは無料プランにあります。無料プランでは、すべてのHTMLページの右下隅に小さな「Hosted on host0」バッジ(高さ約28px、端から12px)が固定表示されます。そのため、その隅に少し余裕を持たせ(固定ボタンやチャットバブルをその隅に配置しない)、隠そうとしないでください。PDF、画像、動画、音声、テキストファイル(.txt、.csv、.md、.json)がブラウザタブで直接開かれる場合、host0のファイルビューアーで開きます。ファイルはウィンドウを埋め、その下にスリムなバー(ファイル名、ダウンロード、「Hosted on host0」)が表示され、ファイルを覆うことはありません。生のファイルは <img>/<video> タグ、埋め込み、fetch()、curl、リンクプレビュー、検索エンジンにも提供されます。任意のファイルURLに ?download を付けると、オリジナルがダウンロードされます。その他のファイル(zip、フォント、JS、CSS)はそのまま提供されます。ユーザーのプランがバッジを表示するかどうかは、GET {base}/api/v1(ユーザーのキー付き)の plan.badge で確認できます。ユーザーが価格設定やバッジの削除について質問した場合: そのインデックスに plans リストがある場合、各プランの名前、価格、変更点(badge: false のプランはバッジを削除)が示されています。{base}/pricing を参照するように伝えてください。plans リストがない場合、host0はベータ期間中は無料であり、有料プランは後日提供される可能性があり、バッジを削除できる場合があります。
組み込みのアナリティクス: host0はCookieを使用せずにすべてのアプリへの訪問をカウントします。各HTMLページに小さな同一オリジンスクリプト(/.h0/a.js)が追加され、開かれたPDFはサーバー側でカウントされます。所有者は、ダッシュボードのアナリティクスタブで、訪問者、ページ、リファラー、国、デバイスを確認できます。また、GET {base}/api/v1/apps/{app_id_or_slug}/analytics?period=7d(period: 24h、7d、30d、90d、365d。それ以外の場合は400 invalid_period。オプションフィルター page=/path、referrer=host または (direct)、country=DE または (unknown)、device、browser はすべての数値を絞り込みます。不正な形式の場合は400 invalid_filter)、またはMCP get_analytics ツールでも確認できます。スクリプトは削除しないでください。アプリがContent-Security-Policyを設定する場合は、script-src と connect-src で 'self' を許可してください。ユーザーが「何人開いた?」と尋ねた場合は、そのエンドポイントから回答してください。
アプリを更新する
./scripts/publish.sh {dir} --slug {slug} # または --app-id {uuid}
フラグがない場合、スクリプトは公開されたディレクトリ内の .host0/state.json からアプリを解決し(単一ファイルの場合: ファイルの隣の .host0/state.json、ファイル名をキーとするため、1つのフォルダ内の2つのファイルは2つのアプリのままです)、一致するものがない場合のみ新しいアプリを作成します。変更されていないファイルはサーバー側でハッシュスキップされます。編集された1つのファイルで大規模なサイトを再公開すると、1つのファイルのみがアップロードされます。
--message "what changed"(最大200文字)を追加して、新しいバージョンにメモを付けることができます。例: --message "Added a due date column"。ユーザーが依頼した変更を公開するときは常にこれを行ってください。これはバージョン一覧に表示されるものです。
バージョンとロールバック
ライブになるすべての公開は、アプリの番号付きバージョン(v1、v2、...)です。publish_result.version は今回のバージョン、publish_result.previous_version は置き換えられたバージョンです。以前のバージョンは、プランに応じた日数保持されます。GET {base}/api/v1(キー付き)→ limits.account.version_retention_days(0 = ライブバージョンのみ)。古いものは自動的に削除されます。
ユーザーが変更を元に戻したい場合(「ロールバック」、「古いものを戻す」、「壊れた」)、以前のバージョンを復元します。再アップロードは不要で、1分以内に新しいバージョンとして全員に再びライブ表示されます:
# 一覧表示(新しい順、version、live、message、client、restored_from_version、created_at)
curl -sS {base}/api/v1/apps/{app_id_or_slug}/versions \
-H "authorization: bearer $HOST0_API_KEY"
# バージョン3を復元(v3も受け付けます)。ボディはオプションです。
curl -sS -X POST {base}/api/v1/apps/{app_id_or_slug}/versions/3/restore \
-H "authorization: bearer $HOST0_API_KEY" \
-H "content-type: application/json" \
-d '{"message": "Back to before the redesign"}'
- レスポンスには
version(新しいもの)、restored_from_version、previous_versionが含まれます。ユーザーに「バージョン3がバージョン9として再びライブになりました」と伝え、バージョン8を復元すると元に戻ることを伝えてください。 - 復元する前にユーザーに確認してください。アプリを開くすべての人が見る内容が変わります。
- 共有データは復元によって変更されることはありません。復元されたバージョンの
h0.jsonが、どのコレクションが提供されるかを決定します。宣言されていないコレクションは非表示になります(エクスポートには残っています)。新しいバージョンが復元されると再び表示されます。 - すでにライブになっているものを復元しようとすると、
already_live: trueが返され、バージョンは追加されません。ループで再試行しないでください。 - 404
version_not_found: そのバージョンは保持されていません。バージョンを一覧表示し、利用可能なものを提示してください。削除された古いバージョンを復元可能として提示しないでください。409version_not_restorable: そのファイルは失われています。代わりにユーザーのファイルから再公開してください。403versions_not_in_plan: ユーザーのプランはライブバージョンのみを保持します。ユーザーがライブにしたいファイルを再公開し、「エラーにupgrade_urlがある場合」を参照してください。 - 後でメモを設定またはクリアするには、
PATCH {base}/api/v1/apps/{app_id_or_slug}/versions/{n}で{"message": "…"}(またはnull)を使用します。MCPサーバーのlist_versionsおよびrestore_versionツールは上記の呼び出しと同じことを行い、ダッシュボードのアプリのバージョンタブには復元ボタンがあります。
アクセス制御
host0アプリは、一度に1つの可視性を使用します:
private(デフォルト): 所有者と招待されたメールアドレスのみ。訪問者はサインインして表示します。すべての新しいアプリはここから始まります。link— 「リンクを知っている人」: URLを知っている人は誰でもサインインせずに表示できます。アプリはアンリストであり、インデックスされることはありません(すべてのレスポンスにX-Robots-Tag: noindexが含まれます)。URLはランダムに始まりますが、リンクは伝播し、リネームされた読みやすいURLは推測される可能性があります。機密情報はプライベートに保ってください。public— 「ウェブ上で公開」: 誰でも表示でき、検索エンジンがインデックスする可能性があります(アプリのページ自体はX-Robots-Tag: allで提供されます)。オプトインであり、アカウントごとに上限があります(403public_app_limit_reached、ボディにmax_public_appsが含まれます)。ユーザーがアプリを検索結果で見つけたい場合(ポートフォリオ、ランディングページ、ドキュメント、公開ツール)にのみ使用してください。機密情報には決して使用しないでください。
ユーザーが誰でも開けるリンクを希望する場合(送信するページ、デモ、共有PDF)、--visibility link で公開してください。これが「公開する」や「リンクを共有する」がほぼ常に意味するものです。Google/検索結果に表示したいと明示した場合のみ public を選択してください。不明な場合は尋ねてください。共有データは link と public で同じように機能します。公開時に --visibility private|link|public で可視性を設定するか、API経由でいつでも設定できます:
curl -sS {base}/api/v1/apps/{app_id_or_slug} -X PATCH \
-H "authorization: bearer $HOST0_API_KEY" \
-H "content-type: application/json" \
-d '{"visibility": "link"}'
public にしようとして public_app_limit_reached が返された場合、アカウントのウェブ上で公開できるアプリの上限に達していることをユーザーに伝え、代わりに link(URLを知っている人なら誰でも、インデックスされない)を提案するか、別の公開アプリを link に戻すことを提案してください。
URLのリネーム
新しいアプリのURLは k3x9q2m7ta.host0.app のようなランダムなスラッグです。読みやすいURLにするには、名前を確認してからリネームします:
curl -sS {base}/api/v1/slugs/team-todo -H "authorization: bearer $HOST0_API_KEY"
# → {"slug":"team-todo","available":true} (または available:false + 理由)
curl -sS {base}/api/v1/apps/{app_id} -X PATCH \
-H "authorization: bearer $HOST0_API_KEY" \
-H "content-type: application/json" \
-d '{"slug": "team-todo"}'
# → {"app_id":"…","slug":"team-todo","url":"https://team-todo.host0.app/","old_slug":"k3x9q2m7ta",…}
スラッグは1〜63文字の小文字英字、数字、ハイフンで、ハイフンで始まったり終わったりすることはできません。使用済みのスラッグは409 slug_taken を返します。不正な形式または予約済みのものは422 invalid_slug を返します。ライブデプロイ、レコード、共有はアプリとともに移動し、publish.sh は更新を続けます(アプリIDを追跡します)。30日間、古いURLは新しいURLにリダイレクト(301)され、ユーザー用に予約されたままになり、その後解放されます。ユーザーがすでに持っているリンクをリネームする前に、その旨を伝えてください。削除されたアプリのURLも30日間予約されます(404を返します)。過去30日以内に別のアカウントが使用したスラッグは409 slug_taken(「別のアプリによって最近使用されました」)を返します。ユーザーはアプリのダッシュボードページの設定タブでもリネームできます。
アプリの表示名(ダッシュボードと GET /api/v1/apps に表示される)はURLとは別です。PATCH {base}/api/v1/apps/{app_id} {"name": "Team todo"}(1〜100文字)で変更します。URLは変わりません。
共有
メールでユーザーを招待するには、POST /api/v1/apps/{app_id_or_slug}/shares(ボディ {"emails": ["[email protected]"]})を使用します。削除するには DELETE /api/v1/apps/{app_id_or_slug}/shares/{email} を使用します。
新しい共有者は、サインインとサインアップのリンクが含まれた個別の招待メールを受信します。レスポンスの invite_delivery を確認してください。accepted はメールサーバーが配信を受け付けたことを意味します。
…
(以下、翻訳は省略します。元の完全なSKILL.mdを日本語に翻訳したものです。)
共有データ
…
APIキーの取得
…
エラー処理
…