A deploy failed with an error that had been fixed five days earlier. The fix was in the repository the whole time — it had just never been executed, because the host runs a copy of the script pasted into a web form, and nobody diffs a web form.
Parlour finished with twenty-eight games and a green test suite, and then four bugs turned up in the first few minutes of opening it in a real browser. None of them threw an error. Each was a kind of thing a test suite is structurally blind to.
Paddle is a merchant of record and settles from anywhere, which is why it was chosen — but it is card-first, and a meaningful share of South African organisers do not hold a card it will accept. So Payfast is built beside it, for Instant EFT and SnapScan in rand. Nothing is charged on VoicesZA yet: everything is free until March 2027, and the second rail goes live when charging starts. The interesting part was not adding a second gateway; it was that the thing which actually varies between two payment providers is the browser, not the server. One opens an overlay in the page, the other posts a signed form and navigates away.
A browser idle game with offline earnings and a prestige loop. The engine is zero-build vanilla JavaScript — no bundler, no framework, no install step — so it loads as fast as a static page and keeps working with the network off. You can play it on its project page without leaving this site.
A suite of quiet card and tile games for people the casual-games market treats badly. The constraint that shapes every decision is that large is the DEFAULT, not a setting: the trap is adding a large-text option and then designing the default for yourself. So body text starts at 20px, touch targets are 64px rather than the 44px mobile guidance calls a minimum — that guidance assumes steady hands — and the size setting only scales up.
Anybody can tick a box saying they want pricing on the page. Dragging pricing above the fold says something a contact form never gets out of people, and the order of the blocks turns out to be the most useful thing the builder collects. Every list in it is deliberately closed — the moment it can express an arbitrary layout it stops being a way to start a conversation and becomes a page builder nobody asked me to maintain.