# 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