Appointment agenda app (Hourline)
Local-first Expo app for a solo practitioner's bookings: DST-correct Day rail, Week and List views, create/edit/cancel with undo, overlap detection with next-free-time resolution, working hours and breaks, client search, and one-way .ics export.
Creator ($9 a month) includes up to 20 new premium families a billing month (5 in any 24 hours). Already a member? Open your library.
- Version
- 1.0.2
- Platforms
- iOS, Android
- Framework
- expo
- Archive
- 2.1 MB 128 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
- view day, week and 30-day list
- create appointment with client autocomplete and free-slot grid
- edit appointment
- cancel with undo, restore, delete permanently
- detect and resolve overlaps (next free time, move either, intentional double-book)
- working hours and breaks per weekday
- search clients and appointments
- client history
- export .ics and JSON backup
- persist locally across restarts
Screens
agendaDay hour rail, Week proportional strips, List of next 30 days; first-run setup cardappointment-editCreate/edit form with slot grid, validation summary, unsaved-changes guard and conflict reviewappointment-detailDetails, overlap resolution, cancel/undo, restore, delete, .ics exportsearchGrouped client and appointment search with no-results recoveryclientClient contact, notes, upcoming and past appointmentssettingsWeek start, default duration, appearance, time zone, export, backup, sample data, eraseworking-hoursPer-weekday hours and breaks with accessible steppers
States covered
- Loading
- Empty
- First run
- Error
- No results
- Validation
- Destructive confirm
- Undo
- Conflict
- Warning
- Dst gap
- Dst repeat
- Large text
- Dark mode
Stack and versions
| expo | 57.0.25 |
|---|---|
| expo-router | 57.0.23 |
| expo-sqlite | 57.0.3 |
| react | 19.2.3 |
| react-native | 0.86.3 |
| typescript | 6.0.3 |
| jest | 29.7.0 |
| jest-expo | 57.0.5 |
| @testing-library/react-native | 13.3.3 |
| sql.js | 1.14.2 (web preview + tests only) |
Commands:
| install | npm ci |
|---|---|
| dev | npx expo start |
| test | npm test |
| typecheck | npx tsc --noEmit |
| doctor | npx expo-doctor |
| build | npx expo prebuild (or EAS Build); npx expo run:ios | npx expo run:android for development builds |
| e2e | none (native procedure in docs/VERIFICATION.md) |
| web_preview | npx expo export -p web && node scripts/web-preview-screenshots.mjs |
Tested
| Check | Platform | Tool | Result | Date |
|---|---|---|---|---|
| dependency pins for Expo SDK 57 native modules (react-native-reanimated 4.5.1, react-native-worklets 0.10.1, react-native-gesture-handler 2.32): expo install --check, npm audit 0, jest, tsc, expo-doctor, Metro iOS + Android bundles | Node | npm 11 + expo install --check | Pass | 2026-09-26 |
| unit + screen tests (47: DST time math, conflicts, repository, migrations v1->v2, restart persistence, ICS, screens) | Node | jest 29.7 + jest-expo 57 + @testing-library/react-native 13.3 | Pass | 2026-09-26 |
| typecheck | Node | tsc 6.0.3 --noEmit | Pass | 2026-09-26 |
| expo-doctor | Node | expo-doctor (21 checks) | Pass | 2026-09-26 |
| native project generation | Node | expo prebuild --no-install --clean (temp copy) | Pass | 2026-09-26 |
| web export preview screenshots (not native verification) | web | expo export -p web + Playwright Chromium | Pass | 2026-09-26 |
| fresh-copy reproduction from packaged archive (npm ci, npm test, tsc) | Node | npm 10.9 / Node 22.22 | 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 cloud backup: data is local to the device (JSON backup export provided)
- No Google/iCloud/Outlook/CalDAV calendar sync: one-way .ics export via the share sheet only
- No client-facing online booking
- No reminders or notifications
- No payments, deposits or no-show fees
- No recurring appointments or multi-staff/resource scheduling
- No backup/.ics import
- No network calls, analytics or crash reporting
Each boundary comes with instructions for adding it in docs/INTEGRATION-BOUNDARIES.md.
Known limitations
- Times display in the device's current time zone; each appointment records its booking zone and flags differences, but a fixed practice time zone is not supported
- Native iOS/Android runs are pending (web export preview screenshots only so far)
- Database is not encrypted by the app (OS sandbox only); SQLCipher is documented as an extension
- No drag-to-reschedule; rescheduling is by editing or 'move to next free time'
- Web export is a preview target only (sql.js + localStorage storage), not a supported platform
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-premium-appointment-agenda-1-0-2).
Ask your agent
Use Motif to activate the premium-appointment-agenda 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-design-gate-workflow · app-transplant-test-no-generic-template-app · app-visual-identity-system-five-decisions · app-template-tab-fab-onboarding-budgets · app-hard-fail-signatures-static-checks · app-functional-truth-rulings · app-category-productivity · app-local-persistence-choice-expo · app-sqlite-data-model-offline-first · app-destructive-actions-undo-vs-confirm · app-swipe-actions-with-accessible-alternatives · app-dynamic-type-and-font-scaling · app-react-native-accessibility-semantics · app-theming-light-dark-system · app-platform-conventions-vs-brand · app-screen-state-matrix · app-form-validation-feedback · app-permission-requests-and-recovery
Archive
SHA-256 343a56fb19ac89e8f3419338ebf35dca5b6abdd87e5fb5b20ea6396cfeaf8988