Compatibility. What happened when we tried 20 real apps.
We took 20 real open-source web apps and had a coding agent set each one up for Karts with the onboarding prompt. It wrote only karts.yml: no changes to the app and nothing built on a laptop. The fourth run of this sweep was on 29–30 Sep 2026, through the public API to our own dev host.
| Result | Apps |
|---|---|
| Runs on Karts | 19 of 20 |
With only karts.yml | 18: Kutt, Umami, Healthchecks, Shiori, Miniflux, listmonk, Saleor, Directus, Documenso, Twenty, Outline, Hoppscotch, graphile-starter, full-stack-fastapi-template, Monica, Maybe, Plane, Chatwoot |
With one step outside karts.yml | 1: Ghost, whose git submodules must be checked out first (git submodule update --init --recursive) |
| Out of scope | 1: Dokploy, which drives Docker |
The earlier runs, on the same commits of the same 20 apps and on the same terms, got 0, then 4, then 7 with only karts.yml.
What "runs" means
Each of the 18 passed four checks on the live stack:
- its health path answered;
- one real user action worked, through the app's own form or API: sign up and follow the emailed link, sign in, or create a record;
- a branch that added one migration, in the app's own tool, got that migration in its own database on a plain
karts up; karts downremoved the environment.
Limits you will meet
- No internet at run time, unless you turn it on. In this sweep, Miniflux signed in and stored data but could not fetch a feed, and Shiori stored bookmarks without their page.
internet:inkarts.ymlnow lets a running app reach the hosts you allow; we have not run these two apps with it. - graphile-starter does not run its job worker. Its mail goes through AWS SES, which needs a real credential. Sign-up and login work without it.
- Big builds need a bigger VM. Twenty, Plane and Hoppscotch build only at 8 GB, set with
resources:inkarts.yml. Six others use 4 GB or a larger disk. - Some apps give the admin account to the first visitor. Directus, Outline, Ghost, Kutt, listmonk, Hoppscotch and Plane do this, and Umami and Shiori publish a default password. Every preview URL is public, so claim the admin account or change its password right after the first
karts up. - The first request to a new URL is slow. It waited 20 to 52 seconds for the HTTPS certificate, and once about 170. Later requests took 0.3 to 1.5 seconds.
The 18 that run
| App | Stack | First karts up | A branch adding a migration |
|---|---|---|---|
| Kutt | node22, Knex | 27.4 s | 14.4 s |
| Umami | node22 at 4 GB, Prisma | 454.3 s | 190.8 s |
| Healthchecks | python314, Django, mail | 98.4 s | 52.8 s |
| Shiori | go, its own migrations | 120.1 s | 46.4 s |
| Miniflux | go, its own migrations | 100.1 s | 35.9 s |
| listmonk | go with a Node frontend, 8 GB disk | 551.1 s | 285.1 s |
| Saleor | python312, Django | 522.2 s | 112.4 s |
| Directus | node22 at 4 GB, Knex | 581.2 s | 282.4 s |
| Documenso | node24 at 4 GB, Prisma, mail | 1,518.3 s | 561.3 s |
| Twenty | node24 at 8 GB, Redis, S3, a worker | 2,019.0 s | 907.3 s |
| Outline | node22 at 4 GB, Sequelize, mail | 345.5 s | 193.4 s |
| Hoppscotch | node24 at 8 GB, Prisma, two services, mail | 451.7 s | 259.1 s |
| Ghost | node22 at 4 GB, SQLite, mail | 826.3 s | 582.7 s |
| graphile-starter | node22, Postgres roles | 375.2 s | 217.9 s |
| full-stack-fastapi-template | python314, Alembic | 304.5 s | 158.4 s |
| Monica | php83, Laravel, mail | 200.4 s | 113.8 s |
| Maybe | ruby34, Rails, Redis, Sidekiq | 283.3 s | 109.2 s |
| Plane | python312 at 8 GB, Django, Redis, S3, 7 processes | 716.9 s | 293.4 s |
| Chatwoot | ruby34 at 8 GB, Rails, Redis, Sidekiq, pgvector | 615.7 s | 332.4 s |
- The first
karts upof each app also built its template database. The first upload of a large repository is slow too: Twenty's 33,602 files took 759.3 s. - Branches are faster because they start from that template. They are still much slower than the 2.2-second branch on our sample app, because each build installs the app's dependencies again. Only a plain
npm ciuses Karts' dependency cache, which is why Kutt's branch took 14.4 s.
What stops the last one
| App | Blocked by |
|---|---|
| Dokploy | It drives Docker, which a Karts VM does not run. |
When your app hits a limit, karts check-config often warns before the build, and karts logs --failed shows why the build stopped. The onboarding prompt maps the common messages to their cause.