publish_page
Publish a page
Publish an HTML file as a NEW live link and return its URL. Use update_page to change an existing page instead.
htmlpathaccessrequiredemailsinviteexpires
io.github.VilancerPublished by GitHub account Vilancerv0.5.1Updated Nov 7, 2026
Share analyst reports and dashboards as a live link.
Publishes a single HTML file as a live, access-controlled link and manages the pages, recipients and media attached to it.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
Drop an HTML file. Get a live link. Control who sees it.
droppage is a command-line tool that publishes a single HTML file to a live, shareable URL in one
command — with access control that feels like sharing a document, not deploying a website. It is
built for developers, analysts, and AI agents that produce HTML reports and need a URL without
running a hosting stack.
Website: droppage.dev · Source: github.com/Vilancer/droppage-cli
Requires Node.js 22 or newer.
Open the printed link in any browser. That's it.
Run droppage <command> --help for full option details.
Slugs from 0.2.1 on never start with -. If an older page's slug does (say -AbC12xYz9), put -- in front of
it, with any options before the --: droppage expire -- -AbC12xYz9 never or
droppage update --expires 7d -- -AbC12xYz9 report.html. The CLI prints the same hint when it happens.
--password, --email, and --private are mutually exclusive. update never changes the access
mode — it only swaps the HTML. When you are signed in to droppage.dev, your own protected pages
open directly, without the password or email link.
.html or .htm file per upload; the file is validated before any network call.<img src> are uploaded with the page (see below); sensitive images belong
inline as data: URIs.list count one unique visitor per page. Refreshes, reopening in the same browser,
link previews from chat apps, and your own opens do not add views.list --preview) never increment the view count.Images belong to a page. Reference local image files in your HTML (inside the HTML file's folder; ../ and absolute paths are ignored), with paths relative to the HTML
file, and upload it:
upload finds the images, uploads them to that page, rewrites the links to
https://droppage.dev/i/<id>.<ext>, then publishes. The image lines go to stderr; stdout is still
only the page URL.
update uploads any new local images, keeps the same URL for an unchanged image, and deletes
the page's images the new HTML no longer uses.<img src>, the CLI picks up local images in srcset on <img>/<source> (every
candidate, descriptors kept), <link rel="icon"|"apple-touch-icon" href>, and url(...) inside
<style> blocks (0.2.2+). Not picked up: style="..." attributes and .ico files.droppage image upload <files...> --page <slug> adds images to an existing page and
prints their URLs; droppage image list [--page <slug>] [--json] shows them (--json prints
{images:[{id,url,ext,content_type,bytes,name,created_at,page}], page?:{slug,used_bytes,limit_bytes}});
droppage image delete <id-or-url...> removes them.Short product films (CLI 0.3.0+) are hosted exactly like images. Reference local MP4 or WebM files,
and a poster image, in a <video>:
<video src>, <source src> (inside <video>, and <picture> as before), and
<video poster>. Same folder rule as images..mov and .mkv are refused; convert them first, e.g.
ffmpeg -i in.mov -c:v libx264 -pix_fmt yuv420p -movflags +faststart -an film.mp4.update and deleted with the page, like images. Video traffic counts toward your
monthly bandwidth.https://droppage.dev/i/<id>.mp4|webm with HTTP Range support (206 Partial Content),
so Safari, iOS and seeking work. Public to anyone with the URL, like images.droppage image upload film.mp4 --page <slug> (or
droppage media upload) adds a video to an existing page.Pages can expire. Nothing expires unless you set it, on any plan.
After expiry the page shows "This page has expired." (HTTP 410) to everyone, including you, and
its images stop working. A daily cleanup then deletes the page and its images for good.
droppage list shows an EXPIRES column (never or a date); list --json rows have expires_at
(null means never).
droppage is a quick way to send an analysis to people who don't have your tools: a dashboard for your team, a weekly KPI or stakeholder report, a client deliverable, a notebook export. They open a link.
frontend-design skill before building the page, so
the report gets a deliberate look instead of a templated one. Claude Code:
/plugin install frontend-design@claude-plugins-official; Codex, Cursor, and other agents: use its
SKILL.md from anthropics/skills.jupyter nbconvert --to html analysis.ipynb, Plotly's fig.write_html("report.html", include_plotlyjs="cdn"), Altair's
chart.save("report.html"), or your own Chart.js / ECharts page. Scripts run, so interactive
charts work, and chart libraries can load from a CDN.localStorage, cookies, and same-origin requests are not available, so
keep the data in the file rather than fetching it.--email [email protected],[email protected] for named people (Builder; manage
them later with droppage recipients), --password for a group link (Starter and Builder),
--private for a draft. On the Free plan, pages can be public or private, without a password or email list.droppage update <slug> report.html replaces the report and keeps the
link and its access settings (Starter and Builder). Use --expires 30d for one-off deliverables.droppage list --json shows view_count (unique visitors) and
last_viewed_at for each report.droppage keeps a strict stream contract so it is safe to call from automation:
upload and update print only the URL on stdout, even when they upload images;
image upload prints only the image or video URL(s); expire prints nothing on stdout.list --json, image list --json, recipients list --json, and quota --json print only JSON on stdout.droppage: image … → … / droppage: video … → … lines go to stderr.--yes on delete / recipients remove for non-interactive runs.Ready-made instruction packs for Codex, Cursor, and Claude-style agents live in the
agents/ directory of the repository.
Machine-readable docs for agents and doc tools such as mcpdoc:
droppage.dev/llms.txt, or everything in one file at
droppage.dev/llms-full.txt.
From 0.4.0, droppage mcp runs a Model Context Protocol server on stdio, so
agents in Claude Code, Cursor, Codex, Windsurf, or Claude Desktop publish through typed tools instead of shell
commands. It runs on your machine and uses the session from droppage login; sign in once in a terminal first.
Cursor (.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json), and Claude Desktop
(claude_desktop_config.json):
Codex (~/.codex/config.toml):
Tools: publish_page (a file path or inline html; access public, email or private; emails; invite; expires), update_page, list_pages, delete_page, set_page_expiry, get_quota, list_recipients, add_recipients, invite_recipients, remove_recipient, upload_media, list_media, delete_media, send_feedback. Results are JSON with a warnings list.
droppage login in a terminal, then retry."
There is no login tool: login needs the terminal, and stdin belongs to the protocol.droppage upload <file> --password yourself for a password page.path when the page uses local images or videos; inline html cannot bring them.update_page, delete_page, set_page_expiry, remove_recipient, and delete_media are marked destructive, so MCP clients ask before running them.After a command finishes, interactive terminals check npm for a new release at most once every 24
hours and put any update notice on stderr only. The check sends no identifier or usage data, and
all errors are ignored. Set DROPPAGE_NO_UPDATE_CHECK=1 to opt out. This registry lookup is the
CLI's only non-backend network request; droppage still collects no telemetry.
Before bulk publishing, use droppage quota --json. A warn level means the monthly meter is at
least 80% used; limit means new uploads, updates, or previews may pause. Existing links remain
live. Delete unneeded pages or review plan options at droppage.dev/account.
Feedback is public and login is optional:
Agent-authored feedback should always use --agent and include the model name.
Releases are published from GitHub Actions with npm provenance, so every version on npm is verifiably built from a tagged commit in the public repository.
droppage works with zero configuration against the hosted service. For self-hosted or development setups, these environment variables are honoured (in order of precedence):
service_role/sb_secret key is found in its
environment or config file — those keys must never be used with droppage.~/.droppage/config.json (or $DROPPAGE_HOME/config.json) with 0600
permissions. A project's ./.env cannot move it.Apache-2.0 © 2026 Vilancer.
Source: README.md at commit 8e67b6b
Publish a page
Publish an HTML file as a NEW live link and return its URL. Use update_page to change an existing page instead.
htmlpathaccessrequiredemailsinviteexpiresUpdate a page
Replace the HTML behind an existing page. The URL and access settings stay; new local images and videos are uploaded and ones the page no longer uses are deleted.
htmlpathslugrequiredexpiresList pages
The user's pages, newest first: url, access_mode, allowed_emails, view_count (unique visitors), last_viewed_at, expires_at.
previewDelete a page
Delete a page for good: its link stops working and its images and videos are deleted. Confirm with the user first.
slugrequiredSet when a page expires
Set or clear when a page (and its images and videos) is deleted for good, without re-uploading it.
slugrequiredwhenrequiredPlan and limits
The plan, what it allows, and current usage. usage.level "warn" means at least 80% used; "limit" means writes may pause. Existing links stay live.
Takes no parameters.
List recipients
Who can open an email page, with their invitation status.
pageslugrequiredAdd recipients
Give more people access to an email page; each new one is emailed an invitation with an access link.
slugrequiredemailsrequiredInvite recipients
Email an invitation to everyone on an email page who has not had one yet, e.g. after publish_page with invite: false. People already invited are skipped.
slugrequiredRemove a recipient
Take away one person's access to an email page.
slugrequiredemailrequiredAdd images or videos to a page
Upload image or video files to one of the user's pages and return their URLs, for files the HTML did not reference at publish time. PNG, JPEG, GIF, WebP, AVIF, SVG up to 4 MB; MP4, WebM up to 20 MB. Hosted media is public to anyone with its URL, even on a gated page.
pagerequiredpathsrequiredList images and videos
The user's hosted images and videos; with `page`, only that page's and its media budget.
pageDelete an image or video
Delete one hosted image or video by id or URL. It stops being served within 5 minutes.
id_or_urlrequiredSend feedback
Send an idea, bug report, review, or other feedback to the droppage team. It is always marked as coming from an agent; include your model name.
kindmodelratingcontactmessagerequired90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
$ droppage upload report.htmlhttps://droppage.dev/p/k3x9qd2mnpm install -g droppagedroppage --versiondroppage login # magic link sent to your emaildroppage upload report.html # prints the share URL on stdout<img src="chart.png">$ droppage upload report.htmldroppage: image chart.png → https://droppage.dev/i/AbCdEfGhIjKl.pnghttps://droppage.dev/p/k3x9qd2m<video autoplay muted loop playsinline poster="still.webp"> <source src="film.webm" type="video/webm"> <source src="film.mp4" type="video/mp4"></video>droppage upload page.html# stderr: droppage: image still.webp → https://droppage.dev/i/AbCdEfGhIjKl.webp# stderr: droppage: video film.webm → https://droppage.dev/i/MnOpQrStUvWx.webm# stderr: droppage: video film.mp4 → https://droppage.dev/i/YzAbCdEfGhIj.mp4droppage upload report.html --expires 7d # also 30m, 12h, 2w, or a date like 2026-12-31droppage update <slug> report.html --expires neverdroppage expire <slug> 2026-12-31 # change it without re-uploading; `never` clears itclaude mcp add droppage -- npx -y droppage mcp # Claude Code{ "mcpServers": { "droppage": { "command": "npx", "args": ["-y", "droppage", "mcp"] } } }[mcp_servers.droppage]command = "npx"args = ["-y", "droppage", "mcp"]droppage upgrade # upgrade to the latest releasedroppage --version # confirm the installed versiondroppage feedback "The preview command should…" --kind ideadroppage feedback "Upload failed after…" --kind bug --agent "my-model"