name: devoxx-voxxed-cfp description: > Use when the user asks about speakers, talks, schedules, or CFP dates for any Devoxx or VoxxedDays conference. Covers: speaker bios/socials, talk topics/tracks/levels, daily program or room agenda, most popular talks, upcoming or past events, and CFP open/close dates. Queries the public CFP API at [event-slug].cfp.dev and the devoxxians.com event registry. Example triggers: who speaks about Kubernetes at Devoxx UK, what is on Wednesday in Room 8, find AI talks at Voxxed Zurich, when does the CFP open for Devoxx Belgium. license: Apache-2.0
Devoxx / VoxxedDays — CFP 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.
Step 0 — resolve the event slug
Discover events from the Devoxxians registry (no auth):
GET https://devoxxians.com/api/public/events/upcomingGET https://devoxxians.com/api/public/events/past
Each 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:
- Match the user's event mention against
namecase-insensitively (fetch both lists; "Devoxx UK" without a year → prefer the nearest upcoming edition, else the most recent past one). - No event mentioned at all → use conversation context; if still ambiguous, ask which event (and offer the upcoming list).
apiURLcan 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 anapiURL.- Cache the slug for the rest of the conversation; don't re-resolve on every question.
Questions like "when is the next Devoxx" or "which Voxxed events are coming up" are answered directly from these two registry endpoints.
Per-event 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.
Key joins
- A schedule slot's
proposal.idequals a talk'sidin/talks. - A talk's
speakers[]and a speaker'sproposals[]link talks ↔ speakers. /talkscarries content (description, track, level, favourites) but itstimeSlotsis usually empty — get times and rooms from/schedules/{day}.
Times
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")
Linking to the public website (mandatory)
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:
- Talk:
https://m.devoxx.com/events/{event-slug}/talks/{talkId}/{slug(title)}— e.g. Top 10 Event-Driven Architecture Pitfalls - Speaker:
https://m.devoxx.com/events/{event-slug}/speaker/{speakerId}/{slug(fullName)}(note:speaker, singular) — e.g. Victor Rentea
Routing 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 every talk as [Talk Title](https://m.devoxx.com/events/{slug}/talks/{id}/{slug(title)}) and every speaker as [Speaker Name](https://m.devoxx.com/events/{slug}/speaker/{id}/{slug(name)}) — including in lists and schedule overviews. For event-level answers, link the event's website from the registry payload.
Answering patterns
- "Tell me about
" → page through /speakersto find the id, thenGET /speakers/{id}for bio + proposals. - "Who's speaking about
" / "find talks" → fetch /talks, case-insensitively match acrosstitle,summary,description,keywords[].name,track.name. - "What's on
" / "what's in " → GET /schedulesfor valid days, then/schedules/{day}, filter by room, sort byfromDate. - "Most popular talks" → sort
/talksbytotalFavouritesdescending. - "When/where is the next Devoxx or Voxxed event" → registry endpoints on devoxxians.com.
- "When does/did the CFP open or close?" / "is the CFP open for
?" → resolve the slug, then GET /eventand readcfpOpening/cfpClosing(UTC ISO). Compare to now to label open / closed / opens-later; an event whoseapiURLis 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.