/PROJECT BRIEF

Browser Extension / Platform

PDX Matchday

A Chrome toolbar extension for the next Portland Timbers match — countdown, venue, and TV or streaming details, plus a fan confidence poll. Independent fan project, and the first client of a larger matchday platform still being built.

What it is

PDX Matchday is a Manifest V3 Chrome extension. Click the toolbar icon for the next Timbers fixture: opponent, kickoff, venue, broadcast info, and a live countdown.

It is an independent fan project. It is not affiliated with the Portland Timbers or MLS, and it does not use club crest artwork.

Safari exists only as a local Xcode conversion script. There is no Safari App Store listing. Shared contracts mention Portland Thorns as planned; that team is not enabled in the extension.

Where it’s going

The product is not meant to stay a toolbar-only popup. Chrome remains the first and most important client. After that, the plan is a public web home for identity, methodology, match archive, and aggregate insights, with a native iOS app explicitly later — not in the current release.

The match utility is meant to grow past “next future kickoff”: state-aware cards (pre-match, live, final), useful notifications that stay off until the user opts in, and two independently configurable team contexts so supporters can follow Timbers, Thorns, or both. Thorns is still gated. Live scores, alerts, and a published web app are not in the extension people install today.

The next Chrome popup is in active design — moving quickly, not in the store yet. Color follows the next fixture: Timbers home green and gold at Providence Park, a cooler travel palette on the road, and a separate Thorns home/away system. Timbers and Thorns sit as peer contexts, with Thorns still marked coming soon. Next match, standings, and settings are first-class surfaces in that design. The published listing still ships the current toolbar UI. Canonical /v1 match and poll routes already exist on the Functions API; cutting the toolbar schedule over to that API is part of the same platform work, not a claim that it already drives the countdown.

0:00 / 0:00
Design preview of the next-generation PDX Matchday interface — state-aware cards, venue-adaptive palettes, and dual Timbers and Thorns club context switching.

How it works

The popup asks the service worker for match data. The worker resolves the next incomplete future match in three tiers: live ESPN schedule for MLS and Leagues Cup, then chrome.storage.local cache, then a bundled fallback fixture. An hourly chrome.alarms job refreshes the cache even when the popup is closed.

Permissions stay narrow: storage, alarms, and four hosts — ESPN’s public site API, Firebase Identity Toolkit, Secure Token, and the Matchday Cloud Functions API. No tabs, webRequest, geolocation, or broad host access.

Confidence poll

The popup includes a High / Medium / Low confidence poll and a community breakdown. Votes go through Firebase anonymous auth and a Node 22 Cloud Functions API on Firestore.

The API labels aggregates integrity_controlled: one accepted response per anonymous Firebase UID and poll, with version, window, body, identity, idempotency, and rate-limit checks. That is not a verified unique person.

How it’s built

The Chrome surface is Manifest V3 with a vanilla JavaScript popup and service worker. Shared Zod contracts and domain types, plus the compatibility API, are TypeScript in an npm workspace.

The backend is Firebase: anonymous auth from the extension, Cloud Functions in us-central1, and Firestore for poll state. GitHub Actions runs lint, typecheck, tests, and an extension ZIP on main. Store publish is not automated.

Privacy and security

Match data and local poll state live in extension storage on the device. Community polling uses a Firebase anonymous account, not a name or email.

The public package does not send passive product analytics. All extension JavaScript is bundled locally — no CDN scripts, no eval. Users can delete retained community responses and the anonymous identity from the popup.

Stack

  • Manifest V3
  • JavaScript
  • TypeScript
  • Firebase
  • Cloud Functions
  • GitHub Actions

Links

Back to Selected Work