Spaces

A Space is a container for work that belongs together — a company, a team, a project, or an initiative. It is the unit of storage, access, and collaboration in MeshWeaver: everything inside a Space shares one home, one set of access rights, and one group of collaborators.

In one sentence: a Space groups related content, with common access rights and collaborators, behind a single boundary.

What a Space actually is

Your own personal partition ({your-id}/…) is effectively your private space — use it for personal drafts. Create a Space when work needs to be shared.

When to create a Space

Create a Space when you have a coherent body of work and a set of people who should share access to it. The two questions that decide it:

  1. Does this stuff belong together? Same topic, same goal, same lifecycle.
  2. Do these people share roughly the same access? The collaborators and their rights are common-ish across everything in it.

If both are yes, it's one Space.

Right-sizing: as small as possible, as large as necessary

A Space should be as small as possible, as large as necessary.

Rule of thumb: if two bodies of work have different collaborators or different access needs, they belong in different Spaces. If they share collaborators, access, and purpose, keep them in one Space and organize with folders/pages inside it.

What lives inside a Space

Once a Space exists, everything created under it — pages and documents, threads and chats, agents, demos, uploaded files — lives in the Space's partition and is governed by the Space's access. To add content you don't create another top-level node; you create it inside the Space.

Access and collaborators

Because access is set once at the Space level and inherited by its contents, grouping by common-ish access rights is what keeps administration simple. That is the main reason to draw the boundary where you draw it.

Creating a Space

Any signed-in user can create a top-level Space and immediately becomes its Admin:

You cannot create ordinary content (a Markdown page, a Code node, a Group…) directly at the top level — the root is reserved for partitions. Put it in your own space ({your-id}/…) or create a Space first and add it there. This is by design: it prevents stray top-level content and keeps every node inside a clear access boundary.

What gets created (and what does not)

Creating a Space Acme (empty namespace, id Acme) automatically produces:

There is no separate "Overview" or "Home" page. A common mistake is to create a Markdown child like Acme/Overview and treat it as the landing page. Don't — the Space node is the landing page, and a stray Overview node just duplicates it. The text below is everything you need to make Acme itself look good.

Deleting a Space

Deleting a Space removes the entire partition from the system — the exact inverse of creating one. Use the Space's node menu (top-right ⋯) → Delete (type DELETE to confirm), or send a recursive DeleteNodeRequest at the Space's path. The operation:

This is irreversible — there is no recycle bin for a dropped partition. Only users holding Delete on the Space (its Admins, or a global admin) can do it. Global admins can also reach it from Admin app (/Admin) → Partitions.

Authoring your Space's home page

When someone opens Acme, the Space's Overview renders, in order: a header (logo + name + description + links), then your body markdown — and nothing after it. The Space's contents are listed in the index on the left (the side rail), which the platform derives for the Space page, markdown pages and typed pages on their default Overview. All of it is driven by fields on the Space node's content — you never create a second node for it.

The fields you set

Field (content.…) Shows up as
(node Name) The large title in the header. This lives on the MeshNode, not in content — the Space content carries no name, so patching content.name silently does nothing.
description Sub-title under the name (one line, markdown allowed).
logo The 100×100 header image. An https://… URL or a file in the Space's content collection. Falls back to the node icon, then to initials.
body The main page content — markdown. This is your "overview text".
website, email, location Small linked stats in the header row.
icon A renderable value used where no logo is set — an image URL, an inline <svg>, or an emoji. Never a Fluent icon name: a bare name like Building cannot render as an image and shows as text or a broken image. Defaults to /static/NodeTypeIcons/space.svg.

The body is resolved from the authored content.body first (or content.content on a markdown-backed Space), then source-absent cached HTML, then the default welcome text. Set content.body to replace the generic starter text. An empty string explicitly clears the page; an absent or null body uses the welcome placeholder on a fresh Space. Current source always wins over older prerendered HTML, so an edit or clear appears in both the first HTTP response and the interactive page. See Public Web Presence.

Writing a good overview body

Treat content.body as the front door. A strong one usually has:

  1. A short summary of what the Space is for.
  2. Curated links to the important material inside it. Link with the unified path syntax so links survive moves and renames:
    • [Balance sheet model](@/Acme/Reports/BalanceSheet) — link to a node by path. (@/… is markdown-link-only; never put it in raw <a href>.)
    • Relative links also work from the Space body: a link written as [Reports](Reports) resolves against the Space path (Acme/Reports).
  3. Nothing that restates the index. Do not end the body with a ## Contents / ## Everything in this space section and a catalog embed: the side rail already lists every page — one index for the whole Space, the same on every page, with the reader's position marked. A catalog at the bottom is a second, worse copy of it.

The index is the side rail — not a catalog in the body

The Space page, markdown pages and typed pages on their default Overview carry the index on the left, derived from the Space's children. That is where readers navigate the Space's contents, so such a body never needs a "children section"; the default welcome page ships none. (A page a node type supplies itself through WithNodePage has no rail yet — see The Supplied Navigation Rail.)

Embed a catalog (the Search layout area, @@/Acme/area/Search) only when the listing IS the content — a log or register, a store or catalog page, a filtered or grouped view the rail cannot express (?groupBy=type|category|namespace|flat, ?subtree=true), or a typed node that renders without the rail — and put it under a heading that names what it is (## Open incidents, not ## Contents). In an authored body use the absolute form (leading / + full path), which resolves regardless of render context; @@ renders the area inline, a single @ renders a hyperlink. See Mesh Search & Catalogs.

Order the pages

The rail orders each level by the node's order, then by name — a page without order sorts after every page that has one, alphabetically. So always set order on every child page of multi-part content (10, 20, 30, … leaves room to insert later), so the index reads in its logical order and never alphabetically by accident. Set it on the node, not in content:

// patch @Acme/Reports/Methodology
{ "order": 20 }

The Space's body itself is read from MeshNode.Content (the Space record) — there is no separate Space data stream. The Overview reads the node's content directly, which is why setting content.body / content.logo is all you need.

Setting it all via MCP

The home page is plain node content, so one patch against the Space node does it:

// patch @Acme  (content is the Space record)
{
  "content": {
    "logo": "https://example.com/acme-logo.png",
    "description": "Acme's shared workspace for pension analytics.",
    "body": "# Acme\n\nWelcome to Acme's workspace…\n\n## Explore\n\n- [Reports](@/Acme/Reports)\n- [Data model](@/Acme/Datenmodell)\n"
  }
}

patch merges (RFC 7396), so you only send the fields you want to change. If the logo doesn't appear, check two things: the field is actually content.logo (not the node icon), and the image host allows hot-linking — some CDNs (e.g. LinkedIn media URLs) return 403 to off-site <img> requests, in which case upload the image into the Space's content collection and reference it instead.

Quick reference

You want to… Do this
Share a body of work with a team Create a Space, invite the team
Keep a private draft Use your personal partition ({your-id}/…)
Add a page/doc/thread to a team's work Create it inside the team's Space
Separate two efforts with different collaborators Use two Spaces
Organize within one team's work Folders/pages inside one Space
Set the Space's landing page Edit content.body on the Space node — no separate Overview page
Add a logo Set content.logo (an https://… URL or a content-collection file)
List the Space's pages Nothing to do — the index on the left lists them; never end a body with a catalog
Put the pages in a logical order Set order on every child page (patch {"order": 10}, 20, 30, …)
Show a listing that IS the content (log, register, store page, grouped view) Embed @@/{path}/area/Search (?groupBy=type to group by type) under a heading naming it