Want Asymptote to read this bucket for your dashboard? Start with Asymptote with Your Own S3 Bucket. It sets up the bucket and Asymptote’s read access, then brings you to step 3 of this guide.
What you’ll set up
When you finish, each Mac in scope has:- Beacon installed under
/opt/beacon, with its collector running as the LaunchDaemoncom.beacon.endpoint.collector. - Claude Code and Codex reporting to that collector for the user who is logged in at the Mac.
- Agent activity written to
/var/log/beacon-agent/runtime.jsonl, and an inventory of the Mac’s agents written to/var/log/beacon-agent/inventory_state.jsonlevery 6 hours. - A forwarder (Vector, shipped in the package) uploading both files to your bucket:
Before you start
The Macs don’t need Beacon installed beforehand. Fleet installs it in step 4.
If you self-host Fleet, it needs its own storage for uploaded packages, separate from the telemetry bucket in this guide. Set load balancer timeouts to at least five minutes so the package upload doesn’t time out.
1. Try Beacon on one Mac (optional)
To see what the package does before involving Fleet, install it by hand on one Apple Silicon Mac. This install needs no account and sends nothing off the Mac. Run it in Terminal while logged in at the Mac:Download, verify, and install
pkgutil should print Status: signed by a developer certificate issued by Apple for distribution.
Then check it:
Service: loaded=true running=true and telemetry=enabled next to Claude Code and Codex mean it’s working. Start a new Claude Code session and its activity appears in /var/log/beacon-agent/runtime.jsonl.
Try Beacon on One Mac covers this in more detail: what the package sets up, how to see captured events, and how to remove it. You can also leave this Mac as it is. When Fleet installs the same package on it later, the install is simply repeated.
2. Prepare S3
Pick a prefix such asbeacon-prod. Beacon adds runtime/ and inventory/ under it, so don’t put either in the prefix.
If Asymptote should also read this bucket, follow Asymptote with Your Own S3 Bucket for this step instead. It creates the same bucket and writer plus Asymptote’s read access, then sends you back here.
- AWS console or CLI
- Terraform
Create an IAM user for Beacon with this policy. Replace the bucket and prefix with yours:Create an access key for that user. Use a long-lived key, which starts with
IAM policy for the Beacon writer
AKIA. Temporary credentials stop working when they expire, and uploads that fail after that point are lost.Three things about the bucket:- Startup check. When the forwarder starts, it checks that it can reach the bucket, which needs
s3:ListBucketonarn:aws:s3:::example-security-logs. Without it, uploads still work, but the forwarder’s log shows a health-check error at startup. Add the permission if you’d rather not see that error. - KMS. If the bucket’s default encryption uses a customer managed KMS key, also allow
kms:GenerateDataKeyon that key. - Encryption headers. Beacon doesn’t send encryption headers or ACLs, so the bucket’s default encryption applies. A bucket policy that requires an encryption header on every upload will reject Beacon’s uploads.
3. Set up Fleet
Both options end in the same place: the Beacon package, the AWS keys, three scripts, and five health policies in your pilot team.- Admin helper (recommended)
- Fleet UI
The helper runs once on your workstation and makes all the Fleet changes for you. It checks your token’s role before changing anything.Download it:Preview it. This prints the plan and the scripts it would create, and makes no network calls:Run it:It asks for:
When it finishes, your pilot team has:
- The package, named Beacon Endpoint Agent. It has a check that skips Intel Macs, and an uninstall script that removes Beacon completely.
- The AWS keys stored as Fleet secret variables.
- Three scripts:
beacon-configure-s3-forwarding.sh,beacon-enable-self-updates.sh, andbeacon-validate.sh. - Five policies whose names start with Beacon:, and five reports.
Run it without prompts
Run it without prompts
Set every value as an environment variable and pass With
--yes:--yes, the helper stops if the AWS keys are missing, so it never sets up forwarding without credentials by accident.If you manage Fleet with GitOps
If you manage Fleet with GitOps
The next GitOps run can overwrite changes the helper made through the API. Either add the package, scripts, policies, and
$FLEET_SECRET_* variables to your GitOps repo, or rerun the helper after each GitOps run.4. Install Beacon on a pilot Mac
In Fleet, go to Hosts and open one of the pilot Macs. On its Software tab, open Library, find Beacon Endpoint Agent, and click Install. The Status column changes to Installed when it’s done; click the status to see the installer output. What happens on the Mac:- Fleet runs
installer -pkg <package> -target /. - The package installs Beacon under
/opt/beaconand starts the collector. - It configures Claude Code and Codex for the user logged in at the Mac.
- There are no prompts, no sign-in, and nothing is sent off the Mac yet.
running=true and telemetry=enabled are the lines that matter. A line reading Beacon Managed: not connected is expected: Asymptote Managed isn’t used in this setup.
The package configures the agents of whoever is logged in at the Mac when it installs. If nobody was logged in, for example during Setup Assistant, run this after someone logs in, either as a Fleet script or on the Mac:
sudo /opt/beacon/bin/beacon endpoint user-config repair-installed --system5. Turn on S3 forwarding
On the same host page in Fleet, open Actions > Run script and runbeacon-configure-s3-forwarding.sh. Open the result in the host’s Activity list. Its output should end with S3 Vector forwarder configured. and a state = running line.
To keep Beacon up to date automatically, also run beacon-enable-self-updates.sh. See Updates.
Confirm delivery. On the Mac, write a test event:
6. Roll out to the rest of your Macs
When the pilot looks right:- Put the Macs in scope. Add them to the team, or repeat steps 3 to 5 for another team.
- Install Beacon automatically. With the helper, rerun it with
FLEET_AUTOMATIC_INSTALL=true. In the Fleet UI, go to Policies, click the Automations cell of the Beacon: installed policy, check Install software, select Beacon Endpoint Agent, and click Save. Fleet then installs Beacon on every Apple Silicon Mac in the team where that policy fails. - Turn on S3 for each new Mac. In the same way, give Beacon: S3 forwarding configured a Run script automation with
beacon-configure-s3-forwarding.sh. Fleet then runs the script on each Mac where forwarding isn’t set up yet. To turn on self-updates everywhere, runbeacon-enable-self-updates.shon the team’s hosts: select them on the Hosts page and click Run script. - Watch the policies. Each Beacon: policy passes only when that part of Beacon is healthy on the host. A failing host tells you which part to look at.
Running Beacon
What reaches your bucket
- Every line of both logs, as gzipped JSON lines.
- Full agent activity, after local redaction of secrets and a 64 KB limit per event. That includes prompts, the commands agents ran and their output, tool inputs and outputs, and file paths and diffs. This path has no metadata-only option.
- The host name. Object keys don’t include the host. Each record has the Mac’s name in
endpoint.hostname. - The date in the key is the UTC date the forwarder handled the event, not when the event happened. Use each record’s
timestampfor the event time. - What’s included from before step 5. Runtime events are uploaded from the moment the forwarder first starts, so earlier history isn’t included. Inventory is uploaded from the beginning. To include a Mac’s earlier runtime history, change
endtobeginningon the script’sBEACON_VECTOR_READ_FROMline before the script first runs on that Mac. Later runs continue from where the forwarder left off. - How often. Each Mac uploads a batch per log every five minutes, or sooner when a batch reaches 10 MB.
Updates
Self-updates stay off until you runbeacon-enable-self-updates.sh. After that, each Mac checks for a new release a few times during local business hours. It verifies the package’s checksum and Apple notarization, installs it, and rolls back if the new version fails its health check. S3 forwarding keeps running across updates.
-
To only record that an update is available, use
update enable --check-onlyin the script. - To update through Fleet instead, rerun the helper after a new release. It uploads the new package to the same software title.
-
To point Macs at a release manifest you host, write it to
/Library/Application Support/Beacon/Endpoint/managed.json:
could not restore existing forwarder com.beacon.endpoint.s3-forwarder. It fails on purpose, so forwarding never stops without anyone noticing.
Capture more agents
The package sets up Claude Code and Codex. To add others, run a Fleet script like this on the Macs:claude, codex, gemini, cursor, vscode (hooks only), opencode, cline, factory, openhands, kiro, kimi, dsh, pi, omp, prime, omo, openclaw, grok, qwen, muse, hermes, devin-cli, devin-desktop, and antigravity. Some agents need a step outside Beacon; see Agent Harness Integrations.
Rotate the AWS key
- Create a second access key for the Beacon IAM user.
- Update the Fleet variables. Rerun the helper with the new key, or edit
BEACON_AWS_ACCESS_KEY_IDandBEACON_AWS_SECRET_ACCESS_KEYin Controls > Variables. - Run
beacon-configure-s3-forwarding.shon every Mac: on the Hosts page, select them and click Run script. The forwarder remembers where it was, so nothing is uploaded twice. - When every Mac has run it, deactivate and delete the old key. Until then, keep the old key active, because uploads it rejects are lost.
Remove Beacon
In Fleet, open the host’s Software tab, then Library, and click Uninstall on Beacon Endpoint Agent. The uninstall script removes:- Beacon itself;
- the S3 forwarder;
- the AWS keys stored on the Mac;
- the local logs;
- the package receipt;
- Beacon’s settings from the logged-in user’s Claude Code, Codex, and Cursor.
Troubleshooting
The helper stops with a role or permission error
The helper stops with a role or permission error
The helper names the role the refused call needs. Storing AWS keys needs a global admin or maintainer, because team roles can’t write variables. Use the API-only user from Create the API token, or add the keys yourself in Controls > Variables and run the helper with
BEACON_AWS_CREDENTIAL_MODE=none.On self-hosted Fleet, saving variables also fails with “Please configure a private key” until the Fleet server has server.private_key set.The package won't upload
The package won't upload
Custom packages need Fleet Premium and a specific team, not “All teams”. On self-hosted Fleet, check that package storage is set up and that load balancer timeouts are at least five minutes.
Scripts never run on the Mac
Scripts never run on the Mac
fleetd must have scripts enabled. That’s the default with Fleet MDM; otherwise redeploy fleetd with --enable-scripts. Script results are in the host’s Activity tab.Beacon is installed, but no agent activity appears
Beacon is installed, but no agent activity appears
The package only configures the user who was logged in when it installed. Run this after that user logs in:
doctor should report 0 failure(s). Agent sessions that were already open keep their old settings, so start a new one.Nothing arrives in S3
Nothing arrives in S3
Wait five minutes after the first event. Then check the forwarder on the Mac:If
launchctl can’t find the service, run beacon-configure-s3-forwarding.sh again. To confirm the credentials file exists without printing the keys:The forwarder log shows a health-check or credentials error at startup
The forwarder log shows a health-check or credentials error at startup
If uploads arrive anyway, the IAM user is missing
s3:ListBucket, which only the startup check uses. Add it or ignore the error; see step 2. If nothing arrives, check the key, the region, and any bucket policy that requires encryption headers.An update failed with "could not restore existing forwarder"
An update failed with "could not restore existing forwarder"
The new package installed, but the S3 forwarder didn’t stay running afterwards. Check
/tmp/com.beacon.endpoint.s3-forwarder.err on the Mac, fix the cause, and run beacon-configure-s3-forwarding.sh again.Self-updates aren't running
Self-updates aren't running
Update mode: off means beacon-enable-self-updates.sh hasn’t run on this Mac. The Mac also needs to reach GitHub Releases, or the manifest you set in managed.json.Intel Macs
Intel Macs
The package is Apple Silicon only. Its pre-install condition makes Fleet skip Intel Macs, and the Beacon: policies pass on Intel Macs, so they don’t show up as failures.
Reference
What’s on each Mac
Policies and reports
The policies return a row only when that part is healthy, so a failing policy points at a problem. All of them pass on Intel Macs. The files are inpackaging/macos/fleet/policies.
The reports, in
packaging/macos/fleet/queries, return one row per host with a status value such as running or a version number. Don’t use them as policies: they return a row on every host, so a policy built from one always passes.
Create the API token
The admin helper needs a token for a user with the global admin or maintainer role. An API-only user is the simplest:- In the Fleet UI: open the avatar menu, go to Users, and choose Add user > API-only user. Choose Global user and the Maintainer role, then click Add. The token is shown once, under API key.
-
With fleetctl: run the command below. It prints the token.
Admin helper settings
Related
Asymptote with your own S3 bucket
Give Asymptote read-only access to the bucket for your dashboard.
Fleet
What the package ships for Fleet, and how to repair or remove it.
Deploy software in Fleet
Fleet’s own guide to custom packages, scripts, and targeting.
Jamf and S3
The same S3 setup, installed with Jamf Pro instead of Fleet.
Telemetry schema
The fields in each record.