CostGoblin syncs your AWS billing data locally and queries it with DuckDB. No servers. No SaaS fees. Your data never leaves your machine.
Cloud cost visibility shouldn't be a finance-only perk. CostGoblin is a desktop app for anyone curious about their AWS bill — and especially the engineers, architects, and small teams who can act on what they see.
Delete the orphaned RDS instance. Right-size the cluster. Kill the forgotten NAT gateway.
No sales call. No cross-account IAM role. No annual contract.
Seven views, one local DuckDB. From raw line items to AI-driven Q&A — every dollar accounted for, every query in milliseconds.
CostGoblin reads FOCUS 1.2 exports straight from your own cloud storage. Nothing leaves your machine, and no third party ever sees your bill. Pick your cloud for the setup guide.
GCP billing lands alongside AWS in v0.7 — FOCUS 1.2 from BigQuery via Cloud Storage. Azure next. One interface for all your cloud spend.
Automatic alerts when spending deviates from historical patterns. Catch surprises before the bill lands.
Set spending targets per team, product, or environment. Track burn rate against budget in real time.
Share dashboards and cost reports with your team. Collaborative triage for cost spikes.
New features, releases, and cloud cost insights. Low volume, high signal.
CostGoblin is built in the open. These companies back the project through their open-source programs, so it stays free for everyone.
Before setting up any exports, make sure the tags you want to slice costs by are activated in the AWS Billing Console → Cost Allocation Tags.
Activate any user-defined tag you plan to use as a dimension in CostGoblin (e.g. team, environment, service). Tags that aren't activated here won't appear in the FOCUS exports, no matter how they're configured.
Pick a dedicated bucket (or prefix) for all CostGoblin data. We recommend this structure so each export lands in its own namespace:
From Billing and Cost Management, open Data Exports in the left navigation, then click Create export. Choose Standard data export and select FOCUS 1.2 as the data table (FOCUS_1_2_AWS). Only the daily export is required. You can optionally create a second, hourly export — helpful to understand how costs distribute within a day (intraday drill-down and incident analysis). Configure each as follows:
Under Column selection, keep all columns enabled. These are the ones CostGoblin requires:
In the AWS Billing Console → Cost Optimization Hub → Preferences, enable the S3 data export:
Open CostGoblin, go to Sync and point each data source to its S3 prefix. Once the first sync completes, head to Dimensions to map your tags to cost allocation dimensions. This is where CostGoblin shines — for each dimension you can:
In the Google Cloud Console, open Billing → Billing export → BigQuery export and enable FOCUS usage cost. Google creates a managed dataset holding the export; storage of it is free.
The bucket must be in the same location as the export dataset — BigQuery refuses to export across locations:
A scheduled job in your project copies each changed billing period out of BigQuery into the bucket. CostGoblin never holds credentials that can reach BigQuery — it only reads the bucket. It ships in the repo under scripts/gcp-focus-exporter.
Three ways to run it — same deployment either way, pick whichever suits you:
1. In Cloud Shell — nothing installed on your machine; gcloud, Docker and your credentials are already there. Open in Cloud Shell, edit the settings at the top of deploy.sh, then run it.
2. Locally, if you already have the gcloud CLI:
3. Copy-paste, if you would rather see exactly what runs. Set the five values, then paste the rest into Cloud Shell or any terminal:
Each run re-exports only the periods that changed, and writes them as:
CostGoblin only ever reads the bucket. It holds no credential that can reach BigQuery, your billing account, or any other API — the exporter above is what talks to BigQuery, and it runs in your project under its own service account. Two object permissions on the one bucket are the entire requirement:
The simple way — sign in as yourself and CostGoblin inherits whatever you can already read:
For least privilege — a service account that can reach nothing but this bucket, impersonated so no key material ever lands on disk:
Then name it on the provider with impersonateServiceAccount: so the app knows to assume it.
Add the provider in Sync — either pick Google Cloud → Find my export and let the wizard walk the bucket and write the config, or point it by hand at the tier folder, gs://your-company-billing/focus/daily.
Each sync downloads only the periods that changed and rewrites them locally into the same FOCUS 1.2 shape the AWS exports use — so both clouds land in one set of dashboards, split by a provider dimension.