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)
Use the smart installer to verify prerequisites, auto-install or upgrade missing tooling, set up validation runtimes, sync project dependencies, and then choose what to run.
macOS / Linux:
./scripts/smart-install.shWindows (PowerShell):
./scripts/smart-install.ps1Direct Python entrypoint (all platforms):
python scripts/smart_install.pyHelpful flags:
--yes: non-interactive mode (no prompts)--run <target>: launch a command after setup (backend,frontend,fullstack,backend-test,frontend-test,e2e-test,mobile-test,none)--no-mobile: skip Flutter/mobile setup--skip-playwright: skip Playwright browser install step--skip-runtimes: skip validation runtime checks/install attempts
Install terminal shortcuts that start backend/frontend from anywhere.
macOS / Linux:
./scripts/setup-aliases.shTo apply aliases in the current Bash session immediately:
source ./scripts/setup-aliases.shWindows (PowerShell):
./scripts/setup-aliases.ps1Direct Python entrypoint (all platforms):
python scripts/setup_aliases.pyAfter running, open a new terminal (or source your profile), then use:
reback: start backend (uvicorn app.main:app --reload)refront: start frontend (npm run dev)
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;"