Skip to main content
Use this guide when your Macs’ Beacon telemetry should land in your own Google Cloud project first, with Asymptote reading a copy for your dashboard. It covers the whole setup in order: the bucket and access, the details to send us, the rollout to your Macs, and how to confirm it works.

What you’ll set up

Beacon on each Mac records agent activity and uploads it to your bucket with a key that can only create objects. For each new object, the bucket posts a notice to Pub/Sub. Asymptote reads the subscriptions to learn which objects are new, fetches them with its own service account, and loads them into your dashboard. No Asymptote key is involved, and the bucket stays yours and keeps every object. In your Google Cloud project:
  • A new Cloud Storage bucket just for Beacon, with uniform bucket-level access, public access prevention, and versioning.
  • beacon-endpoint-writer, a service account your Macs upload with. It can create objects below your Beacon prefix and nothing else.
  • Read access for Asymptote’s reader, beacon-clickpipes-reader@asymptote-labs.iam.gserviceaccount.com, on the bucket.
  • A Pub/Sub topic and two subscriptions, one for agent activity (runtime) and one for inventory. They let Asymptote load objects in any order, so an upload that arrives late is never skipped.
Asymptote receives the telemetry your Macs upload in full, after Beacon’s local redaction of secrets: prompts, the commands agents ran and their output, tool inputs and outputs, and file paths and diffs.

Before you start

1. Create the bucket and access

Pick a root prefix such as beacon-prod. Beacon adds runtime/ and inventory/ below it, so don’t put either in the prefix.
Create a main.tf in a new directory. Change the project, location, bucket name, and prefix:
main.tf
Apply it:
Review the plan and type yes. It’s working when the apply ends with Apply complete! and prints the outputs. Keep them for step 3. Your own Cloud KMS key, object expiry, and other options are in the base module’s variables.tf.

2. Create the writer’s key

Create the key with gcloud, so the private key never enters Terraform state. Use the writer_email output, or the writer’s email from the gcloud steps:
Keep the file for step 4. On one Mac you install it directly; with an MDM, you deliver it to each Mac with the MDM’s secret or file delivery, to a root-owned path outside Beacon’s directories with mode 0600, and then delete your local copy. Wait about a minute before a Mac first uses a brand-new key; Google rejects it for the first few seconds.

3. Send Asymptote the details

Send your Asymptote contact:
  • the bucket name and prefix;
  • the two subscriptions: asymptote_subscriptions, or projects/<project-id>/subscriptions/asymptote-<bucket>-runtime and -inventory.
No key is involved. Asymptote connects the bucket to your organization and tells you when it’s done.

4. Roll out Beacon to your Macs

Try it on one Mac first, or go straight to your MDM.
Install Beacon. On an Apple Silicon Mac, in Terminal while logged in at the Mac:
Download, verify, and install
The block checks the package against its published SHA-256 and its Apple signature before installing. pkgutil should print Status: signed by a developer certificate issued by Apple for distribution. The package sets up Claude Code and Codex for the logged-in user; Try Beacon on One Mac covers what it installs and how to add other agents.Put the writer’s key where the forwarder can use it, in a root-only location outside Beacon’s directories:
Start the forwarder with your values from step 1:
It’s working when the output shows the forwarder’s state = running. When you roll out with an MDM later, this Mac gets the same setup again.

5. Confirm it works

On a Mac with Beacon installed, write a test event:
The forwarder uploads in batches, so allow up to five minutes. Then list the objects with your own identity, because the writer can’t list the bucket:
Asymptote loads each new object within a few minutes of it landing. Your Asymptote contact confirms when the first events arrive.

Operate

Rotate the writer’s key

Create a new key, deliver it to every Mac, restart the forwarder, confirm a new object arrives, and then delete the old key. Your MDM guide has the exact commands under credential rotation.

Remove

  1. Ask Asymptote to disconnect the bucket.
  2. Remove the forwarder from your Macs. Uninstalling Beacon removes it.
  3. Run terraform destroy. Deleting the writer service account also deletes its keys. Destroy stops at a bucket that still holds objects. To delete the telemetry too, add force_destroy = true to the beacon_gcs module, run terraform apply, and then destroy.

Troubleshooting

A brand-new service-account key is rejected for the first few seconds (Invalid JWT Signature). Wait a minute and run the setup again.
Check that the subscriptions exist and that Asymptote’s reader is a subscriber on both: gcloud pubsub subscriptions get-iam-policy <subscription>. Then send your Asymptote contact the subscription names.
Someone else, in any project, already has a bucket with that name. Choose another bucket name.

AWS S3

The same setup with an S3 bucket.

Claude with Jamf and GCS

Roll out Beacon with Jamf Pro.

Google Cloud Storage with Terraform

The bucket and writer on their own, without Asymptote reading them.

Hosting options

Compare Managed, Open Source, and Private Deployment.