| Country | Contributions | Between | Climbers | Crags | Summits | Climbs | Ascents | |
|---|---|---|---|---|---|---|---|---|
| 1 | USA | 1526 | 20th November 2025 – 4th November 2026 | 48 | 20 | 0 | 88 | 98 |
| 2 | Australia | 767 | 27th September 2025 – 29th June 2026 | 6 | 38 | 0 | 61 | 33 |
| 3 | United Kingdom | 625 | 19th November 2025 – 4th November 2026 | 34 | 14 | 0 | 24 | 49 |
| 4 | Switzerland | 308 | 24th January 2026 – 4th November 2026 | 6 | 3 | 0 | 14 | 38 |
| 5 | France | 300 | 6th January 2026 – 4th November 2026 | 15 | 3 | 0 | 12 | 34 |
| 6 | Austria | 210 | 12th November 2025 – 22nd June 2026 | 5 | 2 | 0 | 8 | 22 |
| 7 | Italy | 163 | 18th November 2025 – 2nd November 2026 | 9 | 3 | 0 | 12 | 12 |
| 8 | Pakistan | 118 | 11th April 2026 – 26th April 2026 | 0 | 0 | 0 | 1 | 7 |
| 9 | Spain | 105 | 20th February 2026 – 16th May 2026 | 5 | 0 | 0 | 10 | 11 |
| 10 | Germany | 103 | 3rd February 2026 – 26th June 2026 | 7 | 0 | 0 | 7 | 10 |
| Date | Time | User | Type | Name | Attribute | ||
|---|---|---|---|---|---|---|---|
| 3021 | 1st May 2026 | 21:17:13 UTC | ben_sandi | climb | The Averager | crag_location_breadcrumb | |
|
Before
None
After
United States / Arizona / Pinal County
|
|||||||
| 3022 | 1st May 2026 | 21:17:13 UTC | ben_sandi | climb | The Averager | crag_name | |
|
Before
None
After
Oak Flat
|
|||||||
| 3023 | 1st May 2026 | 21:17:13 UTC | ben_sandi | climb | The Averager | crag_id | |
|
Before
None
After
34113
|
|||||||
| 3024 | 1st May 2026 | 21:17:02 UTC | ben_sandi | climb | Captain Hook | crag_location_breadcrumb_pretty | |
|
Before
None
After
<a href="/crags/location/United States" class="text-muted">United States</a> / <a href="/crags/location/United States/Arizona" class="text-muted">Arizona</a> / <a href="/crags/location/United States/Arizona/Pinal County" class="text-muted">Pinal County</a>
|
|||||||
| 3025 | 1st May 2026 | 21:17:02 UTC | ben_sandi | climb | Captain Hook | crag_location_breadcrumb | |
|
Before
None
After
United States / Arizona / Pinal County
|
|||||||
| 3026 | 1st May 2026 | 21:17:02 UTC | ben_sandi | climb | Captain Hook | crag_name | |
|
Before
None
After
Oak Flat
|
|||||||
| 3027 | 1st May 2026 | 21:17:02 UTC | ben_sandi | climb | Captain Hook | crag_id | |
|
Before
None
After
34113
|
|||||||
| 3028 | 1st May 2026 | 21:16:39 UTC | ben_sandi | crag | Oak Flat | Other Name | |
|
Before
None
After
Oak Flats
|
|||||||
| 3029 | 1st May 2026 | 18:05:25 UTC | ben_sandi | list | Crags to Create | list_definition | |
|
Before
select
'<a href="' ||
substring(c.eight_a_nu_url from '^(.+)/sectors/') ||
'">' ||
initcap(replace(split_part(c.eight_a_nu_url, '/', 7), '-', ' ')) ||
'</a>' as "8a.nu Crag"
,count(*) as "Climbs Missing"
,string_agg(
'<a href="' || c.url || '">' || c.climb_name || '</a>',
', ' order by c.climb_name
) as "Climbs"
from
climbs c
where
c.deleted_on is null
and c.crag_id is null
and c.eight_a_nu_url is not null
and split_part(c.eight_a_nu_url, '/', 7) not like 'unknown-crag%'
group by
substring(c.eight_a_nu_url from '^(.+)/sectors/')
,split_part(c.eight_a_nu_url, '/', 7)
order by
count(*) desc
,"8a.nu Crag"
After
with missing_crags as (
select
substring(c.eight_a_nu_url from '^(.+)/sectors/') as eight_a_nu_crag_url
,split_part(c.eight_a_nu_url, '/', 7) as eight_a_nu_crag_slug
,initcap(replace(split_part(c.eight_a_nu_url, '/', 7), '-', ' ')) as eight_a_nu_crag_name
,count(*) as climbs_missing
,string_agg(
'<a href="' || c.url || '">' || c.climb_name || '</a>',
', ' order by c.climb_name
) as climbs
from
climbs c
where
c.deleted_on is null
and c.crag_id is null
and c.eight_a_nu_url is not null
and split_part(c.eight_a_nu_url, '/', 7) not like 'unknown-crag%'
group by
substring(c.eight_a_nu_url from '^(.+)/sectors/')
,split_part(c.eight_a_nu_url, '/', 7)
)
select
'<a href="' || m.eight_a_nu_crag_url || '">' || m.eight_a_nu_crag_name || '</a>' as "8a.nu Crag"
,m.climbs_missing as "Climbs Missing"
,m.climbs as "Climbs"
,coalesce(site_crags.crag_exists, '') as "Crag Exists?"
from
missing_crags m
left join lateral (
select
string_agg(
'<a href="' || c2.url || '">' || c2.crag_name || '</a>',
', ' order by c2.crag_name
) as crag_exists
from
crags c2
where
c2.deleted_on is null
and (
(
length(m.eight_a_nu_crag_name) <= 4
and lower(regexp_replace(c2.crag_name, '[^a-z0-9]+', '', 'g')) =
lower(regexp_replace(m.eight_a_nu_crag_name, '[^a-z0-9]+', '', 'g'))
)
or
(
length(m.eight_a_nu_crag_name) between 5 and 8
and (
lower(c2.crag_name) ~ ('(^|[^a-z0-9])' || lower(regexp_replace(m.eight_a_nu_crag_name, '[^a-z0-9]+', ' ', 'g')) || '([^a-z0-9]|$)')
or lower(m.eight_a_nu_crag_name) ~ ('(^|[^a-z0-9])' || lower(regexp_replace(c2.crag_name, '[^a-z0-9]+', ' ', 'g')) || '([^a-z0-9]|$)')
)
)
or
(
length(m.eight_a_nu_crag_name) >= 9
and (
c2.crag_name ilike '%' || m.eight_a_nu_crag_name || '%'
or m.eight_a_nu_crag_name ilike '%' || c2.crag_name || '%'
)
)
)
) site_crags on true
order by
m.climbs_missing desc
,"8a.nu Crag"
Diff
--- before
|
|||||||
| 3030 | 1st May 2026 | 18:02:28 UTC | ben_sandi | list | Temporary Listt | list_definition | |
|
Before
with missing_crags as (
select
substring(c.eight_a_nu_url from '^(.+)/sectors/') as eight_a_nu_crag_url
,split_part(c.eight_a_nu_url, '/', 7) as eight_a_nu_crag_slug
,initcap(replace(split_part(c.eight_a_nu_url, '/', 7), '-', ' ')) as eight_a_nu_crag_name
,count(*) as climbs_missing
,string_agg(
'<a href="' || c.url || '">' || c.climb_name || '</a>',
', ' order by c.climb_name
) as climbs
from
climbs c
where
c.deleted_on is null
and c.crag_id is null
and c.eight_a_nu_url is not null
and split_part(c.eight_a_nu_url, '/', 7) not like 'unknown-crag%'
group by
substring(c.eight_a_nu_url from '^(.+)/sectors/')
,split_part(c.eight_a_nu_url, '/', 7)
)
select
'<a href="' || m.eight_a_nu_crag_url || '">' || m.eight_a_nu_crag_name || '</a>' as "8a.nu Crag"
,m.climbs_missing as "Climbs Missing"
,m.climbs as "Climbs"
,coalesce(site_crags.crag_exists, '') as "Crag Exists?"
from
missing_crags m
left join lateral (
select
string_agg(
'<a href="' || c2.url || '">' || c2.crag_name || '</a>',
', ' order by c2.crag_name
) as crag_exists
from
crags c2
where
c2.deleted_on is null
and (
c2.crag_name ilike '%' || m.eight_a_nu_crag_name || '%'
or m.eight_a_nu_crag_name ilike '%' || c2.crag_name || '%'
)
) site_crags on true
order by
m.climbs_missing desc
,"8a.nu Crag"
After
with missing_crags as (
select
substring(c.eight_a_nu_url from '^(.+)/sectors/') as eight_a_nu_crag_url
,split_part(c.eight_a_nu_url, '/', 7) as eight_a_nu_crag_slug
,initcap(replace(split_part(c.eight_a_nu_url, '/', 7), '-', ' ')) as eight_a_nu_crag_name
,count(*) as climbs_missing
,string_agg(
'<a href="' || c.url || '">' || c.climb_name || '</a>',
', ' order by c.climb_name
) as climbs
from
climbs c
where
c.deleted_on is null
and c.crag_id is null
and c.eight_a_nu_url is not null
and split_part(c.eight_a_nu_url, '/', 7) not like 'unknown-crag%'
group by
substring(c.eight_a_nu_url from '^(.+)/sectors/')
,split_part(c.eight_a_nu_url, '/', 7)
)
select
'<a href="' || m.eight_a_nu_crag_url || '">' || m.eight_a_nu_crag_name || '</a>' as "8a.nu Crag"
,m.climbs_missing as "Climbs Missing"
,m.climbs as "Climbs"
,coalesce(site_crags.crag_exists, '') as "Crag Exists?"
from
missing_crags m
left join lateral (
select
string_agg(
'<a href="' || c2.url || '">' || c2.crag_name || '</a>',
', ' order by c2.crag_name
) as crag_exists
from
crags c2
where
c2.deleted_on is null
and (
(
length(m.eight_a_nu_crag_name) <= 4
and lower(regexp_replace(c2.crag_name, '[^a-z0-9]+', '', 'g')) =
lower(regexp_replace(m.eight_a_nu_crag_name, '[^a-z0-9]+', '', 'g'))
)
or
(
length(m.eight_a_nu_crag_name) between 5 and 8
and (
lower(c2.crag_name) ~ ('(^|[^a-z0-9])' || lower(regexp_replace(m.eight_a_nu_crag_name, '[^a-z0-9]+', ' ', 'g')) || '([^a-z0-9]|$)')
or lower(m.eight_a_nu_crag_name) ~ ('(^|[^a-z0-9])' || lower(regexp_replace(c2.crag_name, '[^a-z0-9]+', ' ', 'g')) || '([^a-z0-9]|$)')
)
)
or
(
length(m.eight_a_nu_crag_name) >= 9
and (
c2.crag_name ilike '%' || m.eight_a_nu_crag_name || '%'
or m.eight_a_nu_crag_name ilike '%' || c2.crag_name || '%'
)
)
)
) site_crags on true
order by
m.climbs_missing desc
,"8a.nu Crag"
Diff
--- before
|
|||||||
| 3031 | 1st May 2026 | 17:51:43 UTC | ben_sandi | list | Temporary Listt | list_type_name | |
|
Before
None
After
Admin
|
|||||||
| 3032 | 1st May 2026 | 17:51:43 UTC | ben_sandi | list | Temporary Listt | list_type_id | |
|
Before
None
After
6
|
|||||||
| 3033 | 1st May 2026 | 17:51:43 UTC | ben_sandi | list | Temporary Listt | list_description_pretty | |
|
Before
None
After
<p>temp</p>
|
|||||||
| 3034 | 1st May 2026 | 17:51:43 UTC | ben_sandi | list | Temporary Listt | list_definition | |
|
Before
None
After
with missing_crags as (
select
substring(c.eight_a_nu_url from '^(.+)/sectors/') as eight_a_nu_crag_url
,split_part(c.eight_a_nu_url, '/', 7) as eight_a_nu_crag_slug
,initcap(replace(split_part(c.eight_a_nu_url, '/', 7), '-', ' ')) as eight_a_nu_crag_name
,count(*) as climbs_missing
,string_agg(
'<a href="' || c.url || '">' || c.climb_name || '</a>',
', ' order by c.climb_name
) as climbs
from
climbs c
where
c.deleted_on is null
and c.crag_id is null
and c.eight_a_nu_url is not null
and split_part(c.eight_a_nu_url, '/', 7) not like 'unknown-crag%'
group by
substring(c.eight_a_nu_url from '^(.+)/sectors/')
,split_part(c.eight_a_nu_url, '/', 7)
)
select
'<a href="' || m.eight_a_nu_crag_url || '">' || m.eight_a_nu_crag_name || '</a>' as "8a.nu Crag"
,m.climbs_missing as "Climbs Missing"
,m.climbs as "Climbs"
,coalesce(site_crags.crag_exists, '') as "Crag Exists?"
from
missing_crags m
left join lateral (
select
string_agg(
'<a href="' || c2.url || '">' || c2.crag_name || '</a>',
', ' order by c2.crag_name
) as crag_exists
from
crags c2
where
c2.deleted_on is null
and (
c2.crag_name ilike '%' || m.eight_a_nu_crag_name || '%'
or m.eight_a_nu_crag_name ilike '%' || c2.crag_name || '%'
)
) site_crags on true
order by
m.climbs_missing desc
,"8a.nu Crag"
Diff
--- before
|
|||||||
| 3035 | 1st May 2026 | 17:51:43 UTC | ben_sandi | list | Temporary Listt | list_description | |
|
Before
None
After
temp
Diff
--- before
|
|||||||
| 3036 | 1st May 2026 | 17:51:43 UTC | ben_sandi | list | Temporary Listt | list_name | |
|
Before
None
After
Temporary Listt
|
|||||||
| 3037 | 1st May 2026 | 17:37:14 UTC | ben_sandi | climb | Titan | crag_location_breadcrumb_pretty | |
|
Before
None
After
<a href="/crags/location/France" class="text-muted">France</a> / <a href="/crags/location/France/Auvergne-Rhône-Alpes" class="text-muted">Auvergne-Rhône-Alpes</a> / <a href="/crags/location/France/Auvergne-Rhône-Alpes/Savoie" class="text-muted">Savoie</a>
|
|||||||
| 3038 | 1st May 2026 | 17:37:14 UTC | ben_sandi | climb | Titan | crag_location_breadcrumb | |
|
Before
None
After
France / Auvergne-Rhône-Alpes / Savoie
|
|||||||
| 3039 | 1st May 2026 | 17:37:14 UTC | ben_sandi | climb | Titan | crag_name | |
|
Before
None
After
La Balme de Yenne
|
|||||||
| 3040 | 1st May 2026 | 17:37:14 UTC | ben_sandi | climb | Titan | crag_id | |
|
Before
None
After
10618
|
|||||||