Shared Calendar¶
A calendar a Circle shares. One thing they want to do — a meal, a film, a place, a link someone sent — is tracked from the moment it's mentioned until it's done.
Language¶
The people¶
Circle: The people who share one calendar, and the owner of everything in it. A Circle holds at most two Members for now; a person belongs to exactly one Circle, or to none. A Circle whose last Member goes is deleted, with everything in it. Avoid: team, household, workspace, account, tenant, couple
Member: A person who belongs to a Circle. Membership is what accepting an Invite creates and what a departure ends: Leaving, being Removed, or deleting the account. Not every person has one: someone Waiting has none yet, and someone who left has none any more. An Approved person with no Circle may start a new one, becoming its Host, or Accept an Invite. Avoid: user (that is the login), participant
Host: The Member who has been in their Circle longest. At first that's whoever founded it; when the Host goes, the role passes to whoever has now been there longest. The Host alone may Remove. Nothing else about the role differs: over Items, every Member is equal. Avoid: founder, owner, admin
Leave: A Member ending their own Membership. Always their own act; the Circle and its Items stay with whoever remains. Avoid: quit, exit
Remove: The Host ending another Member's Membership. Nobody else can remove anyone, and nobody can remove the Host. Avoid: kick, expel, ban
Approval: The decision, made by hand, whether a person who signed up at the front door is let in. A person's approval is Waiting, Approved or Rejected. Once Approved, always Approved: leaving a Circle doesn't undo it. Accepting an Invite approves the person it brings in. Avoid: activation, active/inactive, pending, status (that belongs to Items)
Waiting: Verified, and not yet decided. The only people in the approval queue. Avoid: pending, queued, applicant
Rejected: Turned away. The person is never told; to them it looks the same as Waiting. Avoid: banned, blocked, declined
Email address: What a person logs in with, and who they are to the app. A person has exactly one, and an address belongs to at most one person; capitalisation never makes two addresses different. An address is verified once its holder has proved they receive mail there — which is not the same as being let in. Anyone holding an address, verified or not, already has an account. Avoid: username, login, account
Held: Signed up while signup mail was at its limit (twenty sends in any 24 hours), so the mail that would verify the address hasn't been sent. The person is told they'll hear back; they stay unverified until the operator releases their mail by hand, or until they log in again once there's room. Not yet Waiting: that only follows verification. Avoid: queued, pending, throttled
Partner: The other Member of your Circle, from your side. A display term only: nothing in the app depends on there being exactly one. Avoid: spouse, co-owner
Invite: A Member's offer of their Circle's free seat to one Email address, good for seven days and used at most once. It is Pending until it is Accepted, Replaced by a newer Invite from the same Circle, or Expired. Nobody can invite an address that already belongs to a Member. Avoid: invitation, referral, revoke
Accept: The invitee taking up an Invite. One act verifies their Email address, Approves them, and makes them a Member of the inviting Circle; only the invited address can accept. Following the link is one way; the other is coming in at the front door with the invited address, where verifying it accepts the live Invite at login, and the operator never sees them. Avoid: redeem, claim, join
The thing itself¶
Item: One thing a Circle might do together. The only domain entity in the app; an Item belongs to exactly one Circle and carries a Kind, a Status, and optionally a date and time. Avoid: entry, activity, task, event (see below), bookmark
Kind: What sort of thing an Item is: meal, movie, place, or other. Purely descriptive — it never affects what an Item can do. Avoid: type, category, tag
Status: Where an Item has got to: Open, Scheduled, or Done. An Item has exactly one at a time. Avoid: state, stage
Open: An Item nobody has committed to a date yet. Open Items are what the wishlist shows. Avoid: pending, backlog, unscheduled, "want to"
Scheduled: An Item with a date and time attached. Scheduled Items are what the calendar shows. A Scheduled Item always has both a date and a time — never one without the other.
Done: An Item that has happened, or was marked finished by hand. Done Items appear on neither the wishlist nor the calendar. Avoid: completed, archived, closed
Deleted: An Item a Member has taken out of the app, reversibly. Not a Status but a lid over the Item: the Status underneath is untouched, so undoing a deletion returns the Item exactly as it was. Distinct from Done, which says the Item happened. Avoid: archived, removed, trashed
Added by: Who created an Item. Provenance, never permission: it says whose idea an Item was, and governs nothing — any Member may reword, delete, schedule or finish any Item in their Circle. When that person deletes their account, it reads "a former Member". Avoid: owner, author
The two views onto Items¶
Wishlist: The view of all Open Items, newest first, optionally narrowed to one Kind. Avoid: backlog, inbox, list
Calendar: The view of Scheduled Items dated today or later, in date and time order. Avoid: agenda, schedule (the noun), timeline
Event:
Not a domain term. In this codebase "event" means an SSE message on a Circle's channel,
nothing more. A thing on the calendar is a Scheduled Item.
Avoid: using "event" for an Item. The events_page / event_quick_add URL names predate
this glossary.
How Items move¶
Schedule: Giving an Open Item a date and time, moving it to Scheduled. Doing the same to an Item that already has a date is a reschedule.
Expire: The automatic move from Scheduled to Done once an Item's date is in the past. Nobody performs it; it happens on its own. Because nobody performs it, nobody is told: it is the only change to an Item that is neither broadcast nor pushed. The calendar hides past Items by date regardless, so expiry only keeps the stored Status honest (see docs/adr/0004). Avoid: lapse, auto-complete, sweep
Coming in from outside¶
Share intake: The path by which an Item arrives from another app on the phone, via the PWA share target, rather than being typed into the app. Avoid: import, capture, ingest
Share payload:
The raw title / text / url an external app hands over. Not every payload yields an
Item: one with no usable URL is rejected.
Item draft: An Item somebody means to add, before it exists: its Kind, title, note and link, read out of whatever they submitted — a sheet, or a Share payload — and cleaned. A draft is not stored and may yield no Item at all. Avoid: candidate, pending item, proto-item
Origin: Whether an Item was typed into the app or arrived through share intake. It changes what the other person is told, and nothing else — so it travels with the act of adding, and is never stored on the Item. Avoid: source, provenance
Telling the other person¶
Push subscription: One browser's or installed app's registration to receive push notifications. A person may have several: a laptop's browser, the installed web app and the iOS app on one phone are three. The iOS app's Push subscription ends with the login it was made under; a browser's outlives its login until it is removed. Avoid: device token, registration (as a noun of its own)
Fan-out: Sending a notification about an Item to every Push subscription belonging to a Member of that Item's Circle, except those of the Member who made the change. Nobody is notified about their own action; nobody outside the Circle is notified at all. Avoid: broadcast (that's the SSE refresh, which goes to every connected Member of the Circle, including the one who made the change)