Notifications
You're all caught up.
Swap
From
To
Slippage

Banner Studio

Publish background-free versions of your art and your holders can build banners, wallpapers and profile pictures from your NFTs in the Flex Machine. You host the images and a small JSON file describing them; downbad stores only the link, so your art stays yours and updates are instant.

How it works

  1. Export your art with the background removed, and host it yourself.
  2. Go to Creator Tools → your collection → Banner Studio and tell us where the art lives. We write and host the manifest for you.
  3. Holders get a Banner tab in the Flex Machine with your art in it.

downbad never copies, resizes or re-hosts your images — only the small JSON file describing where they are. Change a file on your side and the change is live immediately.

If your filenames don't follow a pattern, or you want options the form doesn't cover, you can write the manifest yourself and give us the URL instead. The rest of this page is that format.

Letting us build it

Most projects name their art after a number in the NFT's name or after the asset id. If yours does, you never need to touch JSON — give us the pattern and we resolve it against your actual assets:

https://cdn.example.com/art/{number}.png     <- "Lost Pigs 0414" becomes 414
https://cdn.example.com/art/{asset_id}.png   <- the Algorand asset id

Before publishing you'll see how many of your NFTs matched, which ones didn't and why, and a preview of the real art loaded on a canvas — so a wrong pattern is obvious rather than something holders discover. Numbers can be zero-padded if your filenames and names disagree, which is common.

Overlays go in the same form: a name, an image URL, and whether holders-only. You can come back and edit any of it later.

We host the generated manifest, and every save gets a fresh URL, so your changes are never held up by a stale cache. Your images stay entirely on your own hosting, with the same CORS requirement below.

Hosting requirements

These apply to the manifest and to every image it points at.

  • https, publicly readable, no authentication and no signed or expiring URLs — requests come from your visitors' browsers, not from us.
  • CORS enabled. Send Access-Control-Allow-Origin — either * or at least https://downbad.farm, https://www.downbad.farm and https://market.downbad.farm.
  • Cutouts and stickers must be PNG or WebP with a real alpha channel. A JPEG cutout is a rectangle.
  • Manifest at most 2MB; each image at most 4MB.
CORS is the one that catches people out. Your image will open perfectly in a browser tab and still fail here, because the studio has to read the pixels to build a PNG. The validator on the creator page proves it by actually drawing your image to a canvas and reading it back — if that passes, exports work.

Recommended: at least 1000px on the long edge, and a long cache-control on versioned filenames.

Give the manifest a new filename every time you change it — something like banner-manifest-a1b2c3.json — and update the URL here. If you keep overwriting one name, your CDN and your holders' browsers will serve the old version for as long as its cache lasts, and your changes will look like they did nothing. A fresh name is never cached, so it appears instantly and can carry a year-long cache-control.

The manifest

One JSON file describing where your art lives. Point your editor at the JSON schema and it will validate as you type.

{
  "$schema": "https://downbad.farm/schemas/banner-manifest-v1.json",
  "version": 1,
  "name": "Down Bad Gorillas",
  "cutouts": {
    "type": "template",
    "url": "https://art.gorillas.xyz/cutouts/{asset_id}.png"
  },
  "overlays": [
    {
      "id": "jungle",
      "name": "Jungle",
      "url": "https://art.gorillas.xyz/overlays/jungle.jpg",
      "kind": "background",
      "group": "Backdrops"
    },
    {
      "id": "party-hat",
      "name": "Party hat",
      "url": "https://art.gorillas.xyz/overlays/party-hat.png",
      "group": "Accessories",
      "default_scale": 0.18
    }
  ]
}
version1requiredManifest format version.
cutoutsobjectrequiredWhere your background-free art lives. See below.
overlaysarrayoptionalExtra art holders can add to the canvas. Up to 200.
namestringoptionalShown as the source credit. Max 80 characters.
updated_attimestampoptionalInformational only.

Unknown top-level fields are rejected rather than ignored, so a typo is caught instead of silently doing nothing.

Cutouts

Two ways to describe them. Use a template if your filenames are predictable — it keeps the manifest tiny, and the file is downloaded by everyone who opens the tab.

"cutouts": {
  "type": "template",
  "url": "https://cdn.example.com/cutouts/{asset_id}.png",
  "coverage": "all"
}
urlhttps URLrequiredMust contain {asset_id}, the Algorand ASA id. It is the only placeholder — asset ids are the one identifier already loaded everywhere in the app, so anything else would cost an extra request per NFT.
coverage"all" | "listed"optionalDefaults to all. Use listed plus an available array of asset ids when only some assets have cutouts.
overridesobjectoptionalPer-asset URLs that win over the template — handy for fixing one bad export.
trimbooleanoptionalDefaults to true: transparent margins are cropped on load so the art sits where holders expect.

If your filenames don't follow a pattern, list them explicitly instead:

{
  "type": "map",
  "assets": {
    "1234567": "https://art.gorillas.xyz/cutouts/gorilla-1.png",
    "1234568": "https://art.gorillas.xyz/cutouts/gorilla-2.webp"
  }
}

A 10,000-entry map is roughly 600KB that every visitor downloads. Prefer a template where you can; the validator warns past ~200KB.

Overlays

Extra art holders can drop onto the canvas — hats, speech bubbles, logos, backdrops, borders. By default an overlay is locked unless the visitor holds one of your NFTs, and locked art is still shown, so people see what they'd get.

idstringrequiredLowercase letters, digits, hyphens or underscores. Unique within your manifest.
namestringrequiredShown in the picker. Max 60 characters.
urlhttps URLrequiredThe image.
kind"sticker" | "background" | "frame"optionalDefaults to sticker. See below.
groupstringoptionalGroups entries into sections in the picker, e.g. "Accessories".
default_scalenumberoptionalStarting width as a fraction of the canvas, 0–1. Defaults to 0.3.
gateobjectoptional{"type":"holder"} (default) or {"type":"public"} to let anyone use it.
  • sticker — drag, scale, rotate and flip freely. Needs transparency.
  • background — fills the canvas behind everything. A JPEG is fine here.
  • frame — fills the canvas in front of everything, so it needs a transparent middle or it hides the art.
The lock is a courtesy, not a security control. Your manifest and images are public URLs — anyone determined can fetch them directly. Don't put anything behind it you'd mind being taken.

Validating

The creator page checks all of this before it will let you save:

  • Your manifest is reachable from a browser, with CORS.
  • It parses and matches the schema, with errors pointing at the exact field.
  • Every overlay and a sample of cutouts load, decode, and survive being drawn to a canvas.
  • Cutouts and frames actually have transparent pixels.
  • Warnings you can ignore: oversized files, low resolution, a large manifest.

Nothing is stored except the URL, so if something breaks later the Banner tab quietly disappears for your collection rather than showing holders errors.

Getting set up

Head to Creator Tools, pick your collection, and open Banner Studio. It's available on every collection — if you can't see it, you're most likely not listed as a manager of that collection yet. Get in touch and we'll add you.