Migrating from Frigate to Fregata
If you’ve been running Frigate in Docker on a Mac (Docker Desktop, OrbStack, Colima, …), this page is the walkthrough for switching to a native Fregata install. Most of your config carries over unchanged. The bits that change are the parts that were Linux-shaped to begin with — detectors, hardware-acceleration flags, paths.
Why migrate
Section titled “Why migrate”Running Frigate in Docker on a Mac forces every frame through a Linux VM that doesn’t have access to:
- The Apple Neural Engine — no detector accelerator inside the VM means object detection runs on the CPU at >50 ms / frame.
- VideoToolbox — H.264 / HEVC decode and encode happen on the CPU, not the dedicated media engine.
A native Fregata install gets both. Detection drops to ~1–2 ms per frame on the ANE. Decode and encode move to the media engine. On a 6-camera 2160p install, the CPU usage difference is dramatic — typically 60-70% → 7-8% while running object detection at full resolution and full FPS!
Before you start
Section titled “Before you start”Spend a few minutes inventorying the existing Docker setup so each step has a known target.
- Where is
config.ymlon the Mac filesystem? Check thevolumes:section of your Docker Compose file — look for the host path mapped to/config. Common spots are~/docker/frigate/config,/Volumes/Storage/frigate/config, or wherever your stack put it. - Where are recordings? Same treatment — find the host path
mapped to
/media/frigate. Often a separate volume on a larger drive or a network share. - What detector are you using? Open
config.ymland look at thedetectors:block. - Are you using a custom model?
model.pathor aplus://Frigate+ identifier inconfig.yml. - What’s wired up? MQTT (which broker?), Home Assistant (where running, what URL is it pointing at?), reverse proxy, push services.
Write the answers down or just keep the Docker Compose file open in another window. You’ll need them in steps 3 and 6.
Step 1: Stop Frigate cleanly
Section titled “Step 1: Stop Frigate cleanly”From the directory holding your docker-compose.yml:
docker compose downWait for the container to exit before going further. If you have
a long-running event in progress, give it a moment — Frigate
flushes the active recording to disk on shutdown, and a kill -9
during that window leaves a zero-byte segment.
If you’re running Frigate as a stand-alone container without Compose:
docker stop frigate && docker rm frigateDon’t delete the volumes yet. We’ll need them in step 3, and they’re a free safety net if you decide to roll back.
Step 2: Install and activate Fregata
Section titled “Step 2: Install and activate Fregata”Follow Installation to drag Fregata to Applications and grant the local-network permission, then Activation to enter your license (or start a 30-day trial).
This will bring you to the Fregata Welcome Dialog where you can set some initial settings.
Step 3: Move your data
Section titled “Step 3: Move your data”You have two choices. Pick whichever maps to how your storage is laid out today.
Path A: Point Fregata at your existing Docker host paths
Section titled “Path A: Point Fregata at your existing Docker host paths”Best if your Docker volumes already live on a fast SSD that you’re happy with — there’s no point in copying data around. On Fregata’s Welcome Dialog:
- Config folder — pick the
host path that was mapped to
/config(e.g.~/docker/frigate/config). - Media Folder — pick the
host path that was mapped to
/media/frigate.
Fregata reads from the chosen paths in place. Your existing
config.yml, the SQLite events database, recordings, clips, and
Frigate+ model cache all stay where they are.
Path B: Move data into the standard ~/Fregata/ layout
Section titled “Path B: Move data into the standard ~/Fregata/ layout”Best if your old Docker volumes lived somewhere awkward
(/var/lib/docker/... inside the VM, an external drive you’d
rather decommission, etc.) and you’d like a clean local layout.
# Where Fregata expects to find things by defaultmkdir -p ~/Fregata/config ~/Fregata/media
# Adjust the source paths to wherever your Docker volumes arersync -aH --info=progress2 /path/to/old/config/ ~/Fregata/config/rsync -aH --info=progress2 /path/to/old/media/ ~/Fregata/media/rsync -aH preserves timestamps, permissions, and hard links —
important for the recordings index, which uses inode numbers in
some places. Don’t cp -R unless you’re sure your shell is set
up for it.
For very large media folders (multi-TB), this copy can take hours. Consider Path A if you want to be up and running faster.
Either way: verify the layout
Section titled “Either way: verify the layout”After moving, the destination should look like:
<config-dir>/├── config.yml├── frigate.db├── frigate.db-shm # may not exist; SQLite WAL-mode artifacts├── frigate.db-wal # same├── model_cache/ # Frigate+ models, if any└── ssl/ # if you'd configured TLS
<media-dir>/├── recordings/<camera>/<YYYY-MM-DD>/<HH>/<MM.SS>.mp4├── clips/<camera>-<event>.mp4└── exports/Same paths Frigate-on-Linux uses. Nothing inside changes shape.
Step 4: Adapt your config.yml
Section titled “Step 4: Adapt your config.yml”Open config.yml in your config dir. Most of it is already
correct for Fregata — the schema is identical. What you almost
certainly need to change:
4.1 Replace the detector (automatic)
Section titled “4.1 Replace the detector (automatic)”On first launch, Fregata will substitute your existing detector in your config.yml with Fregata’s custom CoreML detector written in Rust. It will create a backup of your existing config.yml first, so if you ever want to go back to Docker-based Frigate you easily can.
If you do not have a Frigate+ subscription, or are not using a custom model, the bundled YOLOv9-tiny 320x320 model will load by default.
You don’t need a model: sub-block unless you’re switching to a custom model or do not have a Frigate+ subscription.
If you were running a custom ONNX model with model.path, the
path stays the same (point it at the file in your new config
dir if you moved data). The CoreML execution provider can
usually load any opset ≤17 ONNX export; older opsets work too.
If your model uses ops the ANE doesn’t support, the runtime
falls back to the GPU automatically. See
Detection tuning for the full
detector reference.
If you were running TensorRT, EdgeTPU, OpenVINO, ROCm, Hailo, RKNN, DeepStack, or any other Linux-only detector — see Things that don’t migrate below.
4.2 Drop Linux-only ffmpeg overrides
Section titled “4.2 Drop Linux-only ffmpeg overrides”Look at any global or per-camera ffmpeg: blocks for
hwaccel_args or input_args that mention vaapi, qsv,
cuda, nvenc, v4l2_m2m, etc. Those are Linux acceleration
flags; on Fregata they’ll fail.
Either delete them entirely (Fregata’s defaults already use
-hwaccel videotoolbox for decode and h264_videotoolbox
for encode) or replace with videotoolbox:
# OLD — Linux Dockerffmpeg: hwaccel_args: preset-vaapi
# NEW — Fregata; usually you can just delete this, it's set by defaultffmpeg: hwaccel_args: preset-videotoolbox-h264If you weren’t overriding ffmpeg presets, skip this step.
4.3 Check absolute paths
Section titled “4.3 Check absolute paths”Anything in config.yml that referenced /config/... or
/media/... was a Docker-internal path. Update to the host
path (or relative — Frigate resolves most paths against the
config dir).
The most common offender is model.path:
# OLD — Docker-internal pathdetectors: cpu1: type: cpu # ...model: path: /config/yolonas.onnx
# NEW — relative to the config dir, or host-absolutemodel: path: yolonas.onnx # or: # path: /Users/you/Fregata/config/yolonas.onnxOther places to check: tls.cert_path, mqtt.tls.ca_cert,
anything ending in _path or _file.
4.4 Environment variable references
Section titled “4.4 Environment variable references”If your config.yml references env vars via the
!env_var FOO tag, those need to be set in Settings →
Environment Variables in Fregata’s tray menu. Docker’s
environment: block doesn’t carry over.
The most common case is the MQTT password:
mqtt: enabled: true host: 10.0.1.42 user: fregata password: {FREGATA_MQTT_PASSWORD}In Fregata’s tray, Settings → Environment Variables…, add a
row FREGATA_MQTT_PASSWORD with the value, and the next start
will pick it up.
4.5 Things you don’t need to touch
Section titled “4.5 Things you don’t need to touch”The schema is otherwise identical between Frigate and Fregata. Cameras, motion masks, zones, object filters, recording rules, event retention, snapshot config, MQTT, Home Assistant, GenAI, semantic search, face recognition, LPR, audio events, birdseye, review, notifications, auth — all carry over verbatim.
For per-key details on anything in config.yml, see
the Frigate config reference
— Fregata follows that schema strictly.
Step 5: First launch
Section titled “Step 5: First launch”Start Fregata from the tray or via the initial Welcome Dialog. Watch for:
- Status reaches
Runningwithin a few seconds. If it hangs inStartingor flips toError, the most useful thing is Open Crash Log in the tray. - Detector inference time in the tray (or the web UI’s System tab) sits at 1–2 ms on the ANE. 5–15 ms means the GPU; 50+ ms means CPU and something’s off — see Detection tuning.
- Cameras populate the live tile grid. They should appear
within a few seconds of
Running. If a camera shows “Stream not available”, that’s an upstream RTSP issue, not a Fregata problem — see Troubleshooting. - Recordings show up in the Recordings tab. Frigate writes a few minutes of segments before they appear in the scrubber, so wait a moment.
- Events flow to the Review tab as soon as detections fire.
If config validation fails, Fregata writes the path-of-the-bad-key into the crash log:
FATAL: cameras.driveway.detect.fps: input should be greater than 0Fix in config.yml, then Restart Frigate from the tray.
Step 6: Re-wire integrations
Section titled “Step 6: Re-wire integrations”The wire format hasn’t changed — same MQTT topics, same HTTP API, same WebSocket events. What needs updating is where to point.
Home Assistant
Section titled “Home Assistant”The Frigate HACS integration was previously pointing at
http://<docker-host>:8971. If your Docker stack ran on the
same Mac you’re now running Fregata on, that URL still works —
Fregata uses the same default port.
If Docker was on a different host (a Linux box, a NAS, etc.), update the integration’s URL to the Mac’s IP or hostname:
- Settings → Devices & Services → Frigate → Configure.
- Change URL to
http://<mac-ip-or-hostname>:8971. - Submit.
The integration rediscovers cameras automatically. Existing Lovelace cards, automations, and recorder data keep working.
MQTT broker
Section titled “MQTT broker”If your broker was a separate container (Mosquitto, EMQX, etc.),
keep it running — Fregata talks to it the same way Frigate did.
Just update the mqtt.host: in your new config.yml if the
broker’s IP / hostname changed when Docker came down.
If the broker was inside your docker-compose.yml and went away
with docker compose down, you have two options:
- Move it to a Home Assistant Mosquitto add-on, which is the easiest path if you’re a HA user.
- Run it natively on macOS (
brew install mosquittobrew services start mosquitto).
Reverse proxy
Section titled “Reverse proxy”If you had Caddy / Traefik / nginx in front of Frigate’s
8971, update the upstream from the Docker container’s name
or IP to the Mac’s 127.0.0.1:8971 (or LAN IP if the proxy
is on a different host).
See Network & remote access for the rest of the macOS network story.
Step 7: Wind down Docker
Section titled “Step 7: Wind down Docker”Once you’ve watched Fregata for a day or two and you’re happy with it:
# Drop the containers (already done, but the network is sticky)docker compose down --volumes --remove-orphans
# Optional: remove the Frigate image to reclaim diskdocker rmi ghcr.io/blakeblackshear/frigate:stable
# Optional: uninstall Docker Desktop / OrbStack / Colima entirely# if Frigate was the only thing keeping it aroundThe --volumes flag in the first command deletes the Docker
volumes. Skip it if you want to keep the old data around as a
rollback option.
What carries over without changes
Section titled “What carries over without changes”A short list to make the migration feel less scary:
config.ymlschema — every key Frigate understands works in Fregata.- Recordings format — segmented MP4s, identical naming convention, same SQLite events database.
- MQTT topic taxonomy —
frigate/<camera>/<class>,frigate/events,frigate/stats, all unchanged. - HTTP API — same paths under
/api/, same response shapes. - WebSocket events for live event streaming.
- Frigate+ — same account, same
plus://...identifiers, cached models reused via the file at the same path. - The web UI — same UI, same tabs, same scrubber.
- Authentication, review, semantic search, face recognition, LPR, GenAI, audio events, birdseye, notifications, zones, masks — same shape, same behavior.
Things that don’t migrate
Section titled “Things that don’t migrate”Most of these are about Linux-only acceleration paths that were the wrong choice on a Mac in the first place:
- TensorRT models. TensorRT engines are NVIDIA-specific
binaries. Re-export your model to ONNX (most YOLO trainers
ship
--include onnx) and use it as a custom CoreML detector model. See Detection tuning — Bringing your own model. - EdgeTPU detectors. Coral USB / M.2 modules don’t pass
through to macOS cleanly, and the Apple Neural Engine is
faster anyway. Switch to
coreml. - OpenVINO / ROCm / Hailo / RKNN / DeepStack / DeGirum / Synaptics / Teflon — Linux-NPU integrations, no analog on macOS.
v4l2_m2m,vaapi,qsv,cudaffmpeg presets. Drop them; Fregata’s defaults already use VideoToolbox.- Docker-specific environment-variable plumbing. Anything
you set in
docker-compose.yml’senvironment:block needs to move to Settings → Environment Variables in Fregata. /dev/shmmounts and tmpfs sizing knobs. Fregata uses a RAM-disk under~/Fregata/temp/automatically — see Performance — RAM-disk cache.
For a wider tour of what differs, see Fregata vs Frigate.
Rolling back
Section titled “Rolling back”If something doesn’t work and you’d rather go back to Docker while you debug:
- Quit Fregata.
- Restart the Docker stack:
Terminal window docker compose up -d - Restore the Home Assistant URL if you’d changed it.
Both setups read the same config.yml, so any changes you
made in step 4 still apply (Frigate will ignore the
coreml detector type and refuse to start until you flip it
back to cpu). If you want a clean rollback, restore your
old config.yml from a backup or revert the detectors:
block.
The Docker volumes are still there if you skipped the
--volumes flag in step 7 — just bring the stack back up and
your old recordings are untouched.
Common gotchas
Section titled “Common gotchas”A short list of things people trip over:
- “Detector inference time is 50+ ms” after migrating —
the
coremldetector fell back to CPU. The first warmup inference logs which tier it landed on; check the crash log for the line that startscoreml: warmup classified as. See Detection tuning. - “Cameras don’t appear in HA after the migration” — the HA integration still points at the Docker host. Update the URL per step 6.
- “My recordings dropped to a few seconds” — the
per-camera retention rules pruned old segments because the
database thinks the dates are wrong. Check that your
config.yml’srecord.retain.daysmatches what you had before; check your Mac’s clock is set automatically. - “Fregata says ‘Could not access the local network’” — you skipped the welcome wizard’s permission grant. System Settings → Privacy & Security → Local Network, enable Fregata.
- “Web UI is unreachable from another device” — macOS firewall. See Troubleshooting — Web UI unreachable from another device on the LAN.
Anything else, Troubleshooting is indexed by the exact error string the app surfaces.