Want to remember anything or get notified? Just PinIt.
Pin notes, lists, links, contacts, locations, QR codes, audio, images, PDFs and apps — straight to your notification shade and home screen.
Android 10 or newer · ~80 MB · Free forever
Want to remember anything or get notified? Just PinIt.
That's the whole pitch. PinIt is an Android notes app that turns every type of saved item — a checklist, a phone number, a map location, a QR code, a voice memo — into something you can actually act on without opening the app. Pin a checklist to your notification shade and tick items from there. Pin a contact and call them with one tap. Drop a location on the home screen and navigate to it instantly. Set a reminder and the note pings you at exactly the right moment.
It is built from scratch with Material 3, Jetpack Compose, and Room.
PinIt is distributed exclusively through GitHub Releases. There is no Play Store listing — pre-built APKs are signed and posted to the releases page for every tagged version.
| Type | What it does |
|---|---|
| Note | Rich-text notes with inline bold / italic / underline / strikethrough |
| Checklist | Tap-to-tick items with reorder, plus add-from-notification |
| QR code | Scan with camera or import from gallery, save back to gallery |
| Link | Auto-fetched preview card with title, description, hero image, video badge |
| Contact | Name + phone with system contact picker, one-tap dial |
| Location | OpenStreetMap pin with search, tap-to-place, current-location FAB |
| App list | Curated row of installed apps you launch together |
| Image | Picker or share-to-app, full-screen preview |
| Document picker, first-page thumbnail, native viewer | |
| Audio | In-app voice recorder with shared playback across notification, widget, card |
Every note can be pinned to the notification shade with a custom layout that matches its type — checkboxes for lists, big-picture QR codes, dial buttons for contacts, navigate buttons for locations, play/stop for audio. Pins survive reboot.
Ten Create widgets (1×1 shortcuts to start a new note of a specific type — tap and you're straight into the editor) and ten Add widgets (live-rendering tiles bound to one of your existing notes — they show real content, not just a shortcut). Each widget is type-specific in size: the checklist widget is portrait, the contact widget is short and wide, the image widget is a 3×3 square. All sizes fixed for consistency, no resize-to-mush.
Mark any note as locked and biometric (fingerprint / face / PIN) auth gates access. The home screen still shows the card, but blurred — you can see that a private note exists in its slot without leaking the contents. Tapping prompts for auth before opening; the lock state also blocks the card's quick actions (copy, share, call) until you unlock.
Five sort orders: Newest first, Oldest first, Title A→Z, Title Z→A, and Manual. Pick Manual and the home screen enters reorder mode — long-press any card to grab it, drag to reposition, watch the staggered grid auto-flow around your finger. Tick (✓) saves the new order; cross (✗) discards. Saved order survives restarts.
Apply any number of labels to a note. The Labels tab browses every label you've made with a count badge per label; tap one to filter the home screen down to just those notes. Rename or delete labels with full undo — deleting a label strips it off every note that had it, but undo restores the exact prior label state per note (matters when notes had multiple labels).
Two ways to back up, your choice:
- Online (Google Drive) — Sign in with Google once, and PinIt creates a
PinIt/folder in your My Drive. Your notes, audio recordings, labels, and reminders sync as a singlepinit_backup.pinitfile. The app uses the DRIVE_FILE scope, which means it can only see and modify files it created — it has zero access to anything else in your Drive. Sign in on a new device and PinIt auto-merges cloud + local by note timestamp so nothing gets lost. - Offline (local file) — One tap writes a timestamped
pinit_backup_<date>.pinitfile to yourDownloads/PinIt/folder. Visible in any file manager, transferable over USB, restorable anytime. No account required.
Both formats are the same plain JSON inside, so an offline backup taken on one device can later be uploaded to Drive (or vice versa).
Every note can carry a scheduled reminder with custom text. Pick a date and time in the editor, type whatever you want the alert to say ("call dentist", "leave for airport", "take medicine"), and PinIt fires an exact alarm at that moment — full notification, sound, vibration, and the note ready to open in one tap.
Under the hood it uses AlarmManager.setExactAndAllowWhileIdle, which means:
- ⏰ Exact timing — alarms fire to the second, not on Android's "approximate" batch schedule. A 9:00 reminder fires at 9:00, not 9:14.
- 🌙 Doze-resistant — the
AndIdlepart lets the alarm wake the device even from deep Doze sleep, so a reminder set the night before still fires on time in the morning. - 🔁 Reboot-safe —
BootReceiverre-arms every pending reminder when your phone restarts, so a reminder you set today still fires next Tuesday after a reboot in between. - 🛡️ Permission-aware — on Android 12+, exact alarms need the
SCHEDULE_EXACT_ALARMpermission. PinIt asks for it during onboarding with a clear explanation; if you skip it, reminders downgrade gracefully to inexact (still fires, just within a ~10-minute window).
Reminders show as a small bell on the note's card so you can see at a glance which ones are scheduled, and the reminder text is preserved across edits — change the note body without losing the alarm.
- Archive — long-press to enter selection mode, archive in bulk with undo, or browse archive separately
- Pinned tab badge — count of currently-pinned notes shown on the bottom nav
- Share-to-PinIt — receive text, links, images, or
.icscalendar files from any app - ICS import — drop a calendar invite and it becomes a checklist or note
- Material You theming — light / dark / system, dynamic colour where supported
- Onboarding — first-launch pager walks new users through features, sign-in, and permission grants
- ❌ No ads, ever
- ❌ No premium tier, no paywall, no "PinIt Pro"
- ❌ No analytics, no telemetry, no third-party trackers
- ❌ No account required for the core app — sign-in is opt-in for cloud backup only
- ❌ No data collection. Network calls happen only when you fetch a link preview or move the map; everything else stays on your device.
PinIt is distributed exclusively through GitHub Releases. There is no Play Store listing — pre-built APKs are signed and posted to the releases page for every tagged version.
Note for first install: because PinIt isn't on the Play Store, you'll need to allow your browser or file manager to install unknown apps the first time. Android will prompt you with a one-time toggle.
- Android Studio Ladybug (2024.2) or newer
- JDK 11
- Android SDK 36 (compileSdk) — minimum target Android 10 (API 29)
git clone https://github.com/hawatri/PinIt.git
cd PinIt
./gradlew assembleDebug # macOS / Linux
gradlew.bat assembleDebug # Windows PowerShellThe debug APK lands in app/build/outputs/apk/debug/app-debug.apk.
./gradlew installDebug
adb shell am start -n com.hawatri.pinit/.MainActivityThe release build is wired to read its signing credentials from a keystore.properties file at the project root (gitignored). Generate a keystore if you don't have one:
keytool -genkey -v -keystore pinit_keystore -alias pinit -keyalg RSA -keysize 2048 -validity 10000Then create keystore.properties next to gradlew.bat with the matching values:
storeFile=pinit_keystore
storePassword=YOUR_STORE_PASSWORD
keyAlias=pinit
keyPassword=YOUR_KEY_PASSWORDAnd build:
./gradlew assembleReleaseThe signed APK lands in app/build/outputs/apk/release/app-release.apk.
If you fork PinIt and want online backup to work in your build, you'll need to register your own OAuth client in Google Cloud Console — Drive API enabled, Android client with your package name and your keystore's SHA-1 fingerprint. The default build is set up for the upstream project; a forked build will hit DEVELOPER_ERROR (status code 10) until you wire up your own client. See IMPLEMENTATION_LOG.md for the full walk-through.
MVVM with Room + Compose Navigation. Single ViewModel, StateFlow-based state, Compose-driven UI.
data/ → Room database (Note, NoteDao, NoteDatabase, Converters, NoteType)
viewmodel/ → PinItViewModel
ui/ → Compose screens, FAB menu, NoteCard, LabelsEditor, IcsImportSheet, OnboardingScreen
backup/ → GoogleAuthManager, DriveBackupManager, BackupSyncManager, PinItBackup
receiver/ → NotificationReceiver, AlarmReceiver, BootReceiver
util/ → NotificationHelper, ReminderHelper, QrUtils, PdfUtils, AudioPlayback
widget/ → 20 widget providers + shared renderer / config / service
Type-specific data (LinkNoteData, LocationNoteData, etc.) is stored as JSON inside note.text, parsed via Gson. Database migrations are data-preserving — no fallbackToDestructiveMigration anywhere.
| Library | Purpose |
|---|---|
| Kotlin 2.0 + Coroutines | Language and async |
| Jetpack Compose (Material 3) | UI |
| Compose Navigation | Screen routing |
| Room 2.7 + KSP | Local database |
| CameraX + ML Kit Barcode | QR scanning |
| osmdroid | OpenStreetMap (no API key) |
| ZXing | QR generation |
| Coil | Image loading and Google account avatar |
| Jsoup | Link metadata extraction |
| androidx.biometric | Locked-note auth |
| Gson | JSON serialisation for typed note bodies and .pinit backups |
| Google Sign-In + Drive REST v3 | Optional cloud backup (DRIVE_FILE scope only) |
| sh.calvin.reorderable | Drag-to-reorder for the staggered grid |
PinIt asks only for what each feature needs, when it's needed:
POST_NOTIFICATIONS— pinned-note shade entries (Android 13+)SCHEDULE_EXACT_ALARM/USE_EXACT_ALARM— remindersCAMERA— QR scanning (gallery import works without it)READ_CONTACTS— contact pickerACCESS_FINE_LOCATION/COARSE_LOCATION— current-location FAB onlyRECORD_AUDIO— voice memosUSE_BIOMETRIC— locked notesRECEIVE_BOOT_COMPLETED— re-post pinned notifications after restartINTERNET— link previews, OSM map tiles, Drive backupGET_ACCOUNTS— list Google accounts for sign-in (only used during the picker)
No analytics, no ads, no third-party trackers. The app talks to the network only when you load a link preview, scroll a map, or run a backup.
PinIt's privacy story is short: everything stays on your device, unless you explicitly back it up.
- All notes, audio recordings, labels and reminders live in Room (the device's local database) and
filesDir(your audio recordings). - Cloud backup is opt-in. Until you tap "Sign in with Google," the app makes zero authenticated network calls.
- When you sign in, PinIt requests only the DRIVE_FILE scope — meaning it can read and write files it itself created in your Drive, and nothing else. It can't see your other documents, photos, or shared drives.
- Backups are written to your Google Drive (
My Drive/PinIt/), in your account. PinIt does not run a server, does not have its own database, and does not see your backup contents — the data goes from your phone to your Drive directly. - Offline backups are written to your local
Download/PinIt/folder. No network involved. - No analytics SDKs are included. No crash reporters. No telemetry of any kind.
Found a bug or have an idea? Just open an issue — that's the easiest way to get in touch. You can also tap Report an issue in the app's Settings screen, which opens your mail app pre-addressed to kiahawatri@gmail.com.
- Ruppu — the original inspiration for the multi-type pin concept
- OpenStreetMap — tiles and geocoding for the location feature
- Material Design 3 — the visual system PinIt is built on
PinIt is released under the MIT License. You're free to use, modify, and distribute it, including for commercial purposes — just keep the copyright notice intact.































