James To (@jamesto) profile picture
22.239438,114.15189
Joined May 2009
Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)Photo by James To (@jamesto)
Every fresh load of our admin console logged a 404 for /favicon.ico. The obvious fix, an inline data: icon, was blocked by our own CSP (default-src 'self'). So the server now answers /favicon.ico with an empty 204, cached for a day. No icon, no error, CSP untouched.
3
App Review rejected your bug-fix update? Read the top of the message before touching any code. If it says the issues are "eligible to be resolved on your next update", reply and ask them to approve this build. Don't resubmit: that starts a new review. This only works for updates to already-approved apps, and each issue can be deferred once.
1
7
If the fix can't wait, you can request an expedited review, but only after the build is submitted. Put the critical bug details in the Notes field. Apple aims to review at least 50% of submissions in under 24 hours and 90% in under 48.
6
My test build and my store build should differ in exactly one way. The testers' build has developer tools on. Everything else matches the store build: release-optimised, same signing route, same shader bake, so frame timings compare. The tooling won't send it to App Review, production, or any group except our internal testers. A separate check keeps developer tools out of store builds. One switch, guarded at both ends.
1
12
James To retweeted
Is 3am really the cheapest time? We checked a year of half-hourly prices (London region, Nov 2025 to Oct 2026). Nov–Feb: cheapest 4 hours started overnight on 106 of 120 days. Apr–Aug: late morning to midday, 134 of 153. 4pm–7pm: never, in 365 days. is-3am-really-the-cheapest-t…
1
1
22
Glassvow Devlog #7 I moved iOS builds to a clean release machine. The first runs all stopped before uploading anything, and every stop was the right call. What the fresh clone was missing: - art still as Git LFS pointers - no Godot import yet, so no imported assets - one .uid file I'd never committed, which left the tree dirty My own machine had all three by accident. Now the script pulls, imports and checks before it builds.
2
2
58
Spelling Camp v1.1 is here! 🔥 Meet our new friend, Jot! 🤩✨
26
James To retweeted
Last Sunday, electricity averaged 40.25p/kWh. The Sunday before: 3.01p. Same tariff, London region, half-hourly prices. Tue 27 Oct dipped to 1.36p. Then from Wed to Sun, not one half-hour went under 25p. New recap every Monday.
1
7
One mythic card in Glassvow has 14 layers of art. The shader reads 2 textures. Every layer sits in one cropped atlas, 1024x832. The card's existing surface shader samples the face and the atlas, and shifts each layer by its depth as the card tilts. What I avoided: - 15 separate textures - up to 13 extra draws from stacked nodes - extra passes or backbuffer copies - any motion while the card is still What I haven't tested yet is the cost on an iPad 8. That's next.
34
Our freshness check recorded the files a script read, not the files that decided what it read. A new test walked the repo: 48 of 115 files were unrecorded. Now adding one file under ops/ marks all seven golden files stale. The check is only as good as its list of inputs.
12
Our CI now does less, on purpose. Draft PR: lint only. A PR that only changes docs: no tests. Everything else: the full suite. Newsroom now calls one shared workflow instead of keeping its own copy, so those rules live in one place.
14
Spelling Camp asks children to spell tricky KS2 words from memory, and brings them back for another try. No tapping the answer, no autocomplete. Parents of Years 3–6: over the next few weeks I'll explain why it works this way, and which parts are simply our choice.
16
Google Play's target API extension runs until today, 1 Nov 2026. New apps and updates must target API 36 (Android 16). Existing phone apps need API 35 (Android 15) to stay available to new users on newer devices. An app can be listed yet blocked from a hotfix. Check targetSdk now.
1
41
Other form factors have their own numbers. New Wear OS and Android Automotive submissions need API 35. Android TV and XR need API 34. Source: support.google.com/googlepla…
15
We planted 24 single bugs in the provider adapters of Newsroom's Go port, to test the tests. One let an API key through the CLI's environment allow-list. 22 broke a test straight away. The other two survived, so each got a new test that fails on it.
19
Editing go.mod re-ran 17 of our cached Go test packages at once. Go's test cache hashes the size and modified time of every file a test opens inside the module. Our port found the repo root by reading go.mod. Now it looks for a directory instead, and those tests stay cached.
14
Our Go test lane has to finish in under a minute. One Newsroom port PR took 83 seconds, so we split it into three. The second part ran in 49.8 seconds at its slowest. A time limit you actually enforce decides how big a change can be.
1
1
53
We merged a change while one check was red. The cause looked harmless: the gate didn't recognise the name of the coding tool that wrote the change. Still the wrong call. New rule: merge only when every check is green. If a gate is wrong, fix the gate. Never merge past it.
21
"actions/checkout@v4" in your GitHub workflow is a promise someone else can change. A tag can be moved to new code. A commit hash can't. So Glassvow's CI now pins each action to its full commit, with the version kept as a comment. The same change fixed a second problem: workflow scripts no longer paste inputs straight into shell commands. They read them from environment variables. The security scanner went from 13 findings to 0. The game didn't change at all. Worth doing on any small repo.
42