Learn Svelte from the ground up. Pass quizzes and a final exam.
Earn a certificate anyone can verify — at zero cost, forever.
svelteskill.vercel.app · Report a Bug · Request a Feature · Curriculum Feedback
The Svelte ecosystem is one of the fastest growing in web development. Developers consistently rank it as their most loved framework — yet there was no certification platform for it. No structured way to learn it end to end. No way to prove you know it.
SvelteSkill fills that gap.
Built by a developer who wanted it to exist, for a community that deserves it. No company, no investors, no paywall. Just an open source project built with the very framework it teaches.
/verify/[id] page, no login needed to verify/u/[username]| # | Track | Lessons | Status |
|---|---|---|---|
| 01 | Svelte Fundamentals | 12 | ✅ Available |
| 02 | SvelteKit | 12 | ✅ Available |
| 03 | Svelte Advanced | 12 | ✅ Available |
| 04 | Svelte + TypeScript | 12 | ✅ Available |
Sign up with GitHub or Google
↓
Complete lessons 1–3 → Pass Part 1 Quiz (15 questions, 80%+)
↓
Complete lessons 4–6 → Pass Part 2 Quiz (15 questions, 80%+)
↓
Complete lessons 7–9 → Pass Part 3 Quiz (15 questions, 80%+)
↓
Complete lessons 10–12 → Pass Part 4 Quiz (15 questions, 80%+)
↓
Pass Final Exam (20 questions, 30 min, 80%+)
↓
Certificate issued with a unique verifiable ID
↓
Share at svelteskill.dev/verify/[id]
Every certificate is permanently accessible at a public URL. No login required to verify — share it on LinkedIn, a portfolio, or a resume and anyone can confirm it is real.
| Layer | Technology |
|---|---|
| Framework | SvelteKit — Svelte 5 with runes mode |
| Database | Supabase — PostgreSQL with Row Level Security |
| Auth | Supabase Auth — GitHub OAuth + Google OAuth |
| Styling | Tailwind CSS v3 + CSS variables for theming |
| Language | TypeScript throughout |
| Deployment | Vercel |
git clone https://github.com/constantine2003/svelteskill.git
cd svelteskill
npm install
cp .env.example .env
Fill in your values:
PUBLIC_SUPABASE_URL=https://your-project.supabase.co
PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
Never commit
.env— it contains secrets. The.env.examplefile is safe to commit.
Run the schema in your Supabase SQL Editor:
docs/schema.sql
Then seed the curriculum in order:
docs/seeds/01_svelte_fundamentals_modules.sql
docs/seeds/02_svelte_fundamentals_questions.sql
docs/seeds/03_sveltekit_modules.sql
docs/seeds/04_sveltekit_questions.sql
GitHub:
https://YOUR_PROJECT.supabase.co/auth/v1/callbackGoogle:
https://YOUR_PROJECT.supabase.co/auth/v1/callbackURL config in Supabase:
http://localhost:5173http://localhost:5173/auth/callbacknpm run dev
Open http://localhost:5173.
svelteskill/
│
├── src/
│ ├── app.html # Root HTML — theme init script (no FOUC)
│ ├── app.css # Global styles + CSS variables for theming
│ ├── app.d.ts # Global TypeScript declarations
│ ├── hooks.server.ts # Supabase client + session on every request
│ │
│ ├── lib/
│ │ ├── components/layout/
│ │ │ └── Navbar.svelte # Auth-aware navbar with theme toggle
│ │ │ └── Footer.svelte # Footer
│ │ ├── stores/
│ │ │ └── theme.ts # Dark/light mode store
│ │ └── supabase/
│ │ ├── client.ts # Browser Supabase client
│ │ ├── server.ts # Server Supabase client
│ │ └── types.ts # Generated DB types
│ │
│ └── routes/
│ ├── +page.svelte # Landing page /
│ ├── +layout.svelte # Root layout — Navbar + theme sync
│ ├── +layout.server.ts # Session + profile passed to all pages
│ │
│ ├── auth/ # Login, OAuth callback, logout
│ ├── onboarding/ # First-login profile setup
│ ├── dashboard/ # Progress overview
│ ├── settings/ # Edit profile + theme toggle
│ │
│ ├── tracks/
│ │ └── [slug]/
│ │ ├── modules/[moduleSlug] # Lesson page
│ │ ├── part/[partIndex]/quiz # Part assessment
│ │ └── exam/result # Certificate generation
│ │
│ ├── verify/[certId] # Public certificate verification
│ └── u/[username] # Public user profile
│
├── docs/ # Schema SQL + seed files
├── static/ # Favicon, OG image
├── .env
├── svelte.config.js
├── tailwind.config.js
└── vite.config.ts
| Table | Purpose |
|---|---|
profiles |
Display name, full name, avatar — created on first login |
tracks |
The 4 certification tracks with prerequisite chain |
modules |
Lessons within each track, grouped by part_index (1–4) |
questions |
Quiz and exam questions with options, correct answer, explanation |
user_progress |
Which modules each user has completed |
part_assessments |
Part quiz results per user per track |
exam_attempts |
Final exam attempts with score and answer record |
certificates |
Issued certificates — UUID is the public verifiable ID |
All user tables have Row Level Security enabled. The verify page uses the service role key to read certificates publicly without exposing other user data.
SvelteSkill supports dark and light mode with zero flash on load. The theme is applied via a synchronous script in <head> before the first paint.
Colors are defined as CSS variables in app.css:
:root { --bg: #1a1a1a; --text: #f0ede8; ... } /* dark */
:root.light { --bg: #f7f5f2; --text: #1a1a1a; ... } /* light */
Use CSS variable syntax in Tailwind arbitrary values to support both modes:
<!-- Supports both dark and light automatically -->
<div class="bg-[var(--bg)] text-[var(--text)] border-[var(--border)]">
SvelteSkill is community-driven. Every contribution — a typo fix, a better explanation, a bug report — makes the platform better for everyone learning Svelte.
Fix a curriculum mistake
Found an error in a lesson or a wrong answer in a quiz? Open an issue with the curriculum label or submit a PR directly.
Improve an explanation Think a concept could be explained better? Open a discussion or PR.
Report a bug Open a bug report with steps to reproduce.
Suggest a feature Open a feature request describing what you want and why.
Add new track content Interested in contributing lessons for Track 3 or 4? Open an issue first to discuss scope, then submit a PR with the SQL inserts following the existing lesson format.
any where possiblevar(--bg) not #1a1a1arel="external" to all <a> tags (ESLint rule)for attributes to all <label> tagsnpm install -D @sveltejs/adapter-vercel
Update svelte.config.js:
import adapter from '@sveltejs/adapter-vercel';
export default { kit: { adapter: adapter() } };
After deploying — update your OAuth URLs:
After any schema change, regenerate types:
npx supabase gen types typescript --project-id YOUR_PROJECT_ID > src/lib/supabase/types.ts
The platform code is licensed under the MIT License.
The curriculum content (lesson text, questions, and explanations) is licensed under CC BY-NC-SA 4.0 — free to use and share with attribution, non-commercial use only.