An unofficial, community-driven Flutter app for Android and iOS that aims to bring CherryTree-style hierarchical notes to mobile. This repository is not the official CherryTree project; it is a separate codebase that uses the desktop app and its published formats as a reference for behavior and compatibility.
Upstream CherryTree (desktop): github.com/giuspen/cherrytree
CherryTree is a mature hierarchical note-taking application for desktop (Linux, Windows, macOS). A mobile client has been requested by users for a long time. This project explores that idea in Flutter, starting small and growing capability over time instead of attempting a full clone on day one.
Desktop CherryTree remains the right tool on desktop. This repo targets phones and tablets only; we do not ship web, Windows, Linux, or macOS targets here.
- This project is not affiliated with or endorsed by the CherryTree authors unless they choose to say otherwise.
- It is experimental / work in progress. Features and file compatibility will evolve.
- Use the official CherryTree releases for the canonical desktop application.
Work is phased so the effort stays manageable:
| Phase | Focus |
|---|---|
| Spike A | Core mobile UX: tree of nodes, simple editing, local JSON persistence; export to .ctd / .ctb. |
| Spike B | Read-only import of unencrypted .ctd / .ctb (plain text; rich text shown as plain; embedded objects omitted with warnings). |
| Spike C | Round-trip saves without corrupting documents opened in desktop CherryTree (starting with narrow cases: e.g. unencrypted, single-file). |
| Later | Richer parity (imports, encryption, multifile storage, etc.) only after the foundations above are solid. |
Exact milestones may shift; check issues and pull requests for current work.
Checklist (Spike A → later): PATH_OF_ATTACK.md · Changelog: CHANGELOG.md · AI assistants: AI_DEVELOPMENT.md.
| Doc | Use it for |
|---|---|
CONTRIBUTING.md |
How to contribute — PR expectations, CI, reviews, and links to rules. |
PATH_OF_ATTACK.md |
Canonical checklist — what is done ([x]), not started ([ ]), or in progress ([-]). |
CHANGELOG.md |
What shipped in each version; Unreleased summarizes recent work before a tag. |
| This README (roadmap table above) | High-level phases (Spike A/B/C) without duplicating every checkbox. |
Merges to main use GitHub branch protection: pull requests, approvals, Code Owners review, signed commits, and green CI. See CONTRIBUTING.md.
Known gaps and planned UX are called out in Unreleased in the changelog and in PATH_OF_ATTACK.md (per-spike checkboxes and later items).
| Platform | Supported |
|---|---|
| Android | Yes |
| iOS | Yes |
| Web, Windows, Linux, macOS (Flutter) | No — use upstream CherryTree on desktop. |
These are the IDs used for store listings and signing:
| Target | Identifier |
|---|---|
Android applicationId |
nl.bytesnbits.cherrytree_flutter |
| iOS bundle ID | nl.bytesnbits.cherrytreeFlutter |
The iOS value uses the usual camelCase last segment; Android uses snake_case, matching the Dart package name cherrytree_flutter.
- Flutter SDK (stable channel recommended)
- For Android: Android Studio or Android SDK, device or emulator
- For iOS: macOS with Xcode (required to build and archive for the App Store)
git clone https://github.com/huubee/cherrytree-flutter.git
cd cherrytree-flutter
flutter pub get
flutter runThen choose a device or emulator when prompted.
Useful commands:
flutter analyze # Static analysis
flutter test # Unit / widget testsUse the folder icon on the AppBar to import an unencrypted .ctd or .ctb file (replace flow with confirmation). On iOS, the system picker shows all document types; only .ctd/.ctb are accepted afterward — this avoids greyed-out entries in OneDrive and other providers where strict extension filters do not match how the file is exposed. If the provider does not return a file path, the app still imports for that session and keeps a JSON backup in app documents; round-trip to the same CherryTree file may require importing again once we improve path handling (see Unreleased → Known issues in CHANGELOG.md).
Use the save as (export) icon next to import. Choose XML (.ctd) or SQLite (.ctb), then pick a location in the system save dialog. The written files use the same serializers as read-only import; opening them in desktop CherryTree is the next step toward full Spike C round-trip validation.
Example:
flutter build apk --release
# or
flutter build appbundle --releaseThe release APK or App Bundle is produced under build/app/outputs/. Configure signing in Android for Play Store uploads (see Flutter Android deployment).
iOS builds must be done on a Mac.
-
Install Xcode from the Mac App Store and accept the license.
-
Open the iOS workspace in Xcode if you need to adjust signing, capabilities, or version:
open ios/Runner.xcworkspace
-
In Xcode, set your Team and Bundle Identifier (should match
nl.bytesnbits.cherrytreeFlutterunless you use a fork with a different ID). -
From the project root, you can also build from the command line:
flutter build ipa
Or use Product → Archive in Xcode to create an archive, then Distribute App to upload to App Store Connect.
See Flutter iOS deployment for certificates, provisioning profiles, and App Store Connect.
The official CherryTree repository is C++/GTK desktop software. It cannot be run on mobile as-is. This Flutter app reimplements the product experience and, over time, document formats by reading that codebase and its tests as a guide, not by copying the UI layer.
If you want a local checkout of upstream for comparison or format work, clone it next to this project (or add it as a git submodule pinned to a release tag). Do not assume the mobile repo contains a full copy of upstream.
Contributions are welcome: issues, documentation, and pull requests. Before large changes, consider opening an issue to align on scope (especially around file format compatibility and licensing).
This project is licensed under the GNU General Public License v3.0 — see the LICENSE file in the repository root. This matches the license of upstream CherryTree, which helps when implementing compatible document handling. If you have questions about combining or redistributing code, seek appropriate legal advice.
Copyright: © 2026 Hubèrt Huijbregts / bytesnbits.nl and cherrytree_flutter contributors. The domain bytesnbits.nl hosts a small personal page about building and testing apps, not a separate company site. A short summary also appears in NOTICE.
- CherryTree (home)
- CherryTree (GitHub)
- Flutter documentation
- Development guidelines — architecture, state management, persistence, maintainability (file size, DRY, comments)
- AGENTS.md — notes for automation / AI assistants