A collaborative life-management app for small groups.
Studio Pair helps couples, roommates, families, and small teams coordinate the daily logistics of shared life: grocery lists, chore schedules, budgets, calendars, goal tracking, and more. All in one private, offline-capable app.
| Layer | Technology |
|---|---|
| Mobile app | Flutter (Dart) |
| Backend API | Dart with Shelf framework |
| Database | PostgreSQL (server), SQLite via Drift (client) |
| Shared logic | Pure Dart package (/shared) |
studio-pair/
├── app/ # Flutter mobile application
├── backend/ # Dart backend API server
├── shared/ # Shared Dart package (models, DTOs, utilities)
├── database/ # PostgreSQL migration scripts
├── .github/ # CI/CD workflows, templates, and community files
│ ├── CONTRIBUTING.md
│ ├── CODE_OF_CONDUCT.md
│ └── SECURITY.md
├── CHANGELOG.md # Release history
└── LICENSE # Proprietary license
Before you begin, make sure you have the following installed:
- Flutter SDK (stable channel, 3.29+)
- Dart SDK (3.8+, bundled with Flutter)
- PostgreSQL (15+)
- Git
Verify your setup:
flutter doctor
dart --version
psql --versiongit clone https://github.com/LennyObez/studio-pair.git
cd studio-pair# Shared package
cd shared
dart pub get
# Backend
cd ../backend
dart pub get
# Mobile app
cd ../app
flutter pub getCreate a PostgreSQL database and apply migrations:
createdb studio_pair_dev
cd database
# Apply migrations in order
psql -d studio_pair_dev -f migrations/001_initial.sqlCopy the environment template and configure your database connection:
cd ../backend
cp .env.example .env
# Edit .env with your database credentialscd backend
dart run bin/server.dartThe API server will start on http://localhost:8080 by default.
cd app
flutter runcd backend
# Run with hot-reload
dart run --enable-vm-service bin/server.dart
# Run tests
dart test
# Generate code (if applicable)
dart run build_runner build --delete-conflicting-outputscd app
# Run on a connected device or emulator
flutter run
# Run tests
flutter test
# Generate code (Drift, Freezed, etc.)
dart run build_runner build --delete-conflicting-outputscd shared
# Run tests
dart test
# Analyze
dart analyzeStudio Pair follows an offline-first architecture:
- Local-first data: the mobile app stores all data locally using SQLite (via Drift). Users can read and write data without network connectivity.
- Background sync: when online, the app syncs with the backend API. Conflict resolution uses a last-write-wins strategy with logical timestamps.
- Two-tier encryption: sensitive data is encrypted both in transit (TLS) and at rest. Group-level encryption keys ensure that data is only readable by group members.
- Shared package: core models, validation logic, and DTOs live in the
/sharedpackage, ensuring consistency between client and server.
Flutter App <--> Local SQLite (Drift)
|
Sync engine
|
Dart backend (Shelf) <--> PostgreSQL
# Run all tests across the monorepo
cd shared && dart test && cd ..
cd backend && dart test && cd ..
cd app && flutter test && cd ..This project is proprietary and confidential. All rights reserved. See LICENSE for details.