I built zsweep because I wanted a Minesweeper experience that respected "Vim grammar" rather than just mapping arrow keys to HJKL. I found that using a mouse for grid navigation broke my flow state during quick breaks, so I engineered this to be 100% keyboard-centric.
Technical Highlights:
Vim Grammar Engine: I implemented a custom state machine to handle complex motions. This includes quantifiers (e.g., 5j), search (pressing / plus a number to jump to that digit), and context-aware word motions (w/b) that intelligently skip over revealed safe cells to land on unrevealed ones.
Svelte 5 & Performance: Built with SvelteKit using the new Svelte 5 runes. This was critical for ensuring zero-latency input handling—if the movement doesn't feel as snappy as a native terminal, the "Vim feel" is lost.
Backend & Stats: Powered by Supabase. I recently had to refactor the global stats dashboard to move from client-side counting to server-side aggregation (RPC). I hit a common "gotcha" where standard selects were capping at 1,000 rows, causing our total time sweeping to drift. It now correctly reflects our full database aggregate.
Security: Leveraging Row Level Security (RLS) policies to ensure users can only modify their own game results while keeping the global leaderboard public.
Why I'm Sharing Today:
We recently hit 1,000+ active users, and I’m looking for technical contributors to help polish the experience. I’ve opened issues on GitHub regarding sound system customization and performance optimizations for the larger 30x16 grids.
oug-t•1h ago
Technical Highlights: Vim Grammar Engine: I implemented a custom state machine to handle complex motions. This includes quantifiers (e.g., 5j), search (pressing / plus a number to jump to that digit), and context-aware word motions (w/b) that intelligently skip over revealed safe cells to land on unrevealed ones.
Svelte 5 & Performance: Built with SvelteKit using the new Svelte 5 runes. This was critical for ensuring zero-latency input handling—if the movement doesn't feel as snappy as a native terminal, the "Vim feel" is lost.
Backend & Stats: Powered by Supabase. I recently had to refactor the global stats dashboard to move from client-side counting to server-side aggregation (RPC). I hit a common "gotcha" where standard selects were capping at 1,000 rows, causing our total time sweeping to drift. It now correctly reflects our full database aggregate.
Security: Leveraging Row Level Security (RLS) policies to ensure users can only modify their own game results while keeping the global leaderboard public.
Why I'm Sharing Today: We recently hit 1,000+ active users, and I’m looking for technical contributors to help polish the experience. I’ve opened issues on GitHub regarding sound system customization and performance optimizations for the larger 30x16 grids.
Play it here: https://zsweep.com Open Source Repo: https://github.com/oug-t/zsweep