Commonplace — collection app starter (Expo)
A local-first iOS/Android app for saving books, articles, links, ideas and quotes: collections, tags, debounced search, detail, validated create/edit, undoable delete, light/dark, spacious/compact density, JSON export. SQLite with migrations.
Sign in (or create a free account; no card), then find it in your library.
- Version
- 1.0.1
- Platforms
- iOS, Android
- Framework
- expo
- Archive
- 3.5 MB 199 files
Screens from the build
(open full size)
(open full size)
(open full size)
(open full size)
(open full size)
(open full size)App screenshots may come from an Expo web export; those are labelled as such and are not native verification. Native runs are listed under Tested with their own status.
What it does
- onboarding (skippable, remembered)
- create item
- edit item
- organise into collections
- tag and filter by tag
- search with type filter
- delete with undo / restore from Recently deleted
- switch theme and density
- export library as JSON
- persist across restart
Screens
onboardingTwo skippable steps; start empty or with labelled sample itemslibraryCollections with counts and recently added itemscollectionItems in a collection (or all) with sort and densityitem-detailItem facts, link, tags, notes, catalogue slip; edit/share/deleteitem-newCreate item modal with inline validationitem-editEdit item modal with unsaved-changes guardsearchDebounced search, type chips, recent searches, no-results recoverytagsCreate, rename and delete tagstag-itemsItems filtered by tagsettingsTheme, density, export, Recently deleted, samples, erasetrashRestore or permanently delete (30-day retention)aboutVersion, data location, integration boundaries, acknowledgementscollection-formName or rename a collectiontag-formRename a tag
States covered
- First run
- Empty
- Loading
- Error
- No results
- Validation
- Destructive confirm
- Undo
- Not found
- Unsaved changes
Stack and versions
| expo | 57.0.25 |
|---|---|
| react | 19.2.3 |
| react-native | 0.86.3 |
| expo-router | 57.0.23 |
| expo-sqlite | 57.0.3 |
| typescript | 6.0.3 |
| jest | 29.7.0 |
| jest-expo | 57.0.5 |
| @testing-library/react-native | 13.3.3 |
Commands:
| install | npm ci |
|---|---|
| dev | npx expo start |
| test | npm test |
| typecheck | npx tsc --noEmit |
| doctor | npx expo-doctor |
| build | npx expo run:ios | npx expo run:android (local native builds) or eas build |
| web_preview | npm run export:web && npm run preview:web |
| e2e | manual native script in docs/VERIFICATION.md §3 |
Tested
| Check | Platform | Tool | Result | Date |
|---|---|---|---|---|
| dependency audit after overrides (decode-uri-component 0.5.0, uuid 11.1.1): 0 known vulnerabilities; jest, tsc, expo-doctor, Metro iOS + Android bundles re-run | Node | npm audit (npm 11) | Pass | 2026-09-26 |
| unit + screen tests (50 tests, 7 suites) | Node | jest 29.7.0 + jest-expo 57.0.5 + @testing-library/react-native 13.3.3 | Pass | 2026-09-26 |
| type check | Node | TypeScript 6.0.3 (tsc --noEmit) | Pass | 2026-09-26 |
| Expo dependency/config checks | Node | expo-doctor (21 checks) | Pass | 2026-09-26 |
| native project generation (not compiled) | Node | expo prebuild --no-install | Pass | 2026-09-26 |
| web export preview screenshots (web export preview — not native verification) | web_preview | expo export --platform web + Chromium (Playwright) at 390x844 and 412x915 | Pass | 2026-09-26 |
| fresh-copy reproduction from packaged archive (npm ci, npm test, tsc, expo-doctor) | Node | npm ci + jest + tsc | Pass | 2026-09-26 |
| Release build of this archive: install, launch, relaunch, dark mode; no crash reports | iOS | iOS Simulator (iPhone 17 Pro, Xcode 27) | Pass | 2026-09-26 |
| Release build of this archive: install, launch, relaunch, dark mode; no crash in logcat | Android | Android Emulator (Pixel 9) | Pass | 2026-09-26 |
Not included
- No account system or sign-in: the library is local to the device
- No cloud sync or backup: JSON export via the share sheet is the only copy
- No push or local notifications; no permissions are requested
- No in-app purchases
- No analytics, crash reporting or telemetry; the app makes no network requests of its own
- No import screen (tested importLibrary() function provided); no item images
Each boundary comes with instructions for adding it in docs/INTEGRATION-BOUNDARIES.md.
Known limitations
- Native iOS/Android runs not yet performed (pending); only Node tests, type checks, expo-doctor, prebuild and web-export previews were run
- Native tabs use expo-router/unstable-native-tabs (SDK 57); a JavaScript-tabs fallback exists for web
- Phone-first layout; no tablet split view
- Deleting the app deletes the library unless it was exported
- Web export is a preview only (expo-sqlite web is alpha and needs COOP/COEP headers)
- Swipe gestures, haptics and screen-reader behaviour are verified only by the native script, not by Jest
Licence
Use in unlimited end products incl. client/commercial; no resale/redistribution as a template, kit or dataset; no ML training. Survives cancellation for delivered versions.
Full terms: Motif template licence. Open-source parts keep their own licences (licenses.json, id lic-free-app-collection-1-0-1).
Ask your agent
Use Motif to activate the free-app-collection template and download it. Then adapt it for a climbing gym's route log: replace the content and imagery, keep the design tokens and every state in docs/STATE-MATRIX.md, and run check_design_contract before you finish.Motif guides applied
app-collection-app-reference-architecture · app-design-gate-workflow · app-transplant-test-no-generic-template-app · app-template-tab-fab-onboarding-budgets · app-anti-pattern-website-in-a-phone-frame · app-functional-truth-rulings · app-hard-fail-signatures-static-checks · app-visual-identity-system-five-decisions · app-platform-conventions-vs-brand · app-tab-bar-implementation-expo-router · app-back-navigation-ios-android · app-modal-sheet-or-push-selection · app-collection-list-vs-grid-and-row-anatomy · app-item-detail-screen-anatomy · app-density-compact-and-spacious-modes · app-empty-states · app-screen-state-matrix · app-error-and-offline-states · app-form-validation-feedback · app-form-keyboard-handling-expo · app-save-model-and-unsaved-changes-guard · app-search-placement-and-behavior · app-search-filters-and-no-results-recovery · app-destructive-actions-undo-vs-confirm · app-trash-and-soft-delete · app-swipe-actions-with-accessible-alternatives · app-local-persistence-choice-expo · app-sqlite-data-model-offline-first · app-onboarding-first-value · app-settings-screen-architecture · app-theming-light-dark-system · app-dynamic-type-and-font-scaling · app-touch-targets-and-spacing · app-safe-areas-and-edge-to-edge · app-react-native-accessibility-semantics
Archive
SHA-256 d10c8a89b8fa00b464a79e92f5118fe4c38a45c88b1f31b4e9616ea544f87233