Telegram Mini App portfolio project for English learning with spaced repetition, interactive drills, progress tracking, and Supabase persistence.
Product-focused Telegram Mini App with a polished UI, responsive browser preview, and frontend-first Supabase persistence.
Live demo: spiffy-speculoos-507320.netlify.app
- First-run placement flow that maps the learner into CEFR levels from
A1toC1 - Multiple training formats: translation choice, sentence building, fill-in-the-gap, and listening input
- Spaced repetition card logic with SM-2-style interval updates
- XP, streak, daily goals, and achievement cards for retention
- Telegram WebApp initialization for in-app launch behavior
- Separate layout behavior for Telegram mobile and browser desktop preview
- High-polish animated UI built with React and Tailwind CSS
- Mobile-first navigation with a desktop-friendly app frame
- Local-first state for immediate interaction without backend dependency
- Supabase integration through a dedicated repository layer
- Anonymous auth for per-user state persistence
- Row Level Security policies on
user_state
- Building a polished Telegram Mini App instead of a static showcase page
- Structuring UI state outside raw component code with a dedicated repository layer
- Integrating Supabase persistence in a frontend-only architecture
- Handling responsive UX tradeoffs between Telegram mobile and desktop browser preview
- Designing product flows, learning loops, and retention mechanics end to end
FluentFlow uses a frontend-first flow:
- UI interactions update React state in
src/App.jsx - The repository layer in
src/lib/portfolioRepository.jshandles persistence - Supabase access is isolated in
src/lib/supabase.js - The app signs in anonymously and stores each user's state in
public.user_state - Progress is persisted inside
payload jsonband restored on the next launch
fluentflow-portfolio/
media/
public/
src/
lib/
portfolioRepository.js
supabase.js
App.jsx
App.css
supabase/
schema.sql
Create .env from .env.example:
VITE_SUPABASE_URL=
VITE_SUPABASE_ANON_KEY=npm install
npm run devnpm run build- Create a Supabase project
- Enable
Anonymous sign-ins - Run
supabase/schema.sqlin the SQL Editor - Add
VITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEYto.env
.envis ignored and should not be committed- The project is designed to work as a browser demo and as a Telegram Mini App
- Current media files are referenced from
./media/

