Find a trusted tutor in minutes — not weeks.
Tutora is a modern platform that connects students and parents with trusted tutors through an intelligent, fast, and transparent matching experience. Tutors get a steady, predictable stream of students without relying on social media or word‑of‑mouth.
- Project Overview
- The Problem
- The Solution
- Target Audience
- Key Advantages
- Brand Principles
- Features
- Tech Stack
- System Architecture
- Repository & Naming
- Folder Structure
- Design System
- Localization
- Authentication
- Landing Page
- Coding Standards
- Git Strategy
- Getting Started
- Environment Variables
- Scripts
- Testing
- Roadmap
- Contributing
- License
Project Name: Tutora
Tutora is a mobile‑first marketplace that helps parents and students find the right tutor based on their budget, district, subject, schedule, teaching format, and other criteria — in a matter of minutes. Instead of scrolling through disorganized social media posts, users get a curated, comparable, and trustworthy list of verified tutors.
For tutors, Tutora removes the dependency on personal networks and social‑media marketing. Verified tutors receive a consistent, predictable flow of student applications and can manage their profile, schedule, pricing, and reputation from a single place.
Vision: Become the default, trusted way to find and book a tutor in the region — and a scalable foundation for international expansion.
Today, finding a tutor is slow, opaque, and unreliable. Discovery happens through:
- Facebook groups
- Instagram advertisements
- Telegram groups
- Word‑of‑mouth / personal connections
These channels share the same structural problems:
| Problem | Impact |
|---|---|
| ❌ No way to compare tutors | Decisions are made blindly |
| ❌ Pricing is not transparent | Hidden or inconsistent costs |
| ❌ Trust is unknown | No verification of identity or credentials |
| ❌ No real reviews | Reputation is anecdotal |
| ❌ No filtering system | Impossible to narrow by district, price, subject |
| ❌ Wasted time | Days or weeks to find someone suitable |
| ❌ Finding a reliable tutor is hard | High risk, low confidence |
Tutora is designed to eliminate every one of these problems.
Tutora provides a single, structured platform where:
- Students & parents search, filter, compare, and contact verified tutors, read real reviews, and shortlist favorites — fast.
- Tutors build a rich, verified profile (certificates, experience, languages, formats, schedule, pricing) and receive a steady stream of qualified applications.
- Admins operate the entire marketplace: verification, moderation, content, payments, analytics, and system health from an enterprise admin panel.
Everything is transparent by design: prices are visible, credentials are verified, and reviews are real.
- Parents looking for reliable tutors for their children.
- Students (high‑school, university, exam‑prep) searching for subject help.
- Tutors who want a steady student pipeline without social‑media marketing.
- Education centers / independent teachers wanting a verified online presence.
- 🔎 Powerful filtering — district, subject, price, rating, online/offline, language.
- ⚖️ Side‑by‑side tutor comparison.
- ✅ Verified tutors with certificate and identity checks.
- ⭐ Real, moderated reviews and ratings.
- 💬 In‑app chat between students and tutors.
- 💸 Transparent pricing.
- ⚡ Fast matching — minutes, not weeks.
- 🌍 Multi‑language (Azerbaijani, English, Russian) and internationalization‑ready.
- 🛡️ Enterprise‑grade security, moderation, and admin tooling.
Tutora as a brand is intentionally:
- Short — easy to say and type.
- Memorable — sticks after one exposure.
- Modern — contemporary product feel.
- Premium — polished, high‑quality experience.
- Trustworthy — safety and verification at the core.
- Scalable — built to grow across markets.
- International‑ready — suitable for future global expansion.
Naming rule: All documentation, code, repository names, package names, environment variables, application titles, and branding must consistently use the name “Tutora”.
- Google Login (primary, OAuth 2.0)
- Email Login (planned / future)
- JWT Authentication (short‑lived access tokens)
- Refresh Tokens (secure rotation)
- Secure Session management (Expo Secure Store on device, httpOnly on web/admin)
- Role‑based access — Student, Tutor, Admin
- Account lifecycle — onboarding, role selection, profile completion, deactivation
- 🔎 Tutor search with fast, debounced results
- 🗺️ Filter by district
- 📚 Filter by subject
- 💰 Price filter (min/max range)
- ⭐ Rating filter
- 🌐 Online / Offline filter
- 🗣️ Teaching language filter
- ❤️ Favorites (save & compare later)
- 👤 Student profile & preferences
- 🔔 Notifications (push + in‑app)
- 💬 Chat with tutors
- 📝 Write reviews & ratings (post‑session)
- ⚖️ Tutor comparison (side‑by‑side)
- 📄 Tutor detail pages with certificates, experience, schedule, pricing
- 🧾 Application / request to a tutor
- 🕘 Recent searches & search history
- 🧑🏫 Create & manage profile
- 📜 Add certificates (with verification)
- 🧠 Experience & specializations
- 🗣️ Teaching languages
- 🎓 Lesson formats (online / in‑person / at student’s home / at tutor’s place)
- 🗓️ Availability & schedule
- 💵 Pricing (per subject / per format)
- 📊 Statistics (profile views, applications, conversion, ratings)
- 📥 Incoming applications / requests management
- ✅ Verification status (pending / verified / rejected)
- 💬 Chat with students
- 🔔 Notifications
- 💳 Subscription / plan management (for premium visibility)
The admin panel provides full control over the marketplace. Modules:
| Group | Modules |
|---|---|
| Overview | Dashboard, Analytics, Monitoring |
| Users | Users, Students, Tutors, Roles, Permissions |
| Marketplace | Applications, Verification Requests, Reviews, Reports |
| Taxonomy | Subjects, Categories, Districts, Languages |
| Engagement | Notifications, Push Notifications |
| Content (CMS) | Landing Page Management, FAQ Management, Blog, Media Library |
| Support | Support Tickets |
| Monetization | Payments, Subscription Plans, Advertisement Management |
| Platform | Feature Flags, System Settings, Email Templates, Localization |
| Governance | Audit Logs, Error Logs, Security Logs |
| Operations | Backup, Monitoring |
Detailed module responsibilities:
- Dashboard — KPIs (active users, tutors, applications, revenue), trends, quick actions.
- Users / Students / Tutors — search, filter, view, suspend, verify, edit, impersonate (audited).
- Applications — track student→tutor requests and their statuses.
- Verification Requests — review tutor certificates/identity, approve or reject with reasons.
- Reviews — moderate, hide, or remove reviews; handle disputes.
- Reports — user reports of abuse/spam; resolution workflow.
- Subjects / Categories / Districts / Languages — CRUD taxonomies powering search filters.
- Notifications / Push Notifications — compose, segment, schedule, and send.
- CMS / Landing Page Management — edit hero, sections, stats, testimonials, FAQ, blog.
- FAQ Management — CRUD FAQ entries per locale.
- Blog — rich‑text posts with cover images, SEO metadata, scheduling.
- Support Tickets — inbound support, assignment, statuses, SLA.
- Payments — transactions, refunds, payout tracking.
- Subscription Plans — tiers, pricing, entitlements, feature gating.
- Advertisement Management — promoted tutors / banners with scheduling.
- Analytics — funnels, retention, cohort, search analytics.
- Audit Logs — every privileged action recorded (who / what / when).
- Roles & Permissions — fine‑grained RBAC.
- Feature Flags — progressive rollout & kill switches.
- System Settings — global configuration.
- Email Templates — transactional email content per locale.
- Localization — manage translation keys (az / en / ru).
- Media Library — centralized asset management (Cloud Storage).
- Backup — database backup status & restore points.
- Monitoring — service health, queues, jobs.
- Error Logs / Security Logs — observability and incident response.
React Native (Expo) · TypeScript · Expo Router · NativeWind · Tailwind CSS · React Hook Form · TanStack Query · Axios · Zod · React Native Reanimated · React Native Gesture Handler · React Native MMKV · React Native SVG · React Native Bottom Sheet · FlashList · Expo Image · Expo Notifications · Expo Secure Store · Expo Image Picker · Expo Localization · Expo Device · Expo Splash Screen · Expo Updates · Expo Linking · Expo Haptics
- shadcn/ui‑inspired component architecture (composition over configuration)
- Reusable components built with Atomic Design (atoms → molecules → organisms)
- Dark mode ready
- Accessibility (WCAG AA, screen‑reader labels, ≥44px tap targets)
- Responsive design
- Modern, minimal UI — no gradients, soft colors, premium look
Node.js · NestJS · PostgreSQL · Prisma ORM · Redis · JWT · Refresh Tokens · Google OAuth · Firebase · Cloud Storage · BullMQ · Cron Jobs · Swagger · REST API · Rate Limiting · Caching · class-validator + Zod · Pino Logging · Monitoring · Docker · Nginx
React · Vite · TypeScript · Tailwind CSS · shadcn/ui · TanStack Table · React Hook Form · Zod · TanStack Query · React Icons · Recharts · Tiptap (Rich Text Editor) · Image Upload · Role‑Based Access Control · Permission Management
Next.js (App Router, SSG/ISR) · TypeScript · Tailwind CSS · shadcn/ui · next-seo · Optimized Images · High Lighthouse Scores
Current-state overview:
docs/architecture.md. The reasoning behind major choices is recorded as Architecture Decision Records.
┌────────────────────────┐
│ Tutora Clients │
└────────────────────────┘
┌────────────────┐ ┌────────────────┐ ┌────────────────┐
│ Mobile App │ │ Admin Panel │ │ Landing Page │
│ RN + Expo │ │ React + Vite │ │ Next.js │
│ (tutora) │ │ (tutora-admin) │ │ (tutora-web) │
└───────┬────────┘ └───────┬────────┘ └───────┬────────┘
│ HTTPS / REST + JWT │ │
└──────────┬──────────┴─────────┬──────────┘
▼ ▼
┌───────────────────────────────────┐
│ Nginx (reverse proxy) │
└───────────────────┬───────────────┘
▼
┌───────────────────────────────────┐
│ NestJS API (tutora-api) │
│ Auth · Users · Tutors · Students │
│ Search · Applications · Reviews │
│ Chat · Notifications · Payments │
│ Media · Admin · CMS │
└───┬───────────┬──────────┬────────┘
▼ ▼ ▼
┌───────────┐ ┌──────────┐ ┌──────────────┐
│PostgreSQL │ │ Redis │ │ BullMQ jobs │
│ (Prisma) │ │ (cache) │ │ + Cron │
└───────────┘ └──────────┘ └──────────────┘
│
┌──────────┴───────────┬───────────────┐
▼ ▼ ▼
┌───────────┐ ┌──────────────┐ ┌──────────────┐
│ Firebase │ │Cloud Storage │ │ Google OAuth │
│ (push) │ │ (media) │ │ │
└───────────┘ └──────────────┘ └──────────────┘
See .claude/context/architecture.md for the detailed architecture guide.
| Concern | Value |
|---|---|
| Repository name | tutora |
| Application name | Tutora |
| Bundle identifier | com.tutora.mobile |
| Mobile package | tutora |
| Admin panel | tutora-admin |
| Landing page | tutora-web |
| Backend API | tutora-api |
Tutora uses a feature‑first structure across every surface. Below are enterprise‑ready layouts for each application.
tutora/
├── app/ # Expo Router routes (file-based)
│ ├── (auth)/
│ │ ├── login.tsx
│ │ └── onboarding.tsx
│ ├── (student)/
│ │ ├── (tabs)/
│ │ │ ├── home.tsx
│ │ │ ├── search.tsx
│ │ │ ├── favorites.tsx
│ │ │ ├── chat.tsx
│ │ │ └── profile.tsx
│ │ └── tutor/[id].tsx
│ ├── (tutor)/
│ │ └── (tabs)/
│ │ ├── dashboard.tsx
│ │ ├── applications.tsx
│ │ ├── schedule.tsx
│ │ └── profile.tsx
│ ├── _layout.tsx
│ └── +not-found.tsx
├── src/
│ ├── features/ # Feature-first modules
│ │ ├── auth/
│ │ │ ├── api/
│ │ │ ├── components/
│ │ │ ├── hooks/
│ │ │ ├── stores/
│ │ │ ├── types/
│ │ │ └── index.ts # barrel export
│ │ ├── search/
│ │ ├── tutor-profile/
│ │ ├── favorites/
│ │ ├── chat/
│ │ ├── reviews/
│ │ └── notifications/
│ ├── components/ # Shared UI (atoms/molecules/organisms)
│ │ ├── ui/ # Button, Input, Card, Sheet, Toast...
│ │ └── layout/
│ ├── hooks/ # Shared hooks
│ ├── lib/ # axios, query client, mmkv, i18n
│ ├── services/ # API clients / gateways
│ ├── theme/ # colors, spacing, typography tokens
│ ├── i18n/ # az / en / ru
│ ├── constants/
│ ├── types/
│ └── utils/
├── assets/ # fonts, images, icons, lottie
├── app.config.ts
├── tailwind.config.js
├── babel.config.js
├── tsconfig.json
└── package.json
tutora-api/
├── src/
│ ├── main.ts
│ ├── app.module.ts
│ ├── common/ # cross-cutting
│ │ ├── decorators/
│ │ ├── filters/ # exception filters
│ │ ├── guards/ # JwtAuthGuard, RolesGuard
│ │ ├── interceptors/ # logging, transform, cache
│ │ ├── pipes/ # ZodValidationPipe
│ │ └── utils/
│ ├── config/ # env, swagger, throttler, redis
│ ├── modules/ # feature-first modules
│ │ ├── auth/
│ │ │ ├── auth.controller.ts
│ │ │ ├── auth.service.ts
│ │ │ ├── auth.module.ts
│ │ │ ├── strategies/ # google, jwt, refresh
│ │ │ └── dto/
│ │ ├── users/
│ │ ├── students/
│ │ ├── tutors/
│ │ ├── search/
│ │ ├── applications/
│ │ ├── reviews/
│ │ ├── chat/
│ │ ├── notifications/
│ │ ├── payments/
│ │ ├── subscriptions/
│ │ ├── media/
│ │ ├── cms/
│ │ └── admin/
│ ├── jobs/ # BullMQ processors + cron
│ ├── prisma/ # PrismaService
│ └── i18n/
├── prisma/
│ ├── schema.prisma
│ ├── migrations/
│ └── seed.ts
├── test/ # e2e
├── Dockerfile
├── docker-compose.yml
├── nginx/
├── tsconfig.json
└── package.json
tutora-admin/
├── src/
│ ├── main.tsx
│ ├── app/
│ │ ├── router.tsx
│ │ └── providers.tsx # QueryClient, Theme, Auth
│ ├── features/ # feature-first
│ │ ├── dashboard/
│ │ ├── users/
│ │ ├── tutors/
│ │ ├── verification/
│ │ ├── reviews/
│ │ ├── taxonomy/ # subjects, districts, languages
│ │ ├── payments/
│ │ ├── cms/
│ │ ├── notifications/
│ │ ├── settings/
│ │ └── audit-logs/
│ ├── components/
│ │ ├── ui/ # shadcn/ui components
│ │ ├── data-table/ # TanStack Table wrappers
│ │ └── layout/ # Sidebar, Topbar, Shell
│ ├── hooks/
│ ├── lib/ # api, auth, rbac, query
│ ├── routes/
│ ├── i18n/
│ ├── types/
│ └── utils/
├── public/
├── index.html
├── tailwind.config.ts
├── vite.config.ts
├── tsconfig.json
└── package.json
tutora-web/
├── src/
│ ├── app/
│ │ ├── layout.tsx
│ │ ├── page.tsx # single-page landing
│ │ ├── blog/
│ │ │ ├── page.tsx
│ │ │ └── [slug]/page.tsx
│ │ └── (legal)/privacy/page.tsx
│ ├── sections/ # Hero, Problem, HowItWorks, Stats...
│ ├── components/
│ │ └── ui/
│ ├── lib/ # seo, analytics
│ ├── content/ # MDX blog / FAQ (or from API)
│ ├── i18n/
│ └── styles/
├── public/ # og images, screenshots, icons
├── next.config.mjs
├── tailwind.config.ts
├── tsconfig.json
└── package.json
Full standards live in .claude/context/coding-standards.md.
Design principle: Minimal, premium, trustworthy. No gradients anywhere. Soft colors, generous spacing, low‑elevation shadows. Follows Apple Human Interface Guidelines + Material Design 3. Dark‑mode ready. Accessible.
Light theme
| Token | HEX | Usage |
|---|---|---|
| Primary | #4F46E5 |
Primary actions, brand |
| Primary Dark | #4338CA |
Pressed / emphasis |
| Primary Light | #EEF2FF |
Tinted backgrounds |
| Secondary | #0EA5E9 |
Secondary accents |
| Accent | #F59E0B |
Highlights (used sparingly) |
| Background | #FFFFFF |
App background |
| Surface | #F8FAFC |
Elevated surfaces |
| Card | #FFFFFF |
Cards |
| Border | #E2E8F0 |
Borders |
| Divider | #EEF2F6 |
Dividers |
| Text Primary | #0F172A |
Primary text |
| Text Secondary | #64748B |
Secondary text |
| Muted / Neutral | #94A3B8 |
Muted text, icons |
| Success | #16A34A |
Success states |
| Warning | #F59E0B |
Warnings |
| Danger | #DC2626 |
Errors / destructive |
| Info | #2563EB |
Informational |
| Disabled | #CBD5E1 |
Disabled states |
| Overlay | rgba(15,23,42,0.5) |
Modal/scrim overlay |
Dark theme
| Token | HEX |
|---|---|
| Background | #0B1120 |
| Surface | #111827 |
| Card | #1E293B |
| Border | #334155 |
| Text Primary | #F8FAFC |
| Text Secondary | #94A3B8 |
| Primary | #6366F1 |
Font: Plus Jakarta Sans (primary), fallback Inter — via Google Fonts.
| Style | Size / Line height | Weight |
|---|---|---|
| Display | 32 / 40 | 700 |
| Headline | 28 / 36 | 700 |
| Title | 22 / 28 | 600 |
| Subtitle | 18 / 26 | 600 |
| Body | 16 / 24 | 400 |
| Body Small | 14 / 20 | 400 |
| Label | 13 / 16 | 500 |
| Caption | 12 / 16 | 400 |
| Button | 15 / 20 | 600 |
- Radius (px):
xs 6·sm 8·md 12·lg 16·xl 20·2xl 24·full 999. Default card radius 16. - Spacing (4pt grid, px):
4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48 · 64. - Shadow: soft, low‑elevation only (e.g.
0 1px 2px rgba(15,23,42,0.06),0 4px 12px rgba(15,23,42,0.08)). - Icon sizes (px):
16 · 20 · 24 · 28. - Animation: Reanimated; durations 150–300ms; easing
ease-out/ spring for gestures.
The complete UI/UX guide (buttons, inputs, cards, loading, skeletons, bottom sheets, toasts, modals, FAB, search, filter) is in .claude/context/ui-guidelines.md.
Tutora ships with three languages:
- 🇦🇿 Azerbaijani (
az) — default - 🇬🇧 English (
en) - 🇷🇺 Russian (
ru)
i18n architecture
- Mobile:
i18next+react-i18next+expo-localizationfor device‑locale detection; persisted with MMKV. - Web / Admin:
i18next(ornext-intlfor landing) with locale routing. - Backend:
nestjs-i18nfor localized emails, notifications, and validation messages. - Rule: No hardcoded user‑facing strings. Every string is a translation key. Keys are namespaced per feature (e.g.
search.filter.district). - Admin CMS exposes translation‑key management so non‑developers can update copy per locale.
i18n/
├── az/
│ ├── common.json
│ ├── auth.json
│ └── search.json
├── en/
└── ru/
- Google Authentication is mandatory (primary sign‑in).
- Email login is planned for a later phase.
- JWT access tokens (short‑lived) + Refresh Tokens (rotated, revocable).
- Role‑Based Authentication:
Student,Tutor,Admin. - Access tokens stored in Expo Secure Store on mobile; httpOnly cookies for web/admin.
- Guards (
JwtAuthGuard,RolesGuard) protect every non‑public endpoint on the backend. - Role is selected during onboarding and enforced on both client and server.
Client ──(Google ID token)──▶ tutora-api ──verify──▶ Google
◀──(access + refresh)──
Client ──(access token)─────▶ protected routes (JwtAuthGuard + RolesGuard)
Client ──(refresh token)────▶ /auth/refresh ──▶ new access + rotated refresh
A dedicated, SEO‑optimized single‑page landing at tutora-web (Next.js). Sections:
- Hero — value proposition + primary CTA
- Problem & Solution
- How It Works
- Key Advantages
- Platform Statistics
- Benefits for Tutors
- Benefits for Students
- App Screens (screenshots)
- User Testimonials
- FAQ
- Blog Preview
- Call To Action
- Footer
Requirements: SEO‑optimized (metadata, Open Graph, structured data, sitemap), fully responsive, high Lighthouse scores (Performance/Accessibility/Best‑Practices/SEO ≥ 90), no gradients, premium & minimalist design.
Tutora enforces modern, professional standards across all codebases:
- Clean Architecture · SOLID · DRY · KISS
- Feature‑First structure
- Absolute imports + Barrel exports (
@/features/...) - Reusable components, hooks, and services
- Generic, strong TypeScript (no
any; explicit return types on public APIs) - ESLint + Prettier + Husky + lint‑staged
- Conventional Commits
- Components should stay focused and small (< 300 lines when avoidable)
- No inline business logic in components; extract to hooks/services
- No magic numbers / hardcoded strings — use constants and i18n keys
Full details: .claude/context/coding-standards.md and CLAUDE.md.
main— production. Protected.develop— integration. Protected.- Feature branches — one per task, branched from up‑to‑date
main/develop.
Before starting any task:
git checkout main
git pull origin main
git checkout -b feature/<scope>Branch naming:
feature/auth-google
feature/search-filter
feature/tutor-profile
feature/admin-dashboard
bugfix/login
hotfix/payment
refactor/home
docs/readme
chore/dependencies
style/profile-ui
test/auth
feat: a new feature
fix: a bug fix
refactor: code change that neither fixes a bug nor adds a feature
docs: documentation only
test: adding or correcting tests
style: formatting, no logic change
build: build system or dependencies
ci: CI configuration
perf: performance improvement
chore: maintenance
- Open a Draft PR early.
- Request Code Review.
- Obtain approval.
- Squash merge.
- Delete the branch.
PRs must use the Pull Request template and satisfy the Definition of Done.
feature · bug · priority: high · priority: medium · priority: low · documentation · refactor · testing · ui · ux · backend · frontend · mobile · admin · api · database · performance · security · blocked · ready for review · in progress · done · duplicate · help wanted · good first issue · question
Create them all with:
bash scripts/setup-labels.sh # macOS/Linux
pwsh scripts/setup-labels.ps1 # WindowsTemplates: Issue templates · PR template · CODEOWNERS.
Full workflow: .claude/context/git-workflow.md.
This is a pnpm + Turborepo monorepo — one
pnpm installat the root sets up every app. The snippets below are a quick reference; the authoritative, step-by-step local setup (with troubleshooting) isdocs/onboarding.md.
- Node.js ≥ 20, pnpm ≥ 9 (or npm/yarn)
- PostgreSQL ≥ 15, Redis ≥ 7
- Docker & Docker Compose (recommended for backend)
- Expo CLI / EAS CLI (mobile)
- A Google OAuth client and Firebase project
cd tutora-api
pnpm install
cp .env.example .env
docker compose up -d # Postgres + Redis
pnpm prisma migrate dev
pnpm prisma db seed
pnpm start:dev # http://localhost:3000 (Swagger at /docs)cd tutora
pnpm install
cp .env.example .env
pnpm start # Expo dev server
# press i (iOS) / a (Android)cd tutora-admin
pnpm install
cp .env.example .env
pnpm dev # http://localhost:5173cd tutora-web
pnpm install
cp .env.example .env
pnpm dev # http://localhost:3001Never commit secrets. All variables are read from
.envand validated at startup (Zod). Prefix all Tutora‑specific variables consistently.
Backend (tutora-api)
NODE_ENV=development
PORT=3000
DATABASE_URL=postgresql://user:pass@localhost:5432/tutora
REDIS_URL=redis://localhost:6379
JWT_ACCESS_SECRET=...
JWT_REFRESH_SECRET=...
JWT_ACCESS_TTL=15m
JWT_REFRESH_TTL=30d
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
FIREBASE_PROJECT_ID=...
FIREBASE_CLIENT_EMAIL=...
FIREBASE_PRIVATE_KEY=...
CLOUD_STORAGE_BUCKET=...Mobile (tutora)
EXPO_PUBLIC_API_URL=https://api.tutora.app
EXPO_PUBLIC_GOOGLE_CLIENT_ID=...Admin / Web
VITE_API_URL=https://api.tutora.app # admin
NEXT_PUBLIC_API_URL=https://api.tutora.app # webCommon scripts (per package):
pnpm dev # start dev server
pnpm build # production build
pnpm lint # ESLint
pnpm format # Prettier
pnpm typecheck # tsc --noEmit
pnpm test # unit tests
pnpm test:e2e # end-to-end tests- Unit — Jest (backend), Jest + React Native Testing Library (mobile), Vitest + React Testing Library (admin/web).
- E2E — Supertest (API), Detox/Maestro (mobile), Playwright (admin/web).
- Coverage — critical paths (auth, search, applications, payments) must be covered.
- Bug fixes ship with a regression test. See the TDD workflow in
CLAUDE.md.
- MVP: Auth (Google), tutor search + filters, tutor profiles, favorites, reviews, chat.
- Tutor tools: verification, schedule, pricing, statistics.
- Admin: dashboard, verification, moderation, taxonomy.
- Monetization: subscriptions, promoted tutors, payments.
- Growth: push campaigns, blog/CMS, referrals.
- Scale: internationalization, additional markets.
See CONTRIBUTING.md for the full guide. In short:
- Pick or open an issue.
git checkout main && git pull→ create a<type>/<description>branch.- Follow the coding standards and
CLAUDE.md. - Open a Draft PR using the template; request review.
- Ensure lint, types, and tests pass; satisfy the Definition of Done.
- Squash‑merge after approval and delete the branch.
New here? Start with the onboarding guide.
Proprietary — © Tutora. All rights reserved. Unauthorized copying, distribution, or use is prohibited.
Tutora — Find a trusted tutor in minutes.