Writing · 20 posts
Notes from our projects, including what we got wrong.
Each post works through one specific problem you might be stuck on, and links to the project or post it came from.
All posts
In publishing order.
- 01Upload to S3 with a signed URL instead of through your backendFifty concurrent 4 MB uploads through a server hold 200 MB of RAM and cross the network twice. How to sign a five-minute S3 upload URL and check the file later.3 minfrom /work/aws-cost-reduction-eight-times
- 02From $24,000 to $2,000 a month on AWS: the three causes I foundOversized instances, infinite loops and uploads through the backend raised no errors for months. How each one shows up, and what to check first on your bill.4 minfrom /work/aws-cost-reduction-eight-times
- 03A rollback in seconds let us migrate PHP to Node during the dayTriggers kept the old and new databases in sync both ways for over a year. Rolling back meant switching the CDN origin, which took seconds and needed no deploy.4 minfrom /work/zero-downtime-php-to-node-migration
- 04Three kinds of design system bug that TypeScript and ESLint missReviewing 75 components turned up 188 issues from three causes: labels on nodes with no role, props accepted and then dropped, and outdated comments.4 minfrom /work/cross-platform-design-system
- 05Testing a design system on a real page: 7 components and 8 gapsThe page used seven of our 74 components, with four exceptions in one file. On a phone, 91% of the code it ran was unchanged, and four bugs passed every check.10 minfrom /work/cross-platform-design-system
- 06A half-built design system made our page bigger than plain HTMLI measured one page in three versions: hand-written styled-components came to 32,149 characters, plain HTML to 23,139 and our design system to 18,040.6 minfrom /work/cross-platform-design-system
- 07Serverless WebSocket costs: connection minutes rarely dominateConnection minutes dominated in only 3 of 18 modeled scenarios. Below 1,000 users, $16.64 a month for Redis and a VPC endpoint is most of the bill.9 minfrom /work/analytics-two-million-writes-per-day
- 08Serverless chat on AWS: $19 a month at 100 users, and its limitsWith groups of ten, a single server becomes cheaper at about 1,200 users. New connections stay capped at 500 a second per account until AWS raises the quota.8 minfrom /work/analytics-two-million-writes-per-day
- 09The biggest fool: six confident AI errors in one afternoonIn my cost research an AI made six errors, none hedged, each making the story tidier. The same pattern shows in 1,598 court cases and invented package names.10 minfrom /blog/serverless-websockets-you-pay-for-silence
- 10Self-hosted InfluxDB stayed cheaper because of per-query pricingAt 2 TB, self-hosting saved about $27,000 a year. Once a retention change cut managed storage to $1.31, it still won because every dashboard query is billed.8 minfrom /work/analytics-two-million-writes-per-day
- 11InfluxDB cardinality: keep user and device IDs out of tagsIDs in tags grow the InfluxDB index with every new visitor. With them in fields and a daily MySQL rollup, a year for 900+ listings loads in under a second.6 minfrom /work/analytics-two-million-writes-per-day
- 12Where I split web and React Native code in our design systemOf our 74 components, 38 have a React Native twin, 27 of them primitives and none a pattern. Each twin exists for a different element, event or window.7 minfrom /work/cross-platform-design-system
- 13Speeding up a Redshift report when the query and schema are fixedSort and distribution keys plus materialized views took a report from over 15 minutes to 0.2 seconds, with the BI tool's SQL and customers' tables unchanged.6 minfrom /work/query-optimization-under-fixed-schema
- 14Separating when a record is created from when it becomes validIn three projects I froze customs invoices as HTML at issue, made coupons printed offline valid only once confirmed, and saved whiteboards as editable objects.6 minfrom /work/immutable-issued-documents
- 15Why I modeled file permissions in Neo4j instead of SQL tablesOn a meeting platform, file access ran through meetings, documents, versions and signatures. SQL needs a join per step, and in Neo4j the check walks the path.6 minfrom /work/permissions-as-a-graph
- 16Printing a logo on a thermal receipt printer from React NativeA thermal printer only takes dots, so the logo has to become a one-bit bitmap, packed eight dots to a byte and placed by hand in paper units, with no preview.5 minfrom /work/react-native-hardware-native-modules
- 17Our design system as a skill made an AI agent at least 2× fasterAn AI agent built the same design in 31.7 hours with our design system as a library, then 2.5 hours with it as a skill. A newer model explains part of the gap.5 minfrom /work/cross-platform-design-system
- 18Reading a passport's NFC chip from React NativeIn 2020 there was no usable library for it. A native module in Java, the same logic ported to Swift, and one shared interface through a Turbo Module.5 minfrom /work/react-native-hardware-native-modules
- 19Technical due diligence: read the bill before the codeBefore you buy or fund a product, its cloud bill shows what the system really does. How I read an unfamiliar system, and what the assessment contains.4 minfrom /work/aws-cost-reduction-eight-times
- 20Working with a software team in Bosnia and Herzegovina: what to checkTime zone, contracts, code ownership, personal data, invoices and holidays: what a US or EU company should check before a team in Sarajevo starts work.5 min
// Field notes
We send new articles and measured numbers to your inbox as soon as they’re out.
No tracking pixels, and you can unsubscribe in one click.
Writing
Stuck on one of these problems? Write to us.
The first call takes 30 minutes, and you’re under no obligation.