「自分のデータは自分の手元に」Markdownを真実の源にするタスク管理ツールをTauri + Rustで個人開発した
title: "Markdownを真実の源にする、ローカルファーストなタスク管理ツールを個人開発した話"
emoji: "🗂"
type: "tech"
topics: ["tauri", "rust", "react", "個人開発", "markdown"]
published: false
はじめに
普段はバックエンドエンジニアをしています。フリーランスや個人開発者向けの
ローカルファーストなプロジェクト/タスク管理ツール「Atelie」 を作ったので紹介します。
「自分のデータは、自分の手元に、ただの Markdown ファイルとして置いておきたい」
それだけのために作ったツールです。macOS 版を公開しました。

- ダウンロード: https://github.com/ryo-kame/atelie-releases/releases/latest
- 対応: macOS 12+ / Apple Silicon・Intel(universal binary・Developer ID 署名+公証済み)
なぜ作ったのか
タスク管理ツールは世の中に山ほどあります。でも個人開発やフリーランスの仕事で使おうとすると、
だいたいこのどれかに不満が出ました。
- クラウド前提: データが手元になく、サービス終了やアカウント停止で全部消える不安がある
- 独自フォーマット: エクスポートしてもただのバックアップで、他ツールから素直に読めない
- オーバースペック: チーム向けの権限・通知・コラボ機能が、一人で使うには邪魔
欲しかったのは「手元のファイルがそのままデータで、いつでも grep できて、git で管理できる」
という当たり前のものでした。見つからなかったので作りました。
設計の中心: Markdown が真実の源(Single Source of Truth)
Atelie のいちばん譲れない原則がこれです。
- データの実体は、自分で選んだフォルダ配下の
projects/{project-id}/{slug}.md - SQLite はあくまで 破棄可能なキャッシュ(検索・一覧の高速化用)。消しても Markdown から再構築できる
ファイルはこんな感じの YAML frontmatter + Markdown です。
markdown
id: t-001
project: atlas-mobile
title: Fix deep-link routing on iOS 17
status: doing
priority: high
due: 2026-06-01
tags: [frontend, ios]
背景
[[2026-05-28-meeting]] で受けたフィードバックを反映する。
- サブタスク1
- サブタスク2
ポイントは、Atelie を使わなくなってもデータが死なないこと。ただの Markdown なので、
VS Code でも Obsidian でも開けるし、grep も git diff も普通に効きます。
ツールはデータの「ビューア」であって「保管庫」ではない、という思想です。
主な機能
Today ダッシュボード
起動して最初に見えるのが「今日やること」の俯瞰です。期限切れ(Overdue)・今週のタスク・
オープン件数・進行中プロジェクトが一目で分かります。一人で複数案件を回していると
「で、今日どれから手をつける?」が地味に大事なので、ここを最初に持ってきました。
その他
- Markdown エディタ: Tiptap ベース。frontmatter はプロパティパネルから編集
-
Wikilink:
[[note-id]]で双方向リンク + バックリンク。ファイル名を変えてもリンクは切れない(idで解決) - Kanban: ドラッグ&ドロップでステータス変更 → frontmatter に書き戻る
- テーブル / カレンダービュー: 期限・ステータスでの俯瞰
- 全文検索: SQLite FTS5(trigram tokenizer なので日本語含む多言語OK)
- ファイル監視: 外部エディタでの変更を自動取り込み
-
埋め込みターミナル: アプリ下部にターミナルを内蔵。ノートやタスクの文脈を、定型ボタンから
そのままターミナルに送り込める(claudeなどの CLI と組み合わせる用途を想定) -
同期はあえてアプリがやらない:
~/Atelieを自分でgit initするだけ。同期戦略はユーザーに委ねる
技術スタック
- Tauri 2(Rust コア + WebView)
- フロント: React 19 + TypeScript + Vite
- エディタ: Tiptap 3 + tiptap-markdown
- 永続化: ローカルの Markdown ファイル + SQLite キャッシュ
Electron ではなく Tauri を選んだのは、配布バイナリが小さく、ファイル I/O やパースの
ロジックを Rust 側に寄せられるからです。
設計でこだわった点
1. 純粋関数とI/Oの分離(TDDしやすくする)
Markdown のパーサ(frontmatter 抽出、wikilink 解決、サブタスク抽出)は
I/O を一切持たない純粋関数として切り出しています。おかげでテストがとても書きやすい。
バックエンド開発で染み付いた「ロジックと副作用を混ぜない」をそのまま持ち込みました。
2. 型をRustからフロントへ自動同期
IPC の型は ts-rs で Rust → TypeScript に自動生成。手書きの重複型を作らないので、
Rust 側を変えるとフロントの型も追従し、ズレが起きません。
3. ファイルシステムの安全性
フロントから渡ってきたパスは、必ず「ワークスペース配下か」を canonicalize 後に検証してから
書き込みます。~/.ssh/ などへ書けてしまう事故を防ぐためで、ローカルアプリでもここは妥協しませんでした。
これから(v2でやりたいこと)
- Windows / Linux 対応
- AI連携(手元のノートに対する Ask)
- GitHub Project からの取り込み強化
おわりに
「自分のデータは自分の手元に、ただのファイルで」という思想に共感してもらえたら嬉しいです。
macOS をお使いなら、ぜひ触ってフィードバックをください。
Discussion