Lore Integration
Track revisions from Epic Games’ open-source, content-addressed version control system.
Table of contents
- Overview
- Configuration
- Setup Steps
- Revision Delivery
- Webhook Payload Contract
- Features
- Troubleshooting
- API Reference
- Best Practices
Overview
Lore is Epic Games’ next-generation, open-source (MIT) version control system, written in Rust and built for the large binary assets of game development. It is content-addressed (a Merkle tree over an immutable revision chain), chunks binary files for fragment-level deduplication, supports sparse/lazy workspaces, and is the built-in VCS for UEFN (Unreal Editor for Fortnite).
ButterStack integrates with Lore to:
- Record every revision pushed to the branches you watch (by content hash and monotonic revision number)
- Track changed assets through the shared asset pipeline (lineage, versions, approval requests)
- Surface revisions and assets alongside your builds and tasks
- Health-check your Lore server’s HTTP endpoint
Why a relay? Lore’s stock
loreserverships no built-in webhook — server hooks are compiled into the binary. ButterStack therefore receives revisions through the lightweightbin/lore-bridgerelay, which you run near your Lore server.
Configuration
Connection Settings
| Field | Description | Required | Example |
|---|---|---|---|
remote_url | Lore server address (lore://host:port/repo) | Yes | lore://lore.company.com:41337/your-repo |
lore_repository | Repository name (defaults to the path in remote_url) | No | your-repo |
lore_branch | Branch to monitor for new revisions | No | main |
watch_paths | Paths of interest for asset tracking (comma-separated) | No | /Content/, /Source/ |
ButterStack derives the health-check URL from the remote host using Lore’s HTTP port: http://<host>:41339/health_check.
Credentials
| Field | Description | Required |
|---|---|---|
auth_token | Bearer token from lore auth login (used by the relay) | No* |
identity | The Lore identity recorded on revisions | No |
* Lore servers run unauthenticated when [server.auth] is omitted. Provide a token only if your server requires one. ButterStack’s /health_check probe never needs it.
Setup Steps
1. Add the Integration
- Go to Project Settings → Integrations
- Click Add Integration and select Lore
- Enter your
remote_url(and optionally repository, branch, auth token) - Click Test Connection (probes the server’s
/health_check) - Save the integration
2. Install the Lore CLI
curl -fsSL https://raw.githubusercontent.com/EpicGames/lore/main/scripts/install.sh | bash
3. Run the relay
See Revision Delivery below.
Revision Delivery
Option A: lore-bridge relay (recommended)
Run the relay on a host that can reach your Lore server. It detects new revisions, fetches the changed-file list, and POSTs them to ButterStack:
bin/lore-bridge \
--remote lore://lore.company.com:41337/your-repo \
--webhook "https://your-butterstack.com/webhooks/lore?token=YOUR_WEBHOOK_TOKEN" \
--branch main
Useful flags:
--test— POST one synthetic revision and exit (no Lore server needed; great for verifying the webhook)--dry-run— print the JSON payload instead of POSTing--once— poll a single time and exit--interval <seconds>— poll cadence (default 15)
Under the hood the relay subscribes to / polls Lore for BranchPushed events and enriches each with lore revision info --delta. The Lore CLI does not emit JSON today, so parsing is best-effort; the robust long-term form is a gRPC client against Lore’s NotificationService + RevisionService.
Option B: Server-side hook (self-hosted loreserver)
If you build your own loreserver, compile in a BranchPush hook whose async post_handler POSTs to the webhook URL, then enable it in your server config:
[hooks.butterstack]
enabled = true
webhook_url = "https://your-butterstack.com/webhooks/lore?token=YOUR_WEBHOOK_TOKEN"
Webhook Payload Contract
The relay (or your hook) POSTs this JSON to /webhooks/lore?token={webhook_token}:
{
"revision": "a1b2c3d4e5f6",
"revision_number": 1052,
"branch": "main",
"repository": "your-repo",
"user_id": "alice",
"timestamp": "2026-06-17T14:21:00Z",
"files": [
{ "path": "Content/Hero.uasset", "action": "Add", "size": 1048576, "is_file": true }
]
}
Only revision is strictly required. Files use Lore’s Add / Modify / Delete actions. Duplicate revisions within 30 seconds are de-duplicated.
Features
Revision Sync
When a revision is pushed:
- ButterStack receives the relay’s webhook
- Creates a
Changelistrecord keyed by revision number (with the content hash, branch, and repository in metadata) - Runs the changed files through the shared asset analyzer — creating/updating assets, lineage, and versions
- Raises approval requests for any approval tags found
Asset Tracking
Files with recognized asset extensions (.uasset, .fbx, .png, .wav, …) are tracked as assets, the same way Perforce changelists are — so asset lineage and approvals work identically regardless of which VCS you use.
Troubleshooting
Test Connection reports “Could not reach Lore server”
This is expected if your Lore server isn’t reachable from ButterStack (e.g. it’s on a private network). Revision delivery still works — the relay runs near your server and POSTs out to ButterStack. The connection test only probes the optional HTTP health endpoint.
No revisions appear
- Confirm the relay is running and pointed at the right branch (
--branch) - Verify the webhook token in the relay’s
--webhookURL matches the integration - Send a
bin/lore-bridge --testrevision to confirm the webhook path end-to-end - Check Integration → Webhook events for received/failed events
Assets aren’t created
Only files with recognized asset extensions become assets. Code/text files are recorded on the revision but not tracked as assets.
API Reference
Webhook Endpoint
POST /webhooks/lore?token={webhook_token}
GET /webhooks/lore/verify
See the payload contract above.
Best Practices
- Run the relay close to your server — lower latency, and it works even when ButterStack can’t reach Lore directly.
- Watch a specific branch — point the relay at your mainline to avoid noise from feature branches.
- Use
--testfirst — confirm the webhook works before wiring up the live stream. - Only add a token if your server requires one — most evaluation servers run unauthenticated.