A monorepo productivity tracker for job searching and interview prep, with shared domain logic across web and mobile.
The project includes:
- Web app (Next.js) for full dashboard and management workflows
- Mobile app (Expo React Native) for on-the-go tracking
- Shared packages for types, validation, seed data, helpers, and storage repositories
- Adapter-based persistence that keeps UI code decoupled from storage implementation
apps/
web/ Next.js app (dashboard + management UI)
mobile/ Expo React Native app
packages/
types/ Shared enums, entities, filter/sort types
core/ Zod schemas, seed data, stats + formatting helpers
storage/ Repository interfaces + sync/async local implementations
- Repository pattern for all domain collections:
- Jobs
- Problems
- Resources
- Storage is abstracted through interfaces and adapters:
- Sync adapter for browser localStorage workflows
- Async adapter for React Native AsyncStorage workflows
- Shared validation and business logic live in packages/core and packages/types
- Zustand stores orchestrate app state and call repository methods directly
- Seed data is loaded once per collection via seeded-flag guards
- Monorepo: npm workspaces
- Web: Next.js 15, React, Tailwind CSS, Zustand, React Hook Form, Zod
- Mobile: Expo SDK 51, React Native 0.74, Zustand
- Shared packages: TypeScript, Zod, reusable helper modules
- Summary cards for applications, active interviews, offers, and solved problems
- Sections for recent applications, active interviews, favorite problems, and saved resources
- Guided walkthrough modal (Feature Guide)
- Full CRUD for job applications
- 12 status options (Applied through Requires Follow-Up)
- Search, status filtering, and sorting
- Detail panel with notes, links, follow-up context, and contact metadata
- Track difficulty, type, status, tags, revisions, and favorites
- Completion metrics and solved-rate visibility
- Quick actions (mark solved, favorite toggle)
- Save and categorize learning/job-prep resources
- Filter by category/type and search
- Open links directly from list views
- Export all jobs, problems, and resources to JSON backup
- Import backup files with duplicate-id detection
- Skips duplicates automatically and reports import summary
- Tabbed app sections: Dashboard, Jobs, Problems, Resources
- Shared package logic reused from web domain layer
- Async repository implementations backed by AsyncStorage
From repository root:
npm installFrom repository root:
- Start web app:
npm run web- Start Expo dev server:
npm run mobile- Run iOS build:
npm run mobile:ios- Run Android build:
npm run mobile:android- npm run web
- npm run mobile
- npm run mobile:ios
- npm run mobile:android
- npm run build:web
- npm run type-check
- npm run type-check:mobile
Shared entities are defined in packages/types:
- Job: application lifecycle, contacts, follow-up flags, salary/link/notes metadata
- Problem: difficulty, status, revision count, solved timeline, favorites
- Resource: categorized external links with notes and tags



