Expo / local-first markdown

書く場所を、
ポケットに。

TOOLSMITH EDITOR の編集体験を、iOS / Android へ。 リッチテキストで書き、Markdown で持ち出し、原稿は端末内の SQLite に自動保存します。 このページでは、実エディタをそのまま操作できます。

  • アカウント不要
  • 端末内 SQLite
  • オフライン動作
  • MIT License

Phase 0〜1 相当の土台は実装済み。iOS / Android 実機での検証を進行中です。ストア配信は未定。

BUILT WITH
  • Expo SDK 58
  • React Native 0.88
  • React 19.3(native)
  • React 18.3(editor-web)
  • Expo Router 58
  • Lexical 0.32
  • abcjs 6.7
  • expo-sqlite 58
  • TypeScript 6.0

Live demo

このページで、実エディタをそのまま。

アプリに同梱しているエディタ HTML を iframe で読み込んでいます。 テキストの編集、ツールバーによる書式変更、ABC 楽譜の描画と再生を試せます。

toolsmith-editor://demo
別タブで開く ↗
エディタを読み込んでいます…
  • 01テキストを編集
  • 02ツールバーで書式変更
  • 03ABC 楽譜を再生
ソースプレビューはスクロールして確認できます。編集内容はこのページ内だけに留まります。

Product tour

3つの画面で、書くことに集中する。

文書を選び、書き、保存の振る舞いを決める。モバイルで完結するための最小構成です。

Library

文書を、一覧で。

起動して最初に開くのは、文書のライブラリ。書くための入口を1画面にまとめました。

  • 01
    新しい文書を作る「+ 新しい文書」からすぐに書き始められます。初回は案内文つきの文書が用意されます。
  • 02
    Markdown を取り込むDocumentPicker から .md / .markdown / .txt を選び、新しい文書として保存します。
  • 03
    長押しで整理する文書カードを長押しすると削除。タイトルは本文の見出しから自動で抽出されます。

Features

書く、整える、持ち出す。
その流れを、端末内で。

機能を増やすのではなく、書き始めてから書き出しまでの距離を短くしました。

端末内 SQLite へ自動保存

編集が止まると SQLite へ保存。待ち時間は 400 / 800 / 1500 / 2500ms から選べ、保存状態はヘッダーに表示されます。

リッチテキストと Markdown を往復

見出し、リスト、チェックリスト、引用、表、リンク、コードブロックをリッチテキストで編集。Markdown ソースもその場で確認できます。

ABC 記譜の楽譜を再生

```abc / ```music-abc ブロックを abcjs で描画。再生、一時停止、停止、テンポ調整までアプリ内で完結します。

5形式の書き出し

Markdown / HTML / JSON / Quarto / Plain Text を OS の共有シートへ。AirDrop、メール、ファイルアプリから取り出せます。

既存の Markdown を受け取る

DocumentPicker から .md / .markdown / .txt を読み込み、新しい文書として保存します。

オフラインで完結

エディタ本体と abcjs をアプリに同梱。原稿を外部サーバーへ送らず、ネットワークなしでも編集・保存・書き出しができます。表示フォントは端末のシステムフォントを使用します。

Architecture

ネイティブシェルと、
その中のエディタ。

アプリ全体を WebView で包むのではなく、画面遷移・保存・共有はネイティブ側が担当。 編集体験だけを WebView に閉じ込めています。

Expo Router のネイティブシェルが文書ライブラリ、エディタ画面、設定を持ち、 エディタは単一 HTML にビルドした Lexical アプリとして WebView 内で動作します。 画面遷移と保存はネイティブ、執筆と再生は WebView。責務を分けたまま、1つのアプリとして動きます。

図は Archify でコードベースの実装根拠をもとに生成しています。

  • 文書の一覧・作成・削除・自動保存はネイティブ側の SQLite が担当
  • 起動時は READY まで送信をキューに保持し、INIT で本文を渡す
  • 編集内容は CONTENT_CHANGED として 300ms デバウンスで集約
  • 保存は直列化し、保存中の変更を pendingSaveRef に退避
  • 書き出しはエディタから EXPORT_REQUEST を送り、共有シートへ
runtime · interactive diagram 全画面で開く ↗
TOOLSMITH EDITOR EXPO の実行構成図。ネイティブシェル、WebView ホスト、Lexical エディタ、SQLite、書き出し、共有シートの関係を示す。 タップして拡大 · Archify で生成

NATIVE SHELL

Expo Router が画面遷移、SQLite CRUD、自動保存、共有シート、DocumentPicker を担当します。

WEBVIEW HOST

単一 HTML のエディタを読み込み、INIT / READY / CONTENT_CHANGED をブリッジします。

LEXICAL EDITOR

リッチテキスト編集、Markdown 変換、abcjs による楽譜描画と Web Audio 再生を持ちます。

SAVE & EXPORT

保存は直列化して取りこぼしを防ぎ、5形式を OS の共有シートへ渡します。

Getting started

3ステップで、書き始められる。

セットアップはありません。起動したら、そのまま書けます。

STEP 01

新しい文書をつくる

ライブラリから「+ 新しい文書」を選ぶか、既存の Markdown を読み込みます。初回は案内文つきの文書が用意されます。

STEP 02

書いて、整える

横スクロールのツールバーで書式を変更。必要ならメニューからソースプレビューをオンにして、Markdown と ABC 楽譜を確認します。

STEP 03

保存して、持ち出す

編集内容は自動保存。共有シートから必要な形式を選び、AirDrop やファイルアプリへ書き出せます。

Your data

原稿は、
この端末の中に。

TOOLSMITH EDITOR EXPO は、クラウドサービスではありません。 文書はアプリ内の SQLite に保存され、アプリが内容を外部へ送信することはありません。

  • 保存先端末内 SQLite(アプリ専用)
  • アカウント不要
  • テレメトリなし
  • 文書の送信なし
  • 対応形式Markdown / HTML / JSON / Quarto / Plain Text
  • 取り込みDocumentPicker で選んだファイルのみ
  • ライセンスMIT License

Status

土台は実装済み。
いまは実機で確かめている段階。

開発中のプロジェクトです。CI と LP は公開済み、ストア配信・署名・EAS Build はこれから整えます。

実装済み NOW

  • Expo SDK 58 + Expo Router のモノレポ構成
  • Lexical エディタの抽出と単一 HTML ビルド
  • WebView ブリッジと自動保存の直列化
  • SQLite の文書 CRUD と設定保存
  • ライブラリ / エディタ / 設定のネイティブ画面
  • 5形式の書き出しと DocumentPicker 取り込み
  • GitHub Actions CI(型チェック / lint / テスト / エディタビルド / 差分チェック)

これから NEXT

  • iOS / Android 実機での WebView 読み込み検証
  • abcjs の音声再生検証(マナーモード / Bluetooth)
  • 10万字文書の入力・保存ベンチマーク
  • EAS Build / 署名の整備
  • App Store / Google Play 向けスクリーンショット
  • 文書検索・タグ・一括バックアップ

Roadmap

小さく動かして、
確かめながら進める。

実装済みの範囲と、これから検証する範囲を分けて公開しています。

NOW

モバイル版の土台

モノレポ、Lexical エディタ、WebView ブリッジ、SQLite CRUD、5形式の書き出し、ネイティブ3画面。

完了
NEXT

実機での検証と安定化

iOS / Android の WebView 読み込み、ABC 音声再生、キーボード表示、大規模文書の保存性能を確認します。

進行中
SOON

配布準備

EAS Build、署名、アプリアイコン / スプラッシュ、ストア向けスクリーンショットとプライバシー表記。

予定
LATER

ワークスペースの拡張

文書検索、タグ、一括バックアップ、書き出しテンプレートなど、文書が増えたときの導線を検討します。

検討

FAQ

よくある質問

実装状況とスコープについて、現時点の回答をまとめました。

ストアで配信されていますか?

まだ配信していません。モバイル版の土台は実装済みで、現在は iOS / Android 実機での検証を進めています。ソースコードと開発メモは GitHub で公開しています。

データはどこに保存されますか?

文書は端末内の SQLite(アプリ専用領域)に保存されます。アカウントやクラウド同期はありません。アプリを削除するとデータも失われるため、必要な文書は共有シートから書き出してバックアップしてください。

Web版との違いは何ですか?

Web版の Lexical エディタを単一 HTML として同梱し、Expo のネイティブシェルから WebView で読み込んでいます。保存先はブラウザのストレージではなく SQLite、書き出しは OS の共有シート、取り込みは DocumentPicker です。外部フォルダを直接編集する機能はモバイル版では再現していません。

Quarto はどこまで対応していますか?

YAML ヘッダー付きの .qmd 書き出しに対応しています。Quarto CLI によるレンダリングはスコープ外です。

オフラインで使えますか?

はい。エディタ本体と abcjs をアプリに同梱しているため、ネットワークがなくても編集・保存・書き出しができます。表示フォントは端末のシステムフォントを使用します。

テーマは変更できますか?

現在は cosmic(Sci-Fi)テーマ固定です。設定画面からソースプレビューの表示と自動保存の待ち時間を変更できます。テーマの追加は今後の検討項目です。

対応 OS を教えてください。

Expo SDK 58 / React Native 0.88 を前提に、iOS と Android を対象としています。実機検証が完了するまでは、動作保証や配信時期を確定していません。

TOOLSMITH EDITOR EXPO

次の一文を、ポケットから。

ソースコードと開発メモを GitHub で公開しています。実装の詳細や検証項目は DEV-MEMO.md を参照してください。

  • iOS / Android
  • Expo SDK 58
  • React Native 0.88
  • Lexical / abcjs
  • MIT License