Add a sponsor to an event
Sponsors are global, not per-event. data/sponsors/<id>.yml and
assets/sponsors/<first-char>/<id>.png are shared by every event that has ever listed that
sponsor. An event references a sponsor by id and level.
This matters: creating a duplicate sponsor entry when one already exists is the most common
mistake here, and it fragments the shared directory.
Gather
- Event: year and city (→
<YYYY> and <city-slug>, e.g. 2026 / boston)
- Sponsor name as it should read
- Sponsorship level
- Sponsor URL, and whether this event needs its own tracking URL
- A logo, only if the sponsor is not already in the directory
1. Check whether the sponsor already exists — always do this first
ls data/sponsors/ | grep -i <name-fragment>
Search loosely. thoughtworks-gocd, ibmcode, and redhat are all real ids that a plain name
search would miss. Also look for date-suffixed variants like pivotal-before-20190115.yml —
those are historical entries kept so past events keep their old logo. Never point a current
event at a -before- entry.
If it exists with the right name and URL, go to step 3 — you do not need a logo, a data file, or
any change under assets/.
2. Only if it is genuinely new
Pick the id: lowercase, alphanumeric and hyphens, no spaces. It becomes the filename in both
places and must match exactly.
Data file — data/sponsors/<id>.yml:
name: "Sponsor Display Name"
url: "https://sponsor.example.com"
twitter: is optional; add it without the @ if you have it. That is the whole schema.
Logo — assets/sponsors/<first-char>/<id>.png, where <first-char> is the first character
of the id (assets/sponsors/d/datadog.png). Create the shard directory if it does not exist.
Requirements:
- At least 200px wide; 600px looks right on high-density displays
- White or transparent background
- Square is not required but usually looks better
- Lowercase filename, or the
Lint Filenames CI job fails the PR
Do not put anything in static/img/sponsors/. A dedicated workflow
(.github/workflows/no-sponsors-changes.yml) hard-fails any PR that touches it.
3. Add the sponsor to the event
Edit data/events/<YYYY>/<city-slug>/main.yml.
Check sponsor_levels: first — the level you are adding must have a matching id: there, and if
that level has a max:, adding beyond it means the "Become a sponsor" link disappears for that
level. If the level does not exist yet, add it to sponsor_levels: too.
Then add to sponsors::
sponsors:
- id: cloudbees
level: bronze
If this event needs its own tracking URL, override it here rather than editing the shared sponsor
file — which would change the URL for every event that lists them:
- id: netapp
level: gold
url: https://netapp.com/?campaign=devopsdays-boston
Set sponsors_accepted: "yes" if the event wants the "Become a sponsor" links shown at all.
4. Verify
- The
id: in main.yml matches data/sponsors/<id>.yml exactly. A mismatch renders an empty
logo slot silently — nothing fails.
- The logo exists at
assets/sponsors/<first-char>/<id>.png. A missing one produces a Hugo
warning and falls back to the legacy static path.
- The
level: matches an id: under sponsor_levels:.
- Preview
/events/<YYYY>-<city-slug>/sponsor/ and confirm the logo renders at the right level.
5. Submit
Follow .claude/skills/submit-changes/SKILL.md.
PR title: [BOS-2026] Add CloudBees as a Bronze sponsor.
If a sponsor wants their logo changed
That is a different job with history-preservation rules — use
.claude/skills/change-sponsor-logo/SKILL.md. Do not simply overwrite the PNG; it would
retroactively rewrite years of past events.