# Postapp API 審査のないApp Library。出す口はこれだけで、画面はない。 HTMLを1枚渡せば、名前も説明もアイコンも住所も中身から決まる。 すべて JSON。文字コードは UTF-8。 ──────────────────────────────────────────────────────── 鍵を取る — 誰でも取れる。身元は聞かない ──────────────────────────────────────────────────────── GET https://postapp.win/api/keys → { "challenge": "…", "bits": 21, "how": "…" } sha256(".") の先頭が 21 ビット分ゼロになる nonce を 総当たりで探す(普通の機械で十数秒)。 POST https://postapp.win/api/keys { "challenge": "…", "nonce": "…", "name": "任意" } → { "key": "ak_…", "daily_cap": 50 } 平文はこの応答にしか出ない。1つの鍵で1日に建てられるのは 50 まで。 この計算が permissionless の担保。運営が鍵を配るだけの造りにすると、 運営が門番になる。だから鍵は買うのでも申請するのでもなく、計算で取る。 ──────────────────────────────────────────────────────── 出す ──────────────────────────────────────────────────────── POST https://postapp.win/api/put Authorization: Bearer ak_… { "html": "…" } → { "ok": true, "slug": "…", "at": "https://.postapp.win/", ← 公開URL。ここがそのままPWA "card": "https://postapp.win/a/", "source": "https://.postapp.win/source", "connects": [], ← 許可された通信先(カードにも出る) "sealed": true, ← 外に何も送れない状態か "author_key": "…" } ← この応答にしか出ない 任意で渡せるもの: url html の代わりに。取りに行って写す link_only url と一緒に true。写さず索引だけに並べる(インストールもソースも無し) name 書けば上書き。書かなければ中身から決まる tagline 同上(1行) about 同上(2〜3文) slug 同上。英小文字・数字・ハイフン。他人を名乗れる名前は拒否される category 道具 / 読む / 書く / 計算 / 遊ぶ / 学ぶ / 作る / 暮らし / からだ / その他 tags 検索の要。**探す人が打つ言葉**を8個まで(アプリ名の言い換えではなく、 困っている場面「飲み会」「寝つけない」・動詞「割り勘」「計る」・ 表記の揺れ「わりかん」と「割り勘」・英語 "timer" を混ぜる) icon_svg 自前のアイコン。渡すとPNGは焼かれず、iOSのホーム画面アイコンだけ弱くなる 中身は単一のHTML 1枚、2MBまで。複数ファイルとzipはまだ扱えない。 ──────────────────────────────────────────────────────── 直す・下げる ──────────────────────────────────────────────────────── POST https://postapp.win/api/a/ Authorization: Bearer ak_… ← 出した時の鍵 { "action": "replace", "html": "…" } { "action": "remove", "reason": "…" } 作者鍵しか無い時は body に { "key": "" } を入れる。 住所も、入れた人のホーム画面のアイコンも、差し替えでは変わらない。 差し替えるたびに通信先を読み直すので、増えた宛先はカードに出る。 取り下げには理由が要る。理由は https://postapp.win/removed に、日付と一緒に そのまま公開される。運営が下げた分も同じ場所に同じ形で載る。 ──────────────────────────────────────────────────────── 読む — 鍵は要らない ──────────────────────────────────────────────────────── GET https://postapp.win/api/search?q=<語>&sort=new|open GET https://postapp.win/export.json 全部。棚ごと持ち出せる GET https://.postapp.win/source 本体をそのまま GET https://postapp.win/api.txt この文書 ──────────────────────────────────────────────────────── MCP ──────────────────────────────────────────────────────── claude mcp add --transport http postapp https://postapp.win/mcp \ --header "Authorization: Bearer ak_…" 道具: publish_app / search_apps / remove_app Streamable HTTP の JSON-RPC。セッションは持たない。 ──────────────────────────────────────────────────────── 出す前に知っておくこと — どう配られるか ──────────────────────────────────────────────────────── * 1アプリ=1オリジン。.postapp.win に建ち、manifest と Service Worker と アイコン4枚がこちらで付く。何も書かなくてもインストールできる形になる。 * 既定で外への通信が全部落ちる。 connect-src 'self'; form-action 'none'; frame-ancestors 'none' コードの中に出てくる宛先は自動で拾って許可し、同じ宛先をカードに載せる。 許可は要らないが、嘘はつけない。 * 実行中に組み立てるURL(['exa','mple.com'].join('') のような形)は拾えない。 拾えなければ通信は落ちる。動かなくなるので、その時は差し替えて宛先を明示する。 * カメラ・マイク・現在地などは既定で全部オフ。コードから確実に読み取れた物だけ開く。 * 住所に他人の名前は使えない(paypal、apple-support など。語単位でも連結でも弾く)。 * 実際に開かれるまで棚のページは検索に載らない。外向きリンクは全部 nofollow。 ここに出しても被リンクは1つも増えない。 * 並び順 = 直近60日で開かれた日数 × 10 + 入れられた数 × 3 + √総起動数。 90日開かれなければ棚から落ちる(URLとソースは生きたまま)。 * iPhone はプログラムからインストールできない(Safariに手段が無い)。 共有 → ホーム画面に追加、の2手になる。カードにその案内が出る。 ──────────────────────────────────────────────────────── 出した物は https://.postapp.win/source で丸ごと持ち帰れる。 棚ごと https://postapp.win/export.json で持ち出せる。 自分のドメインを当てれば、ここを通さずに配れる。