- Exists — it’s in Firestore, its manifests + assets are in GCS, and anyone with access (owner or active dev) can pull it.
- Deleted — the Firestore doc is gone, every blob under
shared_presentations/<id>/has been removed, every collaborator row is dropped. Irreversible.
State transitions
| Action | What happens |
|---|---|
push (first time) | Creates the deck in state Unshared. No viewer URL exists yet. |
push (subsequent) | Bumps the version. No effect on sharing state. |
share <id> | Mints a viewer token. Moves deck to Shared. |
unshare <id> | Revokes all tokens. Moves deck back to Unshared. |
unshare <id> --token <t> | Revokes one token. State depends on whether any other tokens remain active. |
delete <id> | Wipes the deck. Moves to Deleted. |
Why no archive?
Archive in v0.1–v0.4 meant “this deck is soft-deleted; you can’t push to it, its URLs return 404, but the data is kept in case you want to restore it.” Two problems:- It blocked owners from pushing, which broke the “I pushed, now I want to stop it being public” use case. They had to unshare AND unarchive to keep working.
- Restore was never implemented. Archive was in practice “deleted but lingering.”
unshare (revoke tokens, keep the deck fully functional for editing) and delete (hard remove) gives each operation one clean job.
What about “shared with me”?
Having dev access to a deck (see Collaboration) is independent of the deck’s own lifecycle. A shared deck can be inUnshared state — collaborators can still push and pull. They see it in slideless list with role: 'dev'.
When the owner deletes a deck, every collaborator row is dropped and the deck disappears from collaborators’ list.