Refract ships as a private GitHub repository you own as a collaborator. When new versions ship — new adapters, bug fixes, architectural improvements — you pull them in the same way you’d pull from any upstream remote. No forced upgrades, no breaking changes without warning.
How it works
When you purchased Refract, you were added as a collaborator with pull access to the private repository. Your project has two remotes:
origin — your own repository where your product lives
upstream — the Refract repository where updates come from
Updates flow one way: from upstream into your origin. You decide when to pull and how to handle conflicts.
Initial setup
If you haven’t added the upstream remote yet, do it once:
git remote add upstream https://github.com/refract/bp-template.git
git fetch upstream
Verify both remotes are set up:
You should see both origin and upstream listed.
Pulling an update
When a new version ships, you’ll be notified in #announcements on Discord. Here’s how to pull it into your project:
- Fetch the latest from upstream:
- Check what’s changed:
git log upstream/main --oneline
- Merge into your branch:
- Resolve any conflicts (see Handling conflicts below).
- Verify everything still works:
make fresh-start
make test-all
Always run make test-all after merging an update. If tests pass, the merge is safe. If they don’t, the output will tell you exactly what broke.
Handling conflicts
Most updates won’t conflict with your code — Refract’s changes tend to happen in infrastructure and tooling files, while your product code lives in different areas.
The files most likely to conflict:
| File | Why |
|---|
apps/backend/src/configuration/development.ts | New config fields added |
apps/backend/src/core/billing/ | Billing improvements |
apps/backend/src/core/auth/ | Auth improvements |
compose.yml | New services or updated ports |
Makefile | New make targets |
When in conflict, the rule is simple: keep your product logic, take Refract’s infrastructure improvements. If you’re unsure, paste the conflicting section in #help on Discord and I’ll tell you which side to take.
git status # see what's conflicting
git add <resolved-file> # mark each file as resolved after editing
git commit # complete the merge
The smaller and more focused your changes to Refract’s core files, the fewer conflicts you’ll have. If you find yourself heavily modifying compose.yml or core configuration files, consider whether those changes belong in your product layer instead.
What updates include
Updates are announced in #announcements on Discord with a summary of what changed. They generally fall into these categories:
New adapters — new providers for existing tools (e.g. a Resend mailer adapter, a new deployment strategy). These are additive — no conflicts expected.
Bug fixes — fixes to existing behaviour. Usually safe to take wholesale.
Architectural improvements — refinements to patterns, new abstractions, better TypeScript types. May require minor adjustments to code that extends those patterns.
Breaking changes — rare, but when they happen they’ll be clearly marked in the announcement with a migration guide. Breaking changes are never shipped silently.
If you’ve diverged significantly
If you’ve been building for a while and the merge looks overwhelming, don’t panic. A few options:
Cherry-pick specific commits — instead of merging everything, pick only the commits you want:
git cherry-pick <commit-hash>
Ask for help — post in #help with your situation. If you’re on the Studio plan, this is exactly what the architecture call is for.
Skip the update — you own the code. If an update doesn’t add value for your project right now, you don’t have to take it. Your existing codebase won’t break.
What’s next?
- Support — Discord, bug reports, and how to reach me directly.
- Getting started — back to the beginning if you need a fresh orientation.