Skip to content

Commit 71560a0

Browse files
hhkaosclaude
andcommitted
Upgrade sample data to OTE schema v0.3.0
Replace the generic sample events with a complete example: a GDG chapter running a monthly meetup series (August and September editions, linked via partOf) plus its annual conference, DevFest (call for papers, ticket tiers, waitlist), and a co-organized online workshop. Together they exercise the fields schema v0.3 added: organizers, image, location.address, offers, cfp, partOf and translations. ote.config.json now declares feed.organizers and feed.textLanguage, and profile defaults to "all" since the samples mix a meetup and a conference. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016oBwXtyuMrATqZcKPgn8hc
1 parent 3b25a25 commit 71560a0

9 files changed

Lines changed: 222 additions & 49 deletions

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,25 @@ update in: `git pull upstream main` (see the README's *Updates* section).
1212
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
1313
versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1414

15+
## [0.2.0] - 2026-08-07
16+
17+
Sample data upgraded to OTE schema [v0.3.0](https://github.com/OpenTechEvents/opentechevents-spec/blob/main/CHANGELOG.md).
18+
19+
### Changed
20+
- Replaced the generic sample events with a complete example: a GDG chapter
21+
running a monthly meetup series plus its annual conference, DevFest —
22+
`events/2026-08-monthly-meetup.json` and `events/2026-09-monthly-meetup.json`
23+
(two editions of the same series, linked via `partOf`),
24+
`events/2026-10-online-workshop.json` (co-organized) and
25+
`events/2026-11-devfest.json` (call for papers, ticket tiers, waitlist).
26+
Together they exercise the fields schema v0.3 added: `organizers`, `image`,
27+
`location.address`, `offers`, `cfp`, `partOf` and `translations`.
28+
- `ote.config.json`: `feed.organizers` and `feed.textLanguage` set for the
29+
sample community; `profile` defaults to `all` since the samples mix a
30+
meetup and a conference.
31+
- Bumped every sample event and the README's minimal-event example to
32+
`specVersion: "0.3.0"`.
33+
1534
## [0.1.0] - 2026-07-17
1635

1736
Phase 1 (MVP): fork → configure three values → a validated OTE feed with ICS/RSS

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ No lock-in: the ICS/RSS exports mean you can leave anytime and take everything w
1212
## What's in this repo
1313

1414
```
15-
├── events/*.json ← your events (one file per event)
15+
├── events/*.json ← your events (one file per event; the samples model
16+
│ a GDG chapter running monthly meetups plus its
17+
│ annual conference, DevFest)
1618
├── ote.config.json ← your configuration (feed title, description…)
1719
├── docs/index.html ← static dashboard (links to central tools)
1820
└── .github/workflows/ ← thin workflows calling reusable workflows
@@ -99,10 +101,10 @@ event. Use the samples as a starting point; the full field reference is at
99101

100102
```json
101103
{
102-
"specVersion": "0.2.0",
104+
"specVersion": "0.3.0",
103105
"id": "https://your-community.example/events/2026-09-meetup",
104106
"name": "September meetup",
105-
"startDate": "2026-09-24T19:00:00",
107+
"startDate": "2026-09-24T19:00",
106108
"timezone": "Europe/Madrid",
107109
"license": "CC0-1.0"
108110
}

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.0
1+
0.2.0

events/2026-08-monthly-meetup.json

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"specVersion": "0.3.0",
3+
"id": "https://gdgsamplecity.example/events/2026-08-meetup",
4+
"url": "https://gdgsamplecity.example/events/2026-08-meetup",
5+
"name": "GDG Sample City — August Meetup",
6+
"description": "Lightning talks on Cloud Run and serverless on GCP, plus networking.\n\n18:30 Doors · 19:00 Talks · 20:30 Networking",
7+
"image": [
8+
{
9+
"url": "https://gdgsamplecity.example/img/2026-08-16x9.png",
10+
"alt": "Meetup poster on a blue background with the GDG Sample City logo and the date, 27 August, 19:00"
11+
}
12+
],
13+
"organizers": [
14+
{ "name": "GDG Sample City", "url": "https://gdgsamplecity.example", "email": "hello@gdgsamplecity.example" }
15+
],
16+
"startDate": "2026-08-27T19:00",
17+
"endDate": "2026-08-27T21:00",
18+
"timezone": "Europe/Madrid",
19+
"attendanceMode": "hybrid",
20+
"location": {
21+
"venue": "The Hub, Calle Ejemplo 1, Madrid",
22+
"address": {
23+
"street": "Calle Ejemplo 1",
24+
"locality": "Madrid",
25+
"postalCode": "28001",
26+
"country": "ES"
27+
},
28+
"onlineUrl": "https://meet.example/gdg-samplecity",
29+
"geo": { "lat": 40.4168, "lon": -3.7038 }
30+
},
31+
"languages": ["en"],
32+
"tags": ["cloud", "gcp", "serverless"],
33+
"offers": [
34+
{ "price": 0, "url": "https://gdgsamplecity.example/events/2026-08-meetup#rsvp" }
35+
],
36+
"status": "scheduled",
37+
"license": "CC0-1.0",
38+
"updatedAt": "2026-08-07T09:00:00Z",
39+
40+
"_comment_partOf": "Same series id as the September edition — this is the previous occurrence. Each edition is its own document; `partOf` only groups them, it never generates future dates.",
41+
42+
"partOf": {
43+
"id": "https://gdgsamplecity.example/events/monthly-meetup",
44+
"name": "GDG Sample City — monthly meetup",
45+
"url": "https://gdgsamplecity.example/events/monthly-meetup"
46+
}
47+
}

events/2026-09-monthly-meetup.json

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,47 @@
11
{
2-
"specVersion": "0.2.0",
3-
"id": "https://sample-community.example/events/2026-09-monthly-meetup",
4-
"url": "https://sample-community.example/events/2026-09-monthly-meetup",
5-
"name": "Sample Community — September meetup",
2+
"specVersion": "0.3.0",
3+
"id": "https://gdgsamplecity.example/events/2026-09-meetup",
4+
"url": "https://gdgsamplecity.example/events/2026-09-meetup",
5+
"name": "GDG Sample City — September Meetup",
66
"description": "Two talks and networking.\n\n18:30 Doors · 19:00 Talks · 20:30 Networking",
7-
"startDate": "2026-09-24T19:00:00",
8-
"endDate": "2026-09-24T21:00:00",
7+
"image": [
8+
{
9+
"url": "https://gdgsamplecity.example/img/2026-09-16x9.png",
10+
"alt": "Meetup poster on a blue background with the GDG Sample City logo and the date, 24 September, 19:00"
11+
}
12+
],
13+
"organizers": [
14+
{ "name": "GDG Sample City", "url": "https://gdgsamplecity.example", "email": "hello@gdgsamplecity.example" }
15+
],
16+
"startDate": "2026-09-24T19:00",
17+
"endDate": "2026-09-24T21:00",
918
"timezone": "Europe/Madrid",
1019
"attendanceMode": "hybrid",
1120
"location": {
1221
"venue": "The Hub, Calle Ejemplo 1, Madrid",
13-
"onlineUrl": "https://meet.example/sample-community",
22+
"address": {
23+
"street": "Calle Ejemplo 1",
24+
"locality": "Madrid",
25+
"postalCode": "28001",
26+
"country": "ES"
27+
},
28+
"onlineUrl": "https://meet.example/gdg-samplecity",
1429
"geo": { "lat": 40.4168, "lon": -3.7038 }
1530
},
16-
"languages": ["es"],
17-
"tags": ["web", "javascript"],
31+
"languages": ["en"],
32+
"tags": ["android", "cloud", "web"],
33+
"offers": [
34+
{ "price": 0, "url": "https://gdgsamplecity.example/events/2026-09-meetup#rsvp" }
35+
],
1836
"status": "scheduled",
19-
"license": "CC0-1.0"
37+
"license": "CC0-1.0",
38+
"updatedAt": "2026-08-01T09:00:00Z",
39+
40+
"_comment_partOf": "One occurrence of a monthly series, not the series itself — the feed carries one document per edition. `partOf` only says which set this belongs to; it doesn't generate future dates.",
41+
42+
"partOf": {
43+
"id": "https://gdgsamplecity.example/events/monthly-meetup",
44+
"name": "GDG Sample City — monthly meetup",
45+
"url": "https://gdgsamplecity.example/events/monthly-meetup"
46+
}
2047
}
Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,30 @@
11
{
2-
"specVersion": "0.2.0",
3-
"id": "https://sample-community.example/events/2026-10-online-workshop",
4-
"url": "https://sample-community.example/events/2026-10-online-workshop",
5-
"name": "Hands-on workshop: Git for contributors",
6-
"description": "Practical online workshop: branches, pull requests and review flow. Bring a laptop with Git installed.",
7-
"startDate": "2026-10-08T18:00:00",
8-
"endDate": "2026-10-08T20:00:00",
2+
"specVersion": "0.3.0",
3+
"id": "https://gdgsamplecity.example/events/2026-10-workshop-compose",
4+
"url": "https://gdgsamplecity.example/events/2026-10-workshop-compose",
5+
"name": "Hands-on workshop: Jetpack Compose basics",
6+
"description": "Practical online workshop building a small Android UI with Jetpack Compose. Bring a laptop with Android Studio installed.",
7+
"image": ["https://gdgsamplecity.example/img/2026-10-workshop.png"],
8+
9+
"_comment_organizers": "Co-organized with a sibling community — a common pattern for chapter-to-chapter workshops. The first entry is the primary organizer; it's the only one that survives export to iCal.",
10+
11+
"organizers": [
12+
{ "name": "GDG Sample City", "url": "https://gdgsamplecity.example", "email": "hello@gdgsamplecity.example" },
13+
{ "name": "Women Techmakers Sample City", "url": "https://wtm-samplecity.example" }
14+
],
15+
"startDate": "2026-10-08T18:00",
16+
"endDate": "2026-10-08T20:00",
917
"timezone": "Europe/Madrid",
1018
"attendanceMode": "online",
1119
"location": {
12-
"onlineUrl": "https://meet.example/sample-community-workshop"
20+
"onlineUrl": "https://meet.example/gdg-samplecity-workshop"
1321
},
14-
"languages": ["es", "en"],
15-
"tags": ["git", "open-source"],
22+
"languages": ["en"],
23+
"tags": ["android", "compose"],
24+
"offers": [
25+
{ "price": 0, "url": "https://gdgsamplecity.example/events/2026-10-workshop-compose#rsvp" }
26+
],
1627
"status": "scheduled",
17-
"license": "CC0-1.0"
28+
"license": "CC0-1.0",
29+
"updatedAt": "2026-08-01T09:00:00Z"
1830
}

events/2026-11-devfest.json

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
{
2+
"specVersion": "0.3.0",
3+
"id": "https://gdgsamplecity.example/devfest/2026",
4+
"url": "https://gdgsamplecity.example/devfest/2026",
5+
"name": "DevFest Sample City 2026",
6+
"description": "Our annual community conference. Two days, three tracks, all levels welcome.",
7+
"image": ["https://gdgsamplecity.example/img/2026-devfest-16x9.png"],
8+
"organizers": [
9+
{ "name": "GDG Sample City", "url": "https://gdgsamplecity.example", "email": "hello@gdgsamplecity.example" }
10+
],
11+
"startDate": "2026-11-13",
12+
"endDate": "2026-11-14",
13+
"timezone": "Europe/Madrid",
14+
"attendanceMode": "in-person",
15+
"location": {
16+
"venue": "Palacio de Congresos, Valencia",
17+
"address": {
18+
"street": "Avenida de Ejemplo 60",
19+
"locality": "Valencia",
20+
"postalCode": "46015",
21+
"country": "ES"
22+
}
23+
},
24+
"languages": ["en"],
25+
"tags": ["cloud", "ai", "android", "web"],
26+
27+
"_comment_offers": "Early bird sold out before its own deadline — `availability` is the live state, `closesAt` is just the advertised cutoff, and the two don't have to line up. The free student tier is also sold out, but with a `waitlistUrl`: a consumer that doesn't understand the field still reads the true 'sold out', while one that does can offer the waitlist.",
28+
29+
"offers": [
30+
{
31+
"name": "Early bird",
32+
"price": 30,
33+
"currency": "EUR",
34+
"url": "https://gdgsamplecity.example/devfest/2026/tickets",
35+
"availability": "sold-out",
36+
"closesAt": "2026-07-15T23:59:59+02:00"
37+
},
38+
{
39+
"name": "General",
40+
"price": 45,
41+
"currency": "EUR",
42+
"url": "https://gdgsamplecity.example/devfest/2026/tickets",
43+
"availability": "in-stock",
44+
"opensAt": "2026-07-16T00:00:00+02:00"
45+
},
46+
{
47+
"name": "Student",
48+
"price": 0,
49+
"url": "https://gdgsamplecity.example/devfest/2026/tickets#student",
50+
"availability": "sold-out",
51+
"waitlistUrl": "https://gdgsamplecity.example/devfest/2026/waitlist"
52+
}
53+
],
54+
"cfp": {
55+
"url": "https://gdgsamplecity.example/devfest/2026/cfp",
56+
"opensAt": "2026-06-01T00:00:00+02:00",
57+
"closesAt": "2026-09-15T23:59:59+02:00",
58+
"coversTravel": true,
59+
"coversAccommodation": true
60+
},
61+
"status": "scheduled",
62+
"license": "CC0-1.0",
63+
"updatedAt": "2026-08-01T09:00:00Z",
64+
65+
"_comment_partOf": "DevFest Sample City happens every year; this document is the 2026 occurrence. `partOf` points at the series so a consumer can group past and future editions without the feed encoding a recurrence rule.",
66+
67+
"partOf": {
68+
"id": "https://gdgsamplecity.example/devfest",
69+
"name": "DevFest Sample City",
70+
"url": "https://gdgsamplecity.example/devfest"
71+
},
72+
"translations": {
73+
"es": {
74+
"name": "DevFest Sample City 2026",
75+
"description": "Nuestra conferencia anual de comunidad. Dos días, tres tracks, para todos los niveles."
76+
}
77+
}
78+
}

events/2026-11-sample-conf.json

Lines changed: 0 additions & 18 deletions
This file was deleted.

ote.config.json

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33

44
"_comment_feed": "Metadata for your published feed (feed.json, ICS, RSS). Edit these three values after forking.",
55
"_comment_license": "License of your event DATA (not of the events themselves). Recommended: CC0-1.0 (public domain, most permissive — anyone can republish, default) or CC-BY-4.0 (requires attribution). Any SPDX identifier or URL works.",
6+
"_comment_organizers": "Who organizes your events, by default. Every event in events/*.json inherits this list unless it declares its own (which then REPLACES it, not merges — see the co-organized workshop example). Optional, but a feed without it can't be attributed by consumers.",
7+
"_comment_textLanguage": "The language your feed's free text (title, description, and your events' name/description) is written in. Declared once here so events don't have to repeat it — only needed if you use `translations`.",
68
"feed": {
7-
"title": "Sample Tech Community Events",
8-
"description": "Talks, workshops and meetups organised by Sample Tech Community.",
9-
"url": "https://sample-community.example",
10-
"license": "CC0-1.0"
9+
"title": "GDG Sample City Events",
10+
"description": "Monthly meetups and DevFest Sample City, organised by GDG Sample City.",
11+
"url": "https://gdgsamplecity.example",
12+
"license": "CC0-1.0",
13+
"textLanguage": "en",
14+
"organizers": [
15+
{ "name": "GDG Sample City", "url": "https://gdgsamplecity.example", "email": "hello@gdgsamplecity.example" }
16+
]
1117
},
1218

13-
"_comment_profile": "Which fields the central editor shows. Presets: 'meetup' (no CFP/sponsor fields) | 'conference' | 'all'. Used from phase 2 onwards; harmless until then.",
14-
"profile": "meetup"
19+
"_comment_profile": "Which fields the central editor shows. Presets: 'meetup' (no CFP/sponsor fields) | 'conference' | 'all'. Used from phase 2 onwards; harmless until then. The sample events mix a monthly meetup with an annual conference (DevFest), so this template defaults to 'all'.",
20+
"profile": "all"
1521
}

0 commit comments

Comments
 (0)