-
v0.2.0 Stable
released this
2026-06-25 20:14:38 +00:00 | 39 commits to main since this releaseAdded
<pubDate>in RSS feed items, derived from the post date.<lastmod>in sitemap entries for SEO.- In-memory rate limiting on the login endpoint: 10 attempts per 60 seconds per IP.
<language>element in the RSS feed channel.- Periodic cleanup of stale
login_attemptsentries to prevent unbounded memory growth. - Slug format validation (
[a-z0-9._-]) preventing path traversal and XSS in templates. - Username validation in
change_usernamematching the create-user regex. - Escape-on-output for slug and username in admin template attributes.
- Memoization of
Store#allwith mtime-based invalidation, eliminating N×read+parse
per request. - Atomic file writes (tmp + rename) for posts and
users.toml. - Post language directory routing: non-default-language posts now land in
content_dir/<lang>/instead of overwriting root-level files. - CLI test coverage (version, help, unknown command, option parsing, config bootstrap).
- Test coverage for RSS feed and sitemap endpoints.
- CORS preflight (
OPTIONS /api/volumen/*) so browsers can reach the JSON API. Users#allmemoization with mtime-based invalidation, matching Store#all.- Session invalidation: deleted users can no longer use existing session cookies.
- CSRF protection on
POST /admin/preview. - Symlink-safe containment in
Store#media_fileviaFile.realpath.
Added
- Scheduled publishing: a
publish_atfrontmatter field hides posts from the
public API and feeds until their publication date arrives. The admin form
includes a Publish at date picker. - JSON Feed:
GET /api/volumen/feed.jsonserves a jsonfeed.org v1.1 feed
withcontent_htmlanddate_publishedper item. - Fulltext search:
GET /api/volumen/posts?q=…filters posts by
case-insensitive match in title and body.
Changed
- Split
lib/volumen/server.rbintoapi_routes.rbandadmin_routes.rbmodules,
keeping the server class focused on configuration and shared helpers.
Fixed
admin.session_ttlwas defined but never read; it now controls
Rack::Session::Cookieexpiration viaexpire_after.- Derived post excerpts now strip HTML tags before stripping markdown markup,
avoiding raw HTML leaks in auto-generated excerpts. - Draft posts no longer leak through the public detail endpoint (
/api/volumen/posts/:slug). Config::DEFAULTSinner hashes are now frozen anddeep_mergebuilds fresh
copies, preventing mutation from silently poisoning laterConfig.loadcalls.- A warning is emitted when
admin.session_keyis configured but shorter than
64 bytes, instead of silently falling back to a random secret.
Downloads