Shrimpia Social(仮称)開発

Shrimpia Social とは?
帝国で利用するための、ActivityPub通信機能を備えた楽しいSNSを自前で作るプロジェクト。
ほしい機能
下に行くほど優先度が低い
- Xライクなマイクロブログ機能
- カスタム絵文字機能
- 絵文字リアクション
- モデレーション
- 強力なユーザー・ノート・メディアミュート
- チャンネル投稿機能
- 投稿のクリップ機能
- パクる / 数字引用
- チャット機能
- グループチャットにすることもできる
- プロフィールに貼られたハッシュタグを用いたレコメンデーション
- ActivityPub
- 帝国ユーザーには連合を望まないユーザーも多いため、デフォルトで連合なしにする
- 連合機能を有効化することでこんなことができるよ…という説明がつく感じ?
- 既存ユーザーは連合ありに
- 帝国ユーザーには連合を望まないユーザーも多いため、デフォルトで連合なしにする
- Misskey互換API?
- Mastodon互換API?
技術スタック
バックエンド
- 言語: C#
- Webフレームワーク: ASP.NET Core
- DB: PostgreSQL / Entity Framework Core
- キャッシュ: Redis
- API: RESTfulかGraphQLで迷っている
- MisskeyはGraphQLを採用予定なので、GraphQLで良いのかも
フロントエンド
- 言語: TypeScript
- フレームワーク: React.js
開発
当面はクローズドソース。シュリンピア以外での利用を想定しない。
定期的にプレビュー版を遊べる形で公開し、フィードバックを得つつアジャイル開発を進める。
軌道に乗ったら、基礎部分をオープンソース化し、誰でも建てられるようにし、開発促進を進める。
ゴール
mk.shrimpia.network で使うソフトウェアを置き換える。
Misskeyからのデータベース移行をサポートする。

技術選定について考える。
Node.js、結局遅いって声が大きいので、別のランタイムにしてみたい。
DenoやBunという手もあったが、そもそも重いのってJSなんじゃないのかしら。
いっそJavaScript環境をやめてみる?
そういえば私はC#erなんだったわ。
業務での使用実績も大きく、最近ランタイムがどんどん高速化されているC# / ASP .NET Coreに手を出してみよう。

フロントエンドにBlazor WebAssemblyを使って、アプリ全体を100% C#にしてしまうのも考えんだけど、Blazor微妙っぽい
- wasm形式の.NETランタイムが降ってくるので当然ギガを食う
- WASMからJSを通してDOMレンダリングをするのでオーバーヘッドが大きい
- ライブラリがあまり揃ってなさそう
- ブラウザのAPIを使うだけで面倒事をしないといけない
結論
- バックエンドをASP.NET Coreで書く
- フロントエンドはNext.jsでSSRする
サーバーが2つ必要になるが、逆にフロントエンドを切り捨ててヘッドレスな鯖建てができるメリットもある

やっぱりNext.jsじゃなくて素のReactで

バックエンドをASP.NET Coreで書くのやめた
全部TypeScriptで書きたいし
Bun.js + Hono を試してみることに

機能何が必要かな。
帝国民が愛する機能は全部実装したいけど、メンテしきれないと困るから絞る必要はある。
物によっては外部サービスで十分だし、ポータルとの連携で済む場合もある。

開発、しばらくはクローズドソースで。
アジャイル的な開発手法を取る。
帝国内で pre.social.shrimpia.network みたいな鯖を建てて、遊びながら問題点を探る。
OSSにした結果起こるいろいろな外部からの圧力には、最初は対応したくない。

最終的にはMisskeyを置き換えることが目標。
ポータルとの統合をがっつり進めたい。

ノートの保存について
ローカル
DBに保存する。頻繁に扱うノートはRedisに持っておく。
リモート
保存しない。直近のものはRedisに持っておく。
TL
ユーザーごとにRedisに構築。1ヶ月いないアカウントのTLは構築しない。
Redis上にはノートのユニークIDの配列を持つ。
更新した場合
ローカルのノートを作成・更新する場合、しばらく経ったらDBにbulk INSERT/bulk UPDATEする。