An Android app for capturing and organizing thoughts on a spatial canvas, with local storage.
Overview
ThinkCanvas は Android 向けのローカルファーストな思考キャンバスです。テキストや手書き、 図形・囲み・矢印・写真を自由に置き、配置に込めた意味を保ちながら考えを組み替えられます。 複数のボードを管理し、検索で見返し、必要な範囲を画像として持ち出せます。 ボードと要素は Room 3 で端末内に保存し、記録・閲覧・編集・保存はアカウントや AI、通信なしで完結します。 初期構築 #1 と Spec 001〜005 の実装、 初期ロードマップ #7 は完了しています。 Roadmap v2 #81 の mobile-first usability / capture wave は完了しました。 日常利用での検証(dogfooding)は継続し、後続の改善は #108、#110、#111 などの独立した Issue で追跡しています。 - テキストの作成・編集、見出し/本文と墨色/朱色の切り替え。 - テキストの外側タップによる確定・終了。編集時のBackは未確定の変更がある場合だけ破棄を確認し、ツール・検索・選択のBackは通常キャンバスへ段階的に戻ります。 - パン・ピンチズーム、要素の選択・移動、Undo/Redo。表示の移動や倍率変更では保存された配置を変えません。 - 要素・複数選択を移動中に指を画面端で保持すると自動panし、指を離さず遠くへ運べます。中央へ戻ると停止し、一回の移動を一回の保存・Undoとして扱います。取消と検証範囲はSpec008と検証手順を参照してください。 - 四角・丸・名前付き囲みの作成・サイズ変更、囲みと中身の移動、矢印の接続・曲げ・反転、 複数選択とまとめて移動、空白の長押しドラッグによる余白挿入。 - Jetpack Ink によるペン/マーカーの手書きとスタイラス入力。手書きも選択・移動・削除・保存できます。 - Semantic Zoom による近・中・遠の表示、囲みへのフィット、ボード内のテキスト・囲み名の検索と結果の前後移動。 - 現在の検索結果または選択範囲が完全に画面外になると、画面端の方向表示から戻れます。複数選択は1まとまり、同じ単一対象は統合し、必要時だけ最大2個を表示します。対象と検証範囲はSpec009を参照してください。
README
ThinkCanvas
ThinkCanvas は Android 向けのローカルファーストな思考キャンバスです。テキストや手書き、 図形・囲み・矢印・写真を自由に置き、配置に込めた意味を保ちながら考えを組み替えられます。 複数のボードを管理し、検索で見返し、必要な範囲を画像として持ち出せます。 ボードと要素は Room 3 で端末内に保存し、記録・閲覧・編集・保存はアカウントや AI、通信なしで完結します。
現在の状態
初期構築 #1 と Spec 001〜005 の実装、 初期ロードマップ #7 は完了しています。 Roadmap v2 #81 の mobile-first usability / capture wave は完了しました。 日常利用での検証(dogfooding)は継続し、後続の改善は #108、#110、#111 などの独立した Issue で追跡しています。
| 実装済みの仕様 | 対象 Issue | 公開仕様 |
|---|---|---|
| Spec 001: Canvas Foundation | #2 | spec |
| Spec 002: Spatial Organization | #3 | spec |
| Spec 003: Ink & Stylus | #4 | spec |
| Spec 004: Semantic Navigation | #5 | spec |
| Spec 005: Board Lifecycle | #6 | spec |
| Spec 006: Text Editor Dismissal | #71 | spec |
| Spec 007: Neutral Canvas Interaction | #73 | spec |
| Spec 008: Drag Edge Auto-Pan | #78 | spec |
| Spec 009: Offscreen Direction Indicators | #76 | spec |
| Spec 010: Viewport History | #77 | spec |
| Spec 011: Android Share Target | #79 | spec |
| Spec 012: Blank Tap Arbitration | #67 | spec |
| Spec 013: Image Element | #80(実機:小画面・大きい文字は問題なし/TalkBackは未確認・#81今回の完了対象外) | spec |
利用できる主な機能
- テキストの作成・編集、見出し/本文と墨色/朱色の切り替え。
- テキストの外側タップによる確定・終了。編集時のBackは未確定の変更がある場合だけ破棄を確認し、ツール・検索・選択のBackは通常キャンバスへ段階的に戻ります。
- パン・ピンチズーム、要素の選択・移動、Undo/Redo。表示の移動や倍率変更では保存された配置を変えません。
- 要素・複数選択を移動中に指を画面端で保持すると自動panし、指を離さず遠くへ運べます。中央へ戻ると停止し、一回の移動を一回の保存・Undoとして扱います。取消と検証範囲はSpec008と検証手順を参照してください。
- 四角・丸・名前付き囲みの作成・サイズ変更、囲みと中身の移動、矢印の接続・曲げ・反転、 複数選択とまとめて移動、空白の長押しドラッグによる余白挿入。
- Jetpack Ink によるペン/マーカーの手書きとスタイラス入力。手書きも選択・移動・削除・保存できます。
- Semantic Zoom による近・中・遠の表示、囲みへのフィット、ボード内のテキスト・囲み名の検索と結果の前後移動。
- 現在の検索結果または選択範囲が完全に画面外になると、画面端の方向表示から戻れます。複数選択は1まとまり、同じ単一対象は統合し、必要時だけ最大2個を表示します。対象と検証範囲はSpec009を参照してください。
- 視点の戻る/進むを編集Undo/Redoと独立して使えます。検索・fit・倍率切替・pan/pinchを辿り、画面外の編集Undo/Redoでは変更位置を表示します。視点操作で編集Redoや保存内容を変えません。対象と寿命はSpec010を参照してください。
- 最終編集順のボード一覧とサムネイル、作成・再開・名前変更・複製・削除、最後に開いたボードの復元。
- 初回の空ボードでの操作案内と、一覧の「使い方」からの再表示。
- ボード全体または選択範囲の画像プレビュー、端末への画像保存、コピー、Android 共有メニューへの受け渡し。
- ボードと要素のローカル専用保存。内容と位置関係を保って再起動後に復元します。
- Android共有メニューからテキスト・URLを取り込み、追加先を確認してボードへ配置できます。
- 写真・画像ファイルpickerから静止JPEG・PNG・WebPを追加できます。画像も選択・移動・縦横比resize・削除・Undo/Redo・囲み・矢印・複製・出力へ参加し、元ファイルに依存せず端末内に保存します。任意の代替テキストは画像メニューから編集でき、空欄は「画像」と読み上げます。検証範囲はSpec013の検証手順を参照してください。
現在の対象外は、クラウド同期・端末間同期、リアルタイム共同編集、AI による自動整理、 画像Share Target受信、動画、画像の画素編集、OCR、手書き認識・図形の自動補正です。 自動整列・グリッド吸着・自動分類は行いません。
APK 配布と実機確認
Android 実機確認 runbook に配布と確認の手順をまとめています。
- PR debug APK: PR の Android checks
から、same-repository PR は
think-canvas-debug-apk(専用固定署名)、fork PR はthink-canvas-debug-apk-ephemeral(run 固有署名)の artifact を zip で取得します(各7日保存)。 applicationId はcom.thinkcanvas.internal.debugです。詳しくは 配布経路 を参照してください。 - 署名済み internal APK: 継続利用・更新確認には Releases
の pre-release にある
think-canvas.apk(com.thinkcanvas.internal)を使います。 作成はmainから手動実行する Internal APK release と pre-release の作成手順 に従います。 - 実機確認: 初回インストール、Obtainium、更新後のボード保持の確認は 端末での確認手順 を参照してください。
debug APK と internal APK は applicationId と署名が異なり、端末上で併存できます。 相互に上書き更新はできません。
開発環境
- Android Studio と Android SDK Platform 37 / Build Tools 36.0.0
- JDK 25
- インターネット接続(初回の Gradle と Android 依存関係の取得に必要)
- Spec Kit の操作には Python 環境と
uvが必要です
compileSdk / targetSdk は Android 17 / API 37、minSdk は API 30 です。
Android checks は Ubuntu 26.04 / JDK 25 で lint・単体テスト・
debug build・Room schema の差分・公開情報境界を確認します。必須の Gradle Managed Device
(GMD)は Pixel 9 / Android 17(API 37、google_apis、x86_64)で、
:app:pixel9Api37DebugAndroidTest を実行します。
Windows ローカルの GMD 検証は Windows GMD 検証 を参照してください。
プラグインとライブラリの版数は root の Gradle 設定 と app の Gradle 設定、Gradle の版数は Gradle Wrapper の設定 を参照してください。
リポジトリを clone して Android Studio で開き、SDK Platform 37 をインストールしてください。
コマンドラインでは sdkmanager "platforms;android-37.0" "build-tools;36.0.0" を使います。
Android Studio が作成する local.properties は追跡しません。コマンドラインでは JDK 25 と
ANDROID_HOME または ANDROID_SDK_ROOT を設定し、Windows なら次を実行します。
.\gradlew.bat :app:lintDebug
.\gradlew.bat :app:testDebugUnitTest
.\gradlew.bat :app:assembleDebug
macOS / Linux では各 Gradle コマンドの先頭を ./gradlew に置き換えます。ビルド成果物は
app/build/outputs/apk/debug/ に作成されます。
Spec Kit
Spec Kit は公式 v1.1.3 に固定しています。Codex skills は .agents/skills/、
Claude Code skills は .claude/skills/、共通テンプレートと Python スクリプトは
.specify/ にあります。既定の integration は Codex、両方の script variant は py です。
以前の PowerShell スクリプトも公式 manifest の管理対象として残りますが、両方の skills は
Python スクリプトを参照します。
前提不足のエラーで共有スクリプトが $speckit-... と案内した場合、Claude Code では
対応する /speckit-... を使います。v1.1.3 の共有スクリプトは既定の Codex 表記で案内します。
CLI/scaffold の版は .specify/init-options.json、導入状態は .specify/integration.json
に記録されています。workflow の版(.specify/workflows/speckit/workflow.yml)は別管理です。
Python 3 と uv を用意した後、公式タグに固定した一時 CLI で導入状態を確認し、
既存の連携を更新します。
Windows では python3 --version が実際の Python 3 を起動することも確認します。
管理対象ファイルの手編集が報告されたら、差分を確認して更新を止めてください。
uvx --from git+https://github.com/github/[email protected] specify version
uvx --from git+https://github.com/github/[email protected] specify integration status
uvx --from git+https://github.com/github/[email protected] specify integration upgrade codex --script py
uvx --from git+https://github.com/github/[email protected] specify integration upgrade claude --script py
Claude Code をまだ導入していない場合だけ、最後の upgrade claude の代わりに
uvx --from git+https://github.com/github/[email protected] specify integration install claude --script py
を実行します。追加しても既定の Codex は変わりません。
Constitution は .specify/memory/constitution.md にあります。
開発と PR レビューの手順は docs/runbooks/change-review.md
にまとめています。AGENTS.md はこれらの判断基準を案内します。
Codex では $speckit-constitution、Claude Code では /speckit-constitution などの
skill 名を使います。各機能の成果物は
specs/ 内にあり、公開仕様は上の「現在の状態」から参照できます。
$speckit-specify → $speckit-clarify → $speckit-plan → $speckit-checklist →
$speckit-tasks → $speckit-analyze → $speckit-implement → $speckit-converge
の順に進め、設計判断をその機能の成果物に残します。
要件の基準と公開境界
PRD が製品要件の authority です。HTML モックは操作とコンポーネントの見た目の reference implementation として扱います。内容が食い違う場合は PRD を優先し、差分と理由を spec に記録します。 PRD が決めていないことは spec で明示してから実装します。両ファイル自体は公開しません。
このリポジトリには API キー、トークン、認証情報、個人情報、ローカルパス、非公開サービス情報、
会話ログ、PRD、HTML モックを追加しません。.gitignore は既知のローカル設定と秘密ファイルを
除外します。公開前には次を実行し、さらに差分を目視確認してください。
pwsh -File scripts/check-public-boundary.ps1
git diff --check
git status --short
チェックは典型的なパターンの検出補助です。新しい名前の秘密情報や、文章に混ざった 非公開情報まで自動的に判定するものではありません。
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add reitojike/think-canvas