Add public changelog with Atom feed and What's New indicator
- Changelog entries authored as markdown files in apps/journal/changelog/ with YAML frontmatter, loaded via Vite import.meta.glob at build time - /changelog list page with date, title, and preview - /changelog/:slug detail page with full markdown rendering (react-markdown) and Open Graph meta tags for social sharing - /changelog/feed.xml Atom feed with auto-discovery <link> tags - "What's New" dot on nav bar using localStorage timestamp tracking - Notification toggle: users can permanently disable/re-enable the indicator - i18n strings for en and de - Initial changelog entry covering the Phase 1 launch Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
8a076f8c4b
commit
18e68bb176
16 changed files with 1109 additions and 25 deletions
|
|
@ -16,7 +16,7 @@ produces shareable social links.
|
|||
|
||||
**Non-Goals:**
|
||||
- CMS or admin interface for writing entries
|
||||
- RSS feed (future, not now)
|
||||
- RSS/Atom feed for subscribing to updates
|
||||
- Email notifications for new entries
|
||||
- Per-entry images or rich media (just markdown text)
|
||||
- Bilingual entries (English only for now)
|
||||
|
|
@ -50,11 +50,30 @@ Store `changelog:lastSeen` timestamp in localStorage. If the newest entry's
|
|||
date is after this timestamp, show a dot on the nav "Changelog" link. Clicking
|
||||
the changelog page updates the timestamp. No server state needed.
|
||||
|
||||
Users can permanently disable the "What's New" indicator by setting
|
||||
`changelog:disabled` in localStorage. A "Don't show again" option is available
|
||||
on the changelog page. When disabled, the dot never appears regardless of new
|
||||
entries. The setting can be re-enabled from the changelog page itself via a
|
||||
"Show new entry notifications" toggle. All client-side, no auth required.
|
||||
|
||||
### D4: Open Graph meta for social sharing
|
||||
|
||||
Each `/changelog/:date` page sets `og:title`, `og:description` (first
|
||||
paragraph), and `og:url`. No og:image for now — text previews are fine.
|
||||
|
||||
### D5: RSS/Atom feed at `/changelog/feed.xml`
|
||||
|
||||
A standard Atom feed at `/changelog/feed.xml` so users and tools can subscribe.
|
||||
Generated server-side from the same changelog entries used by the HTML pages.
|
||||
Each `<entry>` includes the title, date, full markdown content rendered as HTML,
|
||||
and a link to the individual changelog page.
|
||||
|
||||
The feed URL is advertised via a `<link rel="alternate" type="application/atom+xml">`
|
||||
tag in the `<head>` of the changelog pages, so feed readers auto-discover it.
|
||||
|
||||
Atom over RSS 2.0 because Atom has a proper spec (RFC 4287), required dates,
|
||||
and better content handling. All major feed readers support both.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- **Build-time loading means deploy to publish** → Acceptable. We deploy on
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ project is alive and improving), and social followers (shareable updates).
|
|||
|
||||
### New Capabilities
|
||||
|
||||
- `changelog`: Public changelog with dated entries, shareable individual pages with OG tags, "what's new" indicator
|
||||
- `changelog`: Public changelog with dated entries, shareable individual pages with OG tags, "what's new" indicator, RSS/Atom feed
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
|
|
@ -30,8 +30,8 @@ project is alive and improving), and social followers (shareable updates).
|
|||
|
||||
## Impact
|
||||
|
||||
- **Files**: New routes (`/changelog`, `/changelog/:slug`), markdown entry files
|
||||
in `docs/changelog/` or `apps/journal/changelog/`, nav bar update
|
||||
- **Files**: New routes (`/changelog`, `/changelog/:slug`, `/changelog/feed.xml`),
|
||||
markdown entry files in `apps/journal/changelog/`, nav bar update
|
||||
- **Dependencies**: A markdown renderer (could reuse `react-markdown` or render
|
||||
at build time)
|
||||
- **i18n**: Changelog entries written in English (primary audience), German
|
||||
|
|
|
|||
|
|
@ -35,3 +35,24 @@ The system SHALL show a visual indicator when there are changelog entries the us
|
|||
#### Scenario: Indicator dismissed
|
||||
- **WHEN** a user visits the /changelog page
|
||||
- **THEN** the indicator is dismissed (localStorage timestamp updated)
|
||||
|
||||
#### Scenario: Permanently disable indicator
|
||||
- **WHEN** a user clicks "Don't show again" on the changelog page
|
||||
- **THEN** `changelog:disabled` is set in localStorage
|
||||
- **AND** the "What's New" dot no longer appears for any future entries
|
||||
|
||||
#### Scenario: Re-enable indicator
|
||||
- **WHEN** a user toggles "Show new entry notifications" on the changelog page
|
||||
- **THEN** `changelog:disabled` is removed from localStorage
|
||||
- **AND** the indicator resumes normal behavior
|
||||
|
||||
### Requirement: RSS/Atom feed
|
||||
The system SHALL provide an Atom feed at `/changelog/feed.xml` for subscribing to changelog updates.
|
||||
|
||||
#### Scenario: Subscribe to feed
|
||||
- **WHEN** a feed reader requests `/changelog/feed.xml`
|
||||
- **THEN** it receives a valid Atom feed with all changelog entries including title, date, content, and link
|
||||
|
||||
#### Scenario: Feed auto-discovery
|
||||
- **WHEN** a browser or feed reader visits any `/changelog` page
|
||||
- **THEN** a `<link rel="alternate" type="application/atom+xml">` tag in the page head points to the feed URL
|
||||
|
|
|
|||
|
|
@ -1,29 +1,41 @@
|
|||
## 1. Changelog Data Layer
|
||||
|
||||
- [ ] 1.1 Create `apps/journal/changelog/` directory with a sample entry (`2026-03-25.md`) covering the initial launch
|
||||
- [ ] 1.2 Set up Vite `import.meta.glob` to load all `.md` files from the changelog directory with frontmatter parsing
|
||||
- [ ] 1.3 Create `apps/journal/app/lib/changelog.server.ts` with functions: getAllEntries(), getEntry(date) returning parsed markdown + frontmatter
|
||||
- [x] 1.1 Create `apps/journal/changelog/` directory with a sample entry (`2026-03-25.md`) covering the initial launch
|
||||
- [x] 1.2 Set up Vite `import.meta.glob` to load all `.md` files from the changelog directory with frontmatter parsing
|
||||
- [x] 1.3 Create `apps/journal/app/lib/changelog.server.ts` with functions: getAllEntries(), getEntry(date) returning parsed markdown + frontmatter
|
||||
|
||||
## 2. Routes
|
||||
|
||||
- [ ] 2.1 Add `/changelog` route showing all entries (date, title, preview) newest-first
|
||||
- [ ] 2.2 Add `/changelog/:date` route rendering full markdown entry
|
||||
- [ ] 2.3 Add Open Graph meta tags on entry pages (og:title, og:description, og:url)
|
||||
- [ ] 2.4 Add both routes to `routes.ts`
|
||||
- [x] 2.1 Add `/changelog` route showing all entries (date, title, preview) newest-first
|
||||
- [x] 2.2 Add `/changelog/:date` route rendering full markdown entry
|
||||
- [x] 2.3 Add Open Graph meta tags on entry pages (og:title, og:description, og:url)
|
||||
- [x] 2.4 Add both routes to `routes.ts`
|
||||
|
||||
## 3. What's New Indicator
|
||||
## 3. RSS/Atom Feed
|
||||
|
||||
- [ ] 3.1 Add "Changelog" link to Journal nav bar
|
||||
- [ ] 3.2 Track `changelog:lastSeen` in localStorage, show dot when newest entry is newer
|
||||
- [ ] 3.3 Clear indicator when user visits /changelog
|
||||
- [x] 3.1 Add `/changelog/feed.xml` route that returns an Atom feed (application/atom+xml) with all entries
|
||||
- [x] 3.2 Add `<link rel="alternate" type="application/atom+xml">` to changelog page heads for feed auto-discovery
|
||||
|
||||
## 4. Content
|
||||
## 4. What's New Indicator
|
||||
|
||||
- [ ] 4.1 Write initial changelog entry for the launch (features shipped in Phase 1)
|
||||
- [ ] 4.2 Add markdown rendering (react-markdown or built-in) for entry content
|
||||
- [x] 4.1 Add "Changelog" link to Journal nav bar
|
||||
- [x] 4.2 Track `changelog:lastSeen` in localStorage, show dot when newest entry is newer
|
||||
- [x] 4.3 Clear indicator when user visits /changelog
|
||||
- [x] 4.4 Add "Don't show again" option on changelog page that sets `changelog:disabled` in localStorage
|
||||
- [x] 4.5 Add "Show new entry notifications" toggle on changelog page to re-enable the indicator
|
||||
- [x] 4.6 Skip indicator check when `changelog:disabled` is set
|
||||
|
||||
## 5. Verify
|
||||
## 5. Content
|
||||
|
||||
- [ ] 5.1 Verify /changelog lists entries correctly
|
||||
- [ ] 5.2 Verify /changelog/:date renders full entry with OG tags
|
||||
- [ ] 5.3 Verify "What's New" dot appears and dismisses
|
||||
- [x] 5.1 Write initial changelog entry for the launch (features shipped in Phase 1)
|
||||
- [x] 5.2 Add markdown rendering (react-markdown or built-in) for entry content
|
||||
|
||||
## 6. Verify
|
||||
|
||||
- [x] 6.1 Verify /changelog lists entries correctly
|
||||
- [x] 6.2 Verify /changelog/:date renders full entry with OG tags
|
||||
- [x] 6.3 Verify "What's New" dot appears and dismisses
|
||||
- [x] 6.6 Verify "Don't show again" disables indicator permanently
|
||||
- [x] 6.7 Verify re-enabling notifications restores indicator behavior
|
||||
- [x] 6.4 Verify /changelog/feed.xml returns valid Atom feed
|
||||
- [x] 6.5 Verify feed auto-discovery link is present in page source
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue