Skip to content

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.

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!

Spend a few minutes inventorying the existing Docker setup so each step has a known target.

  • Where is config.yml on the Mac filesystem? Check the volumes: 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.yml and look at the detectors: block.
  • Are you using a custom model? model.path or a plus:// Frigate+ identifier in config.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.

From the directory holding your docker-compose.yml:

Terminal window
docker compose down

Wait 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:

Terminal window
docker stop frigate && docker rm frigate

Don’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.

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.

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:

  1. Config folder — pick the host path that was mapped to /config (e.g. ~/docker/frigate/config).
  2. 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.

Terminal window
# Where Fregata expects to find things by default
mkdir -p ~/Fregata/config ~/Fregata/media
# Adjust the source paths to wherever your Docker volumes are
rsync -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.

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.

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:

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.

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 Docker
ffmpeg:
hwaccel_args: preset-vaapi
# NEW — Fregata; usually you can just delete this, it's set by default
ffmpeg:
hwaccel_args: preset-videotoolbox-h264

If you weren’t overriding ffmpeg presets, skip this step.

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 path
detectors:
cpu1:
type: cpu
# ...
model:
path: /config/yolonas.onnx
# NEW — relative to the config dir, or host-absolute
model:
path: yolonas.onnx
# or:
# path: /Users/you/Fregata/config/yolonas.onnx

Other places to check: tls.cert_path, mqtt.tls.ca_cert, anything ending in _path or _file.

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.

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.

Start Fregata from the tray or via the initial Welcome Dialog. Watch for:

  • Status reaches Running within a few seconds. If it hangs in Starting or flips to Error, 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 0

Fix in config.yml, then Restart Frigate from the tray.

The wire format hasn’t changed — same MQTT topics, same HTTP API, same WebSocket events. What needs updating is where to point.

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:

  1. Settings → Devices & Services → Frigate → Configure.
  2. Change URL to http://<mac-ip-or-hostname>:8971.
  3. Submit.

The integration rediscovers cameras automatically. Existing Lovelace cards, automations, and recorder data keep working.

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 mosquitto
    • brew services start mosquitto).

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.

Once you’ve watched Fregata for a day or two and you’re happy with it:

Terminal window
# Drop the containers (already done, but the network is sticky)
docker compose down --volumes --remove-orphans
# Optional: remove the Frigate image to reclaim disk
docker rmi ghcr.io/blakeblackshear/frigate:stable
# Optional: uninstall Docker Desktop / OrbStack / Colima entirely
# if Frigate was the only thing keeping it around

The --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.

A short list to make the migration feel less scary:

  • config.yml schema — every key Frigate understands works in Fregata.
  • Recordings format — segmented MP4s, identical naming convention, same SQLite events database.
  • MQTT topic taxonomyfrigate/<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.

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, cuda ffmpeg presets. Drop them; Fregata’s defaults already use VideoToolbox.
  • Docker-specific environment-variable plumbing. Anything you set in docker-compose.yml’s environment: block needs to move to Settings → Environment Variables in Fregata.
  • /dev/shm mounts 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.

If something doesn’t work and you’d rather go back to Docker while you debug:

  1. Quit Fregata.
  2. Restart the Docker stack:
    Terminal window
    docker compose up -d
  3. 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.

A short list of things people trip over:

  • “Detector inference time is 50+ ms” after migrating — the coreml detector fell back to CPU. The first warmup inference logs which tier it landed on; check the crash log for the line that starts coreml: 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’s record.retain.days matches 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.