Build Log
A running log of GitHub commits across my projects.
Sat, Aug 1
- fix(progress): show actual consistency % for each habitlifelong-habit-app18:56
Thu, Jul 30
- fix(backdating): fail on missing habit instead of skipping created-date validationlifelong-habit-app15:29
- fix(progress): repair regressions, restore shared validation, remove debug logslifelong-habit-app15:22
- fix(progress): include uncategorized habits everywhere, fix heatmap for days before a habit existedlifelong-habit-app14:25
Wed, Jul 29
- fix(progress): make Yearly metrics match the other Progress viewslifelong-habit-app19:39
Tue, Jul 28
- fix(habits): paginate two more daily_logs queries past Supabase's row limitlifelong-habit-app17:48
- fix(backdating): compute "today" in local time instead of UTC to solve locked window bug when journalinglifelong-habit-app16:34
- fix(data): paginate daily_logs and habit_status_logs past Supabase's 1000-row limitlifelong-habit-app16:33
Mon, Jul 27
- fix: run auto-resume once per app launchlifelong-habit-app07:00
Sun, Jul 26
- fix(dashboard): show guidance on empty Grove cardslifelong-habit-app19:25
- fix(HabitSectionList): memoize topContent to improve performance and prevent unnecessary re-renderslifelong-habit-app17:36
- fix: fire completion toast notif from write mutations instead of Done bucket changeslifelong-habit-app15:18
- fix(dashboard): memoize raw function using callbacks for dashboard screenlifelong-habit-app15:12
- refactor(habits): use transition_habit_status RPClifelong-habit-app13:18
- fix(db): make habit status transitions atomic with RPClifelong-habit-app13:18
- fix: memoize FlashList props to avoid unnecessary cell re-evaluationlifelong-habit-app12:58
- fix(progress): fix wasted space below long entries in the session timelinelifelong-habit-app11:43
Sat, Jul 25
- fix(log): stop bot commits from appearing in the build loglaiflonglearner.com20:12
- fix(ascii-portrait): restore sampled ink, improve ascii density ramplaiflonglearner.com20:04
- chore: move validate emote script from lib to script directorylaiflonglearner.com19:54
Thu, Jul 23
- feat(emotes): support :shortcode: emotes outside MDXlaiflonglearner.com07:47
- feat(ascii): add theme-aware ascii portrait on homepagelaiflonglearner.com07:18
- feat(emotes): add build-time :shortcode: emote system for MDX postslaiflonglearner.com06:59
Tue, Jul 21
- fix(theme): separate brightness icons from palette colors, soften the ocean themelaiflonglearner.com20:35
- feat(theme): add warm/ocean color palettes with separate theme controlslaiflonglearner.com19:15
- refactor(header): remove the red dot from header logo and replace emoji theme iconslaiflonglearner.com18:16
- feat: make shell wider, add TOC thumb color, and fix dark-mode button shadowslaiflonglearner.com17:49
- fix(metadata): update blog and log titleslaiflonglearner.com17:44
- refactor(layout): keep page width consistent across all pageslaiflonglearner.com15:04
- style: make page shell wider, mute selection color, adjust header transparencylaiflonglearner.com15:02
- style(theme): add sticky header and themed text selectionlaiflonglearner.com14:27
- style(header,footer): match footer divider with header, warm up logo colorlaiflonglearner.com13:59
- fix(css): fix active tab text and make button shadows consistentlaiflonglearner.com13:32
- feat(ui): group build log by day, add cozy keycap button stylelaiflonglearner.com11:53
- fix(dashboard): remove duplicate spacing in HabitMapListViewlifelong-habit-app11:24
- feat(log): add opt-in log history refetch (instead of incremental sync)laiflonglearner.com11:10
- chore(ci): run update-log hourly instead of dailylaiflonglearner.com11:08
- fix(scripts): update dev scriptlaiflonglearner.com11:07
- feat: add update-log script to pull commits from repositorieslaiflonglearner.com10:49
- feat(log): add cross-repo dev loglaiflonglearner.com10:44
- fix(layout): replace fixed TOC layout with responsive grid shelllaiflonglearner.com10:00
- feat: add wrangler config and assets for OpenNext integrationlaiflonglearner.com07:21
- chore(gitignore): add .open-next/laiflonglearner.com07:07
Mon, Jul 20
- fix(cloudflare): use static-assets incremental cache for SSGlaiflonglearner.com22:20
- fix(config): update build script to use webpack and add OpenNext.js config filelaiflonglearner.com22:20
- config: add preview and deploy scripts for OpenNext.js Cloudflare integrationlaiflonglearner.com21:59
- fix: allow LAN dev origin for Turbopack HMRlaiflonglearner.com20:27
Sun, Jul 19
- fix(header): integrate the header with the page layoutlaiflonglearner.com22:26
- fix(blog): center the article and TOC as a single layoutlaiflonglearner.com22:21
- fix(posts): normalize CRLF line endings before frontmatter parsinglaiflonglearner.com22:14
- feat(toc): add sliding active-heading indicator to On This Pagelaiflonglearner.com21:44
- chore: remove dead StatusBar componentlaiflonglearner.com21:29
- fix(status-bar): remove duplicated navigation and template boilerplatelaiflonglearner.com21:09
- feat: add TOC, tag tabs, status bar, and tab-style nav, and clean up utility classeslaiflonglearner.com20:35
- chore: update project name to 'laiflonglearner.com', also update gitignorelaiflonglearner.com20:31
- Update project name in package-lock.json and add VSCode settings for CSS lintinglaiflonglearner.com20:04
- Initial Commitlaiflonglearner.com19:37
Sat, Jul 18
- fix(progress): position overlapping sessions by real timelifelong-habit-app09:29
- fix(progress): maintain chronological session alignment across overlapping session columnslifelong-habit-app09:18
- chore: remove dead useRunningSession hook and temporary debug logginglifelong-habit-app08:30
- fix(dashboard): stop FlashList rows from fading after opening the dashboard for the second timelifelong-habit-app08:29
Fri, Jul 17
- fix(dashboard): distinguish inactive days from missed dayslifelong-habit-app19:03
- fix(progress): keep the session timeline in sync with session state changeslifelong-habit-app18:42
- fix(dashboard): tapping stopwatch chips now also expands and scrolls to All-Day habits (it was only timed habits before)lifelong-habit-app18:08
- fix(habit-form): preserve preferred_time across toggle off/onlifelong-habit-app17:06
- fix(habits): remove redundant all_habit_day_states invalidationlifelong-habit-app16:54
- fix(dashboard): stop inactive habits from appearing as "Not Completed" after reactivating them againlifelong-habit-app15:40
- refactor(progress): extract AllViewsContainer and LazyQuarterlySection from progress tab (it was hard to scan with ~800 lines)lifelong-habit-app15:29
- fix(progress): use the full habit list for historical metricslifelong-habit-app15:28
- fix(stopwatch): source running session and today's totals from shared dashboard querieslifelong-habit-app14:41
- fix(dashboard): preserve DayState instead of collapsing it to a booleanlifelong-habit-app12:15
- chore: remove dead code and update comment to HabitCardCompact to indicate code is stale but can't be refactored nowlifelong-habit-app07:45
Thu, Jul 16
- fix(AuthBanner): correct icon name typo (infoUI not info)lifelong-habit-app18:38
- fix(HabitCardCompact): update pause action to match the current updateStatus systemlifelong-habit-app18:37
- fix(dashboard): preserve trashed-habit history in week-strip day states (Scope B)lifelong-habit-app18:25
- fix(habits): scope pause, archive, and trash to their actual active windowslifelong-habit-app18:24
- fix(dashboard): defer stopwatch-chip scrolling until the sheet settleslifelong-habit-app16:45
- fix(stopwatch): scope session queries to each caller's actual needslifelong-habit-app16:10
- fix(habits): patch active-habit caches directly on status transitionslifelong-habit-app12:36
- fix(dashboard): stabilize mutation callbacks to prevent full-list re-renderslifelong-habit-app09:48
- perf(dashboard): scroll immediately for stopwatch chip taps when possiblelifelong-habit-app09:47
- feat(dashboard): scroll to a habit when opened from the stopwatch chiplifelong-habit-app08:39
- refactor(alerts): replace Alert.alert with themed ConfirmSheet and InfoSheetlifelong-habit-app08:21
- fix: add a measurement-independent fallback to fix Bento's progress bar not renderinglifelong-habit-app07:55
Wed, Jul 15
- fix: reset recycled FlashList state on habit identity changeslifelong-habit-app19:50
- fix(stopwatch): make pauseSession update the UI optimisticallylifelong-habit-app19:44
- refactor(progress): extract ProgressHeader, AllViewsContainer, and LazyQuarterlySectionlifelong-habit-app16:53
- fix(progress): keep prefetched yearly logs consistent with useProgressLogslifelong-habit-app16:38
- fix(habits): prevent expired pauses from reviving trashed habitslifelong-habit-app16:34
- fix(status-logs): preserve expired pause history after automatic resumelifelong-habit-app16:31
- fix(dashboard): keep past-date completion state in sync after manual session writeslifelong-habit-app15:50
Tue, Jul 14
- refactor(progress): unify Consistency/Intensity colors, fix pill hierarchy and trend coloringlifelong-habit-app19:37
- refactor(trend): remove unused phrase field and polish inline trend alignmentlifelong-habit-app18:30
- fix(progress): remove duplicate Yearly loading indicatorlifelong-habit-app18:13
- refactor(progress): standardize section nav labels, compact tracked/missed summarylifelong-habit-app17:00
- fix(progress): thread loadedWindowStartDate through daily/weekly/monthly/quarterly hookslifelong-habit-app16:42
- fix: Complete button closed sheet before mutation confirmed, showing stale datalifelong-habit-app16:13
- fix: reconcile Grove completion drift, close backdating window gaps, stop Complete from wiping Grove datalifelong-habit-app15:35
- fix(progress): drop middot and pts unit from trend delta displaylifelong-habit-app14:18
- feat(progress): period-over-period trend on Consistency/Intensitylifelong-habit-app13:40
Mon, Jul 13
- refactor(progress): move session timeline below category breakdownlifelong-habit-app19:14
- fix(progress): scale session bars to 4h and anchor them to toplifelong-habit-app19:12
- fix(progress): add spacing between daily overview and session timelinelifelong-habit-app18:31
- refactor(progress): restyle session timeline as card with duration barslifelong-habit-app18:04
- fix: restore resolveOffsetDate's todayISO field and DailySessionTimeline wiringlifelong-habit-app16:59
- fix: correct Grove backdating and Snowball/Ladder stopwatch-owned logginglifelong-habit-app13:00
- fix(posthog): disable session replay to prevent app crashes in production buildslifelong-habit-app11:40
Sun, Jul 12
- chore: bump dependencies to sync with Expo 56.0.15lifelong-habit-app21:06
- fix: scope Metro package-exports resolution to solar-icons onlylifelong-habit-app21:04
- fix(progress): reorder OverviewSummaryBar rows instead of reserving icon gutterlifelong-habit-app03:47
Thu, Jul 9
- feat(progress): extend Consistency/Intensity row to Weekly and Quarterlylifelong-habit-app15:38
- refactor(shared): extract InfoToggle, add explanation to OverviewSummaryBarlifelong-habit-app15:10
- fix(progress): change dayMetrics to periodMetrics, dayMetrics is stalelifelong-habit-app15:04
- refactor(shared): extract InfoToggle, add explanations to OverviewSummaryBarlifelong-habit-app14:58
- fix(progress): include unlogged habits in average intensity denominatorlifelong-habit-app14:46
- fix(habit-card-gallery): eliminate progress bar fill racelifelong-habit-app14:41
- feat(progress): add whole-day consistency and intensity to Daily viewlifelong-habit-app12:49
- fix(toast): make habit-colored toast background fully opaquelifelong-habit-app11:40
- feat(toast): tint completion celebration toast with habit's colorlifelong-habit-app11:38
- refactor(toast): improve sparkle animation and adjust SVG sizelifelong-habit-app11:24
- feat(dashboard): replace per-habit sparkle with a celebration toastlifelong-habit-app10:38
- chore: bump expo dependency to v56.0.15lifelong-habit-app10:26
- feat(posthog): implement conditional loading (disabled for dev build)lifelong-habit-app10:08
Wed, Jul 8
- feat: add read-only daily session timeline to Progress tablifelong-habit-app21:42
- chore(config): add posthog-react-native/expo to dependencies configlifelong-habit-app21:22
- feat(progress): add average logged value for Snowball and Grove habitslifelong-habit-app21:21
- doc(auth): add comments about preventing overwriting user display name on repeat Google sign-inslifelong-habit-app21:13
- fix(auth): stop Google sign-in name from being silently discardedlifelong-habit-app21:11
- refactor(dashboard): split HabitSectionList into orchestrator plus 4 fileslifelong-habit-app18:18
- fix(dashboard): hold completed habit in place until its sparkle finisheslifelong-habit-app17:56
- feat(dashboard): add per-habit completion sparklelifelong-habit-app15:04
- fix(time-picker): stop losing typed drafts to sibling interactionslifelong-habit-app14:32
- fix(progress tab): add loading feedback for Yearly view entry and year-offset changeslifelong-habit-app14:28
- feat(analytics): add PostHog to the applifelong-habit-app14:25
Tue, Jul 7
- fix(time-picker): stop unmounting TextInput mid-keystroke on direct editlifelong-habit-app19:33
- feat(dashboard): animate habit cards moving between sectionslifelong-habit-app19:19
- chore: added expo-application, expo-file-system, expo-localization, and posthog-react-nativelifelong-habit-app19:12
- feat(dashboard): animate habit cards moving between sectionslifelong-habit-app17:31
- fix(dashboard): stop status line from freezing on one line on heavy-use dayslifelong-habit-app17:28
- fix(ladder-card): allow tapping active rung to undo the loglifelong-habit-app17:02
- feat: add animated PulsingDots loader, replace static progress placeholderlifelong-habit-app16:24
- fix: resolve offline cold-open hang and add long-wait feedback to progress tablifelong-habit-app15:16
- chore(dependencies): add @react-native-community/netinfo version 12.0.1lifelong-habit-app13:53
- feat(device-sessions): fix os_name source, add build fingerprint and sign-in loglifelong-habit-app12:44
Fri, Jul 3
- feat(habit-form): copy config for Ladder, completing the BENTO/LADDER/SNOWBALL rolloutlifelong-habit-app16:16
- feat(habit-form): copy config for Snowball, generalize CopyConfigSheet, fix retroactive Bento gaplifelong-habit-app16:10
- refactor(constants): split statusLineVariants.ts into a directory by input sourcelifelong-habit-app14:46
- fix(habit-form): guard archetype in buildPayload, same invariant as habit_namelifelong-habit-app13:51
- fix(theme): guard session user id inside useTheme queryFnlifelong-habit-app13:48
- fix(types): close type drift in habit form, theme, sync, and log statuslifelong-habit-app13:47
- fix(dashboard): remove remaining backhanded phrasing and vague quantifierlifelong-habit-app13:08
- fix(status-line): resolve DASHBOARD voice guideline violationslifelong-habit-app12:56
- fix(status-line): restore partial_done reachability, fix maxShowsPerDay driftlifelong-habit-app12:54
Thu, Jul 2
- fix(status-line): move useDailySummary above useRecordDashboardOpen effectlifelong-habit-app21:35
- docs(status-line): document every pooled message and dataLine branch in headerlifelong-habit-app21:34
- fix(progress): stop AllViewsContainer remounting on background refetchlifelong-habit-app20:29
- fix(device-sessions): track last_seen_at on every session event, not just SIGNED_INlifelong-habit-app19:34
- fix(device-sessions): restore last_seen_at column defaultlifelong-habit-app19:32
- feat(auth): add device_sessions registry for multi-device debugginglifelong-habit-app19:29
- chore(dependencies): add expo-device packagelifelong-habit-app19:03
- refactor(progress): merge Tracked/Missed Days into OverviewSummaryBarlifelong-habit-app17:46
- feat(progress): add Tracked/Missed Days below OverviewSummaryBarlifelong-habit-app17:41
- feat(progress): add hairline dividers between CategoryInsightsCard sectionslifelong-habit-app17:39
- chore(usePullSync): remove dead hooklifelong-habit-app17:24
- style(copy-config-sheet): confirm step reuses ConfirmSheet's centered-card tokenslifelong-habit-app17:15
- fix(bento-form): replace unreliable watch()-driven draft effect with imperative emissionlifelong-habit-app17:12
- docs(bento-copy): correct overclaimed collision risk, remove em dasheslifelong-habit-app16:03
- fix(habit-form): eliminate nested-Modal race in copy-config confirm, carry stopwatch state across GROVE switcheslifelong-habit-app15:45
Wed, Jul 1
- fix(habit-form): detect Bento overwrites correctly and enable stopwatch by defaultlifelong-habit-app21:16
- feat(habit-form): copy Bento parts from an existing habitlifelong-habit-app20:57
- feat(status-line): add per-variant daily show budgetslifelong-habit-app20:21
- feat(database): add get recent completion rates migration and regenerate supabase database typeslifelong-habit-app05:48
- feat(status-line): wire recovery pacing and add 30-day streak tierlifelong-habit-app05:44
Tue, Jun 30
- refactor(statusLineVariants): update daily welcome messageslifelong-habit-app23:43
- refactor(progress): merge radar and breakdowns into CategoryInsightsCardlifelong-habit-app23:39
- perf(progress): virtualize DailyOverviewSection habit rowslifelong-habit-app23:36
- fix(progress): stack StatPill fraction and percentage valueslifelong-habit-app23:36
- refactor(welcome-card): move top clouds 10pt from the prior positionlifelong-habit-app20:01
- refactor(background): dedupe color mapping and clean up primitiveslifelong-habit-app19:20
- fix(typewriter): live clock updates in place, no full retypelifelong-habit-app19:19
- fix(welcome-card): enlarge and reposition bottom clouds for timer-bar visibilitylifelong-habit-app16:25
- feat(welcome-card): add sparkles and rebalance cloud placementlifelong-habit-app15:20
- fix(welcome-card): balance cloud spacing across the full viewBoxlifelong-habit-app15:14
- fix(welcome-card): pull bottom clouds and stars into the middle bandlifelong-habit-app15:13
- refactor(statusLineVariants): update welcome messageslifelong-habit-app15:04
- fix(dashboard): keep welcome clock live and separate status data from messaginglifelong-habit-app13:58
- fix(dashboard): replace stretched AuthBackground with WelcomeCardBackgroundlifelong-habit-app13:23
- refactor(shared): move AuthBackground to shared components and reuse in welcome overlaylifelong-habit-app12:58
- fix(types): align User and schedule types with DB nullability and Json constraintslifelong-habit-app12:09
- chore: add mapUserRow file that's supposed to be pushed in the prev commitlifelong-habit-app11:16
- fix(types): resolve Json compatibility issues and centralize user row mappinglifelong-habit-app11:12
- fix(supabase): wire generated Database types into the clientlifelong-habit-app10:46
- refactor(dashboard): update comments for daysSinceLastActivity and streakLength to clarify Postgres RPC usagelifelong-habit-app10:43
- feat(dashboard): move cross-habit activity history to a Postgres RPClifelong-habit-app10:42
- feat(dashboard): wire account-age, streak, and open-count fields into welcome overlaylifelong-habit-app10:31
- feat(dashboard): implement large_habit_list_compassionlifelong-habit-app09:41
- feat(dashboard): regenerate statusLineVariants with C and E rewriteslifelong-habit-app08:37
Mon, Jun 29
- refactor(dashboard): extract status line variants into registrylifelong-habit-app22:07
- refactor(dashboard): extract status line variants into registrylifelong-habit-app21:05
- chore(hooks): implement backdating functionality in useBackdateHabit (copied the wrong file)lifelong-habit-app17:03
- perf(mutations): scope all_habit_logs_by_date invalidation to the affected datelifelong-habit-app16:45
- fix(dashboard): remove unused useUser() subscription in useStopwatchlifelong-habit-app16:43
- perf(dashboard): memoize habit color resolutionlifelong-habit-app16:41
- perf(queries): add staleTime to useUserlifelong-habit-app16:41
- perf(dashboard): fix broken HabitCardRenderer memoizationlifelong-habit-app16:37
- perf(dashboard): remove unused useDashboard() call in useHabitCreationFlowlifelong-habit-app16:37
- perf(dashboard): memoize scheduleVersion in useDashboardlifelong-habit-app16:05
- feat(hooks): add useMidnightRefresh for cross-midnight cache invalidationlifelong-habit-app16:04
- fix(mutations): invalidate consistency and habits on empty trashlifelong-habit-app16:04
- fix(mutations): invalidate consistency on manual session add and deletelifelong-habit-app16:04
- fix(mutations): invalidate consistency on stopwatch session close and restartlifelong-habit-app16:03
- refactor(dashboard): simplify DailyWelcomeOverlay by removing BlinkingCursor componentlifelong-habit-app14:54
- feat(dashboard): add current time to welcome message and hide cursor on completionlifelong-habit-app14:48
- feat(dashboard): add typed-in daily welcome overlaylifelong-habit-app14:12
- fix(dashboard): correct habit selection and messaging in DailySummarylifelong-habit-app12:03
- perf(progress): remove redundant recomputations and stabilize navigation handlerslifelong-habit-app10:48
- perf(progress): memoize DailyOverviewSection callbacks and HabitIconBadgelifelong-habit-app10:47
- perf(dashboard): lift runningHabitIds default to module-level constantlifelong-habit-app05:51
- perf(queries): set staleTime: Infinity on useHabitStatusLogslifelong-habit-app05:51
- fix(mutations): invalidate consistency cache on habit creationlifelong-habit-app05:50
- perf(queries): set staleTime: 30_000 on useTodayLogslifelong-habit-app05:49
- perf(queries): set staleTime: Infinity on useConsistencylifelong-habit-app05:49
- fix(bento): optimistically update all_habit_logs_by_date on checkbox taplifelong-habit-app05:44
Sun, Jun 28
- fix(theme): remove whitespace text nodes from AppThemeProvider JSXlifelong-habit-app23:04
- perf(progress): keep overview sections mounted across tab switcheslifelong-habit-app22:42
- feat(progress): implement usePrefetchAdjacentYears hook for snappier year navigationlifelong-habit-app22:41
- feat(progress): add year chevron navigation to yearly viewlifelong-habit-app22:27
- feat(progress): replace yearly picker with chevron navigationlifelong-habit-app22:17
- chore(progress): implement YearlyOverviewSection with summary bar, radar chart, and category breakdown (copied the wrong file, my bad)lifelong-habit-app22:04
- fix(progress): dedupe logs by date in useYearlyOverview summary countlifelong-habit-app21:50
- feat(progress): add YearlyOverviewSection with summary, radar, and category breakdownlifelong-habit-app21:47
- refactor(settings): make GroupedRow.onPress optional and add disabled statelifelong-habit-app21:32
- refactor(settings): replace all Alert.alert with in-app modalslifelong-habit-app21:27
- feat(settings): add discard guard to TimeOfDayScreenlifelong-habit-app21:22
- perf(theme): convert useTheme from hook to Contextlifelong-habit-app20:48
- fix(progress): virtualize weekly and monthly habit rowslifelong-habit-app20:28
- perf(quarterly): virtualize habit rows with scrollEnabled=false FlatListlifelong-habit-app20:04
- perf(progress): gate useQuarterlyOverview behind viewMode via LazyQuarterlySectionlifelong-habit-app20:04
- fix(progress): exclude paused and archived habits from all progress viewslifelong-habit-app19:50
- feat(progress): add quarterly overview viewlifelong-habit-app15:44
- feat(AddSessionScreen): block end time in the future when logging for todaylifelong-habit-app14:53
- feat(progress): add monthly calendar viewlifelong-habit-app14:44
- feat(progress): navigate to habit details from progress rowslifelong-habit-app14:05
- refactor(progress): consolidate shared date helpers and category constantslifelong-habit-app13:43
- fix(habitFormStyles): center timePickerSpinner content horizontallylifelong-habit-app13:27
- refactor(TrailingTimestampText): replace shadow-height technique with onTextLayoutlifelong-habit-app11:48
- fix(TrailingTimestampText): always anchor timestamp to bottom-rightlifelong-habit-app10:52
- fix(journal): reduce timestamp text size to rowMeta (bodyXs is too small)lifelong-habit-app09:24
- fix(journal): adjust timestamp positioning againlifelong-habit-app09:24
- fix(journal): measure timestamp width correctlylifelong-habit-app08:47
- fix(journal): restore bubble shrink-wrap for inline timestampslifelong-habit-app06:04
Sat, Jun 27
- fix(journal): restore inline timestamps for short entrieslifelong-habit-app22:24
- refactor(journal): extract screen logic into focused componentslifelong-habit-app21:07
- fix: progress bar left-to-right fill via onLayout and prevent rapid-tap revert with mutationInFlightReflifelong-habit-app19:41
- feat(optimistic-ui): instant feedback for Snowball stepper and Ladder rung interactionslifelong-habit-app19:39
- fix(TrailingTimestampText): make single-line detection robust on Androidlifelong-habit-app18:39
- fix(journal): restore bubble shrink-wrap behaviorlifelong-habit-app17:57
- fix(journal): prevent timestamp overlap and expand bubble widthlifelong-habit-app17:33
- fix(TrailingTimestampText): correct timestamp placement logic for inline renderinglifelong-habit-app17:22
- fix(screenLayout): add insets.bottom to subScreenContainerPaddinglifelong-habit-app16:42
- refactor: update text componentslifelong-habit-app16:04
Fri, Jun 26
- feat(TrailingTimestampText): add dynamic trailing timestamp for habit journallifelong-habit-app21:23
- refactor(RecentlyDeletedScreen): improve alert copy textlifelong-habit-app21:22
- chore: remove AddSessionSheet component (dead code)lifelong-habit-app21:21
- refactor(themeRegistry): add subtle card field on ThemePalette interfacelifelong-habit-app21:21
- refactor(auth components): adjust margin and placeholder text for input fieldslifelong-habit-app21:21
- refactor(dashboard): adjust component styleslifelong-habit-app21:20
- refactor(alerts): update alert text to include Discord community supportlifelong-habit-app21:13
- refactor(validateHabit): update bento wording from component to partlifelong-habit-app06:33
- fix(ladder): align tooltip/error copy with existing "level" terminologylifelong-habit-app06:18
- refactor: improve alert and text messages for clarity across various componentslifelong-habit-app05:56
Thu, Jun 25
- refactor: update description for ArchetypeSelector and pause messages for hookslifelong-habit-app21:53
- feat(journal): WhatsApp-style trailing timestamp on journal bubbleslifelong-habit-app17:42
- feat(journal): multi-day journal thread with cursor paginationlifelong-habit-app17:05
- fix(AddSessionScreen): suppress validation warning while any picker field is openlifelong-habit-app15:25
- feat(TimeSpinnerPicker): add onEditingChange callback to signal active text editlifelong-habit-app15:24
- fix(TimeSpinnerPicker): clamp out-of-range typed values instead of silently revertinglifelong-habit-app15:19
- feat(TimeSpinnerPicker): add tap-to-edit inline input for hour and minute fieldslifelong-habit-app15:18
- feat(toast): show habit name in pause confirmation toastlifelong-habit-app14:42
- feat(toast): show habit name in pause confirmation toastlifelong-habit-app14:22
- fix(toast): preserve toast payload across navigation, user-dismiss onlylifelong-habit-app13:55
- fix(toast): remove duplicate ToastProvider from (tabs)/_layoutlifelong-habit-app13:52
- fix(toast): move NavigationToastGate outside Stack to sibling positionlifelong-habit-app13:51
- fix(toast): scope ToastProvider to (tabs) subtreelifelong-habit-app13:14
- feat(toast): scope overlay visibility to (tabs) group onlylifelong-habit-app13:05
- refactor: extract TimeSpinnerPicker shared component from HabitTimePicker and AddSessionlifelong-habit-app11:08
- fix: move AM/PM toggle inline next to MM field in AddSessionlifelong-habit-app10:18
- fix: center HabitTimePicker spinner and stack AddSession time inputs verticallylifelong-habit-app10:14
- fix: use time_display_24h in session display and manual session input so the time format follows user optionlifelong-habit-app09:40
- fix(grove): pass isPastDate not strictMode as isLockIn to journal routelifelong-habit-app06:10
- fix(grove): auto-complete past-date Grove logs on journal/session/stepper writelifelong-habit-app05:52
- chore(HabitTimeLogScreen): remove dead codelifelong-habit-app05:50
Wed, Jun 24
- refactor(ArchetypeSelector UX): replace em dash to parentheses #41lifelong-habit-app20:53
- fix(GroveForm UI): fix toggle color (no longer transparent), adjust text size and text #73lifelong-habit-app20:50
- refactor(TimeOfDayScreen): move the toggle for 12-hour and 24-hour options abovelifelong-habit-app20:45
- fix(grove): use lower-level hooks that accept null to fix conditional hook errorlifelong-habit-app19:13
- fix (grove): fix grove completion from detail sheet for all track types [#80, part of #73]lifelong-habit-app17:41
- Add timeElapsedSeconds to SelectedDateLogResult [#80, part of #73]lifelong-habit-app17:40
- fix (grove): Allow Grove completion from detail sheet when data exists [#80, part of #73]lifelong-habit-app17:33
- feat(progress): include uncategorized habits in category breakdownlifelong-habit-app15:58
- refactor(dashboard): expose schedule via DashboardData, fix O(N²) todayLogs lookup [#70, part of #35]lifelong-habit-app15:26
- feat(dashboard): schedule-aware two-line daily summary banner (Scopes B + C) [#70, part of #35]lifelong-habit-app15:23
- chore: change migration name to follow the standard (with -010 suffix)lifelong-habit-app14:41
- fix(settings): eliminate maskEmail duplication, useEffect race, select() overhead [#78, part of #75]lifelong-habit-app14:05
- feat(settings): add Edit Name screen and wire display_name to ProfileHeader [#75, part of #70]lifelong-habit-app07:01
Tue, Jun 23
- refactor(HabitTimePicker): update time caption [#41 copy audit]lifelong-habit-app23:49
- feat: capture display_name at signup and Google OAuth, fix guest name fallback [#75, part of #70]lifelong-habit-app20:09
- refactor(OverviewSummaryBar): update label from "Not completed" to "Not Started" and adjust styleslifelong-habit-app20:05
- refactor: correct spelling of "Customize Fields" and adjust padding in HabitSheetFieldsScreen [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app19:52
- style: correct spelling of "Customize Fields" in comments [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app19:52
- refactor(habitSheetFieldConfig): correct spelling and update field hints [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app19:51
- fix(HabitSheetFieldsScreen): add caption-to-button gap and tighten field row padding [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app19:50
- feat(HabitSheetFieldsScreen): add reset to default button and tighten field row spacing [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app19:23
- feat(HabitSheetFieldsScreen): add reset to default button [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app19:02
- refactor(habitSheetFieldConfig): reorder DEFAULT_SHEET_FIELDS to match UX grouping [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app18:25
- refactor(habit-sheet-fields): delegate route to feature component, remove duplicate implementation [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app18:05
- fix(HabitSheetFieldsScreen): use colors.accent for switch to match GroveForm pattern [#66, part of DASHBOARD #35 and settings #51]lifelong-habit-app18:04
Sun, Jun 21
- refactor(settings): move Customise Fields from habit sheet to Appearance settings [#66, part of DASHBOARD #35 and SETTINGS #51]lifelong-habit-app20:58
- feat(habit-detail-sheet): user-configurable stat fields + full-sheet scroll fix [#66, part of #35]lifelong-habit-app20:22
- fix(dashboard): close two config-history gaps missed in the first passlifelong-habit-app20:18
- fix(dashboard): resolve historical config for unlogged past dates. Closes #60lifelong-habit-app18:28
Wed, Jun 17
- fix(dashboard): resolve LadderCard and SnowballCard config from snapshot for past dates [#60, part of #35]lifelong-habit-app15:36
- fix(progress): truly center date label, anchor refresh button to its edgelifelong-habit-app15:01
Tue, Jun 16
- refactor(progress): wrap OverviewSummaryBar in a cardlifelong-habit-app21:39
- refactor(progress): wrap CategoryRadarChart in a cardlifelong-habit-app21:19
- refactor(progress): wrap CategoryBreakdown consistency/intensity sections in card surfaceslifelong-habit-app20:43
- refactor(progress): reduce horizontal padding in habit rows and progress tab [Closes #47]lifelong-habit-app20:31
- feat(progress): add HabitIconBadge with gradient, use in Daily/WeeklyHabitRow [Closes #46]lifelong-habit-app20:03
- refactor(progress): change habit icon container from square to full circle [#46 part of #42]lifelong-habit-app19:53
- feat(dashboard): add daily summary banner with warm today-scoped copy [#58, part of #35]lifelong-habit-app17:02
- refactor(HabitSheetActions): update pause duration messagelifelong-habit-app16:53
- refactor(CategoryBreakdown): replace checkCircle icon with checkCircleBoldlifelong-habit-app16:53
- fix(habit-detail-sheet): raise maxHeight 88% -> 95% to fit action grid without scroll-to-reveallifelong-habit-app16:41
- fix(habit-detail-sheet): show content on first open, not secondlifelong-habit-app16:33
- fix(tabs): widen HapticTab onPressIn to accept null, cast tabBarIcon color to stringlifelong-habit-app16:31
- fix(habit-pause): self-healing stale log cleanup, guard all UPDATEs, fix transparent toast [#65]lifelong-habit-app15:55
- fix(habit-pause): guard all status UPDATEs with .select(), fix ghost-resume, fix transparent toast [#65]lifelong-habit-app15:50
Mon, Jun 15
- fix(habit-pause): only evaluate latest pause log per habit, fix transparent info toast [#65, part of #64]lifelong-habit-app16:49
- fix(toast): remove fade-in animation, show toast at full opacity immediately [#65, part of #64]lifelong-habit-app14:14
- fix(habit-pause): fix ghost resume toasts, bottom-position toast, show days remaining [#65, part of #64]lifelong-habit-app13:29
- fix(useToast): remove auto-dismiss, require explicit user dismissal via X button [#65, part of #64]lifelong-habit-app12:18
- fix(habit-pause): surface auto-resume feedback and fix silent re-resume loop [#65, part of #64]lifelong-habit-app12:12
- fix(db): fix operator mismatch in backfill_habit_snapshots by casting changed_at to DATE [#60, part of #35]lifelong-habit-app11:20
- refactor(appearance): split theme and card style into separate section cards [#53, part of #51]lifelong-habit-app09:39
- feat(appearance): add habit card style preference (Raised / Flat / Gallery) [#53, part of #51]lifelong-habit-app09:33
- fix(progress/CategoryBreakdown): cap width on tablets (#44, part of #42)lifelong-habit-app08:59
Sun, Jun 14
- fix(progress): correct HabitStyles and Habit field names in CategoryBreakdown (#44, part of #42)lifelong-habit-app22:34
- fix(progress): correct HabitStyles and Habit field names in CategoryBreakdown (#44, part of #42)lifelong-habit-app22:34
- feat(progress): expandable category breakdown sub-list (#44, part of #42)lifelong-habit-app22:33
- feat(progress): expandable category breakdown sub-list (#44, part of #42)lifelong-habit-app22:33
- fix(mutations): call backfill_habit_snapshots RPC after habit config edit (#60, part of #35)lifelong-habit-app22:01
- fix(db): add backfill_habit_snapshots RPC to restore NULL habit_config_snapshot rows (#60, part of #35)lifelong-habit-app21:59
Sat, Jun 13
- perf(HabitDetailSheet): lazy-mount content and defer stat queries behind InteractionManager (#57, part of #35)lifelong-habit-app20:00
- perf(HabitDetailSheet): lazy-mount sheet content to prevent query contention during open animation (#57, part of #35)lifelong-habit-app19:54
- fix(HabitSheetActions): use component_id field on BentoComponent, import type (#57, part of #35)lifelong-habit-app19:32
- fix(HabitDetailSheet): derive archetype-aware 100% payload in Complete button (#57, part of #35)lifelong-habit-app19:31
- fix(progress): invalidate logs on tab focus and add manual refresh button (#43, part of #42)lifelong-habit-app17:17
- refactor(habit-form): seed bento from snowball/ladder on archetype switch (#54, #35)lifelong-habit-app16:48
- refactor(habit-form): seed bento from snowball/ladder on archetype switch (#54, #35)lifelong-habit-app16:48
- feat(habit-form): stash and restore archetype configs on switch (#54, #35)lifelong-habit-app16:27
- feat(habit-form): stash and restore archetype configs on switch (#54, #35)lifelong-habit-app16:27
Fri, Jun 12
- refactor(habit-time-log): use ScreenHeader rightAction for add session button (#39)lifelong-habit-app22:06
- refactor(screen-header): add optional rightAction slot for aligned header actionslifelong-habit-app22:06
- refactor(iconRegistry): replace AddCircle icon with bold variant in UI_ICONSlifelong-habit-app21:44
- refactor(habit-form): active category chip uses its own accentColor, not habit color (#37)lifelong-habit-app20:28
- fix(habit-form): use HABIT_CATEGORY_META with isDark-resolved accentColor for category chips (#37)lifelong-habit-app20:27
- feat(habit-time-log): replace AddSessionSheet modal with dedicated add-session screen (#39)lifelong-habit-app14:46
- refactor(deep-dive): inherit draft color_hex on Create button instead of static theme accent (#37)lifelong-habit-app12:59
- refactor(color-icon-picker): use draftColor for confirm button instead of static theme accent (#37)lifelong-habit-app12:56
- refactor(habit-form): extend color_hex inheritance to ArchetypeSelector chips and info box (#37)lifelong-habit-app12:10
- refactor(habit-form): inherit habit color_hex across all form accent elements (#37)lifelong-habit-app08:55
Thu, Jun 11
- refactor(AllDayIconStrip): reduce icon and container sizes so it fits 5 icons in most screenslifelong-habit-app21:02
- refactor(AllDayIconStrip): increase icon and container sizeslifelong-habit-app20:53
- fix(AllDayIconStrip): prevent outer ring from compressing icon size on expand (#35)lifelong-habit-app20:46
- refactor(AllDayIconStrip): adjust margin for the strip and expanded cardlifelong-habit-app20:03
- fix(HabitSectionList): adjust margin for BackdatingModeBanner componentlifelong-habit-app20:00
- fix(upsertDailyLog): use maybeSingle to avoid intermittent PGRST116 on upsert (#33)lifelong-habit-app19:25
- fix(mutations): invalidate all_habit_logs_by_date in useBackdateHabit and useUnlogHabit (#33)lifelong-habit-app19:24
Wed, Jun 10
- refactor(progress): adjust CHART_SIZE and legend dimensionslifelong-habit-app22:20
- refactor(progress): increase stroke width and opacity for CategoryRadarChart grid lineslifelong-habit-app21:46
- fix(progress): recalculate CategoryRadarChart canvas size for ICON_SIZE=25lifelong-habit-app21:23
- refactor(icons): update category iconslifelong-habit-app21:22
- fix(progress): weekly category consistency now counts habit-day slots, not per-habit booleanslifelong-habit-app19:52
- feat(progress): add intensity breakdown section below consistency in category rowslifelong-habit-app17:55
Sun, Jun 7
- fix(category): correct semantically wrong icons and visually indistinct accent colors (#31)lifelong-habit-app16:49
Fri, Jun 5
- feat(category): make accentColor theme-aware with light/dark variants (#31)lifelong-habit-app22:19
- fix: round polygon stroke joins on CategoryRadarChart data polygons (#31)lifelong-habit-app22:05
- fix: resolve icon component in HabitHeatmapCard header instead of rendering raw icon_key string (#31)lifelong-habit-app21:50
- fix(intensity): remove 100% capping as snowball habit intensity_percent can be > 100%lifelong-habit-app16:26
- fix(unlog): add logged_at to IN_PROGRESS downgrade paths in useUnlogHabit (#27)lifelong-habit-app16:09
- feat(schema): add habit_config_history audit table (#27)lifelong-habit-app16:02
- fix(logged_at): advance logged_at on every log mutation (#27)lifelong-habit-app15:53
- fix(intensity): clamp intensity_percent to 100 at display layer only (#27)lifelong-habit-app15:33
- fix(intensity): remove write-time cap from SNOWBALL intensity_percent (#27)lifelong-habit-app13:23
- fix(sessions): delete ghost daily_log rows when all sessions are removed (#27)lifelong-habit-app09:05
Wed, Jun 3
- chore: ignore the entire android directory for EAS build so it takes app.config.js into account and change app name for preview variant (#28)lifelong-habit-app21:23
- revert(android): remove product flavors, restore single variant buildlifelong-habit-app21:08
- chore(android): add product flavors for dev/preview/production with distinct package IDs and app names (#28)lifelong-habit-app20:36
- chore(android): set app_name to "Lifelong Habit (Dev)" for local dev buildlifelong-habit-app13:54
- fix(dependencies): update react-native-reanimated to ^4.4.0 and react-native-worklets to ^0.9.1 to solve dependency conflictslifelong-habit-app13:26
- chore: add .easignore to reduce file size (it was > 300mb and EAS doesn't accept such big files #28)lifelong-habit-app13:26
- fix(dashboard): replace absoluteFillObject with absoluteFill that's compatible with new deps (Expo SDK 56 #25)lifelong-habit-app10:45
- fix(AuthBackground): replace removed absoluteFillObject with absoluteFill (RN 0.85 breaking change #25)lifelong-habit-app08:37
- fix(android): update compileSdkVersion to 36 and ndkVersion to 27.1.12297006 (#25)lifelong-habit-app08:36
- feat: include Android project structure and config to repo (#25)lifelong-habit-app06:50
- chore(.gitignore): remove generated native folders from ignore list (#25)lifelong-habit-app06:49
- fix(android): pin Gradle to 8.13, Kotlin to 2.1.20, restore missing ext SDK versions (#25)lifelong-habit-app06:47
Tue, Jun 2
- feat: integrate Sentry for error trackinglifelong-habit-app12:16
- fix: replace BottomTabBarButtonProps with inline prop type in HapticTablifelong-habit-app09:36
- fix: migrate @react-navigation imports to expo-router/react-navigationlifelong-habit-app09:35
- fix(PickerSearchBar): remove borderTopWidth since tab bar already provides the separator (#22)lifelong-habit-app07:48
- chore: bump devDependencieslifelong-habit-app07:45
- refactor: remove unused local database and schema fileslifelong-habit-app07:41
- fix: replace StyleSheet.absoluteFillObject with explicit position propslifelong-habit-app07:40
- fix(app.config.js): add @sentry/react-native plugin and format splash screen configlifelong-habit-app07:39
- chore: bump expo dependencieslifelong-habit-app07:38
- fix(dependencies): update expo-router to version 56.2.8lifelong-habit-app07:17
- fix(SwatchRow): remove resolved contrast TODO — HabitColor.contrast is non-nullable (#22)lifelong-habit-app06:47
- refactor(color-habit-picker): normalize all imports to @/ aliaslifelong-habit-app06:43
- feat(slider-shim): restore LinearGradient track using expo-linear-gradient (#22)lifelong-habit-app06:38
- fix(color-habit-picker): replace placeholder icons and remove dead header buttonlifelong-habit-app06:25
Mon, Jun 1
- refactor(colorHabitPicker): move PickerSearchBar above panelWrap and below tabs (#22)lifelong-habit-app19:17
- perf(progress): add getItemLayout to eliminate fast-scroll blank space (#20)lifelong-habit-app18:12
- perf(progress): pass shared cardGrid to HabitHeatmapCard and tune FlatList window (#20)lifelong-habit-app17:42
- perf(progress): fix query waterfall, O(N²) metrics loop, streak scan, and per-card buildGrid (#20)lifelong-habit-app17:29
- fix(progress): count IN_PROGRESS toward category consistency score in daily and weekly views #19lifelong-habit-app17:13
- fix(dashboard): remove estimatedItemSize from FlashList as it's not in installed flash-list version (#16)lifelong-habit-app16:56
- perf(dashboard): virtualize habit list with FlashList above 15 habits, memo HabitCardRenderer with Set-aware comparator (#16)lifelong-habit-app16:56
- chore(deps): bump postcss in the npm_and_yarn group across 1 directorylifelong-habit-app12:47
- chore(dependencies): update expo version to ~54.0.35lifelong-habit-app12:44
- chore: remove unused dependencies from package.json and ran npm audit fixlifelong-habit-app12:38
- chore: add Dependabot config filelifelong-habit-app12:31
- fix(grove): extract writeTimeElapsedOnly service, fix manual session add/delete for Grove, fix + button guard on time-log screen, add missing query invalidations (#17)lifelong-habit-app12:25
- fix(snowball): debounce stepper flush to prevent dropped rapid taps (#15)lifelong-habit-app07:11
- fix(grove): seed grove_config on edit, fix Tracked Time guard, remove non-functional journal shortcut. Closes #14lifelong-habit-app06:56
- fix(habit-form): update import path for ArchetypeSelector componentlifelong-habit-app06:33
- refactor: move onboarding components to root folderlifelong-habit-app06:32
Sun, May 31
- fix(grove): hide Done CTA instead of showing it pale when not yet actionablelifelong-habit-app21:10
- fix(dashboard): show Done CTA for Grove when IN_PROGRESSlifelong-habit-app21:05
- fix(grove): delegate Done button to HabitActionButton instead of bespoke Pressablelifelong-habit-app21:05
- refactor(grove): replace custom Done button with HabitActionButton via hideCTAlifelong-habit-app20:30
- feat(dashboard): suppress progress bar and percent for Grove completed statelifelong-habit-app19:57
- feat: add grove archetypelifelong-habit-app16:14
Wed, May 27
- refactor(ui): add new icons to replace StarBullet iconslifelong-habit-app21:17
- feat(SheetTileButton): add compact variant for inline icon+label flex-1 tileslifelong-habit-app20:04
- refactor(ui): add new icons to replace StarBullet iconslifelong-habit-app20:03
- fix(CategoryBreakdown, CategoryRadarChart): adjust margins and sizinglifelong-habit-app17:10
- fix(CategoryRadarChart): reduce wrapperWidth for text positionlifelong-habit-app16:55
- feat(progress): create habit_status_logs table and scope all queries to user_idlifelong-habit-app16:50
- fix(progress): scope habit_status_logs queries to current userlifelong-habit-app16:21
- feat: add configurable habit pause feature with auto-resume on expirationlifelong-habit-app15:38
- fix(hooks): update habit queries to include legacy archived filtering and improve error handlinglifelong-habit-app15:19
- refactor(HabitSheetActions): add archive functionality with confirmation alertlifelong-habit-app15:19
- feat(progress): integrate inactive periods into habit trackinglifelong-habit-app15:13
- fix(CategoryBreakdown): change pctLabel width to minWidth for better responsivenesslifelong-habit-app10:50
Tue, May 26
- fix(CategoryRadarChart): replace VERTICAL_OVERFLOW with geometry-derived bleed constantslifelong-habit-app13:19
Mon, May 25
- fix(CategoryRadarChart): clamp zero scores to MIN_SCORE to prevent spike polygonlifelong-habit-app15:12
- fix(HabitSheetStats): show life area category from habitCategory, not archetype aliaslifelong-habit-app15:08
- fix(progress): widen radar label wrappers to stop truncating "Relationships"lifelong-habit-app12:30
- fix(progress): lower radar show threshold to >= 1 categorized categorylifelong-habit-app12:17
- feat(progress): octagon radar chart for category consistency + intensitylifelong-habit-app11:55
- fix(dashboard): remove deprecated notes prop and wire isLockIn to HabitDetailSheetlifelong-habit-app06:10
- feat(progress): category % breakdown in daily and weekly views; remove dashboard filterlifelong-habit-app06:01
Sun, May 24
- fix(journal): adjust close button style and icon sizelifelong-habit-app21:33
- feat(journal): add selection mode with bulk copy and deletelifelong-habit-app21:23
- chore(dependencies): add expo-clipboard packagelifelong-habit-app21:21
- fix(journal): adjust paddingBottom for keyboard height and remove long-press hintlifelong-habit-app20:36
- fix(journal): implement useKeyboardHeight hook for dynamic keyboard handlinglifelong-habit-app20:26
- fix(journal): fix invisible typed text, keyboard layout, and send button positionlifelong-habit-app20:25
- fix(journal): replace broken icon import and use TouchableOpacity with AddCircle for submit buttonlifelong-habit-app20:06
- feat(ui): move habit journal to dedicated full-screen routelifelong-habit-app19:58
- fix(backdate): remove 90-day window enforcement for non-Lock In modelifelong-habit-app17:44
- fix(snowball): forward unitLogged through onLogIt prop and HabitCardRendererlifelong-habit-app17:40
- feat(db): add GROVE archetype variantlifelong-habit-app17:33
- feat(ui): add HabitSheetJournalThread and HabitSheetJournalInput to HabitDetailSheetlifelong-habit-app17:30
- feat(ui): add HabitSheetJournalThread and HabitSheetJournalInput to HabitDetailSheetlifelong-habit-app17:29
- feat(hooks): add useHabitJournalByDate, useAddJournalEntry, useDeleteJournalEntrylifelong-habit-app17:29
- feat(types): add HabitJournalEntry interface to models.tslifelong-habit-app17:24
- feat(db): add habit_journal table with RLS and indexeslifelong-habit-app17:24
- chore(pullSync): remove obsolete pullSync service filelifelong-habit-app10:56
- fix(SnowballCard): make unit label part of count tap target for inline editlifelong-habit-app09:56
Sat, May 23
- refactor(progress): include year in date labels for daily and weekly viewslifelong-habit-app19:55
- perf(dashboard): eliminate per-card Supabase queries on mountlifelong-habit-app19:44
- fix(progress): guard weekly cells against pre-creation dates and fix summary denominator to elapsed actionable days onlylifelong-habit-app19:39
- fix(habit-time-log): forward startTime from AddSessionSheet to addManualSession mutationlifelong-habit-app15:27
- perf(dashboard): defer category filter list restoration via useTransitionlifelong-habit-app13:54
- fix(seed-db): remove unused icon_name field from template processinglifelong-habit-app12:22
- refactor(duplicate-habit): seed habit_category from source habit for new duplicateslifelong-habit-app12:22
- feat(habits): add user-configurable habit_category fieldlifelong-habit-app12:16
- chore(habits): change migration file namelifelong-habit-app11:55
Fri, May 22
- feat(progress): add OverviewSummaryBar with completed/in-progress/not-completed counts to daily and weekly overview sectionslifelong-habit-app22:22
- fix(progress): add missed to DailyHabitStatus and handle in DailyHabitRowlifelong-habit-app21:24
- feat(progress): add day navigation to DailyOverviewSectionlifelong-habit-app21:24
- refactor(habit-form): update placeholder text for description inputlifelong-habit-app21:04
- fix(duplicate-habit): seed stopwatch_enabled from source habitlifelong-habit-app17:55
- fix(habit-form): reduce bottom padding in ScrollView contentlifelong-habit-app17:40
- refactor(habit-form): move description field before preferred time pickerlifelong-habit-app17:36
- Revert "fix(keyboard): add KeyboardAvoidingView to deep-dive and edit-habit screens"lifelong-habit-app17:35
- Revert "fix(form): increase scroll bottom padding and reduce description minHeight for tall keyboards"lifelong-habit-app17:35
- Revert "fix(keyboard): revert static padding hack, use automaticallyAdjustKeyboardInsets on ScrollView"lifelong-habit-app17:35
- fix(keyboard): revert static padding hack, use automaticallyAdjustKeyboardInsets on ScrollViewlifelong-habit-app17:25
- fix(form): increase scroll bottom padding and reduce description minHeight for tall keyboardslifelong-habit-app17:06
- fix(android): add softwareKeyboardLayoutMode resize to app.config.jslifelong-habit-app17:05
- fix(keyboard): add KeyboardAvoidingView to deep-dive and edit-habit screenslifelong-habit-app17:05
- fix(deep-dive): correct HabitFormCtaButton prop name accentColor → habitColorlifelong-habit-app15:59
- feat(habit): add user-authored description fieldlifelong-habit-app15:55
Thu, May 21
- refactor(iconRegistry): add new Washing Machine and Microphone icons to inventorylifelong-habit-app22:47
- refactor(iconRegistry): add new health and social icons to icon inventorylifelong-habit-app20:19
- chore(HabitCardGallery): adjust comment formatting for claritylifelong-habit-app20:18
- fix(BentoForm): emit correct post-move config in handleMovelifelong-habit-app16:16
- refactor(iconRegistry): update MoonStars icon entry and reorder nature-star entrylifelong-habit-app16:16
Wed, May 20
- fix(progress): wire DailyOverviewSection into progress screenlifelong-habit-app20:13
- feat(progress): add daily view with per-habit status and intensity barlifelong-habit-app19:40
- refactor(progress): use fluid flex layout for weekly grid columnslifelong-habit-app19:03
- feat(HabitTimePicker): switch minute steps to 5-min intervals with snap-to-nearest indexlifelong-habit-app17:56
Tue, May 19
- fix(AddSessionSheet): adjust TimeInput layout for better responsiveness on small screenslifelong-habit-app20:39
- fix(time-log): use typed start time for manual sessions, fix keyboard layoutlifelong-habit-app17:53
- fix(dashboard): bleed AllDayIconStrip scroll past parent paddinglifelong-habit-app17:31
- feat(tabs): hoist RunningStopwatchBar to tab layout for global visibilitylifelong-habit-app17:13
- fix(HabitCardGallery): remove orphaned gallery banner block causing double bannerlifelong-habit-app16:45
- refactor: update terminology from 'anytime' to 'allDay'lifelong-habit-app16:26
Fri, May 15
- refactor(icons): streamline icon_key handling on dashboard and weekly overviewlifelong-habit-app15:26
- refactor(TimeOfDayScreen): update description for custom schedule templatelifelong-habit-app15:22
- fix(config): add specified runtimeVersionlifelong-habit-app08:10
- chore: remove android directory from gitlifelong-habit-app08:10
- chore: update .gitignorelifelong-habit-app08:06
- chore(gitignore): update .gitignore to include ios and android directorieslifelong-habit-app07:58
- fix(icon): solve icon loading error and add a backup icon in HabitSheetHeaderlifelong-habit-app07:54
- refactor(icons): update icon inventory and categories for house and naturelifelong-habit-app07:44
- refactor(config): remove navigation config from app config to solve eas build errorlifelong-habit-app07:31
- chore(package): change script name to fix dependency conflictlifelong-habit-app07:27
- chore(build): fix AndroidManifest gradle flaglifelong-habit-app07:26
- chore: remove generated native folders (ios and android) from .gitignorelifelong-habit-app07:10
Thu, May 14
- chore: remove outdated commentslifelong-habit-app23:58
- refactor(habit): replace icon_name with icon_key and remove coverImageUri fieldlifelong-habit-app23:39
- refactor(habit): replace icon_name with icon_key, add color_id, and remove unused cover_image_uri fieldlifelong-habit-app23:16
- fix(stopwatch): update habitIconKey to use icon_key (icon_name is a stale field)lifelong-habit-app22:40
- refactor(icons): reorganize icon imports for optimal treeshakinglifelong-habit-app22:18
- refactor(icons): replace direct icon imports with UI_ICONSlifelong-habit-app21:42
- fix(usePullSync): update useAuth import pathlifelong-habit-app21:18
- feat(sync): implement pull sync functionality to transfer data from Supabase to local SQLitelifelong-habit-app19:57
- chore: update dependencies in package.jsonlifelong-habit-app19:51
- refactor(icons): integrate PlanetBold icon into UI_ICONS and remove direct PlanetBold icon imports for optimal treeshakinglifelong-habit-app19:11
- refactor(progress): add PROGRESS_LOGS_QUERY_KEY for consistent cache invalidation across habit mutationslifelong-habit-app16:46
- feat(dashboard): add isInProgress prop to habit card components and useSelectedDateLoglifelong-habit-app16:09
- fix(useDashboard): update completion_status logiclifelong-habit-app15:36
- chore(dashboard): remove unused component (already replaced with AllDayIconStrip)lifelong-habit-app08:15
- fix(dashboard): remount AllDay expanded card on habit switch and remove paddingToplifelong-habit-app08:13
Wed, May 13
- fix(useWeeklyOverview): update icon resolution to use icon_key with fallback to Planetlifelong-habit-app23:14
- refactor(useProgressMetrics): sort habits based on preferred_time on progress tablifelong-habit-app23:13
- refactor(HabitCardGallery): improve banner text color handling (it returned false) and clean up dead codelifelong-habit-app22:39
- refactor(AllDayIconStrip): adjust padding, icon dimensions and colorlifelong-habit-app22:35
- refactor(habitCardBanner): update banner text color contrast from white to light beigelifelong-habit-app22:34
- feat(dashboard): add All-DayIconStrip component, remove InProgress section, and update useDashboard hooklifelong-habit-app21:24
- refactor(dashboard): update buildSectionOrder to prioritize rendering 'anytime' (which will be all-day) habitslifelong-habit-app21:17
- refactor(progress): update weekly overview styling, each habit has its own cardlifelong-habit-app12:33
- refactor(progress): implement weekly overview with view mode switcher and default habit color fallbacklifelong-habit-app10:52
- feat(progress): weekly overview with view switcherlifelong-habit-app10:52
- feat(dashboard): extract HabitSectionList into HabitSectionStates, InProgressIconStrip, and TimeSectionHeader componentslifelong-habit-app09:51
- refactor(icons): update icon references in PickerSearchBar, StartOfWeekScreen, and TimeOfDayScreenlifelong-habit-app08:39
Tue, May 12
- feat(dashboard): replace In Progress section with icon striplifelong-habit-app22:39
- refactor(icons): update icon references and stylinglifelong-habit-app22:26
- refactor(icons): update icon references and stylinglifelong-habit-app22:17
- fix(services): add missing completionStatus to recomputeSessionLoglifelong-habit-app19:34
- fix(mutations): add missing completionStatus to useBackdateHabitlifelong-habit-app17:10
- fix(bento): component deletion not saved, new components appearing on past-date cardslifelong-habit-app12:15
- fix(HabitDetailSheet): anchor sheet with position absolute to remove slide gaplifelong-habit-app08:29
- fix(color-icon-picker): anchor sheet with position absolute to remove slide gaplifelong-habit-app07:54
Mon, May 11
- refactor(ui): update IconPanel styles to use flexbox for responsive layoutlifelong-habit-app23:26
- feat(icon-panel): derive column count automatically from screen widthlifelong-habit-app23:21
- chore(ui): change icon typolifelong-habit-app23:21
- refactor(ui): replace Planet3 icon with Planet in HabitCardGallery, RunningStopwatchBar, and HabitIconPreview componentslifelong-habit-app23:02
- refactor(ui): remove duotone option from iconRegistrylifelong-habit-app23:01
- fix(android): clear gesture nav bar inset on bottom UI elementslifelong-habit-app22:47
- refactor(HabitSheetStats): conditionally fetch sessions and display tracked time based on stopwatch_enabledlifelong-habit-app22:28
- chore(useCurrentUser): add comment to clarify that this isn't a copy of useUser filelifelong-habit-app20:29
- refactor: update import paths, export paths, and file nameslifelong-habit-app20:16
- refactor: rename useArchivedHabits to useInactiveHabitslifelong-habit-app20:07
- fix: update habit color changes instantly on the dashboardlifelong-habit-app18:05
- refactor(TimeOfDayScreen): add template picker modal for time-of-day schedule selectionlifelong-habit-app17:51
- refactor(SnowballCard): remove not completed message as HabitCardGallery already has it as defaultlifelong-habit-app17:46
- refactor(settings): add warning for duplicate time slot labelslifelong-habit-app17:22
- fix(settings): use counter instead of Date.now() to create custom slot IDslifelong-habit-app17:11
- fix(settings): fix schedule cache invalidation and reassignment sheetlifelong-habit-app17:00
- feat(settings): add dynamic time-of-day schedule systemlifelong-habit-app16:08
- fix(mutations): correct completionStatus in log and unlog habit pathslifelong-habit-app14:02
- feat(hooks): add IN_PROGRESS completion status for stopwatch sessionslifelong-habit-app13:36
- chore(migrations): change migration file nameslifelong-habit-app13:26
- fix(hooks): ensure fresh log data is fetched and used for time elapsed updateslifelong-habit-app13:20
- fix(dashboard): bucket any habit with time_elapsed_seconds > 1 as In Progresslifelong-habit-app08:29
Sun, May 10
- fix(header): move search toggle button to the leftmostlifelong-habit-app15:59
- fix(dashboard): include paused stopwatch sessions in In Progress bucketlifelong-habit-app15:52
- feat(time-of-day): add 'night' bucket and adjust related logiclifelong-habit-app14:38
- feat(dashboard): add In Progress section; bucket by intensity_percentlifelong-habit-app08:47
Sat, May 9
- feat(dashboard): add toggleable habit search with local filteringlifelong-habit-app23:16
- perf(icon-picker): lazy-load icons, FlashList virtualization, O(1) lookuplifelong-habit-app23:11
- chore(HabitCardGallery): remove unused componentslifelong-habit-app19:56
- refactor(RunningStopwatchBar): add habit icon component and adjust layout propertieslifelong-habit-app19:29
- refactor(RunningStopwatchBar): add pause functionality in stopwatch chiplifelong-habit-app17:06
- refactor(RunningStopwatchBar): update chip background from solid color to gradient and adjust text color logiclifelong-habit-app12:30
- refactor(RunningStopwatchBar): change stopwatch chip color from white to colorHabit and adjust text stylinglifelong-habit-app12:09
- refactor: rename habitCustomColor to habitColor across componentslifelong-habit-app11:51
- refacator(RunningStopwatchBar): simplify stopwatch chip rendering by removing animation and exit logiclifelong-habit-app07:40
- refactor(RunningStopwatchBar): remove bottomOffset prop so the first stopwatch chip doesn't slide uplifelong-habit-app07:21
Fri, May 8
- refactor(RunningStopwatchBar): optimize Pressable layout so the habit name and stopwatch inside the chip doesn't stack verticallylifelong-habit-app12:32
- refactor(index): restructure dashboard layout for RunningStopwatchBarlifelong-habit-app12:31
- refactor(RunningStopwatchBar): remove pulse dot in chip layoutlifelong-habit-app11:20
- refactor(RunningStopwatchBar): change bar UI to use chips instead of one big modal to display running sessionslifelong-habit-app10:37
- fix(stopwatch): prevent flicker and stopwatch bar being disappeared during background refetchlifelong-habit-app08:47
- feat(stopwatch): implement running stopwatch bar and overflow modal functionalitylifelong-habit-app07:21
Thu, May 7
- fix(layout): adjust bottom padding when the navigation buttons are activelifelong-habit-app21:56
- refactor(layout): add safe area insets for tab bar padding when the button mode is used as navigation on Androidlifelong-habit-app21:55
- refactor(HabitSheetHeader): remove unused RepeatIcon componentlifelong-habit-app21:36
- refactor: replace accent color with habitCustomColor in BentoCard and LadderCard componentslifelong-habit-app20:31
- refactor: rename accentColor to habitCustomColor across componentslifelong-habit-app20:17
- chore(habit-time-log): remove dead bedTime variablelifelong-habit-app20:17
- refactor(settings): simplify completedSectionValue function by removing sort parameterlifelong-habit-app19:58
- fix(dashboard): guard undefined preferred_time and null logged_at in sort comparatorslifelong-habit-app19:43
- fix(stopwatch): return the elapsed seconds so the timer doesn't reset to 0 every time user opens the applifelong-habit-app19:39
- refactor(hooks): add missing timeElapsedSeconds field to useBackdateHabit and useLogHabit payloadslifelong-habit-app14:04
- refactor(database): remove wake_time, bed_time, and use_relative_time columns from users tablelifelong-habit-app14:03
- refactor(day-boundary): remove bedTime dependency across componentslifelong-habit-app13:42
- refactor(day-boundary): remove DayBoundaryScreen and related hooks from onboarding and settingslifelong-habit-app13:40
- refactor(day-boundary): remove bedTime prop from various components and use useUser to fetch user datalifelong-habit-app13:29
- refactor(ui): add closeCircle icon to ColorIconPickerSheet and remove starBullets iconlifelong-habit-app13:15
Wed, May 6
- refactor(ui): remove colors prop from GroupedCard componentslifelong-habit-app22:08
- refactor(ui): remove colors prop from GroupedCard and GroupedRow components, use useTheme insteadlifelong-habit-app22:08
- feat(ui): add semi-bold subheading style to textStyleslifelong-habit-app22:07
- perfdeps): add @shopify/flash-list package and change metro config to improve icon loading performancelifelong-habit-app21:12
- refactor(ui): switch stopwatch icon type from outline to boldlifelong-habit-app20:20
Tue, May 5
- refactor(ui): center align time input fields and simplify button styles in AddSessionSheetlifelong-habit-app23:45
- refactor(ui): update header and description for manual time loglifelong-habit-app23:28
- feat(ui): add new icons for sleep-related featureslifelong-habit-app23:12
- chore(InitialLayout): remove debug console log for cleaner outputlifelong-habit-app23:10
- refactor(AddSessionSheet): pre-fill start and end time fields based on last closed sessionlifelong-habit-app23:09
- feat(AddSessionSheet): implement start and end time inputs with duration calculationlifelong-habit-app23:08
- style(SessionRow): update delete hint to clarify long press action for hidinglifelong-habit-app22:18
- feat(habitTimeLog): add live elapsed time tracking and session range display (started at X until Y)lifelong-habit-app22:17
- chore(habitForm): update import path for ColorIconPickerSheet componentlifelong-habit-app18:16
- feat(habitTimeLog): implement AddSessionSheet and SessionRow components with live elapsed time trackinglifelong-habit-app18:16
- refactor(confirmSheet): swap confirm and cancel button actions and center title textlifelong-habit-app18:15
- refactor(colorPicker): change directory name from color-habit-picker to colorHabitPickerlifelong-habit-app17:50
- refactor(habitTimePicker): remove accentColor prop and use colors.accent insteadlifelong-habit-app17:34
- fix(habitForm): disable stopwatch by default in habit draftlifelong-habit-app17:33
- style(habitTimeLog): update no session recorded messagelifelong-habit-app17:33
- fix(habitCardGallery): display stopwatch content only for today's habitslifelong-habit-app17:16
- feat(habitTimeLog): implement manual session addition and deletion functionalitylifelong-habit-app17:16
- refactor(stopwatch): add invisible placeholder during initialization to prevent layout shiftslifelong-habit-app17:04
- fix(stopwatch): integrate seek offset functionality into session mutations so the stopwatch doesn't snap back when the backward or forward button is pressedlifelong-habit-app15:00
- feat(stopwatch): implement seek offset functionality for 15-second backward and forward functionslifelong-habit-app14:39
- feat(iconRegistry): add new food and medicine icons to the icon inventorylifelong-habit-app14:23
- feat(dashboard): synchronize personal day handling across session logging and querieslifelong-habit-app10:02
- feat(dashboard): enhance habit tracking with personal day handling and stopwatch improvementslifelong-habit-app08:43
Mon, May 4
- feat(completed-habits): add CompletedHabitsScreen and update settings for completed habits sectionlifelong-habit-app17:06
- refactor(icons): update AccountInfoScreen to use UI_ICONS for edit and reset actionslifelong-habit-app16:21
- refactor(settings): update route entry points to delegate to feature componentslifelong-habit-app16:20
- chore(dependencies): remove @expo/vector-icons from package.json and package-lock.jsonlifelong-habit-app15:38
- refactor(icons): replace Feather icons with UI_ICONS in various componentslifelong-habit-app15:34
- refactor(icons): replace Ionicons with UI_ICONS in HabitValidationModal componentlifelong-habit-app15:24
- refactor(icons): replace Ionicons with UI_ICONS in HabitStatusBadge, AuthWallModal, and HabitTimePicker componentslifelong-habit-app15:21
- fix(settings): capitalize icon prop before JSX usage in GroupedRow and SegmentedRow (JSX requires component names to start with a capital letter)lifelong-habit-app15:02
- feat(DashboardScreen): add selectedDateLogsById to track daily logs for todaylifelong-habit-app14:44
- refactor(icons): replace Ionicons with UI_ICONS across multiple componentslifelong-habit-app14:43
- refactor(icons): replace Ionicons with UI_ICONS in HabitActionButton, HabitStatusBadge, BentoForm, and LadderForm componentslifelong-habit-app14:16
- feat(completedHabitsSort): implement user preference for sorting completed habits in the Done sectionlifelong-habit-app14:16
Sun, May 3
- chore(useStopwatch): remove console loglifelong-habit-app22:15
- fix(HabitCardRenderer): replace dynamic require() with static import for useDateLoglifelong-habit-app22:14
- fix(stopwatch): replace dynamic require() with static import in HabitCardRenderer and fetch live daily_log value before accumulating in closeSession to prevent stale cache baselinelifelong-habit-app22:14
- refactor(icons): replace Ionicons with UI_ICONS in HabitCardGallery, RollingCalendarStrip, SnowballCard, and TimeSetupBanner componentslifelong-habit-app21:46
- refactor(icons): replace Ionicons with UI_ICONS in ForgotPasswordScreen, LoginScreen, ResetPasswordScreen, and SignupScreenlifelong-habit-app15:02
- refactor(icons): replace Ionicons with UI_ICONS in ChallengeDetailsScreen, DayBoundaryScreen, LibraryScreen, StartOfWeekScreen, and update icons in categoryRegistrylifelong-habit-app14:59
- refactor(icons): replace Ionicons with UI_ICONS in ChallengeDetailsScreen and TemplateCard componentslifelong-habit-app07:11
- refactor(icons): replace Ionicons with UI_ICONS across multiple componentslifelong-habit-app05:49
Sat, May 2
- style(icons): add new Pen, Clock, and Weather icons to icon registrylifelong-habit-app22:30
- fix(icons): update HabitSectionList to use UI_ICONS and fix import errorslifelong-habit-app21:46
- refactor: replace Ionicons with UI_ICONS in HabitSectionList and AuthBanner componentslifelong-habit-app20:54
- feat: add new weather and time icons to UI_ICONSlifelong-habit-app20:53
- chore: remove html email templates from codebaselifelong-habit-app20:52
- chore: remove comment using Ioniconslifelong-habit-app20:40
- chore: remove lucide-react-native dependencylifelong-habit-app20:39
- fix(IconPanel): use resolved weight for icon rendering instead of defaulting to 'regular'lifelong-habit-app20:39
- refactor(HabitSheetHeader): remove unused BookmarkSimpleIcon import and make Planet icon as defaultlifelong-habit-app19:40
- fix(IconPanel): resolve icons through registry instead of reading entry.component directlylifelong-habit-app19:30
- refactor(icons): migrate iconRegistry to multi-style Solar/Phosphor architecturelifelong-habit-app19:29
- chore: remove unused components and hooks from the projectlifelong-habit-app15:50
- chore: remove unused dependencieslifelong-habit-app15:48
- chore: remove unused email templates and scriptslifelong-habit-app15:05
- chore: add knip and @types/node dependencieslifelong-habit-app15:05
- chore: remove unused dependencies from package.jsonlifelong-habit-app14:57
- chore: add @sentry/react-native dependency to package.jsonlifelong-habit-app14:54
- chore(eas.json): add channel field to preview configurationlifelong-habit-app14:41
- debug(useStopwatch): add console.loglifelong-habit-app14:39
- chore(app config): add updates URL and runtime version policy to push update on the app without rebuildinglifelong-habit-app14:18
- chore(dependencies): add expo-updates packagelifelong-habit-app14:15
- perf(RootLayout): integrate AppState with TanStack Query's focus manager for consistent query handling (even if the app is closed)lifelong-habit-app14:08
- fix(useStopwatch): resolve elapsed time desynchronization on app resume and refetchlifelong-habit-app13:57
Fri, May 1
- feat(HabitDetailSheet): scope HabitTimeLog to selected date add and improve HabitTimeLog screen layoutlifelong-habit-app21:43
- style(HabitSheetHeader): increase icon size and container dimensionslifelong-habit-app19:53
- fix(iconRegistry): make resolveIcon case-insensitivelifelong-habit-app19:50
- style(SnowballCard): update icon components and add marginTop for progress barlifelong-habit-app16:17
- style(LadderCard): remove top margin from vertical ladder UI containerlifelong-habit-app15:41
- style(HabitCardGallery): adjust top padding for habit card bodylifelong-habit-app15:40
- style(HabitStopwatchCompact): reorganize stopwatch controlslifelong-habit-app15:40
- style(HabitStopwatchCompact): increase icon sizes and update text color for better visibilitylifelong-habit-app15:33
- style(HabitCardGallery): add bodyMdBold text style and update HabitCardGallery to use itlifelong-habit-app15:31
- fix(HabitCardGallery): display stopwatch content only if it's todaylifelong-habit-app15:16
- style(HabitCard): add bodySmBold style and apply it to habit cardlifelong-habit-app14:57
- style(habit-stopwatch): update muted accent color opacity to 65%lifelong-habit-app14:52
- fix(cards): separate stopwatch into dedicated layout slotlifelong-habit-app14:08
- style(habit-time-log): update empty state message from 'No session yet' to 'Not recorded yet'lifelong-habit-app13:05
- fix(stopwatch): route bento/pillar auto-log through upsertDailyLog to preserve is_strict_mode_enabled and all existing log fieldslifelong-habit-app12:55
- style(habit-stopwatch): update icon colors to use muted accent when disabled or not runninglifelong-habit-app12:53
- style(habit-stopwatch): add colorHex prop to customize icon colors based on habit colorlifelong-habit-app12:37
- style(habit-icon-preview): update default display name to 'Morning Run' and change text style to heading3lifelong-habit-app12:37
- style(stopwatch): change rewind and restart icons for HabitStopwatchCompactlifelong-habit-app12:16
- refactor(deep-dive): initialize draft with DEFAULT_HABIT_DRAFT, remove unused makeBlankDraft, and make preferred_time 8AM and stopwatch_enabled true by defaultlifelong-habit-app11:51
- fix(habit-form): update stopwatch disabled messagelifelong-habit-app10:31
Thu, Apr 30
- feat(stopwatch): add stopwatch_enabled toggle to habit form and wire time_elapsed_seconds through upsertlifelong-habit-app22:17
- feat: implement phase 3 stopwatch functionalitylifelong-habit-app18:53
- feat: add compact stopwatch functionality to habit cardslifelong-habit-app15:04
Wed, Apr 29
- feat(profile): add username and profile visibility fields to User and Habit interfaceslifelong-habit-app21:20
- style(settings): change Habit Schedule to Schedulelifelong-habit-app16:26
- refactor(progress): adjust ItemSeparator height and contentContainerStyle gaplifelong-habit-app16:25
- perf(progress): fix VirtualizedList slow update warninglifelong-habit-app15:35
- refactor(heatmap): render the grid reversed and use contentOffset to set the initial position declaratively, so the ScrollView starts at the rightmost position without any imperative scroll calllifelong-habit-app15:29
- fix(progress): correct color_hex field naming and heatmap color inheritancelifelong-habit-app14:50
- refactor(year_selector): update text styles and spacing for readabilitylifelong-habit-app14:08
- feat(progress): replace YearSelector arrows with modal sheet pickerlifelong-habit-app13:45
Tue, Apr 28
- feat(year_selector): implement modal year picker to improve performancelifelong-habit-app22:22
- fix(heatmap): drop overlapping month labels in buildGridlifelong-habit-app21:56
- perf(progress): memo-wrap heatmap cards and stabilise FlatList propslifelong-habit-app21:53
- refactor(progress): enhance HabitHeatmap with horizontal scrolling and auto-scroll to latest datalifelong-habit-app21:28
- perf(progress): virtualise heatmap list and centralise computationlifelong-habit-app17:14
Mon, Apr 27
- feat(habit_sessions): add habit_sessions table migration and HabitSession interface for stopwatch trackinglifelong-habit-app21:15
- chore(useLogHabit): fix misleading console.log labellifelong-habit-app18:14
- fix(useUnlogHabit): remove unnecessary .select().single() on deletelifelong-habit-app18:13
- perf(queries): add 90-day floor to useLastLoggedValueslifelong-habit-app18:13
- refactor(queries): stabilise useConsistency query keylifelong-habit-app18:11
- fix(bento): resolve checkbox oscillation on rapid tapslifelong-habit-app15:55
Sun, Apr 26
- fix: restore habit reflects immediately without reloadlifelong-habit-app15:32
- fix(useBackdateHabit): use optimistic updates and cache invalidation for backdated logslifelong-habit-app14:38
- fix(SnowballCard): hide progress bar when past-date count is decremented to zerolifelong-habit-app11:44
- fix(SnowballCard): eliminate stepper lag and restore "Not completed" on decrement to zerolifelong-habit-app11:42
- fix(SnowballCard): show "Not completed" on past dates with no loglifelong-habit-app11:35
- feat(dashboard): require confirmation before editing past-date logs on Bento, Ladder, and Snowball cardslifelong-habit-app11:31
- fix(HabitCardGallery): hide Done button on past dates, show only missed state (Not Completed)lifelong-habit-app11:16
Sat, Apr 25
- style(HabitActionButton): update text from "Done?" to "Done"lifelong-habit-app21:46
- style(HabitCardGallery): shorten progress display textlifelong-habit-app21:44
- style(HabitActionButton): change button background color to be filled with habit colorlifelong-habit-app21:43
- refactor(HabitCardGallery): remove long press action handling for habit managementlifelong-habit-app21:32
- style(HabitActionButton): fill card width responsively in gallery modelifelong-habit-app21:32
- style(SnowballCard): adjust stepper icon size and spacinglifelong-habit-app21:05
- style(HabitCardGallery): move progress display text after the checkmark iconlifelong-habit-app21:05
- fix(HabitCardGallery): cap displayed progress to 999%+ to prevent layout breakinglifelong-habit-app20:59
- fix(SnowballCard): adjust unit label text sizelifelong-habit-app20:25
- feat(HabitCard): thread isToday to all archetypes for missed state + % in completed rowlifelong-habit-app20:18
- fix(snowball): stepper always visible on today, hidden on past dateslifelong-habit-app19:57
Fri, Apr 24
- refactor(progress): optimize habit ID handling in useProgressMetrics and useProgressLogs to improve caching and performancelifelong-habit-app23:08
- refactor(snowball): remove complete button and automatically log progress based on stepper valuelifelong-habit-app23:07
- refactor(SnowballCard): change stepper buttons with icons and improve stylinglifelong-habit-app22:30
- refactor(LadderCard): simplify rung selection logic, now logging only takes rung selection and complete button is removedlifelong-habit-app20:56
- refactor(progress): streamline data fetching by consolidating habit and log queries into useProgressMetricslifelong-habit-app19:15
- feat(progress): implement GitHub-style heatmap for habit tracking and replace time range selector with year selectorlifelong-habit-app18:43
- style(habitFormStyles): remove top margin from habit form cardlifelong-habit-app17:20
- style(SnowballForm): update layout and labels for input fieldslifelong-habit-app17:19
- style(ArchetypeSelector): update info text for archetypes and adjust icon colorlifelong-habit-app16:37
- style(habitFormStyles): adjust margins for card and draft card headerlifelong-habit-app15:47
- refactor(habit): remove unused strict mode featurelifelong-habit-app15:47
- style(ArchetypeSelector): update info icon and text layoutlifelong-habit-app15:46
- refactor(habit): simplify create habit screen for one habit onlylifelong-habit-app15:40
- style(BentoRow): adjust input width and spacer at min component countlifelong-habit-app14:21
- refactor(BentoRow): conditionally render reorder buttons and adjust weight input layoutlifelong-habit-app14:16
- refactor(archetypeSelector): update descriptions for habit archetypeslifelong-habit-app14:03
- style(habitFormStyles): reduce card margins and paddinglifelong-habit-app13:55
- refactor(habit): extract HabitForm component and update DeepDiveScreenlifelong-habit-app13:00
Thu, Apr 23
- refactor(iconRegistry): add medicine icons and update categorielifelong-habit-app23:13
- fix(streak): use local date and don't break streak if today is unloggedlifelong-habit-app20:47
- chore(stats-grid): remove unused filelifelong-habit-app20:45
- fix(habit-stats): improve streak value formatting (1 day instead of 1 days)lifelong-habit-app20:45
- chore(overview-cards): remove redundant comments for claritylifelong-habit-app20:44
- feat(habit): create HabitIconPreview and HabitFormSectionLabel components for consistent UI in habit formslifelong-habit-app20:15
Tue, Apr 21
- feat(iconRegistry): expand icon inventory with new health-related icons and update category labelslifelong-habit-app23:12
- fix(icon-panel): adjust cell dimensions for iconlifelong-habit-app23:11
- style(confirm-sheet): update unsaved changes message and adjust vertical marginlifelong-habit-app19:34
- refactor(quicknote): add discard confirmation for unsaved changes in QuickNoteSheetlifelong-habit-app19:20
- feat(habit): add duplicate habit screen with post-create sheet auto-openlifelong-habit-app18:29
- refactor(habit): extract DeleteHabitSheet, replace 4x hardcoded trash Alertlifelong-habit-app18:14
- fix(bento): prevent checkbox flash on rapid tapslifelong-habit-app15:51
- style(modals): update confirmation text to use curly quotes for consistencylifelong-habit-app15:36
- refactor(settings): replace Alert.alert sign-out with ConfirmSheetlifelong-habit-app15:35
- style(auth): update email placeholder to 'awesomeotter@gmail.com' in ForgotPassword, Login, and Signup screenslifelong-habit-app15:00
- fix(LoginScreen): update text color for 'Forgot password?' link to improve visibilitylifelong-habit-app07:57
- refactor(auth): migrate reset-password to shared auth components and layout hooklifelong-habit-app07:56
- fix(auth): replace SafeAreaView with View in auth layout to fix edge croppinglifelong-habit-app07:56
Mon, Apr 20
- chore: replace straight apostrophes with curly apostropheslifelong-habit-app23:22
- refactor(ForgotPasswordScreen): integrate AuthBackground and AuthBanner components for enhanced UI and messaginglifelong-habit-app23:21
- refactor(SignupScreen): integrate AuthBanner and AuthDivider components for improved error and success messaginglifelong-habit-app23:20
- refactor(LoginScreen): use AuthBackground, AuthBanner, and GuestButton componentslifelong-habit-app23:20
- style(GoogleOAuthButton): update text color to accent to match guest color button textlifelong-habit-app23:19
- style(useAuthLayout): reduce heading margin bottom values for tablet and mobile layoutslifelong-habit-app23:19
- feat(AuthBanner, AuthDivider): extract AuthBanner and AuthDivider components from auth screenlifelong-habit-app23:18
- style(GoogleOAuthButton): add muted background color for improved visibilitylifelong-habit-app23:05
- refactor(SignupScreen): replace hardcoded guest button with GuestButton componentlifelong-habit-app23:04
- refactor(GuestButton): extract guest sign-in button with loading state and dynamic styleslifelong-habit-app23:04
- feat(AuthBackground): enhance cloud and star rendering with dynamic scaling and improved layoutlifelong-habit-app23:01
- style(useAuthLayout): adjust heading margin for improved layout consistencylifelong-habit-app20:21
- style(SignupScreen): update heading text for better user engagementlifelong-habit-app20:21
- feat(SignupScreen): integrate useAuthLayout for responsive design and improved layout consistencylifelong-habit-app19:54
- refactor(auth): make authentication screens to use theme-aware components and improve UI consistencylifelong-habit-app18:45
Sun, Apr 19
- fix(LadderForm): simplify tooltip text for base inputlifelong-habit-app23:16
- feat(LadderForm): add tooltip for peak input sectionlifelong-habit-app23:12
- feat(LadderForm): add tooltip for base input and improve layout for better usabilitylifelong-habit-app23:07
- chore(package): add react-native-popover-view dependency to enhance UI componentslifelong-habit-app22:57
- fix(ArchetypeSelector): set activeOpacity to 1 for TouchableOpacity to prevent color washout on presslifelong-habit-app22:22
- fix(HabitTimePicker): add activeOpacity to TouchableOpacity so the color doesn't get washed out once clickedlifelong-habit-app22:17
- refactor(bento): adjust padding and text styles for improved layout and readabilitylifelong-habit-app22:17
- refactor(edit-habit): remove border and reduce padding to make the form more readablelifelong-habit-app21:55
- fix(dashboard): make quick note sheet height fixed to 80% of screen heightlifelong-habit-app21:41
- feat(dashboard): make quick note auto-saved so content persists after closinglifelong-habit-app21:24
- fix(bento): replace ReorderableList with up/down arrow reorderinglifelong-habit-app19:45
- chore(config): add newArchEnabled in app configlifelong-habit-app19:09
- chore(package): remove react-native-draggable-flatlist into reordable-listlifelong-habit-app19:09
- fix(layout): add GestureHandlerRootView to root layout for drag-and-drop supportlifelong-habit-app03:50
- fix(BentoForm): exclude drag from useCallback deps array so it doesn't cause ReferrenceError before any drag interactionlifelong-habit-app03:46
- feat(BentoForm): add drag and drop feature for Bento componentslifelong-habit-app03:43
- fix(deep-dive): remove undefined callback in handleTimeChange and pass preferred_time to buildHabitPayloadlifelong-habit-app03:41
- chore(package): add react native draggable flatlist dependencylifelong-habit-app03:39
Sat, Apr 18
- style(dashboard): increase component font size in bento card, increase glassmorphic icon pill in habit card and increase icon size inside itlifelong-habit-app20:23
- refactor(iconRegistry): add more iconslifelong-habit-app20:21
Wed, Apr 15
- refactor(HabitCardGallery): change glassmorphic icon pill to circle, change icon color, remove unused codelifelong-habit-app23:02
- refactor(icon): change default_icon_key from bookmark to planet iconlifelong-habit-app23:01
- refactor(validateHabit): add config requirement exception for pillar archetype (it's just yes/no habit, config isn't needed)lifelong-habit-app21:55
- refactor(dashboard): move add new habit icon to headerlifelong-habit-app21:54
- feat(progress): add summary across habits in progress tab (still has bugs)lifelong-habit-app18:18
- feat: add analytics util to turn daily_logs table into metricslifelong-habit-app18:18
- docs: add refactor guide after adding habit config snapshotlifelong-habit-app18:16
- refactor(HabitDetailSheet): change icons inside action buttons and font sizelifelong-habit-app18:02
- refactor(HabitDetailSheet): change icons and combine category + archetypelifelong-habit-app16:26
- feat(stats): freeze habit config at log time to protect historical datalifelong-habit-app16:24
- fix(habit): add streak computation per habitlifelong-habit-app08:53
- refactor(dashboard): add calendar button for future calendar picker featurelifelong-habit-app00:40
Tue, Apr 14
- refactor(HabitCardGallery): add margin bottom below the progress barlifelong-habit-app23:46
- refactor(HabitActionButton): add "Complete" label text backlifelong-habit-app20:32
- feat(app): add day boundary concept, users can personalize time sections based on their wake and bed timelifelong-habit-app19:20
- refactor(HabitCardGallery): move progress % right next to logged labels, increase habit font sizelifelong-habit-app19:07
- refactor(HabitDetailSheet): change icon color when habit is completedlifelong-habit-app19:06
- refactor(HabitActionButton): replace Alert with ConfirmSheetlifelong-habit-app18:50
- feat: add ConfirmSheet component and wire undo-log confirmation in HabitCardGallerylifelong-habit-app18:47
- refactor(dashboard): remove top paddinglifelong-habit-app18:29
- refactor(HabitCard): change complete/incomplete layout, reduce header height, and improve overall UIlifelong-habit-app17:30
- refactor(dashboard): increase dynamic month year font size, reduce icon sizelifelong-habit-app17:27
- fix(progress-bar): use habit colorHex instead of hardcoded sage greenlifelong-habit-app15:43
- fix(unlog): clear date_log cache optimistically on habit undolifelong-habit-app15:27
- refactor(dashboard): change icons for toggle viewlifelong-habit-app14:32
- refactor(dashboard): move view mode toggle to header, remove section labellifelong-habit-app12:00
- refactor(index tab): clip scroll content to rounded divider corners by setting overflow to hiddenlifelong-habit-app11:40
- refactor(dashboard): change tray icon to note iconlifelong-habit-app10:23
- refactor(themeRegistry): change Morning Light theme tokens to be less warmlifelong-habit-app10:23
- fix(dashboard): restructure layout to fix card height, add Android elevation wrapper and iOS shadow on rounded dividerlifelong-habit-app10:22
Mon, Apr 13
- refactor(tabs): change icons from Ionicon to SolarIconlifelong-habit-app23:13
- refactor(dashboard): redesign header and calendar UIlifelong-habit-app22:29
- refactor(dashboard): make habit cards fetch data from selected day, not today by adding useSelectedDateLoglifelong-habit-app22:28
- docs: remove old docs and combine them into onelifelong-habit-app22:22
- docs: update outdate documentationlifelong-habit-app19:38
- refactor(HabitSheetActions): change duplicate to copy and add archive button UIlifelong-habit-app19:38
- refactor (useDashboard): make default color as color accent instead of hardcoded hex codelifelong-habit-app18:48
- refactor(constants): change color scheme from gold to cocoalifelong-habit-app18:47
- refactor(HabitSheetStats): add category field, change font stylinglifelong-habit-app18:47
- refactor (HabitCardGallery): remove label pill, edit and calendar buttonslifelong-habit-app18:45
Sun, Apr 12
- refactor(HabitDetailSheet): add HabitSheetStats component and make the label and the content in one row and use colorHexlifelong-habit-app23:38
- fix(HabitDetailSheet): make useHabitCardColors nullablelifelong-habit-app23:17
- refactor: change MetricCell to StatRow so the fields displayed in rowslifelong-habit-app23:15
- refaactor: adjust action buttons to use colorHex and adjust the button heightlifelong-habit-app22:15
- refactor: change category mapping nameslifelong-habit-app21:53
- feat(HabitDetailSheet): reusable SheetTileButton atom, drop StyleSheet for NativeWindlifelong-habit-app21:52
- refactor(HabitDetailSheet): make the sheet layout more organizedlifelong-habit-app19:41
- fix(HabitDetailSheet): replace custom Animated slide with native animationType="slide"lifelong-habit-app19:12
- fix(HabitDetailSheet): add hardcoded bottom padding to debug, fix AnimatedView hardcoded to 600 (it assumed the height never grows more than 600px)lifelong-habit-app19:03
- fix(HabitDetailSheet): make a componet triggered when pressing a habit card (for now it's still empty somehow)lifelong-habit-app18:48
- feat: add HabitDetailSheet componentlifelong-habit-app18:30
- refactor: move useColorPresets to dashboard directorylifelong-habit-app18:29
- refactor: move color-habit-picker component to features/dashboardlifelong-habit-app17:51
- refactor: make font size for habit name and time biggerlifelong-habit-app17:51
- refactor(habitCardBanner): change gradient computationlifelong-habit-app17:51
- refactor: remove color_id fieldlifelong-habit-app17:49
- feat: add coverImageUri fieldlifelong-habit-app15:12
- refactor: add habitCardBanner and tighten habit card gallerylifelong-habit-app14:45
- refactor: move edit button to be in the left side of complete button in compact modelifelong-habit-app14:41
- feat: add a shared component for color & icon pickerlifelong-habit-app14:40
- refactor: make the screen height 88%lifelong-habit-app14:39
- refactor: remove PickerPreviewlifelong-habit-app14:14
Sat, Apr 11
- refactor: add categoryRegistry, remove category and archetype default colorslifelong-habit-app19:16
- chore: fix importslifelong-habit-app19:14
- refactor: change theme-registry to themeRegistry for naming consistencylifelong-habit-app17:52
- chore: remove scrollView from SwatchRow to reduce the big gap between swatch row and color/icon tabslifelong-habit-app16:48
- chore: remove hue-related commentlifelong-habit-app16:45
- refactor: remove hue handler, it's overkill for this color picker featurelifelong-habit-app16:44
- fix: remove color_id from being saved in database, it should stay only in DraftHabit and the field doesn't exist and is unnecessary to be in dblifelong-habit-app16:43
Thu, Apr 9
- refactor: integrate color icon picker feature in habit dashboardlifelong-habit-app20:39
- feat: add color icon picker featurelifelong-habit-app20:38
- refactor(color picker): added colorPalette constants and update theme-registrylifelong-habit-app15:57
- chore: added expo linear gradient dependencylifelong-habit-app15:57
- chore: update new importslifelong-habit-app14:22
- refactor: move /shared directory from root to featureslifelong-habit-app14:17
- chore: add solar-icon and phosphor icon dependencieslifelong-habit-app12:13
- chore: change wordinglifelong-habit-app12:06
- refactor(dashboard): reduce margin in ArchetypeSelector for create habit screenlifelong-habit-app11:57
- refactor: add time picker to create habit screenlifelong-habit-app11:50
- refactor: change account name font color, remove unused var, change masked email comment to my namelifelong-habit-app11:30
- refactor: remove estimated time from habit dashboardlifelong-habit-app11:29
- chore: change default masked email comment to my namelifelong-habit-app11:29
- refactor: remove estimated time from habit dashboardlifelong-habit-app11:28
- style(constant): change scrimForegound hex codelifelong-habit-app06:40
- style: change hardcoded colors and adjust otherslifelong-habit-app06:40
- refactor: change some colorslifelong-habit-app06:38
Wed, Apr 8
- chore(build): import supabaseURL and supabaseAnonKey directly from expo constant for app buildlifelong-habit-app21:29
- refactor: remove ignoreDuplicates in seed-db to allow template replacementlifelong-habit-app21:28
- style(discover): improve habit template copywritinglifelong-habit-app21:27
- style: added padding and inset for create and edit habit screenlifelong-habit-app21:26
- refactor: remove archetype selector from edit habit screen to keep the habit log cleanlifelong-habit-app20:55
- chore: remove stale fields and revise template wordinglifelong-habit-app16:12
- chore: move confirmModalStyles to constants/components dirlifelong-habit-app16:11
- fix(app build): update supabaseUrl and supabaseAnonKey to prevent app crashinglifelong-habit-app16:11
- refactor: extract styles from edit and create habit screen, added buildHabitPayload service and shared componentslifelong-habit-app16:09
- chore: app copywritinglifelong-habit-app13:06
- refactor: extract form styles from edit and create screens into habitFormStyleslifelong-habit-app13:05
- chore: update app and eas configlifelong-habit-app11:41
Tue, Apr 7
- chore: update supabase dependencylifelong-habit-app23:34
- chore: update dependencylifelong-habit-app18:08
- chore: rename habit validation modal for habit creationlifelong-habit-app18:02
- chore: rename Reset App Data to Reset Datalifelong-habit-app18:02
- chore: rename a migration prefix as its orderlifelong-habit-app18:01
- refactor: ran new reset data migration and fix bug in reset datalifelong-habit-app18:00
- refactor(UI): move sign out from account info screen to the setting tablifelong-habit-app15:56
- fix(LadderCard): hide rungs when completed, restore selection on undolifelong-habit-app15:56
- fix: made valueLogged, floor, ceiling, and unitLogged values get stored to in DailyLog tablelifelong-habit-app14:55
- chore: added console log to debug ladder habitlifelong-habit-app14:04
- fix: changed ladder habit archetype formula (now visually works but still have debug in backend)lifelong-habit-app13:58
- refactor: remove extra_credit_enabled field in snowball_configlifelong-habit-app12:24
- refactor: fix snowball intensity_percent log value in db (it was capped to 100%) and remove extra credit toggle (users can have >100% intensity_percent by default)lifelong-habit-app12:24
Mon, Apr 6
- refactor: change ladder habit card UI from pills to rungslifelong-habit-app22:06
- chore: console log handleLadderConfig and handleSnowballConfiglifelong-habit-app15:34
- chore: added Jest dependency for testinglifelong-habit-app15:20
- fix(bento): call onValidConfig imperatively with raw input valuelifelong-habit-app13:04
Sun, Apr 5
- fix: TRYING to fix bento validation, added console logslifelong-habit-app23:21
- refactor: fix bento card validation bug and changed it from inline description to a modallifelong-habit-app21:10
- refactor: rename profile to settingslifelong-habit-app16:10
- refactor: remove hardcoded styling in profile tablifelong-habit-app15:38
- refactor: made GroupedCard inherit styles from profile Styleslifelong-habit-app10:57
- refactor(profile): unify sub-screen layout, card tier, and styleslifelong-habit-app10:46
- refactor: added account-info page for /profile tablifelong-habit-app00:09
Sat, Apr 4
- chore: clean empty fileslifelong-habit-app22:45
- chore: update supabase migrationlifelong-habit-app22:44
- refactor: fix layer placement across types, utils, and serviceslifelong-habit-app21:52
- refactor: clean hooks, lib, and utils directorieslifelong-habit-app20:45
- chore: put .zsh in git ignore, deleted unused fileslifelong-habit-app20:39
Fri, Apr 3
- refactor: audit hook directory (renaming, splitting, and moving to utils for pure logic)lifelong-habit-app21:11
- refactor: remove stale fields and consolidate seed runnerlifelong-habit-app18:17
- chore: update supabase dependencylifelong-habit-app17:35
- chore: remove archive fileslifelong-habit-app17:33
- feat: persist checked_component_ids for Bento habitslifelong-habit-app16:14
- refactor: added intensity_percent and fixed bugs in bento habit cardlifelong-habit-app07:00
- refactor: added map cache for static habit field in useDashboard, added updated_at field (Supabase done)lifelong-habit-app00:08
Thu, Apr 2
- refactor: updated Ladder configuration to allow tracking levels (it was only floor and ceiling without levels in between before)lifelong-habit-app15:44
Wed, Apr 1
- chore: remove old console.log for cleaner logslifelong-habit-app21:42
- fix: fixed snowball habit percentage buglifelong-habit-app21:39
- refactor: added KeyboardAvoidingView function on top of ScrollViewlifelong-habit-app21:36
- refactor: make HabitCard modularlifelong-habit-app19:03
- feat" `useLastLoggedValues` query hook. New file: `hooks/queries/useLastLoggedValues.ts` Single Supabase query, returns `Record<habitId, { valueLogged: number | null, runLevel: number | null }>`. Cached under `['last_logged_values', userId]`. Invalidated by `useLogHabit`, `useUnlogHabit`, `useBackdateHabit` on success.lifelong-habit-app18:07
- fix: invalidate 'all_habit_day_states" query to fix mark incomplete not functioning in habits from previous logslifelong-habit-app17:41
Tue, Mar 31
- fix: debugged "mark complete" button (it didn't function before, somehow it does, so let's keep the console log for now)lifelong-habit-app20:09
- chore: updated tailwind config to point to the new directory structurelifelong-habit-app19:38
- chore: updated comment pathslifelong-habit-app19:12
- refactor: migrate to feature-domain architecturelifelong-habit-app18:25
- fix: fixed rolling calendar buglifelong-habit-app15:25
- refactor: refactor code flagged by eslintlifelong-habit-app14:30
- refactor: replaced code to align with eslint and constant stylinglifelong-habit-app12:39
- refactor: added screenTitle, emptyStateTitle, badgeLabel, and rowMeta in textStyles and refactored app\(app) files to align with itlifelong-habit-app12:29
- chore: moved old documents to archive directorylifelong-habit-app10:19
- fix: added missing onCreateHabit in interface (it was already destructured in function body but missing from the interface)lifelong-habit-app08:41
- refactor: removed delete yesterday featurelifelong-habit-app00:13
- chore: changed library to inactive-habits to avoid confusionlifelong-habit-app00:02
Mon, Mar 30
- fix: changed StartOfWeek to be grouped row and added more days as optionslifelong-habit-app23:56
- fix: fixed timestamp bug which returned previous habits empty (sliced the time first and made apple to apple comparison ((YYYY-MM-DD to YYYY-MM-DD))lifelong-habit-app23:12
- refactor: made profile tab modularlifelong-habit-app23:08
- refactor: change lineHeight for displayXL font (the 'g' letter was cropped)lifelong-habit-app22:35
- refactor: made index tab modularlifelong-habit-app20:23
- refactor: changed from rolling calendar to fixed-week paginationlifelong-habit-app20:23
- feat: added toggle to set the start day of the weeklifelong-habit-app20:20
- style: fixed progress tab layoutlifelong-habit-app20:18
- feat: added progress tab and screenLayout to standardize the formatting among tabslifelong-habit-app19:34
- style: changed padding gapslifelong-habit-app15:38
- refacator: moved Viewing label and added margin bottomlifelong-habit-app15:37
- refactor: moved rolling calendar to the toplifelong-habit-app14:35
- refactor: modified email templateslifelong-habit-app11:50
Sun, Mar 29
- feat: added change email, confirm sign up, magic link, and reset password email templateslifelong-habit-app12:02
- fix: fixed bug in Google OAuth button (account deletion query should be separated from auth state)lifelong-habit-app12:01
- feat: added react-email for customized automated emailslifelong-habit-app06:15
- fix: fixed bug in account deletion and added 2 week period before permanent deletionlifelong-habit-app06:14
Sat, Mar 28
- feat: added rolling calendar in habit dashboardlifelong-habit-app12:04
Fri, Mar 27
- feat: added /history tablifelong-habit-app20:45
Thu, Mar 26
- feat: added calendar featurelifelong-habit-app20:48
Wed, Mar 25
- style: replaced emotes to ioniconslifelong-habit-app22:26
- fix: removed label (code smell) and replaced it with body from textStyleslifelong-habit-app22:13
- fix: stabilise updateDraft ref to break subform useEffect looplifelong-habit-app20:58
- feat: added onboarding screen for wake_time and bed_time, ordered habit by preferred_time, added time picker, added time-of-day section headers to dashbaordlifelong-habit-app17:51
- feat: added schema for time context (preferred_time, wake_time, bed_time, logged_at, added timeOfDay for sorting and relative timelifelong-habit-app17:50
Tue, Mar 24
- chore: added time context and future feature documentslifelong-habit-app20:48
Mon, Mar 23
- fix: added onBentoDraftChange to validate input on the component real timelifelong-habit-app21:05
- feat: add validation warning when bento component is invalidlifelong-habit-app20:10
- fix: resolved merge conflictslifelong-habit-app18:11
- chore: added prettier format on savinglifelong-habit-app15:49
Fri, Mar 20
- fix: manually parse access_token and refresh_token from redirect URL fragment and call supabase.auth.setSession() - required on native since Supabase does not automatically parse URL fragments returned by openAuthSessionAsynlifelong-habit-app23:08
- fix: manually parse access_token and refresh_token from redirect URL fragment and call supabase.auth.setSession() - required on native since Supabase does not automatically parse URL fragments returned by openAuthSessionAsynlifelong-habit-app23:08
- refactor: change google oauth button to work in dev build applifelong-habit-app23:04
Tue, Mar 17
- chore: remove eslint testing codelifelong-habit-app17:41
- chore: remove eslint testing codelifelong-habit-app17:41
Mon, Mar 16
- fix(app): resolve remaining inline color violations in edit-habit and deep-divelifelong-habit-app00:35
- fix(app): resolve remaining inline color violations in edit-habit and deep-divelifelong-habit-app00:35
- refactor(app): wrap StyleSheet.create in useMemo, migrate inline colors to NativeWind tokens, remove unused vars across app screenslifelong-habit-app00:32
- refactor(auth): extract AuthInput and AuthButton components, eliminate theme dependency on auth screenslifelong-habit-app00:17
Sun, Mar 15
- refactor(auth): migrate inline colors to NativeWind tokens across forgot-password, login, reset-password, signuplifelong-habit-app23:52
- refactor(tabs): remove unused vars in discover, migrate inline colors to NativeWind tokens, wrap StyleSheet.create in useMemo in profilelifelong-habit-app23:49
- fix: add missing hook dependencieslifelong-habit-app22:26
- docs: update eslint reportlifelong-habit-app21:18
- fix: stabilize onValidConfig references by extracting DraftItem componentlifelong-habit-app21:09
- refactor: seed pillar_config in handleArchetypePress, delete PillarFormlifelong-habit-app20:53
Sat, Mar 14
- refactor(GoogleOAuthButton): replace inline border color with className tokenlifelong-habit-app22:48
- refactor(GoogleOAuthButton): replace inline border color with className tokenlifelong-habit-app22:48
- feat(auth): add Google OAuth button to login and signup screenslifelong-habit-app22:16
- refacator(index): replace inline styling wih className tokenlifelong-habit-app21:56
- fix(HabitCard): reorder callbacks, fix useCallback deps, migrate static colors to NativeWindlifelong-habit-app21:39
- refactor(BentoCard): replace inline colors with className token and remove unused useThemelifelong-habit-app21:27
- chore(Header): remove unused useThemelifelong-habit-app21:24
- refactor(Header): replace inline colors with className tokenlifelong-habit-app21:23
- refactor(NewHabitSheet): replace inline colors with className tokens and remove unused useThemelifelong-habit-app21:23
- refactor(SnowballCard): replace inline colors with className tokens and remove unused useThemelifelong-habit-app21:20
- fix(InfoModal): use useTheme to apply theme-aware color to Feather iconlifelong-habit-app21:11
- refactor(StatsGrid): replace inline colors with className tokens and StyleSheet for list styleslifelong-habit-app21:11
- chore: move dirty-code from component dir to rootlifelong-habit-app19:43
- refactor(ArchetypeSelector): replace inline colors with textStyles and className tokenslifelong-habit-app19:42
- refactor: change textHeading hex code in Ember Dark mode to be a little bit more warmerlifelong-habit-app19:37
- refactor(BentoForm): call useTheme directly and replace inline colors with className tokenslifelong-habit-app19:37
- fix(onboarding/deep-dive): remove hardcoded colors in subFormColors so it can adjust based on the chosen themelifelong-habit-app17:55
- refactor(theme-registry): change border colors to make them more visiblelifelong-habit-app17:35
- refactor(BentoForm): replace inline colors with textStyles, className, and StyleSheet, and fix onValidConfig reflifelong-habit-app17:35
- refactor(LadderForm): replace inline colors with className tokens and fix onValidConfig reflifelong-habit-app16:24
- fix: infinite loop in habit creation flowlifelong-habit-app15:28
- refactor: migrate typography from className to textStyles tokenslifelong-habit-app14:46
- docs: audit and update stale documentationlifelong-habit-app14:31
- fix: stabilise onValidConfig references in ArchetypeSelector to prevent useEffect loopslifelong-habit-app13:58
- fix: correct useEffect dep suppression in SnowballFormlifelong-habit-app12:12
- refactor(lint): resolve no-color-in-style errors and useEffect warning in SnowballFormlifelong-habit-app11:42
- refactor(lint): resolve no-color-in-style errors in AuthWallModallifelong-habit-app11:38
- refactor(lint): resolve 13 no-color-in-style errors in challenge-details.tsxlifelong-habit-app11:30
- docs: added design notes about why text input doesn't get flagged in eslintlifelong-habit-app11:13
- docs: removed duplicates in design-notes-overlay-eslint.mdlifelong-habit-app11:10
- refactor: unflag text input color proplifelong-habit-app10:21
- refactor: replced inlinestyle backgroundColor and color to tailwind classNamelifelong-habit-app06:15
- chore: removed code calling lora font (it's alr deleted)lifelong-habit-app06:11
Fri, Mar 13
- docs: added text styles design noteslifelong-habit-app20:22
- docs: added overlay eslint design noteslifelong-habit-app20:21
- refactor: udpated eslint configlifelong-habit-app20:18
- chore: removed lora fontlifelong-habit-app20:17
- refactor: replaced hardcodes styling in InfoModallifelong-habit-app18:33
- chore: removed comment (overlay no longer gets flagged)lifelong-habit-app18:31
- refactor: replaced tooltip with InfoModal, then removed it from LadderCard (too crowded for now), and finally it's functioning in StatsGrid!lifelong-habit-app14:59
- refactor: removed StatsBar (dead code), then changed tooltip to work as a modal and linked it with surfaceStyles since it doesn't work in ReactNativelifelong-habit-app13:49
- refactor: cleaned discover tab (templateCard and challenge-details) to use useMemo StyleSheet and tailwind classNamelifelong-habit-app12:20
- chore: renamed textSecondary to textSubtlelifelong-habit-app12:17
- refactor: added text-secondary (between textBody and textMuted)lifelong-habit-app11:53
- refactor: changed scrimForeground rgba and deleted imageDim (it's similar to cardScrim)lifelong-habit-app11:50
- chore: rename explore to discoverlifelong-habit-app06:19
- chore: fix import typolifelong-habit-app06:19
- refactor: added overlayStyles for overlays, scrims, and image treatments, and synced challenge-details to itlifelong-habit-app06:18
- chore: added comment to tailwind, it's okay it just took 2 steps to add a new theme tokenlifelong-habit-app05:59
- refactor: changed eslint, check comment for detailslifelong-habit-app05:58
- refactor: made useTheme automatically converts every color key in theme-registry to a CSS property (so I just need to add a color token in two places, theme-registry and tailwind config)lifelong-habit-app05:56
- chore: renamed explore tab to discover (forgot to do it again hehe)lifelong-habit-app05:53
- refactor: applied themeVars to the root view so it cascades to all childrenlifelong-habit-app05:53
- chore: renamed explore tab to discover (forgot to do it earlier)lifelong-habit-app05:47
- chore: removed stale habit card component (the right one is in components/dashboard)lifelong-habit-app05:46
Wed, Mar 11
- revert: undo refactor of hardcoded blockslifelong-habit-app23:22
- refactor: cleaned 16 hardcoded blocks of codelifelong-habit-app17:16
- chore: rename explore to discover to avoid ambiguitylifelong-habit-app16:02
Tue, Mar 10
- refactor: added tooltip component backlifelong-habit-app17:04
Mon, Mar 9
- refactor: added eslint config ruleslifelong-habit-app20:33
- chore: removed dead libraries and boilerplatelifelong-habit-app17:38
- chore: uninstall gluestack libslifelong-habit-app17:23
- refactor: removed gluestack componentslifelong-habit-app17:21
Sun, Mar 8
- refactor: replaced raw Tailwind typography and shadow styles with textStyles and/or surfaceStyleslifelong-habit-app21:40
- refactor: made HabitNameInput, ScreenHeader, and ArchetypeSelector reusable componentslifelong-habit-app21:31
- chore: removed outdated fileslifelong-habit-app21:20
- refactor: removed StyleSheet again in app/(tabs)/indexlifelong-habit-app21:00
- refactor: removed StyleSheet and use NativeWindlifelong-habit-app20:59
- refactor: replaced inline style with textStyles constant in component/dashboardlifelong-habit-app20:56
- refactor: added reusable google oauth component now, and removed the button for nowlifelong-habit-app17:18
- feat: added interactiveStyles (single source of truth for reusable buttons, inputs, and other elements a user directly taps or types into)lifelong-habit-app15:20
- refactor: extracted styles for cards, modals, sheets, banners, and badgeslifelong-habit-app15:19
- feat: added surfaceStyles (single source of truth for surfaces UI - card, modals, sheets, banners, and elements that "contain" other UIs)lifelong-habit-app15:14
- chore: added expo auth session lib (for google oauth)lifelong-habit-app15:09
- fix: fixed missing columns error in template installationslifelong-habit-app14:51
- refactor: removed footer for nowlifelong-habit-app14:49
- docs: added blind spot audit and archived old changeloglifelong-habit-app14:49
- refactor: simplified profile tab, no more exposed details now they're hidden and live on dedicated sub-screenslifelong-habit-app10:37
Sat, Mar 7
- refactor: made typography.json as single source of truth for fonts (themed-text and _layout still exist, just React Native and Tailwind that can't use single file so we need literally 3 files to manage typography for the app but I only need to go to typography.json to change any fonts), cleaned template card to sync with defined constants, swapped DM Sans with Manrope for body typography, changed textHeading colorlifelong-habit-app23:31
- chore: add lora family fontlifelong-habit-app23:27
- refactor: cleaned some pages to sync with new textStyleslifelong-habit-app22:17
- fix: removed duplicated <text> and other tags, just parsing errorslifelong-habit-app19:39
- feat: added textStyles as a single source of truth for typography (typography.ts and typography.json failed to tackled this before)lifelong-habit-app14:04
- fix: resolved typescript property access errorslifelong-habit-app14:02
- chore: removed landing page directory (out of this app scope)lifelong-habit-app11:34
- refactor: removed hardcoded fonts entirely from the codebaselifelong-habit-app11:32
- refactor: standardize typography rules (heading, body, like theme-registry in constant dir)lifelong-habit-app06:49
- refactor: hid forgot password link until auth failurelifelong-habit-app06:10
Fri, Mar 6
- feat: added mathematical contrast testing (so I don't have to define onAccent manually once accent is set) and fixed active filter chip transparency bugslifelong-habit-app23:55
- refactor: replaced harsh solid colors to defined colors in theme registrylifelong-habit-app21:38
- refactor: renamed token theme for clarity (ink/inkMid/inkFaint -> textHeading/textBody/textMutedlifelong-habit-app20:23
- fix: auth and guest state fixes, it's so buggy since introducing this new feature I need to figure it outlifelong-habit-app20:03
- feat: added local theme toggle for guest accountslifelong-habit-app18:19
- refactor: guest or authenticated users now can explore the pp with read-only modelifelong-habit-app18:10
- refactor: chanaged theme color from ivory to bonelifelong-habit-app18:09
- refactor: extracted geometrical SVGs and changed theme colorslifelong-habit-app17:50
- refactor: simplified theme registry (forest calm is removed) and switched to more versatile colors (ivory, sand, and warm stone colors)lifelong-habit-app17:04
- refactor: added first glass icon (home, testing it out)lifelong-habit-app16:22
- refactor: hide OS bar againlifelong-habit-app16:20
Thu, Mar 5
- refactor: archived wip onboarding & added option to create habits without having to sign uplifelong-habit-app20:23
- refactor: made edit habit UI layout matches create habit screenlifelong-habit-app19:56
- refactor: replaced emotes with Ioniconslifelong-habit-app19:43
- fix: replaced hardcoded tailwind styles for snowball cardlifelong-habit-app17:55
- refactor: locked template image colorslifelong-habit-app17:54
- fix: removed hardcoded tailwind config so earthen warm theme can be applied properlylifelong-habit-app17:46
- chore: added JSDoc for design tokens in theme-registrylifelong-habit-app17:32
- refactor: replaced hardcoded hex codes with global tokens from theme-registrylifelong-habit-app16:36
- refactor: redesigned create-a-habit screenlifelong-habit-app14:45
- docs: added create-a-habit screen html mock uplifelong-habit-app14:17
- fix: the challenge details screen was cropped: solution: removed SafeAreaView from layout since app group already manages its own top/bottom spacinglifelong-habit-app12:38
- feat: added challenge details screenlifelong-habit-app12:36
Wed, Mar 4
- docs: archived old changelog and added a new onelifelong-habit-app23:28
- refactor: added and cleaned theme configuration (now morning light for light mode and earthen warmth for dark mode)lifelong-habit-app23:22
- feat: made app fullscreen by hiding OS status barlifelong-habit-app21:36
- refactor: cleaned dashboard headerlifelong-habit-app20:55
- refactor: changed the location of create habit buttonlifelong-habit-app20:35
- refactor: changed text, icons, layout & component positionlifelong-habit-app20:03
- refactor: all icons now using Ionicons onlylifelong-habit-app17:48
- chore: added lucide-react-native dependencylifelong-habit-app14:11
- fix: habit creation triggered no action (Claude messed this up when adding new features, duh), changed the menu routing it's solved nowlifelong-habit-app13:03
- feat: identity edit in profile, also decluttered dashboardlifelong-habit-app12:24
- refactor: made _layout.tsx ad one single source of truth for navigator (it was mixed with index.tsx before)lifelong-habit-app11:58
Tue, Mar 3
- fix: new object/array reference is only saved when data actually changes (before it was an infinite loop since the reference is generated every render)lifelong-habit-app23:14
- feat: added habit status UI (thru edit screen + long press)lifelong-habit-app22:50
- feat: added habit state management (active/paused/archived/trashed)lifelong-habit-app21:39
- docs: added local setup & installationlifelong-habit-app18:30
- refactor: reorganized header & navigation barlifelong-habit-app18:02
- docs: added app current state documentlifelong-habit-app17:42
- refactor: removed total days metric and fixed layout inconsistencylifelong-habit-app17:41
- fix: dashboard metrics no longer disappear when undoing a habitlifelong-habit-app15:45
- refactor: calculated today progress for habit, added program_start_date (total days metric was hardcoded)lifelong-habit-app14:22
- chore: bump react-native-safe-area-context and react-native-svg dependencylifelong-habit-app13:46
- refactor: stripped away some completed inicators (now only CTA, consistency bar, and strikethrough)lifelong-habit-app13:10
Mon, Mar 2
- feat: added view density toggle (gallery vs list)lifelong-habit-app18:45
- refactor: changed data flow pipeline (styling code was hardcoded)lifelong-habit-app17:39
- feat: edit habit functionalitylifelong-habit-app16:25
- refactor: updated components to sync with global color system (some got hardcoded when refactoring)lifelong-habit-app15:30
- refactor: updated typography, category pill, and cta button for habit cardslifelong-habit-app15:10
- feat: added habit card template stylinglifelong-habit-app14:59
- docs: added new current state docs and rename mock up filelifelong-habit-app14:52
- refactor: template color datalifelong-habit-app14:52
- refactor: responsive FlastList for Template Cardslifelong-habit-app14:26
- refactor: redesign template library & SVG patternslifelong-habit-app11:55
- refactor: made template library neaterlifelong-habit-app05:58
- refactor: removed restriction that snowball habit must <2 in useHabitCreationFlowlifelong-habit-app04:46
- refactor: replaced hardcoded hex codes to sync with constant directorylifelong-habit-app04:46
- docs: added archetypes and flow docs, added library mock uplifelong-habit-app04:45
Sun, Mar 1
- feat: create options for new habit (template library or custom builder)lifelong-habit-app13:46
- feat: created undo button with confirmationlifelong-habit-app12:32
- feat: implemented habit undo featurelifelong-habit-app06:01
Sat, Feb 28
- fix: added skip button and sign in button during onboarding if user already had an accountlifelong-habit-app23:42
- fix: added handling and skip options during onboardinglifelong-habit-app23:41
- refactor: removed SecureStore chunking (it caused delays) with added AsyncStorage, implemented onMutate, onError, and onSettled in useLogHabit to improve performancelifelong-habit-app23:02
- fix: added async chunking adapter for 2048bytes supabase storage warninglifelong-habit-app22:54
- fix: complete button and missing react-dom dependencylifelong-habit-app22:40
- refactor: resolved IDE config & expo setting warningslifelong-habit-app21:08
- feat: moved to mobile first web later, changed direction to "onboarding first, auth later"lifelong-habit-app20:37
- refactor: modified habitCard, header, and other components to improve dashboard UIlifelong-habit-app20:18
- hotfix: created TemplateCard that was removed when extracting landing pagelifelong-habit-app19:11
- refactor: extract landing page to standalone next.js pagelifelong-habit-app18:03
- chore: rename mockup for clarity, fix docs typolifelong-habit-app17:29
Fri, Feb 27
- feat: added isInstalled prop to check whether user has installed a habit to prevent them having duplicate habitslifelong-habit-app22:47
- fixed: FINALLY fixed this stubborn duplicate habit bug YAY :Dlifelong-habit-app22:42
- feat: added library tab so it's accessibile from the main app after login, not just during onboardinglifelong-habit-app22:32
- refactor: updated useCreateHabits so it prevents fture re-installs from wiping daily_log historylifelong-habit-app22:27
- fix: fixed duplicate habit insertion bug (legit 4x duplicates crazy)lifelong-habit-app22:22
- feat: made dashboard and integrated it with real datalifelong-habit-app22:09
- fix: added version controlled seed sql for templateslifelong-habit-app14:15
- fixed broken "clear session" button and template install buglifelong-habit-app14:13
- fix: solved "invalid input syntax for type uuid" errorlifelong-habit-app12:23
- feat: added AsyncStorage func, isAutoProcessing state, and removed theme selection for streamlined onboardinglifelong-habit-app11:32
- style: updated text inputs for auth page to have default brown border (for visibility)lifelong-habit-app10:03
- refactor: changed fixed autofill background color on the weblifelong-habit-app09:43
Thu, Feb 26
- style: made authentication page prettierlifelong-habit-app21:52
- fix: replaced mock up template data with actual data models and patched onboarding auth vulnerability issue (check history for details)lifelong-habit-app21:37
- feat: splitted app deployment model for landing page and working applifelong-habit-app21:03
Wed, Feb 25
- refactor: changed text box shadow to be more interactivelifelong-habit-app18:11
- refactor: redesigned landing pagelifelong-habit-app17:59
- feat: built unauthenticated landing page to replace default Expo templatelifelong-habit-app17:10
- feat: added registered user handling via Supabase Auth (before registered users data didn't get recorded in tables)lifelong-habit-app16:20
- refactor: improved UX to send dialogues if there's any auth errors, invalid credentials, and other validationslifelong-habit-app13:03
- refactor: added auhentication messages for email confirmationlifelong-habit-app12:59
- fix: added polyfill dependency to solve Metro Bundler crash and fixed undefined local SSR Storage errorlifelong-habit-app12:31
- feat(ui): implement independent bento sliders and gluestack v3 habit cardlifelong-habit-app12:06
- feat(onboarding): Implement Habit Creation Engine UI and validationlifelong-habit-app10:59
Tue, Feb 24
- feat: implement habit creation engine (Library and Deep Dive)lifelong-habit-app23:01
- feat: added db definition, scaffoled TanStaack Query layer, and fixed Safe Area UI blindspotslifelong-habit-app15:48
- feat(route): implemented Expo Router guards and Auh UIlifelong-habit-app11:25
- feat(auth): implemented a polymorphic storage adapter for Supabaselifelong-habit-app11:17
- Initial Scaffold (Phase 1)lifelong-habit-app00:01
Mon, Feb 23
- docs: add PRD and tech stack docs for scaffoldinglifelong-habit-app23:08
- Initial commitlifelong-habit-app22:59