Nostrを使ってはてなスターみたいなサービスを作った話
はてなスターみたいに、自分のサイトにスターを付けられるサービスを作りました。
よろしければ⭐を付けていってください。
仕組み
HTMLに指定のタグを埋め込むことで任意のサイトに簡単に設置できるようにしています。
読み込むJSファイルはjsDelivrから配信してもらっています。
GitHubにpush => npmにpublish => jsDelivrで配信
みたいな流れです。
リポジトリはこちらです。
⭐のデータをやり取りする役割はNostrリレーに担ってもらっています。
Nostrについては以下の記事を参照してください。
MAKIBISHIはサイトオーナーが非Nostrユーザーでも設置できますし、サイト訪問者が非Nostrユーザーでもリアクションできる(optional)のが特徴です。
私は技術的なことには明るくないので、今回はNostrを使ってMAKIBISHIを開発した経緯についてのみ記録を残すことにします。今後もNostrを使ったサービスが増えていけば楽しいですね。
開発に至った流れ
発案
2024-07-19 にこんな会話の流れから作ろうと思い立ちました。
NIPs(Nostrの仕様)にはNostrイベントに対するリアクションを規定する仕様があります。
また、NostrイベントにURLの参照を含める仕様もあります。
これを組み合わせて、URLに対するリアクションを定義できるのでは?と考えました。
{
"kind": 7,
"content": "⭐",
"tags": [
["r", "https://example.com/"]
],
...other fields
}
実装
早速手元でイベントを発行してリレーに送信し、URLを指定してイベントをリレーから受信できることを確認しました。
できた。完成。
日本語圏のNostrユーザーの人たちにも使ってもらい、問題なく動きそうな手応えを得ました。
※実験用なので当初リレーは1つに絞って動作させました
しかしこれで本稼働させるわけにはいきません。kind 7
イベントはあくまでNostrイベントに対してのみリアクションするものとして規定されており、URLに対してリアクションするのはNIPsで認められていない使い方なので、この時点では仕様違反です。
これを認めてもらうために、NIPsに仕様を提案しなければなりません。
新仕様の提案
まずはIssueで意見を募ることにしました。
kind 7
イベントをそのまま流用するか、新kindを定義するべきか尋ねます。
staab commented
I think repurposing kind 7 with an r tag makes perfect sense. A new kind might be better though, since you might want to query these reactions without getting all the normal ones.
スターの集計等を考えた場合には、専用イベントを新設した方がよさそうです。
相談して良かった。
新しくkind 17
を新設するpull requestを作成し、新仕様を提案します。
好意的に受け取っていただけました。
vitorpamplona
Normalize the URL, like on https://datatracker.ietf.org/doc/html/rfc3986#section-6.You might also want to add guidance on fragments (can you like a section of a page?)
Also, keep in mind that there is no
startsWith
filter in Nostr, which means that if you want to get all reactions to a domain name (or path), you have to create individual tags for each.
URLのノーマライズに関して提言をいただいたので、仕様に反映します。
これで晴れてkind 17
イベントを使えることになりました。
{
"kind": 17,
"content": "⭐",
"tags": [
["r", "https://example.com/"]
],
...other fields
}
本公開
GitHub Actionsを使ってnpmにpublishするよう設定します。
npmに何かを公開するのは今回が初めてなのでドキドキです。
これでjsDelivrから配信されるようになります。
日本語圏のNostrユーザーの人たちに試していただきました。
早速不具合がいくつか見つかり、早くもversionが上がることに。
<script src="https://cdn.jsdelivr.net/npm/@nikolat/makibishi@0.1.1"></script>
とりあえず現状はこんな感じです。
まとめ
Nostrを使ってシステムを構築するメリット
責任が無い
冒頭で「……してもらっています」と繰り返し書いてある通り、私自身は何も、「運営」も「運用」もしていません。ただコードを書いてGitHubにpushしただけです。
みなさんが発行したNostrイベントは、世界中のNostrリレーにばら撒かれて、複製されたり消えていったりを繰り返していくでしょう。
かつて或る人がNostrの特徴を以て「無責任分散」と称しましたが、その呼び名が、私は好きです。
謝辞
- 仕様の相談に乗っていただいた方々
- テストにご協力いただいた方々
- MAKIBISHIを早速サイトに設置していただいた方々
ありがとうございます。
最後にMAKIBISHIを設置していただいた皆様のサイトをご紹介させていただきます。(敬称略)
@逆砂 参角
@jiftechnify
@mattn
@koteitan
@betoneto
@OrzBruford
@showV3
@mono
@stokragon
Discussion