Every group chat for every class ends up in the same place. Someone asks whether the lab report is due Thursday or Friday. Three people answer differently. One of them is looking at a screenshot from week two. The professor moved the date in an announcement nobody scrolled far enough to read, and by the time it gets sorted out the answer is buried under forty messages about parking.

The usual fix is a shared doc or a spreadsheet somebody volunteers to maintain. It works for about two weeks. Then the person who owns it stops updating it, half the group forgets it exists, and everyone drifts back to asking in the chat. The problem was never that people are lazy. It is that the shared thing lives somewhere separate from the place each person actually plans their week, so keeping it current is unpaid work for one volunteer.

A Course Space is Semora's answer to that. One course, one shared space, an invite link, and exactly two kinds of shared content: deadlines the course owner publishes, and group assignments anybody with edit rights adds. Everything the space knows flows into each member's own planner as ordinary tasks they control. Nothing else crosses over. Your grades, your reminder settings, your notes, and your own progress never leave your account.

What a Course Space actually is

A space is attached to one course. You reach the feature from the Me tab, under Academic tools, on the row labeled Class Collaboration. The hub lists every space you belong to with its member count and your role in it, and underneath that, the courses in your current semester that do not have a space yet.

When a space is created it copies the course's name and color, so it looks like the course you already track rather than a generic room. The database enforces one space per course, so there is no way to end up with two competing spaces for the same class. The creator is written in as the first member with the owner role in the same transaction that creates the space, using the display name on their profile, falling back to the part of their email before the @ sign.

The space itself holds two kinds of shared content and nothing else. Shared deadlines are the course's real due dates, published by the owner from their own copy of the course. Group assignments are the pieces of group work the team divides up between themselves. Everything else in Semora stays personal, by design.

Creating a space and sending the invite link

In the hub, tapping a course under Start a course space creates the space and drops you straight into it. From there, the Invite button hands you a link through the normal iOS share sheet, with a message that names the course, so you can drop it into whatever group chat the class already uses.

The link is not a guessable code. The server generates 24 random bytes and renders them as a 48-character hex token, then stores it with an expiry and a use counter. Owners and editors can both create invites; viewers cannot. Every tap of Invite mints a fresh link, and old ones keep working until they hit one of their limits.

Owners get a settings sheet showing how many invite links are still outstanding for the space (the ones that have not been revoked, have not expired, and still have uses left) with a one-tap Revoke that kills all of them at once. That is the fix for the usual accident: the link got pasted into a Discord server with three hundred people in it, and you would like that to stop being true.

  • Token: 24 random bytes, rendered as 48 hexadecimal characters
  • Expires 7 days after it is created
  • Good for up to 30 joins by default (the schema permits 1 to 200)
  • Created by owners and editors; never by viewers
  • Revocable by the owner at any time — one tap kills every outstanding link for the space.
  • Automatically revoked for everyone the moment the space is archived

What happens when a classmate taps the link

The link opens Semora on a join screen that says what they are agreeing to before they agree to it: they will see shared deadlines and group assignments, and their personal grades, reminders, and planner stay private. Then there is one button.

If they are not signed in, the invite is not lost. The token is stashed on the device (Keychain on iPhone and iPad, browser storage on web) and they get sent to sign-in. As soon as they have an account, the app takes them back to the join screen with the invite still attached. Without that hand-off, a signed-out classmate's invite would quietly dead-end at a sign-up form, which is where most group invites go to die.

Joining is checked on the server, not in the app. The invite row is locked while it is verified as not revoked, not past its expiry, and not out of uses. If any of those fail, the join is refused with a plain message that the invite is invalid or expired. New members land as editors. Their display name comes from their profile, then their email's local part, then the fallback "Classmate". Tapping your own link again after you have already joined just refreshes your display name — it does not burn another use of the link, so a classmate who taps twice does not eat someone else's slot.

The three roles, and what each one can actually do

There are exactly three roles: owner, editor, and viewer. They are enforced by row-level security in the database, not just hidden buttons in the app, so a viewer stays a viewer even if someone gets creative with a modified client.

Owners manage roles from the member list. A viewer can be flipped to editor and back with one tap, and any member can be promoted to owner. Promoting someone to owner is how a sole owner hands off a space: the app confirms it first, because it grants full control including the ability to delete the space, and it leaves you an owner too so nothing changes hands by accident.

The database refuses to let a space end up with nobody in charge. The last owner cannot leave, cannot be demoted, and cannot be removed. Any of those attempts comes back as an instruction to promote another owner or delete the space first.

  • Viewer — reads shared deadlines, group assignments, and the member list. Cannot add, edit, complete, or invite.
  • Editor — everything a viewer can do, plus creating and editing group assignments, checking them off for the team, and generating invite links.
  • Owner — everything an editor can do, plus publishing course deadlines, changing roles, removing members, revoking invites, and archiving or deleting the space.
  • New joiners are editors by default; the owner can drop anyone to viewer afterward.
  • Only owners get the Publish button, so in practice the course calendar has one source of truth.

What syncs into your planner, and what stays private

Publishing is deliberate. The owner taps Publish, and Semora copies the not-yet-completed tasks from their own copy of the course into the space as shared deadlines: title, description, task type, due date, due time, and points possible. Completed work is skipped. Each shared deadline remembers the task it came from, so publishing again after the professor moves a date updates the existing entry in place instead of stacking a duplicate on top of it. The app tells you how many went out.

On the receiving side, syncing pulls those shared deadlines and every group assignment into your own planner as normal tasks. If you have not pointed the space at a course you already track, Semora creates one for you in your selected semester, named after the space, in the space's color, with a people icon so you can tell at a glance where it came from. Owners can relink a space to an existing course from the settings sheet, which re-runs the sync so the shared work lands in the course you were already using.

Once they are in your planner, they behave like any other task. Same-day reminders apply. If you are on Pro, they feed Smart Plan and show up in the Workload dashboard like everything else. Enter a score on one and it counts toward your weighted average, privately.

The line between shared and private is drawn narrowly and held in the schema. Three tables sync: members, shared deadlines, and group assignments. Your completion state is yours specifically — a re-sync refreshes a task's title and dates but deliberately never touches your checkmark, so the group finishing a task cannot silently uncheck or re-check your copy. Points possible is merged rather than overwritten, so a number you typed in yourself does not get blanked by an empty field upstream.

  • Shared with the space: shared deadlines, group assignments, member names and roles
  • Never shared: your scores, weighted average, and grade forecasts
  • Never shared: your reminder timing, quiet hours, notes, flashcards, and AI Tutor chats
  • Never shared: which tasks you have personally checked off
  • Invite links are readable only by the person who created them
  • Your synced copies are ordinary tasks — edit, reschedule, or delete them in your own planner without touching anyone else's

How the live part works

Semora keeps an open realtime subscription to the space's members, shared deadlines, and group assignments, filtered to that one space. When someone adds a group assignment or the owner republishes after a date change, the change lands on everyone's screen rather than waiting for a manual refresh.

There are two subscriptions running, not one. The space screen refreshes what you are looking at. A second, quieter one runs app-wide for every space you belong to, so a deadline published while you are on the Today tab syncs into your planner anyway, and your task list, stats, and courses all refresh with it.

The background sync is written to stay out of your way. It skips when the device is offline. It will not start a second sync for a space that is already syncing. If a sync fails, it fails silently and the space stays available for an explicit retry with the My planner button — a background collaboration hiccup should never interrupt whatever you were actually doing. It also re-runs whenever the app comes back to the foreground, which is the case that matters most: you were in class with your phone away, and three things changed while you were not looking.

Joining is free; hosting a space is Pro

Joining a classmate's Course Space is free and always will be. You do not need Pro to accept an invite, see shared deadlines, or take on group work — and you can sync all of it into your planner as long as you have room under the free plan's four-courses-per-semester cap. That matters, because the person who most needs the shared calendar is rarely the person who set it up.

Hosting your own space — creating one and running it as owner — is part of Pro, which is $3.99 a month or $19.99 a year, about $1.67 a month on the annual plan. Pro is bought in the iOS app and applies to your whole account, including the web app; there is no separate web checkout. The gate is enforced on the server, not just in the app, and if your Pro lapses the app routes you to the upgrade screen rather than showing a raw database error.

In practice that means one person in the group needs Pro, and everyone else joins for free. If your Pro lapses later, the spaces you already own do not vanish and the deadlines you already published stay published.

Leaving, removing, archiving, deleting

Editors and viewers can leave a space from its screen. Owners manage the space from Settings instead — to step away, promote another owner, then archive or delete the space (the database also blocks the last remaining owner from leaving). The app is explicit about what that means before you confirm: you stop seeing new shared deadlines and group work, and your own planner stays exactly as it is. Everything already synced into your tasks remains — you keep the semester you built, minus future updates.

Owners can remove someone else from the member list, with the same promise attached: their synced planner keeps what it already has. There is no way to reach back into a former member's account and delete their work, which is the correct behavior even when the reason for removal is that the group fell apart.

Owners get two ways to end a space. Archiving takes it out of every member's hub and revokes all outstanding invites, while leaving everyone's synced planner items untouched. Deleting is permanent: the space and all its shared deadlines and group assignments are destroyed for everyone. Even then, each member's personal task copies survive in their own planner — they simply stop receiving updates, because the link back to the space is severed rather than cascaded.

  • Leave — self only; blocked for the last remaining owner
  • Remove member — owners only; cannot remove yourself, cannot remove the last owner
  • Archive — hides the space for everyone and kills outstanding invites; planner items stay
  • Delete — permanently destroys shared deadlines and group assignments for everyone
  • In all four cases, tasks already synced to a member's planner are left alone

Where it gets awkward, and who this is really for

The honest edge cases. The invite link opens the Semora app, so a classmate who has never installed Semora will tap it and get nothing — send them to the App Store first, then resend the link. An expired or used-up link fails with a clear message rather than a blank screen, and the fix is always the same: ask for a fresh one. If you have no semester selected, the sync tells you to pick one before it can put anything in your planner. And if you are on the free plan already carrying four courses in its single allowed semester, the space's auto-created course cannot be added — you will still see the space and everything in it, but the planner sync for that one space will not have anywhere to land.

This is genuinely useful for a lab section that shares a deadline calendar, a project team splitting a build across four people, a study group that keeps missing the same quiz dates, and anyone who has been the unpaid group-chat secretary for a semester and is done with it. Assigning group assignments to a specific person, or to Everyone, is what makes the second case work — the app checks against the member list, so you cannot assign work to somebody who is not actually in the space.

It is not the right tool for a few things, and it is worth saying so. It is not a chat app; there is no messaging, only titles, notes, dates, and assignees. It is not a file locker for a shared draft. It is not a way to compare grades with the group, and that is intentional. And it is not a substitute for the LMS your school actually grades in — if your course lives in Canvas, sync that separately and use the space for the group work Canvas never knew about.