π½οΈ Demo preview β drop your GIF here once recorded
![]()
Place a
demo.gifin/docs/to replace this placeholder.
- π‘ What is Skill-Bridge?
- π Features
- π The Learning Flow
- π Architecture
- π Tech Stack
- π Getting Started
- π§ͺ Running Tests
- βΈοΈ Deploy to Kubernetes
- π API Documentation
- πΊ Roadmap
- π₯ Team
- π License
"Every expert was once a beginner. Every beginner can become an expert."
Skill-Bridge is a cloud-native, peer-to-peer learning platform that eliminates the barrier between people who have knowledge and people who need it.
You sign up, list skills you can teach and skills you want to learn, and our matching algorithm pairs you with someone whose strengths fill your gaps. You meet over WebRTC video, the session is recorded and transcribed, and at the end an AI-generated quiz verifies that learning actually happened β awarding XP, reputation badges, and unlocks.
|
Skill-gap algorithm scores every potential pair on proficiency delta, skill overlap, and timezone. Returns top 5 matches. Peer-to-peer video calls. No Zoom, no Twilio, no middleman β your media stream goes browser-to-browser. After every session, Groq + Llama 3.3 70B generates 5 custom MCQs tailored to what was actually taught. |
Reputation system rewards both teaching and learning. Climb tiers, unlock badges, build a verifiable skill rΓ©sumΓ©. Every session is transcribed and indexed in Elasticsearch for full-text search across your learning history. Supabase Realtime pushes match alerts, session reminders, and quiz results straight to your browser. |
flowchart LR
A[π€ User signs up] --> B[Lists skills + role]
B --> C{Matching Algorithm}
C -->|Top 5 scored| D[π― Match offered]
D --> E[πΉ Live WebRTC session]
E -->|session.completed event| F[Kafka Topic]
F --> G[π§ Quiz Service]
G -->|Groq + Llama 3.3| H[5 MCQs generated]
H --> I[π Learner takes quiz]
I --> J[Score computed]
J --> K[π
XP + Badges awarded]
K --> L[π€ Profile updated]
style A fill:#F58220,stroke:#fff,color:#fff
style E fill:#1e90ff,stroke:#fff,color:#fff
style G fill:#9333ea,stroke:#fff,color:#fff
style K fill:#22c55e,stroke:#fff,color:#fff
Skill-Bridge uses a hybrid microservices architecture β 5 custom Node.js services backed by Supabase managed services, all running on K3s (Kubernetes).
graph TB
subgraph "Client Layer"
FE[React + Vite SPA]
end
subgraph "Edge"
TF[Traefik Ingress<br/>SSL via Let's Encrypt]
end
subgraph "Microservices"
US[User Service<br/>:3001]
MS[Matching Service<br/>:3002]
SS[Session Service<br/>:3003]
QS[Quiz Service<br/>:3004]
NS[Notification Service<br/>:3005]
end
subgraph "Messaging"
K[Apache Kafka<br/>KRaft mode]
end
subgraph "Data Layer"
SB[(Supabase<br/>Auth + Realtime + Storage)]
PG1[(PostgreSQL<br/>x4 StatefulSets)]
RD[(Redis<br/>Cache)]
ES[(Elasticsearch 8.5<br/>Transcripts)]
end
subgraph "External"
GROQ[Groq API<br/>Llama 3.3 70B]
end
FE --> TF
TF --> US & MS & SS & QS & NS
US <--> K
MS <--> K
SS <--> K
QS <--> K
NS <--> K
US --> SB & PG1 & RD
MS --> PG1
SS --> PG1 & ES
QS --> PG1 & GROQ
NS --> SB
style FE fill:#61dafb,color:#000
style TF fill:#f97316,color:#fff
style K fill:#000,color:#fff
style GROQ fill:#F55036,color:#fff
| Service | Strategy | Reason |
|---|---|---|
| Session Service | CP | WebRTC room IDs must be consistent across replicas |
| Quiz Service | CP | Scores must be accurate for badges |
| User Service | AP | Slightly stale profiles are acceptable |
| Matching Service | AP | Old matches OK β availability priority |
| Notification Service | AP | Delayed notification > no notification |
- Repository Pattern β Session Service (clean data-access layer)
- CQRS β Quiz Service (separates command writes from query reads)
- Circuit Breaker β Notification Service (graceful degradation on failure)
π Full dependency breakdown (click to expand)
| Technology | Purpose |
|---|---|
| Node.js 20 + Express | All 5 microservices |
| Supabase | Auth, managed PostgreSQL, Realtime, Storage |
| Apache Kafka (KRaft) | Event streaming between services |
| Redis | Profile caching (< 1ms reads) |
| Elasticsearch 8.5 | Session transcript full-text search |
| PostgreSQL Γ4 | Per-service StatefulSet databases |
| Groq API (Llama 3.3 70B) | AI quiz generation |
| Technology | Purpose |
|---|---|
| React 18 + Vite | SPA framework |
| TailwindCSS v4 | Utility-first styling |
| React Router v7 | Client-side routing |
| Supabase JS | Auth + Realtime subscriptions |
| Axios | API calls with JWT interceptor |
| lucide-react | Icon system |
| WebRTC (native) | Peer-to-peer video |
| Technology | Purpose |
|---|---|
| K3s (Kubernetes) | Container orchestration |
| Docker | Containerisation |
| Helm | Package management |
| Traefik | Ingress + SSL termination |
| cert-manager + Let's Encrypt | Automatic SSL |
| Jenkins | CI/CD pipeline |
| Prometheus + Grafana | Metrics + dashboards |
| Ansible | Configuration management |
| Terraform | Infrastructure as Code |
| DigitalOcean | Cloud VPS provider |
node >= 20
docker
kubectl
helm
# optional: k3s or minikube for local devgit clone https://github.com/Asongwelewis/Skill-Bridge.git
cd Skill-BridgeEach service needs a .env. Copy from the examples:
cp Services/user-service/.env.example Services/user-service/.env
cp Services/matching-service/.env.example Services/matching-service/.env
cp Services/session-service/.env.example Services/session-service/.env
cp Services/quiz-service/.env.example Services/quiz-service/.env
cp Services/notification-service/.env.example Services/notification-service/.env
cp frontend/.env.example frontend/.envFill them in:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SECRET_KEY=your_secret_key
KAFKA_BROKER=localhost:9092
GROQ_API_KEY=gsk_your_groq_key # quiz-service only
ELASTIC_URL=https://localhost:9200 # session-service only# Install deps for every service
for s in user-service matching-service session-service quiz-service notification-service; do
(cd Services/$s && npm install)
done
(cd frontend && npm install)
# Start each service in its own terminal
cd Services/user-service && npm run dev # β :3001
cd Services/matching-service && npm run dev # β :3002
cd Services/session-service && npm run dev # β :3003
cd Services/quiz-service && npm run dev # β :3004
cd Services/notification-service && npm run dev # β :3005
cd frontend && npm run dev # β :5173cd Services/user-service && npm test
cd Services/matching-service && npm test
cd Services/session-service && npm test
cd Services/quiz-service && npm test
cd Services/notification-service && npm test# Create secrets
kubectl create secret generic user-service-secret \
--from-literal=SUPABASE_URL=https://... \
--from-literal=SUPABASE_SECRET_KEY=...
# Apply all manifests
kubectl apply -f k8s/
# Or trigger Jenkins pipeline
# β http://your-vps:8080 β Skill-Bridge β Build NowAll services route through Traefik at http://skillbridge-sen3244.duckdns.org.
π€ User Service β /api/users
| Method | Endpoint | Description |
|---|---|---|
GET |
/profiles/me |
Get my profile |
PUT |
/profiles/me |
Update my profile |
GET |
/profiles/:id |
Get any profile |
GET |
/skills/me |
Get my skills |
POST |
/skills/me |
Add a skill |
DELETE |
/skills/me/:id |
Remove a skill |
GET |
/badges/me |
Get my badges |
Implementation note: POST /api/users/skills/me now accepts either skill_id or skill_name plus category so the frontend can create and attach a skill in one flow. The session search route must remain above /:id in Services/session-service/src/routes/sessions.js.
π― Matching Service β /api/matching
| Method | Endpoint | Description |
|---|---|---|
POST |
/run/:userId |
Trigger matching algorithm |
GET |
/matches/me |
Get my matches |
PATCH |
/matches/:id |
Accept or decline |
πΉ Session Service β /api/sessions
| Method | Endpoint | Description |
|---|---|---|
POST |
/ |
Schedule a session |
GET |
/me |
Get my sessions |
PATCH |
/:id/start |
Go live |
PATCH |
/:id/end |
End session + trigger quiz |
GET |
/search?q= |
Full-text transcript search |
π§ Quiz Service β /api/quizzes
| Method | Endpoint | Description |
|---|---|---|
GET |
/session/:sessionId |
Get quiz for session |
POST |
/:quizId/attempt |
Submit answers |
GET |
/:quizId/result |
Get my result |
π Notification Service β /api/notifications
| Method | Endpoint | Description |
|---|---|---|
GET |
/ |
Get my notifications |
PATCH |
/:id/read |
Mark as read |
PATCH |
/read-all |
Mark all read |
GET |
/circuit-status |
Circuit breaker state |
- 5-microservice MVP with Kafka events
- WebRTC peer-to-peer video
- AI quiz generation (Groq + Llama 3.3)
- Elasticsearch transcript search
- K3s deployment + Jenkins CI/CD
- Mobile app (React Native)
- Group sessions (3+ participants)
- Skill certifications & verified portfolios
- Multilingual quiz generation (FR + Pidgin)
| Role | Responsibility |
|---|---|
| Product Owner / App Lead | Microservices, Kafka schemas, Supabase schema, React frontend, API docs |
| Scrum Master / DevOps Lead | Terraform, Ansible, Jenkins, K8s manifests, Prometheus/Grafana, NGINX |
Course: SEN3244 β Software Architecture Institution: ICT University β Faculty of Information & Communication Technologies Instructor: Engr. Tekoh Palma Season: Spring 2026
MIT β see LICENSE
