One language for cost and usage.
FOCUS is the FinOps Open Cost and Usage Specification. It gives cloud and SaaS providers a common set of billing columns, including BilledCost, EffectiveCost and ServiceName.
- Specification
- FinOps Foundation
- Billing source
- FOCUS 1.0 sample
- Sample charge rows
- 100,000
- Mode
- Read-only
- Library snapshot (UTC)
- 2026-10-08
Show focus.finops.org here (embedded preview)

Credential
FinOps Certified FOCUS Analyst
Issued
The author of this site holds this credential for working with FOCUS-formatted cost and usage data.
Verify the credential on Credly ↗The evidence behind this site.
The library crawl recorded 30 errors. This site presents the bundled snapshot; use the source links to check authoritative definitions and current library content.
Changelog
Unreleased
Added
- Crawlers, search engines and AI agents can discover every public page: the site serves
robots.txtand a sitemap, each page names its own path as canonical (shared query-string views canonicalize to the base page), every page has a description, and the About and spec column pages publish JSON-LD; a local smoke checks all sitemap pages over HTTP.
Fixed
- The About page changelog shows plain version labels instead of links to private repository compare pages; bundling fails if a private-repository link would reach public content.
- Links in prose and notices now stay underlined in light and dark themes; a local accessibility smoke checks key pages for serious WCAG violations and horizontal overflow.
- Snapshot generation now uses consistent read-only transactions, shared source fingerprints and atomic replacement; incomplete or mismatched snapshot pairs and stale catalog defaults stop bundling. Static results have deterministic ordering and serialization, with an explicit read-only drift check.
- Forecast artifacts now validate dates, uncertainty bands, anomalies, projections, model metrics and recorded snapshot ranges before bundling; malformed or stale data stops development and builds with a specific diagnostic.
- Failed explorer and catalog queries now keep their inputs and recovery controls, show safe classified messages, and expose query-state markers for semantic monitoring.
- Explorer and catalog inputs now validate identifiers, calendar dates, UTC timestamps, integer pages and value lengths before SQL; normalized default parameters keep precomputed results.
- Explorer untagged drills now select missing tag values, keep literal
(untagged)values separate, and preserve the missing filter in shared URLs. - Live queries now stop waiting when database connections or responses stall, and recover safely from dropped idle connections.
Security
- Database connections from the app, snapshot tools, forecast and
psqlscripts now verify the Supabase certificate chain and hostname against a pinned root CA; URLsslmodeparameters can no longer disable verification. - Responses now carry explicit browser hardening headers (no-sniff, referrer, permissions, framing denial) and an enforced Content Security Policy that limits scripts, styles, images, fonts and connections to the site itself and frames to focus.finops.org; preview deployments also allow the Vercel Toolbar.
npm run test:headerschecks real responses, zero violations in Chrome and refused framing.
1.3.0 - 2026-10-10
Added
- A 14-day cost forecast, built offline with Prophet from daily Usage cost:
- A Forecast panel on the dashboard, featuring the series with the most recent data.
- A new Forecast page under Data, with Total, AWS, Microsoft and Oracle series, 95% and 80% expected ranges, a projected 14-day total, full-screen charts and data tables.
- A model card for each series, with the training window, settings and a final-week backtest comparing daily and hourly models.
- Anomaly flags: any day outside the 95% expected range is marked as a spike or a drop, with its deviation and severity, plus a guide to how the forecast flags anomalies.
- Forecast tooling (
tools/forecast/) andnpm run precompute:all, which regenerates the dashboard snapshot and the forecast in one step.
Changed
- The sample data now reads as recent: charge timestamps move forward 78 weeks (keeping weekdays) and billing periods 18 months (keeping calendar months), so most charges fall in March 2026. A repeatable migration applies the shift, and the sample loader re-applies it.
- Query defaults, explorer ranges and documentation use the shifted dates.
Fixed
- Use case capabilities and reference text show "&" and other characters instead of HTML codes such as
&. - The column profile precompute runs in smaller batches so each query stays within the 5-second read-only limit.
1.2.0 - 2026-10-10
Changed
- The menu is now grouped into collapsible sections:
- Data: Dashboard, Explore, Column profile.
- Use case library: Use cases, Queries.
- Specification: versions 1.4 and 1.0.
- About: on its own.
- The section containing the current page opens automatically, and each section shows how many pages it holds.
1.1.0 - 2026-10-10
Added
- A full-screen control on every chart:
- Uses true full screen on desktop, Android and iPad, and a full-viewport view on iPhone.
- Redraws for portrait or landscape. On Android, it can lock the screen to landscape.
- In full screen, you can zoom into part of the axis, show or hide series from the legend, and switch to the data table.
Changed
- New look based on the AI Agent Skills resource library design system:
- Navy, paper, mint and coral palette, with Georgia headings and square corners.
- Each page opens with a "data receipt" showing source, data, status, mode and snapshot date.
- Headline numbers are a ruled ledger.
- Query results are labelled "Precomputed" or "Live".
- Accessibility:
- A contrasting inner focus ring.
- Tap targets of at least 44px.
- Scrolling SQL blocks can be reached with the keyboard.
- Long legend labels wrap.
- Full-screen charts fit short landscape screens: the legend sits beside the plot and the controls fold away.
1.0.0 - 2026-10-09
The first public release of FOCUS Explorer, live at https://finops-focus-jwilkes.vercel.app.
Added
- Cost dashboard over the FOCUS 1.0 sample data (100,000 rows from AWS, Microsoft, Oracle and Google Cloud), with:
- KPIs for effective, billed and list cost, savings versus list, and tag coverage.
- Charts for daily usage cost by provider, service categories, top services, regions, charge categories and tag keys.
- Data explorer:
- Filter by provider, service category, service, region, charge category, sub account, date range, tag and text.
- Group by any dimension or tag key and pick a measure.
- Drill into any group.
- See daily trends and paged charge rows.
- Share any view by its URL.
- Column profile showing the fill rate, distinct values and most common values of every column.
- All 118 FOCUS use case queries, translated to Postgres for the v1.0 sample: 33 run directly, 49 are adapted with documented column substitutions, and 36 are marked unsupported with the reason. Each runnable query has editable parameters, a chart and a result table.
- Use case library (115 use cases grouped by FinOps capability) and FOCUS spec column pages for v1.4 and v1.0, from a snapshot of the FOCUS MCP Server.
- About page with:
- A link to and embedded preview of focus.finops.org.
- The FinOps Certified FOCUS Analyst credential.
- A QR code for the public site.
- This changelog.
- Menu drawer for navigation on every page and screen size.
- Precomputed results for the dashboard, column profile, filter lists, explorer landing view and every query's default parameters, so those load instantly. Only custom filters and parameters query the database.
- Tooling:
- FOCUS MCP Server crawler.
- Catalog validator that runs every query.
- Sample data loader.
- Precompute script.
- One-time tailnet form for saving the database connection string.
- Least-privilege database role setup for Vercel.
Security
- The app queries Supabase with a dedicated
focus_applogin. That login can only read, through the select-onlyfocus_readerrole, in read-only transactions with a 5 second statement timeout. - The sample table lives in a schema that isn't exposed through the Supabase Data API, with row-level security enabled.
- Explorer column names come only from fixed allowlists, and every user-supplied value is a bound parameter.
- Deployments upload only the app and its data (a
.vercelignoreallowlist), never.envfiles.