💨

「自分のデータは自分の手元に」Markdownを真実の源にするタスク管理ツールをTauri + Rustで個人開発した

に公開

title: "Markdownを真実の源にする、ローカルファーストなタスク管理ツールを個人開発した話"
emoji: "🗂"
type: "tech"
topics: ["tauri", "rust", "react", "個人開発", "markdown"]
published: false

はじめに

普段はバックエンドエンジニアをしています。フリーランスや個人開発者向けの
ローカルファーストなプロジェクト/タスク管理ツール「Atelie」 を作ったので紹介します。

「自分のデータは、自分の手元に、ただの Markdown ファイルとして置いておきたい」
それだけのために作ったツールです。macOS 版を公開しました。

Atelie の Today ダッシュボード

なぜ作ったのか

タスク管理ツールは世の中に山ほどあります。でも個人開発やフリーランスの仕事で使おうとすると、
だいたいこのどれかに不満が出ました。

  • クラウド前提: データが手元になく、サービス終了やアカウント停止で全部消える不安がある
  • 独自フォーマット: エクスポートしてもただのバックアップで、他ツールから素直に読めない
  • オーバースペック: チーム向けの権限・通知・コラボ機能が、一人で使うには邪魔

欲しかったのは「手元のファイルがそのままデータで、いつでも grep できて、git で管理できる
という当たり前のものでした。見つからなかったので作りました。

設計の中心: Markdown が真実の源(Single Source of Truth)

Atelie のいちばん譲れない原則がこれです。

  • データの実体は、自分で選んだフォルダ配下の projects/{project-id}/{slug}.md
  • SQLite はあくまで 破棄可能なキャッシュ(検索・一覧の高速化用)。消しても Markdown から再構築できる

ファイルはこんな感じの YAML frontmatter + Markdown です。

markdown

背景

[[2026-05-28-meeting]] で受けたフィードバックを反映する。

  • サブタスク1
  • サブタスク2

ポイントは、Atelie を使わなくなってもデータが死なないこと。ただの Markdown なので、
VS Code でも Obsidian でも開けるし、grepgit 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