Real decisions, told by whoever made them.
No best-practice listicles. We write about problems we've run into building software that's in production, with the code in front of us.
Subscribe by RSS99.2% of our consumption wasn't user demand
One day Isobaria burned through its data providers' quota. Splitting the spend by who caused it showed that people were 0.8% of it. What we changed, what we ruled out, and why paying for a plan was the wrong answer.
- Arquitectura
- Datos
- Decisiones de producto
Trip days don't exist in the database
In Jornia a trip has stops but no days: they're computed on read from the date range. Which impossible states that rules out, and the bill it hands you in return.
- Arquitectura
- Android
- Bases de datos
Fail-safe is chosen before it fails
On the Plazoleta website there are three systems that decide which side to fall on when something fails: the blog doesn't publish, analytics doesn't measure, and the form doesn't say 'thank you.' It's not pessimism: it's choosing the side before it's needed.
- Arquitectura
- Decisiones de producto
- Método
The default that turned 55 GB into 11,300 files
Media3 ships cache fragments at 5 MiB, a number meant for streaming. In a download library it becomes 11,300 files and micro-stutters during playback. Why we raised it to 512 MiB—and why only in one of the two caches.
- Android
- Arquitectura
- Rendimiento
The cheapest AI model won the benchmark
We set up a benchmark with 20 opencode-go models solving the same task on autopilot. The top scorer cost three cents. What we measured, what surprised us, and why price doesn't predict quality.
- IA
- Herramientas internas
- Decisiones de producto
An idea that sounds right can measure worse: why the median lost to the mean
At Isobaria, swapping the weighted mean for the median seemed like the obvious improvement for the confidence index. Measured against 151,000 hours of ERA5, it was worse. The story of why, and what we did instead.
- Arquitectura
- Datos
- Decisiones de producto
From `main` to Google Play Without Touching Anything by Hand
At Jornia, every push to main that touches the app ends up on a tester's phone without anyone opening the Play console. What got automated, what was left manual on purpose, and why that second list matters just as much as the first.
- Android
- CI/CD
- Decisiones de producto
No-code or custom software? Where the real line is
The honest answer is almost never "custom-built." Where a no-code tool holds up fine, what breaks it, and how to tell you've crossed the line before you spend the money.
- Decisiones de producto
- Herramientas internas
"I don't know" and "it's empty" are not the same piece of data
In LoverCast, hiding categories syncs across devices. Un-hiding all of them at once doesn't. On why collapsing absence and emptiness into a single value is a one-way door.
- Bases de datos
- Arquitectura
- Sincronización
Reduce motion isn't an accessibility checkbox: it's design
At Jornia, the brand animation is the only custom animation allowed in the whole app. Why that makes respecting reduce motion easy, and what got built first to make it that way.
- Diseño
- Producto
- Accesibilidad
The capitalization bug that made "Continue watching" disappear
Mobile and TV wrote "MOVIE", the web wrote "movie", and it was the same column. On why a bug that fails halfway is worse than one that blows up completely.
- Sincronización
- Arquitectura
- Android
Offline-first isn't a checkbox: it's the entire data model
At Jornia we cleared the entire offline backlog before touching sync. What made that possible wasn't a feature list — it was a filter we applied to every single one.
- Arquitectura
- Producto
- Offline
What to Ask the People Who Are Going to Build Your Software
Eight questions you can ask on the first call, along with the answer that should worry you in each case. They work with us, and they work with anyone else.
- Decisiones de producto
- Método
"Zero breakage" is almost never zero
LoverCast's profile migration didn't break anything visible, and it still wasn't free. On the difference between not breaking and not measuring what you break.
- Arquitectura
- Decisiones de producto
Migrating the schema without breaking the apps already out there
Going from one row per user to one per profile when there are APKs out in the wild you can't update, and why the compatibility view buys you less than you think.
- Android
- Arquitectura
- Bases de datos
- Postgres