Skip to content
shubh72010Public

About

Privacy-first Android notes app, with loads of features and clean UI

Topics

Resources

Contributing

Stars

11 stars

Watchers

0 watching

Forks

Latest commit

 

History

25 Commits

Folders and files

Repository files navigation

JusNotes

JusNotes

Modern, privacy-focused notes for Android — spatial maps, markdown, checklists & AI, wrapped in a pill.

release downloads kotlin compose minsdk license

Screenshots • Features • Pill • Build • Architecture • Design


✨ Screenshots

Editor
Editor — markdown + pill toolbar
Note actions
Pill menu — Color / Tags / Preview / Lock / Pin
Preview
Preview — long form, smooth scroll
AI Assist
AI Assist — Summary / Grammar / Rewrite
Settings
Settings — Material You + Vault + Backup
Icon
Icon — light & monochrome variants

Tip: all screens share the same floating Pill — tap to expand, drag to switch tabs, long-press + to create.


🌟 Features

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, ![image](uri). Off-main-thread parsing for large docs.
🖼️ Images images: List<String> uris, Coil 2.5.0 with size(800) — viewport-aware decode. Camera + picker → ![alt](content://…) 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.

💊 Pill Philosophy

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.


🛠️ Stack

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

🚀 Build & Run

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/emulator

Releases are attached to GitHub Releases — CI (release.yml) builds assembleRelease on push to main.


📁 Layout

: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


🔒 Privacy

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.

📄 License

GPL-3.0 — see LICENSE.


Made with ❤️ by flakesofsmth · Star if you like the pill.

About

Privacy-first Android notes app, with loads of features and clean UI

Topics

Resources

Contributing

Stars

11 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages