← Back to the dashboard

How to run BlueBoost every week on Google Cloud (7.2)

What this does: every Monday at 05:00 Eastern, Google starts BlueBoost's weekly run. The run goes through each collector, checks the month's costs and writes the digest. If a week's run never happens, or the digest fails, Healthchecks.io emails you.

What it costs: $0 a month expected. One run is up to about 2 hours. Over a month that's roughly 31,000 of the 240,000 compute-seconds Google gives free, and 1 of 3 free scheduler jobs. Google still requires a card on the billing account. The math, with sources, is in the 7.2 plan, section 5. You chose this host and the free alarm on 2026-10-24.

Before you start:

  1. The Google guide, Parts 1–7, is done. This guide uses the same Google Cloud project and the same BlueBoost Google account.
  2. Blair access (pending input #9). You need Blair's session pooler connection string, and BlueBoost's tables must already be set up in Blair. Without both, the run has nowhere to save anything.
  3. About 30 minutes, in Chrome.

Nothing here has been run against Google yet. The steps come from Google's own pages, checked 2026-10-24. If a screen looks different, stop and tell Claude what you see.

Part 1: Billing and a spending alert

  1. In the Google Cloud console, pick the BlueBoost project at the top.
  2. Open Billing. If the project has no billing account, link one and add a card. Google requires this even inside the free tier.
  3. In Billing → Budgets & alerts, create a budget of $1 for this project, with email alerts at 50% and 100%. A budget only emails you. It never stops anything, so it's an early warning.
  4. Open APIs & Services → Library and enable each of these:
  5. Cloud Run Admin API
  6. Cloud Build API
  7. Artifact Registry API
  8. Cloud Scheduler API

Part 2: Make the package on your Mac

Run this in Terminal. It zips the db folder without its test files or anything secret, and saves the zip to out/blueboost-weekly.zip:

cd "/Users/chris-blueforest/Claude Code Projects/BlueBoost/db" && mkdir -p ../out && rm -f ../out/blueboost-weekly.zip && zip -r ../out/blueboost-weekly.zip . -x "node_modules/*" "tests/*" "out/*" "sample/*" ".env*"

Part 3: Send it to Google

  1. In the console, click the Activate Cloud Shell button (the >_ icon at the top right). A terminal opens at the bottom of the page. Cloud Shell is free.
  2. In Cloud Shell's ⋮ menu, choose Upload, then pick out/blueboost-weekly.zip.
  3. Paste this to unpack it:

``bash rm -rf blueboost && mkdir blueboost && cd blueboost && unzip -q ../blueboost-weekly.zip ``

  1. Paste this to build the package and create the job:

``bash gcloud run jobs deploy blueboost-weekly --source . --region us-central1 --tasks 1 --max-retries 0 --task-timeout 30h --cpu 1 --memory 1Gi ``

If it asks to create an Artifact Registry repository, answer Y. That's where Google keeps the package, and it's free under 0.5 GB.

What the settings mean:

Part 4: Put in the settings

These are the same values as in your .env. They go into the job itself, not into any file (7.4). Don't type them into Cloud Shell, because Cloud Shell keeps a history.

  1. Open Cloud Run → Jobs → blueboost-weekly → Edit.
  2. Under Variables & Secrets, add one variable per line:
NameValue
BLAIR_DATABASE_URLBlair's session pooler string, from Supabase's Connect panel (it works over IPv4; the direct string may not)
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKENFrom .env
OPENAI_API_KEY, ANTHROPIC_API_KEY, PERPLEXITY_API_KEY, GEMINI_API_KEY, SERPAPI_API_KEYFrom .env. Any that are missing make that step "not configured"
CRUX_API_KEYFrom .env
DIGEST_EMAIL_TOAmmon's address
HEALTHCHECK_PING_URLFrom Part 5

Leave out DIGEST_SEND for now (Part 8).

  1. Click Update.

Part 5: The missed-run alarm (Healthchecks.io, free)

  1. Sign up at healthchecks.io with your email. The free Hobbyist plan is enough.
  2. Add Check and name it BlueBoost weekly.
  3. Set its schedule:
  4. Cron expression: 0 5 * * 1
  5. Time zone: America/New_York
  6. Grace time: 1 day. This covers the AI step's wait for Claude's batch.
  7. Check that the Email integration is on for this check.
  8. Copy the check's ping URL into HEALTHCHECK_PING_URL (Part 4). Treat it as a secret: anyone with it could mark a run as done.

Part 6: The Monday schedule

  1. Open Cloud Run → Jobs → blueboost-weekly → Triggers → Add Scheduler Trigger.
  2. Fill in the form:
  3. Name: blueboost-monday
  4. Region: us-central1
  5. Frequency: 0 5 * * 1
  6. Timezone: America/New_York
  7. Under Configure the execution, pick the service account the form offers. If it says a permission is missing, give that account the Cloud Run Invoker role.
  8. Click Create.

Part 7: The first run, by hand

  1. On the job's page, click Execute.
  2. When it finishes, tell Claude. Claude checks it in Blair.

Pass means all of these:

  1. The job's execution says it succeeded.
  2. blueboost.weekly_runs has the run as ok or partial, with one row per step in weekly_run_steps.
  3. Healthchecks.io shows a green ping.

"Not configured" steps are expected until every key is in. The run's note lists them.

Part 8: Switching on the digest email

Do this only after you've said yes to the first send (6.3 plan, section 10). Add the variable DIGEST_SEND = yes in Part 4's list. From the next Monday on, the digest is emailed to DIGEST_EMAIL_TO instead of only written.

Updating the code later

Repeat Parts 2 and 3. The settings from Part 4 and the schedule from Part 6 stay with the job. After the first update, check Part 4's list once to confirm they did (unverified).

When something goes wrong

What you seeLikely causeFix
An email from Healthchecks.ioNo run finished this week, or the digest failedOpen the job's Executions and Logs, and tell Claude what they say
An execution failed (exit 1)The run couldn't reach BlairCheck BLAIR_DATABASE_URL is the session pooler string
ENETUNREACH or an IPv6 address in the logsThe direct Blair string was usedUse the session pooler string
Search Console says invalid_grantThe Google sign-in expiredGoogle guide, Part 4 step 5, then npm run google-login
The $1 budget emailUsage went past the free tierTell Claude: something is running longer or more often than planned