I’ve been thinking about event grouping for event clusters, specifically around hierarchical and non-hierarchical event grouping.
With hierarchical grouping events could be viewed as a tree with depth. Similar to how post threads work, there is a “root” event and all descendants of the root event maintain references to the “root” event as well as their immediate “parent” (which may also be the root event).
For example, this is a hierarchy for Dayton Swing Smackdown 2026, a weekend-long swing dancing event including competition, workshops, and social dance.
- Dayton Swing Smackdown 2026
- Friday Dance w/ Live Band
- Friday Late Night Dance 11:59p
- Saturday Beginner Track
- Lesson 1 - 10a
- Lesson 2 - 11a
- Saturday Intermediate Track
- Lesson 1 - 10a
- Lesson 2 - 11a
- Saturday advanced Track
- Lesson 1 - 10a
- Lesson 2 - 11a
- Team Floor Time Part 1 - 12p
- Team Floor Time Part 2- 4p
- Saturday Dance 5p
- Team Competitions 8p
- Saturday Late Night Dance 11:59p
- Sunday Lessons
- Lesson 1 - 10a
There are some pros and cons to this method. With all of the events laid out like this, you can see a very clear hierarchy. Events link upward to their parent and the root event, and the division between events is very apparent.
The rigid hierarchy also has some side effects that are worth calling out:
-
An event can’t have two parents. For example, it would become more difficult to have a Saturday lesson that is in both the beginner and intermediate tracks, but not the advanced track. Do you duplicate the event? Do you create more abstraction for different combinations?
-
Events are presumed to fit within the time-frame of their parent(s). For example, Dayton Swing Smackdown is formally Friday through Sunday. Informally, there could be an official gathering on Thursday night for people who get in town early. Does that mean the root event needs to state that it starts Thursday? What happens if a descendant event starts before or ends after a parent event?
-
What is the relationship of RSVPs in the hierarchy? If someone RSVPs to the live band dance on Friday, is that an implicit or explicit intention for the parent/root event? What about more deeply nested events where someone attends a workshop less and there are 2 or 3 levels of events above it?
-
What is the role and function of the intermediate events (like “Saturday advanced Track”)? Are they records that are used for RSVPs? Are they purely for display and hierarchy purposes?
Schedule Record
An alternative to having strong “root” / “parent” references is to have an explicit schedule record. This could contain useful information like noting which events
{
"key": "at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026",
"description": "The schedule of events for Dayton Swing Smackdown 2026",
"groups": [
{
"name": "All-Levels Track",
"description": "Lessons for beginners and dancers of all levels. No lesson test needed.",
"events": [
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-begginer-lesson-1",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-begginer-lesson-2",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-begginer-lesson-3",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-sunday-lesson-1"
]
},
{
"name": "Intermediate Track",
"description": "Lessons for dancers with 3+ years of experience. Lesson test required.",
"events": [
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-lesson-trials",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-intermediate-lesson-1",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-intermediate-lesson-2",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-intermediate-lesson-3",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-sunday-lesson-1"
]
},
{
"name": "Advanced Track",
"description": "Lessons for advanced and experienced dancers. Lesson test required.",
"events": [
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-lesson-trials",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-advanced-lesson-1",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-advanced-lesson-2",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-advanced-lesson-3",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-sunday-invitational-1"
]
}
],
"events": [
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-friday-live-band",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-friday-late-night",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-saturday-dance",
"at://did:plc:me/community.lexicon.calendar.event/dayton-swing-smackdown-2026-saturday-late-night"
]
}
With this method, there’s a single record that contains event grouping. The “key” event is listed along with inner events and named event groups. This allows events to be displayed across multiple groups and removes the intermediate events used for group tracking.