Deploy your first
service in minutes.
Download one executable for your OS, drop it next to your app folder, and run it — you get a live service. No Go toolchain, no Docker, no node_modules.
From download to a live API
Six steps. No surprises. Follow them in order or jump to any step.
Download the binary for your OS
No install, no Go toolchain. Grab the prebuilt executable from the releases page, put it in your project folder, and run it. The binary runs whatever sits in its folder.
Get the starter two ways — clone with git, or download the ZIP. It already ships app.kitwork.js, config and views.
On macOS & Linux, make it runnable once with chmod +x kitwork. Then the runtime serves on http://localhost:8085.
Get the starter app
The starter is ready to run — no build step. Drop the binary you downloaded next to the config, your app.kitwork.js and the views.
starter/
├─ kitwork # the binary you downloaded
├─ config.kitwork.yml # settings
├─ app.kitwork.js # your routes & logic
└─ views/ # HTML templates
Configure the runtime
Set the port and, if you need data, point Kitwork at your PostgreSQL. hot_reload picks up file changes as you save.
root: "."
hot_reload: true
database:
type: "postgres"
host: "localhost"
port: 5432
name: "postgres"
Write your first route
Routes resolve before any handler runs. Return JSON, text or a rendered view — the runtime does the rest.
import { router, database } from "kitwork";
const db = database.connection();
router.get("/api/hello").handle((req, res) => {
return res.json({ status: "active", engine: "Kitwork" });
});
router.get("/api/users").handle((req, res) => {
const users = db.table("user").list(10);
return res.json({ success: true, users });
});
Cache & serve static files
Caching and file delivery are built into the router — chain them onto any route. No extra service, no middleware config.
router.get("/api/gold").cache("5s").handle((req, res) => {
return res.json({ price: 2300 });
});
// serve a file straight from disk
router.get("/favicon.ico").file("/assets/favicon.ico");
Talk to the database
A zero-allocation layer over PostgreSQL with a small built-in ORM. No driver setup, no connection boilerplate — just query.
const user = db.table("user").find("username", "grace");
const users = db.table("user").list(5);
const count = db.table("user").count();
// insert or update
db.table("user").insert({ username: "ada", role: "admin" });
db.table("user").where("id", id).update({ role: "editor" });
