This report analyzes a curated database of real-world Direct Air Capture (DAC) facilities worldwide, spanning operational plants, projects under construction, and announced installations. Data is sourced from the IEA, the U.S. DOE DAC Hubs program, and company disclosures.
The companion interactive dashboard (built in R Shiny with Leaflet and Plotly) is in the project repository.
# Load the real facilities database
dac <- read_csv("data/dac_facilities.csv", show_col_types = FALSE) %>%
mutate(
start_date = as.Date(start_date),
status = factor(status, levels = c("Operational", "Under Construction", "Planned"))
)
n_fac <- nrow(dac)
n_op <- sum(dac$status == "Operational", na.rm = TRUE)
total_cap <- sum(dac$capacity_tonnes_yr, na.rm = TRUE)
op_cap <- sum(dac$capacity_tonnes_yr[dac$status == "Operational"], na.rm = TRUE)23 facilities tracked across 7 countries. 9 are operational today, with a combined pipeline capacity of 9,077,900 tonnes CO₂/year (65,900 tonnes/year already operational).
pal <- colorFactor(c("#2f5e28", "#3F7D34", "#8BC34A"), domain = dac$status)
leaflet(dac) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
~longitude, ~latitude,
radius = ~pmax(4, log10(capacity_tonnes_yr) * 2.5),
color = ~pal(status), fillOpacity = 0.75, stroke = FALSE,
popup = ~paste0(
"<b>", name, "</b><br>", company, "<br>",
format(capacity_tonnes_yr, big.mark = ","), " t/yr · ", status, "<br>",
technology
)
) %>%
addLegend("bottomright", pal = pal, values = ~status, title = "Status")dac %>%
arrange(desc(capacity_tonnes_yr)) %>%
slice_head(n = 15) %>%
plot_ly(
x = ~capacity_tonnes_yr,
y = ~reorder(name, capacity_tonnes_yr),
color = ~status,
colors = c("#2f5e28", "#3F7D34", "#8BC34A"),
type = "bar", orientation = "h"
) %>%
layout(
title = "Top 15 DAC Facilities by Announced Capacity",
xaxis = list(title = "Capacity (tonnes CO2 / year)"),
yaxis = list(title = ""),
margin = list(l = 160)
)dac %>%
group_by(region, status) %>%
summarise(capacity = sum(capacity_tonnes_yr), .groups = "drop") %>%
plot_ly(
x = ~region, y = ~capacity, color = ~status,
colors = c("#2f5e28", "#3F7D34", "#8BC34A"), type = "bar"
) %>%
layout(
barmode = "stack",
title = "Announced Capacity by Region and Status",
xaxis = list(title = ""),
yaxis = list(title = "Capacity (tonnes CO2 / year)")
)dac %>%
count(technology, wt = capacity_tonnes_yr, name = "capacity") %>%
arrange(desc(capacity)) %>%
mutate(capacity = paste0(format(capacity, big.mark = ","), " t/yr")) %>%
kable(col.names = c("Technology", "Total Announced Capacity")) %>%
kable_styling(bootstrap_options = c("striped", "hover"))| Technology | Total Announced Capacity |
|---|---|
| Solid Sorbent | 5,021,900 t/yr |
| Liquid Solvent | 1,001,000 t/yr |
| Hybrid (Solid + Limestone) | 1,000,000 t/yr |
| Electrochemical (Seawater) | 600,000 t/yr |
| Limestone Kiln | 501,000 t/yr |
| Liquid Solvent (High-temp) | 500,000 t/yr |
| Limestone Mineralization | 321,000 t/yr |
| Solid Sorbent + Mineralization | 50,000 t/yr |
| Solid Sorbent (Low-temp) | 40,000 t/yr |
| Multi-technology | 30,000 t/yr |
| Electrochemical | 7,000 t/yr |
| Passive (MechanicalTree) | 5,000 t/yr |
| Geothermal + Mineralization | 1,000 t/yr |
dac %>%
filter(!is.na(start_date)) %>%
arrange(start_date) %>%
mutate(cumulative = cumsum(capacity_tonnes_yr)) %>%
plot_ly(x = ~start_date, y = ~cumulative, type = "scatter", mode = "lines+markers",
line = list(color = "#3F7D34"), marker = list(color = "#2f5e28")) %>%
layout(
title = "Cumulative Announced Capacity Over Time",
xaxis = list(title = ""),
yaxis = list(title = "Cumulative capacity (tonnes CO2 / year)")
)data/dac_facilities.csv for the
full source column.