For programmers

You pick it. You also support it.

Whoever chooses the version control system on an Unreal Engine 5 team ends up owning it: the setup, the onboarding, the 'my sync is stuck' messages, the server that fills up on a Friday. USourceControl is built so that job stays small. Text and binaries in one system, a REST API when you need to automate, and no infrastructure to run.

Purpose-built

Built for the person who has to maintain it

Code and content together

C++, .ini, .json, and .uplugin version alongside your assets, with full per-file history and one-click restore. Binaries version and lock. One system, one source of truth, no reconciling two histories.

Nothing to run

No Perforce server to size, patch, and back up. No LFS server. No storage to provision as Nanite meshes grow. The maintenance burden is genuinely zero.

REST API and project keys

The sync, upload, commit, history, restore, and locking flows the desktop app runs on are all public REST endpoints, authenticated with scoped project keys. Automate onboarding, build pipelines, or whatever you need.

Webhooks for your pipeline

Commits, merges, and membership changes fire outbound webhooks, so CI, Discord notifications, and your own tooling can react without polling.

Auditable access control

Org roles plus per-project membership decide who sees what. Every access is through short-lived, project-scoped signed links, keys are device-locked, and the audit log on Studio records who did what.

A local agent for editor integration

The desktop app exposes a localhost-only, token-authenticated HTTP API for status, checkout, checkin, revert, and history. It's the interface our in-development Unreal plugin is built on, and it's available to any tooling you want to write today.

Why the usual answers put the work on you

Every option in this category moves cost somewhere, and the honest question is whether it lands on you. Perforce handles Unreal projects genuinely well, including the many-small-files pattern that One File Per Actor produces. The cost is that someone provisions the server, sizes the storage, configures the client specs, tests the backups, and fields the questions. On a team without dedicated infrastructure staff, that someone is you, and it is not a small job. Git with LFS is free and familiar, so it is the default reach. It degrades in ways that are your problem to diagnose: pointer-file accidents that silently replace assets with text stubs, bandwidth bills that move without a code change, and an index that slows to a crawl once a World Partition level fills with external actor files. Self-hosting Lore, Epic's open-source option, is a legitimate choice if you want to own the stack. It is still a server you run. We are the version where that work does not exist. That is the whole pitch, and whether it is worth a subscription depends entirely on what your hours are worth.

Keeping C++ in Git, if you want to

Plenty of teams want code review in a pull request and are not giving that up. That is a reasonable position and we do not ask you to. A common split is C++ in Git, where line diffs and PRs work properly, and Content in USourceControl, where large binaries and locking work properly. Each system does what it is good at. The cost is two histories to reason about and a rule your team has to remember about which lives where. Be clear-eyed about the alternative: we version text files with full per-file history and one-click restore, but we do not do line-level diffs or pull-request review, so consolidating means giving those up. Teams with a strong code-review culture usually keep Git; teams where most of the headcount is art usually consolidate and do not miss it.

Automating the boring parts

The REST API covers file sync status, uploads, commits, version listing, restore, and file locking, authenticated with a project key using the usc_ prefix. Enough to script onboarding, wire a build agent, or pull a specific revision in CI. Outbound webhooks cover the other direction: commit, merge, membership, and plugin events dispatch to your endpoint so you can drive notifications or pipelines without polling. For editor-side integration, the desktop app runs a localhost-only HTTP API with a per-launch bearer token, discoverable through a small file in the user's home directory. Our Unreal editor plugin is being built against exactly that interface, and the interface itself is live today — so anything the plugin will do, your own tooling can already do.

FAQ

Common questions

Can I keep my C++ in Git and use USourceControl for content?

Yes, and it's a common setup. Keep code in Git where pull requests and line diffs work well, and put Content in USourceControl where large binaries and locking work well. The trade is two histories and a rule new hires have to learn. Running everything in one system also works — text files version with full history and one-click restore — but we don't offer line-level diffs or PR review, so that's the thing you'd be giving up.

Is there an API?

Yes. A documented REST API covers sync status, upload, commit, file versions, and restore, authenticated with project keys prefixed usc_. See /docs/api for the full reference with curl examples.

How will the Unreal Engine plugin work?

The desktop app already runs a localhost-only, token-authenticated HTTP agent exposing status, checkout, checkin, revert, and history. The plugin under development is a thin client over it, so it holds no credentials of its own and never talks to the cloud directly. Until it ships you work through the desktop app alongside the editor — and the agent API is available today if you want to build your own integration against it.

What happens to my project if I stop paying?

Your files stay yours and you can export them at any time, on any plan. There's no lockout from your own content and no proprietary format to escape from: what you get back is your project folder as you'd expect it.

Do you support webhooks for CI?

Yes. Commit, merge, member, and plugin events dispatch as outbound webhooks to endpoints you configure at the org level, so your pipeline reacts to changes instead of polling for them.

How does sync avoid clobbering local work?

Sync never overwrites uncommitted local changes. The decision logic is pure and unit-tested: local modifications are always preserved, and a remote deletion only applies to a local copy that is byte-identical to what was deleted. When there's a genuine conflict, you're asked rather than overruled.

How does it handle One File Per Actor and World Partition?

Fine, and deliberately so. OFPA produces thousands of small binary files per level, which is where Git LFS starts to struggle because each one needs a pointer. We compare SHA-256 hashes and move only what changed, with up to 25,000 files in a single commit and per-file locking so people editing different actors never block each other.

Make source control someone else's job

No server, no LFS, no pager. From $25/user/mo with unlimited storage and bandwidth, free for solo devs.

Create your first project