# Devoxx Voxxed Cfp

> 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.

- Skill: `devoxx/devoxx-voxxed-cfp` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add devoxx/devoxx-voxxed-cfp`
- Raw SKILL.md: https://api.skillmd.com/api/skills/devoxx/devoxx-voxxed-cfp/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: devoxx (https://skillmd.com/u/devoxx)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/devoxx/devoxx-voxxed-cfp

---


# 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`:

```python
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](https://m.devoxx.com/events/dvbe25/talks/7729/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](https://m.devoxx.com/events/dvbe25/speaker/8101/victor-rentea)

Routing is by id (the trailing slug is cosmetic), but generate it properly:

```python
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 <speaker>" → page through `/speakers` to find the id, then `GET /speakers/{id}` for bio + proposals.
- "Who's speaking about <topic>" / "find <topic> talks" → fetch `/talks`, case-insensitively match across `title`, `summary`, `description`, `keywords[].name`, `track.name`.
- "What's on <day>" / "what's in <room>" → `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 <event>?" → 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.

