なんか普通に、Obsidianのプラグインとサービスを作ったほうが早そうと思った。
Obsidianのプラグイン・サービスを作りたい話


なにが必要なのか

  • Web公開
    • 公開してGoogleやBingのインデックスに登録されることで、他人から発見され知識の交流が行われる。自分の知識が他人とつながることで知識が進化する。
  • 2-hop-link
    • 2-hop-linkによって、リンク構造がわかりやすくなる。より簡単に関連性を表現できる。
  • 非階層カード。水平化。
    • 知識を分けずに一箇所に集めることによって、様々な知識と反応させやすくする。
  • 長文を書く環境。Markdown。
    • 長文をかく事ができ、思考の過程を記録しやすくなる。

機能

  • Webアプリ

    • Obsidianにない
    • アプリのインストールができない環境で使いにくい
  • Web公開

    • Supernotesにない
    • 公開してGoogleやBingのインデックスに登録されないと、他人との交流が難しい
  • 2-hop-link

    • Notionにない
    • 2-hop-linkによって、リンク構造がわかりやすくなる。
  • Markdown

    • Conenseにない
    • 長文をかく事ができ、思考の過程を記録しやすくなる。
  • 非階層ノート

    • NotionやObsidianでもできるがデフォルトではない
  • リストビューとカードビュー

  • Webクリッパー

    • Pocketみたいなやつほしい
  • 公開部分と非公開部分を分ける

  • 他のカードを引用する、カードの自動分解

優先順位が低いもの

  • SEO
    • めんどくさそう
  • 更新通知とSNS機能
    • なにかしら別なSNSにアップするとかでも良い
      • Misskeyがいいのかな???
    • 公開部分が更新されたときに通知
    • タイムラインとコメント機能があれば良い。
      • フォローしている人のBoxの更新通知が受け取れる機能
      • コメント機能
    • はてブみたいに、今週クリップが多かった機能があっても良い。
    • 誰かがRefに入れたときに通知が行く機能とRefランキングと引用ランキングとかあっても良い。
  • モバイルアプリ
    • まずは、PWAで実装したい
    • PWAだと若干遅いかなと思う。
  • Webクリッパーで中身を保存するやつ
    • pocketとか、Save to Notionとか、そういうやつ
  • 音声読み上げ
    • VoiceVoxとかと連携できたら良いなと思う。
  • フラッシュカード
    • 別アプリとして作ろうと思っていた。

作るかどうか

  • OSS化
    • Supabaseとか、FirebaseとかのSaaSへの開発段階からのロックインをするかどうか。
    • 正直別にSupabaseにこだわりはないのでPostgreSQLとかでいい。
  • SNS機能のプロトコル
    • misskeyのActivityPubみたいな感じのやつ
    • セルフホストできますよというのであれば、あってもいいけど、プロトコル開発するのは現実的ではない?
    • アカウント同期APIでも良い。
    • もしくはエクスポート。
  • グラフビュー
    • 作るのがめんどくさい

    • バカ重い上にほとんど役に立たない

    • 2-hop-linkのほうが実用性が圧倒的に高い。

作らないもの

  • ローカル信仰
    • OSSにするから自前で建設してくれ

ChatGPTが出してきた技術スタック

機能技術スタック
フロントエンドNext.js,
バックエンドNode.js,
データベースMongoDB, Neo4j, PostgreSQL
Markdown対応remark, MDX
クリッパーブラウザ拡張機能 (Chrome)
SNS機能ActivityPub (Misskey参考)
認証・認可Passport
PWANext.js PWA Plugin

2-hop-linkの実装(ChatGPT案)

意外と簡単そうだった。

1. リンク管理の基本構造

  • **links**テーブル: 直接的なリンク(1-hopリンク)を記録。

    • 例: ノートA → ノートB、ノートB → ノートC
    | source_note_id | target_note_id |
    |----------------|----------------|
    | A              | B              |
    | B              | C              |
  • **two_hop_links**テーブル: 1-hopリンクを基に計算された2-hopリンクを記録。

    • 例: ノートA → ノートC(ノートA → ノートB → ノートC)
    | source_note_id | target_note_id |
    |----------------|----------------|
    | A              | C              |

2. 新規リンク追加時の処理

  • 新しいリンク(例: ノートA → ノートB)が追加されたとき:
    1. linksテーブルに1-hopリンクを追加。
    2. 1-hopリンクを辿って、2-hopリンク(ノートA → ノートC)を計算し、two_hop_linksテーブルに追加。

3. リンク参照時の処理

  • 1-hopリンク: 直接リンクされているノートを取得する。
    • 例: ノートAから直接リンクされているノートB、ノートCなど。
  • 2-hopリンク: 1-hopリンクを辿り、さらにリンクされたノートを取得する。
    • 例: ノートAからリンクされたノートBを辿り、さらにノートBからリンクされたノートCを取得。

4. 動的なリンクの計算

  • 参照時には、1-hopおよび2-hopリンクを動的に計算して取得
  • リンクの構造が常に最新の状態を反映するように更新されます。