Skip to content

Antimatter543/mood-tracker

Repository files navigation

SoulSync — a private mood tracker. Your data never leaves your phone.

TypeScript Expo SDK 56 React Native Platform

Tests Privacy License

A privacy-first mood tracker built with React Native and Expo.
All data stays on your device. No accounts, no cloud, no tracking.


Features

Mood Tracking

  • 10-point scale with high/low precision modes
  • Backdate entries with date/time picker
  • Attach activities, notes, and photos to each entry
  • Daily reminder notifications at a time you choose

Activities

  • Pre-seeded categories: Emotions, Sleep, Social, Activities, Health
  • Fully customizable with icon picker (Feather, MaterialIcons, Ionicons)
  • Drag-to-reorder support

Statistics & Insights

  • Mood trend with adaptive moving average
  • Day-of-week pattern (your best and toughest days)
  • Rigorous with/without activity correlation
  • Month-over-month comparison + heatmap
  • Insights tab: plain-language patterns from your own data

Customization & Privacy

  • 5 themes: Dark, Light, Cherry Blossom, Midnight Blue, Forest
  • JSON import/export for full data portability
  • 100% local SQLite database (photos stay on-device too)

Screenshots

Home dashboard Insights Statistics heatmap Timeline

Install

Android: SoulSync is on the Google Play Store. Nothing else to set up, no account, no sign-in.

Prefer installing outside Play? Grab the latest signed APK from the GitHub Releases page and sideload it.

Enjoying SoulSync? A Play Store review helps a tiny open-source project a lot.

SoulSync | Featured on SaaSHub

Build from source

git clone https://github.com/Antimatter543/mood-tracker.git
cd mood-tracker/frontend && npm install
npx expo start

Scan the QR code with Expo Go, or press a / i for an emulator. The app is plain CNG with no custom native modules, so Expo Go runs it faithfully (new architecture, gesture-handler, reanimated, and SQLite all bundled or pure-JS). Release builds are produced in the cloud via EAS Build and GitHub Actions CI; update the projectId in app.json after forking.

Tech Stack

Layer Technology
Framework React Native 0.85 + Expo (SDK 56), new architecture (Fabric)
Routing Expo Router (file-based)
Animation Reanimated 4
Database SQLite (local, on-device)
Charts react-native-chart-kit
Calendar react-native-calendars
Language TypeScript 6 (strict mode)
Project Structure
frontend/
├── app/                          # Screens (file-based routing)
│   ├── (tabs)/
│   │   ├── index.tsx             # Home dashboard
│   │   ├── timeline.tsx          # Entry history/journal
│   │   ├── stats.tsx             # Analytics & visualizations
│   │   ├── insights.tsx          # Plain-language insights from your data
│   │   └── settings.tsx          # App settings (themes, reminders)
│   └── _layout.tsx               # Root layout (DB provider, themes, reminder re-arm)
├── components/
│   ├── forms/                    # Entry form, mood selector, activity + photo picker
│   │   └── hooks/                # useEntryDraft, useMoodScale
│   └── visualisations/           # Charts, heatmap, calendar
│       └── transforms/           # Pure data transforms (fully tested)
├── context/                      # React contexts (data, settings, timeframe)
├── databases/                    # SQLite facade, migrations, CRUD modules
│   ├── dateHelpers.ts            # Pure local-tz date math
│   ├── mediaHelpers.ts           # On-device photo file storage
│   ├── entry-media.ts            # Photo attachment CRUD
│   └── migrations.ts             # Auto-run schema migrations
├── lib/
│   └── notifications.ts          # Local daily-reminder scheduling (pure + testable)
└── styles/
    └── global.ts                 # Theme definitions

Testing

Metric Status
Test suites 65 passing
Tests 603 passing
TypeScript strict: true, tsc --noEmit clean
Lint expo lint zero errors
Pre-commit npm run check (typecheck + lint + tests)

The database layer, chart transforms, form hooks, and date helpers are pure-function modules with dedicated test files.

npm test              # Run all tests
npm run check         # Full pre-commit gate

Database

Table Purpose
entries Mood entries (score, notes, timestamp)
activities User-defined activities with icons
activity_groups Activity categories
entry_activities Entry-activity links (many-to-many)
entry_media Photo attachments (file path + type, on-device)
user_settings Key-value settings store

Migrations run automatically on app launch via databases/migrations.ts.

Roadmap & Known Issues

Known Issues

  • Settings loader shows indefinite spinner if SQLite load fails (needs timeout/fallback)

Planned

  • CSV/PDF export
  • AMOLED dark theme
  • Photo attachment cloud-free encrypted backup
  • Biometric app lock

Contributing

  1. Fork the repo and create a feature branch
  2. Make changes, then run npm run check (typecheck + lint + tests)
  3. Open a Pull Request

Tips: Dev-only features appear when __DEV__ is true. Add tabs by creating files in app/(tabs)/. Themes live in styles/global.ts. Database changes go through databases/migrations.ts.

License

GPL-3.0


Built with care. Your data never leaves your device.

About

Private, offline mood tracker for Android. 10-point mood scale, activity correlation stats, plain-language insights. No account, no ads, no analytics. GPL-3.0, your data stays on your device.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages