Craft

Main quests and fun experiments. Code, art, and community Happy

My main project now is Lifelong Habit, a habit app for people who want to focus on long-term habit formation and detailed insights. Most of the things I’ve made and played around with circle back to self-development, with some funsies and whimsies here and there. Open to work and collaborations!~ Starfish

Apr 27 – May 3Week 18 of 27
Sun, May 3
  • chore(useStopwatch): remove console loglifelong-habit-app15:15
  • fix(HabitCardRenderer): replace dynamic require() with static import for useDateLoglifelong-habit-app15: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-app15:14
  • refactor(icons): replace Ionicons with UI_ICONS in HabitCardGallery, RollingCalendarStrip, SnowballCard, and TimeSetupBanner componentslifelong-habit-app14:46
  • refactor(icons): replace Ionicons with UI_ICONS in ForgotPasswordScreen, LoginScreen, ResetPasswordScreen, and SignupScreenlifelong-habit-app08:02
  • refactor(icons): replace Ionicons with UI_ICONS in ChallengeDetailsScreen, DayBoundaryScreen, LibraryScreen, StartOfWeekScreen, and update icons in categoryRegistrylifelong-habit-app07:59
  • refactor(icons): replace Ionicons with UI_ICONS in ChallengeDetailsScreen and TemplateCard componentslifelong-habit-app00:11
Sat, May 2
  • refactor(icons): replace Ionicons with UI_ICONS across multiple componentslifelong-habit-app22:49
  • style(icons): add new Pen, Clock, and Weather icons to icon registrylifelong-habit-app15:30
  • fix(icons): update HabitSectionList to use UI_ICONS and fix import errorslifelong-habit-app14:46
  • refactor: replace Ionicons with UI_ICONS in HabitSectionList and AuthBanner componentslifelong-habit-app13:54
  • feat: add new weather and time icons to UI_ICONSlifelong-habit-app13:53
  • chore: remove html email templates from codebaselifelong-habit-app13:52
  • chore: remove comment using Ioniconslifelong-habit-app13:40
  • chore: remove lucide-react-native dependencylifelong-habit-app13:39
  • fix(IconPanel): use resolved weight for icon rendering instead of defaulting to 'regular'lifelong-habit-app13:39
  • refactor(HabitSheetHeader): remove unused BookmarkSimpleIcon import and make Planet icon as defaultlifelong-habit-app12:40
  • fix(IconPanel): resolve icons through registry instead of reading entry.component directlylifelong-habit-app12:30
  • refactor(icons): migrate iconRegistry to multi-style Solar/Phosphor architecturelifelong-habit-app12:29
  • chore: remove unused components and hooks from the projectlifelong-habit-app08:50
  • chore: remove unused dependencieslifelong-habit-app08:48
  • chore: remove unused email templates and scriptslifelong-habit-app08:05
  • chore: add knip and @types/node dependencieslifelong-habit-app08:05
  • chore: remove unused dependencies from package.jsonlifelong-habit-app07:57
  • chore: add @sentry/react-native dependency to package.jsonlifelong-habit-app07:54
  • chore(eas.json): add channel field to preview configurationlifelong-habit-app07:41
  • debug(useStopwatch): add console.loglifelong-habit-app07:39
  • chore(app config): add updates URL and runtime version policy to push update on the app without rebuildinglifelong-habit-app07:18
  • chore(dependencies): add expo-updates packagelifelong-habit-app07:15
  • perf(RootLayout): integrate AppState with TanStack Query's focus manager for consistent query handling (even if the app is closed)lifelong-habit-app07:08
  • fix(useStopwatch): resolve elapsed time desynchronization on app resume and refetchlifelong-habit-app06:57
Fri, May 1
  • feat(HabitDetailSheet): scope HabitTimeLog to selected date add and improve HabitTimeLog screen layoutlifelong-habit-app14:43
  • style(HabitSheetHeader): increase icon size and container dimensionslifelong-habit-app12:53
  • fix(iconRegistry): make resolveIcon case-insensitivelifelong-habit-app12:50
  • style(SnowballCard): update icon components and add marginTop for progress barlifelong-habit-app09:17
  • style(LadderCard): remove top margin from vertical ladder UI containerlifelong-habit-app08:41
  • style(HabitCardGallery): adjust top padding for habit card bodylifelong-habit-app08:40
  • style(HabitStopwatchCompact): reorganize stopwatch controlslifelong-habit-app08:40
  • style(HabitStopwatchCompact): increase icon sizes and update text color for better visibilitylifelong-habit-app08:33
  • style(HabitCardGallery): add bodyMdBold text style and update HabitCardGallery to use itlifelong-habit-app08:31
  • fix(HabitCardGallery): display stopwatch content only if it's todaylifelong-habit-app08:16
  • style(HabitCard): add bodySmBold style and apply it to habit cardlifelong-habit-app07:57
  • style(habit-stopwatch): update muted accent color opacity to 65%lifelong-habit-app07:52
  • fix(cards): separate stopwatch into dedicated layout slotlifelong-habit-app07:08
  • style(habit-time-log): update empty state message from 'No session yet' to 'Not recorded yet'lifelong-habit-app06:05
  • fix(stopwatch): route bento/pillar auto-log through upsertDailyLog to preserve is_strict_mode_enabled and all existing log fieldslifelong-habit-app05:55
  • style(habit-stopwatch): update icon colors to use muted accent when disabled or not runninglifelong-habit-app05:53
  • style(habit-stopwatch): add colorHex prop to customize icon colors based on habit colorlifelong-habit-app05:37
  • style(habit-icon-preview): update default display name to 'Morning Run' and change text style to heading3lifelong-habit-app05:37
  • style(stopwatch): change rewind and restart icons for HabitStopwatchCompactlifelong-habit-app05: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-app04:51
  • fix(habit-form): update stopwatch disabled messagelifelong-habit-app03:31
Thu, Apr 30
  • feat(stopwatch): add stopwatch_enabled toggle to habit form and wire time_elapsed_seconds through upsertlifelong-habit-app15:17
  • feat: implement phase 3 stopwatch functionalitylifelong-habit-app11:53
  • feat: add compact stopwatch functionality to habit cardslifelong-habit-app08:04
Wed, Apr 29
  • feat(profile): add username and profile visibility fields to User and Habit interfaceslifelong-habit-app14:20
  • style(settings): change Habit Schedule to Schedulelifelong-habit-app09:26
  • refactor(progress): adjust ItemSeparator height and contentContainerStyle gaplifelong-habit-app09:25
  • perf(progress): fix VirtualizedList slow update warninglifelong-habit-app08: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-app08:29
  • fix(progress): correct color_hex field naming and heatmap color inheritancelifelong-habit-app07:50
  • refactor(year_selector): update text styles and spacing for readabilitylifelong-habit-app07:08
  • feat(progress): replace YearSelector arrows with modal sheet pickerlifelong-habit-app06:45
Tue, Apr 28
  • feat(year_selector): implement modal year picker to improve performancelifelong-habit-app15:22
  • fix(heatmap): drop overlapping month labels in buildGridlifelong-habit-app14:56
  • perf(progress): memo-wrap heatmap cards and stabilise FlatList propslifelong-habit-app14:53
  • refactor(progress): enhance HabitHeatmap with horizontal scrolling and auto-scroll to latest datalifelong-habit-app14:28
  • perf(progress): virtualise heatmap list and centralise computationlifelong-habit-app10:14
Mon, Apr 27
  • feat(habit_sessions): add habit_sessions table migration and HabitSession interface for stopwatch trackinglifelong-habit-app14:15
  • chore(useLogHabit): fix misleading console.log labellifelong-habit-app11:14
  • fix(useUnlogHabit): remove unnecessary .select().single() on deletelifelong-habit-app11:13
  • perf(queries): add 90-day floor to useLastLoggedValueslifelong-habit-app11:13
  • refactor(queries): stabilise useConsistency query keylifelong-habit-app11:11
  • fix(bento): resolve checkbox oscillation on rapid tapslifelong-habit-app08:55