pipic CLI · AI ネイティブ

コマンド一つで画像を圧縮。

ウェブ版と同じエンジンを、ターミナル・ビルド・エージェントの中へ。Node 20 以降が必要で、テレメトリはなく、画像は圧縮が終わった瞬間に削除されます。

100枚 / 月(無料)
5,000枚(Pro)
Claude CodeCodexCursor+70

エージェントに入れてもらう

この一文を Claude Code・Codex などお使いのコーディングエージェントに送るだけ —— このドキュメントを読んで自分でセットアップします。

このドキュメントを見て pipic CLI をインストールして、終わったらサインインの方法を教えて:https://pipic.cc/cli

なぜ CLI か

エージェント向けの出力

NDJSON と安定した終了コード。エージェントがそのまま分岐できます —— 推測が必要な自然文ではありません。

フォルダ丸ごと、コマンド一つ

その場で置き換えるか、新しいディレクトリへ —— ローカルのバッチもビルド成果物も同じです。

サインインは一度だけ

以降はスクリプトも CI(PIPIC_TOKEN 経由)もエージェントも無人で動き、再承認は不要です。

既定で安全

--replace か -o を明示しない限り何も触りません。書き込みはアトミックで、小さくならないファイルはそのまま残します。

クイックスタート

エージェント · まず skill を入れる

skill を一度入れれば、エージェントが自分で pipic を見つけます —— ツール名を挙げる必要も、オプションを繰り返す必要もありません。

1

CLI をインストール

Node 20 以降
$ npm i -g @pipic/cli
グローバルに入れたくない場合は npx @pipic/cli <paths…> でも同じように動きます。
2

skill をインストール

Claude Code・Codex・Cursor ほか 70 種類以上
$ npx skills add PiPic-cc/pipic-cli -g
npx skills add PiPic-cc/pipic-cli -g -a claude-code -a codex -a cursor -y
オプションなしで実行するとどのエージェントに入れるか尋ねられます。上のオプションを付けるとその確認を省略できます。更新は npx skills update です。
3

サインインを承認

1台につき1回
$ pipic login
Opening your browser…
✓ Signed in as you@example.com
最初の依頼時に、エージェントが pipic login を案内します —— ブラウザのリンク、ヘッドレス環境ならデバイスコードです。エージェントが代わりにサインインすることはなく、保存された資格情報は以降のすべての実行に使われます。
4

あとは頼むだけ

ツール名もオプションも不要
「./assets の画像を圧縮して。」
「このスクリーンショット、重いからその場で小さくして。」
「ビルド前に public/ を全部最適化して。」
skill がエージェントに教えること
  • pipic login は自分で実行しない —— 承認はユーザーに任せる。
  • skipped は失敗ではない —— 「すでに十分小さい」などの理由が付いている。
  • 一部失敗したら、失敗したファイルだけ再実行する —— 全部やり直すと枠を二重に消費する。
skill 非対応なら貼り付けで

一度きりの作業や、skill に対応していないエージェント向け —— コマンドをそのまま渡してください。契約の全文は次のセクションにあります:

Use the pipic CLI to compress the images in ./assets, replacing them in place:

  pipic ./assets --replace --json

Run `pipic -h` for more.
契約の全文を見る →

エージェントが ~/.config を参照できないコンテナやサンドボックスで動いていますか?アカウントページでトークンを作成し、その環境で PIPIC_TOKEN を設定してください。

自分で実行する

人 · スクリプト · CI

インストール

Node 20 以降
$ npm i -g @pipic/cli
$ pipic login
Opening your browser…
✓ Signed in as you@example.com
グローバルに一度入れ、ブラウザで一度承認するだけ —— 以降はどのシェルで実行してもサインイン済みです。

何もインストールしない

npx
npx @pipic/cli ./assets --replace
グローバルインストールなしでも動きます —— ただし一度きりの pipic login は必要です。

ブラウザなし —— SSH・コンテナ

device code
$ pipic login --no-browser
Open https://pipic.cc/cli/authorize
Enter this code: PXBQ-GTZM
Expires in 10 minutes · waiting…
ヘッドレス環境では自動的にデバイスコード方式に切り替わります —— 別の端末から承認できます。

CI とサンドボックス

PIPIC_TOKEN
export PIPIC_TOKEN=pipic_xxx
資格情報ファイルより優先されます。トークンの作成と失効はアカウントページで行い、CLI が発行することはありません。

コマンド

pipic <パス…>ファイルまたはディレクトリを圧縮します。これがデフォルトのコマンドです。
pipic login [--no-browser]ブラウザまたはデバイスコードでこのマシンを認証します。
pipic logoutサインアウトし、このマシンのトークンを失効させます。
pipic whoamiサインイン中のアカウントとプランを表示します。
pipic quota今月の残り利用枠を表示します。
pipic token listトークンをプレフィックスと最終利用日時つきで一覧表示します。
pipic token createウェブサイトで作成するためのリンクを表示します —— セキュリティ上、トークンの作成は必ずウェブ上で行い、CLI 自体では作成しません。
pipic token revoke <id>自分のトークンを失効させます。通常 1 分程度で反映されます。

login・logout・whoami・quota・token は、パスとして扱われる前にサブコマンドとして優先的にマッチします。同じ名前のフォルダを圧縮したい場合は ./login や login/ のように書いてください —— パス区切りを含む形であれば圧縮コマンドとして扱われます。

圧縮オプション

--replace

元の画像をその場で上書きします —— アトミックな置き換え、権限を維持、シンボリックリンクを解決。

-o, --out <dir>

結果をこのディレクトリに書き出します。

--json

ファイルごとに 1 行の NDJSON を出力します —— スクリプトやエージェント向け。

--concurrency <n>

並列アップロード数。デフォルトは 4。

--replace か -o のどちらか一方を必ず指定してください —— 両者は排他的で、どちらもデフォルトではありません。どちらも指定しない場合、pipic は用法エラー(終了コード 2)で終了します。

知っておきたいこと

  • 結果が実際に小さくなった場合のみ書き戻します —— すでに最適化済みの画像はスキップされ、理由が表示されます。-o の場合は元の画像がそのままコピーされるため、出力ディレクトリは常に完全な一式になります。
  • --replace は一時ファイルに書き込んでからリネームするため、Ctrl-C で中断しても中途半端なファイルが残りません。
  • 8 MB を超えるファイルは明確な理由つきでスキップされ、黙って捨てられることはありません。
  • JPG・PNG・WebP・AVIF に対応。テレメトリは一切送信されません。
  • -o では、別々のサブフォルダにある同名ファイル同士が衝突します。pipic はどちらを残すか推測せず、両方をエラーとして報告します。

JSON 出力コントラクト

--json はファイルごとに 1 行、固定 6 フィールドの JSON オブジェクトを出力します:

$ pipic ./assets --json --replace
{"file":"/p/hero.png","status":"ok","before":2411233,"after":486201,"saved":1925032}
{"file":"/p/notes.txt","status":"skipped","before":0,"after":0,"saved":0,"error":"unsupported file type"}
file渡したパスがそのまま入ります。
status"ok"・"skipped"・"error" のいずれか —— それ以外の値は取りません。
before元のサイズ(バイト)。
after圧縮後のサイズ(バイト)—— skipped/error 行では 0。
saved節約したバイト数(before から after を引いた値)—— 割合ではありません。
errorskipped と error の行にのみ存在 —— コードではなく、人が読める理由です。

終了コード

0すべて成功
1一部失敗
2用法エラー
3サインインが必要
4利用枠を使い切った

これは安定した契約です:スクリプトやエージェントは status と終了コードで分岐してください —— error の文字列内容で判定してはいけません。

HTTP API

Node が使えない環境でも、同じ圧縮エンジンを HTTP で直接呼び出せます —— 1 リクエストにつき画像 1 枚、SDK も multipart フォームも不要です。

POSThttps://pipic.cc/compress/image
リクエスト
AuthorizationBearer <token> —— すべてのリクエストで必須。
Content-Typeimage/png、image/jpeg、image/webp、image/avif のいずれか —— 必須。実際に送るバイト列と一致させてください。
X-Original-Name任意。先に URL エンコードしてください —— レスポンスには encodeURIComponent で使える文字だけがそのまま返ります。
Body画像の生バイナリ。multipart/form-data ではありません。1 リクエストにつき画像 1 枚、最大 8MB。
$ curl -X POST https://pipic.cc/compress/image \
  -H "Authorization: Bearer $PIPIC_TOKEN" \
  -H "Content-Type: image/png" \
  --data-binary @photo.png \
  -o photo-compressed.png
200 OK · same format in, same format out

レスポンス

200 OK のレスポンスボディは圧縮済み画像そのもの —— 入力と同じ形式で返ります。Content-Type は圧縮後の形式を示し、取得できれば Content-Length と X-Original-Name も付きます。

トークンを取得

API は CLI と同じ Personal Access Token を使います。GitHub または Google でサインインし、アカウントページで発行してください —— 平文のトークンはその場限りしか表示されないので、安全な場所に保存してください。

トークンを作成

エラー

200 以外のレスポンスはすべてこの形の JSON エラーを返します。判定は message の文字列ではなく code フィールドで行ってください —— 実例はこちら:

{"success":false,"code":"MONTHLY_QUOTA_EXCEEDED","message":"Monthly compression quota reached, try again next month"}
400INVALID_TYPE —— Content-Type が未指定、または画像タイプでない/NO_FILE —— リクエストボディが空
401UNAUTHORIZED、TOKEN_EXPIRED、TOKEN_REVOKED —— 再サインイン、または新しいトークンを作成
413FILE_TOO_LARGE —— 8MB 超過
415UNSUPPORTED_TYPE —— 圧縮対象外の image/* タイプ(対応は PNG・JPEG・WebP・AVIF のみ)
429RATE_LIMITED(Retry-After ヘッダーを参照)または MONTHLY_QUOTA_EXCEEDED —— 今月の利用枠を使い切った
502UPSTREAM_ERROR —— 圧縮バックエンドがこの画像を拒否しました。同じバイト列を再送しても結果は変わりません。この試行は割り当てに払い戻されます
503UPSTREAM_ERROR または ALL_KEYS_EXHAUSTED —— 一時的に容量が不足しています。バックオフして再試行できます。この試行は割り当てに払い戻されます

知っておきたいこと

  • リクエストは圧縮処理に受け付けられた時点で利用枠を 1 消費します —— そのあと 400・413・415 で失敗した場合も同様です。その前に拒否されたリクエストは消費しません:あらゆる 401、429 RATE_LIMITED、および宣言された Content-Length ヘッダーだけを理由に拒否されたファイルです。こちら側の問題(502/503)で失敗した場合は、その分は自動的に返却されます。

すべてのヘッダーとエラーコードを機械可読な 1 ファイルで確認するには: /openapi.json

よくある質問

エージェントが指示していないファイルを触ることはありますか?

ありません —— pipic は --replace か -o <dir> の明示指定を必須とし、どちらもなければ実行を拒否します。そのエラーを報告する前に、リクエストが送信されることも一切ありません。

一度サインインすれば、エージェントはずっと使い続けられますか?

はい。認証情報はこのマシンの ~/.config/pipic/config.json に保存されており、あなたとして動くどのツールも読み取れます —— エージェントごとに追加の承認は不要です。

エージェントが「サインインしていません」と言ってきたら?

多くの場合、~/.config が見えないコンテナやサンドボックスで動いています。アカウントページでトークンを作成し、その環境の PIPIC_TOKEN として設定してください。

無料の利用枠を使い切るとどうなりますか?

pipic は終了コード 4 で終了し、自動的に課金されることはありません。Free は月 100 枚、Pro なら月 5,000 枚まで増えます。

画像はどこかに保存されますか?

いいえ —— 圧縮が完了した瞬間にサーバーから削除され、長期的に保存されることはありません。

月に100枚まで無料で圧縮できます。

カード登録なし、テレメトリなし。ブラウザ版は引き続き無制限です。

サインインしてトークンを取得