Experiences (Camp Programme)¶
An Experience is one thing a camp offers — a workshop, ceremony, practice session, performance, or any other item in the camp's programme. Together, a camp's experiences form its Programme; the programmes of all camps in a Gathering form that Gathering's programme.
Experiences are the catalogue: what's on offer and who's behind it. Each one also carries a day, a start time and a length — one of each, because one experience is one session — so the public programme can open by day and say when each session ends. They deliberately carry no capacity or registration: the programme describes offerings, it doesn't sell them.
This guide covers creating and configuring experiences. It assumes you know the basics of camps and local gatherings and holons and classes.
How an experience relates to its camp¶
Every experience belongs to exactly one camp — the camp that offers it. That ownership is the experience's place in the holon tree (the camp is its parent), and it's organisational, not geographical: an experience can happen away from the camp's physical location and still be part of that camp's programme.
The Gathering context comes through the camp: an experience under a camp under the Portugal 2026 gathering is part of the Portugal 2026 programme, automatically.
An experience can additionally be related to partner organisations, from its Related Organisations section, without changing which camp owns it.
Where experiences appear¶
- On the camp's page — camps show an Experiences section: a card grid of the experiences that camp owns, each showing its image (or a generated tile), a short description, and its configured tags. Click a card to open the experience.
- On the gathering's page — the same section shows the whole programme: every experience owned by any of the gathering's camps, each card naming its camp. When there are more than twelve, the first twelve are shown with a See all N experiences link to the full list. That list needs Gathering access; without it you see up to sixty cards and a line saying how many there are in all.
- In the Experiences list — users with Gathering access get an Experiences nav item whenever their current Focus contains experiences. It's the standard list view: filters live in the URL, so a filtered view can be bookmarked and shared.
- On the experience's own page — the standard holon detail page: description, links, additional fields, team, and related holons.
The week view¶
The Experiences list has a view switch next to its page icon: the list, and a Week view (the calendar icon). The week shows the same experiences the list does, at the same Focus, laid out hour by hour:
- each experience with a Day and a Starts time is a block at its start time, as tall as its Length. With no Length it is drawn one hour tall with a dashed edge, and hovering it says "length not set". A session running past midnight continues into the next day's column.
- each block names its camp. Experiences at overlapping times sit side by side.
- experiences with a Day but no start time are counted at the top of their day ("2 with no time set"); the count opens to the list in place.
- experiences with no Day at all are counted above the grid ("34 experiences have no day set"), linking back to the list.
- experiences that are not published yet are drawn faded.
- the hours run 08:00 to 22:00, stretched to fit the week's earliest start and latest end.
- when the link names no week, it opens on the week of the next experience — or, once they are all past, the latest week that has any. The arrows step a week at a time, and the week menu lists only weeks with experiences.
- on a phone it shows one day at a time, with a tab for each day of the week.
The week and day are in the address, so a week view can be bookmarked and shared.
Creating an experience¶
Use Add Experience on a camp's page (the camp comes preselected and locked), or the create button on the Experiences list. You can create experiences under any camp you may edit — as a member of the camp's team or of its Gathering's team; you don't need to be a global editor.
The form asks only for:
- Camp — the owner; preselected when you start from a camp page.
- Name — what it's called on programme cards.
- Description — used in full on the experience's page, and automatically shortened for the compact cards. There is no separate "teaser" field to maintain.
- Any configured fields the experience class defines (see below).
Everything else — images, people, related organisations — can be added afterwards on the experience's page.
Which class of experience the form creates is controlled by the camp class
configuration (its allowed_child_class_slugs). Out of the box, camps allow the generic
Experience class and the form shows no class choice; an event-specific camp class can
instead allow its own experience subclass(es), in which case a class picker appears. The
administrator setup is covered step by step in
Experience configuration.
Configuring experience fields¶
Descriptive attributes (topics, format, venue, access, and so on) are not built-in experience fields. They're defined by an administrator on the experience class as Additional fields, so each event can decide what its programme collects — and the create/edit forms stay exactly as short as the configuration.
Two things are worth knowing beyond the standard additional-fields guide:
Select options can carry icons¶
A select field's options can be plain strings, or objects with a stable stored value, a display label, and an optional icon:
{
"key": "dimension",
"type": "select",
"label": "Dimension",
"options": [
{"value": "mind", "label": "Mind", "icon": "brain"},
{"value": "heart", "label": "Heart", "icon": "heart"},
{"value": "body", "label": "Body", "icon": "body"}
],
"public_visible": true
}
The icon shows next to the label on cards, chips, and detail pages; the stored value stays
the stable "mind" / "heart" / "body" string. Icons always accompany the text label —
they never replace it — and an unknown icon key simply falls back to the label alone.
Existing string options keep working unchanged and act as both value and label.
This option shape works for select fields on any holon class, not just experiences.
Keep the first form short¶
Configure only fields you will actually display or filter by. Long forms reduce submissions and produce low-quality data; a programme with names, descriptions, and one or two well-chosen selects beats one with ten half-filled fields.
People and related holons¶
- People join an experience through standard memberships, exactly as on camps. They're grouped and labelled by the journey they're on — there are no hard-coded experience roles. An experience doesn't need any people attached to be part of the programme.
- Organisations connect through standard holon relationships, from the Related Organisations section, also grouped by journey name. Relating an organisation does not change which camp owns the experience.
See Journeys for how journeys and steps work.
Publishing and public pages¶
Whether an experience is publicly visible is a journey state, not a checkbox: the camp↔experience programme relationship moves through a configured journey, and steps (or whole journeys) marked public-visible publish the experience — the same mechanism that already controls which organisations appear on public camp pages.
A published experience appears on four public surfaces, all sharing one artwork and card treatment:
- the Gathering page shows a programme teaser — a count summary and a slider with a small balanced sample of experiences across camps, linking to the full programme
- the Gathering programme page (
…/programme/) opens by day (see below); its All experiences tab (…/programme/?view=all) lists every published experience. Both views share one filter row — camp, any public select field (such as Tags), and text search — and switching between them keeps what you picked. All filters live in the URL, so a filtered view can be shared. A filtered link opens By day unless it includesview=all, as links made on the All experiences tab do - the camp page shows a preview and links to that camp's full programme page, which opens by day too
- the On now page (
…/<gathering>/now/) lists, place by place, what is on and what starts within the hour, in the gathering's local time, and updates itself while it is open. A session needs a day and a start time to appear; one with no length counts as an hour. While the gathering is on, the front page, its gathering page and its programme link to it. Outside the gathering's dates it says when the gathering starts, or that it has ended - each experience has its own shareable detail page with artwork hero, description, links, public fields, people, and related organisations
A non-published experience's public URL returns 404 — it never leaks through any public page.
Artwork resolution order¶
Every card and hero image resolves in the same fixed order, with no randomness at render time:
- The experience's own uploaded image, if set — always wins.
- Otherwise, a background chosen once at creation from the nearest non-empty image library (the experience's own, else its camp's, else its Gathering's) — persisted so the same experience always shows the same background, even across page loads.
- With no image and no library anywhere, a branded colour treatment — never a broken image tile.
Uploading an image later always overrides the assigned background immediately. For a click-by-click walkthrough aimed at organisers, see Giving experiences nice images; the administrator setup of the image libraries is in Experience configuration.
The programme by day¶
Every experience has a Day, a Starts and a Length field, in its When group.
Set them in the CRM like any other field: the day with the date picker, the time as 24-hour
HH:MM (09:30), the length in whole minutes (90). A time such as 9:30 or 25:00 is
refused with a message, and so is a length of 0, 1.5 or anything that is not a whole
number. There is no upper limit on a length. The time is the local time at the gathering.
While you type a length, the CRM shows when the session ends under the box — "ends 11:00", or "ends Sunday 01:00" when it runs past midnight.
How the time reads:
- With a start and a length, as a range: "Saturday 24 October · 09:30 – 11:00". A session that runs into a later day names the day it ends: "23:00 – Sunday 01:00". From a week on, the full date is named: "10:00 – Saturday 31 October 10:00".
- The end is clock time: the start plus the length on the clock face. 23:00 plus four hours is 03:00, including the night the clocks change. No timezone is used.
- With a length but no start, the length alone: "Saturday 24 October · 1 hour 30 min".
- Lengths read in words: "45 min", "1 hour 30 min", "1 day 2 hours 30 min".
- A session is listed on the programme under its start day only, even when it runs past midnight.
- On the programme by day, each card shows its time without the day, because the day's heading already names it: "09:30 – 11:00", and "23:00 – Sunday 01:00" for a session running past midnight.
- Like the day and the start, the length is shown only while its field is public.
Experiences used to carry a hidden End date field. It has been removed: nothing read it, and a length says what it tried to. Values already stored are kept but no longer shown or accepted.
Where¶
Every experience also has a Where group, below When, holding one field: Where. It is picked from the places its gathering keeps (the gathering's Places section); you cannot type a new one there — add the place on the gathering first. Choose No place to clear it. Renaming a place on the gathering renames it on every experience at once, and a place that experiences use cannot be deleted.
The place shows:
- on the experience's public page, next to its day and time ("Saturday 24 October · 09:30 – 11:00 · Garden"), or alone when there is no time; it is not repeated lower down;
- on each programme-by-day card and each line of a camp page's agenda, after the time ("09:30 – 11:00 · Garden");
- wherever it shows on the public site, the place's name links to the place's own page (while the gathering has no public page of its own, the name shows without a link, since the place page lives under the gathering);
- in the CRM Experiences list, in a Where column (switch it on from the eye menu). The column cannot be sorted.
The programme page then shows:
- every day of the gathering (its start date to its end date) as a chapter, labelled "Opening day", "Day 2" … "Closing day" ("The day" for a one-day gathering). A day with nothing on it says the programme for it is still being made — or, once the gathering is over, that nothing was published for it. An experience dated outside the gathering's dates gets a chapter of its own. A gathering longer than three weeks — usually an end date typed wrong — shows only its first and last days and the days that have experiences, and when its days run across two months the month is shown too.
- what the day holds — the three tags (public select values) its experiences carry most, separated by dots ("Land · Water · Music"), so a tag with "&" in it stays one tag — and, when at least three days have experiences, which is the fullest day. Both are worked out from the experiences, never typed in.
- the day's experiences as cards, ordered by start time, then the ones with no time, A–Z. A card shows its picture, its camp, its time (as a range when there is a length, without the length itself) and a few lines. Clicking the card opens the experience's own page; its Read more opens it in place instead, showing the full description, its tags and its people, grouped and titled by journey as on the experience's own page.
- six cards per day (four on a phone), then "See all … on Saturday", which opens that day
alone (
…/programme/?day=2026-10-24). - the gathering's filters above the days: pick a camp, a tag or search, and every day shows only what matches. Days with nothing matching stay, saying "Nothing matches on this day.", and the top line counts the matches ("14 of 365 experiences match."). "See all" and the day tabs keep the filters. A camp's own programme page has no filters.
- when nothing is published yet, one line instead of the days: "The programme is still being made — check back soon.", or after the gathering, "No experiences were published for this gathering." A camp's own programme page says the same of the camp.
- experiences with no day yet, together at the end under Day to be announced — or, once the gathering is over (or when the day field is kept private), under Other experiences, since no day is coming.
- when the gathering has a Tickets link and has not ended, a ticket bar at the foot of the screen.
The experience's own page shows its day, time range and length under its camp's name — "Saturday 24 October · 09:30 – 11:00 · 1 hour 30 min" — or "Day to be announced" while that can still happen.
The programme by place¶
The programme has three tabs: By day, By place and All experiences. By place
(…/programme/?view=places, on a gathering's programme and on a camp's) lists the places
that have experiences, A–Z, each with how many it has. Under each place its experiences are
one list by day and time, earliest first, each line naming its day and time. Experiences
with no place come last, under Place to be announced. A place with no experiences is
not listed here. The gathering's filters (camp, tags, search) apply as on By day, and the
tabs keep them.
Each place of a published gathering also has its own public page, at
/view/<gathering>/places/<place>/ — for example /view/2026-mexico/places/main-tent/.
It shows the place's photo, its description, an Open map link when the place has a map
link, and the gathering's public experiences there by day and time, each linking to its
page; one with no experiences yet says "Nothing is scheduled here yet." Every place in the
gathering's list has a page. The address is made from the place's first name and kept when
the place is renamed, so an old link still opens it. Places of an unpublished gathering
have no public page.
Deliberate non-features¶
By design, experiences have no:
- more than one session (an experience is one session, with one start and one length)
- capacity or registration
- pricing or purchasing
If you find yourself wanting these on the programme, that's a product conversation, not a configuration option.