Private by default
Every image, video, and file on a board lives in Plainpaper's private storage. There are no public URLs, so your unreleased creative is not sitting on some guessable link for a competitor to stumble on. Previews inside the app use short-lived secure links that expire on their own.
That matters more than it sounds. A campaign in progress is full of things that aren't public yet: the sale price, the launch date, the new product shot. Private-by-default means the board can hold all of it without anyone having to think about where the files actually are.
Supported formats: PNG, JPEG, GIF, and WebP images; MP4, QuickTime, and WebM video; plus HTML, PDF, and plain-text files. Files can be up to 512 MiB each.
How media gets onto a board
Two ways, one for each of you. You attach files in the card drawer: open a card, drop the file, done. Your agent can pull an image straight from a URL. Give it a link and Plainpaper fetches the file server-side and stores it privately, so nobody has to download and re-upload anything by hand. Agents can also upload files they already have on hand, like a chart they generated or an image they were given.
Either way the file lands in the same place: private storage, attached to the board and usable from any card. Once it's in, both of you refer to the same stored copy, so "which version of the hero image is this?" stops coming up halfway through review.
Here's our hero image: https://bookstore.plainpaper.io/images/summer-hero.jpg Store it in Plainpaper and use it as the hero in the Mail 1 email card on my "Summer sale" board. Don't link to the original URL. I want the stored copy in the email.
Why external image links are rejected
The lazy way to put an image in an email is to paste a link to wherever it lives today. That works until the source site moves the file, renames it, or goes private. Then your campaign's creative silently breaks, usually after you stopped looking at it.
So Plainpaper doesn't allow it: card content that embeds an outside image or video URL is rejected, and the error tells the agent how to store the file properly instead. Your agent learns the rule the first time it trips over it, and the board stays whole. Ordinary text links in prose ("see our returns page") are fine; the rule only covers embedded media.
The same rule protects the handoff later: when your agent eventually pushes the campaign out, it ships the stored file instead of a link that might be dead by launch day.
asset:// and placeholder://
Inside card content, stored media is referenced as
asset://, a pointer to the file in Plainpaper's
storage that gets swapped for a secure preview when you view the
card in the app. Your agent can only reference files that actually
exist; it can't invent an asset id and hope.
When an image doesn't exist yet, placeholder:// is the
honest way to say "an image goes here and I don't have it". It
renders as a labeled pending slot on the card, and it blocks
approval until it's filled with a real asset. That turns your board
into a visible checklist of what you still owe. The tokens
themselves never appear in the app; you see the image, or the
labeled slot where one is due.
List every unfilled image placeholder on my "Summer sale" board in Plainpaper, with the card it's on and what's supposed to go in the slot, so I know exactly what's still missing.
Previews & processing
Thumbnails and video previews are generated in the background after upload, with a visible pending/ready status on the asset, so a large video can take a moment before its preview appears. The file itself is safely stored the whole time; only the preview is catching up. Your agent can see the status too, so it knows to wait for a preview rather than reference one that isn't ready yet.
Handoff
When work is approved, your agent retrieves the stored files from the board and pushes them out through the destination platform's own connector: Brevo for the email send, Meta for the ad upload, whichever tools you've given it. Plainpaper never publishes anything itself. It's where the work and its assets live, not the thing holding your platform logins. See Connect your marketing stack for how those connections fit together.