Add 8 proposed changes and old trails analysis
Proposed changes (all with proposal, design, specs, tasks): - app-navigation (9 tasks) — nav bars for both apps - planner-landing-page (7 tasks) — standalone landing page - planner-multiplayer-awareness (13 tasks) — participants, cursors, names - changelog (13 tasks) — public changelog with "what's new" - transactional-emails (15 tasks) — magic link + welcome emails - planner-features (18 tasks) — no-go areas, notes, recovery, rate limits - komoot-import (23 tasks) — Komoot tour import - route-features (37 tasks) — sharing, multi-day, spatial, photos Also adds docs/old-trails-analysis.md with feature analysis from the older trails project. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
57141cdfab
commit
c7c1c275df
55 changed files with 1704 additions and 0 deletions
2
openspec/changes/changelog/.openspec.yaml
Normal file
2
openspec/changes/changelog/.openspec.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
schema: spec-driven
|
||||
created: 2026-03-25
|
||||
65
openspec/changes/changelog/design.md
Normal file
65
openspec/changes/changelog/design.md
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
## Context
|
||||
|
||||
trails.cool ships features regularly but has no user-facing changelog. The
|
||||
project philosophy values transparency and simplicity. We need a changelog
|
||||
that's low-friction to write (just add a markdown file), works in-app, and
|
||||
produces shareable social links.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
- Zero-friction authoring: drop a `.md` file, deploy, done
|
||||
- Public page at `/changelog` listing all entries newest-first
|
||||
- Individual entry pages at `/changelog/:slug` with OG meta for social sharing
|
||||
- "What's New" indicator in nav for returning users
|
||||
- Works without JavaScript (SSR)
|
||||
|
||||
**Non-Goals:**
|
||||
- CMS or admin interface for writing entries
|
||||
- RSS feed (future, not now)
|
||||
- Email notifications for new entries
|
||||
- Per-entry images or rich media (just markdown text)
|
||||
- Bilingual entries (English only for now)
|
||||
|
||||
## Decisions
|
||||
|
||||
### D1: Markdown files in the repo, loaded at build time
|
||||
|
||||
Changelog entries live in `apps/journal/changelog/` as markdown files named
|
||||
by date: `2026-03-25.md`. Vite's `import.meta.glob` loads them at build time.
|
||||
No runtime file system access needed.
|
||||
|
||||
Each file has YAML frontmatter:
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: "Collaborative route planning goes live"
|
||||
date: 2026-03-25
|
||||
---
|
||||
```
|
||||
|
||||
### D2: Single route with dynamic slug
|
||||
|
||||
`/changelog` shows all entries. `/changelog/:date` shows a single entry.
|
||||
Both are one route file using an optional param or two route files. The list
|
||||
page shows titles + dates + first paragraph preview.
|
||||
|
||||
### D3: "What's New" via localStorage timestamp
|
||||
|
||||
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.
|
||||
|
||||
### 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.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- **Build-time loading means deploy to publish** → Acceptable. We deploy on
|
||||
every merge to main. Adding a changelog entry is: write file, PR, merge,
|
||||
deployed.
|
||||
- **No rich media** → Keeps it simple. Can add images later if needed.
|
||||
- **localStorage "what's new" doesn't sync across devices** → Fine for now.
|
||||
Server-side tracking would require auth and a DB table — overkill.
|
||||
38
openspec/changes/changelog/proposal.md
Normal file
38
openspec/changes/changelog/proposal.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
## Why
|
||||
|
||||
We ship features but nobody knows. There's no record of what changed, no way to
|
||||
share progress, and no way for users to discover new features. A changelog
|
||||
serves three audiences: existing users (what's new), potential users (the
|
||||
project is alive and improving), and social followers (shareable updates).
|
||||
|
||||
## What Changes
|
||||
|
||||
- Add a `/changelog` page in the Journal showing dated entries with feature
|
||||
descriptions
|
||||
- Changelog entries stored as markdown files in the repo (not a database) —
|
||||
low friction, version controlled, works with the PR workflow
|
||||
- Each entry renders as a standalone shareable page (`/changelog/2026-03-25`)
|
||||
with Open Graph meta tags for social previews
|
||||
- A "What's New" badge/dot on the nav bar when there are entries the user
|
||||
hasn't seen
|
||||
- The changelog is public (no auth required) — it's part of the product's
|
||||
public face
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `changelog`: Public changelog with dated entries, shareable individual pages with OG tags, "what's new" indicator
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
(None)
|
||||
|
||||
## Impact
|
||||
|
||||
- **Files**: New routes (`/changelog`, `/changelog/:slug`), markdown entry files
|
||||
in `docs/changelog/` or `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
|
||||
later if needed
|
||||
37
openspec/changes/changelog/specs/changelog/spec.md
Normal file
37
openspec/changes/changelog/specs/changelog/spec.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
## ADDED Requirements
|
||||
|
||||
### Requirement: Changelog listing page
|
||||
The system SHALL provide a public `/changelog` page showing all entries newest-first.
|
||||
|
||||
#### Scenario: View changelog
|
||||
- **WHEN** a user visits `/changelog`
|
||||
- **THEN** all changelog entries are listed with date, title, and preview text
|
||||
|
||||
### Requirement: Individual entry pages
|
||||
Each changelog entry SHALL have a shareable page at `/changelog/:date`.
|
||||
|
||||
#### Scenario: View single entry
|
||||
- **WHEN** a user visits `/changelog/2026-03-25`
|
||||
- **THEN** the full markdown content of that entry is rendered
|
||||
|
||||
#### Scenario: Social sharing meta
|
||||
- **WHEN** a changelog entry page is loaded
|
||||
- **THEN** Open Graph meta tags are set (og:title, og:description, og:url)
|
||||
|
||||
### Requirement: Markdown file authoring
|
||||
Changelog entries SHALL be authored as markdown files with YAML frontmatter in the repository.
|
||||
|
||||
#### Scenario: Add new entry
|
||||
- **WHEN** a developer adds a `.md` file to the changelog directory with date frontmatter
|
||||
- **THEN** it appears on the changelog page after the next deploy
|
||||
|
||||
### Requirement: What's New indicator
|
||||
The system SHALL show a visual indicator when there are changelog entries the user hasn't seen.
|
||||
|
||||
#### Scenario: New entry available
|
||||
- **WHEN** a user visits the app and a changelog entry is newer than their last visit to /changelog
|
||||
- **THEN** a dot or badge appears on the "Changelog" nav link
|
||||
|
||||
#### Scenario: Indicator dismissed
|
||||
- **WHEN** a user visits the /changelog page
|
||||
- **THEN** the indicator is dismissed (localStorage timestamp updated)
|
||||
29
openspec/changes/changelog/tasks.md
Normal file
29
openspec/changes/changelog/tasks.md
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
## 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
|
||||
|
||||
## 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`
|
||||
|
||||
## 3. What's New Indicator
|
||||
|
||||
- [ ] 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
|
||||
|
||||
## 4. Content
|
||||
|
||||
- [ ] 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
|
||||
|
||||
## 5. Verify
|
||||
|
||||
- [ ] 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue