Skip to content
Projects

Not Your Grandma's Sudoku

Side Project
Primary linkOpen live apphttps://cryptoku-two.vercel.app
Not Your Grandma's Sudoku
688,000 people subscribe to Cracking the Cryptic on YouTube. Millions watch variant Sudoku solves. Killer cages, thermometers, knight constraints, German whispers, Renban lines: puzzles where the rules change and standard Sudoku logic gets you nowhere. Then those millions open a Sudoku app and get a plain 9x9 grid with a banner ad. The market is not small. sudoku.coach teaches variants brilliantly, but it's web-only, no native app. Logic Wiz has 40+ variants and 720K downloads, but costs $23 and drowns you in simultaneous options. The CTC App sells hand-crafted puzzle packs but doesn't teach you how the variants work. Andoku has 4.65 stars and wall-to-wall ads. Every free Sudoku app on the Play Store is an ad delivery system that happens to contain a puzzle. Nobody built a native app that teaches variant Sudoku progressively, adapts to your skill level, and doesn't interrupt you every third puzzle to sell something.
Seventeen variant types: Classic, Killer, Thermo, Knight's Move, Diagonal, Arrow, Sandwich, German Whisper, Renban, Palindrome, Kropki, XV, King's Move, Fog of War, and Miracle. Plus three multi-constraint combos: Anti-Chess (Knight + King), Killer Thermo, and X-Knight (Knight + Diagonal). Each variant has an eight-step teaching progression. You don't start with a 9x9 Killer cage and hope for the best. You start with a 4x4 grid where the variant constraint is the only thing you need to learn. Then a 4x4 practice puzzle. Then 6x6 introduction and practice. By the time you see a full 9x9, you understand the constraint because you've internalized it at smaller scales where the logic is visible. The difficulty system tracks which solving techniques you've demonstrated (naked singles through XY-Wing) and suggests puzzles at your current edge. Not stuck on Easy forever. Not drowning in Expert. A "SUGGESTED" badge on the difficulty that will stretch you without breaking you. Daily challenges use seeded randomness so everyone solves the same puzzle on the same day. Streak tracking, calendar dots, the whole daily habit loop. f-puzzles import if you want to paste a puzzle URL from the community and play it natively.
Every Sudoku app looks like a spreadsheet with rounded corners. Cryptoku looks like it belongs on a CRT monitor in 1987. PostHog-inspired retro aesthetic. Four color themes: cream default, midnight dark, CRT green, and dawn warm. The Inspector, a 16x16 pixel art detective with a magnifying glass, reacts to your play: neutral while you think, happy when you're right, surprised when you break a constraint, thinking when you pause. Fifty-plus variant-specific error messages with personality: "That's not how knights move, friend." This isn't decoration. The visual identity is the positioning. When everything in the category looks clinical and interchangeable, looking different is a feature. People remember the app with the pixel art detective. They don't remember "Sudoku Pro 2026."
Puzzle generation uses constraint-aware backtracking with propagation. For Knight's Move, that means the solver enforces anti-knight constraints during generation, not as a post-hoc validation. For Miracle (simultaneous knight, king, diagonal, and orthogonal consecutive constraints), the constraint space is so tight that brute-force generation would take hours. Constraint propagation prunes the search tree before backtracking even begins. Rendering is GPU-accelerated via React Native Skia. The grid, all seventeen overlay types (cage borders, thermometer paths, arrow indicators, Kropki dots, XV pairs, fog of war masks), and the Inspector mascot are drawn on a Skia canvas. Touch handling was the headache: React Native's GestureDetector doesn't work reliably on web, so cell taps use View responders plus onClick as a web fallback. The app runs on three platforms from one codebase. Web loads CanvasKit WASM before mounting (a separate entry point handles that split so Metro doesn't crash trying to import Node's fs module). Android builds via Expo prebuild and Gradle. iOS is pending.
The hard part of a puzzle app is not the puzzle. Generating valid Killer Sudoku with constraint-aware backtracking is satisfying work, but it's a solved problem. The hard part is the flow around the puzzle. Game persistence (if the app closes, your in-progress puzzle should survive). Touch targets that are large enough on a phone screen but don't waste space on a tablet. Font rendering that works identically across three platforms (it doesn't: Android's fontWeight only works with system fonts, custom fonts need explicit family mapping). Safe area insets. Async storage initialization that doesn't throw unhandled promise rejections on Android startup. Every one of these is individually trivial. Collectively, they're the difference between a demo and a product. The puzzle generator was two days. The platform compatibility work was two weeks.
Web and Android working. Seventeen variants playable. Teaching system, daily challenges, f-puzzles import, four themes, sound, haptics, undo/redo, pencil marks, hints all functional. iOS build, premium unlock ($5.99 one-time, zero ads ever), and Play Store submission are next. Stack: Expo 55, React Native Skia 2.4, TypeScript (strict), expo-sqlite + localStorage.