QuickStack is an Android fast-capture app built around the Quick Settings Tile.
The goal is simple: pull down Quick Settings, tap the tile, capture something useful in a few seconds, then get out.
QuickStack currently supports:
- quick text notes
- clipboard capture
- pinned note or clipboard notifications
- quick reminder presets
- a quick 10-minute reminder flow
- a local inbox/history
- lightweight settings for language and time-action presets
Quick Settings Tilefirst: capture starts from the fastest Android surface available- minimal actions: note, clipboard, reminder, and timer presets without form-heavy flows
- local-first: everything stays on device with native Android persistence and notifications
This repository contains a working MVP foundation.
Implemented today:
- Quick Settings Tile entry point
- full-screen quick capture flow
- quick note save
- pinned note notifications
- clipboard save
- pinned clipboard notifications
- reminder preset: in 1 hour
- reminder preset: tonight
- quick 10-minute reminder preset
- Room-backed inbox/history
- delete, dismiss, and complete flows
- triggered reminder/timer notifications
- settings screen for language and time-action presets
Not implemented:
- custom reminder text
- snooze
- edit or reschedule flows
- reboot rescheduling
- exact alarm permission flow
- sync, backend, accounts, analytics, widgets
QuickStack is intentionally narrow.
- fast capture over feature breadth
- minimal taps over rich editing
- native Android behavior over custom complexity
- local-first data over cloud features
The tile is the primary entry point. One tap opens Quick Capture directly from Quick Settings.
Full-screen fast capture for notes, clipboard actions, reminders, and timer presets.
Local inbox/history for saved, pinned, scheduled, and completed items.
Language selection, time-action presets, and app version in a lightweight settings area.
Pinned items stay visible, while reminder and timer triggers arrive as actionable notifications.
- Kotlin
- Jetpack Compose
- Material 3
- Hilt
- Room
- AlarmManager
- Android notification APIs
- TileService
Package name:
com.davideagostini.quickstack
.
|-- app/
| |-- build.gradle.kts # Android application module
| |-- src/main/
| | |-- AndroidManifest.xml # Activities, receivers, tile service, permissions
| | |-- java/com/davideagostini/quickstack/
| | | |-- QuickStackApp.kt # Application class
| | | |-- MainActivity.kt # Main launcher activity
| | | |-- core/
| | | | |-- Localization.kt # App locale helpers
| | | | |-- NotificationPermission.kt
| | | | |-- ui/ # Theme, colors, typography, shared UI primitives
| | | | `-- viewmodel/ # Base ViewModel abstractions
| | | |-- data/
| | | | |-- local/
| | | | | |-- QuickStackDatabase.kt
| | | | | |-- dao/ # Room DAO interfaces
| | | | | `-- entity/ # Room entities and type converters
| | | | `-- repository/ # Storage, clipboard, and settings repositories
| | | |-- di/
| | | | `-- AppModule.kt # Hilt dependency graph
| | | |-- domain/
| | | | `-- model/ # Unified quick-item model, item types, drafts, sources
| | | |-- navigation/
| | | | |-- QuickStackNavigation.kt
| | | | `-- Screen.kt
| | | |-- feature/
| | | | |-- capture/ # Quick capture flow from launcher/tile
| | | | | |-- components/ # Capture-specific composables
| | | | | `-- model/ # Capture UI state and events
| | | | |-- home/ # Inbox/history screen
| | | | | |-- components/ # Item rows and list UI
| | | | | `-- model/ # Home state and events
| | | | |-- notifications/ # Notification actions and rendering
| | | | |-- reminders/ # Alarm scheduling, receiver, time calculation
| | | | `-- settings/ # Language and preset settings UI/state
| | | | |-- components/
| | | | `-- model/
| | | `-- tile/
| | | `-- QuickStackTileService.kt
| | `-- res/
| | |-- drawable/ # App and tile assets
| | |-- font/ # Shared app font
| | |-- mipmap-*/ # Launcher icons
| | `-- values*/ # Theme, colors, strings, localized resources
| `-- src/test/java/com/davideagostini/quickstack/
| |-- domain/model/ # Draft and item-state tests
| `-- feature/reminders/ # Reminder scheduling tests
|-- gradle/libs.versions.toml # Centralized dependency versions
|-- build.gradle.kts # Root build configuration
|-- settings.gradle.kts # Module includes and plugin management
|-- CONTRIBUTING.md
`-- README.md
Main package responsibilities:
core: shared Android/app utilities, theme system, and reusable UI/viewmodel base piecesdata: Room persistence, entity mapping, clipboard access, and settings persistencedomain: app-level models used across features without UI or storage detailsnavigation: top-level Compose navigation graph and route definitionsfeature/capture: full-screen quick capture surface, quick actions, and note/clipboard/reminder entry flowsfeature/home: inbox/history presentation, deletion, completion, and item actionsfeature/notifications: persistent and actionable notifications plus broadcast action handlingfeature/reminders: reminder/timer scheduling logic built onAlarmManagerfeature/settings: lightweight preferences UI for localization and capture presetstile: Android Quick Settings Tile integration and tile tap entry point
QuickStack uses a small MVVM structure.
domaindefines the unified quick item modeldataowns Room, DAOs, entity mapping, and repositoriesfeature/*owns screen-specific state and UInotificationshandles pinned and triggered notificationsremindershandles AlarmManager scheduling and alarm receiverstileexposes the Quick Settings Tile entry point
Runtime flow:
- The user opens QuickStack from the launcher or the Quick Settings Tile.
QuickCaptureActivityshows the capture flow.CaptureViewModelvalidates input and creates items throughQuickItemRepository.- Pinned items are shown through
QuickStackNotificationManager. - Reminder and timer presets are scheduled through
ReminderScheduler. HomeViewModelobserves local storage and updates the inbox/history.
Requirements:
- Android Studio recent stable
- Android SDK installed locally
- JDK 23 available to Gradle
If needed, create local.properties locally:
sdk.dir=/Users/<your-user>/Library/Android/sdklocal.properties should not be committed.
Build debug:
./gradlew assembleDebugRun unit tests:
./gradlew testDebugUnitTestBuild release:
./gradlew assembleRelease- reminders and timers are not rescheduled after device reboot
- reminder and timer presets are fixed, not free-form
- some new settings strings may still fall back to English in non-default locales
- reminder/timer dismiss vs complete are not stored as distinct final states
- delivery can be slightly delayed under doze or battery restrictions
Short, practical next steps:
- Reboot rescheduling for pending reminders and timers
- Better reminder/timer state semantics and optional snooze
- More polish on quick capture and settings UI
- Complete localization coverage for settings
- Expand a few repository and state tests
See CONTRIBUTING.md for contribution guidelines, branch naming, and PR title conventions.
This repository is published under Apache-2.0.
- localize the new user-facing message strings in all supported languages
- add more tests for Room-backed item state transitions
- add reboot rescheduling for pending reminder/timer items
- refine
LanguageandTime actionsscreens to match the home grouped-list style more closely






