Add Cloudflare Workers configuration - #2
Open
cloudflare-workers-and-pages[bot] wants to merge 132 commits into
Open
Add Cloudflare Workers configuration#2cloudflare-workers-and-pages[bot] wants to merge 132 commits into
cloudflare-workers-and-pages[bot] wants to merge 132 commits into
Conversation
… local dashboard restrictions
…th translations, and package config
…t staging corruption
…sh and adding file-lock automatic retry loop
…austion and verify large file sync reliability
…on block fetching
…bsite Source JPG had the rounded corners flattened to black — rebuilt the transparency with a measured-radius anti-aliased mask, then generated the multi-size Windows ICO (16-256) and the 512px website icon from the same rounded master. Linux tarball and Flatpak icons derive from appicon.png at release build time. LOCAL ONLY — ships with the next approved push. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…bleshooting The sandbox allowed talking to the tray watcher but not owning an item name, so the tray failed with DBus ServiceUnknown (cosmetic — app runs, no tray icon). fyne/systray names its item after the PID, which is always 2 inside flatpak. Also documents the 'runtime not found' case (user installation without Flathub configured). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…achyOS) Field finding from an ROG Ally X on CachyOS: the native tarball works (distro webkit2gtk-4.1, native Mesa) while the Flatpak's runtime webview crashes on the same device — runtime-vs-host GPU stack mismatch. The Flatpak's purpose is immutable SteamOS; say so. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… APUs The 48 runtime (freedesktop 24.08) ships Mesa that predates ROG Ally X-class silicon; the webview died on GPU init inside the sandbox while the same build ran fine against the host's native Mesa. 49 is built on freedesktop 25.08. CI's in-sandbox ldd check guards the webkit2gtk-4.1 dependency across the bump. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Field report: 38 detections, every one named 'Persona 3 Reload'. Two compounding bugs: the coarse compatdata listing offered every vendor folder in a busy prefix's AppData/Documents as its own discovery, and resolveNames then overwrote each entry's 'Title (SubDir)' name with the bare AppID title, erasing the only disambiguation. - Scan order: precise Ludusavi manifest pass now runs BEFORE the coarse prefix listing, which skips any folder that already contains a precise hit (seenInside) - resolveNames preserves the '(qualifier)' suffix when renaming - vendor skip list: GPU vendors, CRIWARE/Unity middleware, launcher and anticheat plumbing Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
EmuDeck reroutes every emulator's saves into one Emulation/saves/<emu>
tree, so the per-emulator default-location presets all come up empty on
Deck-style setups (reported by a Steam Deck tester and a Reddit user).
New wrapper preset surfaces each emulator subfolder as its own
candidate ('EmuDeck (retroarch)'); preset Linux locations now support
wildcards for SD-card mounts (/run/media/<dev>, /run/media/deck/<label>).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ogo) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…cation - The in-app logo (title bar, About, boot screen) still used the old assets/logo.svg — replaced with the new pixel-art mark (PNG from the icon master). Build icons were already correct; stale taskbar icons are the Windows icon cache. - A snapshot containing zero files (usually a mis-tracked save path) now logs a loud warning naming the tracked location and is never mirrored to the cloud — an 'empty backup' sitting in cloud storage destroys trust silently (field report: empty Celeste zip on WebDAV). - WebDAV uploads verify after PUT: HEAD the file and compare stored size; truncated/empty stores fail the upload loudly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Field report: resolving a conflict (esp. 'Keep both') just re-raised the same conflict on the next sync, forever. Root cause: ResolveConflict cleared the active conflict but recorded NO merge-base, NO lineage, and never told the peer — so DetectConflict re-fired immediately (both sides still differed from the stale agreed hash). Every resolution now durably records convergence: - keep-remote / keep-both: after overwriting local to match the peer, capture the resulting manifest as the agreed merge-base + lineage, stamp last-synced, and send the peer an in-sync event so it re-confirms the same base on its own clock (ConfirmInSync). Both sides land on one merge-base; capturing the post-overwrite manifest means even a partial overwrite converges on the next normal sync instead of re-conflicting. - keep-local: record OUR version as the merge-base and make it authoritative — refresh save-file mtimes (content/hash unchanged, so the base stays valid) so the next sync PUSHES our version rather than letting Compute's mtime tiebreak pull the peer's copy back and silently undo the user's choice. Then trigger the peer to adopt it. Adds TestConflictResolutionSticks (all three resolutions: resolve, then several re-syncs must not re-raise) and updates the modal copy to match keep-local's propagate-my-version behavior. e2e TestConflictNeverLosesPeerData still green (A keeps its version, B's is recoverable). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…h to v2.1 The marketing site now mirrors the app's actual look instead of a purple-tinted approximation, and shows the real product instead of a hand-built CSS mockup. - Retheme to the app's exact tokens: neutral near-black surfaces (#0c0c0d / #17171a) and the #8a63f4 accent, matching app.css. - Hero now shows the real Home/library screenshot in a window frame; a new 'See it in action' section features the auto-scan (158 games), room-code pairing, and cloud-provider screens with a click-to-zoom lightbox. - Content refreshed to what shipped in v2.1: 20,000+ game detection via the embedded Ludusavi index, Steam Deck/Proton/Flatpak, content-based (merge-base) conflict detection, streaming large-file sync. - Download buttons resolve to the exact latest release assets via the GitHub API (data-dl attributes), and the hero eyebrow shows the live version. Mobile nav, responsive grids, reduced-motion all verified.
- The Windows download card now offers both builds the release ships: the NSIS installer (OpenSave.Setup.exe, recommended) and the portable exe (OpenSave.exe). Buttons resolve to the exact assets via the GitHub API; generic 'Download for Windows' CTAs point at the installer. - Redrew the how-it-works ASCII diagram so the boxes, labels, and relay arrows actually line up (generated with fixed column placement).
…ser) The monospace ASCII diagram misaligned in the browser: box-drawing and arrow glyphs (◀ ▶ ▼ ∅) don't all render at exactly 1ch, so columns drifted no matter how perfectly aligned the source was. Replaced it with a themed SVG — absolute coordinates, scales cleanly, and can't misalign. Verified the device rows and relay labels sit inside their boxes and the LAN/WAN wires connect the right edges. Kept the 'How it works' section and its nav link; the sub-diagram doesn't need its own nav entry.
Browsers cache favicons hard and keep showing the stale tab icon even after icon.png changes. Version the icon references (?v=2) so the new pixel-art logo actually replaces the old one on next deploy.
… Eden) Reddit question: does Switch save detection cover the Yuzu family or just Yuzu? It was Yuzu + Ryujinx only. The forks all inherit Yuzu's nand/user/save NAND layout under a fork-specific config dir, so add a preset per fork (Windows %APPDATA%, native ~/.local/share, and Flatpak paths). Wrong Flatpak IDs are harmless — an unresolved path is simply never offered. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Field report: untrack a game and it comes right back, and the untrack never reaches the other device. Two bugs: UntrackGame only deleted the game locally (no peer notification), and ensureManifestGame auto- re-created it the instant the still-tracking peer requested its manifest. - Durable tombstone (migration 0004 untracked_games): auto-track now refuses a deliberately-untracked id; explicit re-track clears it. - Untrack propagation: UntrackGame notifies paired peers (LAN POST /api/p2p/untrack + WAN untrack-notify relay msg), mirroring the unpair-notify pattern; the peer removes the game too (watcher stop + its own tombstone) without notifying back (no loop). Adds e2e TestUntrackDoesNotBounceBack: untrack stays gone on A even as B keeps syncing, registers on B, and re-tracking works again. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ly pruning Report: no discoverable max-snapshot setting and disk full of snapshots. Three parts: - BUG: pruneRetention only pruned the ACTIVE branch, so snapshots on side branches (every conflict-* branch a 'keep both' creates, manual branches) accumulated forever. Now prunes across ALL branches. - Global default (migration 0005 default_max_snapshots, Settings field): new games inherit it instead of a hardcoded 5. Surfaced in Settings > Snapshot storage. - Cleanup action: POST /api/snapshots/prune (applyDefaultToAll) sets every game to the default and prunes all branches now, returning bytes freed. Settings button '🧹 Apply limit to all games & clean up now'. Adds TestPruneAllBranches (side branch pruned to limit too). Per-game override still lives in each game's Configuration tab. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full-width 'Apply limit to all games & clean up now' → compact '.btn small' reading '🧹 Clean up now', wrapped so it sizes to content; the descriptive hint below carries the detail. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Real cause of 'nothing to clean up' despite 15+ backups (found in the
user's DB): a game had 8 conflict-omar-* branches (2-3 snapshots each)
from the old conflict-loop bug. Per-branch retention correctly pruned
nothing — no branch exceeded the limit — but 18 snapshots sat in junk
branches the limit never touches.
- PruneAllGames now also sweeps non-active conflict-* branches (deletes
the branch + its snapshots + zips), so 'Clean up now' frees them.
- New DeleteBranch (store + manager + DELETE /api/games/{id}/branch/{b})
with a Delete button per non-active, non-main branch in the Branches
tab — branch removal was simply missing.
Adds TestCleanupSweepsAbandonedConflictBranches (branches under the
limit still get swept; active/main and their snapshots survive).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Requested alongside the branch cleanup. A game's Snapshots tab now has a
Delete button per snapshot (metadata + zip removed, live save untouched,
confirm dialog); the Branches tab already gained per-branch Delete in the
prior commit. Backend: DELETE /api/games/{id}/snapshot/{snapId} and
Manager.DeleteSnapshot returning bytes freed.
Adds TestDeleteSnapshotAndBranch (snapshot row+zip gone, branch+its
snapshots gone, main protected).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Field report (Balatro): endless 'sync balatro with Omar failed: fetch remote manifest: Game not found' + 'retrying interrupted sync'. DB showed balatro tracked here but untracked on the peer. Two problems in the untrack feature I'd added: 1. A sync that fails because the PEER isn't tracking the game was treated as a transient interruption and retried every tick forever. Now FetchManifest 'not found' resolves to a 'peer_missing' Result (not an error), so the failsafe loop drops it instead of hammering it. 2. Untrack PROPAGATED destructively to peers (deleting their game + snapshots + tombstoning them), which wedged re-tracking: re-adding on one device couldn't recover because the peer stayed tombstoned. Untrack is now LOCAL-only — the tombstone still stops the 'comes back' bounce on this device, the peer keeps its own copy, and re-tracking clears the tombstone and resumes syncing. Removed the untrack-notify send/receive paths. UntrackGame also clears the game from the resync queue. Tests: TestSyncPeerMissingGame (peer-missing vs real error); rewrote TestUntrackDoesNotBounceBack for local-only semantics incl. re-track recovery syncing to the peer. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per user request. New installs get 20 (migration DEFAULT + Go fallbacks); the setting is still user-adjustable in Settings > Snapshot history and per-game in each game's Configuration tab. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two field bugs from live testing ('the other device added the game but
it doesnt show up on mine' + 'they untracked and it didnt change from
mine'):
1. Tracking a game never pushed it to peers — OnGameChanged only
refreshed the LOCAL UI, and the AutoSyncOnTrack setting was never
wired. So a game added on one device only reached peers on the slow
periodic reconcile. TrackGame now triggers d.P2P.SyncGame after the
watch is set up (honoring AutoSyncOnTrack), so peers auto-track it
immediately. The WAN auto-track path was entirely untested → new
TestWanAutoTrackFromPeer.
2. Untrack was made local-only in the previous commit, but the user wants
it to register on the other device. Restored propagation (untrack-
notify removes+tombstones on peers) AND added the missing recovery:
re-tracking sends retrack-notify to clear peers' tombstones, then
sync-on-track re-populates them. So untrack removes on both, doesn't
bounce back, and re-track restores on both. Full lifecycle covered by
TestUntrackPropagatesAndRecovers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ounter) The race detector (CI-only; no cgo locally) caught it on the release commit: TestEmptySnapshotNeverMirrorsToCloud read an 'uploads' int that the async OnUpload goroutine writes. Guard it with atomic.Int32 and the warning string with a mutex. Production code is unaffected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # e2e/wan_sync_test.go
cloudflare-workers-and-pages
Bot
force-pushed
the
cloudflare/workers-autoconfig
branch
from
July 20, 2026 13:10
9bbb222 to
66fc81d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR configures your project for Cloudflare Workers deployment using Wrangler autoconfig.
Merging this PR commits the configuration to your repository, enabling faster deployments and version controlled settings.
Detected settings:
Framework:
staticDeploy command:
npx wrangler deployVersion (non-production deploy) command:
npx wrangler versions uploadNext steps after merging:
Your Worker configuration lives in
wrangler.jsonc. You can now:View build details · Join the discussion for questions or feedback