Skip to content

perf(site): Lighten pages and fix Go's directions and fares - #15

Merged
WillieCubed merged 7 commits into
mainfrom
feat/lvwwd-getting-around
Sep 24, 2026
Merged

WillieCubed merged 7 commits into
mainfrom
feat/lvwwd-getting-around

Conversation

@WillieCubed

Copy link
Copy Markdown
Contributor

TL;DR

The Go page's step-by-step directions now say only what RTC itself publishes, the bus stop data is
confirmed current and documented, and every page's first visit on a phone is lighter: the home page
drops from 208 KB to 107 KB, and every other page is under the 100 KB budget. Lighthouse on a phone
now finds nothing to fix on any main page.

Overview of Changes

Why this exists

Week Without Driving starts October 1, and most visitors will open lvwwd.org on a phone, often on
the bus, with little data or a weak signal. Two things had to be true before then: the directions
on the Go page had to be right, because a wrong stop or fare strands someone, and the pages had to
be light enough to open on a weak connection.

Places to go says only what RTC says

The seven destinations under "Places to go" were written from RTC's August feed and from notes about
the Raiders' Game Day Express. Every route number and stop name was checked again on September 23
against the GTFS feed RTC serves today, and the Game Day Express details and the "BHX-A" label
against rtcsnv.com. Most of it held. What did not:

  • Several routes pass through Bonneville Transit Center rather than ending there, so the Downtown
    step now says "any route that stops at" it, and lists every route RTC's own map shows there.
  • The Downtown step no longer says the Deuce has its own fare. Every RTC pass works on the Deuce;
    only a single ride bought on it costs more, so the step says the Deuce "can cost more" and links
    to the fare guide.
  • The Game Day Express costs $4 round trip, with cash taken on board, not $2 each way. For the 1:25
    pm kickoff on October 4, buses run from 10:30 am to 12:30 pm, not from 9:30. M Resort is RTC's
    "West Henderson" stop. RTC does not publish how often the buses leave, so that line is gone.
  • The Craig Ranch Regional Park map buttons pointed about 300 meters north of the park point the
    rest of the site uses. They now match.

The destinations and the finder's seven places now live in one module that the page and the tests
share, with a note of when and where each fact was checked. The steps' links to the fare and heat
guides render as ordinary links instead of injected HTML.

Under each stop in "Find a bus", commas and color squares no longer float away from route names
when the list wraps.

The fare guide says every pass works on the Deuce

"Pay your bus fare" told riders the Deuce has its own higher-priced pass and that it is the one to
buy for a trip on the Strip. RTC's fares page says every pass is valid on every route; the higher
Strip fares are what visitors pay. The guide now says that any RTC pass works on every route,
including the Deuce, and that only a single ride bought on the Deuce costs more. It also gives the
fares RTC lists for residential routes, checked on September 23: $2 for a single ride, $3 for 2
hours, $5 for 24 hours, and $20, $34 and $65 for 7, 15 and 30 days, with exact change for cash.

The stop data is current and documented

RTC's feed is still version "August 2026_20260730", valid until August 2027, and the rebuilt stop
data matches it stop for stop. Each of the seven finder places was checked on lvwwd.org: every
point sits at the place it names, and each shows its expected first stop and five stops within a
mile. A new how-to, docs/operations/how-to/update-stop-data.md, records that check and says how
to refresh the data with pnpm stops before next year's week. The data is now written compact,
which saves a phone about 9 KB the first time someone searches.

Lighter first visits on phones

The home page's photo was the biggest cost: phones downloaded a 113 KB, 1,200-pixel photo and then
showed only its middle, because the hero is a tall frame. Phones held upright now get just that
middle as its own AVIF image, 32 KB, with the same framing and about the same sharpness. Every
other photo also comes in AVIF, with WebP as the fallback, and in more sizes so phones can pick a
closer fit.

Fonts were the other cost on every page, about 45 KB. Each font is now split so a page downloads
only the plain English letters and punctuation the site uses; accented letters load only on a page
that shows one. Public Sans, which never actually showed but was saved for offline use on every
phone, is removed. Nothing looks different; screenshots of the home page on four phone sizes and a
laptop match before and after.

First visit on a Galaxy A15-sized phone, as Chrome's developer tools count it (which includes the
response headers of every file):

Page Before After
Home 208.5 KB 106.8 KB
Take part 102.7 KB 76.6 KB
Giveaway 143.6 KB 98.0 KB
Bingo 90.8 KB 75.8 KB
My week 83.4 KB 68.4 KB
Go 78.6 KB 63.5 KB
Sign up 76.6 KB 61.4 KB
Partners 75.1 KB 59.9 KB
A rider guide 73.5 KB 58.3 KB

The home page is the one page still over 100 KB by that count. Its files themselves are 99 KB; the
rest is headers. Getting further without changing how it looks would mean cutting the shared
stylesheet or the photos below the fold, which is left for later. The offline copy each phone saves
in the background also shrank, from 256 KB to 225 KB, and still holds every rider guide, Go with
its stop data, and Bingo.

What Lighthouse and the accessibility check found

Lighthouse on a phone scored every main page 100 for accessibility, best practices and SEO on the
preview, apart from My week, which asks search engines not to list it on purpose. Along the way it
and an axe check of every page in both color modes found four real problems, now fixed: faint
numbers in the Bingo card's corners, banner previews on Partners that turned dark-on-dark in dark
mode, an embed code block on Partners that a keyboard could not scroll, and a sitemap that listed
pages marked not to be indexed.

Before this reaches lvwwd.org

The deploy workflow has been failing on main because the production environment has no Cloudflare
deploy token, so merging does not update lvwwd.org. A maintainer needs to run
pnpm bootstrap --production, or deploy by hand, for these changes to go live.

On lvwwd.org itself, Lighthouse's best-practices score is 92, because Cloudflare injects its Web
Analytics script into every page and the Content Security Policy blocks it. The analytics pull
request allows that script; until it lands, turning off automatic Web Analytics setup for the zone
in the Cloudflare dashboard clears the error.

Follow-ups

  • Someone checks the Game Day Express page again in the week before October 4, in case RTC changes
    the schedule.
  • The home page gets under 100 KB with its headers counted, by trimming unused shared styles.

🤖 Generated with Claude Code

WillieCubed and others added 7 commits September 23, 2026 19:11
Find a bus reads its stops from files made from RTC's GTFS feed. The
feed RTC serves today is still "August 2026_20260730", valid until
August 21, 2027, and the rebuilt files hold the same 3,785 stops.
They are now written compact, as the build script makes them, instead
of pretty printed: a phone saves about 9 KB on the first search, and
the offline copy shrinks by the same amount.

The build script no longer falls back to a folder on one machine.
`pnpm stops` downloads the current feed, and --source still reads a
local copy. A new how-to records where the data comes from, the date
and result of the last check, including the first stop for each of
the seven places, and how to refresh it before next year's week.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every route number and stop name in the seven destinations was
checked against RTC's current GTFS feed, and the Game Day Express
details and the BHX-A label against rtcsnv.com, on September 23.
What RTC does not say is gone rather than guessed:

- Downtown: RED LINE, CX, 206, 207 and 208 pass through Bonneville
  Transit Center rather than ending there, so the step now says
  "stops at", and lists DVX and 401 too, as RTC's BHX map does.
- The Deuce: RTC charges visitors its Strip fare, but its fares page
  does not say residents must pay it, so the step says the Deuce can
  cost more rather than that it has its own fare.
- Game Day Express: RTC sells a $4 round trip, with cash accepted on
  board, not $2 each way; buses run 10:30 am to 12:30 pm for the
  1:25 pm kickoff, not from 9:30; M Resort is West Henderson; and the
  30-minute frequency is not on RTC's page, so it is left out.
- Craig Ranch Regional Park: the map buttons now end at the park
  point every other part of the site uses.

The destinations and the finder's places now live in one module that
the page and the tests share, and the steps' links to guides render as
plain links rather than injected HTML. Unit tests hold the map-link
builder to its exact output, check that the browser copy matches it,
and check the rules the steps follow: three steps, no stairs, "walk
or roll", a wheelchair note wherever a step crosses a bridge, and
only routes that exist in the stop data. End-to-end tests open every
destination by its address, compare every map button with the
builder, and pick each finder place. A unit test also keeps every
rider guide, Go and Bingo in the offline precache.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The home hero was the heaviest file on the site: a phone downloaded
the 1,200-pixel WebP, 113 KB, and then showed only its middle, since
the hero fills a tall frame. Phones held upright now get that middle
as its own 720-pixel crop, 32 KB in AVIF, with the same framing and
about the same sharpness. Every photo also comes in AVIF, which nearly
every phone shows, with the WebP kept as the fallback, and the bus
photos gain 320 and 640-pixel sizes so a phone can pick a closer fit.

`pnpm photos` makes every size from the largest WebP of each photo,
so replacing a photo stays one file and one entry in the photo list.
An end-to-end test checks that the photos a phone downloads are AVIF
and no wider than its screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The three text fonts were about 45 KB on every first visit, most of
it accented letters and symbols the site's own text never uses. Each
font is now split in two with unicode-range: a core file with plain
English letters, digits and the punctuation the site uses, and a rest
file the browser fetches only when a page shows one of its letters.
A first visit now downloads about 29 KB of fonts, and the text looks
the same. The preload points at the body font's core file.

Public Sans was only a fallback behind the Bingo card's display font
and never showed, yet the offline copy saved its 27 KB on every phone.
Bingo now falls back to the body font, and Public Sans is gone.

The whole fonts stay in src/fonts as the masters, and `pnpm fonts`
makes the split files and their @font-face rules from them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under each stop, the routes line is a wrapping flex row, and every
square, name and comma was its own item. The row's gap pushed each
comma away from the name before it ("207 Alta/Stewart , 215") and
the square away from its name. Each route is now one item with its
comma attached, so the line reads as a list and wraps between routes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lighthouse on phones and an axe check of every page in both color
schemes found four things, now fixed:

- The small numbers in the Bingo card's corners were 2.4:1 against
  the card. They now use the secondary text color, 4.5:1 or better.
- On Partners, the banner previews used a teal that turns dark in dark
  mode, leaving text at 1.1:1 on the dark slab, and a small line was
  4.2:1. Both now use the slab's own secondary text color, which reads
  in either mode and looks the same in light mode.
- The embed code on Partners scrolls sideways but could not be
  reached by keyboard. It can now take focus.
- The sitemap listed My week, Get my link and the offline page, which
  ask search engines not to list them. It now leaves them out.

An end-to-end test runs the organization's WCAG 2.2 AA check on every
page a visitor reaches from the menu or a guide, in light and dark
mode, after the sections that fade in have finished.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fare guide told riders the Deuce has its own higher-priced pass
and that it is the one to buy for a trip on the Strip. RTC's fares
page says every pass is valid on every route: the higher Strip fares
are what visitors pay, and a local pass works on the Deuce too. The
guide now says so, and that only a single ride bought on the Deuce
costs more.

The same page, checked on September 23, gives the fares the guide can
now state: $2 for a single ride, $3 for 2 hours, $5 for 24 hours, and
$20, $34 and $65 for 7, 15 and 30 days, with exact change for cash on
board. The guide uses them to show when a pass costs less than single
rides. It leaves out the Deuce's single-ride price, which RTC lists
as a visitor fare. The guide's closing notes record what was checked
and what is still left to confirm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@WillieCubed
WillieCubed force-pushed the feat/lvwwd-getting-around branch from 89f4ae9 to b561afe Compare September 24, 2026 02:13
@WillieCubed
WillieCubed merged commit 94f15ce into main Sep 24, 2026
1 check passed
@WillieCubed
WillieCubed deleted the feat/lvwwd-getting-around branch September 28, 2026 03:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant