aboutsummaryrefslogtreecommitdiff
path: root/docs/projects.md
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-03-23 12:23:19 +0100
committerGitHub Enterprise <[email protected]>2026-03-23 12:23:19 +0100
commit26aa50677403e4c5ad053b221bc7264fe1d249f2 (patch)
treede196528390e8875b0551d52071038120d969f73 /docs/projects.md
parentProcess management improvements (#881) (diff)
downloadzen-26aa50677403e4c5ad053b221bc7264fe1d249f2.tar.xz
zen-26aa50677403e4c5ad053b221bc7264fe1d249f2.zip
Documentation updates (#882)
Restructured the docs folder in preparation for more docs. Improved the contents a bit.
Diffstat (limited to 'docs/projects.md')
-rw-r--r--docs/projects.md123
1 files changed, 123 insertions, 0 deletions
diff --git a/docs/projects.md b/docs/projects.md
new file mode 100644
index 000000000..158b4e3e1
--- /dev/null
+++ b/docs/projects.md
@@ -0,0 +1,123 @@
+# Project Store
+
+The Project Store service provides per-project storage for asset metadata,
+editor state, and other project-specific data. Unlike the cache, which stores
+ephemeral derived data, the project store manages persistent data that tracks
+the state of an Unreal Engine project.
+
+## Concepts
+
+### Project
+
+A project is a named container identified by an alphanumeric string (with
+underscores and dots allowed). Each project holds one or more operation logs.
+
+One project typically corresponds to a project (`.uproject`) on disk, and
+will generally hold one operation log per cooked platform.
+
+### OpLog (Operation Log)
+
+An operation log is a sequential transaction log associated with a build target
+or variant within a project. Each oplog tracks changes as an ordered sequence of
+operations, identified by a Log Sequence Number (LSN). The operation log is
+append-only and entries are immutable once written.
+
+### Operation Log Entry (Op)
+
+An atomic unit in the oplog. Most operations correspond to a cooker package save
+and will contain data associated with that asset. Each operation has:
+
+- **Key** — a unique OID identifier determined by the client. This is typically derived from the asset name associated with the entry.
+- **LSN** — its position in the oplog sequence
+- **Metadata** — free-form structured data used by the cooker/editor
+- **Data** — the operation payload (structured or unstructured)
+- **Attachments** — referenced binary chunks stored in CAS
+
+An oplog may have more than one oplog entry with the same Key. In this case the entry which the highest LSN (i.e the most recent entry)
+will be considered "current" and will be served if a client requests data for a particular Key.
+
+### Chunk
+
+A binary data blob referenced by operation log entries. Chunks are stored in CAS and
+identified by their content hash, providing automatic deduplication.
+
+## API
+
+**Base URI:** `/prj/`
+
+### Project Management
+
+```
+GET /prj/ # List all projects
+POST /prj/{project} # Create a project
+PUT /prj/{project} # Update project metadata
+GET /prj/{project} # Get project info
+DELETE /prj/{project} # Delete a project
+```
+
+### OpLog Management
+
+```
+GET /prj/{project}/oplog/{target} # Get oplog info (head LSN)
+POST /prj/{project}/oplog/{target} # Create oplog
+PUT /prj/{project}/oplog/{target} # Update oplog
+DELETE /prj/{project}/oplog/{target} # Delete oplog
+```
+
+### Operations
+
+```
+GET /prj/{project}/oplog/{target}/entries # List operations with LSN
+GET /prj/{project}/oplog/{target}/{lsn} # Get operation by LSN
+POST /prj/{project}/oplog/{target}/new # Create new operation
+POST /prj/{project}/oplog/{target}/batch # Batch create operations
+```
+
+### Chunks
+
+```
+POST /prj/{project}/oplog/{target}/prep # Prepare chunk uploads
+GET /prj/{project}/oplog/{target}/{chunk} # Get chunk by ID
+GET /prj/{project}/oplog/{target}/{chunk}/info # Get chunk metadata
+GET /prj/{project}/oplog/{target}/chunkinfos # Batch chunk info
+GET /prj/{project}/oplog/{target}/files # List files in oplog
+```
+
+### Import / Export
+
+```
+POST /prj/{project}/oplog/{target}/save # Export oplog
+GET /prj/{project}/oplog/{target}/load # Import oplog
+```
+
+### Validation
+
+```
+POST /prj/{project}/oplog/{target}/validate # Validate oplog integrity
+```
+
+### Detailed Inventory
+
+```
+GET /prj/details$ # All projects
+GET /prj/details$/{project} # Single project
+GET /prj/details$/{project}/{target} # OpLog details
+GET /prj/details$/{project}/{target}/{chunk} # Operation details
+```
+
+Add `?csv=true` for CSV output, `?details=true` for size information, or
+`?attachmentdetails=true` for full attachment listings including CAS references.
+
+## Storage Lifecycle
+
+Project store entries have configurable expiration. Expired entries are removed
+during garbage collection. The expiration duration is set globally via the
+`MaxProjectStoreDuration` configuration parameter.
+
+## Web Dashboard
+
+The Projects page in the dashboard shows:
+
+- List of all registered projects
+- Per-project oplog details and operation counts
+- Storage usage per project