Commit Graph
436 Commits
Author SHA1 Message Date
multipleof4andClaude Opus 5.5 8f0a0e2780 Pin unversioned third-party scripts to their current latest
Every page load fetched whatever these resolved to, so a bad or
compromised release would ship to all users with access to their keys.
Each pin serves byte-identical content to what the unpinned URL served.

- lucide@latest -> lucide@1.60.0
- cdn.tailwindcss.com -> 3.4.17
- cash-dom -> 8.1.5
- alpinejs -> 3.17.5
- markdown-it-mathjax3 (esm.sh) -> 5.2.0
- medv.io/codejar -> codejar@4.3.0 on jsDelivr (same file)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 00:23:28 +00:00
multipleof4andClaude Opus 5.5 9791b29ace Open a popover from the thread Sync button instead of a confirm prompt
Thread Sync now shows Upload to GitHub / Download from GitHub in a popover,
like sunes sync, so it can be dismissed instead of forcing a choice. It
closes on an outside click, resize, the sidebar overlay, or picking an
option. The push and pull code is unchanged, and the readme's sync steps
now name the popover options.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:40:46 +00:00
multipleof4andClaude Opus 5.5 bc7688b62a Move reply time into a ts field and make reply ids base64url
Assistant messages now carry ts, a plain ms timestamp, instead of the time
riding at the start of the id. Reply ids, which double as the proxy's run
id, are just 128 random bits as unpadded base64url (22 chars). SECURITY.md
now says ntfy pings carry a short hash of the run id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:17:57 +00:00
multipleof4andClaude Opus 5.5 bd91949698 Make reply ids unguessable and keep them out of the socket URL
Reply ids, which double as the proxy's run id, are now the same base36 ms
timestamp followed by a dash and 128 random bits from crypto.getRandomValues,
so a run can't be found by guessing. Saved replies keep their fields and the
timestamp prefix. The id is sent inside begin, resume and stop instead of the
URL, and SECURITY.md now says ntfy pings carry only the timestamp half.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 03:56:12 +00:00
multipleof4andClaude Opus 5.5 5c75408188 Keep retrying a lost reply for up to 105 minutes to match the proxy's 90-minute window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 03:04:01 +00:00
multipleof4andClaude Opus 5.5 b4bae470c1 Rewrite reply streaming: background replies, reliable stop and resume
Each reply owns its socket and keeps streaming and saving into its own
thread when you switch threads or sunes, so other threads aren't blocked.
Drops reconnect with backoff and resume from the last chunk; a socket that
stays open but goes silent is caught by a ping when the app returns to the
foreground (and every 20s while visible). Streaming messages carry
stream:{seq}, and replies in flight are listed in localStorage so a reload
picks them up even before their thread is opened. This replaces the 1.5s
HTTP polling, the threads_cache store and the DOM-based last-message lookup.

Stop now always reaches the proxy: after a reload, after switching apps and
while the socket is still connecting. Deleting a streaming message or its
thread stops the run. Also fixes:
- the send lock is taken before any await, so a double tap can't send twice
- a tap on the button right after it flips from Stop to Send is ignored
- Stop no longer swallows the next manual empty-composer send
- a thread opened while another was still loading can't take its messages
- deleting a local thread now removes it from the list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 02:59:52 +00:00
multipleof4andClaude Opus 5.5 3ee881427c Accept AVIF and JXL image attachments
Both are converted to WebP in the browser like other non-WebP images, so
providers never see them. Browsers that can't decode JXL now get a readable
error instead of [object Event].

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:14:28 +00:00
multipleof4andClaude Opus 5.5 270fbe3615 Send WebP attachments untouched unless over 2048px
Oversized WebPs are now scaled to a 2048px longest edge at 0.94 quality
instead of being sent at full size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:10:33 +00:00
multipleof4andClaude Opus 5.5 ca56487f91 Compress attached videos to 3 fps to match the proxy's Gemini sampling rate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 09:32:00 -07:00
multipleof4andClaude Opus 5.5 e027cf96f0 Add video attachments with in-browser compression and playback
Videos are compressed with Mediabunny to 360p at 4 fps (HEVC when the
device can encode it, H.264 otherwise) with mono 32 kbps AAC, then
stored as video_url data URLs. Frames are resized after the frame-rate
drop, and rotation is baked in during that same step, so phone videos
stay on the fast path.

The attach badge shows compression progress, sending waits for pending
compressions, and "Clear all attachments" cancels them. Messages show
video thumbnails that open a fullscreen player.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:57:48 +00:00
multipleof4andClaude Opus 5.5 906333eae9 Keep existing attachments when adding more; clear via hold or right-click
Clicking the attach button or pasting files now appends instead of
resetting. Long-press (touch) or right-click opens a popover with
"Clear all attachments".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:15:48 +00:00
multipleof4andClaude Opus 5.5 2cb952a7e3 Remove Cloudflare inference provider branches, keep key for custom sunes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 17:43:15 +00:00
multipleof4andClaude Opus 5.5 b697398096 Drop unsupported cf: model prefix, fit account settings on small screens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 17:40:14 +00:00
multipleof4andClaude Opus 5.5 61d7fca337 Fit sune settings modal on small screens, trim Claude help note
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 17:35:38 +00:00
multipleof4andClaude Opus 5.5 360e20bbad Add model name help popup to sune settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 17:30:30 +00:00
multipleof4 35c2537f42 Increase max_tokens from 6 to 7 2026-09-20 10:07:08 -07:00
multipleof4 081074a2df Invalidate stale GitHub thread caches on pull 2026-09-18 11:52:04 -07:00
multipleof4 916f41606c Submit composer with Enter on desktop 2026-09-16 20:55:57 -07:00
multipleof4 a73ee38f01 Support clipboard file paste in composer and attaching during stream 2026-09-10 16:57:26 -07:00
multipleof4 599989fbed Shorten model name placeholder hint 2026-09-09 22:03:58 -07:00
multipleof4 27cbdea778 Support model name placeholder in system prompts 2026-09-09 21:59:49 -07:00
multipleof4andgemini-3.8-flash 5d27b9904a Style: Adjust topbar padding to py-2
Co-authored-by: gemini-3.8-flash <noreply@google.com>
2026-09-07 21:03:19 -07:00
multipleof4andgemini-3.8-flash 22f578dbd1 Feat: Update topbar avatar image to h-10 w-10
Co-authored-by: gemini-3.8-flash <noreply@google.com>
2026-09-07 21:02:33 -07:00
multipleof4andgemini-3.8-flash 5c9fe41f1c Feat: Set topbar Sune avatar to h-10 w-10
Co-authored-by: gemini-3.8-flash <noreply@google.com>
2026-09-07 21:02:31 -07:00
multipleof4andgemini-3.8-flash 1a134c82ca Feat: Update topbar avatar image to h-9 w-9
Co-authored-by: gemini-3.8-flash <noreply@google.com>
2026-09-07 20:51:37 -07:00
multipleof4andgemini-3.8-flash c362744e39 Feat: Enlarge topbar Sune avatar to h-9 w-9
Co-authored-by: gemini-3.8-flash <noreply@google.com>
2026-09-07 20:51:35 -07:00
multipleof4 2e840b4b86 refactor(utils): update imgToWebp defaults to D=96 and q=75 2026-09-07 20:17:35 -07:00
multipleof4 6c4376ca71 Set omitted reasoning_effort to empty string 2026-09-05 20:59:46 -07:00
multipleof4 a4f04d3aac Replace verbosity setting with max tokens (output) 2026-09-05 18:20:23 -07:00
multipleof4 5975a88b31 Fix: Prevent recursive dirty marking on system keys, resolve popover ID collisions, and add activeId fallback on pull 2026-09-04 11:50:43 -07:00
multipleof4 5b410bfe40 Feat: Upgrade GitHub Sune Sync with status indicator, auto-pull, and popover actions 2026-09-04 09:49:53 -07:00
multipleof4andgemini-3.7-flash 0d7264eb29 Feat: Enable fuzzyLink for markdown-it v15
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-09-01 20:03:55 -07:00
multipleof4 487400d174 upgrade highlightjs to 11.12.0 2026-09-01 19:41:41 -07:00
multipleof4 a0132cd48b upgrade gh css version 2026-09-01 19:29:54 -07:00
multipleof4andgemini-3-flash-preview 1acd908afc Feat: Implement Global Sune Sync logic
Co-authored-by: gemini-3-flash-preview <noreply@google.com>
2026-08-31 17:24:57 -07:00
multipleof4andgemini-3-flash-preview 0b3f97246b Feat: Add Sune repo sync UI to left sidebar
Co-authored-by: gemini-3-flash-preview <noreply@google.com>
2026-08-31 17:24:51 -07:00
multipleof4andgemini-3-flash-preview c9663c037b Feat: Add Sune sync DOM elements
Co-authored-by: gemini-3-flash-preview <noreply@google.com>
2026-08-31 17:24:48 -07:00
multipleof4andgemini-3.7-flash c727f40d91 Fix: Non-greedy sune ID matching in gcStorage
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-31 15:52:13 -07:00
multipleof4andgemini-3.7-flash c8d9d66e7f Feat: Add Sune storage API and storage GC
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-31 14:41:52 -07:00
multipleof4andgemini-3.7-flash a023ad0423 Refactor: Remove storage key from sune
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-31 14:09:41 -07:00
multipleof4andgemini-3.7-flash cc8b523816 Fix: Fetch unloaded thread content before GH sync
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-30 11:19:33 -07:00
multipleof4andgemini-3.7-flash 731b6a2dcc Fix: Omit attached base64 images on copy
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-29 20:47:34 -07:00
multipleof4andgemini-3.7-flash 1365e6c4ca Fix: Resolve latest message and omit base64 on copy
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-29 20:47:26 -07:00
multipleof4andgemini-3.7-flash 2b9a7b4c25 Fix: Use robust copy fallback in code blocks
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-29 20:47:22 -07:00
multipleof4andgemini-3.7-flash 2b8fbc5059 Fix: Update demo reply tip to reference User menu
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-21 12:02:06 -07:00
multipleof4andgemini-3.7-flash a0b249e718 Feat: Sync User avatar with sidebar and bind upload
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-21 11:55:37 -07:00
multipleof4andgemini-3.7-flash 9da342601c Feat: Add userMenuAvatar to DOM map
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-21 11:55:33 -07:00
multipleof4andgemini-3.7-flash df8269f01c Feat: Add GitHub button & user avatar container
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-21 11:55:30 -07:00
multipleof4andgemini-3.7-flash 53287e518d Feat: Add GitHub repo button and rename User menu
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-21 11:50:55 -07:00
multipleof4andgemini-3.7-flash 60fc9d90dd Refactor: default username to User
Co-authored-by: gemini-3.7-flash <noreply@google.com>
2026-08-21 11:21:13 -07:00