underrunner

Find the cloud spend
nobody needs.

Underrunner works out who owns each resource, proves what's unused, asks the people who'd know, and removes only what they confirm.

Create an account

The demo is a private copy of a made-up company. No sign-up.

Queue

Biggest likely savings first, in the demo company

ResourceWhyAskingStagePer month
data-lake-redshift-legacyRedshift cluster · AWS
No connections for 127 days.
Pablo RuizData Engineering
Final confirmation
$9,520
ml-feature-store-v1RDS database · AWS
No connections at all for 61 days.
Noor HaddadMachine Learning
Scheduled
$3,910
spark-poc-noorDatabricks cluster
Running with no activity for 73 days.
Noor HaddadMachine Learning
Clarification
$3,460
TRANSFORM_XL_WHSnowflake warehouse
No queries for 44 days.
Aisha RahmanData Engineering
Verified gone
$2,190
routing-sim-gpu-1EC2 instance · AWS
CPU never above 2.1%, 0.3 GB of traffic in 30 days.
Oskar BergRouting
Clarification
$1,612

Waste survives because nobody owns the question. Underrunner finds who does, and asks them, with proof, one email at a time.

Where the money goes

  • AWS
  • Databricks
  • Snowflake
  • Google Cloud
  • Azure
  • Kubernetes

Who owns what

  • GitHub
  • GitLab
  • Confluence
  • OpenMetadata
  • Backstage
  • PagerDuty
  • ServiceNow
  • Okta
  • Entra ID

The whole picture, at a glance

Where the money sits, what to do first, and what's already gone. These are the real charts, showing the made-up demo company. Point at anything.

Nothing goes without a person saying so

Every resource moves through the same stages. Software does the digging. People make the three decisions that matter.

  1. 1

    Identified

    Reads inventory, usage and spend, then ranks everything by savings times how likely it's unneeded.

  2. 2

    Clarification

    Asks the owner what it is and whether it's still needed. Wrong person? They say who, and it learns.

    A person answers
  3. 3

    Final confirmation

    The head of that org sees what's confirmed, by whom, and what it saves, and approves it.

    A head of org approves
  4. 4

    Scheduled

    Everyone gets notice and a way to stop it. It can be switched off first, so anyone relying on it notices.

    Anyone can stop it
  5. 5

    Removed

    Re-checks scope, tags and usage on the day, keeps a backup where it can, and confirms it's really gone.

  6. 6

    Watched

    Scans again on your schedule, reports what's new, checks the bill went down, and flags anything that came back from infrastructure code.

Asks the right person, and not too often

The fastest way to get a tool like this muted is to email everyone about everything. So it doesn't.

Email

One email per person, weekly by default, however many things they own. One click to answer, with no login.

U
UnderrunnerDirect message

A hundred forgotten snapshots look unused, about $640/mo. They're one question, not a hundred.

Still neededNot needed

Slack

A direct message with a button, if you prefer. Anyone not in Slack gets the email.

terraform/rds.tf+0 -14
- resource "aws_db_instance" "ml_feature_store_v1" { - instance_class = "db.r6g.2xlarge" # Removal approved by Noor Haddad
Ready to reviewOpen pull request

Pull request

What Terraform owns is removed with a diff for a person to merge, since deleting it by hand only lasts until the next apply.

Proof you can check yourself

Engineers don't delete things on a hunch, and they shouldn't have to take a tool's word for it. Each item shows the measurements, where they came from, and the command to check them.

  • Usage from the source. CloudWatch, Cost Explorer, CloudTrail, Databricks system tables, Snowflake ACCOUNT_USAGE and ACCESS_HISTORY.
  • Code and docs. Where it's defined in GitHub, who last changed that code, CODEOWNERS, archived repos, and what your Confluence says about it.
  • Counter-evidence too. Production tags, recent commits, a DNS name still pointing at it, an open ticket and pages calling something critical all count against removing it.
  • An LLM that reads the whole file. It explains what a resource probably is and what to ask. It can reorder the queue a little. It can't approve anything.
  • No metrics is never proof. If nothing measures a resource, it isn't called idle.
RDS database · AWS · us-east-1

ml-feature-store-v1

prodIn scopeManaged by terraform

Why it's here

No connections at all for 61 days.
Peak connections, last 30 days
0
Average CPU, last 30 days
1.2%
Cost
$3,910/mo

What moved the score

-20 Looks like production

+10 A page calls it retired: Feature store v2 migration

+8 Only referenced from archived repositories

Who answers for it

Machine Learning, with 97% certainty

Tag omd:team=machine-learning · CODEOWNERS on terraform/rds.tf · Created by clara.jensen, who has left, so it goes to their manager

Check it yourself

aws cloudwatch get-metric-statistics --namespace AWS/RDS \
  --metric-name DatabaseConnections \
  --dimensions Name=DBInstanceIdentifier,Value=ml-feature-store-v1 \
  --statistics Maximum --period 86400 ...

Only what's yours

Define a scope: a team, an org, or the whole tech organization. Underrunner works out which resources belong to it from tags (including OMD tags), code owners, creators, your docs and your org chart. Then it stays inside that line.

Inside the scope

Clearly owned by a team you chose. Can be asked about and, once confirmed, removed.

  • Machine Learning: ml-feature-store-v1
  • Routing: routing-sim-gpu-1
  • Data Engineering: TRANSFORM_XL_WH
Not sure

Nobody's clearly responsible. It's never emailed about or removed until someone is.

  • No owner found: old-jenkins-2
Outside

Another org's. It can look just as idle, and it's left completely alone.

  • Security: halden-siem-archive
  • Security: sec-forensics-worker

Careful by default

A tool that can delete production is a serious thing to connect. These are the defaults, not settings you have to find.

Security details

No keys to hand over

Connect AWS, Databricks, Snowflake, Google Cloud or Azure with an identity that trusts only your workspace. There's no key to store or leak, and it can't change anything.

Dry run by default

Approved removals are rehearsed until you choose otherwise. Or stay on runbook: people run the commands, and we verify.

A separate key to remove

Live removal needs a second credential you add on purpose, and can remove again at any time.

Checked again on the day

Still in scope, still unused since approval, not newly tagged, no new DNS name pointing at it, still confirmed. If not, the removal stops and whoever said yes hears why.

Production stays manual

Automatic removal in production is off unless you turn it on. Backups and final snapshots are taken wherever the platform allows.

Tickets, if that's how you work

A removal that people carry out can open a Jira ticket with the steps and the proof, and close it once a scan confirms it's gone.

Limits and a paper trail

Daily caps on removals, and every answer, approval and removal in a tamper-evident log. Credentials are encrypted at rest.

Plug in what you have

Starting with where the big bills are, and what actually tells you who owns things.

Spend

AWSDatabricksSnowflakeGoogle CloudAzureBigQueryMongoDB AtlasConfluent CloudGitHub Copilot seatsDatadogKubernetesNew RelicCloudflareDigitalOceanOracle CloudLinodeVultrHetzner CloudMicrosoft 365 licensesSalesforce licensesGitLab seatsOkta seatsGoogle Workspace seatsElastic CloudVercelRedis CloudSplunk

Context

GitHubGitLabConfluenceBackstagePagerDutyServiceNowTags and OMD tagsPeople CSVOpenMetadataOktaMicrosoft Entra IDGoogle Workspace

Available now Planned

See it on a company
that isn't yours first.

The demo runs the real product on a made-up freight company, with its clouds, docs, code, org chart and inboxes. Answer an email. Approve a removal. Break something.