I used to track my goals in Notion. Big mistake.

My Notion workspace became a graveyard of abandoned databases. Goals mixed with grocery lists. Yearly objectives buried under random meeting notes. Every time I wanted to check my progress, I had to dig through layers of chaos.

I needed something different. A dedicated space for goals. Nothing else.

So I built it.

The Vision

Me is simple on purpose. It does one thing well: helps you set goals and actually achieve them.

No bloat. No feature creep. Just a clean interface where your ambitions live.

The app also has a deeper purpose. Beyond tracking goals, I wanted a tool that helps you discover what makes you happy. Not just what you want to achieve, but what you love to do.

Building with React Native and Expo

I chose React Native with Expo for one reason: speed.

Expo handles the painful parts of mobile development. No messing with Xcode. No fighting with Gradle. Just write code and ship.

The stack includes @gluestack-ui/react for UI components, React Navigation for screen management, and Reanimated for smooth animations. Skia powers some of the more complex visual elements.

The State Architecture

The app uses React Context for state management. Two main providers handle the core data: one for goals and tasks, another for notifications.

Goals and tasks persist locally using AsyncStorage. When the app loads, it hydrates state from storage. When you make changes, they sync back automatically. This pattern gives me reliable persistence without a backend. Everything stays on the device.

Goal and Task Relationships

Goals contain tasks. Each task has a deadline, a status, and a reference to its parent goal. The provider computes derived state to give each screen exactly the data it needs.

The home screen shows your seven most urgent pending tasks, sorted by deadline. Goals display with a progress bar showing the ratio of completed tasks to total tasks. This derived state updates automatically whenever you complete a task or modify a goal.

Push Notifications That Work

Goals without reminders are just wishes.

The NotificationProvider wraps Expo Notifications. It handles permission requests, scheduling, and cancellation. When you create a task with a deadline, the app schedules a reminder for 24 hours before. Cancel the task? The notification cancels too.

Notification preferences persist in AsyncStorage. Users can disable reminders for specific notification types without losing their scheduled reminders. Re-enable them and the system reschedules everything.

Cross-Provider Communication

Here’s where it gets interesting. The GoalProvider needs to know when notification settings change. But providers shouldn’t directly reference each other.

I built an event bus to solve this. When the notification provider enables or disables a notification type, it emits an event. The goal provider listens and reschedules all affected task reminders. This keeps providers decoupled while allowing them to react to each other’s state changes.

The UI Components

Each goal shows as a card with an emoji, title, and progress bar. Tasks display with their deadline and a checkbox. Completing a task updates progress in real time.

The goal creation flow uses multiple screens:

  1. Choose a title and emoji
  2. Add optional description
  3. Break the goal into steps (tasks)
  4. Set deadlines for each step

React Navigation handles the flow. Each step stores data in navigation params until the final confirmation screen persists everything.

Internationalization

The app supports multiple languages using i18n-js and expo-localization. It detects the device locale on startup and loads the appropriate strings.

This mattered because I wanted the app to work for Spanish-speaking users without extra configuration.

What Makes It Different

Most goal apps try to do too much. They add social features, gamification, integrations with other tools. The complexity becomes the enemy of actually using the app.

Me stays simple. Open it. See your goals. See what’s due. Check things off. Close it.

The constraint of local-only storage keeps me honest. No backend means no accounts, no sync complexity, no servers to maintain. Your goals are yours.

What I Learned

Building Me taught me about trade-offs. The local-first approach sacrifices backup and sync for simplicity and privacy. For a personal productivity tool, that trade-off felt right.

The event bus pattern solved a real architectural problem. Providers need to communicate without coupling. Events provide that bridge.

Expo made mobile development approachable for a solo project. When something broke, error messages made sense. Updates deployed quickly. The developer experience matters when you’re shipping alone.

Try It

Me is available on Google Play. It’s free. No ads.

If you struggle with organizing your goals, give it a shot. If it helps, leave a review. That’s how indie apps survive.

Back to Projects