Android emulator capture of a development build, with sample scores.
If you keep a few hundred scanned or exported scores as plain PDFs, a file manager gives you file names and nothing else; nothing can search the printed text inside a scan. Notae adds a private catalogue on top of your existing folder and leaves the PDFs exactly where they are. It does not render or annotate scores itself: it hands each PDF to the viewer you already use.
Ctrl K focuses search when a
hardware keyboard is attached; a microphone action appears when Android
provides a speech recognizer. Search ignores case and Polish diacritics:
ą ć ę ń ó ś ź ż match their plain letters and ł/Ł match l/L, so
lodz finds Łódź in titles, composers, tags and lyrics..notae-set file plus a
readable list, with or without your set notes. Never PDFs or score notes.
The receiver sees a review of matched and unmatched scores first.<number> - <title>.pdf file names and re-indexes incrementally by
SHA-256 content hash, so a renamed file stays one record.
Search titles, composers, tags and lyrics. |
Preview with details and an Open score action. |
List view for dense libraries. |
Dark theme follows the system setting. |
All screenshots are real captures from an Android 15 tablet emulator (2560×1600) of the v0.2.1 development build, showing sample scores, not from a physical tablet.
Notae reads the folder you pick through Android’s Storage Access Framework and builds its own private index from it.
flowchart LR
subgraph tablet["Android tablet"]
files[("Library folder<br/>PDFs")]
app["Notae<br/>scan, browse, search,<br/>edit details"]
viewer["Your PDF viewer<br/>(Samsung Notes, ...)"]
files -->|"folder grant (SAF)"| app
app -->|"open score"| viewer
end
Notae never syncs or uploads anything. There is no on-device OCR yet; ADR 0001 accepts it as a manual, foreground step (#28), not yet built.
[!NOTE] Notae is young. 0.5.0 rebuilds the app in Jetpack Compose with a new app id,
com.c2yz.notae: it installs beside 0.3.0 or 0.4.0 instead of updating it. Use Export sets in the old app first and import the file on 0.5.0’s first screen to keep your favorites and sets (see the changelog). Please report anything odd.
Notae ships one Android artifact: a signed arm64 APK for Android phones and tablets with Android 8.0 (API 26) or newer, attached to each GitHub Release. The release workflow builds, signs and verifies it from the release tag.
notae-<version>-arm64.apk and its .sha256 from the
latest release.Verify it. The checksum only catches a corrupted download; the signature check is what proves the APK came from the Notae release key.
V=0.7.0
sha256sum -c "notae-$V-arm64.apk.sha256"
apksigner verify --print-certs "notae-$V-arm64.apk" \
| grep -i 'SHA-256 digest: be27cd781766c5c28a9db106c07b051ceee4e0003105964595e2a848f371f601'
apksigner ships with the Android SDK build tools. The grep must print
one line; if it prints nothing, do not install the APK. The same
fingerprint, in the usual colon-separated form, is published in
docs/android-release.md and pinned in
.github/workflows/release.yml:
BE:27:CD:78:17:66:C5:C2:8A:9D:B1:06:C0:7B:05:1C:EE:E4:E0:00:31:05:96:45:95:E2:A8:48:F3:71:F6:01
adb install "notae-$V-arm64.apk".[!WARNING] Installed a self-built (debug) APK before? Uninstall it first. Android will not update an app signed with a different key, and uninstalling deletes Notae’s local data (folder access, index, metadata edits) but never your PDFs. Releases all use one key, so later upgrades work in place.
1. Put your PDFs in a folder on the tablet. Name them
<number> - <title>.pdf (for example 12 - Autumn Leaves.pdf) to get a number
and title for free; other names work and simply have no number.
2. Open Notae and choose the folder. Tap Choose score folder, pick the folder in the Android picker, allow access, then start a scan from the Library. Notae indexes the PDFs. Coming from 0.3.0 or 0.4.0? Tap Import from a previous Notae first and pick the file the old app’s Export sets wrote. The import carries your favorites and sets only: details you edited (number, title, composer, tags) and the Recent list stay in the old app. Keep the old app installed until you have checked that 0.5.0 has what you need.
Ctrl K), type, and narrow by scope chip..notae-set file in Notae (or use Import sets in Settings) and
check the review.scripts/check.sh runs the quality gates (format, Clippy, tests, docs,
cargo deny, coverage, and the Gradle lint, tests, screenshot checks and
release build); see CONTRIBUTING.md.
crates/
notae-domain/ Filename convention, note metadata, file identity.
notae-index/ SQLite persistence, FTS5 search and the
rescan reconciler.
notae-app-core/ The app logic (state, stores, browse, search, sets,
scans) behind a UniFFI API for the Kotlin app.
apps/
notae-android/ The Android app (Gradle): Jetpack Compose UI and the
Storage Access Framework, PDF and speech platform code.
docs/ Release procedure, engineering standards, debugging guide,
design spec and plans.
The UI is Kotlin with Jetpack Compose; the app logic is Rust. Domain logic, indexing, search, sets and the screen state live in the host-tested crates; the Kotlin app draws the core’s snapshots and adds the platform code. The product scope and architecture are in the design spec.
INTERNET permission. Check an APK yourself:
aapt2 dump permissions notae-$V-arm64.apk prints only the package name and
AndroidX’s DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION, an app-private
permission that keeps the app’s internal broadcasts to itself.
The Rust core’s Android dependency graph
(cargo tree -p notae-app-core --no-default-features --target aarch64-linux-android)
contains no HTTP client, TLS or async-network crates. There are no accounts and no
telemetry.Found a vulnerability? Follow SECURITY.md and report it
privately.
ROADMAP.md: what is being built now, next and later.GLOSSARY.md: the domain terms (library, score, scope,
set, …).CONTRIBUTING.md: setup, quality
gates and the development workflow from issue to release.docs/android-release.md: cutting a release,
signing and verification.docs/android-debugging.md: emulator setup,
crash-log capture and the UI verification checklist.docs/engineering-standards.md: quality
gates and standards audit.docs/release-notes/ and
CHANGELOG.md: what changed in each release.Bug reports, ideas and pull requests are welcome. Start with
CONTRIBUTING.md for the development setup, quality gates,
commit conventions and what must never be committed.
What comes next is in ROADMAP.md.
Notae is released under the MIT License. Third-party dependencies
keep their own licenses; for the Rust crates the accepted set is enforced by
cargo deny (deny.toml).