Overview
Use this guide when you want a Jamf Pro policy to install Beacon for macOS users and forward both runtime and inventory telemetry to AWS S3 without asking end users to configure anything manually. The end state is:- Beacon is installed under
/opt/beacon. - The system endpoint collector runs as a LaunchDaemon.
- Claude Code hooks are installed for the logged-in console user.
- Runtime activity is written to
/var/log/beacon-agent/runtime.jsonl. - Agent config inventory is written to
/var/log/beacon-agent/inventory_state.jsonl. - Vector forwards both JSONL streams to S3:
s3://<bucket>/<prefix>/runtime/date=YYYY-MM-DD/...s3://<bucket>/<prefix>/inventory/date=YYYY-MM-DD/...
Prerequisites
Before creating the Jamf policy, prepare:- A signed and notarized Beacon endpoint
.pkgthat includes/opt/beacon/bin/vector. - A target AWS S3 bucket.
- An S3 prefix root such as
beacon,beacon-prod, orbeacon-e2e. - AWS credentials or a role available to the Jamf policy at install time.
s3:PutObjectpermission for the selected bucket prefix.- Claude Code installed on the target Mac.
runtime or inventory in the value:
/runtime or /inventory, but new deployments should use the root prefix.
AWS Permission
Use a bucket policy or IAM policy scoped to the Beacon prefix. Example:0600 and is sourced by the Vector LaunchDaemon wrapper.
Jamf Policy Setup
Jamf Pro separates package installation from script execution. Use the Packages payload to install the Beacon.pkg, then use a Scripts payload to run a small wrapper that calls Beacon’s packaged Jamf helper.
For the most reliable rollout, use two policies:
- Policy 1: Install Beacon package. Installs the signed
.pkg. - Policy 2: Configure Beacon S3 forwarding. Runs after the package is installed and calls the packaged helper.
1. Upload The Beacon Package
Upload the signed Beacon endpoint package to Jamf Pro and add it to a policy using the Packages payload with the install action. The package installs:2. Add A Jamf Script Wrapper
Add a script to Jamf Pro that invokes Beacon’s packaged helper. The script must exist in Jamf Pro before it can be added to a policy.| Parameter | Label | Example |
|---|---|---|
| 4 | S3 bucket | example-security-logs |
| 5 | AWS region | us-west-2 |
| 6 | S3 prefix root | beacon-prod |
| 7 | S3 storage class | STANDARD |
| 8 | Vector read position | end |
3. Inject AWS Provider Settings
The Beacon helper persists any AWS provider-chain variables it receives. Use one of these patterns:| Credential pattern | Variables to provide |
|---|---|
| Access key | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN |
| AWS profile | AWS_PROFILE, optional AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE |
| Web identity | AWS_WEB_IDENTITY_TOKEN_FILE, AWS_ROLE_ARN |
What The Helper Does
The combined helper performs all endpoint and forwarding setup:- Repairs the Beacon system endpoint.
- Starts
com.beacon.endpoint.collector. - Prepares:
/var/log/beacon-agent/runtime.jsonl/var/log/beacon-agent/inventory_state.jsonl/var/log/beacon-agent/inventory-state.json
- Grants the console user append access for hook-written logs.
- Installs Claude Code hooks for the interactive console user.
- Writes:
/Library/Application Support/Beacon/Forwarders/s3-vector.toml/Library/Application Support/Beacon/Forwarders/s3-vector.env/Library/LaunchDaemons/com.beacon.endpoint.s3-forwarder.plist
- Starts
com.beacon.endpoint.s3-forwarder.
Expected S3 Layout
If you configure:runtime.jsonl.
Inventory objects contain inventory.heartbeat and inventory.snapshot events from inventory_state.jsonl.
Validate A Deployed Mac
Run these commands on a target Mac after the Jamf policy completes.Check Services
running.
Check Local Files
Check Vector Config
inventory_state.jsonl so the first inventory snapshot is not missed if the file was created before Vector began watching it.
Generate Test Events
Runtime Event
Write a synthetic runtime validation event:Inventory Event
Write an inventory heartbeat and snapshot:Confirm S3 Delivery
Vector batches uploads. Production configs usetimeout_secs = 300, so allow up to five minutes unless you lower the batch timeout for a demo.
Live Demo Settings
For a live demo, reduce the inventory TTL:Bootstrap failed: 5, run Vector in the foreground for the demo:
Test A Live Skill And MCP Change
Create a Claude Code skill:mcpServers in ~/.claude.json:
inventory/ prefix.
Restore Production Settings
After a demo, restore the production TTL:timeout_secs manually:

