Open source · self-hostable

Share a document with a link only its holder can guess.

Want to publish an HTML or Markdown file and get back a single link you could send to someone?
That's all docdrop does. There are no viewer accounts and no sign-in — the link is the only thing they need.

It comes in two parts — a command-line tool you install, and the server it publishes to.

How it fits together

A command-line tool, and a server it talks to.

docdrop is two parts. You install one of them; the other is where your documents actually live.

Your machine

The docdrop CLI

A command-line tool you install from PyPI. You publish files with it, list what you've published, and manage your links. It's the only part that goes on your own computer.

Where documents live

The docdrop server

The Anvil app that stores your documents and serves each one at its link. The CLI publishes to it over HTTPS; you tell the CLI which server to use by its web address.

Whose server? Yours, or someone else's.
Run your own server and point the CLI at it, or publish to a server someone else runs and gave you a key for. The same CLI can switch between several.

How sharing works

Two kinds of link.

Every document has one open link. When you want more control, you can hand out separate links that you're able to expire or revoke.

The default link

Anyone who has it can read

It's created the first time you publish, and it doesn't change. You can republish as often as you like and it keeps working. This is the one to use when you're happy for it to get passed around.

Grant links

You can take them back

Mint extra links with docdrop grant. You can label each one (say, "for Sam"), give it an expiry date, and revoke any single link on its own. The default link and the other grants carry on working.

Why docdrop

What it actually does.

None of this is a plan or a roadmap. It all works now, through one small command-line tool.

No accounts to read

Anyone you send the link to can open the document. They don't sign up, log in, or install anything to read it.

Editing doesn't break the link

When you publish again, the content changes but the link stays the same. Anything you've already sent out keeps working.

Restyle everything at once

Markdown is stored as you wrote it and turned into a page when someone opens it. Change the stylesheet, deploy, and every document picks up the new look. You don't republish a thing.

Every version is kept

Each publish that changes the content is saved as a revision. You can list them, compare two with diff, and rollback to an earlier one.

Yours to keep

The documents live in your own database. Host it on Anvil, or run the whole thing yourself. Your links don't depend on anyone else staying in business.

Two planes

Publishing and admin never share a key.

The command-line tool publishes over HTTPS with a bearer key. Admin jobs run over a separate, privileged uplink. The two keys never meet in the code.

Publisher plane

The docdrop CLI

Talks to /api/* over HTTPS, authenticating with Authorization: Bearer <api_key> against a row in the users table — no session, cookie, or OAuth.

Admin plane

Uplink-only operator tools

Key minting and operator tasks run over a privileged server uplink, gated so a browser or a publisher's api_key can never reach them. Accounts are minted, never self-service.

Anvil app core — one public /docs/:token route, plus server callables
document grant revision users
every table client: none — browser code reads none of them
  • Unlisted, not private. Anyone with the link can read; a 128-bit token is the gate.
  • Separate credentials. A leaked publisher key only touches that account's own documents.
  • noindex by default. Every served page carries X-Robots-Tag: noindex, nofollow.
  • No signup form. There is no publicly reachable route that creates or rotates a key.

The CLI

Install it and point it at a server.

The CLI is on PyPI as docdrop. Install it, point it at a server, and publish.

# install the CLI (pick one)
pip install docdrop
pipx install docdrop
uv tool install docdrop

# then publish a file and get a link back
docdrop publish notes.md
docdrop list

Full documentation — CLI configuration and precedence, the complete command reference, hosting your own instance, and self-hosting — lives in the repository README.

The command set

publishlistopenaliasgrantrevokegrantshistorydiffrollbackservers

One optional --server prefix targets a named profile, so one CLI can publish to a production app and a local dev one.

The server

Getting a server up and running.

You publish to a docdrop server, so you need one to point the CLI at. There are three ways to get there.

Host it on Anvil

The quickest route. Clone the repo straight into a new Anvil app, turn on the server uplink, and mint yourself a publisher key. A few minutes' work.

Run it yourself

Self-host with anvil-app-server on your own machine. The repo includes a dev container to build on — it's a starting point to adapt, not a turnkey install yet.

Use someone else's

If someone already runs a docdrop server, you don't have to host anything. Point the CLI at their server with the key they give you.

Step-by-step for hosting on Anvil and for self-hosting is in the Installation section of the README.

Plainly

What docdrop is not.

Being clear about this keeps the tool small and keeps sharing simple.

  • 1Not a private vault. Documents are unlisted, not locked. Anyone with a live link can read. Grant links expire and revoke, but they don't check who is holding them. If you need people to log in before they can read, this isn't the tool for that.
  • 2Not a signup product. There's no self-service account. Keys are minted by hand, by whoever runs the server. No billing and no dashboard.
  • 3Not a platform. It's a small app you run yourself, and that's deliberate. Nothing here depends on a company staying alive or a subscription staying paid.