RECODE.video.1.-.Made.with.Clipchamp.2.mp4
Developer-first syntax drills with instant feedback, playlists, and a focused editor experience. Built to emphasize clean architecture, SOLID, DRY, and test coverage across unit, integration, and E2E layers.
- Backend: FastAPI + SQLModel + SQLite
- Frontend: React + Vite + Tailwind + Framer Motion
- Mobile: Flutter (Android + iOS)
- Tests: Pytest (unit/integration), Vitest (frontend unit), Playwright (e2e)
- Validation: Executes user code against expected outputs per language (no sandbox)
backend/: API, domain, services, repositories, seed datafrontend/: React appmobile/: Flutter app (Android + iOS)e2e/: Playwright tests
- Python 3.11+
- Node.js 18+
- npm 9+
- Language runtimes for validation (install what you want to practice):
- Python (uses current interpreter)
- JavaScript (Node.js)
- TypeScript (
ts-nodeortsc+ Node.js) - Java (
javac+java) - C++ (
g++) - C# (
dotnetSDK orcsc+ runtime) - Go (
go) - Rust (
rustc) - SQL (
sqlite3CLI)
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadThe API will run on http://localhost:8000. A local SQLite database is created at backend/app.db and seeded on startup.
cd frontend
npm install
npm run devThe UI will run on http://localhost:5173 and will call the backend at http://localhost:8000 by default.
To customize the API URL:
VITE_API_URL=http://localhost:8000 npm run devcd mobile
flutter pub getStart the backend in a separate terminal (see Backend above).
If you need to (re)generate the platform folders:
cd mobile
flutter create --platforms=android,ios .flutter emulators
flutter emulators --launch <emulator_id>
flutter run --dart-define=API_URL=http://10.0.2.2:8000open -a Simulator
flutter run --dart-define=API_URL=http://localhost:8000- Connect the device (USB) and ensure it appears in
flutter devices. - Use your machine's LAN IP for the API URL:
flutter run --dart-define=API_URL=http://<your-machine-ip>:8000Notes:
- Android emulators cannot reach
localhoston your host; use10.0.2.2instead. - If you run into cleartext HTTP restrictions, enable HTTP for local dev:
- Android: set
android:usesCleartextTraffic="true"inandroid/app/src/main/AndroidManifest.xml. - iOS: set
NSAppTransportSecurity -> NSAllowsArbitraryLoadstoYESinios/Runner/Info.plist.
- Android: set
- iOS builds require macOS + Xcode.
Terminal 1:
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadTerminal 2:
cd frontend
npm install
npm run devcd backend
pytestcd frontend
npm run testStart backend + frontend in separate terminals, then:
cd e2e
npm install
npm run testcd mobile
flutter test
flutter test integration_test- Data is seeded automatically on backend startup.
- Validation runs code using local runtimes and compares output to lesson expectations.
- To refresh lesson content after seed changes, delete
backend/app.dband restart the backend. - To reset timing stats (attempts + best scores):
sqlite3 backend/app.db "DELETE FROM attempt; DELETE FROM bestscore;"