---
title: "Custom apps"
description: "Vibe-coded AI products: authored by an agent, served in a sealed sandbox, monetized from day one."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.murl.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom apps

Apps are murl's deepest bet: anyone can ship a **custom AI product** (full
UI, own interaction model, own brand) without owning infrastructure, model
accounts, billing, or auth. The creator describes the product; the platform
supplies everything else.

## Authoring

Apps are built conversationally with the **authoring agent**. It researches
the brief, picks models from the registry using researched guidance cards,
writes the worker code and UI, validates the bundle, and publishes. The
creator iterates in plain language; the output is a real, reviewable code
bundle they own.

## The runtime contract

An app is a single-module ESM worker: `export default { fetch }`. It is served
under `/apps/{id}/` on murl's own domain, inside a sandbox with:

- **No network egress**: outbound `fetch` throws.
- **No bindings except `env.MURL`**: the [SDK](/sdk) is the app's entire
  world for models, chains, storage, uploads, and jobs.
- **Resource caps** per request, pinned compatibility per bundle.

This inversion is what makes untrusted creator code safe to run and safe to
*pay*: every ability an app has is a method the platform implemented,
metered, and audited.

## UI for free

Apps load a platform-served UI runtime: web components for the app shell,
generation history rail, prompt box, priced action buttons, and state
handling, plus dual-theme design tokens. A vibe-coded app looks native on
murl by default and can re-brand via a token pair. The platform also records
every successful model run into the app's **generations feed** host-side, so
apps ship history with zero code.

## Money semantics

Every spending path goes through one chokepoint: quote, budget guard, wallet
hold, provider call, attributed usage log, settle. That gives every app,
automatically:

- **Posted prices** on actions before the user commits (`estimateCost`).
- **Budget breakers**: per-call and per-day caps protect runners from
  runaway apps.
- **Approval gates** in multi-step chains: expensive steps pause and
  re-quote from resolved inputs before money moves.
- **Creator attribution**: every spend row carries the app's publication id;
  [payouts](/economics) aggregate from these rows with no app code involved.

## Preview

Creators test in a walletless preview where price quotes are real but all
spending calls stop at the hold step, so the full UI is testable at $0 before
anything goes live.

Source: https://docs.murl.ai/apps/index.mdx
