a·appappGUIDE
Back to workspace ↗
APPAPP FIELD GUIDE

A small guide to
making big things.

Everything you need to get an app from “what if?” to working software. No build tools or setup required.

01 — THE BASICS

Your first app

Create an account and click New app to name it yourself, or choose Create with AI to describe the idea. AI suggests a name, unique address, and description; review them and click Create app. The AI-created app starts with an empty source folder, then the builder creates the initial app directly from your description. Manually created apps include a starter template.

Your unique app address is permanent. Changes save automatically; press Ctrl + S to save immediately. Click Preview to test the current code, or Open app to run it full-screen.

Apps can be installed as PWAs from the full-screen runner when your browser offers the Install app button. On iPhone or iPad, open the runner in Safari and choose Share → Add to Home Screen. Self-hosted installations need HTTPS; localhost is treated as secure for development. App sign-in, AppApp databases, and app content require a network connection.

02 — YOUR WORKSPACE

Inside the studio

  • Files: select files, create new HTML/CSS/JS files, or upload assets.
  • Entry point: choose which HTML file starts your app.
  • Preview: try the app in its sandbox. Refresh it after code changes.
  • Settings: change the app name and description from the menu by its name.
  • Registrations: the first account on a self-hosted instance can turn new account sign-ups on or off from the workspace. Existing users can still sign in when sign-ups are closed.
  • Delete an app: use the trash control on an app card. Confirm carefully; this permanently deletes all app files and private database data and cannot be undone.
  • Theme: use the moon/sun button to switch between light and dark mode. Your choice is saved in this browser.
03 — A CREATIVE PARTNER

Create with AI

From the workspace, describe the app and AI suggests its name, unique address, and description. After you confirm the details, the studio starts building the app. In the studio, ask for complete features or larger changes; the assistant can search the project, trace behavior across files, make precise edits, create or remove source files, validate local assets and JavaScript syntax, and repair issues.

✳

AI edits are saved directly to your app. It cannot access your database or files outside the app’s source folder. Don’t include secrets or sensitive information in prompts or app files sent to the AI.

04 — THE CLIENT LIBRARY

AppApp.js

The shared AppApp.js library gives your code a small async API for initialization and database access. It’s already loaded for your app; don’t add another copy.

await AppApp.init({
  unique_id: "my-app",
  name: "My app",
  database_config: {
    version: 1,
    tables: { notes: { id: "INTEGER PRIMARY KEY AUTOINCREMENT", body: "TEXT NOT NULL" } }
  },
  migrations: [{
    version: 1,
    up: ["CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY AUTOINCREMENT, body TEXT NOT NULL);"]
  }]
});

const note = await AppApp.db.insert("notes", { body: "A thought" });
const notes = await AppApp.db.find("notes", { where: { id: note.id } });
await AppApp.db.update("notes", { id: note.id }, { body: "A new thought" });
await AppApp.db.delete("notes", { id: note.id });

Initialization must finish before database operations. After it, AppApp.user contains the current user and AppApp.thisapp describes the running app.

05 — PRIVATE BY DEFAULT

Your database

Each user gets a separate SQLite database file for each app. The structured API binds values as SQL parameters; it does not accept raw SQL from app code.

  • find(table, options?) returns matching rows. Options: where, orderBy, and limit.
  • insert(table, values) returns the inserted row.
  • update(table, where, values) updates matching rows.
  • delete(table, where) removes matching rows.

Filters support direct equality and $eq, $ne, $gt, $gte, $lt, $lte, and $like. Updates and deletes require a where condition.

06 — GROW YOUR SCHEMA

Schema migrations

When your tables change, raise database_config.version and add the next sequential migration. Each migration’s up property is an array of SQL statements:

database_config: { version: 2, tables: { /* your new schema */ } },
migrations: [
  { version: 1, up: ["CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT);"] },
  { version: 2, up: ["ALTER TABLE notes ADD COLUMN pinned BOOLEAN DEFAULT 0;"] }
]

For each user database, AppApp takes a file snapshot and runs upgrades in one transaction. If a migration fails, it restores the snapshot. Never edit or remove a migration version that users have already run.

07 — THE SAFETY BOUNDARY

The app sandbox

Your app runs in an iframe without allow-same-origin. It has an opaque origin, cannot read the platform’s cookies or page, and communicates with the backend through a message bridge. The host verifies which frame sent each request and uses your signed-in session on its behalf.

App source files are served as static assets; app data remains isolated by app and user. Only share app code you’re comfortable making available as a public static app.