my-appengineer Learn

What does production-ready actually mean for non-coding founders?

Production-ready means an app handles real users, real money, and real data without breaking, and you can fix it when it does. It is not a vibe or a milestone, it is a set of properties the software has to keep after the person who wrote it walks away.

Last updated

Production-ready means an app handles real users, real money, and real data without breaking, and you can fix it when it does. It is not a vibe or a milestone, it is a set of properties the software has to keep after the person who wrote it walks away.

Does production-ready mean the app takes real money?

A demo that works in memory and shows a concept is not production-ready. Production means the app has a real database so data survives a restart, and payments are wired to a real account. On this platform that is the difference between the demo build type and the product build type. A product build lands with a real database and payments provisioned automatically. A demo is memory only and has no payments, and it is done when deployed. If a demo later needs to take money it is not upgraded in place. It is rebuilt as a product because payments and persistence reach into every part of the app.

How do you know the app works before you ship it?

A separate agent opens the deployed app in a real browser and checks it does what the blueprint said. The browser is Ghost Browser, a real Chromium the agents drive. A build that does not pass does not get called done. For a product build the QA agent runs up to five iterations. This is not a unit test that passes when a function returns the right number. It is a real browser session that verifies a user can actually do the thing the app is supposed to do. If you want to know more about how the app gets built and verified, read /learn/how-to-build-an-app-with-ai-agents.

What happens when you need to update a running app?

You push to the repository. The pipeline works out which services changed by comparing paths against the previous commit. Only those images are rebuilt, pushed, and rolled out with helm upgrade --atomic. That command is a zero-downtime rolling update on K3s. A release that fails its health checks rolls back rather than half-landing. This is what production-ready looks like when you need to change something. The app does not go down for maintenance, and a bad deploy fixes itself.

Who actually owns the running app?

Most AI app builders build the app and host it for you, so leaving means starting again. Here, the app runs on K3s in a namespace that belongs to the account, deployed as a Helm release. The source is a real repository. Nothing about the runtime is invented here. Kubernetes, Helm, Postgres, Docker. Somebody who knows those knows this. You can join your own hardware to it and pods schedule onto it like any other node. That is what makes the running cost of an app approach zero. Production-ready means you can take the app with you. If you are deciding where to host your SaaS, read /learn/which-hosting-do-you-choose-for-you-saas.

What keeps the data safe and the app secure?

Production-ready means you have backups and you know if something is attacking the app. The cluster tools catalogue has Velero for backups and Falco for runtime security monitoring. You can also add MinIO for object storage in the cluster. These install into the same cluster and are reachable from the account without a second login. A production app without backups is a demo that happens to have a database.

What happens when production breaks?

Production-ready does not mean nothing breaks. It means when it breaks you know why and you can fix it. These are real incidents that happened here.

Storage replicas starved etcd. Longhorn was configured with multiple replicas on what was a single node. The replication traffic and disk contention starved etcd until the control plane crash-looped and the cluster stopped responding. The fix is a rule rather than a setting: on a single node, one replica. Redundancy across replicas of the same disk is not redundancy, it is load.

A major Postgres bump crash-looped a database. An image tag moved from Postgres 15 to 16. Postgres does not upgrade its data directory across a major version on start, so the container came up, refused the existing data, and restarted for ever. The database is now pinned to its major version, and a major upgrade is a deliberate migration, never a tag change.

These are the kinds of failures that define production. If you want to read more about how the platform handles long-term maintenance, see /learn/how-are-you-managing-long-term-maintenance-in-ai-built-apps.

Here, production-ready is the product build type: a real database, payments provisioned automatically, up to five QA passes in a real browser, deployed as a Helm release on your own K3s cluster with atomic rollbacks. You add Velero and Falco from the cluster tools catalogue to handle backups and runtime security.

Build an app and own the cluster it runs on