Restore early scoring window; strokes, alt text, brand reconciliation

This commit is contained in:
gator 2026-08-28 18:14:57 +00:00
parent 2177c9f93f
commit 27ba944946
3 changed files with 1057 additions and 8 deletions

File diff suppressed because one or more lines are too long

View file

@ -48,9 +48,15 @@
the message and one that pops in a second later. --> the message and one that pops in a second later. -->
<meta property="og:image:width" content="1200" /> <meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" /> <meta property="og:image:height" content="630" />
<!-- Alt text describes ONE SPECIFIC PNG and nothing renders it beside that
PNG, so it is the tag here that rots without anyone noticing. It had
been promising the line "There is a game on tonight." — which is real
copy, but it belongs to the 1080x1920 story and the brand deck, and has
never appeared on this card. The card is drawn by og() in
design/brand/lib/social.mjs; open app/public/og.png before editing. -->
<meta <meta
property="og:image:alt" property="og:image:alt"
content="The Pull Up mark on a near-black field, above the line: There is a game on tonight." content="The Pull Up link card: the words PULL UP. set huge in white on near-black, over the line Post a game. Or ask to join one. and the address pullup.onetouch.studio, beside a sample of the feed listing a pickleball, a basketball and a climbing game with the court and the time each one starts."
/> />
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
@ -62,7 +68,7 @@
<meta name="twitter:image" content="https://pullup.onetouch.studio/og.png" /> <meta name="twitter:image" content="https://pullup.onetouch.studio/og.png" />
<meta <meta
name="twitter:image:alt" name="twitter:image:alt"
content="The Pull Up mark on a near-black field, above the line: There is a game on tonight." content="The Pull Up link card: the words PULL UP. set huge in white on near-black, over the line Post a game. Or ask to join one. and the address pullup.onetouch.studio, beside a sample of the feed listing a pickleball, a basketball and a climbing game with the court and the time each one starts."
/> />
<!-- Icons. Every one of these is a fixed path in `public/`, because Metro <!-- Icons. Every one of these is a fixed path in `public/`, because Metro
@ -178,6 +184,6 @@
</noscript> </noscript>
<!-- The root element for your Expo app. --> <!-- The root element for your Expo app. -->
<div id="root"></div> <div id="root"></div>
<script src="/_expo/static/js/web/entry-f7f27d2f0c33624530abcc415e023a58.js" defer></script> <script src="/_expo/static/js/web/entry-a177f51bd3d3849619d68ff43a12a755.js" defer></script>
</body> </body>
</html> </html>

15
sw.js
View file

@ -40,11 +40,16 @@ self.addEventListener('activate', (e) => e.waitUntil(self.clients.claim()));
* handler below prefers to hand the notification back to an open tab and let * handler below prefers to hand the notification back to an open tab and let
* the real `linkFor` decide. * the real `linkFor` decide.
* *
* `data.url` is the cold-start fallback, computed server-side by * `data.url` is the cold-start fallback, computed server-side by `pushUrlFor`
* ops/reminder-mailer.js. Two copies of one rule is a real cost, and the * in ops/reminder-mailer.js. Note that the second copy of the rule lives THERE
* alternative -- opening `/` and making somebody find the thing themselves -- * and not here: this file contains no routing logic at all, only a preference
* is a worse one. ops/reminder-mailer.js has a self-check that asserts its copy * for the tab over the payload. Two copies is a real cost, and the alternative
* still agrees with linkFor's cases; run `node ops/reminder-mailer.js --selftest`. * -- opening `/` and making somebody find the thing themselves -- is a worse
* one.
*
* `node ops/reminder-mailer.js --selftest` keeps the two honest. It reads
* linkFor out of app/lib/notifications.ts and runs both implementations over
* the same cases, so editing either side alone fails the check.
*/ */
self.addEventListener('push', (event) => { self.addEventListener('push', (event) => {