StickySpace is an offline Android app that lets you leave sticky notes in physical space using AR.
You create places (desk, kitchen, desk again…), walk around with the camera, aim at a wall or empty air, and stick notes there. Notes can be plain text, to-dos, or ideas - with optional sketches. Everything is stored on the phone (Room / SQLite). There is no account and no cloud.
Latest APK: StickySpace-1.6.1.apk
Needs an ARCore-supported phone. Install the APK and allow installs from your browser/files app if asked.
| Feature | What it means |
|---|---|
| Places | Named rooms / spots you open into AR |
| Folders | Group places on the home screen |
| AR placement | Aim → set Near / Mid / Far (or a slider) → Place note |
| Note types | Text, To-do checklist, Idea |
| Colors + sketch | Paper-style stickies with optional drawing |
| Room lock | Capture a textured landmark so notes hold across app restarts |
| Tap to delete | Tap a floating sticky to remove it |
Without a lock, note positions are relative to a temporary AR session origin. When the app dies, ARCore starts a new world - so notes look wrong next time. That is an ARCore limitation, not a “forgot to save” bug.
Lock grabs a unique textured thing in the room (poster, art, patterned object) as an ARCore Augmented Image. Sticky poses are then stored relative to that landmark, so reopening the place and looking at the same spot brings them back.
How to use it
- Place some notes (or lock first - both work).
- Tap the lock icon and aim at something textured.
- Point at that same spot again until status says the lock is bound / found.
- Leave AR and come back later - look at the lock spot to recover positions.
| Layer | Choice |
|---|---|
| Language | Kotlin |
| UI | Jetpack Compose + Material 3 |
| Navigation | Navigation Compose |
| AR | Google ARCore via SceneView arsceneview:2.3.0 |
| Local DB | Room (SQLite) - file stickyspace.db |
| Min / target SDK | 24 / 35 |
| Version | 1.6.1 (versionCode 9) |
Fully offline. Drawings and lock photos are files under the app’s private storage; metadata lives in Room.
app/src/main/java/com/stickyspace/app/
├── MainActivity.kt # Entry: theme + navigation
├── StickySpaceApp.kt # Application: builds Room DB + NoteRepository
├── data/
│ ├── Entities.kt # Folder, Place, Note (+ NoteType, colors)
│ ├── Daos.kt # Room DAOs
│ ├── AppDatabase.kt # DB definition (v5)
│ └── NoteRepository.kt # Single API for UI: CRUD, landmarks, sketches
└── ui/
├── StickySpaceNav.kt # home ↔ AR({placeId})
├── theme/Theme.kt
├── home/
│ ├── HomeScreen.kt # Places / folders / FAB
│ └── HomeViewModel.kt
├── ar/
│ └── ArNotesScreen.kt # Camera, placement, lock, projection
├── compose/
│ └── NoteComposerDialog.kt # Text / todo / idea + draw pad
└── components/
└── PaperStickyNote.kt # On-screen paper sticky widget
StickySpaceAppcreatesAppDatabaseand aNoteRepository.MainActivitywraps UI inStickySpaceThemeand startsStickySpaceNav.- Navigation is two screens only:
home→ manage folders & placesar/{placeId}→ live AR for that place
- Folder - optional grouping for places.
- Place - a named location. Optional
landmarkPath/landmarkWidthMetersfor room lock (isLockedwhen landmark path is set). - Note - belongs to a place (
CASCADEdelete). Stores text, type, color, optional sketch file path, and local pose(localX, localY, localZ)relative to the current origin (session plane/camera or locked landmark).
NoteRepository is the only layer screens talk to for persistence: create/move/delete places & folders, add/delete notes, save/clear landmarks, remap poses after lock.
HomeScreen + HomeViewModel observe folders and places as Flows. You can create places/folders, expand folders, move places between folders, delete, and open a place into AR.
ArNotesScreen hosts an ARSceneView and does the hard work:
- Camera permission - requested on entry.
- Session config - horizontal + vertical planes, instant placement, depth when supported, optional Augmented Image DB when the place is locked.
- Origin
- Unlocked: session origin from a tracked plane (or camera-forward fallback).
- Locked: Augmented Image center pose once the landmark is fully tracked.
- Placement - “Place note here” (or tap) puts a pose at camera-forward × distance (Near / Mid / Far / slider). Opens the composer sheet.
- Composer - builds TEXT / TODO / IDEA (+ optional bitmap sketch). Repository writes the row + sketch file with local coords.
- Rendering - each frame projects saved notes to screen as Compose
PaperStickyNotes (not 3D models). Size scales with depth so farther stickies look smaller. Off-screen / behind-camera notes are hidden. - Room lock - captures a center-cropped camera frame as a landmark JPEG, enables Augmented Images on the live session, and remaps existing note locals from the old session origin into landmark space when the lock spot is first found.
- Unlock - clears landmark files/DB fields and remounts AR in session mode.
Helper bits in the same file: origin anchors, screen projection matrices, light smoothing of sticker XY so they don’t jitter every frame.
NoteComposerSheet- type chips, color dots, text/checklist fields, finger-draw canvas.PaperStickyNote- paper look used both in the composer preview and floating over the camera feed.
Requirements: Android Studio (or JDK 17 + Android SDK), local.properties with sdk.dir=....
set JAVA_HOME=C:\Program Files\Android\Android Studio\jbr
gradlew.bat assembleDebugOutput: app/build/outputs/apk/debug/app-debug.apk
Release downloads use the renamed asset: StickySpace-1.6.1.apk.
- Unlocked places will drift after kill/restart - use Room lock for persistence.
- Lock needs a textured real-world patch; blank walls fail often.
- Schema bumps currently use Room
fallbackToDestructiveMigration()- upgrading DB version can wipe local data. - Debug APK is signed for sideloading / demos, not Play Store release signing.
MIT Personal / portfolio project. Demo-quality: great for showing offline AR + Compose + Room; not polished product shipping.