05/E-learning platform · Serverless
LearnJS
14 interactive FR/EN JavaScript courses, with payments, magic links and edge-protected content.
- Role
- Design, content and development, solo
- Period
- Mar 2026
- Status
- Live

- FR / EN courses
- 14
- of development
- 4 jours
- dependencies to verify JWTs
- 0
Context
A short project to put web fundamentals and a secure serverless architecture to the test, alongside my React work.
The problem
Protect paid content on a static site, without a classic database or framework, and handle refunds cleanly.
Architecture & technical choices
- 01
JWT verified at the edge, dependency-free
An Edge Function (Deno) checks the token’s HMAC-SHA256 signature itself with crypto.subtle. The cookie is HttpOnly, Secure and SameSite=Strict.
- 02
Revocation on refund
A signed Stripe webhook (charge.refunded) sets a revocation key with a TTL in Redis, checked on every request. A single active session limits account sharing.
- 03
Magic links without enumeration
A 15-minute JWT is exchanged for a session token; the response stays neutral whatever address is entered.
- 04
Teaching components in vanilla JS
Scroll-synced table of contents (IntersectionObserver), quizzes, progress tracking and home-made i18n, with no library at all.
Stack
- JavaScript
- HTML / CSS
- Netlify Functions
- Netlify Edge Functions (Deno)
- Web Crypto
- Stripe Checkout & webhooks
- JWT HS256
- Upstash Redis
- Resend
Gallery (4)
Select an image to enlarge it.