Created: January 10, 2026
Status: Pre-release checklist
Goal: Identify gaps between SDR/roadmap claims and actual implementation
The roadmap claims v0.1.0 MVP is complete, but several features are placeholders or partially implemented. This document lists all issues that need resolution before v0.1.0 can be considered production-ready.
Legend:
- 🔴 Blocker — Must fix before release
- 🟡 Important — Should fix, affects user experience
- 🟢 Minor — Nice to have, can defer to v0.1.1
SDR Claim: "Simple auth (optional password for self-hosted)" is listed in Phase 1
Reality: No login page, no auth flow, no user management whatsoever.
Impact: Anyone with network access to the app can see all data. No privacy for self-hosters on shared networks.
Files: No auth-related pages exist (/login, /register, etc.)
Fix Options:
- Implement basic password protection (single user, simple PIN or password)
- Remove auth from v0.1.0 scope and document "single-user, local-only" limitation
- Add HTTP Basic Auth at nginx/reverse proxy level as workaround
Files: schema.ts — users and sessions tables exist but unused
Issue: Database schema has auth tables, but no Lucia Auth integration, no login endpoints, no session management.
Impact: Misleading — looks like auth is implemented but it's not.
Fix: Either implement Lucia Auth or remove auth tables from schema for v0.1.0.
File: nuxt.config.ts
Issue: Config references /icons/icon-192.png and /icons/icon-512.png but the public/icons/ directory doesn't exist.
Fix: Create PWA icons or use a placeholder. Without these, PWA install will fail on most devices.
File: nuxt.config.ts
Issue: Config references /favicon.png — verify it exists.
Fix: Add favicon to public/ directory.
SDR Claim: "Full functionality offline, sync when connected"
Reality: No IndexedDB implementation, no service worker data caching, no background sync.
Impact: App will not work offline beyond cached static assets.
Recommendation: Either implement basic offline support OR update roadmap to move this to v0.2.0.
File: timer.vue
Issue: There's a // TODO: Implement wake lock API comment. Screen will turn off during meditation.
Fix: Implement navigator.wakeLock.request('screen') with proper error handling.
SDR Claim: "Start bell (optional), End bell (optional), Interval bells"
Reality: Only end bell is implemented. No start bell, no interval bells.
Required: Start and end bells should be independently configurable with different sounds.
Fix: Add start bell selector in timer settings panel (separate from end bell). Interval bells can defer to v0.2.0.
SDR Claim: "Users can save timer configurations as presets"
Reality: Presets are hardcoded. Database has timer_presets table but no API or UI to use it.
Recommendation: Defer full preset save/load to v0.2.0, but document this limitation.
File: timer.vue
Issue: "Custom" preset button doesn't properly activate — clicking it does nothing (preset.seconds === -1 ? null).
Fix: Custom button should set a flag to show the input field.
Issue: Timer settings panel shows bell options: Bell, Chime, Gong, Gong2, Cymbal, None.
Settings page shows: Tibetan Bowl, Meditation Bell, Crystal Singing Bowl, Soft Gong.
Fix: Unify bell sound options across both locations.
File: habits.vue
Issue: Page shows empty state with "Create your first habit" button that does nothing. No habits API exists.
SDR Claim: Habits are Phase 2, but roadmap marks "Habits page scaffolding" as complete.
Options:
- Remove habits from nav until v0.2.0
- Add a "Coming in v0.2" message instead of fake button
- Keep as-is but update roadmap to say "placeholder only"
File: habits.vue
Issue: "New Habit" button in header has no click handler.
Fix: Either disable with tooltip "Coming soon" or remove until v0.2.0.
File: journal.vue
Issue: "Record a dream" and "Celebrate a win" buttons have no click handlers — they do nothing when clicked.
User Impact: Confusing UX, buttons appear broken.
Fix: Link to /add?type=dream and /add?type=tada respectively.
File: journal.vue
Issue: Filter shows "journal" option but add page doesn't have "journal" as an entry type (only tada, dream, note, meditation).
Fix: Either add "journal" to add page types or remove from filter.
SDR Types: timed, reps, gps_tracked, measurement, journal, tada, experience, consumption
Add Page Types: tada, dream, note, meditation
Impact: Limited entry types for MVP. Acceptable, but should document.
File: add.vue
Issue: Selecting "Meditation" in add page creates a manual entry, but real meditation entries should come from timer with duration data.
Recommendation: Remove "meditation" from quick-add OR clarify it's for logging past sessions.
File: settings.vue
Issue: Settings are saved to localStorage but never loaded back. Refreshing page resets to defaults.
Fix: Add onMounted hook to load settings from localStorage.
Issue: Default timer duration and bell sound in settings don't propagate to timer page.
Fix: Timer should read from localStorage/settings on mount.
File: settings.vue
Issue: Theme selection UI exists but doesn't actually change the theme.
Fix: Implement dark mode toggle with localStorage persistence.
Issue: Notifications setting exists but there's no notification system.
Recommendation: Hide or disable until v0.3.0.
File: entry/[id].vue
Issue: Tags are displayed but there's no UI to add/remove them.
Fix: Add tag editing UI or defer to v0.2.0.
Files: All API endpoints
Issue: All endpoints use "default-user" with no actual user management.
SDR Claim: "Simple auth (optional password for self-hosted)" is Phase 1
Reality: No auth at all, just a hardcoded user ID. No login, no sessions, no password protection.
Impact: Zero security — anyone on the network can access all data.
Fix: See Section 0 for auth implementation options.
File: index.vue, index.get.ts
Issue: Timeline page may show empty even when entries exist in database.
Possible Causes:
- API sorts by
timestampbut timer entries usestartedAt— entries may not appear in expected order or at all default-usernot created before first entry query- Entry timestamps may be malformed
Impact: Core functionality broken — users can't see their data.
Fix: Debug API response, ensure proper sorting withCOALESCE(timestamp, startedAt, date, createdAt).
File: index.get.ts
Issue: Sorts by timestamp but timer entries use startedAt. May cause ordering issues.
Fix: Use COALESCE(timestamp, startedAt, date, createdAt) or similar.
Issue: API returns up to 100 entries with no pagination. Will be slow for heavy users.
Recommendation: Acceptable for v0.1.0, add pagination in v0.2.0.
Files: settings.vue, nuxt.config.ts
Issue: appVersion is hardcoded in both files.
Fix: Use useRuntimeConfig().public.appVersion everywhere.
Issue: Some files use console.log instead of createLogger.
Fix: Run grep and replace with structured logging.
File: roadmap.md
Issue: Roadmap says "Completed January 2026" but multiple features are placeholders.
Fix: Update roadmap to accurately reflect what's done vs placeholder.
Issue: README is developer-focused. No user guide for self-hosting.
Recommendation: Add basic "Getting Started" for end users.
- Fix Timeline — Debug why entries don't display
- Auth decision — Either implement basic password protection OR document "local-only" limitation clearly
- Fix journal buttons — "Record a dream" and "Celebrate a win" must work
- Create PWA icons (192x192, 512x512)
- Fix or hide non-functional habits page
- Update roadmap to reflect actual state
- Implement Wake Lock API for timer
- Load settings from localStorage on mount
- Add start bell to timer
- Settings should affect timer defaults
- Custom minutes input UX
- Bell sound option consistency
- Theme toggle implementation
- Tag editing in entry detail
- Single source for version number
Last updated: January 10, 2026