Space Agent organizes all application code and user data into three logical layers: L0, L1, and L2. This layered model is what lets the sameDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/agent0ai/space-agent/llms.txt
Use this file to discover all available pages before exploring further.
/mod/... URL resolve to different implementations for different users and groups, and it is what makes the admin shell firmware-only while the main app shell reflects per-user and per-group customizations. Understanding layers is foundational to understanding how modules, skills, and settings work throughout the platform.
The Three Layers
L0 — Firmware
Immutable repo-owned code. Nobody writes L0 at runtime. Changes arrive through software updates only.
L1 — Group Customware
Per-group customizations. A user may write to
L1/<group>/ only if they manage that group. _admin members may write any L1 path.L2 — User Customware
Per-user customizations. Each user writes to their own
L2/<username>/. _admin members may write any L2 path.Logical Paths vs. Physical Paths
Logical layer paths stay stable even when the writable roots are relocated. Frontend code, skill files, and API calls always use logical paths:CUSTOMWARE_PATH is set, the writable roots relocate but the logical paths do not change:
app/L1 and app/L2 are transient runtime state in the repo and are gitignored. Do not treat them as durable framework structure.Permission Model
| Who | Can write |
|---|---|
| Any user | Their own L2/<username>/... |
| Group manager | L1/<group-id>/... for groups they manage (direct or through a managing-group chain) |
_admin member | Any L1/ and any L2/ path |
| Nobody | L0/ — ever |
User Storage Layout
Every user’s data lives underL2/<username>/:
When
CUSTOMWARE_GIT_HISTORY is enabled, each L2/<username>/ root may have its own local Git history managed by the server. Rollback intentionally ignores meta/password.json, meta/logins.json, and meta/user_crypto.json so time travel never alters current login, password, or wrapped browser-key state.space.api.userSelfInfo():
The
userSelfInfo() response uses camelCase for JavaScript APIs (fullName), but the persisted layer file uses snake_case (full_name in ~/user.yaml). Always write full_name to the file, not fullName.Group Storage Layout
Groups live underL1/<group-id>/ and are described by a YAML manifest:
group.yaml manifest controls membership and management:
| Field | Meaning |
|---|---|
included_users | Direct user members of this group |
included_groups | Nested group members |
managing_users | Users who may write to this group’s L1 area |
managing_groups | Groups whose members may write to this group’s L1 area |
Special Groups
_all
Every authenticated user belongs to
_all. L0 firmware lives under L0/_all/ and is readable by everyone._admin
Members of
_admin can write any L1 and L2 path and access the /admin firmware shell.Git History for Writable Layers
WhenCUSTOMWARE_GIT_HISTORY is enabled, the server maintains an optional per-owner local Git history for each L1/<group>/ and L2/<user>/ root. This powers the Time Travel page at #/time_travel, which lets users page through commits, inspect diffs, preview states, and roll back or revert changes.
The history APIs are available on the frontend through: