Title Town PDX: 26 automatic updates, Oct 4 to Oct 19, 2026, each checked against the league
For Portland fans following the Fire, the Thorns and the Cascade.
Title Town PDX covers Portland's three pro women's teams for fans checking scores, rosters and how to get to the game. Every result makes yesterday's page wrong, so I stopped fixing pages by hand and built a site that corrects itself on a schedule, with checks that compare it to the league instead of to itself.
Visit Title Town PDX Read the story

8 months in In search since Mar 16, 2026; data through Oct 30, 2026
- First recorded version Mar 15, 2026
- Seen on Google Mar 16, 2026
- First 100-click month Apr 2026, 158 clicks
- Seen on Bing Apr 10, 2026
- First 1K-click month Jun 2026, 1.5K clicks
- Best month yet Jul 2026, 1.7K clicks
- Now, 8 months in Sep 2026, 290 Google and Bing clicks
- 2.6KBing AI citations in September 2026, about flat on August. The last complete month in Bing's export
- 1.7KGoogle and Bing clicks in July 2026, the most in any complete month
FTurn every lesson into a systemIts mascot: Glaceon
A Portland fan checking tonight's game on a phone
A Portland fan on a phone wants to know who plays tonight, where to watch, and whether the Fire are still in it. Three leagues, three venues, three schedules, and no single fan source covered the Fire (WNBA), the Thorns (NWSL) and the Cascade (AUSL) together. I grew up in Portland and follow all three teams from Austin now, so I built the source I wanted.
The catch is that sports facts expire. A roster page is right on Tuesday and wrong after Wednesday's signing. A "season underway" line is true in July and false the morning after elimination. So the job was keeping them true without retyping them every week.
The readers who need that most are the ones AI answers send. In Bing's export, the query cited most was "portland fire roster": 3.5K citations, and this site was the source in 37% of the answers that cited anyone. A roster has to be right the day someone asks.
The query and its share are from Bing Webmaster Tools' AI Performance export, window ending Oct 30, 2026. A real search, quoted as Bing recorded it.
One file holds every game, and a bot updates it twice a day
One canonical events file holds every game for all three teams, and every page derives from it: records, form strips, schedules, banners, calendar feeds and the structured data search engines read. Change the file and the whole site moves with it.
Results flow in from ESPN on a schedule, 2 runs a day, matched on the game's stable event ID. In the live test before it shipped, matching on dates caught 2 of 8 games, because ESPN stamps an evening Pacific game a day ahead in UTC. Matching on IDs caught 8 of 8. An evening run was added later so a finished game stops showing as "today" on the night people search for the score; the shift log further down shows when it actually lands.
Before anything ships
9 validation scripts and the unit tests run in the build
They check
Freshness, stale tense, roster parity, expired windows, results backfill, season phase
Proof they fire
3 scripts plant the defect and expect the check to fail
A separate heartbeat runs on the morning schedule and fails on any played game the file hasn't recorded. The site's pages for the reader:
Counted in the site's own build configuration and scripts, read Oct 13, 2026.
Bing AI citations peaked in July 2026
Bing AI citations about flat in September, down 5% on August. Bing's export records how often a Bing AI answer cited the site, month by month, through Oct 30, 2026.
Data through
- May 2026, what else happened: 1 search change
- June 2026, what else happened: 1 search change
- August 2026, what else happened: 1 search change
- September 2026, what else happened: 1 search change
May 2026: what else happened
- Google, : The May 2026 core update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
June 2026: what else happened
- Google, : The June 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
August 2026: what else happened
- Google, : The August 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
September 2026: what else happened
- Google, : The September 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
HI-SCORE the best month so far
| Month | Bing AI citations | Change from the month before |
|---|---|---|
| April | 935 | first month |
| May | 2K | up 116% |
| June | 4.9K | up 144% |
| July | 8.6K | up 75% |
| August | 2.8K | down 68% |
| September | 2.6K | down 5% |
Two roster pages did most of that work: /fire/roster/ drew 8.3K citations and /cascade/roster/ drew 3.6K in the export window. Those are the pages the sync keeps current.
Search clicks followed the calendar. Google and Bing together sent 1.7K clicks in July 2026, the most of any complete month, and 290 in September 2026. The Cascade's season ended on Jul 23, 2026 and the Fire's on Sep 22, 2026, and a fan site's traffic goes where the games go. The month-by-month chart below shows every month.
It keeps updating itself. On Oct 13, 2026 the homepage led with the Oct 3, 2026 result, Thorns 2, Boston Legacy 4, and from Oct 4 to Oct 19, 2026 it ran 26 scheduled updates on the schedule and checks I set: 12 results syncs and 14 daily rebuilds.
16 days, 26 scheduled commits: 4 of the days missing a run, from Oct 4 to Oct 19, 2026.
A commit by the bot: 26A day the run made no commit: 6
| Sun, Oct 4 | Results sync 3:47 a.m.; rebuild 10:43 a.m. |
|---|---|
| Mon, Oct 5 | Results sync 4:53 a.m.; rebuild 2:20 p.m. |
| Tue, Oct 6 | Results sync 4:33 a.m.; rebuild 11:57 a.m. |
| Wed, Oct 7 | Results sync 4:23 a.m.; rebuild 12:25 p.m. |
| Thu, Oct 8 | Results sync 4:39 a.m.; rebuild 12:19 p.m. |
| Fri, Oct 9 | Results sync 4:32 a.m.; rebuild 11:53 a.m. |
| Sat, Oct 10 | Results sync 3:50 a.m.; rebuild 10:55 a.m. |
| Sun, Oct 11 | Results sync 4:03 a.m.; rebuild 11:12 a.m. |
| Mon, Oct 12 | Results sync 5:30 a.m.; rebuild 2:47 p.m. |
| Tue, Oct 13 | Results sync 5:14 a.m.; rebuild 12:54 p.m. |
| Wed, Oct 14 | Results sync 2:48 a.m.; rebuild 11:04 a.m. |
| Thu, Oct 15 | Results sync 2:29 a.m.; rebuild 10:49 a.m. |
| Fri, Oct 16 | No results sync; rebuild 10:33 a.m. |
| Sat, Oct 17 | No results sync; rebuild 9:31 a.m. |
| Sun, Oct 18 | No results sync; no rebuild |
| Mon, Oct 19 | No results sync; no rebuild |
| All cells | 32 |
The log also caught something the green checks never would. The evening run, the one added so a finished game stops reading "today" on game night, is set for 05:00 UTC, which is 10 p.m. in Portland. On all 16 days GitHub started it 3.9 to 7.5 hours late, so its commit landed between 2:29 a.m. and 5:30 a.m. Pacific, the next morning instead of that night.
How I measured it. Bing AI citations: Bing Webmaster Tools' AI Performance export, a manual pull that stops at Oct 30, 2026. Search clicks: Google Search Console and Bing Webmaster Tools daily totals summed by complete month, through Oct 30, 2026. Commits and run times: GitHub's commits and Actions APIs for the site's repository, read Oct 20, 2026. None of this separates the season from anything changed on the site.
Clicks by month follow three teams' seasons
The Cascade's season ended on Jul 23, 2026 and the Fire's on Sep 22, 2026, so the drop after July follows the teams' calendar. The fair comparison is the same weeks of next season; this is the site's first.
- Best month on recordJuly1.7K search clicks
- Latest complete monthSeptember290 search clicks
Data through
- April 2026, what else happened: Fire offseason, Thorns in season, Cascade offseason
- May 2026, what else happened: Fire in season, Thorns in season, Cascade offseason; 1 search change
- June 2026, what else happened: Fire in season, Thorns on a break, Cascade in season; 1 search change
- July 2026, what else happened: Fire in season, Thorns in season, Cascade in season
- August 2026, what else happened: Fire in season, Thorns in season, Cascade offseason; 1 search change
- September 2026, what else happened: Fire in season, Thorns in season, Cascade offseason; 1 search change
April 2026: what else happened
- Fire. Offseason in April, before the WNBA season started May 8, 2026. Source: WNBA, 2026 schedule release (Jan 21, 2026), read .
- Thorns. In season all of April, until the World Cup break. Source: NWSL, the 2026 schedule (Jan 15, 2026), read .
- Cascade. Offseason in April, before the AUSL season started Jun 9, 2026. Source: MLB.com, the AUSL's 2026 cities and schedule (Jan 13, 2026), read .
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
May 2026: what else happened
- Fire. The WNBA season began May 8 and ran to Sep 24, 2026. Source: WNBA, 2026 schedule release (Jan 21, 2026), read .
- Thorns. In season all of May, until the World Cup break. Source: NWSL, the 2026 schedule (Jan 15, 2026), read .
- Cascade. Offseason in May, before the AUSL season started Jun 9, 2026. Source: MLB.com, the AUSL's 2026 cities and schedule (Jan 13, 2026), read .
- Google, : The May 2026 core update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
June 2026: what else happened
- Fire. In season all of June (May 8 to Sep 24, 2026). Source: WNBA, 2026 schedule release (Jan 21, 2026), read .
- Thorns. A break for most of June: no games until Jun 29. Source: NWSL, 2026 schedule footprint (Jul 2, 2025), read .
- Cascade. The AUSL season began Jun 9 and ran to Jul 20, 2026. Source: MLB.com, the AUSL's 2026 cities and schedule (Jan 13, 2026), read .
- Google, : The June 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
July 2026: what else happened
- Fire. In season all of July (May 8 to Sep 24, 2026). Source: WNBA, 2026 schedule release (Jan 21, 2026), read .
- Thorns. In season all of July (Jun 29 to Nov 1, 2026). Source: NWSL, 2026 schedule footprint (Jul 2, 2025), read .
- Cascade. The AUSL regular season ended Jul 20, after starting Jun 9, 2026. Source: MLB.com, the AUSL's 2026 cities and schedule (Jan 13, 2026), read .
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
August 2026: what else happened
- Fire. In season all of August (May 8 to Sep 24, 2026). Source: WNBA, 2026 schedule release (Jan 21, 2026), read .
- Thorns. In season all of August (Jun 29 to Nov 1, 2026). Source: NWSL, 2026 schedule footprint (Jul 2, 2025), read .
- Cascade. Offseason in August, after the AUSL regular season ended Jul 20, 2026. Source: MLB.com, the AUSL's 2026 cities and schedule (Jan 13, 2026), read .
- Google, : The August 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
September 2026: what else happened
- Fire. The WNBA regular season ended Sep 24, after starting May 8, 2026. Source: WNBA, 2026 schedule release (Jan 21, 2026), read .
- Thorns. In season all of September (Jun 29 to Nov 1, 2026). Source: NWSL, 2026 schedule footprint (Jul 2, 2025), read .
- Cascade. Offseason in September, after the AUSL regular season ended Jul 20, 2026. Source: MLB.com, the AUSL's 2026 cities and schedule (Jan 13, 2026), read .
- Google, : The September 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
HI-SCORE the best month so far
| Month | Search clicks | Change from the month before |
|---|---|---|
| April | 158 | first month |
| May | 502 | up 218% |
| June | 1.5K | up 195% |
| July | 1.7K | up 15% |
| August | 511 | down 70% |
| September | 290 | down 43% |
In Google's AI answers
AI Overview appearances down 13% in September, after a record August.
Data through
- August 2026, what else happened: 1 search change
- September 2026, what else happened: 1 search change
August 2026: what else happened
- Google, : The August 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
September 2026: what else happened
- Google, : The September 2026 spam update. Source: Google Search Status Dashboard; my sites' 14 days either side are on the log.
This is what else was going on that month. I list it for context; nothing here shows any of it moved my clicks.
HI-SCORE the best month so far
| Month | AI Overview and AI Mode appearances | Change from the month before |
|---|---|---|
| August | 3.5K | first month |
| September | 3K | down 13% |
The numbers, month by monthTitle Town PDX's search clicks and the changes I made, data through Oct 30, 2026
| Month | Changes made | Bing | |
|---|---|---|---|
| Apr 2026 | 46 | first month | first month |
| May 2026 | 21 | up 121% | up 342% |
| Jun 2026 | 2 | up 443% | up 34% |
| Jul 2026 | 23 | up 16% | up 13% |
| Aug 2026 | 17 | down 75% | down 56% |
| Sep 2026 | 6 | down 34% | down 56% |
content technical data other
Every miss passed a check
The misses were real, and each one passed a check at the time.
I shipped invented history
On April 14, 2026 I found that every season record on the original Fire history page was wrong, and that a coach who never coached the team was named on another page. Both were fixed that day. A made-up attendance figure went the same way in May 2026. These came from publishing before I verified.
Automation that reported success and did nothing
The daily rebuild had been a no-op from the day it shipped: a missing secret sent it down a skip branch that exited clean every morning, so "today" froze. I found it on August 2, 2026. On August 29, 2026 I found the cached league data judged its own age by file time, which every checkout resets, so one hub had served a table from April 5 for months.
A wrong score, live for weeks, with every check passing
A Cascade score posted on July 11, 2026 was wrong on the live site until August 8. The old check compared the site to its own ledger, and the ledger held the same wrong score. Arithmetic caught it: the season totals were off against the league's published standings. The Fire were eliminated on Aug 25, 2026 and nothing on the site said so until September 6, 2026; the hub still led with preseason copy. And the hand-written recaps stopped in May 2026 while the automation kept running, because recaps needed a person every game.
What changed
I changed what the checks compare against. Season totals are asserted against the league's own standings instead of my ledger. A season has a phase with a dated end, so "eliminated" retires itself after the last game instead of waiting for me. A check that hunts for pre-debut copy reads the player's own games-played count before it decides a phrase is stale. And automation has to prove it did something, not just exit clean. The Fire's hub now closes year one at 17-27, written the day the miss was found, and the checks keep it that way.
Dates are from the site's own commit history, read Oct 13, 2026; the Fire's record and elimination date from its live hub.
Where these numbers come from
- Decision
- Replace preseason copy with the completed season state.
- Visible proof
- The first screen says the inaugural season is complete and shows the final record.
- Limit
- A capture does not prove the season-phase check will keep running.
Captured at phone width on . The live page may have changed.
Check the current page
A different question from the same site: when a search already shows one of its pages, does it need another? Try the content-gap lesson with Title Town’s query rows.