v1.0.0
Released: 2026-09-07
The first stable release of FrankMD — a filesystem-only, database-free Markdown notebook. After a long 0.x run hardening the editor, the upload paths, i18n, theming, vim mode, and the security surface, the app is stable enough to call 1.0.
This release also ships the image-picker features from the community QA round (@francis-sousa), plus a hover bug fix.
Features
- Custom S3-compatible endpoints (#158): point image/video uploads at a self-hosted S3 service (MinIO, SeaweedFS, …) instead of AWS. Two new config keys —
aws_s3_endpointandaws_s3_force_path_style(both with ENV fallbacks, documented in the generated.fedand the README). S3 client construction is now centralized so all four upload paths (image, video, external, AI) share one endpoint-aware client and URL builder. - Pagination in the Local and Folder tabs (#159): the image picker is no longer capped at the 10 most recent images. Each tab gets a per-page selector (10/25/50) and prev/next arrows — the Local tab pages on the server (
GET /imagesnow returns{ images, total, limit, offset }), the Folder tab pages client-side. - Delete local images (#160): a hover-revealed trash button on each Local-tab thumbnail, with a confirm step, removes unwanted images.
DELETE /images/file/*pathis auth-gated, CSRF-protected, and confined to the images directory viaPathSafety— only existing, allow-listed image files can be deleted (traversal and non-image paths delete nothing). Local files only; S3 objects are out of scope.
Fixes
- Image grid hover no longer spawns scrollbars (#161): the thumbnail hover used
transform: scale()inside a scrollable grid, which overflowed the container on edge items and caused a flickering reflow. Replaced with an inset-ring affordance that doesn't change the box size.
Internationalization
- New image-picker strings (pagination + delete) added across all seven locales (en, es, he, ja, ko, pt-BR, pt-PT).
Test Coverage
- 864 Ruby tests, 1,616 JavaScript tests (2,480 total).