name: add-event description: Add a new event (or speaker) to the OpenAPI events site by creating data/<slug>/event.yml, with speaker avatars and the event image converted to repo-hosted WebP. Use when asked to add/create a new event, conference, masterclass, or talk to the site, or to add a speaker to an existing event.
Add an event to the OpenAPI events site
Each event is its own file: data/<event-slug>/event.yml (one event per
file, discovered and bundled at build time, typed by EventItem in
lib/events.ts). Adding an event = creating that file and hosting its
images locally via the convert-image skill.
Steps
-
Gather the details from the user (title, dates, location, type, times, description, speakers, image). Ask for anything missing — especially the event image and each speaker photo (local path or URL).
-
Convert every image to a repo-hosted WebP with the
convert-imageskill /npm run img. Images are stored per event underpublic/img/events/<event-slug>/. Do not put remote URLs (unsplash/pravatar) into new entries — host them locally.Preferred — batch the inbox. Have the user drop raw files into
source-images/<event-slug>/(gitignored): the event image namedcover.*, each speaker file named after the speaker (jane-doe.jpg), optionalgallery/subfolder. Then:npm run img -- --event <event-slug> --allOr one image at a time (path or URL):
npm run img -- "<url-or-path>" --event <event-slug> --kind cover npm run img -- "<url-or-path>" --event <event-slug> --kind avatar --name jane-doeUse the printed
/img/events/<event-slug>/...paths as the field values. -
Create
data/<event-slug>/event.ymlwith the schema below (a single YAML mapping — no leading-, since it's one event per file). -
Ordering (optional). Events are listed by date by default (upcoming soonest-first, past most-recent-first). To pin a specific order, add the slug to
data/events.order.yml— that file is the primary order source; anything not listed falls back to date order. -
Verify:
npm run typecheckthennpm run build(must emitout/cleanly).
Schema — data/<slug>/event.yml
Required fields:
title: 'API Days Tokyo' # display name
slug: api-days-tokyo # MUST equal the folder name; used in the URL
event_date: 'October 14 — 15, 2026' # human string; em dash (—) for ranges
location: 'Tokyo International Forum, Japan'
type: 'Event' # 'Event' | 'Conference' | 'Masterclass'
status: 'upcoming' # 'active' (featured) | 'upcoming' | 'finished'
image: '/img/events/api-days-tokyo/cover.webp' # repo-hosted WebP from step 2
time_start: '09:00'
time_end: '17:00'
description: 'One-line summary of the event.'
permalink: '/events/api-days-tokyo' # must be '/events/' + slug
speakers: # [] if none (e.g. past events)
- name: Jane Doe
position: 'Staff Engineer | Acme'
photo: '/img/events/api-days-tokyo/speakers/jane-doe.webp' # from step 2
tags: [event] # lowercase of type, e.g. [conference]
Optional detail-page fields (omit if not known yet):
metaTitle: 'API Days Tokyo' # SEO title override
metaDescription: 'Join us at API Days Tokyo'
sponsors:
- name: boomi
agenda: # event-page schedule: date -> category -> sessions
'October 14':
'Opening and keynote':
- title: 'Welcome'
time: '09:00 — 09:25'
permalink: /events/talks/tokyo-welcome # optional, links to a talk below
speakers:
- name: Jane Doe
position: 'Staff Engineer | Acme'
photo: '/img/events/api-days-tokyo/speakers/jane-doe.webp'
tag: OAI # optional badge
talks: # individual talk pages at /events/talks/<slug>
- slug: tokyo-welcome
title: 'Welcome'
description: 'Full talk description.'
time: 'October 14, 09:00 — 09:25'
category: 'Opening and keynote'
speakers:
- name: Jane Doe
position: 'Staff Engineer | Acme'
photo: '/img/events/api-days-tokyo/speakers/jane-doe.webp'
schedule: # sidebar day schedule on the talk page
- { time: '09:00', title: 'Welcome', permalink: /events/talks/tokyo-welcome }
talks[] do not repeat the event title/date — those are derived from the parent.
Field rules
- slug — unique kebab-case, equal to the folder name;
permalinkmust be/events/<slug>. For yearly past editions, suffix the year (e.g.api-days-tokyo-2025). - status —
activerenders as the featured card;upcomingis a normal upcoming card;finishedshows on the past-events page. - type / tags —
tagsis the lowercasedtypein a list:Event→[event],Conference→[conference],Masterclass→[masterclass]. - speakers —
[]when none. Each needsname,position, localphoto. - event_date — uses an em dash
—(not hyphen) for ranges; match existing rows.
Adding a speaker to an existing event
Convert the avatar into that event's folder
(npm run img -- "<url-or-path>" --event <event-slug> --kind avatar --name <speaker-slug>),
then add an entry to that event's speakers: list in
data/<event-slug>/event.yml with the printed /img/events/<event-slug>/speakers/...
path. No new file.
After adding
Confirm it validates (npm run typecheck / npm run build) and tell the user
the event URL (/events/<slug>). Both deploy targets pick it up: the GitHub
Pages build and the Cloudflare Worker build both bundle every event.yml.
Content Repurposer
Content
Transforms a single piece of content into platform-adapted publications.
SEO Blog Post Writer
Content
Writes SEO-optimized blog posts with proper structure and keywords.
YouTube Script Writer
Content
Writes engaging YouTube scripts with hooks, structure, and retention.