app did not respond on / within 30s
Your build succeeded but the app never answered the health check. In order of likelihood:
- Not listening on
$PORT. The single most common cause — a hardcoded port:
// ✗ hardcoded — fails the health check app.listen(3000); // ✓ reads the assigned port app.listen(process.env.PORT || 3000);
- Crash on boot. A missing env var (
DATABASE_URL, an API key) throws at startup. The build log’s failure message includes the tail of your app’s runtime log — read it; the stack trace is usually right there. /isn’t servable. An API-only app that 404s or 500s on the root path fails the check — a 5xx doesn’t count as alive. Set the project’s health-check path to a route that returns 200, or add a trivial/handler.- Slow start. Loading a large model or dataset at boot can blow the 30-second window — lazy-load heavy work after the server starts listening.
No package.json or index.html found.
Canner looked at the project root and found neither a Node manifest nor a static entry. Usually one of:
- Monorepo / nested app: the app lives in a subfolder. Set Root directory in project settings to that folder.
- Zipped the wrong level: your archive contains a single wrapping folder. Zip the contents, or drag the folder itself onto the dropzone.
- The repo genuinely lacks them — check that you pushed what you think you pushed.
A lockfile is required to deploy
Builds are reproducible by design, which requires package-lock.json, pnpm-lock.yaml, yarn.lock, or bun.lockb. Run your package manager’s install locally and commit (or include in the upload) the lockfile it writes.
package-lock.json is out of sync with package.json
You edited dependencies without reinstalling. Run npm install locally, then commit the updated lockfile and redeploy.
Could not detect a supported project
The files don’t match any runtime Canner knows: Node, Python, Go, Ruby, PHP, Rust, or static HTML. If it’s a Java/JVM project, that’s not supported yet. If it should be detected, check the root-directory setting — detection runs against the configured root.
out of memory
The build exceeded its memory budget (capped per plan — see the limits). Big Next.js builds with type checking are the usual culprit — try typescript.ignoreBuildErrors with a separate CI type check, trim dependencies, or upgrade for more build memory.
Upload fails or the archive won’t extract
A malformed zip (some macOS archive tools produce them) is the usual cause. Use .tar.gz instead, or drag the folder itself — the dropzone packages it correctly. Interrupted uploads (Part terminated early) are just a flaky connection — retry.
Still stuck?
Write to hello@canner.ca with your project slug — a human who can see the build logs replies.