Latest Version & Subscribe
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:
- GitHub releases: https://github.com/48Nauts-Operator/vynl-app/releases
- Actions: https://github.com/48Nauts-Operator/vynl-app/actions
- Built-in Atom feed (free, GitHub-hosted): https://github.com/48Nauts-Operator/vynl-app/releases.atom
What to display
The "What's New" card (recommended position: just below the hero, above the features grid)
Compact card with:
- Current version —
v0.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_TOKENenv 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
-
/changelogpage 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
Related Vynl-app tasks
- #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)
