A full-stack commitment tracking application with a NestJS backend and React Native frontend built with Expo.
iOS: Available now on the App Store
Android: Available now on Google Play
commitX/
├── backend/ # NestJS backend API
│ ├── src/
│ │ ├── commitments/ # Commitments module (CRUD + completions)
│ │ └── main.ts # Application entry point
│ └── package.json
├── frontend/ # React Native/Expo frontend app
│ ├── screens/ # Screen components
│ ├── components/ # Reusable components
│ ├── utils/ # Utilities (API client, etc.)
│ └── package.json
└── package.json # Root workspace configuration
- ✅ Create and Manage Commitments: Add, edit, and delete commitments via REST API
- 📅 Monthly Calendar View: Visual calendar showing completion status for each day
- ✓ Quick Check-in: Mark commitments as done for today with a single tap
- 🔄 Month Navigation: Navigate between months to view past completions
- 🎯 Future Date Protection: Prevents check-ins on future dates
- 🎨 Modern Dark UI: Beautiful dark theme with green accent colors
- 📱 Safe Area Support: Properly handles Android navigation bars and iOS safe areas
- 🚀 RESTful API: NestJS backend with full CRUD operations
- Node.js (v20.19.4 or higher)
- pnpm (v9.0.0 or higher)
- Expo CLI (installed globally or via npx)
- Install all dependencies (root, backend, and frontend):
pnpm installThis will install dependencies for all workspaces automatically.
- Configure environment variables:
Create a .env file in the frontend directory:
# frontend/.env
EXPO_PUBLIC_API_URL=http://localhost:8080
EXPO_PUBLIC_E2E_MODE=false # Set to 'true' only for E2E testing
EXPO_PUBLIC_DEV_MODE=true
EXPO_PUBLIC_FORCE_ONBOARDING=false # Set to 'true' to always show onboarding modalEnvironment Variables:
EXPO_PUBLIC_API_URL: Backend API URLEXPO_PUBLIC_E2E_MODE: Shows user switcher for multi-user E2E testing (default:false)EXPO_PUBLIC_DEV_MODE: Enables development features (default:true)EXPO_PUBLIC_FORCE_ONBOARDING: Forces the welcome/onboarding modal to show every time (default:false)
Start both backend and frontend:
pnpm devOr start them separately:
Backend (runs on http://localhost:3000):
pnpm dev:backendFrontend app:
pnpm dev:frontendThen:
- Scan the QR code with Expo Go app (iOS/Android)
- Or press
ifor iOS simulator - Or press
afor Android emulator - Or press
wfor web browser
The NestJS backend provides the following endpoints:
GET /commitments- Get all commitmentsGET /commitments/:id- Get a specific commitmentPOST /commitments- Create a new commitmentPATCH /commitments/:id- Update a commitmentDELETE /commitments/:id- Delete a commitment
POST /commitments/:id/completions- Toggle completion for a dateGET /commitments/:id/completions- Get completions for a commitmentGET /commitments/completions/all- Get all completions
The backend runs on http://localhost:3000 by default (configurable via PORT environment variable).
The project includes E2E tests using Maestro.
Enable E2E Mode:
# In frontend/.env
EXPO_PUBLIC_E2E_MODE=trueThis will show the UserSwitcher component for multi-user testing scenarios.
Run E2E tests:
cd frontend
maestro test .maestro/Note: Remember to disable E2E mode (EXPO_PUBLIC_E2E_MODE=false) when not running tests to hide the user switcher in development.
cd frontend
eas build --platform ios --profile production
eas build --platform android --profile production
eas build --platform all --profile production
eas submit --platform ios --profile production
eas submit --platform android --profile production
- NestJS (^10.0.0) - Progressive Node.js framework
- TypeScript - Type-safe development
- Express - HTTP server
- React Native (0.81.5) - Mobile framework (frontend)
- Expo (~54.0.0) - Development platform
- React Navigation (v6) - Navigation library
- TypeScript - Type-safe development
- Color Scheme: Dark theme with black background (#000000)
- Accent Color: Green (#4CAF50) for completed states and primary actions
- Typography: Clean, modern fonts with proper hierarchy
- Layout: Full-width calendar cards with compact month navigation
Status: ✅ Builds working with temporary workarounds. Sentry runtime works, but debug symbols are disabled.
Note: These workarounds were implemented and verified working as of January 2026. Builds successfully complete and deploy to TestFlight.
Current State:
- ✅ Sentry error tracking works (runtime SDK in
App.tsx) - ✅ User context, breadcrumbs, performance monitoring all functional
⚠️ Stack traces show minified code instead of source files⚠️ Debug symbols not automatically uploaded
Active Workarounds:
-
Metro Bundler Plugin Disabled (
frontend/metro.config.js)- Issue:
Cannot read properties of undefined (reading 'match')error during bundling - Version:
@sentry/react-native@7.9.0 - Workaround: Metro plugin disabled for production builds (
NODE_ENV=productionorEAS_BUILD=true) - Impact: No enhanced source maps during Metro bundling
- Issue:
-
Sentry Expo Plugin Removed (
frontend/app.json)- Issue: Xcode build phase "Upload Debug Symbols to Sentry" fails during EAS builds with exit code 65
- Workaround: Removed
@sentry/react-native/expoplugin entirely frompluginsarray - Impact: No automatic dSYM uploads to Sentry, no build-time Sentry integrations
- Note: Sentry runtime SDK still works (manually initialized in
App.tsx)
-
Sentry Auto-Upload Disabled (
eas.json)- Additional safeguard:
SENTRY_DISABLE_AUTO_UPLOAD=trueenvironment variable as backup - Impact: Ensures symbol uploads are skipped even if plugin config is missed
- Additional safeguard:
Resolution Timeline:
- Phase 1 (Current): Temporary workarounds active - builds work, basic error tracking functional
- Phase 2 (1-2 months): Monitor for Sentry fix, re-enable Metro plugin when patched
- Phase 3 (2-6 months): Investigate iOS upload issue, re-enable symbol uploads
Action Items:
- Check for
@sentry/react-nativeupdates every 4-6 weeks - Test Metro bundler after updates:
NODE_ENV=production pnpm expo export --platform ios - Monitor: https://github.com/getsentry/sentry-react-native/issues
- When fixed, remove workarounds:
- Update
frontend/metro.config.jsto:module.exports = withSentryConfig(config); - Re-add Sentry Expo plugin to
frontend/app.jsonplugins array (withdisableNativeDebugUploadif still needed) - Remove
SENTRY_DISABLE_AUTO_UPLOADfromeas.json(optional, but cleaner)
- Update
Private project