タスク


全体

  • エンジニアを集めるための資料を作りたい。
  • 機能リストを作って、優先順位を作る。
    • ver0.1.0ラインを作る
  • ドキュメント環境
    • これ、ドキュメントもSazanamiで書いてSazanamiで公開したいよね。
    • 最低限の機能を急いで
  • ランディングページ
    • これいまは優先順位低いかもしれない。資料をスライドシェアとかでいいかも。
  • ライセンス体系

デザイン

デザインは自分でやりたいなと思う。パッシブに探すけど。

  • Ver.0.1.0ライン
  • Ver1.0.0ライン
  • ロゴ・アイコン
  • ランディングページ

エンジニアリング

先にデプロイ

  • 環境構築
    • Tursoの準備。
    • SvelteKitのローカルリポジトリをつくる
    • Ver0.0.1
    • サーバーサイドの処理とかがうまく動くかのテスト用のコードを書く。
      • Tursoの疎通だけ確認できれば、同期はここでチェックしなくてもいい。
    • GitHubにデプロイする。
    • Cloudflareに自動的にデプロイできるようにする。
  • ver0.0.2をつくる。
    • DaisyUIいれる
    • PWA
      • アイコンとか用意しないといけないよね…
      • マニュフェストを書く
    • サービスワーカー
    • データベースを仮でつくる
    • Tursoの同期テスト
      • オフラインで動くかどうかのテスト
      • オンラインに戻ったときに同期できるか
      • コンフリクト対策は?
  • ver0.1.0をつくる。Markdown版のScrapbox(お一人様用)
    • milkdownの整形
    • カードビューのコンポーネントをつくる

Ver.0.1.0ライン

おひとり様Scrapboxを作る。

つくるもの

  • Markdown
  • PWA
  • カードビュー
  • Link, 2-hop-link解析
  • 検索
  • 埋め込み
    • 画像
    • 引用埋め込み
  • オフライン動作
  • 公開機能?
    • これ認証作らないと公開機能実装できなくない?
  • Markdownファイル一括インポート
  • タグ

この時点でつくらないもの

  • 認証?
  • 共同編集
  • YouTubeなどの埋め込み
  • テーマ、UserCSS
  • VectorStore

Scrapboxのコア機能

  • カードビュー
  • Link
  • 2Hop-link
  • 公開
  • 検索
  • 埋め込み
    • 画像貼り付け機能

追加したい機能

  • インポート
  • 引用埋め込み


どのタイミングでコーディングし始めるか?どのくらいまでデザインを詰めるか
→ コーディングはわたし以外の人がやるかもしれないんで、デザインと機能をガッツリ決めてからにしたい。

↑ ふわっとしすぎてる。どこまでかわからない。
Version 1.0.0に入れる機能を決める必要がある。
あと将来に機能を拡張できるスペースをデザインとして確保しておきたい。

Version 1.0.0ライン(嘘)

  • UIは日本語だけ
  • セルフホストオンリー
    • 暗号化なし
  • パブリックモードのみ
  • インポート
    • エクスポートはいらないかな
  • 検索は実装する
  • タグとリンクの実装
  • タグページ
  • 2-hop-linkの表示

コンセプト

「必要十分条件」
必要なものが揃っていて、余計なものがない。

「みんなが使える」

「多言語対応」

日本語・英語だけじゃなくて、
いろんな言語に対応したUIとマニュアルを作りたい。

名前 sazanami

他にはStratumとかが案としてはあった
誰かアイコン作ってほしい

アイコン、一回適当に作って、だれかに依頼するのが良さそう。
Sazanami (仮)

価格など

Sazanamiの料金プラン


デザイン

マテリアルアイコンを使うと工業感が出ちゃう

フォントはLINE SEED使おうかなと思っていたけど、国際化するのであれば、
Noto Sansが一番いいかなと思った。

ヘッダーメニュー

  • ハンバーガー
  • 検索
  • 探索
  • タグ
  • コミュニティ?

ハンバーガー

  • 設定
  • Publicモード

カード選択画面・編集画面
カード風の表示にしておくか、Obsidianみたいに全画面にするか


機能

コア

  • Markdown
    • エンべデット表示
      • エンべデットを展開してMDでコピーできる機能
      • これガチで必須
  • 水平化
    • 全てがひとつのディレクトリに。
    • 階層分けしてない。
  • 同期とオフライン利用
  • リンクとタグ
    • たぶん分ける。
    • リンクを使う場面とタグを使う場面は違うと思う。
  • インポート/エクスポート
    • MDのインポート
      • 将来的にはCosense方式のインポートとエクスポートもできるようにしたい(エクスポートが難しそう…)
    • 一本化エクスポート
      • 選択したやつをひとつのMDにまとめてエクスポートするやつ。
      • AIが読みやすいように。
      • ワンちゃん文書作成にも向いてるかも?
  • 公開
  • 検索
  • 共同編集

サブ

  • Keep機能とアーカイブ
    • Obsidianで言うとThinoみたいなやつ
  • Public/Private
    • Public(配信)モード
      • 検索のサジェストとかにもプライベートのものが出ないようにする。完全にPublicのものだけが表示されるモード
    • PublicとPrivateを同時に表示できるモードが必要
    • E2E
    • 鍵垢?承認制閲覧スペース?
  • ランダム/SRS
  • コミュニティ機能
    • フォロー
    • 鍵垢
  • プロフィール機能
  • Webクリップとインターネットアーカイブ
    • なんかのAPIでもいい。
  • Sazanami BGM

メール関連機能…

  • アカウント登録
  • パスワード初期化
    と思ったけど、メールでのアカウント登録なしでもいい気もする。

複数アカウント使えるようにする?

プラグイン?

暗号化
Privateスペースがあるのであれば、暗号化があってもいいかもしれない。(優先順位低い、他力本願)

backup

LLM関連機能

かなり注意して実装したい。
疲れずにAIが使えるようにしたい。
修正作業が少ないようにしたい

「関連メモ検索」「インデックス作成」とかが限界な気もする。

もはや、API公開しておいて各自で作ってっていうのでもいいかも。
S3プッシュ機能でもいい。(or Google Drive)

いらないもの

  • グラフビュー
    • プルリク来たら…
  • AIが書いてくれるやつ?

システム

SvelteKit基本形
(drizzle, lucia, などなど)

認証は脳死でLucia。特にこだわりがないので。

検索システム

Public検索はMeiliserchでいいと思った。
(でもこれDockerで別に立てる必要あるか…)

Kuromojiっていうやつを使うらしい。

  • インデックス作成時 (ノートの保存・更新時):
    • ユーザーがノートを保存したら、その本文をkuromoji.jsに渡して形態素解析を行います。
    • 解析結果として得られた単語のリストを、スペースで連結した一つの文字列に変換します。(例: "東京 都 に 住んで い ます"
    • このスペース区切りの文字列を、SQLiteのFTS5テーブルに保存します。FTS5はスペース区切りの単語を自動でインデックス化してくれます。
  • 検索時:
    • ユーザーが検索ボックスに入力したキーワードも同様にkuromoji.jsで形態素解析します。
    • 解析して得られた単語を使い、FTS5テーブルに対してMATCH演算子で検索クエリを発行します。

公開システム

色々ハードルがありそう

SSG

OGP

Sitemap?
GoogleBot?
Google Analytics?

ユーザーページ(LitLinkの代わりというかポートフォーリオに出来たらいいなとも思う)

DB

DBはDrizzle ORMを使うんで、ある程度互換性がある中で開発できると勝手に思ってる。

基本はSQLiteを使いたい。Tursoが安いんで。
ローカル版のSQLiteとTursoが同じlibSQLを使うので、互換性がかなりある。

あとWASMのSQLiteがあるらしい。
※Drizzleで使えるか不明

同期とオフライン利用の観点から、
SQLiteが良さそう。

WASM版のSQLiteは見つけられた。(使い方不明)
Tursoは、Embedded Replicasっていう機能があるらしい。
Embedded Replicas - Turso

Cloudflare D1を使ったときに、どのようにクライアントのWASM?とSyncするのか不明。
Tursoを使うにしてもEmbedded Replicasを使ったほうがいいのか、
フルクラウドフレア構成をしたい人のために、Cloudflareと互換性を持たせるために、標準的なSQLite互換の方法を使うかは不明。

Geminiさんいわく
「Cloudflare D1の場合、自分で実装しなきゃいけないから、めんどくさいしむずいので一旦Turso使ったほうがいい」とのこと。100%同意。

libSQL Serverというのがあって、
実質TursoのOSS

デプロイ先

デプロイ先はNetlifyかCloudflareを考えていたけど、
Vercelもありだと思った。
セルフホスト版の展開のかんたんさは
Vercel > Cloudflare ≒ Netlify > Docker ?

一旦、Cloudflare D1を使わないから別にCloudflareである必要はないけど、
Workers Paid プランが5ドルから始められて、従量課金で使えるというのがいいところ。
Netlifyは使い慣れてるけど、別にCloudflareも同じくらい使い慣れてると思う。
(いまの主要なデプロイ先はNetlify)
他には、Vercelとかあるけど、VercelのPostgresとか使わないのであれば、NetlifyやCloudflareを差し置いてVercelを使う意味があまりないと思う。
他に適してるサービスあるのかな…?
逆に、AWSとかGCP? S3とCDNみたいなのとLamdaみたいなので作れそうではあるけど、
インフラにこだわりないし、いまはここに力をいれるところではないから。
NetlifyかCloudflareかそれに類似するヤツのほうが良さそう

セルフホスト版のケアは私がしなくてもいいやとおもった。他力本願。

一回Cloudflareに自作アプリデプロイしてみたいと思ってたのと、
流石にCloudflareの方が軽そうというのと安そう。

アカウントシステム

セルフホスト版と公式版使ってる人の間とか
別々なセルフホストサーバーの人同士とか
こういうパターンでの共同編集をするときに、
Misskeyのようにアカウントをそれぞれ作らなきゃいけなかったり、
それぞれのPWAをインストールしないといけなくなるのは、UX的に良くないので、

DBやサーバーを跨げるシステムが必要だと思う。
(将来。優先順位低い。)

ユーザーは、UUID、CUID2が衝突しないという前提で組めそう?
そもそも共同編集に招待するときに、サーバーアドレスとユーザーIDでやってもいいのかもしれない。
データベースサーバー同士は複製せず
Aサーバーにいるユーザーが、Bサーバーの共同編集に参加するときは、
BサーバーのデータはAサーバーにコピーされず、常にユーザーのクライアントからBサーバーに参照されるようにすればいいかなと思う。

ユーザーのDB?か共同プロジェクトリストみたいなところのDB設計で外部のに参加してますっていうのを記録しておけばいいかなと思った。

TipTapかMilkdownか

なにもわからない…

TipTapをMarkdownで保存すると、データ壊れるみたいなことAIが言ってたのと
やっぱDBにはMarkdownで保存したい
これは、

TipTapを