Modern, privacy-focused notes for Android — spatial maps, markdown, checklists & AI, wrapped in a pill.
Screenshots • Features • Pill • Build • Architecture • Design
Tip: all screens share the same floating Pill — tap to expand, drag to switch tabs, long-press + to create.
| Area | What you get |
|---|---|
| 🗺️ Maps, not folders | Note(isMap=true) + mapItems + linkedNoteIds / [[Wiki]]. Spatial canvas with drag. |
| ✅ Checklists | isChecklist + List<ChecklistItem> with reorderable 2.4.1. Type [] to convert. Now visible on homescreen (NOTES) and filtered in CHECKLISTS tab. |
| ✍️ Markdown | Block renderer — headings, bold/italic/strike, code, tables, quotes, checklists, . Off-main-thread parsing for large docs. |
| 🖼️ Images | images: List<String> uris, Coil 2.5.0 with size(800) — viewport-aware decode. Camera + picker →  embed. |
| 🤖 AI | OpenRouter (minimax/m3:free etc, your key only). Polish / Rewrite / Structure — never stored, DataStore only. |
| 🔒 Secret | isSecret + Biometric, hidden from main feed, isSecretAuthenticated gate. |
| 📌 Pinned | isPinned always on top (sortedWith stable partition) — every tab. |
| 🔍 Search & Tags | Debounced 300ms on title/content/tags, tag chips (allTags), 5 sort orders, selectedMapId filter. |
| 🗑️ Trash | Soft delete isDeleted + deletedTimestamp, 30-day auto-purge on ViewModel.init. |
| 📐 Grid / List | viewMode persisted in DataStore; LazyVerticalStaggeredGrid(2) + LazyColumn with swipe-to-delete/lock. |
| 🎓 Tutorial | 5-step spotlight (hasShownGestureHints), reopen from Settings. |
Every primary destination — Notes / Editor / Map / Settings / Trash / Secret — uses the same floating pill (surfaceContainerHighest, 28dp↔32dp, spring(damping 0.85, stiffness 300)). It is the only chrome: search on the list, actions on the editor. Swipe the pill to switch tabs, drag up to expand, long-press the + to add anywhere. Small API, big consistency.
| Layer | Choice |
|---|---|
| UI | Compose BOM 2024.09.00 + Material 3, Navigation Compose 2.8.5 |
| State | NoteViewModel (AndroidViewModel, all StateFlows, no DI) |
| DB | Room 2.6.1 + KSP (AppDatabase v10, fallbackToDestructiveMigration) — single-source getAllNotes() + lightweight NoteListItem preview projection |
| Async | Coroutines + Flow (debounce, combine, flowOn(Default), produceState for markdown) |
| Prefs | DataStore (SettingsManager) |
| Network | Retrofit + OkHttp + Gson, Coil 2.5.0, Biometric, DocumentFile |
| Build | Gradle 8.13.2, AGP 8.13.2, Kotlin 2.0.21, JDK 21 (CI), version catalog |
git clone https://github.com/shubh72010/DotNotes.git
cd DotNotes
# Linux gotcha — gradle.properties hardcodes Windows jbr, override:
./gradlew assembleDebug -Porg.gradle.java.home=/usr/lib/jvm/temurin-21-jdk
# or: sed -i '/org.gradle.java.home/d' gradle.properties
./gradlew assembleDebug # → app/build/outputs/apk/debug/app-debug.apk (~22M)
./gradlew assembleRelease # R8 + shrinkResources → app/build/outputs/apk/release/app-release.apk (~2.7M)
./gradlew test # includes PerfRegressionTest
./gradlew connectedAndroidTest # device/emulatorReleases are attached to GitHub Releases — CI (release.yml) builds assembleRelease on push to main.
:app (com.jusdots.jusnotes, minSdk 24, target 36, v0.3.1/12)
├── MainActivity.kt — NavHost (list, editor/{id}, map/{id}, settings, trash, secret, tutorial, image_viewer)
├── data/ — Note.kt, NoteListItem.kt, NoteDao.kt, AppDatabase.kt, Converters.kt, NoteRepository.kt, SettingsManager.kt
├── ui/ — NoteViewModel.kt, NoteListScreen.kt (+ GridNoteItem + SwipeableNoteCard), NoteEditorScreen.kt, ...
│ └── components/ — MarkdownBlockView.kt, TutorialOverlay.kt, BlurText.kt, PinnedNotesBar.kt, ...
├── network/ — NetworkModule.kt, OpenRouterApi.kt
├── utils/ — BackupUtils.kt, MarkdownRenderer.kt
└── res/drawable/jusnotes_logo.xml — pill-cross logo
Deep dive: ARCHITECTURE.md · DESIGN_LANGUAGE.md · AGENTS.md · CURRENT_STATE.md
Local-first. Room (note_database) is the source of truth. The only network egress is an OpenRouter call when you tap an AI action, with your key. No telemetry, no Firebase, no crashlytics.
GPL-3.0 — see LICENSE.
Made with ❤️ by flakesofsmth · Star if you like the pill.





