Repository navigation
perf(site): Lighten pages and fix Go's directions and fares - #15
Merged
Merged
Conversation
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
force-pushed
the
feat/lvwwd-getting-around
branch
from
September 24, 2026 02:13
89f4ae9 to
b561afe
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
step now says "any route that stops at" it, and lists every route RTC's own map shows there.
only a single ride bought on it costs more, so the step says the Deuce "can cost more" and links
to the fare guide.
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.
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 howto refresh the data with
pnpm stopsbefore 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):
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
the schedule.
🤖 Generated with Claude Code