Notes from building things.
New Horizons Developments the builder, and software for small food businesses running on Wix. Mostly this is the things that were expensive to find out — the failures that reported success, the APIs that lied, and the occasional decision worth explaining. Subscribe by RSS.
-
Let the customer fill the box
Every bundle app on the market decides what goes in the bundle. Inverting that is the whole product.
-
What a year of this has taught me about failure
Almost every expensive bug in either project reported success. That is the pattern, and it is worth writing down on its own.
-
The app that cannot be uninstalled
Once its plugins are placed, Wix refuses the uninstall, and there is no route exposed to apps that can undo it.
-
A reminder that goes once, with no scheduler
Nothing in a Wix app runs on a timer. So the check happens whenever the app is already awake, and the booking records that it went.
-
Reading a Word document without a library
A .docx is a zip holding XML, and the only part worth reading is one entry. Browsers can inflate a raw deflate stream themselves now.
-
The nudge counts the cart, not the page
A break scoped to a range is satisfied by any mix of it. Counting only the product on screen misstates a price the checkout has already given.
-
Nothing cart-derived is ever cached
Their answers depend on a cart that changes constantly, so a cached one names a quantity the shopper no longer holds.
-
Sixteen pixels, or the checkout jumps
iOS Safari zooms the whole page when a smaller font takes focus, and a checkout that lurches when tapped reads as broken.
-
Elevate the module function, not a lambda around the chain
SDK modules are host modules. Until the SDK binds one to a context it returns an unbound function, so wrapping the whole chain fails at the first link.
-
A bare 403 means 'not elevated'
Wix returns 403 with an empty message when a caller lacks permission. It arrives as a wall of empty strings around a status code.
-
The embedded script that could never have worked
Every path on the app host returns 500 to a caller with no Wix context. A script on the shop's page has no context, so it could never read anything.
-
autoAdd has never placed anything
Three fresh sites, two install routes, every slot present and every slot empty. Placement is a setup step, not something that happens.
-
The tags no app can read
Wix Stores creates every product tag as private. A tag-scoped rule matches nothing, and every layer reports success.
-
Wix Stores is two apps, not two versions
A widget id paired with the wrong app id names a placement that exists nowhere, and absolutely nothing reports it.
-
The posted slot is never trusted
The window is enforced on save, not only drawn. A limit applied when drawing a calendar is a suggestion.
-
A short final slot is the honest one
Opening hours rarely divide evenly by the slot length, and a blocked time almost never lands on the hour.
-
The slot is stored twice, deliberately
Once on the order so it appears where a shop looks, and once in a collection, because custom fields are not queryable.
-
Everything is civil time
Dates are text and times are text, read as the shop's wall clock. No Date arithmetic touches the calendar at all.
-
A worse defect should be worth more to fix
The house's value was restored severity-scaled while a waiting buyer got a flat figure back, so the two disagreed in both directions.
-
Billed three times, to the same second
One night's overheads charged three times over, all reporting the same balance afterwards. Opening a screen fires several requests at once.
-
One query per house
The Builds screen fetched a row at a time and a company's houses were listed with a query each. Neither was slow enough to notice until it was.
-
A ceiling that moves, and a market you softened yourself
A house listed at the highest price possible one day was above the maximum the next, with nothing on screen to explain it.
-
The ceiling nobody had reached
Accepting an offer returned Internal Server Error. The player had £21,002,907 and there was a hard limit on the game at £21,474,836.47.
-
The profit nobody was ever going to pay
Profit at this price was ask minus invested. It never sells for the ask. The label and the sum agreed with each other and both were wrong.
-
One retry policy for two very different failures
No connection on one tab while the status bar kept updating, from a server answering every request in that window with a 200.
-
Two constants, not flags
The simulation was configured with a spread of switches. Every combination was a different game, and most of them were not the one shipping.
-
A site that arrives in a hundred and fifty years
Production was telling players a site came to market in 5,720 days. Forty game days, converted against one baseline and read back against another.
-
Why the cheap builder costs more
Every firm has a price and a defect rate, and the cheap one is only cheap until somebody is standing in the hall looking at the render.
-
What this is
A place to write down how New Horizons Developments works underneath, and why some of it is the way it is.