
2026/03/23 18:02
**Digs:** Discogs コレクションを同期し、オフラインで閲覧できる iOS アプリです。
RSS: https://news.ycombinator.com/rss
要約▶
<|channel|>final <|constrain|>## Japanese Translation: Digsは、vinylコレクターがiOSとAndroidでオフライン閲覧のためにDiscogsコレクション全体を同期できる、無料かつ広告なしのモバイルアプリです。ディスク構造とリリースデータ(アーティスト、タイトル、年、フォーマット、サムネイル)をDrizzle ORM経由でSQLiteデータベースに取り込み、その後React Query(無限のスタレイタイム設定)で即時に読み出しを提供します。初回同期では基本情報がダウンロードされ、以降は増分同期となります。また、アプリはトラックリスト、高解像度画像、評価、動画などの完全なリリース詳細を段階的パイプラインで取得し、途中で一時停止またはキャンセルすることも可能です。
Discogs の 60 リクエスト/分制限に対応するため、Digs はトークンバケットレートリミッターを使用し、
X‑Discogs‑Ratelimit‑Remaining ヘッダーを追跡します。429 レスポンスには指数バックオフを適用します。認証は Discogs OAuth トークンを iOS キーチェーンに安全に保存して行います。
ユーザーはフォルダを閲覧したり、アーティスト/アルバム/レーベルで検索したり、ランダムリリースを選択したりできます。Wantlist やマーケットプレイス機能は含まれていません。開発は主に Claude Code によって指導され、コーディングよりもプロダクト決定が重視されました。このアプリは、Discogs のような大規模プラットフォームと共存できる軽量でプライバシー重視の音楽コレクションツールを示しています。
本文
2026‑03‑22
長年ビニールを集めてきましたが、Discogs で全てを管理しています。ですが、外出先でコレクションを閲覧するのはなかなかうまくいきませんでした。公式アプリは機能が豊富ですが、私にとってはフォルダナビゲーションやオフラインモードなど基本的な要素が不足していました。シンプルで高速、そしてオフラインで自分の棚に並べているようにレコードを掘り下げられるものが欲しかったのです。
そこで Digs を作りました。
何ができるか
あなたのコレクション全体をスマホへ同期し、オフラインで閲覧できます。Discogs 上ではすべて管理したままで、Digs は高速なモバイルコピーとしてのみ機能します。初回同期後はコレクション全体がオフライン利用可能です。フォルダ単位でのブラウズやアーティスト・アルバム・レーベル横断検索、また「ランダムピッカー」で忘れた所持品を再発見できます。以降の同期は差分のみ取得し、変更点だけをフェッチします。
このアプリは特定のユースケース向けに作られました。レコードをフォルダ化しており、通信が不安定な場所でも素早く閲覧したい人には便利です。ウィッシュリスト管理やマーケットプレイス機能、多数あるリリースバージョンの詳細検索などは対象外です。
技術的背景
- フレームワーク:React Native(Expo、TypeScript)
- データベース:SQLite + Drizzle ORM
- 認証:Discogs API の OAuth を経由し、iOS Keychain にトークンを保存
同期パイプラインは面白い構築体験でした。まずフォルダ構造を取得し、その後コレクション内の全リリース(アーティスト・タイトル・年・形式・サムネイル)をページ分割でダウンロードします。これが完了すればすべて閲覧可能です。その上で、トラックリストや高解像度画像、評価、動画など詳細情報を段階的に取得し、画像はディスクへキャッシュします。各フェーズは一時停止・キャンセルでき、全体をバックグラウンドタスクとして実行可能です。
レート制限
Discogs のレートリミットは 60 リクエスト/分です。単純に「60 を超えたら止める」方式では、同時に複数のリクエストが走っていると、58 番目で限界を検知した後も 59〜65 が既に送信されてしまいます。
そこで採用したのは トークンバケット型レートリミッター。各レスポンスの
X-Discogs-Ratelimit-Remaining ヘッダーを監視し、現在保留中のリクエスト数をカウントします。トークンが無くなると、ヘッダーから最新残量を取得するために 1 件だけリクエストし、429 が返ってきたら Retry-After ヘッダーで指数バックオフします。
ローカルファースト設計
全ての読み取りは SQLite から行います。React Query は「永続的に古い」状態(infinite stale time)を設定し、ローカル DB を真実値とみなしています。その結果、検索・フォルダ閲覧・ランダムピッカーはすべて即時応答です。
Claude Code での構築
Claude Code で全工程を行いました。思ったより時間がかかったのは「何を作るか」決める段階に多く費やしたからです。同期をキャンセル可能にするべきか?ランダムピッカーをフォルダ別にフィルタするべきか?ウィッシュリストを入れるか?編集機能は必要か?これら製品設計の決定が最も時間を要しました。コードを書いた後も、デバイスでテストしレイアウト調整やフロー再検討、App Store レビュー対策といった作業が続きます。アプリ制作は時間が必要なものです。
試してみてください
Digs は App Store で無料配信中です。広告もトラッキングもなく、Discogs のログイン以外にアカウントは不要です。ぜひお試しください。