リポジトリとは

Clink は公開GitHubリポジトリからパックを読みます。名前で追加すると、Clink が最新リリースを読み、すべてのファイルを検証してから導入します。何もアップロードされず、あなたのものがサーバーで動くこともありません。

owner/repository、github.com/owner/repository、または完全な HTTPS URL を入力してください。Clink は、何かをダウンロードする前にすべてのリリースマニフェストとファイルを検証します。

種類を選ぶ

パックの種類ごとに、拡張子もマニフェスト内のコレクション名も別々で、Clink はそれぞれに別の容量上限をかけます。公開する行を決めたら、その行のとおりに揃えてください。テーマをパネルの下に置いても、単に読まれません。

種類ファイルコレクション最大ファイルサイズ(バイト)公式リポジトリ
テーマ.clinkthemethemes128,000anti-ltd/clink-themes
レイアウト.clinklayoutlayouts512,000anti-ltd/clink-layouts
プロファイル.clinkprofileprofiles256,000anti-ltd/clink-profiles
サウンド.clinkpacksounds512,000anti-ltd/clink-sounds
フォント.otf .ttffonts32,000,000anti-ltd/clink-fonts
パネル.clinkpanelpanels50,000anti-ltd/clink-panels
アクション.clinkextactions48,000anti-ltd/clink-actions
プラグイン.clinkpluginplugins66,000anti-ltd/clink-plugins

言語パックだけは別物です。あちらのパックは1つの書類ではなく、辞書とモデルのファイル一式で、公式リポジトリにはそれを作るツール一式が入っています。このページではなく、あちらの README から始めてください。

公式リポジトリから始める

いちばん速いのはフォークです。パック用のフォルダ、マニフェスト生成、リリース用ワークフローが最初からつながった状態で手に入り、写して使える実例も付いてきます。

# Everything a repository needs is already wired together in the official one.
gh repo fork anti-ltd/clink-panels --clone
cd clink-panels

# Your packs replace the examples. Keep tools/ and .github/.
rm Panels/*.clinkpanel
cp ~/Downloads/my-panel.clinkpanel Panels/kaomoji-plus.clinkpanel

tools/ と .github/workflows/ は残してください。プッシュを Clink が読めるリリースに変えているのはこの2つで、これがないフォークは何も公開しません。

または3つのファイルで作る

リポジトリに特別なところはありません。パックを入れるフォルダ、マニフェストを書くスクリプト、リリースを切るワークフローがあれば足ります。

my-panels/
├── Panels/
   └── kaomoji.clinkpanel        # one file per pack, the name is the id
├── tools/
   └── build-manifest.py         # writes manifest.json from that folder
└── .github/workflows/
    └── release.yml               # turns a push into a release

ワークフローがやることは3つです。マニフェストを作り直し、前のリリースを消し、latest というタグで新しいリリースを公開して、パックのファイルとマニフェストを添付します。これで全部です。

name: Release panels
on:
  push:
    branches: [main]
    paths: ["Panels/**", "tools/**", ".github/workflows/release.yml"]
permissions: { contents: write }
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: python3 tools/build-manifest.py
      - run: gh release delete latest --yes || true
        env: { GH_TOKEN: "${{ github.token }}" }
      - run: gh release create latest Panels/*.clinkpanel manifest.json --title "Latest panels" --latest
        env: { GH_TOKEN: "${{ github.token }}" }
.github/workflows/release.yml

生成スクリプトはフォルダをたどり、ファイル1つにつき1項目を書き出します。ハッシュとバイト数はここからしか出てこないので、手作業ではなくワークフローの中で走らせます。

#!/usr/bin/env python3
import hashlib, json, os, pathlib

root = pathlib.Path(__file__).resolve().parents[1]
repository = os.environ.get("GITHUB_REPOSITORY", "<owner>/<repository>")
packs = []
for path in sorted((root / "Panels").glob("*.clinkpanel")):
    data = path.read_bytes()
    pack = json.loads(data)
    packs.append({
        "id": path.stem,
        "name": pack["name"],
        "version": "latest",
        "asset": {
            "path": path.name,
            "url": f"https://github.com/{repository}/releases/download/latest/{path.name}",
            "sha256": hashlib.sha256(data).hexdigest(),
            "byteCount": len(data),
        },
    })
(root / "manifest.json").write_text(json.dumps({"version": "latest", "panels": packs}, indent=2))
tools/build-manifest.py。別の種類なら、フォルダ、拡張子、コレクション名を選んだ行に合わせて変えてください。

マニフェスト

各リリースはパックのファイルと並べて manifest.json を公開し、Clink は最新リリースの https://github.com/<owner>/<repository>/releases/latest/download/manifest.json から読み込みます。各項目にはファイル名、同じリリース内での場所、SHA-256ハッシュ、正確なバイト数が書かれています。

{
  "version": "latest",
  "panels": [
    {
      "id": "kaomoji",
      "name": "Kaomoji",
      "version": "latest",
      "asset": {
        "path": "kaomoji.clinkpanel",
        "url": "https://github.com/<owner>/<repository>/releases/download/latest/kaomoji.clinkpanel",
        "sha256": "8f14e45fce…",
        "byteCount": 2048
      }
    }
  ]
}
パネル用リポジトリのマニフェストから、1項目。

コレクション名は種類と一致している必要があります。パネルは panels、テーマは themes、以下、上の表のとおりです。

公開する前に試す

リポジトリのパックは、手元で開けるファイルと同じものです。まずは近道で試してください。AirDrop で自分の端末に送るか、ファイルアプリに置いて Clink で開きます。そのあとで、スクリプトが書いたマニフェストを確認します。

python3 tools/build-manifest.py
cat manifest.json
  1. 生成スクリプトを走らせます。そのときフォルダに入っているものから manifest.json を書き直します。
  2. 書かれた内容を読みます。どの項目も、実在するファイルと、それに合ったバイト数を指しているはずです。
  3. パックのファイル自体を Clink で開いて使ってみます。パネルやアクションはそれぞれのエディタに入り、その場で実行できます。

公開する

git add Panels manifest.json
git commit -m "Add my first panel"
git push

main にプッシュすれば、あとはワークフローが引き取ります。latest リリースに付け足すのではなく差し替えるので、いつでも最新のプッシュが相手に届くものになります。

リポジトリがリリースを公開した後に、このタブを開いてください。

Clink に追加する

  1. 「一般」から「リポジトリ」を開き、owner/repository を追加します。
  2. 自分の種類のタブを開き、引っぱって更新します。マニフェストで付けた名前でパックが並びます。
  3. どれかをタップして取得します。Clink が検証し、ほかのパックと同じように導入します。

データパック(テーマ、配列、プロファイル、サウンド、フォント、言語)はリポジトリを追加するだけで十分です。パネル、アクション、プラグインはロジックを含むので、Clink がそれらをインストールする前にリポジトリごとの専用スイッチが必要で、アプリは最初に確認します。

パネルには、制限付きのインタラクティブロジックが含まれます。信頼できるリポジトリだけを許可してください。

Clinkが確認すること

  1. アドレスが github.com 上のHTTPSで、追加したリポジトリのリリース配下にあること。
  2. ダウンロードがマニフェストのバイト数と完全に一致し、64 文字のSHA-256ハッシュが合うこと。
  3. ファイルの拡張子が正しく、名乗っている種類のパックとして読み解けること。
  4. パネル、アクション、プラグインは保存される前にソースポリシーの検査を通過します。

ダウンロードが拒否されるのは、次の5つのどれかです。アプリ側のメッセージはあえて短くしてあるので、上から順に確かめてください。

確認項目拒否される条件
github.comアドレスが github.com の HTTPS ではない、または追加したリポジトリのリリース配下にありません。マニフェストは別の場所を指せません。自分の別のリポジトリでも同じです。
byteCountファイルの大きさがマニフェストの申告と一致しないか、その種類の上限を超えています。編集のたびにマニフェストを作り直せば、たいていは解決します。
sha256ハッシュが中身と合いません。多くは、ファイルを最後に変更する前にマニフェストを書いてしまった場合です。
pathファイル名がその種類の求める拡張子で終わっていないか、ドット2つでリリースの外へ出ようとしています。
sourceパネル、アクション、プラグインがソースポリシーを通過しませんでした。長すぎるか、ポリシーが拒否する断片を含んでいます。

更新と、取り下げ

IDは拡張子を除いたファイル名で、更新を更新たらしめているのがこれです。名前を保てば、新しいリリースが相手の手元にあるものを置き換えます。名前を変えれば、1つ目の隣に2つ目のパックを公開したことになります。

リポジトリからパックを外すと、新しいダウンロードは止まります。すでに入っている端末には届かないので、まずいリリースは削除ではなく差し替えで対応してください。

公式リポジトリ

どれかをフォークすれば始められます。どのリポジトリも自分でマニフェストを作り、GitHub Actions で自分を公開します。

App Storeでダウンロード