Conversation
A zero-build static landing page in website/ — dark, modern, matching Parley's brand gradient and "P" monogram. Includes: - Hero, features grid, how-it-works, alternating showcase rows, tech stack, and install CTA sections. - Marked media slots that auto-load showcase GIFs/screenshots/MP4s from website/assets/ by filename (no markup edits needed). - Responsive layout, scroll-reveal, copy-to-clipboard install snippet. - GitHub Pages deploy workflow + README covering local dev, media slots, and Cloudflare custom-domain setup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
YJack0000
added a commit
that referenced
this pull request
Jun 25, 2026
… download (#50) * [feature] cloud sync: cross-device freshness, dirty re-push, streamed audio download Closes the three deferred multi-device/perf gaps from the sync review. 1. Cross-device staleness (#1): a new localStorage side-channel (src/lib/cloud/ syncState.ts) records, per entry, the cloud updatedAt the local copy matches. listMergedHistory now marks an entry "stale" when the cloud is strictly newer (another device re-analyzed it) and not locally dirty; opening a stale card re-pulls it first. Existing synced entries backfill as synced on first sight, so nothing flips stale spuriously. New amber RefreshCw badge + i18n. 2. Stale-cloud repair (#2): save/re-analyze marks the entry dirty (cleared on a confirmed push), so a failed inline push is retried by the background sweep — which now pushes missing OR dirty entries, skips the pass if the cloud list fails, and aborts on the first auth failure instead of hammering every entry. 3. Download perf (#3): save_remote_history_entry is now async and fetches the audio itself (reqwest, bearer auth), streaming it to disk — the multi-MB blob no longer crosses the JS<->Rust IPC as a JSON number[]. Single-device behavior is unchanged: entries are pushed-then-synced immediately (never stale, never dirty-after-push), and downloads only happen for cloud-only/ stale cards, which don't arise on one device. * [fix] cloud sync: review fixes — atomic download, rename dirty, dirty-safe backfill, serialized pushes From the adversarial review of the multi-device sync: - save_remote_history_entry fetches the audio BEFORE writing anything, so a failed download leaves nothing partial (new cloud-only entry) and doesn't disturb the existing files (stale re-pull) — kills the phantom-audio / mutated-good-copy corruption (was HIGH). - renameHistoryEntry now pushes via pushToCloud (marks dirty), so a failed rename push is retried by the sweep instead of leaving the cloud title stale. - listMergedHistory's first-sight backfill no longer clears a live dirty flag (would have dropped a pending re-push and shown the entry falsely synced). - pushLocalEntry is serialized per id, so two concurrent same-id pushes can't complete out of order and record stale content as synced. Deferred nits: download records the list-snapshot updatedAt (one redundant re-pull on a concurrent remote bump); localStorage eviction can mask staleness; res.bytes() buffers the blob (still off the IPC). All cosmetic/best-effort. tsc + cargo check + 79 tests green.
YJack0000
added a commit
that referenced
this pull request
Jun 29, 2026
… audio download Closes the three deferred multi-device/perf gaps from the sync review. 1. Cross-device staleness (#1): a new localStorage side-channel (src/lib/cloud/ syncState.ts) records, per entry, the cloud updatedAt the local copy matches. listMergedHistory now marks an entry "stale" when the cloud is strictly newer (another device re-analyzed it) and not locally dirty; opening a stale card re-pulls it first. Existing synced entries backfill as synced on first sight, so nothing flips stale spuriously. New amber RefreshCw badge + i18n. 2. Stale-cloud repair (#2): save/re-analyze marks the entry dirty (cleared on a confirmed push), so a failed inline push is retried by the background sweep — which now pushes missing OR dirty entries, skips the pass if the cloud list fails, and aborts on the first auth failure instead of hammering every entry. 3. Download perf (#3): save_remote_history_entry is now async and fetches the audio itself (reqwest, bearer auth), streaming it to disk — the multi-MB blob no longer crosses the JS<->Rust IPC as a JSON number[]. Single-device behavior is unchanged: entries are pushed-then-synced immediately (never stale, never dirty-after-push), and downloads only happen for cloud-only/ stale cards, which don't arise on one device.
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.
What
A modern, zero-build static landing page for Parley, living in
website/.Plain HTML/CSS/vanilla JS — no dependencies, no build step, never touches the Tauri app build.
Design
#5eead4 → #38bdf8 → #818cf8), Geist font, and the "P" monogram.Showcase media slots
Marked slots for your GIFs/screenshots. Drop a file into
website/assets/namedshowcase-hero,showcase-transcript,showcase-qa, orshowcase-eval(.gif/.png/.jpg/.webp/.mp4) and it auto-loads — no markup edits needed. Until then, each slot shows a styled placeholder telling you the exact filename.Deploy
.github/workflows/deploy-website.ymlpublisheswebsite/to GitHub Pages on push tomain.website/README.mddocuments local dev, the media slots, and the Cloudflare custom-domain path (DNS records, SSL Full, Enforce HTTPS).Verify
Previewed across desktop + mobile during development (hero, features, showcase rows, tech, CTA, mobile nav). No console errors except expected 404s from the media auto-probe before assets are added.
Follow-ups for the maintainer
website/assets/.website/CNAME+ Cloudflare DNS for a custom domain — seewebsite/README.md.🤖 Generated with Claude Code