Repository navigation
New demo site, docs page, OG image; switch to oxlint/oxfmt - #30
Conversation
- Replace the Vite demo with a static timber app: plain <audio> vs gapless.js comparison, full concert player, quick start and a /docs page with server-rendered syntax highlighting (sugar-high) - Shared site header, new icon, README icon and regenerated graph (HTML5 -> Web Audio on track one, Web Audio after) - Swap ESLint for oxlint + oxfmt and run lint/format checks in CI - Library and test updates Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- opengraph-image.tsx at the app root (takumi), inherited by every page; metadataBase makes og:image absolute, plus a large Twitter card - alpha.220 keeps the dev client off static mode, so drop the server/static switch in timber.config.ts Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Deploying gapless with
|
| Latest commit: |
84aaad5
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://eee0ed64.gapless-e1l.pages.dev |
| Branch Preview URL: | https://demo-site-and-docs.gapless-e1l.pages.dev |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 22ac29b19c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const ctx = new AudioContext(); | ||
| this.ctx = ctx; |
There was a problem hiding this comment.
Defer the native AudioContext creation until interaction
When the demo is opened in a browser that enforces autoplay restrictions, connect() runs from a mount effect and constructs this AudioContext before any user gesture. Chrome consequently suspends it and emits the same automatic-start warning the library is designed to avoid; this also needlessly consumes a context for visitors who never use the comparison player. Create it lazily from toggle()/seek() on the first interaction, then install the worklet and connect the elements.
Useful? React with 👍 / 👎.
Addresses Codex review: the context was created on mount, before any user gesture, which tripped Chrome's autoplay warning. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e487ca9d99
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <p className="font-semibold text-zinc-600 dark:text-zinc-100 flex gap-2"> | ||
| A complete gapless.js concert | ||
| </p> | ||
| <FullShow /> |
There was a problem hiding this comment.
Rebind media controls when the active player changes
In browsers with Media Session controls, mounting both <GaplessDemo /> and <FullShow /> creates two Queue instances, while each constructor overwrites the same global handlers in setupMediaSession() (src/Queue.ts:233-241). Whichever queue mounts last therefore receives every pause, seek, and track action even when the other demo is playing; for example, pausing the sample from a lock screen operates on the idle full-show queue and leaves the sample playing. Route these handlers through the player selected by claimPlayback, or re-register them whenever ownership changes.
Useful? React with 👍 / 👎.
Media Session action handlers are page-global, and each Queue registered them only in its constructor, so with several queues on one page the last one constructed received every lock-screen and media-key action. Re-register the handlers and metadata whenever a queue starts playing. Addresses Codex review on #30. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 84aaad5e54
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (!q) return; | ||
| this.lastProgress.clear(); | ||
| claimPlayback(this.id); | ||
| q.resumeAudioContext().then(() => fn(q)); |
There was a problem hiding this comment.
Revalidate playback ownership after AudioContext resume
When the shared AudioContext is suspended, playback starts asynchronously after ownership is claimed. If the user starts this player and then starts the native or other gapless player before resumeAudioContext() settles, the second player takes ownership and begins playing, but this stale callback subsequently invokes fn(q) without checking ownership and starts the first player too. Cancel superseded callbacks or reclaim ownership immediately before starting playback so rapid player switches cannot leave multiple demos playing.
Useful? React with 👍 / 👎.
Summary
Demo site (
demo/)<audio>vs gapless.js comparison, a full concert player, a quick start, and a new/docspagemetadataBasesoog:imageis absolute@timber-js/appto0.2.0-alpha.220, which keeps the dev client out of static mode, sotimber.config.tsno longer switches between server and static outputRepo
lib/graph.sh)pnpm lintandpnpm fmt:checksrc/andtests/The docs page is AI generated and says so in a callout at the top.
Testing
pnpm lint,pnpm fmt:check,pnpm test(349 passing),pnpm buildtsc --noEmitandtimber build;timber devserves/,/docs, the OG image and RSC payloads🤖 Generated with Claude Code