Event hierarchy grouping

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:

  1. 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?

  2. 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?

  3. 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?

  4. 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.

Tracks are more like tags, they are a different kind of grouping.

They don’t have to. Like, it makes “sense”, but it makes sense most of the time, but your Thursday-event-that-is-a-child-of-Friday-to-Saturday doesn’t have to do causal consistency checks. There are some issues with display that can be handled a couple of different ways – e.g. “if child event occurs outside of date range, grow date range to include child” or “don’t display child” (this is very very very context dependent on how you’re going to do the display layer)

None! You RSVP to events individually. Things like sched (there are other large scale event thingies) have a “my schedule” and attendees can RSVP or favorite among some other actions.

And RSVP is separate from bought a ticket. There are a couple of different goals and user needs here. As a user, I want to build my schedule, potentially rate / favorite / get back to individual sessions. As an organizer, I need to build and shuffle a grid.

I think there are ticketing reasons to have to buy an event ticket and then an add on workshop – but you’re ticketing with an implicit RSVP.

I would not personally make a track a container in this way. I haven’t looked at the data model, but I’ve used pretalx pretalx — CfP and scheduling for conferences which is half CFP management, and then half schedule building and wrangling for larger things. That’s … a whole other space.

As an organizer, building the grid of talks and shuffling them around is REALLY HARD. Having a drag and drop interface that lets me build my schedule would be REALLY USEFUL. Have I done run of show and talk scheduling in GSheets many times and then translated it into some custom web page? Yes, many times!

The Pretalx one is … OK.

Not sure this second method makes sense to me, but then as an organizer I simply don’t think about tracks this way.

From the hierarchy in v1, I would not have track containers. The way I schedule, I’m actually scheduling by room / venue. This is contained in each event already, I “just” need a display that lets me do a couple of different things “group by venue, sort by time order”.

The larger event I’m planning, I’m starting with the assumption of Big Theater, Medium Theater, and 1-2+ Breakout Rooms. I might match the rooms to tracks, use tags on events, or something different.

Yeah, I think that I agree here. I think with non-hierarchical grouping the two things are required:

  1. Knowledge of all of the events that could be group.
  2. Some common grouping key, like a tag.

I think tags are a super interesting thing and also add a lot of different complexity.

To be clear! The Pretalx interface is super complicated and I’m not actually advocating for adding tags at the protocol layer.

So yeah, this may be more like app specific preferences / private data.

eg as part of ENV variables or whatever, I can just put all the at URIs in :person_shrugging:

1 Like