Skip to content

Serve GitHub data from a build-time snapshot and add "Your Ideas" page - #165

Open
stephenglass wants to merge 3 commits into
backstage:mainfrom
stephenglass:contribfest-2026-upgrades
Open

stephenglass wants to merge 3 commits into
backstage:mainfrom
stephenglass:contribfest-2026-upgrades

Conversation

@stephenglass

@stephenglass stephenglass commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Why

Three goals for KubeCon NA 2026 (Salt Lake City, Nov 11):

  1. Keep the site working during the session. The site is a static export, so every visitor's browser called the GitHub API without authentication. At the venue the whole room shares one Wi-Fi IP, which gets 60 requests per hour (10 per minute for the search API used by Contrib Champs). When GitHub refused a request, the pages showed misleading text ("Issue not found…", "No pull requests found.").
  2. Show which curated issues are still free. Issues tagged contribfest often get picked up before the event. Curation stays manual; the site now shows honestly what's still available and, when little is left, points people to bringing their own idea.
  3. Help attendees turn their own ideas into contributions. A new page helps them shape an idea into a suggestion issue, BEP, or plugin proposal. It never writes the proposal for them.

What changed

GitHub data snapshot

  • scripts/fetch-github-data.mjs fetches curated issues and merged contribfest PRs with batched GraphQL queries (a few points per run) and writes public/data/*.json. The browser only loads those same-origin files.
  • CD runs it on every push, every hour, and on manual dispatch (use "Run workflow" for an immediate refresh during the session). Scheduled and manual runs skip the CI wait, since main has already passed CI.
  • A failed fetch fails the run, so Pages keeps serving the last good deploy.
  • Issues are looked up by number, not by label, so the page keeps working after the post-event label cleanup.
  • Mock issues for local development and demos: yarn fetch-data mocks/issues.example.json adds made-up issues alongside the real ones, and --no-github uses only mocks with no token needed. See docs/deployment.md.
  • Removed the unused fetch code, papaparse, and NEXT_PUBLIC_GITHUB_TOKEN (a NEXT_PUBLIC_ value would be exposed in the browser bundle).

Curated issues

  • New Availability column and filter: Available, Assigned, Has PR (links to the PR), Closed. The filter defaults to Available.
  • An issue counts as "Has PR" only when a PR would close it. Umbrella issues like community-plugins#2458 get many PRs that merely mention them.
  • When 3 or fewer issues are available for the current filters, a banner links to /ideas/.
  • "GitHub data updated X min ago" on the issues and Contrib Champs pages, and a clear error state if the data can't load.
  • Before the unlock date, the page now says when the list unlocks instead of "No issues found."

Your Ideas page (/ideas/)

  • Pick your path: a few questions that recommend a suggestion issue, BEP, plugin feature request, or new plugin proposal, linking to the real templates.
  • Need inspiration?: 12 topic areas, each with prompting questions and links to docs, code, and the most-upvoted open issues. Please review this list; it's a starting point.
  • Think it through: questions that follow the BEP template. Answers are the attendee's own words, saved only in their browser.
  • Use AI as a coach, not an author: five copyable prompts that ask an assistant to explain, search, or question, never to write the proposal, plus a summary of the Backstage AI Use Policy.
  • From idea to reality: next steps for after the event.
  • Also linked from the home page, the sidebar, and the issues page. Getting Started has an AI-policy card.

Event config and docs

  • Event settings now live in lib/event.ts. The unlock time and displayed dates use the venue's time zone instead of the visitor's.
  • New docs/organizer-runbook.md (kickoff, curation and reservation comment, health check, event day, after the event). docs/deployment.md no longer describes the old /contribfest subpath.

Heads-up on the curated list

The first snapshot run found that 60 of the 85 issues in public/issues.csv are already closed. Only 18 are available, and community-plugins#6118 doesn't exist as an issue. The list needs refreshing before Nov 11; the runbook's health check (/issues/?admin=true, Availability: All) shows what to swap out.

Testing

  • GITHUB_TOKEN=$(gh auth token) yarn fetch-data wrote 85 issues and 17 merged PRs.
  • yarn tsc --noEmit, yarn lint, and yarn build pass.
  • Served the static build locally. /issues/?admin=true and /contrib-champs/ make no requests to api.github.com, only to /data/*.json.
  • Checked the low-availability banner, the error state with the data file removed, and on /ideas/: path chooser, notes saving across reloads, light and dark mode.
  • Not yet tested in Actions. After merging, please run the CD workflow once by hand to confirm the fetch step and deploy work. The schedule only takes effect once this is on main.

🤖 Generated with Claude Code

The site is a static export, so every visitor's browser called the GitHub
API unauthenticated. At the venue everyone shares one Wi-Fi IP, which gets
60 requests per hour (10 per minute for search), so the issues and Contrib
Champs pages stopped working during the session.

- Add scripts/fetch-github-data.mjs, which fetches curated issues and
  merged contribfest PRs with one batched GraphQL query and writes
  public/data/*.json. The browser now only loads those same-origin files.
- Run the snapshot in CD on every push, every 15 minutes, and on manual
  dispatch. A failed fetch fails the run, so Pages keeps the last good site.
- Look issues up by number instead of by the contribfest label, so the
  page keeps working after the post-event label cleanup.
- Show an availability status per issue (available, assigned, has PR,
  closed), filter to available issues by default, and point people to
  /ideas/ when few are left.
- Add the /ideas/ page to help attendees shape their own ideas into
  suggestion issues, BEPs, or plugin proposals, with AI prompts that
  coach rather than write, and a summary of the Backstage AI Use Policy.
- Centralize event settings in lib/event.ts, pin the unlock time to the
  venue's timezone, and add an organizer runbook.
- Remove unused fetch code, papaparse, and the NEXT_PUBLIC_GITHUB_TOKEN
  setting, which would have exposed a token in the browser bundle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Stephen Glass <stephen@stephen.glass>
@stephenglass
stephenglass requested a review from awanlin as a code owner October 6, 2026 15:33
stephenglass and others added 2 commits October 6, 2026 11:34
Hourly is enough between events. During the session, hosts can run the
CD workflow manually for an immediate refresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Stephen Glass <stephen@stephen.glass>
Before an event the curated list is mostly closed issues, which makes the
issues page hard to build and demo. Mock JSON files passed on the command
line are now added alongside the real issues, and --no-github skips GitHub
so the script runs without a token.

- Mock entries only need repository, issueId, level, and title; availability,
  labels, assignees, and linkedPRs are optional with defaults.
- Invalid entries fail with the file and index of the problem.
- A mock with the same repo and issue number replaces the earlier entry, to
  simulate an issue being picked up.
- mocks/issues.example.json covers every availability state, level, and repo.
- Running with no arguments (what CD does) produces the same output as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Stephen Glass <stephen@stephen.glass>

This branch has not been deployed

No deployments
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