Supported apps and constraints
Keelson supports Python, Node.js, and Go web apps, static sites, and scheduled jobs. Depending on your framework and storage choices, you may need to change code or configuration. Check the table below.
You do not need a Dockerfile. Keelson does not use one for its build, even if your app includes one.
App compatibility
Section titled “App compatibility”| App | Status | Notes |
|---|---|---|
| Python web apps (FastAPI, Flask, and others) | Supported | Start on the port specified by PORT. Use gunicorn for Flask |
| Node.js web apps (Express, Hono, Next.js, and others) | Supported | Start on the port specified by PORT. Use next start for Next.js |
| Go web apps (net/http, Gin, and others) | Supported | Keelson builds the app and starts it with ./app |
| Prebuilt static sites / SPAs (React, Vue, Svelte, and others) | Supported | Point assets to the build output |
| Static frontend + API server (hybrid) | Supported | Set the API path with assets.api |
| Scheduled jobs only | Supported | Set crons alongside the shared required fields; omit the web server command |
| Connections to external PostgreSQL / MySQL / libSQL | Supported | Set db.mode: none. Supply connection details through secrets |
| Calls to external APIs (OpenAI, Slack, Google Sheets, and others) | Supported | Outbound connections are unrestricted, except that the SMTP ports (TCP 25, 465, 587, 2525) are always blocked |
Persistent data in SQLite files (sqlite3, better-sqlite3, and others) | Changes required | Switch the connection to a libSQL client and set db.mode: libsql. SQL usually stays as it is (Managed SQLite is SQLite-compatible), but adapt to client API differences (async in Node.js, row_factory and others in Python). Local development in Python / Node.js keeps working with file:local.db |
| Data that must persist stored in local files | Changes required | Use Managed SQLite or the Files SDK / Media SDK. Local data written during execution does not survive restarts |
| In-app timers or background threads | Changes required | Move work that runs at set times to scheduled jobs, and enqueue work that continues after a request as a background task (How apps run) |
| Django | External database only | Connect to an external database such as PostgreSQL with db.mode: none and start with gunicorn. Managed SQLite (libSQL) has no backend for the Django ORM, so Django with Managed SQLite is not supported (Framework notes) |
| Streamlit | Unsupported | It requires WebSocket and currently does not work (Framework notes) |
| Gradio | Under evaluation | Version 4 and later are being evaluated. Operation is not currently guaranteed |
| Ruby / PHP / Java / Rust / .NET / Elixir | Unsupported | Only Python, Node.js, and Go runtimes are available |
| Adding apt packages through a Dockerfile | Unsupported | No root access. A -media runtime may cover image or video requirements |
| Apps requiring continuously running processes, daemons, or WebSocket servers | Unsupported | Incompatible with the execution model, which stops idle apps |
| Running your own Redis / Kafka / database server | Unsupported | Connecting to an external service is allowed |
| GPU workloads | Unsupported |
Apps marked “Changes required” may work after code or configuration changes. Ask your AI agent to review the app and propose the necessary changes.
You can store temporary data that can be regenerated in local files. Temporary SQLite use requires a db.local_sqlite declaration. See the keelson.yaml reference for requirements.
For apps built with other tools, such as Lovable, Bolt, or v0, see Bring an app from another tool.
Runtimes
Section titled “Runtimes”Select a runtime with runtime in keelson.yaml. Start with -slim if you are unsure, and switch to -media if you need image, video, or PDF processing libraries such as Pillow, sharp, or ffmpeg.
| Runtime | Language version | Build behavior |
|---|---|---|
python-slim / python-media | Python 3.12 | Automatically installs dependencies from requirements.txt or pyproject.toml |
node-slim / node-media | Node.js 24 | Automatically installs dependencies from package.json and package-lock.json. Runs npm run build if defined |
go-slim / go-media | Go 1.26 | Builds from go.mod using go build and starts as ./app |
The Go version is the toolchain used for the build. The build steps in this table apply to apps with server-side processing and scheduled jobs. Dependencies are installed at build time. Put only the startup command in command.
- Node.js: Keelson uses npm for builds on the platform. Projects with only
pnpm-lock.yamloryarn.lockare unsupported; providepackage-lock.json. Static sites built locally with pnpm or Yarn can still be served. - Go: Builds use
CGO_ENABLED=0. Libraries that depend on cgo cannot be used.
See the keelson.yaml reference for dependency file requirements and build constraints.
Execution environment constraints
Section titled “Execution environment constraints”| Item | Behavior |
|---|---|
| OS / CPU | Linux / x86_64 |
| Permissions and system packages | Runs as a non-root user. sudo and apt-get are unavailable |
| Web server startup | Listen on 0.0.0.0 and the port specified by PORT |
| Data storage | Local files are not persistent. Use Managed SQLite or the Files / Media SDK for data you need to keep |
| Processing | Request handling, background tasks, and scheduled jobs are supported. See How apps run |
See Plans and limits for execution time, app count, and other limits.
Minimal app
Section titled “Minimal app”This Python (FastAPI) example can be deployed with three files: keelson.yaml, requirements.txt, and app.py.
slug: my-appruntime: python-slimcommand: "python app.py"db: mode: nonefastapiuvicornimport osfrom fastapi import FastAPIimport uvicorn
app = FastAPI()
@app.get("/")def index(): return {"message": "Hello from Keelson"}
if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=int(os.environ["PORT"]))Your AI agent normally writes keelson.yaml, so you do not need to create it yourself.
Next steps
Section titled “Next steps”- Configure keelson.yaml — Introduction to the configuration file
- Database (Managed SQLite)
- Files and media — Files / Media SDK
- Scheduled jobs
- Background tasks
- Keelson Deploy Spec — Authoritative specification for AI agents