$ show vordenken/AutoPiP
AutoPiP is a Safari Web Extension paired with a small Cocoa host app for macOS 13.5+. In production, it automatically enters Picture-in-Picture mode for HTML5 video when the user switches tabs (visibilitychange), switches windows (blur/focus with a 100ms delay that filters internal focus changes like clicking YouTube live chat), or scrolls a YouTube video out of view (IntersectionObserver with a 10% threshold). The toolbar popup provides a global on/off toggle, per-feature switches, blacklist/whitelist site control with full-hostname or root-domain matching, and a configurable keyboard shortcut (default ⌥P) that prefers the W3C requestPictureInPicture API and falls back to webkitSetPresentationMode. The extension is Manifest V2, which is the only option Safari currently supports, and it makes no outbound network requests beyond Sparkle update checks performed by the host app. Architecturally, the product is split into three layers: the content script (content.js) owns PiP state transitions and video discovery via priority-ordered selectors (YouTube, Disney+, Twitch, generic) with a MutationObserver-invalidated cache; the popup (popup.js) persists settings in browser.storage.local and broadcasts changes to all open tabs via runtime messages; and the Swift host app provides a first-launch onboarding flow in a WKWebView, bridges update preferences through a native message handler, and wraps Sparkle 2.9.3 with an opt-in beta channel. The release pipeline is the standout feature: semver.txt is the single source of truth, feature/* branches produce immutable beta tags, main produces stable releases, and a canonical Sparkle appcast plus Homebrew cask are updated automatically via Python scripts with atomic file replacement. The repository is actively maintained (last commit September 2026, beta release v2.1.1 in progress) with a well-instrumented CI setup: dependency-free Node.js tests execute the content script, popup, and host script inside a vm sandbox with fake DOM objects; Swift unit tests cover onboarding JSON parsing; and release-pipeline tests validate appcast/cask transformations and workflow invariants. Documentation is unusually thorough (AGENTS.md, BUILD.md, PRIVACY.md, SECURITY.md). Minor weaknesses: the UI test targets contain only Xcode template boilerplate, popup.js uses unconditional console.log in a few places, and storage keys/message names are duplicated string contracts between popup.js and content.js rather than shared constants.
The LLM identified 3 files worth highlighting for reuse:
Maintains a Sparkle update feed with strict argument validation (semver format, tag/channel consistency), beta retention capped at five entries, stable-promotion logic that removes betas for the promoted version, HTML-escaped changelog conversion, and atomic file replacement via temp file + os.replace. Uses only the Python standard library and is fully covered by tests/release-pipeline.test.js. Directly extractable into any Sparkle-based macOS release pipeline.
Updates a Homebrew cask's version and SHA-256 stanzas with streamed hashing (1MB chunks), strict validation that exactly one version and one checksum stanza exist, file-mode preservation, and atomic replacement. Rejects invalid versions and duplicate stanzas without modifying the file. A clean, reusable pattern for any cask-publishing workflow.
A novel dependency-free Node.js test harness that loads the WebExtension content script into a vm context with hand-built fake DOM, window, MutationObserver, IntersectionObserver, and browser.storage objects. It enables deterministic testing of tab-switch, window-blur, scroll, keyboard-shortcut, and site-list behaviors without a browser or test framework beyond node:test. The harness pattern (FakeEventTarget + vm.createContext + script injection) is directly reusable for testing any browser extension content script in CI.