| Country | Contributions | Between | Climbers | Crags | Summits | Climbs | Ascents | |
|---|---|---|---|---|---|---|---|---|
| 1 | USA | 1507 | 20th November 2025 – 30th June 2026 | 47 | 20 | 0 | 87 | 97 |
| 2 | Australia | 767 | 27th September 2025 – 29th June 2026 | 6 | 38 | 0 | 61 | 33 |
| 3 | United Kingdom | 576 | 19th November 2025 – 8th July 2026 | 33 | 14 | 0 | 22 | 43 |
| 4 | France | 264 | 6th January 2026 – 28th June 2026 | 14 | 3 | 0 | 12 | 31 |
| 5 | Switzerland | 257 | 24th January 2026 – 10th July 2026 | 6 | 3 | 0 | 12 | 33 |
| 6 | Austria | 210 | 12th November 2025 – 22nd June 2026 | 5 | 2 | 0 | 8 | 22 |
| 7 | Italy | 129 | 18th November 2025 – 29th May 2026 | 9 | 3 | 0 | 11 | 10 |
| 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 | ||
|---|---|---|---|---|---|---|---|
| 61 | 28th June 2026 | 20:49:05 UTC | baz9 | climber | Owen Marquez Cellier | country_membership | |
|
Before
None
After
french
|
|||||||
| 62 | 28th June 2026 | 20:49:05 UTC | baz9 | climber | Owen Marquez Cellier | country_id | |
|
Before
None
After
14
|
|||||||
| 63 | 28th June 2026 | 20:49:05 UTC | baz9 | climber | Owen Marquez Cellier | climber_name | |
|
Before
None
After
Owen Marquez Cellier
|
|||||||
| 64 | 28th June 2026 | 20:49:05 UTC | baz9 | climber | Owen Marquez Cellier | country_flag | |
|
Before
None
After
🇫🇷
|
|||||||
| 65 | 28th June 2026 | 18:32:52 UTC | baz9 | ascent | Shawn Raboutou's ascent of Cheese Steeze | notes_pretty | |
|
Before
None
After
<p>FA'd with a harness and grigri still on from belaying.</p>
|
|||||||
| 66 | 28th June 2026 | 18:32:52 UTC | baz9 | ascent | Shawn Raboutou's ascent of Cheese Steeze | notes | |
|
Before
None
After
FA'd with a harness and grigri still on from belaying.
Diff
--- before
|
|||||||
| 67 | 27th June 2026 | 21:46:02 UTC | baz9 | ascent | Magnus Midtbø's ascent of Blood Redemption | suggested_grade_id | |
|
Before
None
After
41
|
|||||||
| 68 | 27th June 2026 | 21:46:02 UTC | baz9 | ascent | Magnus Midtbø's ascent of Blood Redemption | notes_pretty | |
|
Before
<h3>References</h3>
<p>[1] <a href="https://youtu.be/tjFsqCssN7Y?t=2144">https://youtu.be/tjFsqCssN7Y?t=2144</a></p>
After
<h3>References</h3>
<p>[1] <a href="https://youtu.be/tjFsqCssN7Y?t=2144" rel="noopener noreferrer">https://youtu.be/tjFsqCssN7Y?t=2144</a></p>
|
|||||||
| 69 | 27th June 2026 | 21:41:36 UTC | baz9 | ascent | Solly Kemball-Dorey's ascent of The Origin | notes | |
|
Before
### References
[1] [https://www.instagram.com/p/Cb3GH6PtSRt/](https://www.instagram.com/p/Cb3GH6PtSRt/)
After
### References
[1] [https://www.instagram.com/p/Cb3GH6PtSRt/](https://www.instagram.com/p/Cb3GH6PtSRt/)
Diff
--- before
|
|||||||
| 70 | 27th June 2026 | 21:41:36 UTC | baz9 | ascent | Solly Kemball-Dorey's ascent of The Origin | notes_pretty | |
|
Before
<h3>References</h3>
<p>[1] <a href="https://www.instagram.com/p/Cb3GH6PtSRt/">https://www.instagram.com/p/Cb3GH6PtSRt/</a></p>
After
<h3>References</h3>
<p>[1] <a href="https://www.instagram.com/p/Cb3GH6PtSRt/" rel="noopener noreferrer">https://www.instagram.com/p/Cb3GH6PtSRt/</a></p>
|
|||||||
| 71 | 27th June 2026 | 21:41:36 UTC | baz9 | ascent | Solly Kemball-Dorey's ascent of The Origin | suggested_grade_id | |
|
Before
None
After
40
|
|||||||
| 72 | 26th June 2026 | 13:06:46 UTC | baz9 | list | History of 8C+ | list_definition | |
|
Before
with grade_cutoff as (
select
g.order_on
from
grades g
where
g.climb_type_id = 2
and g.grade = '8C+'
limit 1
),
first_ascents as (
select
a.ascent_id
,a.climb_id
,a.climber_id
,a.ascent_dt_start
,a.ascent_dt_end
,sg.grade as suggested_grade
,sg.order_on as suggested_order_on
,initial_g.grade as initial_suggested_grade
,initial_g.order_on as initial_suggested_order_on
from
ascents a
left join grades sg
on a.suggested_grade_id = sg.grade_id
and sg.climb_type_id = 2
left join ascent_meta am_initial
on a.ascent_id = am_initial.ascent_id
and am_initial.ascent_meta_key_id = 26
left join grades initial_g
on am_initial.value = initial_g.grade_id::varchar
and initial_g.climb_type_id = 2
where
a.fa = true
and a.deleted_on is null
),
first_ascent_by_climb as (
select
fa.climb_id
,string_agg(
'<a href="/climber/' || cl.climber_id::varchar || '">' || cl.climber_name || '</a>'
,', '
order by cl.climber_name
) as first_ascent
,(array_agg(
pretty_dt(fa.ascent_dt_start, fa.ascent_dt_end)
order by order_dt(fa.ascent_dt_start, fa.ascent_dt_end)
))[1] as date
,min(order_dt(fa.ascent_dt_start, fa.ascent_dt_end)) as date_order
,(array_agg(
fa.suggested_grade
order by fa.suggested_order_on desc nulls last
))[1] as suggested_grade
,max(fa.suggested_order_on) as suggested_order_on
,(array_agg(
fa.initial_suggested_grade
order by fa.initial_suggested_order_on desc nulls last
))[1] as initial_suggested_grade
,max(fa.initial_suggested_order_on) as initial_suggested_order_on
from
first_ascents fa
inner join climbers cl
on fa.climber_id = cl.climber_id
and cl.deleted_on is null
group by
fa.climb_id
)
select
c.climb_uuid as row_uuid
,'<a href="/climb/' || c.climb_id::varchar || '">' || c.climb_name || '</a>' as "Name"
,g.grade as "Grade"
,fa.first_ascent as "First Ascent"
,case
when fa.initial_suggested_grade is not null
and fa.suggested_grade is not null
and fa.initial_suggested_grade != fa.suggested_grade
then fa.suggested_grade || ' ~ initially suggested ' || fa.initial_suggested_grade
when fa.initial_suggested_grade is not null
and fa.initial_suggested_grade != coalesce(fa.suggested_grade, g.grade)
then coalesce(fa.suggested_grade, g.grade) || ' ~ initially suggested ' || fa.initial_suggested_grade
when fa.suggested_grade is not null
then fa.suggested_grade
else g.grade
end as "Suggested Grade"
,fa.date as "Date"
from
climbs c
inner join grades g
on c.grade_id = g.grade_id
and g.climb_type_id = 2
inner join first_ascent_by_climb fa
on c.climb_id = fa.climb_id
cross join grade_cutoff gc
where
c.deleted_on is null
and c.climb_type = 2
and fa.date_order < 20200101
and (
g.order_on >= gc.order_on
or fa.suggested_order_on >= gc.order_on
or fa.initial_suggested_order_on >= gc.order_on
or fa.suggested_grade in ('8C/8C+', '8C/+')
or fa.initial_suggested_grade in ('8C/8C+', '8C/+')
)
order by
fa.date_order
,greatest(
coalesce(g.order_on, 0)
,coalesce(fa.suggested_order_on, 0)
,coalesce(fa.initial_suggested_order_on, 0)
) desc
,c.climb_name
After
with grade_cutoff as (
select
g.order_on
from
grades g
where
g.climb_type_id = 2
and g.grade = '8C+'
limit 1
),
first_ascents as (
select
a.ascent_id
,a.climb_id
,a.climber_id
,a.ascent_dt_start
,a.ascent_dt_end
,sg.grade as suggested_grade
,sg.order_on as suggested_order_on
,initial_g.grade as initial_suggested_grade
,initial_g.order_on as initial_suggested_order_on
from
ascents a
left join grades sg
on a.suggested_grade_id = sg.grade_id
and sg.climb_type_id = 2
left join ascent_meta am_initial
on a.ascent_id = am_initial.ascent_id
and am_initial.ascent_meta_key_id = 26
left join grades initial_g
on am_initial.value = initial_g.grade_id::varchar
and initial_g.climb_type_id = 2
where
a.fa = true
and a.deleted_on is null
),
first_ascent_by_climb as (
select
fa.climb_id
,string_agg(
'<a href="/climber/' || cl.climber_id::varchar || '">' || cl.climber_name || '</a>'
,', '
order by cl.climber_name
) as first_ascent
,(array_agg(
pretty_dt(fa.ascent_dt_start, fa.ascent_dt_end)
order by order_dt(fa.ascent_dt_start, fa.ascent_dt_end)
))[1] as date
,min(order_dt(fa.ascent_dt_start, fa.ascent_dt_end)) as date_order
,(array_agg(
fa.suggested_grade
order by fa.suggested_order_on desc nulls last
))[1] as suggested_grade
,max(fa.suggested_order_on) as suggested_order_on
,(array_agg(
fa.initial_suggested_grade
order by fa.initial_suggested_order_on desc nulls last
))[1] as initial_suggested_grade
,max(fa.initial_suggested_order_on) as initial_suggested_order_on
from
first_ascents fa
inner join climbers cl
on fa.climber_id = cl.climber_id
and cl.deleted_on is null
group by
fa.climb_id
)
select
c.climb_uuid as row_uuid
,'<a href="/climb/' || c.climb_id::varchar || '">' || c.climb_name || '</a>' as "Name"
,g.grade as "Grade"
,fa.first_ascent as "First Ascent"
,case
when fa.initial_suggested_grade is not null
and fa.suggested_grade is not null
and fa.initial_suggested_grade != fa.suggested_grade
then fa.suggested_grade || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.initial_suggested_grade is not null
and fa.initial_suggested_grade != coalesce(fa.suggested_grade, g.grade)
then coalesce(fa.suggested_grade, g.grade) || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.suggested_grade is not null
then fa.suggested_grade
else g.grade
end as "Suggested Grade"
,fa.date as "Date"
from
climbs c
inner join grades g
on c.grade_id = g.grade_id
and g.climb_type_id = 2
inner join first_ascent_by_climb fa
on c.climb_id = fa.climb_id
cross join grade_cutoff gc
where
c.deleted_on is null
and c.climb_type = 2
and fa.date_order < 20200101
and (
g.order_on >= gc.order_on
or fa.suggested_order_on >= gc.order_on
or fa.initial_suggested_order_on >= gc.order_on
or fa.suggested_grade in ('8C/8C+', '8C/+')
or fa.initial_suggested_grade in ('8C/8C+', '8C/+')
)
order by
fa.date_order
,greatest(
coalesce(g.order_on, 0)
,coalesce(fa.suggested_order_on, 0)
,coalesce(fa.initial_suggested_order_on, 0)
) desc
,c.climb_name
Diff
--- before
|
|||||||
| 73 | 26th June 2026 | 13:06:00 UTC | baz9 | list | History of 8C+ | list_definition | |
|
Before
with grade_cutoff as (
select
g.order_on
from
grades g
where
g.climb_type_id = 2
and g.grade = '8C+'
limit 1
),
first_ascents as (
select
a.ascent_id
,a.climb_id
,a.climber_id
,a.ascent_dt_start
,a.ascent_dt_end
,sg.grade as suggested_grade
,sg.order_on as suggested_order_on
,initial_g.grade as initial_suggested_grade
,initial_g.order_on as initial_suggested_order_on
from
ascents a
left join grades sg
on a.suggested_grade_id = sg.grade_id
and sg.climb_type_id = 2
left join ascent_meta am_initial
on a.ascent_id = am_initial.ascent_id
and am_initial.ascent_meta_key_id = 26
left join grades initial_g
on am_initial.value = initial_g.grade_id::varchar
and initial_g.climb_type_id = 2
where
a.fa = true
and a.deleted_on is null
),
first_ascent_by_climb as (
select
fa.climb_id
,string_agg(
'<a href="/climber/' || cl.climber_id::varchar || '">' || cl.climber_name || '</a>'
,', '
order by cl.climber_name
) as first_ascent
,(array_agg(
pretty_dt(fa.ascent_dt_start, fa.ascent_dt_end)
order by order_dt(fa.ascent_dt_start, fa.ascent_dt_end)
))[1] as date
,min(order_dt(fa.ascent_dt_start, fa.ascent_dt_end)) as date_order
,(array_agg(
fa.suggested_grade
order by fa.suggested_order_on desc nulls last
))[1] as suggested_grade
,max(fa.suggested_order_on) as suggested_order_on
,(array_agg(
fa.initial_suggested_grade
order by fa.initial_suggested_order_on desc nulls last
))[1] as initial_suggested_grade
,max(fa.initial_suggested_order_on) as initial_suggested_order_on
from
first_ascents fa
inner join climbers cl
on fa.climber_id = cl.climber_id
and cl.deleted_on is null
group by
fa.climb_id
)
select
c.climb_uuid as row_uuid
,'<a href="/climb/' || c.climb_id::varchar || '">' || c.climb_name || '</a>' as "Name"
,g.grade as "Grade"
,fa.first_ascent as "First Ascent"
,case
when fa.initial_suggested_grade is not null
and fa.suggested_grade is not null
and fa.initial_suggested_grade != fa.suggested_grade
then fa.suggested_grade || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.initial_suggested_grade is not null
and fa.initial_suggested_grade != coalesce(fa.suggested_grade, g.grade)
then coalesce(fa.suggested_grade, g.grade) || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.suggested_grade is not null
then fa.suggested_grade
else g.grade
end as "Suggested Grade"
,fa.date as "Date"
from
climbs c
inner join grades g
on c.grade_id = g.grade_id
and g.climb_type_id = 2
inner join first_ascent_by_climb fa
on c.climb_id = fa.climb_id
cross join grade_cutoff gc
where
c.deleted_on is null
and c.climb_type = 2
and fa.date_order < 20200101
and (
g.order_on >= gc.order_on
or fa.suggested_order_on >= gc.order_on
or fa.initial_suggested_order_on >= gc.order_on
or fa.suggested_grade in ('8C/8C+', '8C/+')
or fa.initial_suggested_grade in ('8C/8C+', '8C/+')
)
order by
fa.date_order
,greatest(
coalesce(g.order_on, 0)
,coalesce(fa.suggested_order_on, 0)
,coalesce(fa.initial_suggested_order_on, 0)
) desc
,c.climb_name
After
with grade_cutoff as (
select
g.order_on
from
grades g
where
g.climb_type_id = 2
and g.grade = '8C+'
limit 1
),
first_ascents as (
select
a.ascent_id
,a.climb_id
,a.climber_id
,a.ascent_dt_start
,a.ascent_dt_end
,sg.grade as suggested_grade
,sg.order_on as suggested_order_on
,initial_g.grade as initial_suggested_grade
,initial_g.order_on as initial_suggested_order_on
from
ascents a
left join grades sg
on a.suggested_grade_id = sg.grade_id
and sg.climb_type_id = 2
left join ascent_meta am_initial
on a.ascent_id = am_initial.ascent_id
and am_initial.ascent_meta_key_id = 26
left join grades initial_g
on am_initial.value = initial_g.grade_id::varchar
and initial_g.climb_type_id = 2
where
a.fa = true
and a.deleted_on is null
),
first_ascent_by_climb as (
select
fa.climb_id
,string_agg(
'<a href="/climber/' || cl.climber_id::varchar || '">' || cl.climber_name || '</a>'
,', '
order by cl.climber_name
) as first_ascent
,(array_agg(
pretty_dt(fa.ascent_dt_start, fa.ascent_dt_end)
order by order_dt(fa.ascent_dt_start, fa.ascent_dt_end)
))[1] as date
,min(order_dt(fa.ascent_dt_start, fa.ascent_dt_end)) as date_order
,(array_agg(
fa.suggested_grade
order by fa.suggested_order_on desc nulls last
))[1] as suggested_grade
,max(fa.suggested_order_on) as suggested_order_on
,(array_agg(
fa.initial_suggested_grade
order by fa.initial_suggested_order_on desc nulls last
))[1] as initial_suggested_grade
,max(fa.initial_suggested_order_on) as initial_suggested_order_on
from
first_ascents fa
inner join climbers cl
on fa.climber_id = cl.climber_id
and cl.deleted_on is null
group by
fa.climb_id
)
select
c.climb_uuid as row_uuid
,'<a href="/climb/' || c.climb_id::varchar || '">' || c.climb_name || '</a>' as "Name"
,g.grade as "Grade"
,fa.first_ascent as "First Ascent"
,case
when fa.initial_suggested_grade is not null
and fa.suggested_grade is not null
and fa.initial_suggested_grade != fa.suggested_grade
then fa.suggested_grade || ' ~ initially suggested ' || fa.initial_suggested_grade
when fa.initial_suggested_grade is not null
and fa.initial_suggested_grade != coalesce(fa.suggested_grade, g.grade)
then coalesce(fa.suggested_grade, g.grade) || ' ~ initially suggested ' || fa.initial_suggested_grade
when fa.suggested_grade is not null
then fa.suggested_grade
else g.grade
end as "Suggested Grade"
,fa.date as "Date"
from
climbs c
inner join grades g
on c.grade_id = g.grade_id
and g.climb_type_id = 2
inner join first_ascent_by_climb fa
on c.climb_id = fa.climb_id
cross join grade_cutoff gc
where
c.deleted_on is null
and c.climb_type = 2
and fa.date_order < 20200101
and (
g.order_on >= gc.order_on
or fa.suggested_order_on >= gc.order_on
or fa.initial_suggested_order_on >= gc.order_on
or fa.suggested_grade in ('8C/8C+', '8C/+')
or fa.initial_suggested_grade in ('8C/8C+', '8C/+')
)
order by
fa.date_order
,greatest(
coalesce(g.order_on, 0)
,coalesce(fa.suggested_order_on, 0)
,coalesce(fa.initial_suggested_order_on, 0)
) desc
,c.climb_name
Diff
--- before
|
|||||||
| 74 | 26th June 2026 | 13:03:37 UTC | baz9 | ascent | Toni Lamprecht's ascent of Bokassa's Fridge | ascent_dt_start | |
|
Before
2006-03-01
After
2009-03-07
|
|||||||
| 75 | 26th June 2026 | 12:55:21 UTC | baz9 | list | History of 8C+ | list_description_pretty | |
|
Before
<p>Lists the first boulders graded/suggested at 8C+ or harder.</p>
<p>Includes boulders first ascended before 2020 that are:</p>
<ul>
<li>Graded 8C+ or higher</li>
<li>FA suggested 8C/8C+ of harder</li>
<li>Later revised, but initially suggested 8C+ or higher, indicated by the <strong>Initial Suggested Grade</strong> ascent meta</li>
</ul>
<p>List inspired by following articles by <a href="https://crankclimbing.org/" rel="noopener noreferrer">Crank Climbing</a>:</p>
<ul>
<li><a href="https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/" rel="noopener noreferrer">https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/</a></li>
</ul>
After
<p>Lists the first boulders graded/suggested at 8C+ or harder.</p>
<p>Includes boulders first ascended before 2020 that are:</p>
<ul>
<li>Graded 8C+ or higher</li>
<li>FA suggested 8C/8C+ of harder</li>
<li>Later revised, but initially suggested 8C+ or higher, indicated by the <strong>Initial Suggested Grade</strong> ascent meta</li>
</ul>
<p>List inspired by these articles by <a href="https://crankclimbing.org/" rel="noopener noreferrer">Crank Climbing</a>:</p>
<ul>
<li><a href="https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/" rel="noopener noreferrer">https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/</a></li>
</ul>
|
|||||||
| 76 | 26th June 2026 | 12:55:21 UTC | baz9 | list | History of 8C+ | list_description | |
|
Before
Lists the first boulders graded/suggested at 8C+ or harder.
Includes boulders first ascended before 2020 that are:
- Graded 8C+ or higher
- FA suggested 8C/8C+ of harder
- Later revised, but initially suggested 8C+ or higher, indicated by the **Initial Suggested Grade** ascent meta
List inspired by following articles by [Crank Climbing](https://crankclimbing.org/):
- [https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978](https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/)
After
Lists the first boulders graded/suggested at 8C+ or harder.
Includes boulders first ascended before 2020 that are:
- Graded 8C+ or higher
- FA suggested 8C/8C+ of harder
- Later revised, but initially suggested 8C+ or higher, indicated by the **Initial Suggested Grade** ascent meta
List inspired by these articles by [Crank Climbing](https://crankclimbing.org/):
- [https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978](https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/)
Diff
--- before
|
|||||||
| 77 | 26th June 2026 | 12:54:47 UTC | baz9 | ascent | Daniel Woods's ascent of Hypnotized Minds | Initial Suggested Grade | |
|
Before
None
After
41
|
|||||||
| 78 | 26th June 2026 | 12:54:21 UTC | baz9 | list | History of 8C+ | list_description_pretty | |
|
Before
<p>Lists the first boulders graded/suggested at 8C+ or harder.</p>
<p>Includes boulders, FA'd before 2020, that are:</p>
<ul>
<li>Graded 8C+ or higher</li>
<li>FA suggested 8C+ of harder</li>
<li>FA revised grade, but initially suggested 8C+ or harder (indicated by <em>Initial grade suggestion</em> meta)</li>
</ul>
<p>List inspired by following articles by <a href="https://crankclimbing.org/" rel="noopener noreferrer">Crank Climbing</a>:</p>
<ul>
<li><a href="https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/" rel="noopener noreferrer">https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/</a></li>
</ul>
After
<p>Lists the first boulders graded/suggested at 8C+ or harder.</p>
<p>Includes boulders first ascended before 2020 that are:</p>
<ul>
<li>Graded 8C+ or higher</li>
<li>FA suggested 8C/8C+ of harder</li>
<li>Later revised, but initially suggested 8C+ or higher, indicated by the <strong>Initial Suggested Grade</strong> ascent meta</li>
</ul>
<p>List inspired by following articles by <a href="https://crankclimbing.org/" rel="noopener noreferrer">Crank Climbing</a>:</p>
<ul>
<li><a href="https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/" rel="noopener noreferrer">https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/</a></li>
<li><a href="https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/" rel="noopener noreferrer">https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/</a></li>
</ul>
|
|||||||
| 79 | 26th June 2026 | 12:54:21 UTC | baz9 | list | History of 8C+ | list_description | |
|
Before
Lists the first boulders graded/suggested at 8C+ or harder.
Includes boulders, FA'd before 2020, that are:
- Graded 8C+ or higher
- FA suggested 8C+ of harder
- FA revised grade, but initially suggested 8C+ or harder (indicated by *Initial grade suggestion* meta)
List inspired by following articles by [Crank Climbing](https://crankclimbing.org/):
- [https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978](https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/)
After
Lists the first boulders graded/suggested at 8C+ or harder.
Includes boulders first ascended before 2020 that are:
- Graded 8C+ or higher
- FA suggested 8C/8C+ of harder
- Later revised, but initially suggested 8C+ or higher, indicated by the **Initial Suggested Grade** ascent meta
List inspired by following articles by [Crank Climbing](https://crankclimbing.org/):
- [https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978](https://crankclimbing.org/2020/05/the-history-of-v168c-part-1-from-1978/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-2-2004-2011ish/)
- [https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/](https://crankclimbing.org/2020/06/the-history-of-8cv16-part-3-2011ish/)
Diff
--- before
|
|||||||
| 80 | 26th June 2026 | 12:52:41 UTC | baz9 | list | History of 8C+ | list_definition | |
|
Before
with grade_cutoff as (
select
g.order_on
from
grades g
where
g.climb_type_id = 2
and g.grade = '8C+'
limit 1
),
first_ascents as (
select
a.ascent_id
,a.climb_id
,a.climber_id
,a.ascent_dt_start
,a.ascent_dt_end
,sg.grade as suggested_grade
,sg.order_on as suggested_order_on
,initial_g.grade as initial_suggested_grade
,initial_g.order_on as initial_suggested_order_on
from
ascents a
left join grades sg
on a.suggested_grade_id = sg.grade_id
and sg.climb_type_id = 2
left join ascent_meta am_initial
on a.ascent_id = am_initial.ascent_id
and am_initial.ascent_meta_key_id = 26
left join grades initial_g
on am_initial.value = initial_g.grade_id::varchar
and initial_g.climb_type_id = 2
where
a.fa = true
and a.deleted_on is null
),
first_ascent_by_climb as (
select
fa.climb_id
,string_agg(
'<a href="/climber/' || cl.climber_id::varchar || '">' || cl.climber_name || '</a>'
,', '
order by cl.climber_name
) as first_ascent
,(array_agg(
pretty_dt(fa.ascent_dt_start, fa.ascent_dt_end)
order by order_dt(fa.ascent_dt_start, fa.ascent_dt_end)
))[1] as date
,min(order_dt(fa.ascent_dt_start, fa.ascent_dt_end)) as date_order
,(array_agg(
fa.suggested_grade
order by fa.suggested_order_on desc nulls last
))[1] as suggested_grade
,max(fa.suggested_order_on) as suggested_order_on
,(array_agg(
fa.initial_suggested_grade
order by fa.initial_suggested_order_on desc nulls last
))[1] as initial_suggested_grade
,max(fa.initial_suggested_order_on) as initial_suggested_order_on
from
first_ascents fa
inner join climbers cl
on fa.climber_id = cl.climber_id
and cl.deleted_on is null
group by
fa.climb_id
)
select
c.climb_uuid as row_uuid
,'<a href="/climb/' || c.climb_id::varchar || '">' || c.climb_name || '</a>' as "Name"
,g.grade as "Grade"
,fa.first_ascent as "First Ascent"
,case
when fa.initial_suggested_grade is not null
and fa.suggested_grade is not null
and fa.initial_suggested_grade != fa.suggested_grade
then fa.suggested_grade || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.initial_suggested_grade is not null
and fa.initial_suggested_grade != coalesce(fa.suggested_grade, g.grade)
then coalesce(fa.suggested_grade, g.grade) || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.suggested_grade is not null
then fa.suggested_grade
else g.grade
end as "Suggested Grade"
,fa.date as "Date"
from
climbs c
inner join grades g
on c.grade_id = g.grade_id
and g.climb_type_id = 2
inner join first_ascent_by_climb fa
on c.climb_id = fa.climb_id
cross join grade_cutoff gc
where
c.deleted_on is null
and c.climb_type = 2
and fa.date_order < 20200101
and (
g.order_on >= gc.order_on
or fa.suggested_order_on >= gc.order_on
or fa.initial_suggested_order_on >= gc.order_on
)
order by
fa.date_order
,greatest(
coalesce(g.order_on, 0)
,coalesce(fa.suggested_order_on, 0)
,coalesce(fa.initial_suggested_order_on, 0)
) desc
,c.climb_name
After
with grade_cutoff as (
select
g.order_on
from
grades g
where
g.climb_type_id = 2
and g.grade = '8C+'
limit 1
),
first_ascents as (
select
a.ascent_id
,a.climb_id
,a.climber_id
,a.ascent_dt_start
,a.ascent_dt_end
,sg.grade as suggested_grade
,sg.order_on as suggested_order_on
,initial_g.grade as initial_suggested_grade
,initial_g.order_on as initial_suggested_order_on
from
ascents a
left join grades sg
on a.suggested_grade_id = sg.grade_id
and sg.climb_type_id = 2
left join ascent_meta am_initial
on a.ascent_id = am_initial.ascent_id
and am_initial.ascent_meta_key_id = 26
left join grades initial_g
on am_initial.value = initial_g.grade_id::varchar
and initial_g.climb_type_id = 2
where
a.fa = true
and a.deleted_on is null
),
first_ascent_by_climb as (
select
fa.climb_id
,string_agg(
'<a href="/climber/' || cl.climber_id::varchar || '">' || cl.climber_name || '</a>'
,', '
order by cl.climber_name
) as first_ascent
,(array_agg(
pretty_dt(fa.ascent_dt_start, fa.ascent_dt_end)
order by order_dt(fa.ascent_dt_start, fa.ascent_dt_end)
))[1] as date
,min(order_dt(fa.ascent_dt_start, fa.ascent_dt_end)) as date_order
,(array_agg(
fa.suggested_grade
order by fa.suggested_order_on desc nulls last
))[1] as suggested_grade
,max(fa.suggested_order_on) as suggested_order_on
,(array_agg(
fa.initial_suggested_grade
order by fa.initial_suggested_order_on desc nulls last
))[1] as initial_suggested_grade
,max(fa.initial_suggested_order_on) as initial_suggested_order_on
from
first_ascents fa
inner join climbers cl
on fa.climber_id = cl.climber_id
and cl.deleted_on is null
group by
fa.climb_id
)
select
c.climb_uuid as row_uuid
,'<a href="/climb/' || c.climb_id::varchar || '">' || c.climb_name || '</a>' as "Name"
,g.grade as "Grade"
,fa.first_ascent as "First Ascent"
,case
when fa.initial_suggested_grade is not null
and fa.suggested_grade is not null
and fa.initial_suggested_grade != fa.suggested_grade
then fa.suggested_grade || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.initial_suggested_grade is not null
and fa.initial_suggested_grade != coalesce(fa.suggested_grade, g.grade)
then coalesce(fa.suggested_grade, g.grade) || ' ~ Initially suggested ' || fa.initial_suggested_grade
when fa.suggested_grade is not null
then fa.suggested_grade
else g.grade
end as "Suggested Grade"
,fa.date as "Date"
from
climbs c
inner join grades g
on c.grade_id = g.grade_id
and g.climb_type_id = 2
inner join first_ascent_by_climb fa
on c.climb_id = fa.climb_id
cross join grade_cutoff gc
where
c.deleted_on is null
and c.climb_type = 2
and fa.date_order < 20200101
and (
g.order_on >= gc.order_on
or fa.suggested_order_on >= gc.order_on
or fa.initial_suggested_order_on >= gc.order_on
or fa.suggested_grade in ('8C/8C+', '8C/+')
or fa.initial_suggested_grade in ('8C/8C+', '8C/+')
)
order by
fa.date_order
,greatest(
coalesce(g.order_on, 0)
,coalesce(fa.suggested_order_on, 0)
,coalesce(fa.initial_suggested_order_on, 0)
) desc
,c.climb_name
Diff
--- before
|
|||||||