How I Built a Multilingual Language Learning Platform with React, Vite & Firebase
After months of development, I launched Akcent Academy —
a full-featured online language learning platform supporting English, Russian, Chinese,
Arabic, and Turkish.
The Stack
- React + Vite — blazing-fast HMR and build times
- Firebase — auth (Google/Apple OAuth + OTP), Firestore, Storage
- Tailwind CSS + Radix UI — accessible, responsive UI
- @dnd-kit — drag-and-drop course builder for teachers
- ffmpeg.wasm — in-browser audio/video processing (no server needed!)
- PWA support — offline-capable with service workers
What the Platform Does
Students can:
- Enroll in structured language courses (video + exercises)
- Practice dictation with AI-assisted feedback
- Track progress across lessons
- Learn on mobile with a native-like PWA experience
Teachers (constructors) get:
- A full drag-and-drop course builder with block-based lesson editor
- Film/situation-based lesson formats
- Real-time comment threads with students
- Analytics dashboard
Interesting Technical Challenges
1. In-browser audio compression with ffmpeg.wasm
Rather than uploading raw .wav files, I compress audio to .mp3 entirely
in the browser using WebAssembly. This cut upload sizes by ~85%.
2. PWA Offline Mode
Built a custom offline.html + splash.html with service worker caching
so students can review completed lessons without internet.
3. DnD Course Builder
Used @dnd-kit/sortable to build a flexible drag-and-drop lesson block system
where teachers can reorder, nest, and configure blocks visually.
SEO Challenges with a React SPA
One of the hardest parts: React SPAs are tough for SEO. My approach:
- Static
<meta>tags with OG/Twitter cards inindex.html -
sitemap.xmlserved from/public -
robots.txtwith proper crawl rules - Canonical URLs per route
Still planning to add SSR with Vite SSR or migrate critical pages to Next.js.
Try It
Available in Russian and other languages. Feedback welcome!
Tags: #react #vite #firebase #webdev #javascript #pwa #education #languagelearning
Top comments (0)