The Problem
Samhain happens every year. But which Samhain?
The 2024 version, when Maggie burned her fingertips on that candle ritual? Or 2025, where she's planning beeswax instead? Or the idea of Samhain—unchanged for centuries, holding its symbols regardless of who celebrates?
Sea Witch Botanicals wanted an app for seasonal observances. Simple—until you realize that time and ownership create complexity no wireframe can hide.
Customers forgot when festivals arrived. Couldn't remember which incense went with which moon phase. Wanted guidance but found only scattered blog posts.
The relationship between customer and brand ended at checkout.
What We Heard
This was a discovery and architecture project, so we didn't conduct formal user interviews. But the client team surfaced clear patterns from customer support and social media:
• Customers repeatedly asking "when is [festival] this year?" • Confusion about which products align with which observances • Requests for personalized ritual guidance beyond generic blog content • Interest in tracking their own celebrations across years while maintaining traditions • Desire for sustainable, eco-friendly practices integrated with spiritual work
The founder said: "We want to be more than just a transaction. We want to be their companion through the seasonal wheel."
The Method
We didn't start with screens. We started with nouns. What actually exists in this world?
Three big structural moves unlocked everything.
First, the Observance Type Tree. Sabbats follow the Wheel of the Year—fixed seasonal points like Samhain and Beltane. Esbats follow lunar cycles, shifting with the moon. Holidays are personal—birthdays, anniversaries, individual spiritual markers. Same parent concept, totally different rules for when they happen and how they recur. One base object, three specialized extensions.
Second, the Template/Occurrence Split. This is the big one. The idea of Samhain stays stable—that's an OBSERVANCE TEMPLATE with all the traditional symbols, rituals, historical context. But the instance of Samhain 2025 has a specific date, specific weather where you live, your personal notes from how you celebrated. That's an OBSERVANCE OCCURRENCE. Next year, the system generates a fresh occurrence from the same template. Historical integrity preserved. Customization enabled. Nothing gets corrupted.
Third, Junction Objects for Ownership. Jack and Maggie both celebrate Samhain, but they celebrate it differently. USER'S OBSERVANCE PLAN connects the person to the occurrence. RITUAL ASSIGNMENT sequences their specific ritual choices. USER'S RITUAL PLAN saves their customizations. Three junction objects mediating ownership without corrupting the source.
Once we had these structural pieces in place, everything else followed. What products connect to which observances? Which rituals align with specific moon phases? How do sustainability tips surface at the right seasonal moment? The relationships answered those questions.
The Solution
31-object architecture handling the full complexity of recurring seasonal observances with personal customization.
Template/Occurrence pattern separating canonical knowledge (OBSERVANCE TEMPLATE) from personal instances (OBSERVANCE OCCURRENCE). History preserved, customization enabled.
Type tree for observances—Sabbats, Esbats, Holidays—each with different recurrence rules and meanings.
Junction objects (USER'S OBSERVANCE PLAN, RITUAL ASSIGNMENT, USER'S RITUAL PLAN) allowing multiple people to celebrate the same observance differently without corrupting the source.
Product recommendations, ritual guidance, and sustainability tips all connected through object relationships that surface contextually.
What Changed
No metrics exist. This is discovery work.
But: 31 objects mapped. 200+ attributes documented. Every major structural question resolved before anyone wrote code.
Conversations shifted from "we need a calendar" to "does USER'S OBSERVANCE PLAN connect directly to RITUAL, or do we need a junction?"
That linguistic shift is unmeasurable and probably invaluable. When everyone on a team shares the same mental model of what exists, decisions get easier and faster.
Lessons for Others
First: Temporal complexity is relationship complexity wearing a mask. Anything that recurs—holidays, maintenance schedules, subscription renewals—probably needs some version of a template/instance split. The pattern transfers.
Second: Customization and canonical content are opposing forces. Junctions mediate that tension. You can't let everyone edit the source definition of Samhain, but you can't force everyone to celebrate it the same way. Junctions handle ownership without corruption.
Third: Object-oriented thinking transfers across domains. This project is about witchy wellness and seasonal rituals. VermeerOne was about heavy equipment and fault codes. Totally different worlds, same underlying patterns. When you see it once, you start seeing it everywhere.
Fourth: Sometimes the value is in clarity, not delivery. The map exists. That's not nothing. Teams ship faster and more confidently when they know what they're building.
Broader Implications
The wellness and spirituality space is dominated by big platforms—Insight Timer, Headspace, Calm. They compete on content volume and features. But there's an opening for smaller brands that understand structural complexity.
When you can gracefully handle time, recurrence, personalization, and canonical knowledge all at once, you create experiences those bigger platforms can't match. They're building meditation libraries. You're building companions for seasonal living.
This matters beyond wellness. Any domain with recurring events and personal customization—education, fitness, habit tracking, project management—faces the same structural challenges. Get the objects right, and the experiences become possible.
The End
Maggie will celebrate Samhain this year. And next year. And the year after that.
Each time will be different. Each time will be the same.
We built a system that holds both truths at once. Template and instance. Canonical and personal. History and future.
The code doesn't exist yet. But the possibility does. And possibility, as it turns out, has a shape.
We drew it.