Skip to content

Commit 1df56f8

Browse files
committed
chore: release v3.1.0
Update AppVersion to v3.1.0, write comprehensive CHANGELOG entry covering 98 commits since v2.3.1, remove stale size claims from README.
1 parent 24be1ca commit 1df56f8

3 files changed

Lines changed: 117 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,121 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
---
1111

12+
## [3.1.0] - 2026-02-12
13+
14+
MarkGo reimagined as a blogging companion app. SPA navigation, installable PWA, mobile-native UX, quick capture, offline compose. Single binary with embedded web assets — no filesystem setup required.
15+
16+
### Added
17+
18+
**SPA & Navigation**
19+
- App shell router with instant content swaps (Turbo Drive pattern — fetch HTML, DOMParser, swap `<main>`)
20+
- Prefetch on hover (65ms delay, 5-entry cache, 30s TTL)
21+
- CSS-only progress bar with prefers-reduced-motion support
22+
- History management with redirect detection and same-page guard
23+
24+
**PWA & Offline**
25+
- Service Worker with 3-tier caching: precache (offline.html), stale-while-revalidate (static), network-first (HTML)
26+
- Installable PWA with dynamic web manifest generated from config
27+
- Offline compose queue via IndexedDB with auto-sync on reconnect
28+
- Install prompt with visit count threshold and 30-day dismiss
29+
30+
**Mobile-Native UX**
31+
- Bottom navigation (5-item tab bar, hidden on desktop)
32+
- Full-screen search overlay (mobile) / centered modal (desktop, Cmd/Ctrl+K)
33+
- Visual viewport handling for iOS keyboards
34+
- Dynamic theme-color meta tag from computed background
35+
36+
**Quick Capture**
37+
- Floating action button (FAB) with compose sheet overlay
38+
- Quick publish API (POST /compose/quick → JSON response)
39+
- Auto-save drafts to localStorage with 2s debounce and recovery
40+
- Optimistic feed update (prepend card on publish)
41+
- Keyboard shortcut: Cmd/Ctrl+N
42+
43+
**Compose & Editing**
44+
- Article editing with CSRF protection and atomic file writes (temp+rename)
45+
- Server-side markdown preview with live toggle
46+
- Image upload with drag-and-drop and content type detection
47+
- Draft management page with edit links
48+
- Description and categories in compose form
49+
50+
**Accessibility**
51+
- Skip-to-content link
52+
- SPA route announcer (`aria-live="polite"`)
53+
- Screen reader labels on all form inputs
54+
- Color theme picker with `role="radiogroup"` semantics
55+
- Focus management after content swaps
56+
57+
**Frontend Architecture**
58+
- ES modules: app.js entry + 9 shell modules + 4 page modules (replaces 590-line IIFE)
59+
- Self-hosted fonts and highlight.js (zero CDN dependencies)
60+
- Design token system in CSS custom properties (all colors, spacing, typography)
61+
- Theme popover: Light/Dark/Auto mode + 5 color presets
62+
- Toast notification system
63+
64+
**About Page**
65+
- Config-driven unified about page (avatar, tagline, bio, location, 5 social platforms)
66+
- Bio from `articles/about.md` or `ABOUT_BIO` config
67+
- Contact: mailto link (email only) or SMTP form
68+
- `/contact` → 301 redirect to `/about#contact`
69+
70+
**Backend**
71+
- Go embed: templates and static assets compiled into binary
72+
- Filesystem-first fallback: override embedded assets with `STATIC_PATH`/`TEMPLATES_PATH`
73+
- Session-based authentication replacing BasicAuth
74+
- Typed error system replacing string comparison
75+
- Feed service extracted from handlers
76+
- 11 focused handler types (from 2 monolithic handlers)
77+
78+
**CLI**
79+
- `markgo new --type thought` and `markgo new --type link` quick-post commands
80+
81+
### Changed
82+
83+
- `/articles` renamed to `/writing` throughout
84+
- Content types (article/thought/link) inferred automatically from frontmatter
85+
- Feed page replaces homepage with type-specific card templates
86+
- All CSS converted to mobile-first (320px base → 481px → 769px → 1025px)
87+
- Admin CSS converted from max-width to min-width breakpoints
88+
- All `innerHTML` replaced with DOM API (DOMParser, createElementNS)
89+
- Pagination centralized with page clamping
90+
- SEO URLs: `/article/``/articles/` in sitemap and schema
91+
92+
### Removed
93+
94+
- **Export command**`markgo export` and static site generation removed (MarkGo requires a backend)
95+
- **Deploy workflow**`.github/workflows/deploy.yml` deleted
96+
- **Giscus comments** — Third-party comment system removed; replaced with "Reply by email" link
97+
- **Handler-level cache** — obcache removed from handlers (article service cache remains)
98+
- **CDN dependencies** — All fonts and highlight.js self-hosted
99+
- **Analytics config** — Dead `ANALYTICS_*` fields removed
100+
- **Composed facade** — Replaced with direct handler routing
101+
- **~4,000 lines of legacy CSS** — Rebuilt on design tokens
102+
- **~1,000 lines of test bloat** — Mocks now return canned data
103+
104+
### Fixed
105+
106+
- Content negotiation: `Accept: */*` correctly returns HTML
107+
- CSRF token generation failure aborts 500 (prevents empty-token bypass)
108+
- Slug validation with length limits on URL params
109+
- Template parse errors include actual Go error detail
110+
- `NewPagination` guards against division by zero
111+
- Silent error swallowing replaced with structured logging
112+
- Race condition in cache counter increments (atomic ops)
113+
- Cache goroutine leak (cleanup via `stopCh` channel)
114+
115+
### Security
116+
117+
- CSRF double-submit cookie on all compose routes (SameSite=Strict, constant-time compare)
118+
- Slug regex prevents CRLF injection in redirects
119+
- Image upload validates content type via `http.DetectContentType`
120+
- Atomic file writes prevent partial content on disk
121+
- Rate limiting excludes static assets (prevents false positives)
122+
123+
**98 commits since v2.3.1**
124+
125+
---
126+
12127
## [2.3.1] - 2026-02-04
13128

14129
### Fixed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Or download a release from [GitHub Releases](https://github.com/vnykmshr/markgo/
3333

3434
**Your files, your control** — Articles are markdown files with YAML frontmatter. Edit in vim, version with git, back up however you like. The compose form writes files to disk — it's a convenience layer, not a lock-in.
3535

36-
**Zero dependencies** — Single Go binary with embedded web assets. No Node.js, no PHP, no database. `markgo init` creates only your content directory and config. Starts in under a second, runs on 30MB of RAM.
36+
**Zero dependencies** — Single Go binary with embedded web assets. No Node.js, no PHP, no database. `markgo init` creates only your content directory and config.
3737

3838
## Usage
3939

internal/constants/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package constants
44
// Application metadata
55
const (
66
AppName = "MarkGo"
7-
AppVersion = "v2.3.1"
7+
AppVersion = "v3.1.0"
88
)
99

1010
// Build-time variables injected via ldflags

0 commit comments

Comments
 (0)