目次
問題
Slack に貼った記事は流れていく。Pocket に入れた記事は開かれない。チームで調べものをしていると「あの記事、誰か読んだ?」「前に見た資料、どこだっけ」が毎週起きる。個人の「あとで読む」は、保存した瞬間に役目を終えている。
LaterHub は、保存したリンクを個人のものからチームの共有物にして、読まれたかが見え、後から引き直せるようにするサービスだ。
できること

- 保存。Web、Chrome 拡張、iOS / Android アプリ、OS の共有シートから。「後で読む」と「後で見る」に分け、未確認・確認中・完了といったステータスを持つ
- 共有。プロジェクトや勉強会の単位でグループを作り、同じアイテムに対してメンバーごとの確認状況が見える。コメントとリアクション、共有やコメントのリアルタイム通知
- 要約。保存した瞬間に、短い要約・要点・タグ候補を AI が作る。開く前に取捨選択できる
- 検索。「たしか AI エージェントの記事……」のような曖昧な記憶からでも、キーワードと意味の両方で引ける

構成
Bun workspaces のモノレポにした。
| 場所 | 中身 |
|---|---|
apps/web |
Next.js(App Router)。Serwist で PWA |
apps/extension |
WXT のブラウザ拡張 |
apps/mobile |
Expo(React Native) |
packages/db |
Drizzle ORM のスキーマとマイグレーション |
packages/shared |
プランの上限、URL 正規化、AI のプロンプトと出力スキーマ |
バックエンドは Supabase。Postgres に pgvector を足し、全テーブルに RLS。Supabase Branching で Git の main / develop をそのまま本番 / プレビューの DB に対応させている。要約は Vercel AI SDK から Claude Haiku を呼び、埋め込みは OpenAI の text-embedding-3-small。保存後のメタデータ取得、要約、埋め込みの連鎖は Vercel Workflow に載せ、途中で落ちても続きから再開できるようにした。シークレットは Infisical に寄せて Vercel に同期している。
決めたこと
認可を二重に持つ。 サーバー側の Drizzle は postgres ロールで接続するので RLS を素通りする。だからアプリの認可は Server Actions の中に書き、RLS は supabase-js や Data API 経由のアクセスを守る層として置いた。どちらか一方に頼ると、もう一方の経路が抜け穴になる。
URL は保存前に正規化する。 同じ記事が UTM パラメータ違いで 2 件になるのは、チーム共有では致命的だ。正規化のルールは packages/shared に置き、Web も拡張もモバイルも同じ関数を通す。
AI の出力はスキーマで縛る。 要約・要点・タグは zod のスキーマで構造化出力として受け、壊れていればリトライする。自由文で受けて正規表現で切り出す、はやめた。
プランの上限は 1 か所。 無料と Pro の保存件数やグループ数の上限も packages/shared にあり、3 つのクライアントが同じ値を読む。
後回しにしたこと
- 「後で読む」と「後で見る」の種別は、いまは保存時に手で選ぶ。YouTube や Vimeo の URL なら「後で見る」、本文が抽出できるページなら「後で読む」、PDF は「後で読む」を初期値に、という自動判定は仕様にあるが後回しにした
- 保存範囲は「自分のみ」「特定グループ」「所属組織全体」の 3 つから始めた。公開リンクを知っている人への共有は仕様上の候補のまま
- 同じ共有アイテムでも、確認状況はメンバーごとに別に持つ。ここだけは最初から外さなかった。「誰が読んだか」が見えないと、チームで共有する意味がなくなる
今
オープンベータで、全機能を無料で使える。Pocket の代わりを探していて、チームで共有・ナレッジ化までしたい人に向けて作っている。laterhub.app
RELATED
Flutter / AWS / 自宅サーバー。個人開発と OSS をいくつか。設計相談や協業の話は X の DM か About から。 About