DEV Community

Cover image for From GitHub Repo to Live App: What Can Go Wrong
Nikita
Nikita

Posted on

From GitHub Repo to Live App: What Can Go Wrong

Deploying from GitHub sounds like a solved problem.

Clone the repo. Detect the stack. Build an image. Run a container. Add SSL. Route traffic.

That lower layer matters. In VibeNest we do not try to replace all of it from day one. The first deploy path sits on top of Coolify, which already handles a lot of the boring infrastructure: app resources, builds, containers, routing, SSL, logs, and restarts.

From the projects we see on the platform, that gets a meaningful chunk of repos over the line. Roughly 20-30% can be carried by the out-of-the-box path.

The rest usually fail for smaller reasons.

Not "Kubernetes is hard" reasons. More like:

  • the repo is a monorepo and the wrong folder was deployed
  • Nixpacks picked a plausible build, but not the right one
  • the app listens on 5000, while the proxy routes to 3000
  • .env.example says DATABASE_URL, but production has no database yet
  • a DB URL alias is used instead of the canonical env var
  • the branch is master, but the deploy was queued from main
  • the repo needs Git LFS, but the build only cloned pointer files
  • the app boots, passes once, then crash-loops or runs out of memory

That is the layer VibeNest is trying to automate: the gap between "a container was created" and "this app is actually usable by the first users".

1. Start with the boring deploy

The first pass is intentionally normal.

If the repository is straightforward, Coolify gets it deployed. VibeNest does not need to be clever when the build pack, port, environment, and runtime are already obvious.

The useful work starts when the repo is almost deployable, but production assumptions do not match local assumptions.

2. Decide what should be deployed

A GitHub repo is not always one app.

It can contain a frontend, API, worker, docs site, bot, test project, or several nested apps. So before deployment, VibeNest looks for service boundaries and build evidence:

  • Dockerfile / docker-compose
  • package.json, workspaces, pnpm/yarn/npm signals
  • requirements.txt, pyproject.toml
  • go.mod, Cargo.toml, composer.json
  • .sln / .csproj for .NET projects
  • framework and runtime hints in the repo tree

The goal is not to guess harder. The goal is to reduce the number of bad guesses: wrong base directory, wrong service, wrong build pack, wrong start command.

3. Ports are their own failure class

One of the most annoying deploy failures is when the app is running but unreachable.

In code, this often looks harmless:

const port = process.env.PORT || 5000

But in production there are several ports in play:

  • the port the app actually binds to
  • the port exposed by Docker or Nixpacks
  • the port stored in the deploy config
  • the port the proxy is routing to

If those disagree, you can get a container that looks alive and a public URL that returns 502.

So VibeNest compares source hints, Docker metadata, runtime logs, PORT usage, and the current Coolify routing config. In one real class of issues, changing ports_exposes is not enough because the proxy labels stay stale, so the app has to be recreated rather than just redeployed.

That is not glamorous. It is exactly the kind of detail that decides whether "Deploy" feels magical or broken.

4. Environment and database checks are connected

Many deploys fail because the production environment is incomplete.

The platform can detect some of that before runtime:

  • .env.example / .env.sample
  • Prisma datasource providers
  • database drivers and ORM config
  • SQLite file usage
  • Postgres/MySQL connection strings
  • appsettings and framework conventions

If the app clearly needs Postgres or MySQL, VibeNest can attach a managed database and inject DATABASE_URL. If the app uses a safe alias, it can mirror the managed URL under that alias too.

But there is a hard boundary: secrets.

The system can say "this app needs BOT_TOKEN" or "this app needs OPENAI_API_KEY". It should not invent one. It should stop and ask the owner.

That boundary is important. A deployment assistant that makes up secrets is worse than one that fails clearly.

5. Recovery is bounded, not magical

When a deploy fails, VibeNest does not just retry forever.

The recovery path is intentionally limited:

  • deterministic fixes run first when evidence is strong
  • an LLM can diagnose unknown failures from repo evidence, build logs, runtime logs, and container state
  • every proposed fix must be one of the supported actions
  • the system has a small per-commit attempt budget
  • user-triggered deploys reset the budget, monitor recovery does not loop forever

Examples of supported fixes are things like:

  • change base directory
  • change build pack
  • set Node/Python/.NET version
  • set the internal port
  • set a platform env var
  • attach Postgres
  • change branch
  • set a static output directory

And examples of things it should not silently do:

  • invent private secrets
  • keep trying random ports
  • make destructive changes without the owner
  • hide that a repo is private or Git LFS quota failed
  • pretend an out-of-memory app is an env-var problem

That distinction is the product.

6. Runtime signals matter after the build

A green build is not the same as a healthy app.

VibeNest watches the runtime side too: Coolify resource state, restart loops, runtime logs, public URL probes, build-log stalls, OOM signals, and repeated recovery flaps.

This is where the platform learns the difference between:

  • the build failed
  • the container crashed after boot
  • the app is running but unreachable
  • the route is stale
  • the repo cannot be cloned
  • the app is under-provisioned

Different failures need different responses. "Run deploy again" is only useful when the previous failure was transient.

The actual goal

I do not think "AI deploys your app" is the right promise.

The more useful promise is smaller:

Take a GitHub repo that is close to deployable, run the boring infrastructure path, detect the common production mismatches, fix the safe ones, and explain the rest clearly enough that the developer can make the next decision.

That is what we are building with VibeNest.

Longer technical breakdown:

https://vibenest.net/blog/self-healing-deployment-platform

If you deploy apps from GitHub, what usually breaks first for you: build pack, base directory, port, env vars, database setup, or runtime memory?

Top comments (0)