Releases: BobWs/flatnotes-enhanced
Release list
v1.9.0: Customisable Date Formatting – Locale & Style
New Feature: Customisable Date Formatting
You can now choose how dates are displayed throughout the app – perfect for users who prefer a specific language or date format.
What you can customise:
| Setting | Options |
|---|---|
| Locale | System default, Dutch (nl), English (GB), English (US), German (de), French (fr), Spanish (es), Italian (it), Portuguese (pt), Swedish (sv), Norwegian (nb), Danish (da), Finnish (fi), Polish (pl), Japanese (ja), Chinese (zh-CN) |
| Style | Short (e.g., 24/06/2026), Medium (e.g., 24 Jun 2026), Long (e.g., 24 June 2026) |
Where it applies:
- Search results
- Archive page
- Trash page
- Maintenance tab timestamps
- Any other date display in the app
How to set it up:
- Go to Settings → Preferences
- Scroll to "Date Format" section
- Select your preferred Locale and Style
- A live preview shows how dates will appear
- Click Save preferences
No preference selected? Dates continue to use your browser's default formatting (existing behaviour unchanged).
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.9.0Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.9.0🔗 Links
🙏 Thank You
Thanks to everyone using and testing Flatnotes-Enhanced – dates now display the way you prefer!
Update for better date formatting! 📅
v1.8.0: Progressive Web App (PWA) – Offline read-only access
New Feature: Offline Caching
Flatnotes-Enhanced can now be installed as a Progressive Web App (PWA) and caches notes for offline access.
What this means:
| Scenario | Before | After |
|---|---|---|
| Server down or no internet | ❌ Could not access notes | ✅ Read notes you've opened before |
| Café WiFi blocking the server | ❌ Nothing worked | ✅ Notes load from cache |
| Installing as standalone app | ❌ Not possible | ✅ Install from browser |
How it works:
· Opt-in – Enable in Settings → Preferences → "Enable offline caching (PWA)"
· Automatic caching – Notes, folders, tags, and assets are cached as you use the app
· Server reachability detection – App actively checks if your server is reachable every 15 seconds
· Offline banner – Subtle amber banner appears when offline, disappears when server is back
· Installable – On supported browsers, click the install icon in the address bar
Limitations (read-only):
· ✅ Read notes you've opened before
· ✅ Browse folders and tags
· ❌ Cannot edit notes offline
· ❌ Cannot create new notes offline
· ❌ Attachments are not cached
Technical details:
· Service worker caches API responses (NetworkFirst with 3-second timeout)
· Static assets cached permanently (CacheFirst)
· Cache size: 200 API responses, 100 assets
· Toggle can be turned off at any time (clears cache immediately)
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.8.0Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.8.0🔗 Links
🙏 Thank You
Thanks to everyone using and testing Flatnotes-Enhanced – you can now read your notes even when the server is unreachable.
Install and go offline! 📴
v1.7.2: Non-ASCII Characters in Usernames & Passwords
Improved: Non-ASCII Character Support
Usernames and passwords can now contain non-ASCII characters like German umlauts (ä, ö, ü, ß) and other accented characters (é, è, ç, ñ, etc.).
What was broken:
· Logins failed when passwords contained special characters (e.g., Günther123)
· The backend crashed with a TypeError when non-ASCII characters were used
What changed:
· Passwords are now properly encoded to UTF-8 before validation
· Usernames also support non-ASCII characters
· Both manual login and TOTP authentication modes work
Now works with:
· FLATNOTES_USERNAME=günther / FLATNOTES_PASSWORD=passwörd
· FLATNOTES_USERNAME=gunther / FLATNOTES_PASSWORD=$7%FP5ZCFf@tJL5E2Vüäöüßéèçñ
· Any combination of ASCII and non-ASCII characters
Technical note: The fix uses UTF-8 encoding in secrets.compare_digest() to safely compare credentials.
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.7.2Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.7.2🔗 Links
🙏 Thank You
Special thanks to @riker09 who reported this issue and contributed the fix – non-ASCII characters are now fully supported in credentials.
Update for better compatibility! 🔐
v1.7.1: Bug Fixes – Backup list clarity & More reliable version check
🐛 Bug Fixes
Fix 1: Backup & Restore – Clearer date timestamps
The backup list now provides better context for dates and times.
What changed:
| Before | After |
|---|---|
2026-05-30 14:32:00 · 28.0 KB |
Database Last Saved: 2026-05-30 14:32:00 · 24 KB |
| Unclear what the timestamp meant | Explicit label and file size included |
| No tooltip context | Hover tooltips explain both filename timestamp (UTC) and last saved date (localized) |
Benefits:
- Clearer distinction between backup creation time and database save time
- File size shown directly in the list (no extra click needed)
- Tooltips explain timezone handling (UTC in filename, localized in display)
Fix 2: More reliable version check (Docker Hub API)
The live version check now uses Docker Hub API as the primary source, with GitHub Releases as fallback.
What changed:
| Before | After |
|---|---|
| GitHub API only (60 requests/hour limit) | Docker Hub first (generous limits), GitHub fallback |
| Rate limit could cause "Offline" false positives | Docker Hub rarely hits limits |
| Unclear which source was used | UI now shows via Docker Hub or via GitHub |
| Failed check would blank out previous result | Last known version preserved on transient errors |
Benefits:
- More reliable update detection (no more false "Offline" due to rate limits)
- 6-hour cache shared between both sources
- Debug info visible in UI (
Checked X ago via Docker Hub)
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.7.1Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.7.1🔗 Links
🙏 Thank You
Thanks to everyone using and testing Flatnotes-Enhanced – clearer backups and reliable version checks make maintenance easier for everyone.
Update for a smoother experience! 🔧
v1.7.0 — Redesigned Archive Page, Maintenance & Settings Refactor
Redesigned Archive Page
New features Archived Page (matching Attachments Page design):
- Search field — filters by note title and folder path with a clear (✕) button
- Sort dropdown — four options: Last modified (default), Title A–Z, Title Z–A, Oldest first
- Smart live subtitle — shows
X of Y archived noteswhen a filter is active, otherwise just the total count - No-results state — dedicated empty state when search yields nothing, with a "Clear search" link
LoadingIndicatorwraps the whole page
Preserved without changes:
- Restore individual note (with confirm modal)
- Permanently delete individual note (with confirm modal)
- Empty Archive button (with confirm modal)
- Refresh button with spin animation
- Folder breadcrumb display
- Click-to-open note navigation
- All three
ConfirmModalinstances
Settings Architecture Refactor
The monolithic Settings.vue (~1800 lines) was split into dedicated sub-components for better maintainability and faster loading. Each settings tab is now its own self-contained Vue component:
SettingsCallouts.vueSettingsAppearance.vueSettingsAdvanced.vueSettingsTags.vueSettingsTaskIcons.vueSettingsPrefs.vueSettingsMaintenance.vue(new)
Settings.vue is now a thin shell responsible only for tab routing. Zero functional regression — all existing settings work identically.
New: Maintenance Tab
A dedicated Maintenance tab has been added to Settings with a clean two-column card layout.
Trash Manager
- Displays current auto-delete configuration (via
FLATNOTES_TRASH_DAYSenvironment variable) - Shows number of notes currently in trash
- Shows timestamp of last cleanup ("Last cleaned: X days ago" or "Never")
- "Empty trash now" button with inline confirmation
- Configurable: delete all trash or only notes older than X days
- Spinner feedback during operation, success/error messaging
Content Summary
- Live count of notes, archived notes, trash items and attachments
- Refresh button to update counts on demand
About & System Info
- App version display
- Database file path and size
- Project attribution
New: Backend Maintenance API
Three new API endpoints power the Maintenance tab:
| Endpoint | Description |
|---|---|
GET /api/maintenance/status |
Returns app version, DB info, note counts, trash config |
POST /api/maintenance/trash/empty |
Empties trash (all or older than X days) |
Last cleanup timestamp is persisted in UserSettings.extra so it survives container restarts.
Preferences Backup & Update Checks
New: Preferences Backup & Restore System
Important: Backups contain user preferences and settings only (colors, callouts, tag settings, appearance etc.) — not notes. Notes are stored as plain markdown files on the filesystem and are unaffected by backup and restore operations.
Automatic backups
- A backup is automatically created on every app startup (once per calendar day)
- Backups are stored at
/data/.flatnotes/backups/ - Filename format:
flatnotes_backup_{label}_{YYYYMMDD_HHMMSS}.db - Configurable retention: keep last N backups (default 7), oldest are auto-pruned
Manual backups
- "Backup now" button in the Maintenance tab creates an instant labeled backup
- Backup list shows filename, size, creation date for all available backups
Restore
- Select any backup from the list to restore
- Safety mechanism: a
pre_restorebackup of the current state is automatically created before any restore operation - Requires typing
RESTOREto confirm — prevents accidental restores - After successful restore, a prominent banner prompts the user to reload the page to apply restored preferences
Backup deletion
- Individual backups can be deleted from the list with inline confirmation
New API endpoints:
| Endpoint | Description |
|---|---|
GET /api/maintenance/backups |
List all available backups, newest first |
POST /api/maintenance/backups |
Create a manual backup |
POST /api/maintenance/backups/restore |
Restore from a selected backup |
DELETE /api/maintenance/backups/{filename} |
Delete a single backup |
New: Live Version & Update Check
The About section in the Maintenance tab now displays live version information with automatic update detection.
How it works
- Installed version is read from
package.json(ground truth) - Latest release is fetched from the GitHub Releases API:
https://github.com/BobWs/flatnotes-enhanced/releases - Result is cached server-side for 24 hours — GitHub is never hammered on every page load
- Falls back gracefully when offline or GitHub is unreachable
Three display states
| State | Display |
|---|---|
| Up to date | Green "Up to date" badge + "Checked X ago" |
| Update available | Amber "Update available" badge + link to release notes on GitHub |
| Offline / unreachable | Grey "Offline" badge, no broken UI |
Design decisions
- Check runs server-side (not in the browser) — works even when users are behind a firewall
- 5-second timeout on GitHub API call — never blocks the status response
- Standard
User-Agentheader sent to GitHub (flatnotes-enhanced/{version}) - No auto-update, no telemetry beyond the version number in the User-Agent header
- Degrades gracefully in all failure scenarios
Technical Notes for Self-Hosters
New environment variable behavior
FLATNOTES_TRASH_DAYS was already supported in earlier versions but was not surfaced in the UI. The Maintenance tab now displays the configured value so users can see at a glance whether auto-cleanup is active.
Add e.g. FLATNOTES_TRASH_DAYS=60 to docker environment.
Backup storage
Backup files are stored inside the same Docker volume as your database (/data/.flatnotes/backups/). No additional volume mount is required. Backups persist across container restarts and updates.
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.7.0Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.7.0🔗 Links
🙏 Thank You
Thanks to everyone using and testing Flatnotes-Enhanced.
v1.6.3: Bug Fixes – Sidebar expand/collapse + Header colors/font
🐛 Bug Fixes
Fix 1: Expand/Collapse sidebar folders and tags
What was broken:
| Issue | Description |
|---|---|
| Expand All | Only expanded first-level items – nested folders/tags remained collapsed |
| Collapse All | Worked, but individual items could not be expanded again |
| Individual expand/collapse | Stopped working after using Expand All or Collapse All |
| Refresh buttons | Did not restore normal behavior – only a full page refresh helped |
What changed:
| Fix | Description |
|---|---|
| Deep recursive expansion | Expand All now expands all nested levels (Parent/Child/Grandchild/etc.) |
| Pulse-based force expand | Sidebar no longer holds forceExpand permanently – items regain control after expand/collapse completes |
v-show instead of v-if |
Children remain mounted so force signals reach all levels simultaneously |
| Button icon/tooltip state | Now tracks last expand direction to show correct icon (⇅ / ↕) |
What works now:
| Action | Expected behavior |
|---|---|
| Click Expand All | All folders/tags at every level expand |
| Click Collapse All | All folders/tags at every level collapse |
| Click individual chevron | Toggles that single item (works before AND after using Expand/Collapse All) |
Fix 2: Header colors and font (H1–H6) now respect user preferences
What was broken:
| Issue | Description |
|---|---|
| Colors not reverting | Disabling header colors still showed custom colors |
| Font not reverting | Headings kept the custom Quicksand font even when colors were disabled |
| Toggle had no effect | Enabling/disabling headers in Settings did nothing visible |
What changed:
| Fix | Description |
|---|---|
getHeaderColor() returns null when disabled |
No inline color style is applied to headings |
| Quicksand font is now opt-in | Font only applies when data-custom-headers attribute is present |
| Live toggle without page reload | Watch on headerColors re-renders the note view instantly |
hasAnyHeaderEnabled() helper |
Determines if any H1–H6 level is enabled |
What works now:
| Action | Expected behavior |
|---|---|
| Disable all headers | Headings revert to default theme color and default Poppins font |
| Disable individual heading level | That specific level reverts; others keep custom colors |
| Re-enable headers | Custom colors and Quicksand font return instantly |
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.6.3Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.6.3🔗 Links
🙏 Thank You
Sidebar navigation is now fully reliable, and header styling finally respects your preferences.
Update for a smoother experience! 📂 🎨
v1.6.2: Consistent Default Sorting – All Notes respects your preference
Improved: Default Sort Consistency
All "All Notes" entry points now respect your saved sort preference from Settings → Preferences → Default note sort.
What changed:
| Entry point | Before | After |
|---|---|---|
| Hamburger menu → All Notes | Hardcoded to Title | ✅ Respects user preference |
Home page → ... (Show more) |
Used Docker env variable | ✅ Respects user preference (with fallback) |
| Search page (direct) | Hardcoded to Title | ✅ Respects user preference (with fallback) |
Fallback chain (when no user preference is set):
- Docker environment variable (
FLATNOTES_QUICK_ACCESS_SORT) – if you have one configured - App default – Title (alphabetical order)
What stays the same:
- The Quick Access list (5 notes on Home page) still uses Docker env only – unchanged
- Clicking the sort dropdown on the Search page still overrides everything (URL parameter takes priority)
Bug Fixes
Fixed: "App Default" option in Settings now saves correctly. Previously, selecting "App Default" would not persist after page refresh.
Fixed: The sort preference now syncs instantly when changed in Settings – no page reload needed.
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.6.2Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.6.2🔗 Links
🙏 Thank You
Thanks to @TechGuyAlabama who reported the inconsistent sorting behaviour – your notes now sort the way you expect, everywhere.
Update for consistent sorting! 📊
v1.6.1: Bug Fix – Title truncation in editor header
🐛 Bug Fix
Fixed: Long note titles were being cut off without an ellipsis (…), and the folder breadcrumb competed for space with the action buttons (Pin, Archive, Trash, Edit/Save).
What changed:
The header in both view and edit mode has been restructured from one crowded row into two clean rows:
| Before | After |
|---|---|
| Folder breadcrumb + Title + Buttons (all in one row) | Row 1: Folder breadcrumb + Buttons |
| Title competed for space, truncation broke | Row 2: Full-width title with proper truncation (…) |
- The title now has the entire width of the second row – nothing else competes for space
- The
truncateclass now correctly appends…when titles are too long - Buttons (
Prev/Next, Pin, Archive, Trash, Edit/Save) always stay intact on the right side of row 1 - Folder breadcrumb gives way when space is tight, buttons never wrap
- A hidden placeholder keeps consistent row height even when no folder is present
Only Note.vue was changed – no other files affected.
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.6.1Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.6.1🔗 Links
🙏 Thank You
Thanks to @TechGuyAlabama who reported this issue – the note header is now cleaner and more reliable.
Update for a better editing experience! ✏️
v1.6.0: Note Views – Choose your preferred reading width
New Feature: Note Views
You can now choose how wide your notes appear on screen. Three options are available in Settings → Preferences → Default note view:
| View | Width | Best for |
|---|---|---|
| Normal | 999px | Default – comfortable reading length |
| Wide | 1400px | Large monitors, more horizontal space |
| Full Screen | 100% | Ultrawide displays, maximum space |
How it works:
- Go to Settings → Preferences
- Find "Default note view" dropdown
- Select your preferred width and save
- Changes take effect immediately – no page reload needed
- Works for both editing and viewing notes
What stays the same:
- All other pages (Settings, Attachments, Trash, Archive, Bookmarks, etc.) remain centered at 999px – only note pages are affected
- Your preference is saved to the database and persists across sessions
Technical Notes
- No backend changes – reuses existing
notes_default_viewfield - Navbar and content area stay perfectly aligned in all three modes
- Fully responsive – works on all screen sizes
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.6.0Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.6.0🔗 Links
🙏 Thank You
Thanks to everyone using and testing Flatnotes-Enhanced.
Choose your perfect reading width! 📖
v1.5.1: Bug Fixes – Case-insensitive attachments & Archive folder scanning
🐛 Bug Fixes
Fix 1: Case-insensitive attachment linking
Attachments are now matched case-insensitively. Previously,  would fail to render if the actual file was named photo.png.
What changed:
- Attachment lookup in the backend now tries exact match first (fast path), then falls back to a case-insensitive search
- Delete operations use the same two-phase lookup – no more "file not found" errors when case differs
- The Attachments page now correctly tracks usage regardless of case in markdown links
- Frontend rendering treats
attachments/andAttachments/the same
This affects all attachment types – images, PDFs, documents, archives, audio, video, and code files.
Fix 2: Archive folder now scanned for attachment usage
The Attachments page previously ignored notes in the _archive folder when determining if an attachment was "in use". This could lead to attachments being incorrectly marked as unused and potentially deleted.
What changed:
- Notes in
_archiveare now scanned for attachment references - Notes in
_trashremain excluded (trashed notes should not protect attachments) - The "In use" filter now correctly shows attachments referenced by archived notes
Installation
docker pull dockerbobw/flatnotes-enhanced:latest
docker pull dockerbobw/flatnotes-enhanced:v1.5.1Docker Compose
image: dockerbobw/flatnotes-enhanced:latest
# or pin to this version:
# image: dockerbobw/flatnotes-enhanced:v1.5.1🔗 Links
🙏 Thank You
Thanks to everyone using and testing Flatnotes-Enhanced – attachment handling is now more robust and reliable.
Update for better attachment management! 📎