- Restore ddgAnswer, which an earlier edit deleted: /api/ddg threw a ReferenceError and killed the
whole server process whenever Search ran
- One failing request can no longer take the server down (errors are logged and answered with a 500)
- tools/smoke-test.js starts the real server and calls every endpoint; the Gitea workflow runs it before
building the image, so a missing function or a crash stops the build
- Search: also searches NE Hub tasks and calendar events; Seafile file search falls back to scanning file
names when the search index returns nothing; Plex search falls back to the library's artists/albums;
a status line shows what was searched, per-source counts and errors, with sign-in links
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
"mounted" was true even when /data was the hidden anonymous volume Docker creates for the
Dockerfile's VOLUME, so the app looked fine while the user's host folder stayed empty and the
data was lost when the container was recreated. Read the mount source and report host folder,
named volume or anonymous volume (flagged), in Settings and the startup log.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Preferences lived only in the browser, so clearing it, using another device or the separate iOS
home-screen storage lost them. They are now saved in /data/settings.json (the audiobooks sign-in
encrypted), loaded at start-up, and existing browser-only values are uploaded once. A failed save
is reported instead of silent.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Apple's listing was recognised as calendars but then discarded by the events/tasks filter.
Read component names from anywhere in the entry (any quoting or prefix), treat a missing or
empty list as events, and keep calendars as event calendars if every one would otherwise be
dropped. Errors now show each item with its component types.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Apple writes <calendar xmlns="urn:ietf:params:xml:ns:caldav"/> (attributes, no prefix), which the
previous pattern missed, so a valid sign-in reported "No calendars found". Match it with a
lookahead, check the HTTP status of the listing, and name what iCloud returned if nothing matches.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- iOS ignores SVG touch icons: add 120/152/167/180 apple-touch-icons, 192/512 and maskable manifest icons,
and 25 splash screens (every iPhone size, iPad portrait+landscape incl. 12.9")
- Icons and splash screens are public so iOS can fetch them without a session
- Manifest: id, scope, categories, shortcuts; iOS standalone polish (no callout, no overscroll)
- Sessions last SESSION_DAYS (default 180) and renew daily while in use
- tools/make-icons.py regenerates the artwork
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Lists, quick add, due dates, notes, complete/reopen, delete; Home card for overdue/due today
- iCloud VTODO lists read and written over CalDAV (If-Match, edits patch the latest copy so
priority/alarms survive); NE Hub lists work regardless
- Fix: text inside a nested VALARM was read as the task's / event's own description and then
written back on edit; nested components are now skipped (regression tests added)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Passkeys, calendars and sessions were being lost on redeploy. The server now
reports whether /data is a mounted volume, whether it is writable, what it
holds, and where the session secret comes from, so a wiped volume is obvious.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The server asks DuckDuckGo's instant-answer service (summary, definition, quick
answers) and Search shows it as a card above the app's own results when there
is one. Lookups are cached for 10 minutes and a failure never breaks Search.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Both refuse to be framed and Duck.ai has no public API, so Search shows
"Ask Duck.ai" and "Search the web" buttons that open a new tab with the
query pre-filled.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Audio and Podcast now share kept-alive frames that stay loaded while hidden.
A plain-http address still falls back to a launcher (a secure page cannot
frame http content).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Add, edit and delete events; month/agenda views open them on tap
- NE Hub calendar stored on the server and published as a private ICS subscribe link
- iCloud CalDAV read/write with an app-specific password (encrypted at rest,
only *.icloud.com contacted, event addresses checked against the calendar)
- Edits patch the existing entry so alarms/attendees survive; writes use If-Match / If-None-Match
- Time zone definitions (VTIMEZONE) generated so other apps read times correctly
- Podcast tab (PODCAST_URL) alongside Podcast Admin
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The site sends X-Frame-Options: SAMEORIGIN, so it cannot be embedded; the tab
and a Home tile open it in its own browser tab. Address is VERSE_URL.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A signed-in device creates a short-lived, single-use code in Settings
("Invite a device"); the new device enters it on the sign-in page to create
its own passkey. Codes are throttled like other secrets and cannot be used
by signed-out clients to create more codes.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Lists every music library on the server, remembers the choice per server,
and shows it under the title with a picker.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Month view (default) with event dots on phones and event labels on
tablet/desktop, tap a day to see its events, previous/next/today.
The agenda list stays available.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fetch() decompresses transparently, but the proxies forwarded the upstream
content-length, so browsers cut compressed Plex/Seafile responses short and
JSON.parse failed. Ask Plex for identity encoding and drop the stale length
whenever the upstream response was encoded.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The frame was rebuilt with the page content on every route change, which
stopped playback. It now lives outside the view and is only shown or hidden.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Connecting through plex.direct names failed from the container (DNS and
hairpin NAT). Try http://<lan-ip>:<port> first, verify the server's
machine identifier before sending the token, and let the user type an
address when discovery fails.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Choose where documents are saved (library + folder picker, like Files); remembered
- New document/spreadsheet/presentation asks for a name and shows the save location
- Documents in that location are listed in the tab; opening one edits it inside the tab
with the navigation visible and a Back to Office button
- Fix double slash in editor URLs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Office tab was just the OnlyOffice welcome page. It now offers New
document/spreadsheet/presentation, creates the file in Seafile from a valid
blank template (empty 0-byte files often will not open in the editor) and
opens it in the editor. Files > New uses the same templates.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Calendar agenda from private ICS feeds (recurrence, EXDATE, overrides, time zones, SSRF guard)
- Search across libraries, files (recursive fallback) and Plex
- Home dashboard: now playing, today's agenda, recent files
- Files: rename, move, share link, preview, create new documents
- Music: recently added, play next / add to queue, queue sheet, resume on launch
- Phone tab bar shows four tabs plus a More menu
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Mobile-first PWA (phone tab bar with More menu, iPad/desktop rail)
- Passkey (WebAuthn) sign-in gates the whole app; first passkey via setup code
- Files: Seafile browse/upload/new doc/rename/move/share link/preview/delete
- In-app OnlyOffice editing with JWT-signed configs and save-back to Seafile
- Plex music player via plex.tv sign-in and a server-side proxy
- Calendar agenda from private ICS links (recurrence + time zones)
- Search, Home dashboard, webmail deep links, audiobooks frame
- Dockerfile, compose, and a Gitea Actions workflow that builds the image
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>