Full-stack LinkedIn clone: feed, messaging, jobs, connections, notifications, payments.
14 Node.js/TypeScript microservices, Next.js web app, Flutter mobile client, and a cross-platform Rust API client.
graph TB
subgraph Clients
Web["Web App<br/>(Next.js 15, React 19)"]
Mobile["Mobile App<br/>(Flutter)"]
end
subgraph API["Cross-Platform API Client (Rust)"]
WASM["WASM<br/>(wasm-bindgen)"]
FFI["Native FFI<br/>(flutter_rust_bridge)"]
end
Web --> WASM
Mobile --> FFI
WASM --> GW
FFI --> GW
subgraph Gateway
GW["API Gateway :8080<br/>(Express reverse proxy)"]
end
subgraph Services
Auth[Auth :3001]
User[User :3002]
File[File :3003]
Notif[Notification :3004]
Post[Post :3005]
Conn[Connection :3006]
Admin[Admin :3007]
Job[Job :3008]
Company[Company :3009]
Msg[Messaging :3010/3011]
Payment[Payment :3014]
Email[Email :3069]
end
GW --> Auth & User & File & Notif & Post & Conn & Admin & Job & Company & Msg & Payment & Email
subgraph Infra["Infrastructure"]
PG[(PostgreSQL 14)]
RMQ[RabbitMQ 3]
MinIO[MinIO]
end
subgraph External
Firebase[Firebase FCM]
Stripe[Stripe]
end
Services --> PG & RMQ
File --> MinIO
Payment --> Stripe
Notif --> Firebase
All services share a single PostgreSQL database using a schema-per-service pattern (e.g., auth_service.users, post_service.posts). Services communicate through RabbitMQ using two patterns:
- Events (fire-and-forget): a topic exchange (
system.events) routes events likeUSER_CREATED,FILE_DELETE, andNOTIFICATION_SENDto interested consumers. - RPC (request-response): services expose named queues for synchronous calls. For example, the Post service calls
file.file_url_rpc.queueto get presigned URLs, oruser.profile_rpc.queueto resolve user profiles.
| Layer | Technology |
|---|---|
| Web | Next.js 15, React 19, MUI 6, Zustand, Axios, Socket.IO |
| Mobile | Flutter 3.7+, BLoC, Dio, Hive, GetX |
| API Client | Rust, reqwest, wasm-bindgen (web), flutter_rust_bridge (mobile) |
| Backend | Node.js 18, Express 4, TypeScript 5 |
| Database | PostgreSQL 14 (raw SQL, schema-per-service) |
| Messaging | RabbitMQ 3 (topic exchange, pub/sub + RPC) |
| Object Storage | MinIO (S3-compatible, presigned URLs) |
| Auth | JWT (30-day tokens), bcrypt, Google OAuth via Firebase |
| Payments | Stripe Checkout (one-time + subscriptions, webhooks) |
| Push Notifications | Firebase Cloud Messaging (via firebase-admin) |
| Real-time | Socket.IO (WebSocket server on :3011) |
| CI/CD | GitHub Actions, Docker Compose, VM deploy via SSH |
| Service | Port | What it does |
|---|---|---|
| Auth | 3001 | Registration with email verification, login, Google OAuth, password reset (link or 6-digit code), ban system with expiry, admin user seeding |
| User | 3002 | Full profile CRUD (education, experience, projects, courses, skills, interests), profile/cover photo and resume uploads via File service RPC |
| Post | 3005 | Posts with media (images, video, documents), reactions, nested comments, reposts, saves, user tagging, content search, privacy levels, engagement counters |
| Connection | 3006 | Connection requests, follow/unfollow, blocking, message requests, mutual connections, 2nd-degree network, per-user privacy preferences |
| Messaging | 3010 | Conversations with file attachments, WebSocket server on :3011 for typing indicators, read receipts, online presence, multi-device support |
| Notification | 3004 | In-app notifications with pagination, push via FCM, auto-enriches payloads with user profiles via RPC |
| Job | 3008 | Job postings linked to companies, search, applications with resume upload, application status tracking, saved jobs |
| Company | 3009 | Company pages with profile/cover photos, announcements, follower system, company search, analytics |
| Payment | 3014 | Stripe Checkout for one-time purchases and recurring subscriptions, usage metering (messages/day, connections, job apps/month), webhook handling |
| File | 3003 | Upload to MinIO, presigned URL generation, file metadata. Exposes RPC queues so other services can upload files (base64 over RabbitMQ, up to 5MB) |
| 3069 | Internal email storage and delivery, consumed via EMAIL_SEND events from other services |
|
| Admin | 3007 | Dashboard with counts across all schemas, reported content management, content moderation (delete posts/jobs), user management |
| Gateway | 8080 | Express reverse proxy routing by path prefix. Passes multipart uploads through without parsing (via x-no-parse-body header) |
ascend/
apps/
web/ # Next.js web app
mobile/ # Flutter mobile app
services/
gateway/ # API gateway (reverse proxy)
auth/ # Authentication, OAuth
user/ # Profiles, resume, settings
post/ # Feed, comments, reactions
messaging/ # Chat (HTTP + WebSocket)
connection/ # Connections, follows, blocking
notification/ # Push and in-app notifications
job/ # Job posts, applications
company/ # Company pages, announcements
payment/ # Stripe subscriptions, usage limits
file/ # File uploads (MinIO)
email/ # Email delivery
admin/ # Admin dashboard, moderation
gateway-reverse-proxy/ # External traffic forwarding
packages/
shared/ # Backend SDK (DB pool, auth middleware, RabbitMQ, models)
api-client/ # Rust client (compiles to WASM for web, native FFI for mobile)
scripts/ # Deploy, backup, restore scripts
docker-compose.yml # Production
docker-compose.dev.yml # Dev (hot reload, pgAdmin, exposed ports)
docker-compose.reverse-proxy.yml # Reverse proxy to gateway
Prerequisites: Docker and Docker Compose.
git clone https://github.com/MRKDaGods/ascend.git
cd ascend
cp .env.example .env
# Fill in your credentials (Stripe keys, Firebase service account, Google OAuth client IDs)
docker compose upGateway available at http://localhost:8080.
For development with hot reload and pgAdmin:
docker compose -f docker-compose.yml -f docker-compose.dev.yml uppgAdmin at http://localhost:5050. Each service port is listed in the table above.
cd apps/web
cp .env.example .env.local
# Fill in NEXT_PUBLIC_FIREBASE_* values
npm install
npm run devcd apps/mobile
cp lib/firebase_options.dart.example lib/firebase_options.dart
cp android/app/google-services.json.example android/app/google-services.json
# Fill in your Firebase config values
flutter pub get
flutter run| Area | Guide |
|---|---|
| Backend Services | services/README.md |
| Web App | apps/web/README.md |
| Mobile App | apps/mobile/README.md |
| API Client (Rust) | packages/api-client/README.md |
| Shared Backend SDK | packages/shared/README.md |
| Scripts | scripts/README.md |
Built by students at Cairo University, Faculty of Engineering.
| Name | GitHub | Area |
|---|---|---|
| Mohamed Ammar | @MRKDaGods | Project lead, auth, email, notifications, user, most backend services, shared SDK, API client (Rust), infra, contributions across all layers |
| Ali Ashraf | @3li-Ashraf | Jobs, messaging, admin |
| Bassem Adam | @BassemAdam | Posts, connections |
| Mohamed Ayman | @mohamed-ayman-28 | Company, payments |
| Name | GitHub | Area |
|---|---|---|
| Habiba Hammouda | @HabibaHammouda | Feed, network, components |
| Hana Ahmed | @Hana-Ahmed2 | Jobs, search, notifications |
| Nouran Haridy | @nouranharidy | Profile, premium |
| Ruaa Tolba | @rtolba04 | Chat, admin dashboard |
| Mehrati Sameh | @Mehrati3 | Company, auth |
| Name | GitHub | Area |
|---|---|---|
| Seif Heakal | @seifheakal | Feed, posts, profile |
| Mohammed Ibrahim | @M7mdddibrahim | Admin panel, routing, auth |
| Mohamed Tarek Afifi | @Motarek2003 | Messaging, networks, settings |
| Maged Wadi | @MagedWadi | User profile, company |
| Mostafa Osama | @zcrack4i0 | Jobs |
| Name | GitHub | Area |
|---|---|---|
| Abdelrahman Hamdi | @gumfreddy | CI/CD, Docker, deployment |
| Name | GitHub | Area |
|---|---|---|
| Shehab Elhadary | @shehab400 | Selenium E2E tests |
| Hamza Ahmed | @Hamzaahmeed | Cypress E2E tests |
MIT

