| 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/upcoming
GET 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
name case-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).
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.
- 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.id equals a talk's id in /talks.
- A talk's
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}.
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:
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
/speakers to find the id, then GET /speakers/{id} for bio + proposals.
- "Who's speaking about " / "find talks" → fetch
/talks, case-insensitively match across title, summary, description, keywords[].name, track.name.
- "What's on " / "what's in " →
GET /schedules for valid days, then /schedules/{day}, filter by room, sort by fromDate.
- "Most popular talks" → sort
/talks by totalFavourites descending.
- "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 /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.