Public
Remixed
Browse and share GitHub issues with one public link
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.

Issue Share

Browse GitHub issues across repositories selected during GitHub App installation, then create stable public issue snapshots with one click. Snapshots include the issue body, labels, assignees, milestone, comments, and—when selected—sub-issues.

GitHub App setup

Create a public GitHub App at https://github.com/settings/apps/new with these settings:

  • Homepage URL: the live URL for index.ts
  • Callback URL: <LIVE_URL>/auth/github/callback
  • Request user authorization (OAuth) during installation: optional
  • Repository permissions → Issues: Read-only
  • Repository permissions → Metadata: Read-only
  • Webhooks: disabled
  • Where can this GitHub App be installed?: Any account

After creating the app:

  1. Generate a client secret.
  2. Copy the app's Client ID (not App ID), client secret, and app slug.
  3. Add the environment variables below in Val Town.
  4. Generate a strong random SESSION_SECRET (at least 32 bytes).

Required environment variables:

  • GITHUB_CLIENT_ID
  • GITHUB_CLIENT_SECRET
  • GITHUB_APP_SLUG
  • SESSION_SECRET

Public-view feedback also requires a Cloudflare Turnstile widget restricted to the live *.val.run hostname:

  • TURNSTILE_SITE_KEY
  • TURNSTILE_SECRET_KEY

Security model

  • GitHub login uses OAuth state validation and PKCE.
  • GitHub tokens are AES-GCM encrypted at rest using SESSION_SECRET.
  • Session cookies are HttpOnly, Secure, and SameSite=Lax.
  • Public links use 96-bit random slugs and contain a stored snapshot, never a GitHub token.
  • Only repositories selected in each GitHub App installation are listed.
  • Creating a public link intentionally copies the selected private issue data into this Val's SQLite database.
  • Public-view feedback is private between its author and the view owner. Anonymous authors are associated through a signed browser cookie; raw IP addresses are never stored.
  • Every feedback submission is validated server-side with Cloudflare Turnstile and subject to keyed, privacy-preserving rate limits.

Routes

  • / — authenticated issue browser
  • /s/:slug — public issue snapshot
  • /auth/github — GitHub App OAuth login
  • /api/repos — installations and selected repositories
  • /api/repos/:owner/:repo/issues — issues grouped by selected repository
  • /api/shares — create a public snapshot
  • /api/public-view/:slug/comments — private viewer feedback
  • /api/view-comments — owner feedback inbox
  • /source — view and remix the Val

Notes

GitHub's REST Issues endpoints can include pull requests, so the app filters entries with a pull_request field. Issues, comments, repositories per installation, and sub-issues are fetched across GitHub's paginated responses.