Spaces
Spaces are private environments where groups collaborate. Each space is a Dark Forest: invisible to outsiders, accessible only to members, operating under rules the group controls.
What is a Space?
A space is an identity with membership. Just like users have DIDs and profiles, spaces have DIDs and profiles. The difference: spaces have members who can participate.
When you create a space, the system creates:
- A DID for the space
- An initial profile (name, description, avatar)
- A membership list (starting with you as admin)
- Access controls (who can join and how)
Space Identity
Every space has its own identity separate from its members. The space's DID anchors its profile, content, and permissions.
This separation means:
- Members can come and go, but the space persists
- Content belongs to the space, not individuals
- The space exists independently of any single person
When someone updates the space profile, they're modifying the space's catalog, not their own. The space is its own entity.
Membership
Spaces have two roles:
Admin: Full control over the space. Can invite members, remove members, modify settings, manage join modes, and do everything members can do.
Member: Can participate in the space. View content, create posts, engage with others.
Multiple people can be admins. Admins can promote members to admin or demote other admins. The last admin can't remove themselves without first promoting someone else or deleting the space.
Joining Spaces
Spaces support three join modes:
Closed (Invite Only)
The default. Only people with invite codes can join. Admins create invite codes and share them. Each code can be used a limited number of times and can be disabled anytime.
This is the most private mode—complete control over who gets in.
Open (Direct Join)
Anyone with the space's link can join directly without approval. No invite code needed. This makes onboarding frictionless for communities that want to grow quickly.
Requires public profile: Open mode requires the space to have its public profile enabled. This means the space becomes discoverable and viewable (though not joinable without the link). You can't have an "open but private" space—open mode is inherently public.
Application (Request to Join)
Anyone can submit an application to join. Admins review applications and approve or reject them. Rejected applicants can reapply. Approved applicants become members.
This mode balances openness (anyone can apply) with control (admins decide who joins).
Changing Join Modes
Spaces can change their join mode anytime. Start closed for early formation, switch to application for growth, open it up when mature, or close it back down if needed.
Join mode is part of the space's public configuration. If the space has a public profile (see below), the join mode determines how people can request access.
Invite Codes
In closed mode, invite codes are the only way in. In application or open mode, invite codes can bypass the normal flow—typically granting instant access without the application process.
Per-admin invites: Each admin has one active invite link at a time. When they create a new invite, the previous one is automatically invalidated. This simplifies management and prevents invite link sprawl.
Each invite has:
- Usage limit: Configurable cap on how many times it can be used (default: 10, max: 100)
- Expiration: Invites expire after a set time (default: 1 week, max: 30 days)
- Join mode override: Controls how people join via this invite:
- Instant (default): Skip application flow, join immediately
- Application: Force application flow even if space is open
- Inherit: Use the space's join mode setting
- Creator: Which admin created it
When an invite expires or reaches its usage limit, the admin can regenerate it with new settings.
Applications
In application mode, people can submit join requests. Admins see pending applications and can:
- Approve: Person joins as a member
- Reject: Person is turned away but can reapply later
Applicants can cancel their application anytime before it's reviewed.
Rejected applicants aren't banned—they can submit a new application. If you want to permanently block someone, use the ban system (see below).
Application Questions
Admins can configure custom questions for applications. This helps vet applicants and understand why they want to join.
Configuration:
- Up to 5 custom questions
- Each question can be required or optional
- Questions are shown to applicants when they apply
- Responses are visible to admins when reviewing applications
Example questions:
- "Why do you want to join this space?"
- "How did you hear about us?"
- "What do you hope to contribute?"
If a space has application questions configured, they'll be shown to anyone viewing the public profile (in application mode). This sets clear expectations before people apply.
Public Profiles
Spaces can optionally enable public profiles. This makes basic space information visible to non-members at a public URL:
https://{domain}.dfos.com
Public profiles show:
- Space name and description
- Avatar and banner
- Join mode
- How to join (invite, apply, or direct join link)
Everything else—members, content, activity—remains private to members only.
Public profiles are useful for spaces that want discoverability while keeping actual collaboration private. Think of it like a homepage for your space.
Accessing public spaces: Public spaces can be viewed by anyone using either the space's DID or its domain (if it has one). Non-members see only the public profile information—no posts, no member list, no activity.
Domains
Spaces can claim domains—human-readable identifiers that make the space easier to reference and visit.
Example: metalabel.dfos.com instead of did:dfos:r7z9c4kfhne...
Properties:
- 3-63 characters, lowercase alphanumeric with hyphens
- Unique across the system
- Optional (spaces can exist without domains)
- Changeable (claim a new one, release the current one)
Domains make spaces more shareable and memorable. They're especially useful for public profiles but aren't required—public spaces are accessible by their DID even without a domain.
Some domains are reserved to prevent abuse (admin, api, system, etc.).
Member Management
Admins can:
- Promote to admin: Give members full admin permissions
- Demote to member: Remove admin permissions (including from themselves)
- Remove members: Kick someone from the space
- Ban members: Remove and prevent all future joins
When you remove someone, they lose access immediately. The space disappears from their view as if it never existed.
Bans
Bans prevent someone from rejoining through any method—invite codes, applications, or direct join. Banned members can't come back unless an admin explicitly unbans them.
Bans are permanent until lifted. Use them for people who violated guidelines or who you never want returning.
Space Profiles
Spaces have the same profile fields as users:
- Name: How the space appears
- Description: Purpose, guidelines, or context
- Avatar: Space image
- Banner: Header image
- Background: Additional styling
Any admin can update the space profile. Updates are cryptographically signed and versioned, creating an audit trail of who changed what and when.
Visibility
Spaces are only visible to their members. If you're not in a space, you can't see:
- That the space exists (unless it has a public profile)
- Who the members are
- Any content inside
- Member activity
With a public profile enabled, non-members can see basic information (name, description, how to join) but nothing more.
This makes spaces true Dark Forests: hidden from view unless you have explicit access.
Space Lifecycle
Creating: Create a space, optionally claim a domain, set up the profile, configure join mode, start adding members.
Growing: Share invite codes or enable public profile with application/open mode. Promote trusted members to admin. Build out content and activity.
Managing: Monitor membership, moderate as needed, adjust join mode based on growth stage, ban problematic members if necessary.
Sunsetting: Remove all members, or delete the space entirely. Deletion is irreversible.
Alternatively, spaces can go dormant. If all members leave voluntarily, the space still exists but becomes inaccessible until someone joins again.
Design Philosophy
Spaces embody DFOS's approach to private collaboration:
Member-controlled: Admins make the rules. No platform moderation, no corporate policies.
Privacy-first: Default invisible. Public profiles are opt-in and only show what you choose.
Flexible access: Three join modes support different community models—from tight-knit groups to open communities.
Group identity: The space is an entity separate from individuals. It persists as membership changes.
Minimal metadata: Only what's necessary. No vanity metrics, no activity feeds for outsiders.
This creates environments where groups operate on their own terms, invisible unless they choose otherwise.