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 Global Settings → Administration → 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, then the namespace catalog of everything inside the Space. 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 as node.PreRenderedHtmlcontent.body → default welcome text. So to replace the generic starter text, just set content.body. Leaving it empty falls back to the welcome placeholder — which is the "generic template text" you see on a fresh Space.

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. The live namespace catalog, embedded inline (next section).

Embedding the namespace catalog (the search that expands by namespace)

The catalog is the Search layout area: a mesh search in namespace-tree mode, scoped to the Space's own partition, that lets you drill into sub-namespaces with lazy-loaded counts and a search box. It is not hard-wired into the page — it lives in the body as a deletable @@-embed (the default welcome page ships one), so the space owner controls whether and where it appears. Delete the embed line to drop the catalog; move it to reposition it. Embed it with:

@@/Acme/area/Search

In an authored body, use the absolute form (leading / + full Space path): it resolves regardless of render context because it carries its own address. The default welcome page (shared by every Space) uses the relative @@("area/Search"), which resolves against the Space's own path at render time. @@ (double-at) renders the area inline; a single @ would render a hyperlink instead. The Search area defaults to the namespace tree; tune it with ?groupBy=type|category|namespace|flat and ?subtree=true — see Mesh Search & Catalogs.

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\n## Everything in this space\n\n@@/Acme/area/Search\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)
Show the namespace catalog in the body Embed @@/{Space}/area/Search (?groupBy=type to group by type)
Reconnecting…
The server was updated. Reloading the page to pick up the latest version.