git clone https://github.com/stevederico/appschool
cd appschool
npm run install-all
npm run start # frontend http://localhost:5173
cd backend && cargo run # backend http://localhost:8000The repo ships a seeded SQLite database, so courses load on first run. Frontend is Vite. Backend is Rust (cargo run).
- 9 courses covering frontend, backend, DevOps, systems, data, Rust, TypeScript, Apple platforms, and iOS interviews
- Markdown guides with syntax-highlighted code, read at your own pace
- Quizzes graded on the server, with a passing score per quiz
- Timed reps in a Monaco code editor for hands-on practice
- Progress checklists per course, with time estimates for each guide and rep
- Bookmarks to save sections of a guide
- Enrollments so each learner tracks their own courses
- Sign up / Sign in with HS256 JWT in HttpOnly cookies
- Stripe checkout and a customer portal for subscriptions
- Webhook handling for payment events
- Zero-crate Rust backend with system libsqlite3 and libcurl
- TypeScript strict mode with
npm run typecheckgating build and test - Blog workspace for posts, run with
npm run blog
Update src/constants.json to customize the app name, tagline, landing page, and API URLs:
{
"appName": "AppSchool",
"tagline": "Learn To Code",
"backendURL": "/api",
"devBackendURL": "http://localhost:8000/api"
}backend/config.json points the backend at its database:
{
"staticDir": "../dist",
"database": {
"db": "AppSchool",
"dbType": "sqlite",
"connectionString": "./databases/AppSchool.db"
}
}Add secrets to backend/.env (never commit it):
JWT_SECRET=your-secret-key
STRIPE_KEY=sk_test_...
STRIPE_ENDPOINT_SECRET=whsec_...
XAI_API_KEY=xai-... # optional, mints ephemeral voice tokensSecurity Note: Use a Stripe restricted key with Read/Write on Checkout Sessions and Read on Customers, Prices, and Products. See docs/DEPLOY.md for every production variable.
| Technology | Version | Purpose |
|---|---|---|
| React | v19.2 | UI Framework |
| skateboard-ui | v5.1 | Application Shell, Components, Theming |
| Vite | v8 | Build Tool & Dev Server |
| Tailwind CSS | v4.3 | Styling |
| React Router | v7.18 | Routing (via skateboard-ui) |
| Monaco Editor | v4.7 | Code editor for reps |
| lucide-react | v0.546 | Icons |
| TypeScript | v7 | Frontend types (strict) |
| Node.js | v24+ | Frontend toolchain |
| Rust | 1.95+ | Zero-crate backend |
| SQLite | system lib | Database |
| Stripe | REST + libcurl | Payments |
The frontend is an application shell: skateboard-ui owns routing, auth, layout, and theming, and this app supplies routes, views, and src/constants.json. Course content lives in SQLite (Courses, Guides, Quizzes, Reps) and is served by the Rust backend. A seed script (backend/seed/seed-new-courses.js) loads guides from backend/new-guides/.
import { createSkateboardApp } from '@stevederico/skateboard-ui/App';
import constants from './constants.json';
import CoursesView from './components/CoursesView';
createSkateboardApp({
constants,
appRoutes: [{ path: 'courses', element: <CoursesView /> }],
});Full write-up in docs/GUIDE.md. Contributor and agent notes live in AGENTS.md.
See docs/DEPLOY.md for the Docker image, environment variables, database volume, and Stripe webhook setup.
# Fork the repo, then:
git clone https://github.com/YOUR_USERNAME/appschool
cd appschool
npm run install-all
npm run test # typecheck + script tests
cd backend && cargo test --locked # backend tests- 🐦 X: @stevederico
- 🐛 Issues: GitHub Issues
- React - The library that powers the web
- Vite - Lightning fast build tool
- Tailwind CSS - Utility-first CSS
- Monaco Editor - The editor behind VS Code
- Rust - Zero-crate backend
- Stripe - Payment infrastructure
- skateboard - The boilerplate this app is built on
- skateboard-ui - Component library
git clone https://github.com/stevederico/appschool && cd appschool && npm run install-all && npm run startMIT License - see LICENSE for details.