Giz Apps
From an idea to a live app, in the browser.
Describe an app or pick a starter. GizStack writes ordinary Gizlang code, runs its tests and deploys it to its own address. Each later change goes live in about two seconds, and the open pages keep their state.
What you get today
Describe who uses the app, what it stores and what it does. You get a working app with its code and its tests.
CRM, inventory, support tickets, bookings, approvals, tasks, hiring, invoices, orders and more. Each one is a starting point that you own.
app.gizandapp.test.gizin the browser. Edit them, run the tests and deploy.A deploy checks the code, runs the tests, builds, links and swaps the running app. Measured in production: 1.86–1.96 s from Deploy to the change in the open page.
Browse your app's records in the Data area. Read its requests and errors in Logs.
Organizations, projects and members, with one sign-in for each person.
How it works
- Sign up with your email. Your account gets an organization.
- Describe the app or choose a starter. GizStack writes
app.gizand its tests. - Review the preview. Change it by chat, or edit the code in the Code tab.
- Deploy. The checks and tests must pass. The app is live at
https://{name}.giz.sh. - Change it live. Each deploy replaces the running code. Open pages update without a reload, and keep the text that people typed.
The app is ordinary code
An app is one Gizlang file. This is the guestbook that every new project starts from:
import * as S from "./stack.giz";
import {App, Doc, Request, Params, Response, Route, route, f} from "./stack.giz";
import {Html, each} from "gizlang:html";
import * as Text from "gizlang:text";
export function Entry(d: Doc): Html { return <li><b>{d.get("name")}</b> {d.get("text")}</li>; }
function home(app: App, request: Request, params: Params): Response {
return app.page(200, "Guestbook", <main><form method="post" action="/notes">
<input name="name" required/><input name="text" required/><button>Leave a note</button></form>
<ul>{each(app.list("notes"), (d: Doc) => Entry(d))}</ul></main>);
}
function note(app: App, request: Request, params: Params): Response {
const name = Text.clip(params.get("name").trim(), 40);
const text = Text.clip(params.get("text").trim(), 200);
if (len(name) > 0 && len(text) > 0) { app.add("notes", [f("name", name), f("text", text)]); }
return S.redirect(303, "/");
}
export function routes(): Vec<Route> { return [route("GET", "/", home), route("POST", "/notes", note)]; }- The app is a GizWeb module:
routes()declares its routes, and each handler answers anHttp.Response. Markup is typedHtml, escaped by default. app.addandapp.listkeep records in the app's own database.- Typed tables and SQL are there too:
app.table<T>(...)follows a record type, andapp.sql(sql, params)binds$1,$2. - A field rename with
/** @was title */keeps the column's data.
Isolated by design
- A separate domain for apps. Apps run under
giz.sh, not undergizstack.com, so app code cannot read or set your console cookies. - One process, one database and one storage quota for each app. The app's environment never holds platform credentials.
- The same checks for every caller. People, the CLI, agents (through MCP) and apps pass the same permission checks.
What is next
You can deploy from your terminal today. Previews and rollback, custom domains, secrets and a managed GizDB connection string are on the roadmap.