hskstory.com ↗
HSKStory — Solo-Built AI Learning Platform
One-person startup: product, engineering, design, marketing, SEO — all me.
AI-generated graded Chinese readers across HSK 1–9. The only platform covering advanced levels (7–9)
at half the price of competitors.
- Frontend — Next.js 16, React 19, server components, Tailwind 4. Tap-to-define dictionary (121K entries), FSRS spaced repetition flashcards, inline pinyin with smart mode, 3 reading themes, dynamic OG images
- Backend — FastAPI + SQLAlchemy + Alembic. Passwordless auth, Paddle payments (global VAT), reading progress sync, content import pipeline with SHA256 integrity checks
- AI/NLP — Benchmarked 7 LLMs for story generation. Built custom segmenter pipeline with g2pW BERT polyphonic disambiguation (16K corrections). Self-hosted TTS on rented GPU (Qwen3-TTS). "Best of 2" generation strategy
- DevOps — Hetzner VPS + Cloudflare CDN + R2 storage. Zero-downtime atomic deploys, GitHub Actions CI/CD, Sentry monitoring, Tailscale-only SSH, automated backups
- SEO — 47 content pages, JSON-LD schema markup, dynamic sitemaps, CTR-optimized titles. First-mover on HSK 3.0 (2025 standard, competitors still on 2.0)
- Marketing — 7-platform content strategy, automated TikTok video pipeline (YAML → MP4), cross-posting automation, competitor pricing analysis
Next.js 16
React 19
FastAPI
Python
TypeScript
Tailwind CSS 4
SQLAlchemy
LLM / AI
NLP
TTS
Cloudflare
SEO
courtmix.bezlant.com ↗
CourtMix — Doubles Scheduling Algorithm
Skill-balanced matchup generator for pickup doubles (tennis, padel, etc).
4-stage combinatorial pipeline that exhaustively enumerates player selections, court assignments,
and team splits — optimizing fairness, variety, and skill balance simultaneously.
Researched against academic papers and 6 commercial competitors; none combine
skill-aware scheduling with real-time mid-session roster changes.
<25ms
Full schedule generation
- Algorithm — Exhaustive enumeration with multi-objective scoring: quadratic mixing penalties, CFS-inspired late joiner fairness (borrowed from Linux scheduler), Copeland voting for tiebreakers, locking-point edge case fix at N=8
- Balancing — Fold pattern (strongest+weakest vs middle two) validated by doubles research. Two-phase lexicographic optimization for multi-court — tier balance first, variety second, preventing score-scale contamination
- App — React Native + Expo (iOS + web). Local-first with SQLite (drizzle-orm), WASM SQLite for web via SharedArrayBuffer. Live score tracking, mid-session swaps with schedule regeneration
- Testing — Statistical fairness distribution tests, stress tests across all player counts (4–12), edge case coverage for swap regeneration and consecutive sit/play limits
TypeScript
React Native
Expo
SQLite
Combinatorics
Algorithm Design
WASM
Cloudflare Pages