Open source · Self-hostable

Publish HTML.
Get a link.

A publishing service for AI agents and developers. POST any HTML and get a shareable URL back in milliseconds. No browser needed.

Get started free Read the docs →
terminal

Building an agent 🤖? llms.txt has everything it needs to get started.

How it works

Three steps, zero configuration on the client side.

1

Sign up & get an API key

Create an account in the dashboard, then generate an API key under the Account tab. Your key looks like pp_abc123…

2

POST your HTML

Send a POST /api/pages request with your HTML content, as JSON or a raw file upload. Or add the MCP server to your agent config for one-step tool access.

3

Share the URL

The response includes a permanent shareable URL. Drop it in a message, an email, or any workflow with no additional hosting required.

Everything you need,
nothing you don't

Built for the moments when an AI agent or script produces rich output and needs a URL to link back to, not a file attachment.

Instant publishing

Pages are served directly by nginx. No build step, no processing delay. The URL is live the moment you get it back.

🤖

Agent-ready

REST API and MCP server included. Wire it into Claude, GPT, OpenClaw, Hermes, or any agent framework in minutes. Returns a URL the agent can pass downstream.

🔒

Authenticated pages

Logged-in pages persist for 30 days and are managed from your dashboard. Guest pages are ephemeral and expire after 30 minutes.

🗄️

Persistent storage

Pages survive restarts. Metadata lives in PostgreSQL, files in a named Docker volume. Built-in cleanup job removes expired pages automatically.

📁

File uploads

Prefer uploading a file? Send multipart/form-data instead of JSON. Perfect for piping reports from CI or scripts directly.

🏠

Self-hostable

Fully open source. Run your own instance with a single docker compose up. Bring your own domain and keep your data on your hardware.

🔐

Protected pages Coming soon

Publish with "protected": true and get back a secret-token URL. Only people with the full link can view the page — everyone else gets a 403.

✏️

In-place updates Coming soon

PUT new HTML to an existing page ID and the URL stays the same. Fix a typo or refresh data without breaking any links you've already shared.

Works anywhere

A standard HTTP call is all it takes. Use curl, any HTTP library, or the MCP server.

# JSON variant
curl -s -X POST https://pushpage.link/api/pages \
  -H "X-Api-Key: $PUSHPAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"html":"<h1>Report</h1><p>Done!</p>","title":"My Report"}'

# File upload variant
curl -s -X POST https://pushpage.link/api/pages \
  -H "X-Api-Key: $PUSHPAGE_API_KEY" \
  -F "[email protected]"
import requests

url = requests.post(
  "https://pushpage.link/api/pages",
  headers={"X-Api-Key": api_key},
  json={
    "html": "<h1>Report</h1>",
    "title": "My Report",
  },
).json()["url"]

print(url) # https://pushpage.link/pages/abc123.html
const { url } = await fetch("https://pushpage.link/api/pages", {
  method: "POST",
  headers: {
    "X-Api-Key": apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    html: "<h1>Report</h1>",
    title: "My Report",
  }),
}).then(r => r.json());

console.log(url); // https://pushpage.link/pages/abc123.html
# Add pushpage to your Claude MCP config
{
  "mcpServers": {
    "pushpage": {
      "type": "streamable-http",
      "url": "https://pushpage.link/mcp",
      "headers": {
        "X-Api-Key": "<your-api-key>"
      }
    }
  }
}

# Claude can now call publish_page, list_pages, delete_page

Prefer to self-host?

pushpage is fully open source. Run your own instance on any server. You only need Docker Compose and a domain. Your data, your infrastructure, your rules.

Self-hosting guide View on GitHub

Start publishing today

Sign up for free and publish your first page in under a minute. No credit card required.