Documentation

Publish a PWA with an AI assistant.

PwaNow ships a skill that any AI coding assistant can follow end to end — create the site, upload the build, and verify it's actually live — using PwaNow's hosted MCP server. Nothing to install locally to make it work.

Give your agent one prompt

Most AI coding assistants — Claude Code, Claude, Cursor, and similar — can fetch a URL and follow it as instructions. Point yours at the skill and describe what to build:

Prompt

Build a PWA with a few games, including flappy bird. Deploy it on PwaNow using this skill: https://pwanow.com/skill.md

The skill is self-contained: it tells the agent the MCP endpoint to connect to, how to authenticate, how to zip and upload a build (the MCP server has no access to your local filesystem, so that step stays with your agent), and not to report success until the live site actually passes a check.

Add a backend for your data

PwaNow hosts the static build — your PWA's own data (accounts, records, whatever it needs to store) lives wherever you point it. Tell your agent which one to wire up:

Prompt — Firebase

Build a PWA that [describe what it does]. Use Firebase for the
backend — Firestore to store data and Firebase Authentication for
sign-in. Create a new Firebase project, wire the client SDK into the
app, and add security rules that scope data per user. Deploy it on
PwaNow using this skill: https://pwanow.com/skill.md

Prompt — Supabase

Build a PWA that [describe what it does]. Use Supabase for the
backend — Postgres for data and Supabase Auth for sign-in, with Row
Level Security policies so each user only sees their own data. Deploy
it on PwaNow using this skill: https://pwanow.com/skill.md

PwaNow doesn't run server-side code — it only serves the static files you upload. Firebase and Supabase are built for that: their client SDKs talk to the backend directly, and security rules (not a server you host) keep data scoped per user.

Before you start

Your agent needs two things from you: an account, and a key to act as you.

  1. 1

    Create an account

    Free, no credit card required. Sign up to get a dashboard.

  2. 2

    Create an API key

    From API Keys in the dashboard. Keys start with pwanow_live_… and authenticate MCP requests as you.

  3. 3

    Hand it to your agent

    Paste the key into your prompt or MCP client config — whichever the skill asks for.

What the skill actually does

The same deploy-and-verify loop, whether it's run by a human or an agent.

Creates the site

Calls create_site with a subdomain name (checking list_sites first so it doesn't duplicate one you already have).

Uploads the build

Requests a presigned URL via get_upload_url, then zips and uploads your build itself — the MCP server can't reach your local files.

Verifies it's live

Polls get_site_status until processing finishes, then calls test_site, which fetches the real URL and checks it back.

Reports honestly

Only reports success once test_site returns passed: true — and explains which check failed if it didn't, instead of guessing.

Prefer to wire it up yourself?

Any MCP-capable client can connect directly, without going through the skill prompt.

.mcp.json — Claude Code

{
  "mcpServers": {
    "pwanow": {
      "type": "http",
      "url": "https://api.pwanow.com/mcp",
      "headers": {
        "Authorization": "Bearer <your pwanow_live_… API key>"
      }
    }
  }
}

.claude/settings.local.json — skip the approval prompt

{
  "enabledMcpjsonServers": ["pwanow"]
}

.vscode/mcp.json — VS Code

{
  "servers": {
    "pwanow": {
      "type": "http",
      "url": "https://api.pwanow.com/mcp",
      "headers": {
        "Authorization": "Bearer <your pwanow_live_… API key>"
      }
    }
  }
}

.cursor/mcp.json — Cursor

{
  "mcpServers": {
    "pwanow": {
      "url": "https://api.pwanow.com/mcp",
      "headers": {
        "Authorization": "Bearer <your pwanow_live_… API key>"
      }
    }
  }
}

~/.codeium/windsurf/mcp_config.json — Devin Desktop (formerly Windsurf)

{
  "mcpServers": {
    "pwanow": {
      "serverUrl": "https://api.pwanow.com/mcp",
      "headers": {
        "Authorization": "Bearer <your pwanow_live_… API key>"
      }
    }
  }
}

~/.codex/config.toml — Codex CLI

[mcp_servers.pwanow]
url = "https://api.pwanow.com/mcp"
http_headers = { "Authorization" = "Bearer <your pwanow_live_… API key>" }

~/.gemini/config/mcp_config.json — Antigravity

{
  "mcpServers": {
    "pwanow": {
      "serverUrl": "https://api.pwanow.com/mcp",
      "headers": {
        "Authorization": "Bearer <your pwanow_live_… API key>"
      }
    }
  }
}
  • create_site — reserve a subdomain for a new site
  • list_sites — see everything you own before creating a duplicate
  • get_upload_url — get a presigned URL for uploading a zipped build
  • get_site_status — check a site's status and live URL
  • test_site — fetch the live site and report back what's actually working
  • delete_site — permanent; agents following the skill confirm with you first

Using Claude Code

Save the skill locally instead of linking to it, if you'd rather it always be available.

Terminal — macOS / Linux

mkdir -p .claude/skills/pwanow
curl -o .claude/skills/pwanow/SKILL.md https://pwanow.com/skill.md

PowerShell — Windows

mkdir .claude\skills\pwanow -Force
Invoke-WebRequest -Uri https://pwanow.com/skill.md -OutFile .claude\skills\pwanow\SKILL.md

Then just ask Claude Code to deploy your project to PwaNow — it'll pick up the skill automatically and ask for your API key the first time it needs one.