GizStack

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

  • An app from one sentence

    Describe who uses the app, what it stores and what it does. You get a working app with its code and its tests.

  • 20 starters

    CRM, inventory, support tickets, bookings, approvals, tasks, hiring, invoices, orders and more. Each one is a starting point that you own.

  • The Code tab

    app.giz and app.test.giz in the browser. Edit them, run the tests and deploy.

  • Live deploys

    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.

  • Data and logs

    Browse your app's records in the Data area. Read its requests and errors in Logs.

  • Teams

    Organizations, projects and members, with one sign-in for each person.

How it works

  1. Sign up with your email. Your account gets an organization.
  2. Describe the app or choose a starter. GizStack writes app.giz and its tests.
  3. Review the preview. Change it by chat, or edit the code in the Code tab.
  4. Deploy. The checks and tests must pass. The app is live at https://{name}.giz.sh.
  5. 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:

gizlang
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 an Http.Response. Markup is typed Html, escaped by default.
  • app.add and app.list keep records in the app's own database.
  • Typed tables and SQL are there too: app.table<T>(...) follows a record type, and app.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 under gizstack.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.