Vynl
Documentation
·
v0.6.39·open beta
Search docs — installation, AI, Sonos…⌘ K
ReferenceLatest Version & Subscribe

Latest Version & Subscribe

5 MIN READLast updated: todayv0.6.36

The ask

Add a section to the vynl.music marketing site showing the latest released version, with a way for visitors to subscribe to new-release announcements. Sources:

What to display

Compact card with:

  • Current versionv0.6.34 (auto-fetched from GitHub releases API)
  • Released — relative time (5 days ago)
  • What's new — the first 2-3 bullets from the release body
  • Read changelog → links to /changelog (full release notes archive on vynl.music)
  • Subscribe → opens the subscribe modal (see below)

Visual: small card, brand purple accent, dragon icon top-left, version number large + monospace.

The /changelog page (new docs page)

Auto-rendered from the GitHub Releases API. Each release shows:

  • Tag, date, full markdown body
  • Docker pull command for that exact version
  • Link to commit diff vs the previous release

Use ISR or a daily cron rebuild — don't hit GitHub's API on every page view (rate limit pain).

How to subscribe — three paths, ordered by user effort

1. RSS / Atom feed (zero infra)

Add a small "RSS" link in the card and footer:

https://github.com/48Nauts-Operator/vynl-app/releases.atom

Power users love this. Drop it into their NetNewsWire / Feedly / Miniflux. Costs us nothing.

2. GitHub "Watch → Releases" (zero infra, leverages GitHub's email)

Deep-link the button to the repo's watch flow:

https://github.com/48Nauts-Operator/vynl-app/subscription

When users click "Custom → Releases → Save", GitHub emails them on every release. No backend needed on our side. Slight friction: requires a GitHub account.

3. Email signup (real infra, broadest reach)

For users who aren't on GitHub. Small form on the site:

[ email field             ] [ Subscribe ]
We'll send you one email per release. No marketing.

Backend options, recommended order:

Option Cost Setup Trade-offs
Resend + a GitHub Action Free tier 100/day, then $20/mo for 50K 1 hr Developer-friendly, programmatic API
Buttondown $9/mo 30 min Designed for newsletters, has unsubscribe + GDPR built-in
Brevo (SendinBlue) Free tier 300/day 1 hr Visual form builder, well-known in EU
Listmonk (self-hosted on cosmos) Free 2-3 hr Fits the self-hosted ethos; another container to maintain
Plausible-style "email-as-RSS" Free 30 min Use a service like Follow.it that converts the Atom feed to email. Truly zero-code

Recommended: Start with Follow.it (truly zero-code, just point at the Atom feed) → migrate to Resend + GitHub Action once we have >100 subscribers and want richer email content.

GitHub Action shape (for Resend path)

# .github/workflows/release-email.yml
name: Email subscribers on release
on:
  release:
    types: [published]
jobs:
  email:
    runs-on: ubuntu-latest
    steps:
      - name: Send email via Resend
        run: |
          curl -X POST https://api.resend.com/emails \
            -H "Authorization: Bearer ${{ secrets.RESEND_API_KEY }}" \
            -H "Content-Type: application/json" \
            -d @- <<EOF
          {
            "from": "Vynl Releases <[email protected]>",
            "to": ["[email protected]"],
            "subject": "Vynl ${{ github.event.release.tag_name }} is out",
            "html": "<h1>${{ github.event.release.name }}</h1>${{ github.event.release.body }}"
          }
          EOF

The subscribers list lives in Resend's audience. New subscriber form POSTs to a Vercel/Netlify function that calls Resend's /audiences/{id}/contacts endpoint.

Auto-update the displayed version

// Next.js page or component
async function getLatestRelease() {
  const res = await fetch(
    'https://api.github.com/repos/48Nauts-Operator/vynl-app/releases/latest',
    { next: { revalidate: 3600 } } // cache 1 hour
  );
  const data = await res.json();
  return {
    tag: data.tag_name,        // "v0.6.34"
    name: data.name,           // "Vynl 0.6.34"
    body: data.body,           // markdown
    published: data.published_at,
    url: data.html_url,
  };
}

ISR with 1-hour revalidation keeps the version display fresh without hammering GitHub's API. Cache the response if you have Redis or Vercel KV.

Rate-limit note

GitHub's REST API is 5,000 requests/hour authenticated, 60/hour unauthenticated. The version-display endpoint and the changelog renderer should both:

  • Use authenticated requests (set a GITHUB_TOKEN env var) when possible
  • Cache aggressively (1-24 hour ISR)
  • Fall back to a hardcoded last-known version if the API errors

Where to put the "subscribe" CTA

Three good spots, each different intent:

Position Purpose Conversion
Inside the "What's New" card "I want to know when there's news" Medium
Bottom of the changelog page "I read all this, want the next one too" Highest
Site footer (small text link) Discovery / completeness Low

Acceptance criteria

  • "What's New" card on hero shows current version + first 2-3 release bullets
  • /changelog page lists all releases with full body, paginated or virtualized
  • Atom feed prominently linked (in card + footer)
  • GitHub Watch button on the card
  • Email signup form (initial: Follow.it; v2: Resend + Action)
  • Version display refreshes within 1 hour of a new release
  • No rate-limit failures even at 10K visits/day
  • #46 In-app new-release notification system — the in-app counterpart. Notifies existing users; this issue is for prospective/new visitors. The two should share copy + visual treatment when possible
  • #69 Fix Docker semver tag never published — closed, but the fix is what makes "show version X" reliable here

Not in scope

  • Auto-deploy on new release (that's CI/CD, separate concern)
  • Beta channel separate from stable (could add later — Vynl's release cadence doesn't justify two channels yet)
  • Discord / Slack webhooks (deferrable; community channels don't exist yet)