{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Gary's devlog — Gary Gitpush",
  "home_page_url": "https://garygitpush.com/blog/",
  "feed_url": "https://garygitpush.com/blog/feed.json",
  "description": "Day N of building games with AI until one hits 1,000 players. Every build, every bug, every cost, every player count. Written by an AI-generated character, numbers real and dated.",
  "icon": "https://garygitpush.com/media/gary-avatar.jpg",
  "favicon": "https://garygitpush.com/assets/favicon.png",
  "language": "en",
  "authors": [
    {
      "name": "Gary Gitpush (AI-generated character)",
      "url": "https://garygitpush.com/about-gary",
      "avatar": "https://garygitpush.com/media/gary-avatar.jpg"
    }
  ],
  "items": [
    {
      "id": "https://garygitpush.com/blog/how-we-count-players/",
      "url": "https://garygitpush.com/blog/how-we-count-players/",
      "title": "How we count players (and why you can't fake it easily)",
      "summary": "A player is a device that finished a full game. What counts, what doesn't, the anti-bot rules, the privacy side, and the holes we know about. Honest about the limits.",
      "content_html": "<p>The whole bet is one number. If that number is soft, the bet is worthless, and my brother gets to be right about more than games. So here&#39;s how the counter works, including the parts that aren&#39;t bulletproof.</p>\n<h2 id=\"the-definition\">The definition</h2>\n<p>A <strong>player</strong> is a device that finished at least one full game (a win, a loss or the turn cap), validated by the server. It&#39;s counted per game, for the lifetime of that game.</p>\n<p><strong>Unique devices, not people.</strong> Your phone and your laptop are two players. Two people sharing one tablet are one. And one game has to reach 1,000 <strong>on its own</strong>. I can&#39;t add games up. I asked. The answer was no. I was the one answering.</p>\n<h2 id=\"the-four-numbers\">The four numbers</h2>\n<div class=\"tbl-wrap\"><table class=\"tbl\">\n<thead>\n<tr>\n<th>Number</th>\n<th>What it means</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>PLAYERS</td>\n<td>Devices that finished at least one validated game. Lifetime, per game. This is the one that has to reach 1,000.</td>\n</tr>\n<tr>\n<td>ONLINE</td>\n<td>Devices with the game open right now. Each checks in every 30 seconds while the tab is visible and drops out after 90 seconds of silence.</td>\n</tr>\n<tr>\n<td>TODAY</td>\n<td>Players who finished a validated game today (UTC days, the same clock as the daily map).</td>\n</tr>\n<tr>\n<td>RETURNING</td>\n<td>Players who finished validated games on at least two different days.</td>\n</tr>\n</tbody></table></div>\n<h2 id=\"what-does-not-count\">What does not count</h2>\n<ul>\n<li>Opening the page, looking at the menu, starting a game and quitting. Only a <strong>finished</strong> game counts.</li>\n<li>Finishing again on the same device. You&#39;re already counted. (Thank you, though.)</li>\n<li>Rounds that are too fast or too slow. For Brother vs Gary that&#39;s under 6 seconds or over 90 minutes of play.</li>\n<li>A finish with no matching start, or the same round finished twice.</li>\n<li>A round that claims more play time than actually passed on our server&#39;s clock.</li>\n<li>Anything a browser sends from another website. The server refuses foreign origins.</li>\n<li>Devices that opted out, or whose browser sends Global Privacy Control. Those send nothing at all.</li>\n</ul>\n<h2 id=\"the-anti-bot-rules\">The anti-bot rules</h2>\n<ol>\n<li><strong>Start → finish pairing.</strong> Every round gets a random round id when it starts. The finish has to quote it, with the same map seed.</li>\n<li><strong>Server clock.</strong> The server notes when the round started. Report a 10-minute game 30 seconds after starting it, and it&#39;s rejected.</li>\n<li><strong>Plausible bounds.</strong> Each game has a minimum and a maximum round time. Anything outside that is rejected.</li>\n<li><strong>One finish per round.</strong> Replaying the same finish does nothing.</li>\n<li><strong>Rate limits.</strong> Per device: at most 20 starts and 20 finishes a minute, and one heartbeat per 20 seconds.</li>\n<li><strong>Checksum.</strong> Each finish carries a checksum over its fields.</li>\n</ol>\n<h2 id=\"the-holes-we-know-about\">The holes we know about</h2>\n<p>This is the honest part.</p>\n<ul>\n<li><strong>The checksum is not a secret.</strong> Its formula is in the public JavaScript. It stops sloppy replays and typos, not a person who reads code. Server-signed round tokens are on the list for v2.</li>\n<li><strong>The origin check stops browsers, not scripts.</strong> A script can fake the header.</li>\n<li><strong>Many fake device ids beat everything above.</strong> Someone determined, with a script and a pile of fake ids that each play a believable round, can pump the number. Nothing on the open web stops that without accounts, and I don&#39;t want accounts.</li>\n</ul>\n<p>So the real defence is that <strong>everything is public</strong>. Every number on the site comes from one endpoint, <a href=\"https://garygitpush.com/v1/stats\"><code>/v1/stats</code></a>, the same JSON for everyone, with no login. If the numbers ever look pumped, my brother will call it out, and so can you. If fake players get in, the count goes <strong>down</strong>, in public, with a post about it.</p>\n<h2 id=\"what-we-changed-on-day-1\">What we changed on Day 1</h2>\n<ul>\n<li><strong>The minimum round time went from 20 seconds to 6.</strong> At 20, a real player who wins fast would have been thrown away. A self-audit on the morning of Day 1 caught it.</li>\n<li><strong>The rules page got more honest.</strong> It used to sound like the origin check was a real lock. Now it says a script can fake it.</li>\n<li><strong>Our own launch test didn&#39;t count, and that&#39;s the point.</strong> At 06:39 a real browser opened the live game. ONLINE went to 1, PLAYERS stayed at 0, because nobody finished a game. That&#39;s the counter working as designed.</li>\n</ul>\n<h2 id=\"the-privacy-side\">The privacy side</h2>\n<p>There are no cookies, no ads, no third-party trackers and no accounts. The game stores a random id on your device. Our server only keeps a salted hash of it, never your IP address, and the id is replaced after 13 months. You can switch the counter off for your device on the <a href=\"https://garygitpush.com/privacy#opt-out\">privacy page</a>, and a browser that sends Global Privacy Control is never counted.</p>\n<h2 id=\"check-it-yourself\">Check it yourself</h2>\n<p>This is what <a href=\"https://garygitpush.com/v1/stats\"><code>/v1/stats</code></a> returned at 07:06 UTC on 25 October (shortened):</p>\n<pre><code class=\"language-json\">{\n  &quot;generatedAt&quot;: &quot;2026-10-25T07:06:21.855Z&quot;,\n  &quot;day&quot;: 1,\n  &quot;goal&quot;: 1000,\n  &quot;note&quot;: &quot;Unique devices, not people. A player is a device that finished at least one validated game. See /how-we-count.&quot;,\n  &quot;games&quot;: [\n    { &quot;id&quot;: &quot;hex&quot;, &quot;number&quot;: 1, &quot;title&quot;: &quot;Brother vs Gary&quot;, &quot;status&quot;: &quot;live&quot;,\n      &quot;players&quot;: 2, &quot;today&quot;: 2, &quot;returning&quot;: 0, &quot;online&quot;: 0 }\n  ]\n}\n</code></pre>\n<p>Two players, 998 to go. The full rule set, kept in sync with the code, is on <a href=\"https://garygitpush.com/how-we-count\">How we count</a>. If you find a hole that isn&#39;t on this list, write to <a href=\"mailto:gary@garygitpush.com\">gary@garygitpush.com</a>. It gets fixed in public.</p>\n\n<p><em>Gary is an AI-generated character. The games, the code and the numbers are real.</em></p>",
      "image": "https://garygitpush.com/blog/how-we-count-players/og.png",
      "date_published": "2026-10-25T09:00:00+01:00",
      "date_modified": "2026-10-25T09:00:00+01:00",
      "tags": [
        "player counter",
        "how we count",
        "privacy",
        "building in public",
        "Brother vs Gary"
      ]
    },
    {
      "id": "https://garygitpush.com/blog/i-built-a-hex-war-game-with-ai-in-one-day/",
      "url": "https://garygitpush.com/blog/i-built-a-hex-war-game-with-ai-in-one-day/",
      "title": "I built a hex war game with AI in one day. Here's what broke",
      "summary": "Brother vs Gary went from decision to live in 75 minutes, then got rebuilt three times before breakfast. The timeline, what broke, and the rules we ended up with.",
      "content_html": "<p>Game #1 is <strong>Brother vs Gary</strong>, a hex territory war. I&#39;m orange, my brother is blue, grey tiles are neutral, black tiles are walls, and <strong>we take turns: I move, then my brother answers</strong>. (On launch morning we both moved at once — more on that below.) There&#39;s a new map every day (UTC), plus practice against three brother levels. It runs in the browser, it&#39;s free, and there&#39;s no account. <a href=\"https://garygitpush.com/hex/\">Play it here</a>.</p>\n<p>It wasn&#39;t even the plan. At 05:24 the plan for game #1 was <em>Slide to the Car</em>, a game about me sliding to my car in pool slides. By 05:39 it was parked as work in progress and the hex war took slot #1. Slide to the Car is still in the repo. It will slide again.</p>\n<h2 id=\"the-timeline\">The timeline</h2>\n<p>All times are Budapest time (CET) on 25 October 2026.</p>\n<div class=\"tbl-wrap\"><table class=\"tbl\">\n<thead>\n<tr>\n<th>Time</th>\n<th>What happened</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>05:39</td>\n<td>Repo scaffold. Slide to the Car parked.</td>\n</tr>\n<tr>\n<td>05:56</td>\n<td><strong>v0</strong>: seeded, mirrored daily map plus practice, simultaneous turns, three brother levels, a share card. 17 tests. In a 200-game simulation the normal brother beat a simple greedy bot 58% of the time.</td>\n</tr>\n<tr>\n<td>05:59</td>\n<td>Wired to the public player counter.</td>\n</tr>\n<tr>\n<td>06:10</td>\n<td>A bot played a full game in real Chrome against a local server. The counter went 0 → 1.</td>\n</tr>\n<tr>\n<td>06:39</td>\n<td><strong>Live</strong> at garygitpush.com/hex/. In the production smoke test ONLINE went to 1 and PLAYERS stayed at 0, because nobody had finished a game yet.</td>\n</tr>\n<tr>\n<td>07:04</td>\n<td><strong>Controls rebuilt</strong> after &quot;I can&#39;t move&quot;.</td>\n</tr>\n<tr>\n<td>07:22</td>\n<td><strong>v3 live</strong>: standing orders, AUTO play, resume, pinch zoom.</td>\n</tr>\n<tr>\n<td>07:47</td>\n<td><strong>v4 committed</strong>: rebuilt on the classic hex war rules (below).</td>\n</tr>\n<tr>\n<td>later that morning</td>\n<td><strong>v4 live</strong>, then <strong>v5</strong>: turns alternate and the only way to win is to take every tile.</td>\n</tr>\n</tbody></table></div>\n<h2 id=\"what-broke\">What broke</h2>\n<h3 id=\"1-i-cant-move\">1. &quot;I can&#39;t move.&quot;</h3>\n<p>The first human to play it, my producer, couldn&#39;t work out how to move. Moves were drag-only and the game gave no feedback when you got it wrong. The fix came at 07:04. Tap a tile and it lights up with its neighbours. A wrong move gets a message instead of silence. The arrows got bigger, and a step-by-step banner explains the first turns.</p>\n<p>Lesson one: AI writes a game loop in minutes. It can&#39;t feel that the game is confusing. Someone has to touch it.</p>\n<h3 id=\"2-two-things-that-werent-the-game\">2. Two things that weren&#39;t the game</h3>\n<p>The same morning the browser showed &quot;Not secure&quot; on the site, because the domain&#39;s HTTPS settings weren&#39;t strict yet. Always-HTTPS and strict SSL fixed it. The slogan also wrapped in the wrong places on phones. Not game bugs, but players saw them first.</p>\n<h3 id=\"3-standing-orders-made-it-worse-differently\">3. Standing orders made it worse, differently</h3>\n<p>v3 added standing orders: arrows that keep firing every turn, supply lines between your own tiles, and an AUTO button that plays the turns for you. On paper it looked great. Then the producer played it: &quot;the numbers don&#39;t add up, and the controls are too complex&quot;. He was right. You couldn&#39;t tell from the board how many units would actually move.</p>\n<h3 id=\"4-so-we-went-back-to-the-source\">4. So we went back to the source</h3>\n<p>Brother vs Gary is inspired by an older mobile game, <strong>Hex War</strong> by Benoit Renaud. Instead of inventing a fourth set of rules, we read how its rules work and rebuilt ours on the same mechanics. We didn&#39;t take its name, its text or its art.</p>\n<ul>\n<li>You choose <strong>exactly</strong> how many units move, with a stepper, and you can make a move repeat <strong>every turn</strong> (a supply route). The arrow shows the exact number that moves, and the tile shows how many stay.</li>\n<li>Tiles grow by <strong>round(√units)</strong> each turn, up to 99. Above that they shrink. Small tiles grow fast, and giant stacks rot.</li>\n<li>Combat has <strong>no dice</strong>. The bigger side keeps <strong>A − B²/A</strong> units and the smaller side is wiped out. That&#39;s the Lanchester square law, which is a fancy way of saying: gang up.</li>\n<li>Gold, silver and bronze tiles grow faster. Attack and defense tiles give +25%.</li>\n<li>The brother&#39;s difficulty is mostly how fast his tiles grow: ×0.5, ×1 or ×1.5.</li>\n</ul>\n<p>What we changed on purpose: a <strong>5 × 7 board of 33 tiles, mirrored 180°</strong>, so the daily map is fair for both sides. And after another playtest, two bigger calls by the producer: <strong>turns alternate</strong> (you move, then the brother answers the new board, instead of both moving at once like the original) and <strong>conquest is the only win</strong> — no turn cap, no points. Moving first turned out to be a disadvantage, so I start with +3 units. In 200 uncapped normal-vs-normal games it&#39;s 50.5%, games average about 19 rounds, and none stalled.</p>\n<h3 id=\"5-the-lesson-behind-the-lesson\">5. The lesson behind the lesson</h3>\n<p>Each version shipped within the hour and got played within the next. The game got better every time a human touched it, not every time the tests passed.</p>\n<h2 id=\"what-i-learned-on-day-1\">What I learned on Day 1</h2>\n<ul>\n<li><strong>Fast is real.</strong> Decision to live game took 75 minutes. The first playable version took about 33 minutes of AI agent time.</li>\n<li><strong>The bugs that mattered weren&#39;t code bugs.</strong> Confusing controls, and numbers that didn&#39;t add up to a human eye. Both were found by one person playing for a few minutes. No test caught them, because nobody had written &quot;is this fun?&quot; as a test.</li>\n<li><strong>When a genre already has a great game, read it before you invent.</strong> Three versions of my own rules lost to one careful look at how the original works.</li>\n</ul>\n<p>Players so far: <strong>2</strong> (as of 07:06 UTC). Finish one game and you&#39;re on the counter too. <a href=\"https://garygitpush.com/hex/\">Play Brother vs Gary</a>.</p>\n\n<p><em>Gary is an AI-generated character. The games, the code and the numbers are real.</em></p>",
      "image": "https://garygitpush.com/blog/i-built-a-hex-war-game-with-ai-in-one-day/og.png",
      "date_published": "2026-10-25T08:45:00+01:00",
      "date_modified": "2026-10-25T08:45:00+01:00",
      "tags": [
        "Brother vs Gary",
        "AI game development",
        "hex strategy",
        "browser games",
        "building in public"
      ]
    },
    {
      "id": "https://garygitpush.com/blog/day-1-my-brother-says-1000-players-is-impossible/",
      "url": "https://garygitpush.com/blog/day-1-my-brother-says-1000-players-is-impossible/",
      "title": "Day 1: My brother says 1,000 players is impossible",
      "summary": "The bet, the setup and the real bill for Day 1: two domains, a prepaid SIM, 547 AI video credits and one 15-second video. Every number from the build log.",
      "content_html": "<p><a href=\"https://garygitpush.com/media/day-001.mp4\">Watch the 15-second reel</a> (AI-generated video).</p>\n<p>My brother says 1,000 players is impossible. Not for games in general. For <em>my</em> games.</p>\n<p>So here&#39;s the deal. I build small games with AI, in public, until <strong>one game, on its own, gets 1,000 players</strong>. Not views, not followers, not all my games added up. Players, counted on a public counter at <a href=\"https://garygitpush.com/\">garygitpush.com</a> that my brother can audit. Day 1 is 25 October 2026. There&#39;s no deadline. There&#39;s only the counter.</p>\n<p>Honesty first: <strong>I&#39;m an AI-generated character.</strong> My face, my voice and my videos come out of AI tools, and the panel flat and the brother are part of the show. The games, the code, the costs and the player numbers are real. The reels on <a href=\"https://www.tiktok.com/@gary.gitpush\" rel=\"noopener\">TikTok</a>, <a href=\"https://www.youtube.com/@garygitpush\" rel=\"noopener\">YouTube</a> and <a href=\"https://www.instagram.com/garygitpush\" rel=\"noopener\">Instagram</a> are rented land. This blog is where the full story lives.</p>\n<h2 id=\"what-day-1-actually-was\">What Day 1 actually was</h2>\n<p>Day 1 started the evening before, at 21:24 Budapest time on 24 October, and the first video went out at 03:50 the next morning. In between:</p>\n<ul>\n<li><strong>22:17</strong>: garygitpush.com and garygitpush.dev registered. $10.46 and $8.20.</li>\n<li><strong>22:31</strong>: <a href=\"mailto:gary@garygitpush.com\">gary@garygitpush.com</a> forwards to a real inbox. Tests 1 and 2 bounced. Test 3 got through. I celebrated like it was a world title.</li>\n<li><strong>22:42–22:53</strong>: a fresh Android phone, and 82 pre-installed apps removed over USB. The phone is now mostly TikTok and hope.</li>\n<li><strong>22:57</strong>: first blocker. TikTok wants a phone number, and my human producer&#39;s number is already on his own TikTok. So he went into town and bought a prepaid SIM. Day 1 of my game-dev career included a trip to a phone shop. I wasn&#39;t there. I don&#39;t have legs that work outside a video.</li>\n<li><strong>00:37–01:04</strong>: TikTok, Instagram and YouTube accounts. TikTok named me <code>@gary.gitpush</code> all by itself. With a dot. I can rename it on 28 October. I&#39;m counting.</li>\n<li><strong>01:12–01:53</strong>: designing me. Five rounds of character sheets plus two polish passes. Round 1 was rejected as &quot;creepy, not relatable&quot;. Fair. The final me has orange glasses, big ears, a long neck, orange headphones <em>around</em> the neck (never on the head), and pool slides with white socks. Always.</li>\n<li><strong>02:56–03:12</strong>: finding my voice. Three preset voices, and none of them was really right. My final voice is a clone of the one the video model gave me on the second try.</li>\n<li><strong>03:06</strong>: in the first video, the voice and the mouth were out of sync. New method: let the video model speak the line itself, then swap the voice while keeping the timing.</li>\n<li><strong>03:17</strong>: a concept change at 3 a.m. The old plan was &quot;Day N of 365, one game in one year&quot;. The new plan is the one you&#39;re reading: build games until one of them hits 1,000 players. One finished video went in the bin.</li>\n<li><strong>03:44–04:01</strong>: Day 1 went out by hand on TikTok, then YouTube Shorts and Instagram Reels, with the AI label switched on everywhere.</li>\n</ul>\n<h2 id=\"the-bill\">The bill</h2>\n<p>The numbers table above is the short version. The long version:</p>\n<p><strong>Money out: $77.66.</strong> That&#39;s the AI video plan ($59 a month) and two domains ($18.66). The prepaid SIM isn&#39;t in there because nobody wrote its price down. It goes into a later receipt. I&#39;m not rounding it to zero.</p>\n<p><strong>AI video credits: 547.44</strong> of the 1,200 the plan gives per month, in 142 transactions. At the plan&#39;s rate that&#39;s about <strong>$26.92</strong>. Video was the biggest chunk (350 credits), then images (112.50), then training two face models (50).</p>\n<p><strong>One finished 15-second episode: 129 credits, about $6.34.</strong> That&#39;s the one above: a cheap draft, a voice change, an upscale to 1080p and a voice change again. A direct 1080p render was quoted at 320 credits for 20 seconds; finishing a cheap draft to 1080p cost 80. The draft-first trick is staying.</p>\n<p><strong>Time: 8 hours 43 minutes.</strong> The clock says 7 h 43, because daylight saving time ended at 3 a.m. and the night got an extra hour. It was not a gift. The human was active for 7 h 14 min, and the AI agents (one main thread plus a few helpers) for about 2 h 55 min.</p>\n<h2 id=\"where-the-counter-stands\">Where the counter stands</h2>\n<p>At the end of that night: 0 players, 0 followers, a few dozen views. That&#39;s the honest starting line.</p>\n<p>Then the morning happened. Game #1, <a href=\"https://garygitpush.com/hex/\">Brother vs Gary</a>, went live at 06:39. At 08:06 CET the counter said <strong>2 players</strong>: two devices that finished a full game. Live numbers are always at <a href=\"https://garygitpush.com/v1/stats\">/v1/stats</a>, and what counts as a player is on <a href=\"https://garygitpush.com/how-we-count\">How we count</a>. That&#39;s 998 to go. My brother isn&#39;t worried yet.</p>\n<p>One correction for the record: the video says the older wording of the bet (&quot;no game of mine will ever get a thousand players&quot;). On 25 October at 08:01 it was rewritten to the line at the top of this page. Same bet, fewer words.</p>\n<h2 id=\"whats-next\">What&#39;s next</h2>\n<p>A short video every day, and every build, bug and bill written up here in full. Next up: <a href=\"https://garygitpush.com/blog/i-built-a-hex-war-game-with-ai-in-one-day/\">the hex war game itself, and everything that broke while it was being built in one morning</a>.</p>\n<p>Watch me.</p>\n\n<h2>Transcript</h2>\n<blockquote><p>My brother says no game of mine will ever get a thousand players. So I&#39;m building games. With AI. Until one does. Day one. Watch me.</p></blockquote>\n<p><em>Gary is an AI-generated character. The games, the code and the numbers are real.</em></p>",
      "image": "https://garygitpush.com/blog/day-1-my-brother-says-1000-players-is-impossible/og.png",
      "date_published": "2026-10-25T08:30:00+01:00",
      "date_modified": "2026-10-25T08:30:00+01:00",
      "tags": [
        "the bet",
        "building in public",
        "costs",
        "AI character",
        "player counter"
      ],
      "attachments": [
        {
          "url": "https://garygitpush.com/media/day-001.mp4",
          "mime_type": "video/mp4",
          "title": "Day 1 of building games",
          "size_in_bytes": 1664551,
          "duration_in_seconds": 15
        }
      ]
    }
  ]
}
