{"id":8,"date":"2026-09-18T13:45:04","date_gmt":"2026-09-18T13:45:04","guid":{"rendered":"https:\/\/upkeep.ggates1020.com\/?page_id=8"},"modified":"2026-09-18T15:45:09","modified_gmt":"2026-09-18T15:45:09","slug":"home","status":"publish","type":"page","link":"https:\/\/upkeep.ggates1020.com\/","title":{"rendered":"Upkeep"},"content":{"rendered":"<main id='oxy-main'><main class=\"oxy-container-8-222 oxy-container page\"><header class=\"oxy-container-8-108 oxy-container wrap nav\"><a class=\"oxy-text-link-8-100 oxy-text-link brand\" href=\"#top\" target=\"_self\">\nUpkeep\n<\/a><ul class=\"oxy-container-8-107 oxy-container nav-links\"><li class=\"oxy-container-8-102 oxy-container\"><a class=\"oxy-text-link-8-101 oxy-text-link nav-link\" href=\"#how\" target=\"_self\">\nHow it works\n<\/a><\/li><li class=\"oxy-container-8-104 oxy-container\"><a class=\"oxy-text-link-8-103 oxy-text-link nav-link\" href=\"#features\" target=\"_self\">\nFeatures\n<\/a><\/li><li class=\"oxy-container-8-106 oxy-container\"><a class=\"oxy-text-link-8-105 oxy-text-link nav-link\" href=\"#protocol\" target=\"_self\">\nOpen protocol\n<\/a><\/li><\/ul><\/header><section class=\"oxy-container-8-154 oxy-container wrap hero\" id=\"top\"><div class=\"oxy-container-8-115 oxy-container\"><span class=\"oxy-text-8-109 oxy-text eyebrow\">\nLife counter for tabletop card games\n<\/span><h1 class=\"oxy-text-8-110 oxy-text hero-title\">\nOne table. Every device in sync.\n<\/h1><p class=\"oxy-text-8-111 oxy-text lead\">\nPut an iPad in the middle as the host. Everyone else joins from their phone over local Wi\u2011Fi. Any device can change any life total, and every change shows up everywhere in real time. No internet, no cloud, no account.\n<\/p><div class=\"oxy-container-8-114 oxy-container cta-row\"><a class=\"oxy-text-link-8-112 oxy-text-link btn\" href=\"#how\" target=\"_self\">\nSee how it works\n<\/a><a class=\"oxy-text-link-8-113 oxy-text-link btn btn-ghost\" href=\"#features\" target=\"_self\">\nBrowse features\n<\/a><\/div><\/div><div class=\"oxy-container-8-153 oxy-container stage\"><div class=\"oxy-container-8-132 oxy-container ipad\"><img decoding=\"async\" class=\"oxy-image-8-223 oxy-image\" src=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-1536x1152.png\" alt=\"Upkeep hosting on an iPad: four seats with life totals, commander damage, a monarch crown and an eliminated player\" loading=\"lazy\" srcset=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-scaled.png 2560w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-300x225.png 300w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-1024x768.png 1024w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-768x576.png 768w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-1536x1152.png 1536w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/ipad-host-landscape-2048x1536.png 2048w\" sizes=\"(max-width: 2560px) 100vw, 2560px\"><\/div><div class=\"oxy-container-8-146 oxy-container phone phone-a\"><img decoding=\"async\" class=\"oxy-image-8-224 oxy-image\" src=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-1024x471.png\" alt=\"An iPhone joined to the table, showing all four seats and their synced life totals\" loading=\"lazy\" srcset=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-scaled.png 2560w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-300x138.png 300w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-1024x471.png 1024w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-768x353.png 768w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-1536x706.png 1536w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-board-landscape-2048x942.png 2048w\" sizes=\"(max-width: 2560px) 100vw, 2560px\"><\/div><div class=\"oxy-container-8-152 oxy-container phone phone-b\"><img decoding=\"async\" class=\"oxy-image-8-225 oxy-image\" src=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-1024x471.png\" alt=\"A second iPhone showing one seat expanded, with counters and commander damage\" loading=\"lazy\" srcset=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-scaled.png 2560w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-300x138.png 300w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-1024x471.png 1024w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-768x353.png 768w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-1536x707.png 1536w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-2048x943.png 2048w\" sizes=\"(max-width: 2560px) 100vw, 2560px\"><\/div><\/div><\/section><section class=\"oxy-container-8-170 oxy-container wrap section\" id=\"how\"><h2 class=\"oxy-text-8-155 oxy-text section-title\">\nSet up in under a minute\n<\/h2><p class=\"oxy-text-8-156 oxy-text section-lead\">\nOne device owns the game. Everyone else is a window onto it.\n<\/p><ol class=\"oxy-container-8-169 oxy-container steps\"><li class=\"oxy-container-8-160 oxy-container step\"><span class=\"oxy-text-8-157 oxy-text step-num\">\n01\n<\/span><h3 class=\"oxy-text-8-158 oxy-text card-title\">\nHost on the iPad\n<\/h3><p class=\"oxy-text-8-159 oxy-text card-text\">\nStart a table and the host shows a join QR code, plus its address as text if you need a fallback.\n<\/p><\/li><li class=\"oxy-container-8-164 oxy-container step\"><span class=\"oxy-text-8-161 oxy-text step-num\">\n02\n<\/span><h3 class=\"oxy-text-8-162 oxy-text card-title\">\nScan to join\n<\/h3><p class=\"oxy-text-8-163 oxy-text card-text\">\nPhones scan the code and land on the live table. Nobody types an IP address.\n<\/p><\/li><li class=\"oxy-container-8-168 oxy-container step\"><span class=\"oxy-text-8-165 oxy-text step-num\">\n03\n<\/span><h3 class=\"oxy-text-8-166 oxy-text card-title\">\nPlay\n<\/h3><p class=\"oxy-text-8-167 oxy-text card-text\">\nTap to change life. Every device updates at once, and a sleeping phone never loses its seat.\n<\/p><\/li><\/ol><\/section><section class=\"oxy-container-8-198 oxy-container wrap section\" id=\"features\"><h2 class=\"oxy-text-8-171 oxy-text section-title\">\nBuilt for the way a real game runs\n<\/h2><p class=\"oxy-text-8-172 oxy-text section-lead\">\nFast enough for combat, clear enough to read from across the table.\n<\/p><div class=\"oxy-container-8-197 oxy-container grid\"><article class=\"oxy-container-8-176 oxy-container card\"><span class=\"oxy-text-8-173 oxy-text card-icon\">\n\ud83d\udc46\n<\/span><h3 class=\"oxy-text-8-174 oxy-text card-title\">\nTap left, tap right\n<\/h3><p class=\"oxy-text-8-175 oxy-text card-text\">\nThe left half of a tile subtracts one and the right half adds one. Hold either side to move by ten. Tap the number for exact entry.\n<\/p><\/article><article class=\"oxy-container-8-180 oxy-container card\"><span class=\"oxy-text-8-177 oxy-text card-icon\">\n\ud83d\udee1\n<\/span><h3 class=\"oxy-text-8-178 oxy-text card-title\">\nCommander damage\n<\/h3><p class=\"oxy-text-8-179 oxy-text card-text\">\nOne badge per opponent's commander, never a lump sum. Damage also reduces life, and 21 from a single commander is lethal.\n<\/p><\/article><article class=\"oxy-container-8-184 oxy-container card\"><span class=\"oxy-text-8-181 oxy-text card-icon\">\n\ud83e\ude99\n<\/span><h3 class=\"oxy-text-8-182 oxy-text card-title\">\nCommander tax and partners\n<\/h3><p class=\"oxy-text-8-183 oxy-text card-text\">\nCount casts from the command zone and see the extra mana it costs, like \"3\u00d7 (+6)\". Partner pairs get two separate trackers.\n<\/p><\/article><article class=\"oxy-container-8-188 oxy-container card\"><span class=\"oxy-text-8-185 oxy-text card-icon\">\n\ud83d\udc51\n<\/span><h3 class=\"oxy-text-8-186 oxy-text card-title\">\nThe monarch\n<\/h3><p class=\"oxy-text-8-187 oxy-text card-text\">\nOne crown at a time, shown above the holder's life total on every device.\n<\/p><\/article><article class=\"oxy-container-8-192 oxy-container card\"><span class=\"oxy-text-8-189 oxy-text card-icon\">\n\u2620\ufe0f\n<\/span><h3 class=\"oxy-text-8-190 oxy-text card-title\">\nAutomatic elimination\n<\/h3><p class=\"oxy-text-8-191 oxy-text card-text\">\nA seat is out at 0 life, 10 poison, or 21 commander damage. Undoing it is a deliberate toggle, never an accident.\n<\/p><\/article><article class=\"oxy-container-8-196 oxy-container card\"><span class=\"oxy-text-8-193 oxy-text card-icon\">\n\ud83d\udd52\n<\/span><h3 class=\"oxy-text-8-194 oxy-text card-title\">\nMis-tap safety net\n<\/h3><p class=\"oxy-text-8-195 oxy-text card-text\">\nA green or red badge shows the net change over the last ten seconds, so a slip stands out while you can still fix it.\n<\/p><\/article><\/div><\/section><section class=\"oxy-container-8-207 oxy-container wrap section\"><div class=\"oxy-container-8-206 oxy-container split\"><div class=\"oxy-container-8-201 oxy-container split-copy\"><h2 class=\"oxy-text-8-199 oxy-text section-title\">\nAround the table, or upright\n<\/h2><p class=\"oxy-text-8-200 oxy-text section-lead\">\nLay the iPad flat and each seat turns to face its player, with side seats and end seats arranged to match the head count. Or hold a phone upright and read it your own way. Arrangement is per device, so nobody else has to agree with your choice.\n<\/p><\/div><div class=\"oxy-container-8-205 oxy-container grid\"><img decoding=\"async\" class=\"oxy-image-8-226 oxy-image\" src=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-1536x707.png\" alt=\"One seat expanded full screen on a phone, with counters, commander damage and a large life total\" loading=\"lazy\" srcset=\"https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-scaled.png 2560w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-300x138.png 300w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-1024x471.png 1024w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-768x353.png 768w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-1536x707.png 1536w, https:\/\/upkeep.ggates1020.com\/wp-content\/uploads\/2026\/09\/iphone-client-seat-landscape-2048x943.png 2048w\" sizes=\"(max-width: 2560px) 100vw, 2560px\"><\/div><\/div><\/section><section class=\"oxy-container-8-213 oxy-container wrap section\" id=\"protocol\"><div class=\"oxy-container-8-212 oxy-container split\"><div class=\"oxy-container-8-210 oxy-container split-copy\"><h2 class=\"oxy-text-8-208 oxy-text section-title\">\nPlain WebSocket, plain JSON\n<\/h2><p class=\"oxy-text-8-209 oxy-text section-lead\">\nPeers send intents like \"subtract 1 from this player\". The host applies them one at a time and broadcasts the full state, so replicas can't drift and two simultaneous taps both count. The wire format is platform neutral, so an Android client can join an unmodified host.\n<\/p><\/div><pre class=\"oxy-text-8-211 oxy-text code\">\n{\"v\":1,\"type\":\"intent\",\n \"action\":\"update_life\",\n \"playerId\":\"\u2026\",\"delta\":-1}\n\n{\"v\":1,\"type\":\"state\",\"revision\":7,\n \"state\":{\"players\":[\u2026],\n  \"settings\":{\"startingLife\":40}}}\n<\/pre><\/div><\/section><section class=\"oxy-container-8-218 oxy-container wrap closing\"><h2 class=\"oxy-text-8-214 oxy-text section-title\">\nLocal network only. That's the whole idea.\n<\/h2><p class=\"oxy-text-8-215 oxy-text section-lead\">\nNo accounts, no servers, nothing leaves the room.\n<\/p><div class=\"oxy-container-8-217 oxy-container cta-row\"><a class=\"oxy-text-link-8-216 oxy-text-link btn\" href=\"#how\" target=\"_self\">\nSee how it works\n<\/a><\/div><\/section><footer class=\"oxy-container-8-221 oxy-container wrap footer\"><span class=\"oxy-text-8-219 oxy-text\">\nUpkeep\n<\/span><span class=\"oxy-text-8-220 oxy-text\">\nA local-network life counter and game companion.\n<\/span><ul class=\"oxy-container-8-233 oxy-container footer-links\"><li class=\"oxy-container-8-228 oxy-container\"><a class=\"oxy-text-link-8-227 oxy-text-link footer-link\" href=\"\/support\/\" target=\"_self\">\nSupport\n<\/a><\/li><li class=\"oxy-container-8-230 oxy-container\"><a class=\"oxy-text-link-8-229 oxy-text-link footer-link\" href=\"\/privacy\/\" target=\"_self\">\nPrivacy\n<\/a><\/li><li class=\"oxy-container-8-232 oxy-container\"><a class=\"oxy-text-link-8-231 oxy-text-link footer-link\" href=\"\/terms-of-service\/\" target=\"_self\">\nTerms\n<\/a><\/li><\/ul><\/footer><\/main><\/main>","protected":false},"excerpt":{"rendered":"<p>Upkeep How it works Features Open protocol Life counter for tabletop card games One table. Every device in sync. Put an iPad in the middle as the host. Everyone else joins from their phone over local Wi\u2011Fi. Any device can change any life total, and every change shows up everywhere in real time. No internet, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_oxygen_hide_in_design_set":false,"_oxygen_tags":"","footnotes":""},"class_list":["post-8","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=\/wp\/v2\/pages\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8"}],"version-history":[{"count":6,"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions"}],"predecessor-version":[{"id":30,"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions\/30"}],"wp:attachment":[{"href":"https:\/\/upkeep.ggates1020.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}