Tauri v2 + Svelte 5をはじめとしたMnemnkの技術スタック
現在、開発中のMnemnkの技術スタックについて紹介します。
Tauri v2
MnemnkはTauriを用いてデスクトップアプリとして動作します。
Tauriを用いることでマルチプラットフォームのアプリケーションを一つのコードで書くことができます。今の構成になるまでに試みたものは、以下の通りです。
- Electron: 実際、前身のアプリはElectronを使っていました。ライフロギングに必要な情報、スクリーンショットであったりアクティブなアプリを得るためのNode.jsライブラリーなども存在します。しかし、それらは内部で毎回コマンドをexecするものになっていて、突然、キーボードフォーカスが奪われてしまうといったことが回避できませんでした。
- Python: NLP, ML, AI関係のライブラリーが豊富ということで、サーバーをPythonで記述するということを試したことがあります。Pythonでもそこそこのスピードで動作するのではないかと組み込み用の検索エンジンも自作を試みたりもしましたね。しかし、複数のエージェントが協調動作するという並行動作の記述がどうにも難しかったです。将来的にGILをなくす試みも行われているようですが。
Tauriにはフロントエンドだけで動作するWebサービスをアプリ化するという用途もありますが、MnemnkではデータプロセスはRustで書かれたバックエンド側、表示に関してはフロントエンドと明確に役割を分離しています。[1]
また、Tauriを使うともれなくTokioがついてきます。Mnemnkでは非同期処理を多用しており、そのような非同期処理を用いたアプリを容易に(?)作成できるという点でもTauriは優れています。いや、むしろ、Tauriのフレームワークとそのコードがとても勉強になりました。
開発をはじめたころはTauriのバージョンはv1だったのですが、v2が出たときに一度、大幅な書き直しをしています。エージェントが標準入出力で通信する外部プロセスとして動作できるようにしたり[2]、DBも内蔵してアプリをインストールするだけで使えるようにしたり、アプリ名も変えたり。
Tauriを採用することのデメリットもあげておきます。
- 実績がない: ElectronであればVS Code, Slack, Discord, Figmaといったアプリの名前があげられますが、Tauriにはそういった活用例がまだありません。それはつまり、本当にproduction-readyなのかどうか、まだ判断できないといえるかもしれません。
- 情報が少ない: これも上と同じで、活用例が少ないため情報も少ないです。しかし、Tauriのpluginがこれを補完してくれていると個人的には感じています。よく用いられる機能はpluginの形で共有されることで高機能なアプリを簡単に作ることができます。
- Rust: Rustがいい言語なのは間違いないのですが、習得のハードルは高いと言わざるを得ません。いまではAIが助けてくれるようになりましたが、AIのRustの理解度はまだそれほど高くありません。また、ライブラリーもサーバー用途のものに比べて、アプリケーション用途のものは少し完成度の低いものが多い印象です(C/C++との親和性がいいこともあってか数は足りている)。
いずれも、Tauriのフレームワークそのものに問題があるということではないので、今後、開発者が増えて解消していくことを願っています。
SurrealDB
DBにはSurrealDBを用いています。
SurrealDBを採用した理由は
- embedできる
- Document model
- 全文検索
-
vector search
と必要な機能をすべて持っていたことです。[3]
新しいDBを使うことに対する不安はありますが、SurrealDBは内部的にはRocksDBやIndexedDBをラップしたものですので基本的なところは問題ないだろうと判断しました(SurrealDB | Architecture)。[4]
Svelte 5
フロントエンドにはSvelte 5を採用しました。
初期のバージョンではReactで書かれていたのですが、使っていた状態管理フレームワークであるRecoilがディスコンしてしまい書き直す必要が出てきたのですが、Svelte 5を試したところ、とても書きやすく移行を決めました。
Svelte 5の私の思うメリットはPythonと同様に"Battery Included"なところです。Reactでは状態管理をどうするか、ルーティングをどうするか、パッケージャーはどうするかといったことに対して(長い歴史もあって)さまざまな選択肢がある一方で、その選定と開発環境の構築だけで本が一冊書かてしまうというところがあります。
それに対して、Svelte 5では以下のように標準が定まっており、そういったことに頭を悩ませる必要はありません。
それに、なんといってもRunesは扱いやすい。これまで状態管理はClojureのAtomが至高だと考えていましたが、Runesは大規模なデータも扱え、非常によく考えられた状態管理手法です。[5]
Svelte 5のデメリットもあげておくと
- 情報が少ない
- ライブラリーが少ない
- 生成AIが苦手
ライブラリーは確かに少ないですが、Battery Includedといった通りSvelte自身にanimateなど基本的なものは含まれていますし、Tailwind CSSをはじめとしたよく使われるものは、対応しているかSvelte版が存在するかしています。しかし、ものによっては周回遅れ感が否めないものもありますので、そこはプロダクトが目指すもの次第となります。
生成AIが苦手という点に関しては、LLMは収集したデータを学習することで作成されていますから[6]、情報の少ないフレームワークは不利です。Claude 3.7 SonnetとGemini 2.5 pro (preview)はある程度正しいSvelte 5のコードを出力できることを確認しましたが、5と指定しないとSvelte 4のコードが出力されます。また、GitHub Copilotは.svelte
ファイルをレビューしてくれません。
Svelte Flow
ノードベースエディターにはSvelte Flowを用いています。つい先日、5月14日に1.0に到達し、正式にSvelte 5に対応しました。🎉
React Flowはさまざまなところで使われていて、そのSvelte版です。React Flowとcoreはコードを共通にしていますので機能面に差はなさそうです。
最後に
Mnemnk Appを構成する技術スタックを紹介しました。
端的に言えば、Rust + Tauri v2 + SurrealDB + TypeScript + Svelte 5 + Svelte Flow で、ずいぶんとedgeなものばかりを採用しています。個人開発だからできる贅沢ともいえます。
これらを採用することのデメリットに「情報が少ない」ということがあげました。今後、これらについての記事を書いていき、微力ながら情報を増やすことに貢献していけるといいですね。
今回の記事では、様々な情報を取得したり、AIに関するライブラリーに関しては一切出てきませんでした。それは、Mnemnkではそれらを扱うエージェントを外部プログラムとして分離することでMnemnk App本体の依存関係を小さく抑えているからです。
とはいえ、すべてを外部エージェントにしてしまうのは効率も悪くなるので、内蔵エージェントも数多く存在します。今回は取り上げませんでしたが内蔵エージェントが使っているライブラリーの中にも面白いものがありますので、それらについても、また別の記事で紹介していきたいと思います。
興味を持っていただけたら、Mnemnkのインストール から始めてみてください。
MnemnkはOSSとして開発を行っています。まだまだ開発途中ですので、開発に興味がある方はGitHubリポジトリをチェックしてみてください。
-
デスクトップアプリとして一体化してはいますが、逆に分離したサービスの提供も考えています。 ↩︎
-
gitのcommitによると2024年10月ぐらいで、MCPが発表されたのが11月、MCPの最初のcommitが9月ぐらいのようですので、同じようなアイデアが同時多発的に発生するというのは世の常ですね。 ↩︎
-
ただ、全文検索は日本語未対応で工夫が必要でした。そのあたりの話は別の記事で。 ↩︎
-
SDKがv2に上がったときは不安定で、3日間程度のデータをロストしてしまうことはありました。 ↩︎
-
ライブラリーと敢えて書いていないのは、What are runes?に書かれている通り、RunesはJSライブラリーではなくSvelte compilerによって処理される言語の一部です。 ↩︎
-
プログラミングに関しては、AlphaZeroのように人間のデータは不要というステージに入るのも時間の問題だとは思います。 ↩︎
Discussion