Skip to content
Deployment
Skill

/app-it-static

Turn a finished or buildable web app into a macOS Dock-launchable .app that serves built output instead of a dev server. Use when the user asks for app-it-static, a finished site/app launcher, a lightweight Dock app, or a dist/build/out bundle clickable from the Dock. Builds

From plugin
app-it
2153 skills

Claude Code

$ npx -y skills add Christian-Katzmann/app-it --skill app-it-static --agent claude-code

SKILL.md

app-it-static.SKILL.md
name: app-it-static
description: >-
  Turn a finished or buildable web app into a macOS Dock-launchable .app that
  serves built output instead of a dev server. Use when the user asks for
  app-it-static, a finished site/app launcher, a lightweight Dock app, or a
  dist/build/out bundle clickable from the Dock. Builds once, serves a snapshot
  via static-server.py or file://, and routes live projects to app-it. macOS
  only.

app-it-static - Make a finished build launchable from the Dock

`app-it-static` is the no-dev-server companion to `app-it`: it builds once, serves the finished output, installs beside live apps in `~/Applications/App It/`, and keeps the native Swift WebKit window and Dock identity.

Non-Negotiables

1. Run `templates/inspect-static.sh` first and read the output before editing. 2. Confirm before the first project build. It can write files and take time. 3. Never run `npm run dev`. If the app needs a live dev server, route to `app-it` and say why. 4. Serve a snapshot and say so. Source changes need `desktop:rebuild`. 5. Default to `serve_mode: "server"`. Use `file` only after proving the build is file:// safe. 6. Copy shipped templates and customize through `scripts/app-it.config.json`. Do not re-derive launcher patterns. 7. Verify the built output, app bundle, install path, runtime port, server response, quit cleanup, and human-only GUI limits.

Reference Map

Open only the files needed by the inspection result:

  • `references/project-inspection.md` - static-servable tests, build/output

detection, package managers, monorepos, names, bundle IDs, and tools.

  • `references/serve-modes.md` - server vs file decisions and the file:// safety

checklist.

  • `references/generated-files.md` - template roster, shared-template rules,

allowed target-project files, config JSON, and package scripts.

  • `references/verification.md` - smoke tests, app-bundle checks, runtime checks,

cleanup, and human/deferred buckets.

  • `references/report-template.md` - exact final report format plus decision

history.

  • `references/anti-patterns.md` - traps that cause broken static launchers.

Templates

Templates live next to this file in `templates/`. Copy them into the target project; do not rewrite them. See `references/generated-files.md` for the full roster.

Shared templates are byte-identical to `app-it` and guarded by repo validation: `wrapper.swift`, `native-run-stub.c`, `desktop-icons.sh`, `desktop-icons-preview.sh`, `desktop-install.sh`, `info-plist-template.xml`, and `placeholder-icon-gen.sh`. If launcher internals change, edit the `app-it` copy and re-sync this plugin so marketplace installs stay self-contained.

Workflow

1. Inspect

Run:

/path/to/plugins/app-it-static/skills/app-it-static/templates/inspect-static.sh

Use disk truth: `package.json`, config files, built output, and actual scripts. Read `references/project-inspection.md` before deciding whether the app is static-servable, which build command/output dir to use, or whether a monorepo contains multiple apps.

2. Decide

For each user-facing app:

Static build or hand-written index.html exists?
  no  -> route to app-it
  yes -> needs http origin, routing fallback, fetch(), or service worker?
           yes -> server mode (default)
           no  -> file mode candidate

When unsure, choose server mode. It costs a tiny Python process and is the safe default for framework builds.

3. Build

Confirm with the user, run the project build once, then copy templates into the target project and write `scripts/app-it.config.json`. `desktop:build` assembles the `.app`; it must not run the project build. `desktop:rebuild` is the refresh path that reruns the build command.

Read `references/generated-files.md` before editing package scripts, generated docs, config JSON, icons, or install paths.

4. Verify

Verification is mandatory. Read `references/verification.md` and run the checks that apply: built `index.html`, Mach-O `Contents/MacOS/run`, executable `run.sh`, Mach-O wrapper, plist placeholders gone, `.icns`, installed-path open, server response, and Cmd+Q cleanup for server mode.

Never claim GUI-only checks passed unless a display actually proves them. Put window render and Dock icon identity in the human bucket when needed.

5. Report

Use `references/report-template.md` for both the chat reply and `docs/desktop-launcher.app-it-static-report.md`. Include snapshot limitations, refresh command, verification results, known limits, and decision history.

Stage files only when the local convention or user request asks for it. Do not commit unless asked.

Quick Defaults

  • Install destination: `~/Applications/App It/`.
  • Bundle ID prefix: `com.user.<slug>`.
  • Serve mode: `server`, unless file:// safety is proven.
  • Vite/CRA/Astro/SvelteKit static/Next export/Angular/Nuxt generate: usually

server mode.

  • Hand-written `index.html` with relative assets and no routing/fetch/service

worker: file mode candidate.

  • Missing `swiftc` or `python3`: stop and say `xcode-select --install`.

Stop Signs

Stop and explain clearly when the app only works through a live dev server, the build fails before launcher work, the output dir lacks `index.html`, required tooling is missing, or the environment cannot verify a claim the report would need.

Read more
@christian-katzmann
Ships withapp-it

Turn a local web project — or any hosted web app — into a macOS Dock-launchable .app bundle — a native window, its own Dock icon, and clean start/stop — without Electron, Tauri, or a rewrite.

Stars on GitHub

Momentum

stars in total
215
Star history of Christian-Katzmann/app-it on GitHub, a chart by star-history.com

Other skills on app-it.

app-it-windows

app-it-windows

Create Windows beta desktop launchers for local web projects: WPF + WebView2 .exe, Start Menu shortcut, .ico, warm server, quit…

app-it

app-it

Turn a local project or a hosted web app (including a published Claude Artifact URL) into a macOS Dock-launchable .app. Use when…

More skills from other plugins.

configuring-horizon

configuring-horizon

Use this skill whenever the user mentions Horizon by name in a Laravel context. Covers the full Horizon lifecycle: installing…

coolify9d66k
@coollabsio@coollabsioInstall Skill
vercel-cli

vercel-cli

Guides deployment, configuration, and troubleshooting with the Vercel CLI. Use when operating Vercel projects or resources…

vercel11d16k
@vercel@vercelInstall Skill
skypilot

skypilot

Use when launching cloud VMs, Kubernetes pods, or Slurm jobs for GPU/TPU/CPU workloads, training or fine-tuning models on cloud…

@skypilot-org@skypilot-orgInstall Skill
pinme

pinme

Use this skill when the user mentions "pinme", or needs to upload files, store to IPFS, create/publish/deploy websites or…

pinme8w3.8k
@glitternetwork@glitternetworkInstall Skill

Questions about app-it-static.

Which coding agents can use app-it-static?
app-it-static installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.