v0.3.0
Released: 2026-06-07
Changes since v0.2.0 (61d00bd..e924858).
Features
-
Wikilinks and backlinks (PR #62 by @HugoluizMTB):
[[Note Title]]syntax renders as a link to the matching note, and each note shows the other notes that link to it. -
Fish shell support (PR #70 by @rafaeloledo): The
fed/fed-update/fed-stophelpers are now available for fish in~/.config/frankmd/fed.fish, with full parity to the bash version (browser detection, env-var forwarding, images-mount lookup). -
Custom Hugo frontmatter template (closes #69): Drop a
.hugo_template.mdfile at the notes root to fully customize the generated frontmatter. Placeholders{{title}},{{slug}}, and{{date}}are substituted on each new post. Falls back to the built-in template when absent. -
Hugo flat path style: New
hugo_path_style = flatconfig option to keep all posts asslug.mdin the current folder instead of the nestedYYYY/MM/DD/slug/index.mdstructure. -
Configurable Thruster ports (PR #43 by @rafaself):
THRUSTER_TARGET_PORTandEXTERNAL_PORTare honored by the Docker entrypoint and compose setup. -
Copy button on code blocks in preview mode.
-
AI-assisted contributions guide: New
AGENTS.mdandCLAUDE.mddocumenting the architecture, conventions, and rules for AI-assisted work in this repo.
Bug Fixes
-
macOS browser auto-detection (PR #89, fixes #86 reported by @matheus-rodrigues00):
fednow also looks up.appbundles under/Applications/on macOS in the same priority order as the Linux PATH probe.FRANKMD_BROWSERalso accepts a full executable path. -
Saving failed (422) over Cloudflare Tunnel (fixes #63 reported by @davidvidmar): Rails'
forgery_protection_origin_checkcompared the browser'shttps://Origin against thehttp://base URL it computed behind the SSL-terminating proxy, rejecting every save even though the CSRF token was present and valid. Disabled the origin check in production; the CSRF token itself still protects writes. -
Hugo template emitted a stray hyphen (fixes #69): The generated frontmatter had
tags:followed by a bare-, a null YAML list entry that breaks Hugo. Now emits the valid empty listtags: []. -
Broken symlinks in notes directory caused 500: A dangling symlink (e.g. a file linked to a path that doesn't exist inside the container) made
NotesService#build_treeraiseErrno::ENOENTfromFile.mtime, taking down every page that listed the tree. Filter children throughexist?so a single broken link no longer takes the whole site down. -
Image and asset files in notes directory not served in preview: Preview now reads image and asset files alongside markdown.
-
Occurrence highlighting confusing with multi-selection.
-
Active line highlight persisting when editor loses focus.
-
Ollama models failing with ModelNotFoundError.
-
Folder images appearing grayed out and unselectable in image picker.
-
Controller
configaction overrode Rails internals: Renamed to avoid the collision. -
Omarchy README links fixed (PR #45 by @matheusdcunha).
Refactor
- Image generation moved to RubyLLM + OpenRouter: Replaced direct Gemini HTTP calls with RubyLLM through OpenRouter for image generation, with a small monkey-patch to surface the OpenRouter response shape.
Security
- Cleared transitive CVEs for
addressable(ReDoS),erb(deserialization guard bypass),faradayandfaraday-net_http(protocol-relative URI host-scoping bypass), andnet-imap(SCRAM iteration DoS, STARTTLS stripping, command-injection via raw / Symbol arguments). All bumped to patched versions.
Dependencies
- Rails 8.1.3
- puma 7.2.0 -> 8.0.2 (with an explicit
bind "tcp://0.0.0.0:..."inconfig/puma.rbso Thruster and Docker keep working regardless of puma 8's IPv6-by-default behavior) - ruby_llm 1.14.1 -> 1.15.0
- thruster 0.1.20 -> 0.1.21
- aws-sdk-s3 1.218.0 -> 1.225.0
- bootsnap 1.23.0 -> 1.24.6
- jbuilder 2.14.1 -> 2.15.1
- propshaft 1.3.1 -> 1.3.2
- selenium-webdriver 4.41.0 -> 4.44.0
- addressable 2.8.9 -> 2.9.0, erb 6.0.2 -> 6.0.4, faraday 2.14.1 -> 2.14.2, faraday-net_http 3.4.2 -> 3.4.4, net-imap 0.6.3 -> 0.6.4 (transitive, security)
Infrastructure
bin/deployscript for one-command production deploys (build + push + restart)..lobster/agent artifacts gitignored.
Test Coverage
- 449 Ruby tests, 1,393 JavaScript tests (1,842 total)