From devoxx-voxxed-cfp
Answer questions about speakers, talks, and schedules for any Devoxx or VoxxedDays conference by querying the event's public CFP API at [event-slug].cfp.dev. Discovers event slugs via the devoxxians.com events API. Use whenever the user asks about a Devoxx or Voxxed speaker bio, company or socials, a talk or session topic, track, level or description, who is presenting, the program or agenda for a day, what is on in a room, which talks cover a topic, which Devoxx and VoxxedDays events are upcoming or past, or when an event's CFP (call for papers) opens or closes. Example triggers: who is speaking about Kubernetes at Devoxx UK, what is on Wednesday in Room 8, find AI talks at Voxxed Zurich, tell me about a speaker, most popular talks, when is the next Devoxx, when does the CFP open for Devoxx Belgium.
How this skill is triggered — by the user, by Claude, or both
Slash command
/devoxx-voxxed-cfp:devoxx-voxxed-cfpThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Answer the user's question by querying public, no-auth REST APIs. Each Devoxx and VoxxedDays event has its own CFP instance at `https://{event-slug}.cfp.dev/api/public`. Fetch live data with `curl` in the bash tool and parse JSON with `python3`. Never invent talk titles, times, rooms, or speaker facts — always pull from the API.
Answer the user's question by querying public, no-auth REST APIs. Each Devoxx and VoxxedDays event has its own CFP instance at https://{event-slug}.cfp.dev/api/public. Fetch live data with curl in the bash tool and parse JSON with python3. Never invent talk titles, times, rooms, or speaker facts — always pull from the API.
Discover events from the Devoxxians registry (no auth):
GET https://devoxxians.com/api/public/events/upcomingGET https://devoxxians.com/api/public/events/pastEach event has name (e.g. "Devoxx UK 2026"), eventCategory (DEVOXX or VOXXED), fromDate/toDate, location, website, and apiURL (e.g. https://devoxxuk26.cfp.dev/api/). The slug is the hostname prefix of apiURL — extract with re.match(r"https://([^.]+)\.cfp\.dev", apiURL).
Resolution rules:
name case-insensitively (fetch both lists; "Devoxx UK" without a year → prefer the nearest upcoming edition, else the most recent past one).apiURL can be null for announced events whose CFP isn't live yet (e.g. a next-year edition) — say so and fall back to the most recent edition that has an apiURL.Questions like "when is the next Devoxx" or "which Voxxed events are coming up" are answered directly from these two registry endpoints.
Base: https://{slug}.cfp.dev/api/public — all GET, no auth.
| Need | Endpoint |
|---|---|
| Event metadata + CFP open/close dates | /event |
| All talks (content) | /talks |
| All speakers (summary, paginated) | /speakers?page=N |
| One speaker + their talks | /speakers/{id} |
| Available schedule days | /schedules (returns day links — days VARY per event, never assume monday–friday) |
| Schedule for a day | /schedules/{day} |
| Rooms / Tracks | /rooms, /tracks |
Full field reference, gotchas, and worked curl+python3 recipes are in references/api.md — read it before composing a non-trivial query.
proposal.id equals a talk's id in /talks.speakers[] and a speaker's proposals[] link talks ↔ speakers./talks carries content (description, track, level, favourites) but its timeSlots is usually empty — get times and rooms from /schedules/{day}.Display times in the event's local timezone. Every schedule slot carries fromDate/toDate in UTC plus a timezone field (e.g. Europe/London, Europe/Brussels). Convert with zoneinfo:
from datetime import datetime
from zoneinfo import ZoneInfo
def local(ts, tz): return datetime.fromisoformat(ts.replace("Z","+00:00")).astimezone(ZoneInfo(tz)).strftime("%H:%M")
Every talk and every speaker referenced in an answer MUST be a clickable markdown link to https://m.devoxx.com, using the same event slug:
https://m.devoxx.com/events/{event-slug}/talks/{talkId}/{slug(title)} — e.g. Top 10 Event-Driven Architecture Pitfallshttps://m.devoxx.com/events/{event-slug}/speaker/{speakerId}/{slug(fullName)} (note: speaker, singular) — e.g. Victor RenteaRouting is by id (the trailing slug is cosmetic), but generate it properly:
import re
def slug(s): return re.sub(r"[^a-z0-9]+", "-", (s or "").lower()).strip("-")
Format as [Talk Title](url) and [Speaker Name](url) everywhere — including lists and schedule overviews. For event-level answers, link the event's website from the registry payload.
/speakers to find the id, then GET /speakers/{id} for bio + proposals./talks, case-insensitively match across title, summary, description, keywords[].name, track.name.GET /schedules for valid days, then /schedules/{day}, filter by room, sort by fromDate./talks by totalFavourites descending.GET /event and read cfpOpening/cfpClosing (UTC ISO). Compare to now to label open / closed / opens-later; an event whose apiURL is null has no CFP instance yet. The registry does NOT carry CFP dates — always use /event.Keep answers focused on what was asked. Every talk title and speaker name in the answer must be a markdown link per the linking rules above.
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub devoxx/devoxx-ai-skill --plugin devoxx-voxxed-cfp