Systems | Development | Analytics | API | Testing

Life after App Center: how we rebuilt CodePush from the ground up

In March 2024, Microsoft announced it would retire App Center in March 2025. For a lot of mobile teams, the first question was simple: what now? I was on the Release Management team at the time, and we thought CodePush was worth pursuing. We wrote up the case, got it onto the roadmap, and then waited. Nobody could say yet whether it would become a valuable product, and a team our size has to pick its bets carefully.

Your Manual Tests Are Already Automation

Here's the idea I want to leave you with. Your manual test library isn't documentation. It's automation that has been waiting for something that can read it. And you shouldn't have to move it, rewrite it or migrate it to set it free. The clearest version of this came up in a customer conversation a few weeks ago. The head of quality at a fast-growing fintech told me his company pays an outside firm to run its manual regression, and the firm bills per test executed.

Why Declarative Intent-Driven Testing is the Answer to Broken Automation Pipelines

Every software team knows the pain of the 4:00 PM build failure. The application itself is perfectly fine, but a tiny layout update threw off an automated script, triggering a false alarm across the deployment pipeline. The failure stems not from broken software, but from a brittle script losing its way. By tying validation to volatile implementation details, the QA industry has cornered itself.

Generating Random Numbers in Ruby: rand, Random & SecureRandom

To generate a random number in Ruby, call rand: rand(10) returns an integer from 0–9, rand(1..10) an integer from 1–10, and rand alone a float between 0.0 and 1.0. For security-sensitive values like tokens and passwords, use SecureRandom — rand is predictable. Computers cannot produce truly random numbers by computation alone. A deterministic machine can only produce pseudorandom numbers: a stream that looks random but comes from an algorithm fed with a starting value, the seed.

Best Graph Databases for AI Agents

AI agents that forget their context are just expensive chatbots. The difference between intelligent agents and simple assistants comes down to memory architecture, specifically how well your system tracks relationships, maintains temporal context, and reasons over evolving information. Graph databases have moved from niche infrastructure to essential AI components, with GraphRAG implementations showing 80% improvements in agent truthfulness and significant accuracy gains over vector-only approaches.

Expanding Into a New Real Estate Market? The Data and Integration Checklist You Need Before Launch

For a real estate platform, a new market can introduce different source systems, property attributes, identifiers, business rules, geographic structures, and reporting requirements, each of which enters the platform somewhere. The engineering question is where those differences land in the existing platform, and whether the current data model, integrations, search, workflows, and analytics can absorb them without a second architecture forming alongside the first.

How JavaScript Garbage Collection Works

If you’ve ever written JavaScript, you’ve never had to write code that says “delete this object, I’m done with it.” That’s because there’s a process called garbage collection running in the background to save you the hassle. Most of the time this process works smoothly and invisibly. But it can also cause an app to suddenly start stuttering for no obvious reason if you don’t manage it effectively. This post will give you the tools to do just that.