Skip to content

Commit 26cc1a6

Browse files
hhkaosclaude
andcommitted
Redesign fork lifecycle: one file owner, upstream or fork
Restructure around a single principle: every file has exactly one owner, upstream or the fork, never both. Prompted by a real fork (ComBuildersES/events) that had to fully rewrite README.md and CONTRIBUTING.md to be usable, and shipped with a textLanguage: "en" default that didn't match its own Spanish content. - Add SETUP.md: the one-time onboarding manual (enable Actions/Pages/ Issues, create the ote-event label, register as an adopter, turn on badges...), upstream-owned, read once, safe to delete. Absorbs the AI assistant guardrails block and the update-from-upstream recipe that used to live in README.md. - README.md and CONTRIBUTING.md become minimal fork-owned skeletons from the first commit, modeled on what ComBuildersES/events independently rewrote them into. Upstream commits to never editing either again in a future release, so git pull upstream main has nothing left to conflict with on them. - Add i18n/README.es.md and i18n/CONTRIBUTING.es.md as optional Spanish starting points, referenced from SETUP.md. - ote.config.json: drop the hardcoded textLanguage: "en" default (root cause of the reported bug - the field is optional and "absent = unknown, never English" was already the documented rule); fix two comments referencing the sample events removed in 0.3.0. - events/README.md: ote-tools#23 is fixed upstream, update the wording. Evaluated and deliberately not done here (tracked as ote-tools follow-ups): warning on leftover .example placeholders, a dashboard-checks.js banner for missing Issues/label setup, an editor "configure your feed" mode, and a .gitattributes merge=ours driver (doesn't travel with the repo, so it wouldn't provide a real guarantee). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016oBwXtyuMrATqZcKPgn8hc
1 parent afce94f commit 26cc1a6

9 files changed

Lines changed: 362 additions & 211 deletions

File tree

CHANGELOG.md

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ tracked here.
77

88
This file, together with the [`VERSION`](VERSION) marker, is what the dashboard
99
reads to tell you a newer template is available and what it changed. To pull an
10-
update in: `git pull upstream main` (see the README's *Updates* section).
10+
update in: `git pull upstream main` (see *Staying up to date* in `SETUP.md`,
11+
or below if you've already deleted it).
1112

1213
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
1314
versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
@@ -20,6 +21,53 @@ this file versions the template repo (dashboard, workflows, docs), the spec
2021
versions the data format. A template release never implies a schema bump, or
2122
the other way around.
2223

24+
## [0.6.0] - 2026-08-07
25+
26+
Restructured around one principle: **every file has exactly one owner,
27+
upstream or the fork, never both.** Prompted by a real fork
28+
(`ComBuildersES/events`) that had to fully rewrite `README.md` and
29+
`CONTRIBUTING.md` to be usable, and shipped with a `textLanguage: "en"`
30+
default that didn't match its own content.
31+
32+
### Added
33+
- `SETUP.md`: the one-time onboarding manual (enable Actions/Pages/Issues,
34+
create the `ote-event` label, register as an adopter, turn on badges…),
35+
upstream-owned. Read once, safe to delete. Absorbs the "Using an AI coding
36+
assistant" block and the update-from-upstream recipe that used to live in
37+
`README.md`.
38+
- `i18n/README.es.md` and `i18n/CONTRIBUTING.es.md`: optional Spanish
39+
starting points for the two fork-owned files below, referenced from
40+
`SETUP.md`.
41+
42+
### Changed
43+
- `README.md` and `CONTRIBUTING.md` are now minimal, fork-owned skeletons
44+
from the moment you fork — modeled on what `ComBuildersES/events`
45+
independently rewrote them into. **Upstream commits to never editing
46+
either file again in a future template release**, so `git pull upstream
47+
main` has nothing left to conflict with on them.
48+
- `ote.config.json`: dropped the hardcoded `textLanguage: "en"` default —
49+
the field is optional and "absent = unknown, never English" was already
50+
the documented rule; shipping `"en"` anyway contradicted it. Also fixed
51+
two comments that referenced the sample events removed in 0.3.0.
52+
- `events/README.md`: the `ote-tools#23` reference now reflects that it's
53+
fixed upstream, not still open.
54+
55+
### Evaluated, not done (tracked as `ote-tools` follow-ups)
56+
- Warning (not failing) validation when `feed.url`/`organizers[].url` still
57+
ends in `.example`.
58+
- A `dashboard-checks.js` banner for disabled Issues or a missing
59+
`ote-event` label.
60+
- A "configure your feed" mode in the `ote-tools` editor, writing
61+
`ote.config.json` through the same propose-change/edit-directly pipeline
62+
events already use — preferred over a self-committing `workflow_dispatch`
63+
bootstrap in this repo, since the steps causing the most friction (enabling
64+
Issues/Pages, allowing Actions to open PRs) are repo *Settings* that the
65+
default `GITHUB_TOKEN` can't change regardless of mechanism.
66+
- A `.gitattributes` `merge=ours` driver: skipped as the primary fix, since
67+
it requires `git config merge.ours.driver` set locally per clone and
68+
doesn't travel with the repository — the file-ownership split above makes
69+
it unnecessary rather than papering over it.
70+
2371
## [0.5.0] - 2026-08-07
2472

2573
### Removed

CONTRIBUTING.md

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,49 @@
11
# Contributing
22

3-
Thanks for helping keep this community's event feed accurate!
3+
Thanks for helping keep this event feed accurate! A few ways to help, from
4+
easiest to most technical.
45

5-
> **Organiser:** this file is a template. Adapt it to your community —
6-
> or delete it (and disable Issues) if you don't want contributions.
6+
## 1. Add a missing event
77

8-
## Report a mistake or propose an event
8+
Fill in the form — no git, no JSON, no write access needed:
99

10-
- **Open an issue** describing the event or the error — a maintainer will
11-
apply it. If you can, include the event as JSON (see the
12-
[field reference](https://opentechevents.org/spec/)).
13-
- **Or open a pull request** editing the JSON files in [events/](events/)
14-
directly: one file per event, any file name.
10+
**👉 [Open the OTE editor](https://tools.opentechevents.org/editor?repo=your-user/your-repo)**
11+
12+
It generates the event data for you and opens a prefilled issue in this
13+
repository. A workflow validates it and turns it into a pull request; a
14+
maintainer reviews and merges it. Minutes later, it's published.
15+
16+
## 2. Report a mistake
17+
18+
Wrong date, broken link, venue changed, event cancelled? [Open an
19+
issue](../../issues/new/choose) describing what's wrong. Small fixes are
20+
welcome — don't sit on one because it seems minor.
21+
22+
## 3. Fix it yourself with a pull request
23+
24+
Events are one JSON file per event in [events/](events/) — see
25+
[events/README.md](events/README.md) for the format and a minimal example.
1526

1627
Every pull request is validated automatically against the OTE spec, so you
17-
can't break the published feed — if validation passes and a maintainer
18-
merges, the site (feed, ICS, RSS) redeploys itself.
28+
can't break the published feed: if validation fails, the PR tells you
29+
exactly what's wrong, and nothing publishes until it passes and someone
30+
merges it.
31+
32+
## 4. Spread the word
1933

20-
## License
34+
A real contribution, and it needs no GitHub account at all: share the
35+
events, add the feed to your own community's calendar, or republish the
36+
data on your site. See [Reuse the data](README.md#reuse-the-data) in the
37+
README for the license and the feed URLs.
38+
39+
## License of what you contribute
2140

2241
Event data in this repository is published under the license declared in
23-
[ote.config.json](ote.config.json). By contributing, you agree your
24-
contribution is published under it.
42+
[ote.config.json](ote.config.json). By contributing an event, you agree it's
43+
published under that license: reusable, republishable and buildable-upon by
44+
anyone, without asking permission.
45+
46+
So only submit event information you can publish on those terms — public
47+
facts (title, date, venue, public links), not material someone shared with
48+
you privately, and not text copied from a page under a more restrictive
49+
license.

README.md

Lines changed: 24 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -1,206 +1,41 @@
1-
# OTE Template
1+
# <Your community name>
22

33
<!--
4-
Uncomment these once you've finished the setup below, replacing
5-
your-user/your-repo with your fork (and the Pages URL in the third one):
4+
Uncomment these once you've finished SETUP.md, replacing your-user/your-repo
5+
with your fork (and the Pages URL in the third one):
66
77
[![Validate](https://github.com/your-user/your-repo/actions/workflows/validate.yml/badge.svg)](https://github.com/your-user/your-repo/actions/workflows/validate.yml)
88
[![Publish](https://github.com/your-user/your-repo/actions/workflows/publish.yml/badge.svg)](https://github.com/your-user/your-repo/actions/workflows/publish.yml)
99
[![OTE spec](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fyour-user.github.io%2Fyour-repo%2Ffeed.json&query=%24.specVersion&label=OTE%20spec&color=blue)](https://opentechevents.org/spec/)
1010
-->
1111

12-
Fork this repository and get, with nothing but GitHub and GitHub Pages:
12+
<!-- New fork? The one-time setup guide is in SETUP.md. -->
1313

14-
- Your community's **[OTE](https://opentechevents.org) event feed** published at a public URL.
15-
- **iCalendar (`feed.ics`)** and **RSS (`feed.xml`)** exports, rebuilt automatically on every change.
16-
- A minimal **dashboard** linking to the central OTE tools (editor, import, publish).
14+
Describe what type of events this feed includes — talks, meetups, workshops,
15+
conferences…
1716

18-
Your data stays in **your** repository, as plain JSON, under an open license.
19-
No lock-in: the ICS/RSS exports mean you can leave anytime and take everything with you.
17+
**👉 [See what's coming up](https://your-user.github.io/your-repo/)**
2018

21-
## What's in this repo
19+
## Subscribe
2220

23-
```
24-
├── events/*.json ← your events (one file per event — starts empty,
25-
│ see events/README.md)
26-
├── ote.config.json ← your configuration (feed title, description…)
27-
├── docs/index.html ← static dashboard (links to central tools)
28-
└── .github/workflows/ ← thin workflows calling reusable workflows
29-
in OpenTechEvents/ote-tools
30-
```
21+
| Format | URL | For |
22+
| --- | --- | --- |
23+
| iCalendar | [`feed.ics`](https://your-user.github.io/your-repo/feed.ics) | Add it to Google Calendar, Apple Calendar or Outlook — new events show up on their own |
24+
| RSS | [`feed.xml`](https://your-user.github.io/your-repo/feed.xml) | Follow it from any feed reader |
25+
| JSON | [`feed.json`](https://your-user.github.io/your-repo/feed.json) | Build something with it — the machine-readable [OTE](https://opentechevents.org/spec/) feed |
3126

32-
That's all. Validation, exports and the editor UI live in
33-
[OpenTechEvents/ote-tools](https://github.com/OpenTechEvents/ote-tools) and are
34-
consumed via reusable workflows — improvements reach your fork without you
35-
touching anything.
27+
For the calendar formats, look for "subscribe by **URL**" (not "import
28+
file") and paste the `feed.ics` link — that way it stays in sync instead of
29+
freezing at import time.
3630

37-
## Get started
31+
## Reuse the data
3832

39-
### 1. Fork
33+
Event data in this repository is published under the license declared in
34+
[`ote.config.json`](ote.config.json). Building a directory, a newsletter or
35+
your own aggregator? Take what you need — republishing this feed is itself a
36+
form of supporting this community.
4037

41-
Click **Fork** on this repository. Fork — not "Use this template" — so you can
42-
later pull upstream improvements to the dashboard and workflows:
38+
## Contributing
4339

44-
```
45-
git remote add upstream https://github.com/OpenTechEvents/ote-template
46-
git pull upstream main
47-
```
48-
49-
### 2. Enable workflows
50-
51-
GitHub disables Actions on forks by default. In your fork, open the
52-
**Actions** tab and click **"I understand my workflows, go ahead and enable
53-
them"**. Without this, nothing gets validated or published.
54-
55-
### 3. Enable GitHub Pages
56-
57-
In your fork: **Settings → Pages → Source: GitHub Actions**.
58-
59-
Once the first deploy finishes, link the site from your repo so visitors find
60-
it: repo home → **About** (gear icon) → check **"Use your GitHub Pages
61-
website"**.
62-
63-
**Custom domain?** If your Pages are served from your own domain instead of
64-
`*.github.io`, the dashboard can't detect the repository from the URL. Create
65-
a `docs/config.js` with one line:
66-
67-
```js
68-
window.OTE_REPO = "your-user/your-repo";
69-
```
70-
71-
### 4. Enable issues (optional, recommended)
72-
73-
GitHub disables Issues on forks by default. If you want the community to be
74-
able to report mistakes or propose events — and to use the OTE editor's
75-
"propose change" flow, which delivers changes as prefilled issues — enable
76-
them: **Settings → General → Features → Issues**.
77-
78-
Then create the label the flow depends on — forks don't inherit labels, and
79-
GitHub silently ignores missing labels declared in issue forms, so without it
80-
proposed events never become pull requests. In your fork: **Issues → Labels →
81-
New label**, name it exactly `ote-event`. The propose-event issue form applies
82-
it, and the issue-to-pr workflow only reacts to issues carrying it.
83-
84-
Finally, let Actions open the pull request: **Settings → Actions → General →
85-
Workflow permissions → check "Allow GitHub Actions to create and approve pull
86-
requests"**. Without this, a proposed event validates and its branch is pushed,
87-
but the workflow can't open the PR.
88-
89-
This template ships a [CONTRIBUTING.md](CONTRIBUTING.md) that explains the
90-
contribution flow to visitors. Adapt it to your community, or delete it if
91-
you don't want contributions.
92-
93-
### 5. Edit `ote.config.json`
94-
95-
Set your feed's `title`, `description` and `url` (your community's website).
96-
97-
The `license` applies to your event *data*, not to the events. The template
98-
defaults to [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/)
99-
(public domain — most permissive, anyone can republish your events, which is
100-
the point of a feed). If you want attribution, use
101-
[CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/). Any SPDX
102-
identifier or URL is accepted.
103-
104-
### 6. Add your events
105-
106-
Add one JSON file per event to [events/](events/) — the full field reference
107-
is at [opentechevents.org/spec](https://opentechevents.org/spec/). Minimal
108-
event:
109-
110-
```json
111-
{
112-
"specVersion": "0.3.0",
113-
"id": "https://your-community.example/events/2026-09-meetup",
114-
"name": "September meetup",
115-
"startDate": "2026-09-24T19:00",
116-
"timezone": "Europe/Madrid",
117-
"license": "CC0-1.0"
118-
}
119-
```
120-
121-
File names are free-form — any `*.json` under `events/` is picked up. Naming
122-
them `YYYY-MM-name.json` makes them sort chronologically, but nothing depends
123-
on it: an event's identity is its `id` field, not its file name.
124-
125-
Every push validates your events and, if valid, rebuilds and redeploys your
126-
site: dashboard + `feed.json` + `feed.ics` + `feed.xml` at
127-
`https://<user>.github.io/<repo>/`. Deploys take a couple of minutes.
128-
129-
### 7. Make your feed discoverable
130-
131-
Add this to the `<head>` of your community's website (if you have one):
132-
133-
```html
134-
<link rel="alternate" type="application/ote+json"
135-
href="https://<user>.github.io/<repo>/feed.json">
136-
```
137-
138-
### 8. Register as an adopter
139-
140-
Add your community to the adopters list in
141-
[opentechevents-spec](https://github.com/OpenTechEvents/opentechevents-spec) so
142-
directories and users can find your feed.
143-
144-
### 9. Turn on the README badges (optional)
145-
146-
Near the top of this file, uncomment the `Validate`/`Publish`/`OTE spec`
147-
badges and replace `your-user/your-repo` with your fork.
148-
149-
## Editing events
150-
151-
Phase 1 is hand-edited JSON — the workflows validate every push and pull
152-
request, so mistakes can't reach your published feed. The **editor** linked
153-
from your dashboard (create/edit events via a form, proposed as a PR to your
154-
repo) is coming in phase 2.
155-
156-
**Propose an event without touching JSON**: anyone can fill in the
157-
[OTE editor](https://tools.opentechevents.org/editor?repo=your-user/your-repo)
158-
(replace `your-user/your-repo` with your fork, or just follow the link from
159-
your dashboard). It generates the event JSON and opens a prefilled issue in
160-
your repo; a workflow validates it and turns it into a pull request for you
161-
to review and merge. No git, no JSON editing, no write access needed.
162-
163-
## Updates
164-
165-
The thin workflows track `OpenTechEvents/ote-tools@main` (pinned to `@v1` once
166-
stable), so validation and export improvements arrive automatically. For the
167-
few files that live here (dashboard, workflows), pull from upstream now and
168-
then:
169-
170-
```
171-
git pull upstream main
172-
```
173-
174-
## Using an AI coding assistant on your fork
175-
176-
If you use Claude Code, Codex, Copilot or similar to help manage your fork,
177-
paste this into whichever instructions file it reads (`CLAUDE.md`, `AGENTS.md`,
178-
`.github/copilot-instructions.md`…) — it keeps the assistant from "helpfully"
179-
adding logic that belongs in `ote-tools` instead of here:
180-
181-
```
182-
This is a template repo that community organizers fork. It should contain
183-
ONLY: events/*.json (your data), ote.config.json (your configuration), docs/
184-
(a minimal static dashboard), and thin workflows that call reusable workflows
185-
in OpenTechEvents/ote-tools.
186-
187-
It must NOT contain validation/export/UI logic — that lives in
188-
OpenTechEvents/ote-tools. If a task asks you to add logic here, that's a sign
189-
something is wrong: stop and ask before proceeding.
190-
191-
The workflows reference OpenTechEvents/ote-tools/.github/workflows/*.yml@main
192-
(will pin to @v1 once stable).
193-
194-
Keep this repo simple enough that an organizer can understand it in five
195-
minutes.
196-
197-
Official language: English. All documentation, code comments, names,
198-
commit/PR messages, UI text and repo content are written in English, even if
199-
your own prompts are in another language.
200-
```
201-
202-
## License
203-
204-
Template files (this README, `ote.config.json`'s placeholders):
205-
[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).
206-
Your own data: whatever `license` you declare in `ote.config.json` and your events.
40+
Found a mistake, or want to add an event? See
41+
[CONTRIBUTING.md](CONTRIBUTING.md).

0 commit comments

Comments
 (0)