Mobile habit tracker with a GitHub-style contribution grid, daily reminders, external connector support, and a native Android home screen widget.
- Contribution grid β visualize your habits year-round exactly like GitHub's activity graph
- Custom colors β 8 color options per habit, reflected in the grid and widget
- Daily reminders β local push notifications with configurable hour and minute per habit
- External connectors β sync commits from any HTTP endpoint that returns the JSON contract
- Android widget β native home screen widget showing a 52-week grid for the selected habit
- Local persistence β all data stored on-device via AsyncStorage
- Streak & stats β current streak, best streak, 30-day completion rate, and total commits
| Technology | Role |
|---|---|
| React Native + Expo | Main framework |
| TypeScript | Static typing |
| AsyncStorage | Local data persistence |
| expo-notifications | Local push notifications |
| react-native-shared-preferences | React Native β Android widget bridge |
| Kotlin | Native Android widget (AppWidgetProvider) |
| react-native-svg | SVG-based contribution grid rendering |
# Clone
git clone https://github.com/valb-mig/app.commitable.git
cd app.commitable
# Install dependencies
npm install
# Start Expo dev server
npx expo start
# Run on Android (with device/emulator connected)
npx expo run:androidNote: The Android widget requires a native build (
expo run:android). It will not appear in Expo Go.
Habits can pull commits from an external HTTP endpoint. The URL must return the following JSON:
{
"days": {
"2025-06-01": { "committed": true, "message": "optional note" },
"2025-06-02": { "committed": false },
"2025-06-03": { "committed": true }
}
}| Field | Type | Description |
|---|---|---|
days |
object |
Keys are ISO dates (YYYY-MM-DD), values are day objects |
days[date].committed |
boolean |
Whether that day counts as committed |
days[date].message |
string? |
Optional commit note |
Commits from the connector are merged with existing local commits β existing messages are preserved unless the connector provides a new one.
To trigger a sync, open the habit's detail view and tap sync connector.
The widget displays a 52-week contribution grid for the habit that was last viewed or committed.
Setup:
- Build and install the app:
npx expo run:android - Long-press your home screen β Widgets β Commitable
- Tap the refresh button (β») on the widget to force an update
The widget reads from SharedPreferences. It updates automatically every time the app writes a commit.
During habit creation (step 4 β "lembrete diΓ‘rio"), you can enable a daily reminder:
- Toggle on/off
- Pick an hour (0β23) and minute (00, 15, 30, 45)
- Permissions are requested on first enable
Notifications are cancelled automatically when a habit is deleted.
src/
βββ components/
β βββ CommitGrid.tsx # SVG contribution grid
β βββ CommitList.tsx # Recent commits log
β βββ CommitModal.tsx # Day edit bottom sheet
β βββ HabitCard.tsx # Habit card with mini grid
βββ hooks/
β βββ useHabits.ts # Central state + AsyncStorage + widget sync
βββ screens/
β βββ HomeScreen.tsx # Main view (all habits / filtered view)
β βββ CreateHabitScreen.tsx # 4-step habit creation/edit
βββ services/
β βββ notifications.ts # expo-notifications helpers
β βββ widget.ts # Android widget bridge
βββ utils/
β βββ date.ts # Date helpers and week generation
β βββ stats.ts # Streak and completion rate calculations
β βββ theme.ts # Colors and font constants
βββ types.ts # Shared TypeScript types
See PLAN.md for the full roadmap including upcoming features and known issues tracked as GitHub Issues.