How to Set Up Brand Logos

Add your logo to a theme so it appears automatically on every slide — with control over position, size, and different variants for light and dark backgrounds.

Quick setup with the CLI

The simplest way to add a logo to a theme:

agentpreso themes add ./my-theme/ \
  --logo ./logo.svg \
  --logo-position bottom-right \
  --logo-size small

Or update an existing theme:

agentpreso themes update my-brand --logo ./logo.svg

Add light and dark variants

If your slides use both light and dark backgrounds, provide two logo versions:

agentpreso themes add ./my-theme/ \
  --logo ./logo-dark.svg \
  --logo-light ./logo-white.svg \
  --logo-position bottom-right \
  --logo-size medium
  • Primary logo (--logo) — for light backgrounds (typically a dark/colored logo)
  • Light variant (--logo-light) — for dark backgrounds (typically a white/light logo)

The variant property in placement rules controls which is used per slide type.

Choose a position

Logos can be placed in 9 positions:

+------------+------------+------------+
| top-left   | top-center | top-right  |
+------------+------------+------------+
| left-center|   center   |right-center|
+------------+------------+------------+
|bottom-left |bottom-center|bottom-right|
+------------+------------+------------+

Set via the CLI flag:

agentpreso themes update my-brand --logo-position top-left

Recommended placements:

Slide typePositionWhy
Content slidesbottom-rightUnobtrusive, professional standard
Title slidestop-left or centerProminent brand presence
Section dividersnone or bottom-centerClean, focused
Dark slidesSame position, light variantConsistent placement

Choose a size

Preset sizes:

SizeHeight
small40px
medium80px
large120px

Custom dimensions:

agentpreso themes add ./my-theme/ --logo ./logo.svg --logo-size 80x40

Width and height maintain aspect ratio if only one is specified.

agentpreso themes add ./my-theme/ --logo ./logo.svg --logo-pages content
OptionShows logo on
allEvery slide
firstFirst slide only
lastLast slide only
first-and-lastFirst and last slides
contentAll slides except first and last

Advanced: per-slide-type rules

For fine-grained control, use a JSON placement configuration. Different slide types (based on their _class directive) get different logo behavior:

{
  "default": {
    "position": "bottom-right",
    "size": "small",
    "opacity": 0.9,
    "margin": 16
  },
  "title-hero": {
    "position": "top-left",
    "size": "large",
    "margin": { "top": 40, "left": 60 }
  },
  "chapter": {
    "position": "bottom-center",
    "size": "medium",
    "opacity": 0.5
  },
  "quote": {
    "position": "none"
  },
  "full-bleed": {
    "position": "bottom-right",
    "size": "small",
    "variant": "light",
    "opacity": 0.9
  }
}

Apply via CLI:

# From a file
agentpreso themes add ./my-theme/ \
  --logo ./logo.svg \
  --logo-light ./logo-white.svg \
  --logo-placement ./logo-rules.json

# Inline
agentpreso themes update my-brand --logo-placement-json '{
  "default": {"position": "bottom-right", "size": "small"},
  "title-hero": {"position": "top-left", "size": "large"}
}'

Placement rule properties

PropertyTypeDescription
positionstringOne of the 9 positions, or none to hide
sizestring or objectsmall, medium, large, or { "width": N, "height": N }
opacitynumber0.0 to 1.0 (default: 1.0)
marginnumber or objectPixels from edge — single number or { "top", "right", "bottom", "left" }
variantstring"default" or "light" — which logo asset to use

The default rule is required. Other rules are optional overrides for specific slide classes.

Set up logos via the API

# Upload the logo file
LOGO_ID=$(curl -X POST https://api.agentpreso.com/api/assets \
  -H "Authorization: Bearer ap_..." \
  -F "[email protected]" \
  | jq -r '.data.id')

# Create theme with logo
curl -X POST https://api.agentpreso.com/api/themes \
  -H "Authorization: Bearer ap_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-brand",
    "css": "...",
    "logoAssetId": "'$LOGO_ID'",
    "logoPlacement": "{\"default\":{\"position\":\"bottom-right\",\"size\":\"small\"}}"
  }'

Set up logos via MCP

{
  "name": "create_theme",
  "arguments": {
    "name": "my-brand",
    "css": "...",
    "logoAssetId": "asset_abc123",
    "logoLightAssetId": "asset_def456",
    "logoPlacement": "{\"default\":{\"position\":\"bottom-right\",\"size\":\"small\"},\"title-hero\":{\"position\":\"top-left\",\"size\":\"large\"}}"
  }
}

Best practices

  • Use SVG for logos — they render crisp at any size
  • Small (40px) for content slides — subtle, professional
  • Provide both variants if your deck uses dark backgrounds or full-bleed layouts
  • Hide on quote slides"quote": { "position": "none" } keeps the focus on the quote
  • Consistent margins — use the same margin value across all rules for alignment