InternMatch AI is a multilingual internship platform connecting students, employers, and a human-operated administrative trust layer in one end-to-end workflow.
It combines structured candidate profiles, private CV intelligence, explainable hybrid matching, AI-assisted application preparation, employer recruiting tools, moderated opportunity publishing, and RevenueCat-backed subscription surfaces.
Product website: https://internmatch.college/
Technical documentation: Architecture · Security
Apple App Store: https://apps.apple.com/us/app/internmatch-ai/id6809902796
Google Play: https://play.google.com/store/apps/details?id=com.aissclub.internmatchai
Students often have to infer fit from long job descriptions, repeatedly rewrite application materials, and receive little actionable guidance about skill gaps. Employers need a structured way to publish internships, review candidates, and manage interviews without sacrificing trust controls. InternMatch AI addresses both sides while keeping publication and verification decisions server-controlled.
- Email/password authentication, email confirmation, recovery, Google OAuth, and Sign in with Apple on iOS.
- Structured profile covering skills, education, experience, projects, and preferences.
- Private CV upload with asynchronous parsing and profile extraction.
- Internship discovery with work-type filtering and saved opportunities.
- Hybrid matching that combines exact/fuzzy skill overlap, semantic similarity, and profile preferences.
- Why You Match explanations, matching/missing skills, and skill-gap guidance.
- AI-assisted cover-letter drafting and interview preparation.
- Application tracking across
saved,applied,interviewing,accepted, andrejectedstates. - Durable in-app notifications plus Expo push-device registration and push delivery.
- English, Turkish, and Arabic localization, including RTL layout for Arabic.
- Student Pro functionality with backend-controlled AI usage allowances.
- Account/privacy controls including recent reauthentication before permanent account deletion.
- Role-aware employer account flow using email/password authentication.
- Organization workspace with business identity and representative details.
- Organization verification workflow separated from compliance-evidence review.
- Opportunity creation and owned-listing management.
- Applicant review, candidate context, status transitions, CV access through authenticated server boundaries, and interview scheduling.
- Employer candidate insight with separately enforced AI usage quotas.
- Employer Pro tools for interview kits, shortlist comparison, AI-assisted internship-description drafting, pipeline analytics, and multiple published listings.
- Employer Free supports one published internship at a time; subscription/product policy is enforced by the backend.
- Mandatory listing moderation before employer-generated opportunities become public.
- Backend-enforced admin authorization.
- Employer organization review.
- Employer compliance-evidence review as a separate trust domain.
- Internship moderation with approval and request-changes workflows.
- User directory/search with student/employer context and administrative audit history.
- Admin-managed opportunity and applicant workflows where applicable.
Employer organization verification does not automatically publish an opportunity. Employer-generated listings move through an explicit moderation lifecycle:
Employer create / edit
|
v
under_review ---- Admin approves ----> published
|
+---- Admin requests changes ----> draft
|
+--> owner-visible feedback
+--> existing fields prefilled
+--> employer edits and resubmits
v
under_review
employer_visible_feedback is owner-only. It is not part of the public internship response, and previous feedback is cleared after a successful employer resubmission.
InternMatch AI keeps deterministic scoring separate from generative explanation:
- Exact and fuzzy skill matching with configurable fuzzy threshold.
- Semantic similarity using one configured canonical embedding provider, persisted in PostgreSQL with
pgvector. - Candidate preference contribution for work type/location where applicable.
- Server-side Gemini workflows for CV extraction, match explanations, cover-letter drafting, and interview preparation.
- Redis + RQ for asynchronous processing where the workflow is background-oriented.
- Backend-controlled AI quotas and idempotency protections.
The persisted match score is computed by application logic; generative AI explains the result but does not autonomously decide who should be hired.
InternMatch AI uses react-native-purchases 10.7.2 and supports both student and employer subscription contracts.
| Audience | Entitlement | Offering | Package | Canonical Product |
|---|---|---|---|---|
| Student | pro_student |
default |
$rc_monthly |
internmatch_pro_student_monthly |
| Employer | pro_employer |
employer_default |
$rc_monthly |
internmatch_pro_employer_monthly |
The mobile SDK resolves store packages dynamically. Development can use a RevenueCat Test Store public key, while release builds use platform-specific public SDK keys for iOS and Android.
Subscription authority is not client-only. The backend exposes authenticated subscription state and reconciliation, and it processes authenticated RevenueCat lifecycle webhooks:
GET /api/v1/me/subscriptionPOST /api/v1/me/subscription/reconcilePOST /api/v1/webhooks/revenuecat
The server-side RevenueCat secret is never a mobile credential. Webhook Bearer authentication is enforced by the configured server contract; HMAC signature/timestamp verification additionally applies when a signing secret is configured.
The custom mobile promo-code UI that directly unlocked Pro was removed from the current store application. Backend/admin promo source still exists in the repository, but migration
028_promo_campaigns.sqlis not part of the current production-applied release baseline.
flowchart LR
Mobile[Expo / React Native Mobile] -->|Supabase session| Auth[Supabase Auth]
Mobile -->|Bearer JWT| API[FastAPI API]
Admin[Next.js Admin Console] -->|Bearer JWT| API
Admin --> Auth
API --> DB[(Supabase PostgreSQL + pgvector)]
API --> Storage[(Supabase Storage)]
API --> Redis[(Redis)]
Redis --> Worker[RQ Worker]
Worker --> Gemini[Google Gemini]
Worker --> DB
Mobile --> RC[RevenueCat SDK]
API --> RCAPI[RevenueCat Server API / Webhook]
For faithful full-stack development, the application depends on Supabase-managed Auth and Storage in addition to PostgreSQL. The plain pgvector PostgreSQL container in docker-compose.yml is useful for isolated development/testing scenarios, but it is not a complete replacement for a Supabase project because the full schema references resources such as auth.users.
| Domain | Current Stack |
|---|---|
| Mobile | Expo SDK 57, React Native 0.86.3, React 19.2.3, TypeScript ~6.0, React Navigation |
| Admin | Next.js 15.5.x, React 18, TypeScript |
| Authentication | Supabase Auth / JWT |
| Backend | FastAPI, Python 3.13 CI reference runtime, SQLAlchemy, Pydantic |
| Data | Supabase PostgreSQL, pgvector, Supabase Storage |
| Async | Redis 7, RQ worker |
| AI | Gemini generation + configurable canonical embedding provider (OpenAI or Gemini) |
| Monetization | RevenueCat React Native SDK + backend reconciliation/webhook integration |
| CI / Release | GitHub Actions, Docker / Docker Compose, EAS Build |
.
├── apps/
│ ├── admin/ # Next.js Trust & Safety Console
│ ├── landing/ # Legal/support web source in this repository
│ └── mobile/ # Expo / React Native student + employer app
├── backend/ # FastAPI API, repositories, services, security
├── database/ # Migrations, seeds, storage setup
├── docs/ # Architecture, security, API, database, runbooks
├── scripts/ # Development/maintenance utilities
├── tests/ # Pytest and source-contract coverage
├── worker/ # RQ background tasks
└── docker-compose.yml # Optional local container orchestration
Migration source currently spans 001 through 028. The release execution baseline is through 027; migration 028_promo_campaigns.sql exists in source but is not part of the current production-applied baseline and must not be blindly applied.
Use a development Supabase project for faithful full-stack reproduction. Do not use production as a development or test environment.
cp .env.example .env
docker compose up --build -ddocker-compose.yml provides backend, worker, Redis, and a local pgvector PostgreSQL service. The full application schema, however, depends on Supabase Auth/Storage; point server Supabase credentials and DATABASE_URL to a development Supabase project when reproducing the complete product.
For the mobile application:
cd apps/mobile
cp .env.example .env
npm ci
npx expo run:androidExpo Go is not sufficient for native RevenueCat functionality. On macOS, native iOS development can use npx expo run:ios.
- Root
.env: server-only configuration and secrets. apps/mobile/.env: public client configuration (EXPO_PUBLIC_*is readable in the client bundle).apps/admin/.env.local: public Admin client configuration; backend admin authorization is still server-enforced.- Never place Supabase service-role credentials, RevenueCat server secrets, webhook secrets, database passwords, or Apple private keys in mobile/admin public environment variables.
CI uses Python 3.13 and Node.js 22 as reference runtimes.
python -m pytest
python -m ruff check backend/app worker tests --output-format=concise
cd apps/mobile
npx tsc --noEmit
cd ../admin
npm ci
npm run typecheck- Root liveness:
GET /health - Versioned readiness:
GET /api/v1/health(database + Redis + RQ worker; returns HTTP 503 if a required dependency is unavailable) - Swagger UI, ReDoc, and
/openapi.jsonare intentionally disabled whenENVIRONMENT=production.
| Resource | Link / Status |
|---|---|
| Product website | https://internmatch.college/ |
| Source repository | Access by invitation |
| Demo video | https://youtu.be/FOoJVTpqCOg?feature=shared |
| Apple App Store | https://apps.apple.com/us/app/internmatch-ai/id6809902796 |
| Google Play | https://play.google.com/store/apps/details?id=com.aissclub.internmatchai |
The demo is a brief product overview. The technical documentation describes the implementation in more detail.
InternMatch AI was conceived and developed by Mohamad Barakat and Selenur Yurdakul.
Selenur Yurdakul originated the InternMatch AI product concept and created the initial frontend prototype, mobile screen layouts, visual direction, and UI foundation.
Mohamad Barakat led the technical architecture and end-to-end engineering, transformed and substantially expanded the initial prototype into the final product, designed the product UX flows, and built the backend, database/vector systems, AI and matching systems, RevenueCat integration, Employer platform, Admin Trust & Safety Console, email automation, infrastructure, security, testing, and release workflows.
Both contributed to shaping and refining the overall product. Any commercial proceeds allocation is a separate agreement between the contributors; code similarity and this credit do not define ownership shares.
Licensed under the MIT License.