Tag tabanlı akıllı eşleştirmeyle üniversitede proje & makale ortaklığı.
Öğrenciler ilgi alanlarına göre hocalarla, hocalar projelerine uygun öğrenci/akademisyenlerle buluşur. Tek bir platform — keşif, başvuru, davet ve ekip kurma birlikte.
Ostim Teknik Üniversitesi · @ostimteknik.edu.tr mail domain'i ile sınırlı
| 🎯 | Özellik | Açıklama |
|---|---|---|
| 🔍 | Akıllı Eşleştirme | Tag + aktivite + departman skoruyla öğrenci ↔ hoca ↔ proje önerisi |
| 🧠 | Yerel AI Tag Önerisi | KeyBERT + sentence-transformers ile metinden otomatik tag çıkarımı; cloud API yok |
| 👥 | Ekip Kurma Wizard'ı | Hoca proje fikri yazar → AI tag önerir → öneren hoca/öğrencileri seçer → tek tıkla proje + davet |
| 📥 | Birleşik Gelen Kutusu | Başvurular, talepler, davetler tek yerde — bekleyenler rozetli |
| ✉️ | Davet Sistemi | Proje sahibi başkalarını davet eder; kabul → otomatik üyelik (kontenjan kontrollü) |
| 📱 | Web + Mobile | Aynı backend, paylaşımlı tipler; Next.js dashboard + Expo native uygulama |
| 🔐 | Çift Mod Auth | Better Auth — web cookie, mobile Bearer token |
| 📚 | Otomatik API Docs | API ve AI servisi için tutarlı Scalar UI (localhost:3001/docs, localhost:3002/docs) |
┌─────────────────────┐ ┌─────────────────────┐
│ Next.js Web │ │ Expo Mobile │
│ :3000 │ │ (Bearer auth) │
└──────────┬──────────┘ └──────────┬──────────┘
│ fetch /api/* │ fetch /api/*
▼ ▼
┌──────────────────────────────────────┐
│ Fastify API :3001 │
│ Better Auth · Prisma · Scalar docs │
└──────┬───────────────────────┬────────┘
│ proxy │ prisma
▼ ▼
┌──────────────────┐ ┌──────────────┐
│ Python AI │ │ PostgreSQL │
│ :3002 │ │ :5432 │
│ KeyBERT + │◀───│ (Tag cache) │
│ MiniLM-L6-v2 │ └──────────────┘
└──────────────────┘
Detaylı mimari → docs/architecture.md
| Katman | Teknoloji | Versiyon |
|---|---|---|
| Monorepo | Turborepo + pnpm workspaces | pnpm 9.15.4 |
| Web | Next.js (App Router) + Tailwind v4 + shadcn/ui | 16.1.x |
| API | Fastify + Prisma + Better Auth | 5.2.x |
| AI | Python FastAPI + KeyBERT + sentence-transformers | all-MiniLM-L6-v2 |
| Mobile | Expo + Expo Router | SDK 54 |
| DB | PostgreSQL | 17 (lokal Homebrew / Windows installer) |
| State | TanStack Query | 5.x |
| Icons | Phosphor Icons | — |
Windows için detaylı rehber →
setup.md(sadece local, paylaşılmaz) macOS/Linux için aynı adımlar geçerlidir.
# 1. Klonla ve yükle
git clone https://github.com/<owner>/fp3.git
cd fp3
pnpm install
# 2. .env dosyalarını oluştur — örnekler:
cp apps/api/.env.example.local apps/api/.env
# apps/web/.env.local ve apps/ai-service/.env'i de aynı şekilde
# (içeriği apps/api/.env.example.local'da görebilirsin)
# 3. DB hazırlığı
cd apps/api
pnpm prisma:generate
pnpm prisma:migrate
pnpm prisma:seed # demo veri (örnek kullanıcılar dahil)
cd ../..
# 4. Python AI servisi
cd apps/ai-service
python -m venv .venv && source .venv/bin/activate # win: .venv\Scripts\activate
pip install -r requirements.txt
cd ../..
# 5. Çalıştır
pnpm dev # web (3000) + api (3001) + mobile
pnpm dev:ai # ai servisi (3002) — ayrı terminalcurl http://localhost:3001/health # API: {"status":"ok"}
curl http://localhost:3002/api/ai/health # AI: {"status":"ok","model_loaded":true}
open http://localhost:3000 # Web
open http://localhost:3001/docs # API Docs (Scalar)
open http://localhost:3002/docs # AI Docs (Scalar)| Servis | Port | URL |
|---|---|---|
| Web (Next.js) | 3000 |
http://localhost:3000 |
| API (Fastify) | 3001 |
http://localhost:3001 |
| AI (FastAPI) | 3002 |
http://localhost:3002 |
| Postgres | 5432 |
— |
| Expo Metro (opsiyonel) | 8081 |
— |
Tüm portlar değişebilir — apps/<servis>/.env üzerinden override.
fp3/
├── apps/
│ ├── web/ Next.js 16 dashboard
│ ├── api/ Fastify backend + Prisma + Better Auth
│ ├── ai-service/ Python FastAPI (KeyBERT + embeddings)
│ └── mobile/ Expo native app
├── packages/
│ ├── shared-types/ TS tipleri (User, Project, ...)
│ ├── validation/ Zod şemaları (web/api/mobile paylaşır)
│ └── config/ TSConfig base
├── docs/ Detaylı proje dokümantasyonu (bkz. aşağı)
├── setup.md Windows kurulum rehberi (gitignored)
└── AGENTS.md AI asistanları için bağlam dosyası
Tüm detaylar docs/ altında — her belgenin amacı tek satırda:
| Belge | İçerik |
|---|---|
docs/README.md |
Doküman indeksi |
docs/architecture.md |
Servisler, portlar, veri akışı |
docs/database.md |
13 tablo, ilişki diyagramı, migration politikası |
docs/api.md |
Tüm endpoint referansı |
docs/ai-service.md |
AI algoritması ve UI entegrasyonu |
docs/auth.md |
Better Auth + Bearer + cookie akışları |
docs/web-app.md |
Next.js sayfaları, component'ler |
docs/mobile-app.md |
Expo route'ları, native auth detayları |
docs/features/inbox.md |
Birleşik Gelen Kutusu |
docs/features/matching.md |
Matching wizard akışı |
docs/features/invitations.md |
Davet sistemi |
- Profil doldur → bio'dan AI tag önerisi al → ilgi alanlarını seç
- Eşleştirme sayfasında "Makale" veya "Proje" amacını seç → en uygun hocaları listele
- Bir hocaya doğrudan proje önerisi gönder veya açık projeye başvur
- Gelen Kutusu → Davetlerim'de bir hocadan davet gelirse kabul/reddet
- Matching → Ekip Kur wizard'ını çalıştır: fikir + kontenjan + tag → AI önerir
- Önerilen hoca + öğrencileri seç → tek tıkla proje açılır, herkese davet gider
- Gelen Kutusu üç sekme:
- Proje Başvuruları — açık projeme başvuranlar
- Öğrenci Talepleri — bana doğrudan proje öneren öğrenciler
- Davetlerim — başkasının beni davet ettiği projeler
- Projelerim sayfasında her projenin durumunu (üye, başvuru, bekleyen davet) takip et
| Kural | Notlar |
|---|---|
| TypeScript strict | Her pakette tsc --noEmit |
| UI bileşenleri | shadcn/ui + Tailwind v4 + Phosphor Icons |
| Primary renk | Indigo (#6366f1) |
| API response | { success, data?, error? } |
| Pagination | { data: T[], meta: { page, limit, total, totalPages } } |
| Workspace import | @fp3/shared-types, @fp3/validation, @fp3/config |
| Dil | UI: Türkçe · Kod: İngilizce |
| Dosya isimleri | kebab-case (invite-modal.tsx); camelCase fonksiyonlar |
# Geliştirme
pnpm dev # tüm servisleri başlat (web + api + mobile)
pnpm dev:web # sadece web
pnpm dev:api # sadece API
pnpm dev:ai # sadece Python AI servisi
pnpm dev:mobile # sadece Expo
# Bakım
pnpm clean-ports # 3000,3001,3002,8081 portlarını öldür
pnpm dev:fresh # clean-ports + dev (yeniden başlat)
pnpm type-check # tüm paketlerde tsc --noEmit
pnpm build # production build
pnpm format # Prettier
# Database (apps/api dizininde)
pnpm prisma:generate # Prisma Client
pnpm prisma:migrate # migration uygula
pnpm prisma:seed # demo veri
pnpm prisma:studio # görsel DB editörü :5555| Belirti | Çözüm |
|---|---|
Cannot find module @fp3/xxx |
pnpm install |
| Prisma client yok | cd apps/api && pnpm prisma:generate |
| Port çakışması | pnpm clean-ports |
| API docs boş geliyor | tsx watch reload sorunu — pkill -9 -f tsx + pnpm dev |
| AI servisi 503 | model henüz yüklenmedi — 10–30 sn bekle |
| Mobile telefondan API'ye bağlanmıyor | EXPO_PUBLIC_API_URL=http://<LAN-IP>:3001 ayarla |
Daha fazla → setup.md ve docs/
Proje aktif geliştirme aşamasında. Major değişiklikler için issue açıp tartışmak en sağlıklısı.
PR akışı:
- Branch oluştur (
feat/...,fix/...,chore/...) pnpm type-checkvepnpm buildgeçsin- Atomik commit'ler (her commit derlenebilir + tek bir mantıksal değişiklik)
- PR açarken ne değiştiğini ve neden gerekli olduğunu açıkla
Bu proje üniversite ödevi olarak başladı; lisans henüz tanımlanmadı. Kullanım için ekibe danış.
FP3 · Made with ☕ for the Ostim Teknik Üniversitesi research community