EduStream+ is a full-stack cloud-native platform where educators can publish multimedia courses combining video lectures, illustrated notes, and audio recordings — all in a single course. Built entirely on Microsoft Azure with production-grade security and observability.
"A cloud library of knowledge, delivered on demand."
- Multi-media courses — video, images, and audio together in one course
- Course library — browse, search, filter by category and media type
- Explore page — grid view with sorting
- Course detail pages with custom video player
- Star ratings system
- Comments and discussion with content moderation
- Enroll system with progress tracking
- Course collections — group courses into learning paths
- Custom controls (play/pause, seek, volume)
- Playback speed control (0.5× to 2×)
- Keyboard shortcuts (Space=pause, →=+10s, ←=-10s)
- Auto-saves position — resumes where you left off
- Fullscreen support
- Profile pages — public profile with bio, stats, courses
- Personal dashboard — stats, leaderboard rank, activity timeline
- Live Rooms — real-time study rooms with text chat
- Notifications bell with activity feed
- Dark mode toggle
- Mobile responsive
- Direct-to-blob uploads — files go straight to Azure Blob Storage (supports 1GB+ videos, no timeout)
- SAS token generation — secure temporary upload URLs
- Content moderation — two-tier pipeline (Azure AI Content Safety + local fallback)
- Session authentication — secure login/register
- User accounts stored in Azure Table Storage
[Browser]
│
├── API requests ──► [Azure App Service: Node.js + Express]
│ │
│ ├── [Azure Table Storage]
│ │ ├── courses
│ │ ├── comments
│ │ ├── enrollments
│ │ └── users
│ │
│ ├── [Azure Key Vault]
│ │ └── Managed Identity → no plaintext secrets
│ │
│ └── [Application Insights]
│ └── Custom KQL dashboard
│
└── Direct uploads ──► [Azure Blob Storage]
├── /videos (1GB limit)
├── /images (100MB limit)
└── /audio (200MB limit)
| Layer | Technology |
|---|---|
| Runtime | Node.js 22 LTS |
| Framework | Express.js |
| Frontend | Vanilla JS SPA (custom router, no framework) |
| Database | Azure Table Storage (NoSQL) |
| File Storage | Azure Blob Storage |
| Secrets | Azure Key Vault + Managed Identity |
| Monitoring | Azure Application Insights |
| CI/CD | GitHub Actions |
| Hosting | Azure App Service (Linux) |
| Security | Helmet.js, rate limiting, content moderation |
| Service | Purpose |
|---|---|
| App Service | Hosts Node.js API and SPA frontend |
| Table Storage | NoSQL database for all entities |
| Blob Storage | Video, image, audio file storage |
| Key Vault | Secrets via Managed Identity |
| Application Insights | Telemetry and custom dashboards |
| GitHub Actions | Automated CI/CD pipeline |
- Node.js 22+
- Azure CLI
- Azure subscription
git clone https://github.com/emon22-ts/edustream.git
cd edustream
npm install
cp .env.example .env
# Add STORAGE_CONNECTION_STRING to .env
npm startchmod +x scripts/setup-azure.sh
./scripts/setup-azure.sh
git push origin main # CI/CD deploys automatically- No plaintext secrets — all credentials in Azure Key Vault
- Managed Identity — passwordless authentication to Key Vault
- Content moderation — screens all user-submitted text
- Rate limiting — 30 write requests/min per IP
- Security headers — Helmet.js middleware
- Password hashing before storage
- SAS tokens — 2-hour expiry, scoped to single upload
edustream/
├── src/
│ ├── server.js # Entry point
│ ├── routes.js # REST API endpoints
│ ├── config.js # Key Vault config loader
│ ├── middleware/auth.js # Session auth
│ └── services/
│ ├── tablestorage.js # Azure Table Storage
│ ├── storage.js # Azure Blob Storage
│ ├── sas.js # SAS token generation
│ ├── moderator.js # Content moderation
│ └── telemetry.js # App Insights
├── public/
│ ├── index.html # SPA shell
│ ├── css/main.css # Design system
│ ├── js/app.js # Router + shared utilities
│ └── pages/
│ ├── home.js
│ ├── explore.js
│ ├── course.js
│ ├── dashboard.js
│ ├── profile.js
│ ├── collections.js
│ └── liverooms.js
└── scripts/setup-azure.sh # Azure provisioning
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/courses |
List courses |
| POST | /api/courses |
Create course |
| GET | /api/courses/:id |
Get course |
| PUT | /api/courses/:id |
Update course |
| DELETE | /api/courses/:id |
Delete course |
| GET | /api/courses/:id/comments |
List comments |
| POST | /api/courses/:id/comments |
Post comment |
| POST | /api/courses/:id/enroll |
Enroll |
| POST | /api/upload/sas |
Get upload SAS token |
| POST | /api/upload/confirm |
Confirm direct upload |
| POST | /api/auth/register |
Register |
| POST | /api/auth/login |
Login |
Editorial academic aesthetic:
- Type: Fraunces (serif) + Geist (sans)
- Colours: Navy
#0e1a2b· Cream#f5edd8· Amber#c9711a - Modes: Light and dark theme
- Layout: Responsive, sidebar collapses on mobile
Mahfuzur Rahman Emon
github.com/emon22-ts
MIT