Blog
Engineering write-ups from the products I build and run: a chess-and-stocks game, an iOS alarm app, a scheduling app for a personal trainer, and the PriceGuess Israel series - architecture, real bugs, postmortems and the tradeoffs behind them.
Engineering notes
14
13
12
What iOS Really Lets an Alarm App Do: Building Wake Me Smarter
An alarm app is where the gap between what users expect and what iOS allows is widest. Five real problems from building Wake Me Smarter.
The 7-Day Bug: How Google OAuth Testing Mode Silently Broke My Calendar Sync
Google OAuth Testing mode expires refresh tokens after 7 days. How that silently broke a calendar sync for a month, and the fix.
Inside Rook Street: A Deterministic Market Engine for Chess
How Rook Street keeps every chess-and-stocks game replayable: seeded RNG, frozen engine versions, and one-answer puzzles.
Building PriceGuess Israel
1
2
3
The Idea: Why I Built a Price Guessing Game
How a trip to Shufersal sparked the idea for a Wordle-style daily game around real Israeli grocery prices.
Choosing the Tech Stack: Astro, React, and Cloudflare
Comparing Next.js, AWS, and Cloudflare. Why Astro's island architecture and the edge network won out.
Building the Core Game Logic: 6 Guesses to Get the Price
The guess evaluation system, color-coded feedback, confetti animations, and shareable emoji results.
4
5
6
7
8
9
10
11
Getting Real Data: Scraping Shufersal Products
Building a daily CRON scraper, storing products in D1, and the challenge selection algorithm.
Going Multiplayer: Real-Time 1v1 with Durable Objects
WebSockets, Durable Objects, room-based matchmaking, and the architecture of real-time game rooms.
Adding Authentication and a Ranked System
Google OAuth on Cloudflare Workers, ELO-based ratings, competitive leagues, and leaderboards.
Deploying to the Edge: Cloudflare Pages + Workers
Service bindings, deploy scripts, environment management, and staying within the free tier.
The Design System Overhaul: Dark Mode, Tokens, and a Live Theme Editor
Rebranding from red to blue, building a CSS custom properties system, adding dark mode, i18n, and an interactive theme playground.
Building the Archive: Replaying Past Daily Challenges
How I built an archive system that lets players replay past challenges, the three bugs that broke everything, and the SQL fix that solved them all.
Getting Approved by Google AdSense: What I Learned From Rejection
My experience with AdSense rejection for "low value content" and the systematic approach I took to fix it - SEO, blog content, structured data, and more.
Running a Multiplayer Game for $0/Month: Cloudflare Free Tier Lessons
How I run PriceGuess with real-time WebSockets, a database, and a daily scraper - all on Cloudflare's free tier.