ReviewOS

also looking at this

stacks/lastsoulultra

LSU's own coaching surface, and what auditing the site turned up

#12
Merged glennmichael123 wants to merge claude/last-soul-ultra-web-6e0718 into main
86 files +3943 -1190

Review threads live on the whole diff, not on one commit, so none are shown here - a thread's line means something in the branch's final form, and painting it into an intermediate step would put it on code it is not about.

resources/data/faq.tsdeleted+0-136
Changes to resources/data/faq.ts
@@ -1,136 +0,0 @@
1/**
2 * The FAQ, in the organiser's own words.
3 *
4 * Grouped the way lastsoulultra.com groups it - the race, the athlete's crew,
5 * spectators - because the answers genuinely address different people. A
6 * prospective entrant and somebody hoping to come and watch want different
7 * halves of this page, and a single ungrouped list makes both of them read all
8 * of it.
9 */
10
11export interface Question {
12 q: string
13 /** Paragraphs, so a long answer keeps its breaks. */
14 a: string[]
15}
16
17export interface FaqGroup {
18 slug: string
19 title: string
20 blurb: string
21 questions: Question[]
22}
23
24export const faq: FaqGroup[] = [
25 {
26 slug: 'the-race',
27 title: 'the race',
28 blurb: 'Format, timings and what is provided on site.',
29 questions: [
30 {
31 q: 'How does the Last Soul Ultra work?',
32 a: [
33 'The Last Soul Ultra follows the backyard ultra format. Every hour, all runners start together on a 6.7 km loop. Anyone who does not finish the loop in time and return to the starting corral before the next hour is eliminated.',
34 'The race continues until only one runner remains. That athlete must then complete one final solo loop to be officially declared the winner.',
35 ],
36 },
37 {
38 q: 'When does the race start?',
39 a: ['It kicks off Friday, 14 August 2026.'],
40 },
41 {
42 q: 'Is there a time limit or a maximum race duration?',
43 a: [
44 'No. There is no set end time. The race goes on until only one person is able to complete a loop.',
45 'This unpredictability is exactly what makes the format so unique and challenging.',
46 ],
47 },
48 {
49 q: 'Is there electricity, water or food?',
50 a: [
51 'There is no electrical hookup. Water is provided in containers for each athlete.',
52 'Full catering is not provided: every participant must manage their own nutrition.',
53 'There is an aid station at the base camp stocked throughout the event, but it is intended only as a supplement and does not replace self-sufficiency.',
54 ],
55 },
56 {
57 q: 'How is the base camp organised?',
58 a: [
59 'Each participant is allocated a 3x3 metre space at the base camp, marked in advance and assigned on a first come, first served basis.',
60 'As runners drop out during the race, remaining camps may be moved closer to the starting line.',
61 ],
62 },
63 {
64 q: 'What mandatory gear is required?',
65 a: ['Each participant must wear a working headlamp when running in twilight or darkness. Participation without this mandatory gear is not allowed.'],
66 },
67 {
68 q: 'What are the participation requirements?',
69 a: ['Before the start, every athlete must sign a waiver. This document, including all terms and conditions, will be made available ahead of time.'],
70 },
71 {
72 q: 'Who is participating?',
73 a: ['The starting field consists of international ultrarunners, athletes, well-known sports personalities, content creators and selected lottery participants.'],
74 },
75 {
76 q: 'Why is the location kept secret?',
77 a: ['The exact location is not disclosed in order to guarantee the safety and smooth running of the event.'],
78 },
79 ],
80 },
81 {
82 slug: 'crew',
83 title: 'athlete crew',
84 blurb: 'What a crew may do, and the two things that end an athlete’s race.',
85 questions: [
86 {
87 q: 'How much support can an athlete receive?',
88 a: [
89 'In the base camp, crew members can fully assist their athlete: with setup, nutrition, and preparation for the next loop.',
90 'Once the athlete enters the course, any kind of support is strictly prohibited. Even handing over food or gear during a loop will result in the runner’s immediate disqualification.',
91 ],
92 },
93 {
94 q: 'Can crew members enter the track?',
95 a: ['No. Crew members are not allowed on the track. If this rule is broken, the corresponding athlete will be automatically disqualified.'],
96 },
97 {
98 q: 'How many crew members are allowed?',
99 a: ['Each runner may have up to three crew members. Having a crew is optional, not mandatory.'],
100 },
101 ],
102 },
103 {
104 slug: 'watching',
105 title: 'following the race',
106 blurb: 'The race is closed to the public and open on every screen.',
107 questions: [
108 {
109 q: 'Can people watch the event in person?',
110 a: ['No, on-site spectators are not allowed. This ensures safety and smooth operations during the race.'],
111 },
112 {
113 q: 'Will the race be streamed live?',
114 a: [
115 'Yes. There will be a 24/7 livestream broadcasting the race from start to finish.',
116 'Updates, stories, and behind-the-scenes content will be shared regularly on Instagram.',
117 ],
118 },
119 {
120 q: 'Where can I follow the race?',
121 a: [
122 'All highlights, updates and important information are shared on the official Instagram channel @lastsoulultra, as well as on the channels of Kim Gottwald and rappid.',
123 'The race is streamed live on YouTube, with selected highlights and additional content available after the event.',
124 ],
125 },
126 ],
127 },
128]
129
130export function groupBySlug(slug: string): FaqGroup | undefined {
131 return faq.find(group => group.slug === slug)
132}
133
134export function questionCount(): number {
135 return faq.reduce((total, group) => total + group.questions.length, 0)
136}