The same event, announced again and again
Your website, Meetup, LinkedIn, Instagram, X, several WhatsApp and Telegram groups… The same information on platforms where content can easily go unnoticed.
Open specification · Draft 0.x
OpenTechEvents (OTE) is an open, free specification to describe tech community events — meetups, conferences, workshops, online or in person — in a single format that directories, calendars and tools can read automatically. It brings together the best of iCalendar, RSS and schema.org/Event, and stays compatible with all of them: write it once and we help you export it automatically to all three. Four formats for the price of one.
No platform to sign up for. No tool to install: a file you publish, plus a line in your site's <head> so others can find it. Already use Meetup, Luma, Eventbrite…? We'll help you import it without leaving it →
events.json{
"specVersion" : "0.5.0",
"id" : "https://pyalmeria.example/2026-06-async",
"url" : "https://pyalmeria.example/2026-06-async",
"name" : "PyAlmería — Intro to async/await",
"organizers" : [{ "name" : "PyAlmería" }],
"startDate" : "2026-06-11T18:30",
"endDate" : "2026-06-11T20:30",
"timezone" : "Europe/Madrid",
"attendanceMode" : "hybrid",
"location" : {
"venue" : "El Cable, Almería",
"onlineUrl" : "https://meet.example/pyalmeria",
"geo" : { "lat" : 36.8381, "lon" : -2.4597 }
},
"eligibility" : { "type" : "open" },
"tags" : ["python", "async"],
"languages" : ["es"],
"status" : "scheduled",
"partOf" : { "id" : "https://pyalmeria.example/meetups" },
"license" : "CC-BY-4.0"
}
events.json{
"specVersion" : "0.5.0",
"id" : "https://devfest-levante.example/2026",
"url" : "https://devfest-levante.example/2026",
"name" : "DevFest Levante 2026",
"description" : "Dos días, tres tracks: cloud, IA y web.",
"image" : [
{ "url" : "https://devfest-levante.example/img/2026-16x9.png",
"alt" : "Cartel naranja con la fecha «16-17 oct» sobre la Ciudad de las Artes" }
],
"organizers" : [
{ "name" : "GDG Levante", "url" : "https://gdglevante.example" }
],
"startDate" : "2026-10-16",
"endDate" : "2026-10-17",
"timezone" : "Europe/Madrid",
"attendanceMode" : "in-person",
"location" : { "venue" : "Las Naves, Valencia" },
"tags" : ["cloud", "ai", "web"],
"languages" : ["es", "en"],
"textLanguage" : "es",
"offers" : [
{ "name" : "Early bird", "price" : 35, "currency" : "EUR", "availability" : "sold-out" },
{ "name" : "General", "price" : 45, "currency" : "EUR", "availability" : "in-stock",
"url" : "https://devfest-levante.example/2026/entradas" }
],
"cfp" : {
"url" : "https://devfest-levante.example/2026/cfp",
"closesAt" : "2026-07-15T23:59:59+02:00",
"coversTravel" : true
},
"status" : "scheduled",
"license" : "CC-BY-4.0",
"translations" : {
"en" : { "description" : "Two days, three tracks: cloud, AI and web." }
}
}
events.json{
"specVersion" : "0.5.0",
"title" : "PyAlmería — eventos",
"url" : "https://pyalmeria.example",
"organizers" : [{ "name" : "PyAlmería" }],
"license" : "CC-BY-4.0",
"updatedAt" : "2026-05-29T08:00:00Z",
"events" : [
{
"id" : "https://pyalmeria.example/2026-06-async",
"name" : "Intro to async/await",
"startDate" : "2026-06-11T18:30",
"timezone" : "Europe/Madrid"
},
{
"id" : "https://pyalmeria.example/2026-07-testing",
"name" : "Testing con pytest",
"startDate" : "2026-07-09T18:30",
"timezone" : "Europe/Madrid"
}
]
}
You organise one event. Then you announce it over and over, by hand, across several networks whose algorithms decide who even sees it. In today's attention economy, your message competes against all the noise — and you still miss half the people who would have come.
Your website, Meetup, LinkedIn, Instagram, X, several WhatsApp and Telegram groups… The same information on platforms where content can easily go unnoticed.
Event directories want to list you. But they'd have to find your event, or wait for you to submit a form, open a pull request, send an email, and so on… So they almost never do.
Venue moved. Speaker cancelled. New date. Now go update every single platform — or live with the stale copies out there.
There is no shortage of information about your events. What's missing is interoperability.
You describe your events in a simple JSON file and publish it at a stable URL. Anything that speaks OTE — directories, calendars, bots, websites — can then read it without asking you for anything.
A feed with your events at a URL you control, e.g. tucomunidad.dev/events.json. And you can list yourself in our directory so people find you.
Aggregators, directories and converters can pick it up on their own — and turn it into RSS, iCalendar or schema.org.
Each person chooses the tool they prefer — calendar, email, RSS, a Telegram or WhatsApp bot — and the filters they care about.
It's not just that people find you: the right people do. With those filters you reach whoever is interested in the event, not a generic feed.
A valid event needs little more than a name, a start date, a time zone and where it happens. Optional fields — price and tickets, call for proposals, images, series — cover the rest when you need them.
Careful, because we'd rather be straight with you: that draft — the core fields and the optional modules alike — has not been agreed yet. It's there to show the shape of the thing and to open the debate, and it will change. What we're asking you to adopt today is the idea, and to come and break it before it sets.
Read the data model{
"specVersion" : "0.5.0",
"id" : "https://pyalmeria.example/2026-06-async",
"name" : "PyAlmería — Intro to async/await",
"startDate" : "2026-06-11T18:30",
"timezone" : "Europe/Madrid",
"license" : "CC-BY-4.0"
}
Everything is public and in the open — including what's still undecided. The spec is at version 0.x: expect it to change, and expect your feedback to be what changes it.
Adopting OTE is under an hour of work the first time. After that, a couple of minutes per event you publish. Here's what it buys you.
Write the event once. Let tooling push it to directories, calendars and feeds instead of you copy-pasting it into yet another form.
Directories and aggregators will be able to pick up your events the moment you publish them, and reach each person in the channel they already use — not the one you happen to pick. Your meetup can show up where people are actually looking.
Google and other search engines read schema.org/Event to show event rich results: date, venue and price right there in the search results. OTE wasn't designed for SEO, but it maps onto that vocabulary almost 1:1 — so if you can touch your site's HTML, the same tooling that builds your feed will be able to generate the JSON-LD for you to paste in. One file, four destinations.
Your events live at your URL, in an open format. If a platform shuts down, changes its API or its pricing, your history and your feed are still yours.
Because OTE is an open spec owned by the community itself, it has the potential for a whole ecosystem of free, open integrations. Every new tool built on it — an .ics export, a website widget, a Telegram bot — works for you without you lifting a finger.
Change the date in one place and every consumer that re-reads your feed gets the correction. No more zombie listings with stale information.
The spec is in draft. Early adopters decide what it looks like — if something doesn't fit your community, it can still be changed.
Three steps. The first one is the only one that takes real work, and it's a text file.
Create a JSON file with your events and host it anywhere you already publish — your site, GitHub Pages, a gist. The fastest path? The organizer kit: a ready-made repository to publish in minutes, with OTE, ICS and RSS feeds already wired up. And if your events live in a Google Calendar or Meetup, we'll help you import them to generate the feed.
https://tucomunidad.dev/events.json{
"specVersion" : "0.5.0",
"title" : "PyAlmería events",
"url" : "https://tucomunidad.dev",
"organizers" : [{ "name" : "PyAlmería" }],
"license" : "CC-BY-4.0",
"updatedAt" : "2026-05-29T08:00:00Z",
"events" : [
{
"id" : "https://tucomunidad.dev/2026-06-async",
"name" : "Intro to async/await",
"startDate" : "2026-06-11T18:30",
"timezone" : "Europe/Madrid",
"tags" : ["python", "async"]
}
]
}
A feed without cross-origin access is still valid, and server-side consumers read it fine — but a browser-based reader, an embeddable widget or a static directory can't fetch it at all. So a public OTE feed should answer with Access-Control-Allow-Origin: *. That's what lets any present or future OTE tool consume your feed without you having to know about it first.
/events.jsonAccess-Control-Allow-Origin : *
Access-Control-Allow-Methods : GET, HEAD, OPTIONS
This is about the feed file, not your whole site: it's a recommendation for the public feed resource, not a reason to open up your website or your API. And because the feed is public, it must never depend on cookies or credentials — Access-Control-Allow-Credentials is neither needed nor wanted here (and is incompatible with * anyway).
Add one line to the <head> of your website so tools can find the feed on their own — the same way RSS readers do.
<link rel ="alternate"
type ="application/ote+json"
href ="https://tucomunidad.dev/events.json">
Open an issue with your feed URL. We'll validate it and list your community on this page; and as aggregators come online, they'll start picking up your events.
Optional: add the feed badge to your README or site footer — a visible, RSS-style signal that you publish OTE, next to the machine-readable one from step 2.
Communities and events already exposing their data in this format.
The spec is brand new, so this list is still short. Be one of the first — early adopters get a say in what the standard becomes.
Be the firstThis list is data, not markup: it renders adopters.json, a machine-readable registry you can build on. See the developer docs.
Directories, aggregators and people reusing feeds published in this format. Every one of them is another place your events will be able to reach for free.
Building a directory, a newsletter or a bot? Consume OTE feeds and get listed here.
What exists today, and what's up for grabs. Claim one by opening an issue.
Publishing a feed is the biggest step, and it isn't the first one. A spec this early needs people who break it, people who talk about it, and people who say out loud that they'd use it — that last one is what makes a directory decide the format is worth reading. Pick whichever costs you least.
Prefer talking to writing? Book twenty minutes — and if no slot suits you, say so in a discussion and we'll find one.
Already backing it? Put a badge in your README — it's the cheapest way to tell the next community this exists.
Nobody listed here yet — the honest state of a project this young. Being early is visible: this list is short, and it's public.
Add your nameThis list is data too: it renders supporters.json. Pledges, endorsements, ambassadors and offers of help — listed separately from who already publishes, because promising and shipping are not the same thing.
Every community that publishes an OTE feed makes the format more useful for every other community — and for everyone trying to find your events.