defunkt/dotjs
~/.js
Stale — last commit 8y ago
worst of 4 axeslast commit was 8y ago; no tests detected…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 8y ago; no CI workflows detected
- ✓30+ active contributors
- ✓MIT licensed
- ⚠Stale — last commit 8y ago
Show 3 more →Show less
- ⚠Concentrated ownership — top contributor handles 56% of recent commits
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; add a test suite
- →Fork & modify Mixed → Healthy if: add a test suite
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/defunkt/dotjs)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/defunkt/dotjs on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: defunkt/dotjs
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/defunkt/dotjs shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 8y ago
- 30+ active contributors
- MIT licensed
- ⚠ Stale — last commit 8y ago
- ⚠ Concentrated ownership — top contributor handles 56% of recent commits
- ⚠ No CI workflows detected
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live defunkt/dotjs
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/defunkt/dotjs.
What it runs against: a local clone of defunkt/dotjs — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in defunkt/dotjs | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 2874 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of defunkt/dotjs. If you don't
# have one yet, run these first:
#
# git clone https://github.com/defunkt/dotjs.git
# cd dotjs
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of defunkt/dotjs and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "defunkt/dotjs(\\.git)?\\b" \\
&& ok "origin remote is defunkt/dotjs" \\
|| miss "origin remote is not defunkt/dotjs (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift — was MIT at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "ext/manifest.json" \\
&& ok "ext/manifest.json" \\
|| miss "missing critical file: ext/manifest.json"
test -f "ext/dotjs.js" \\
&& ok "ext/dotjs.js" \\
|| miss "missing critical file: ext/dotjs.js"
test -f "bin/djsd" \\
&& ok "bin/djsd" \\
|| miss "missing critical file: bin/djsd"
test -f "ext/jquery.js" \\
&& ok "ext/jquery.js" \\
|| miss "missing critical file: ext/jquery.js"
test -f "README.markdown" \\
&& ok "README.markdown" \\
|| miss "missing critical file: README.markdown"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 2874 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~2844d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/defunkt/dotjs"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
dotjs is a macOS-only Chrome extension that automatically executes user-written JavaScript files from ~/.js against websites based on domain matching. When you visit google.com, it loads and runs ~/.js/google.com.js; for subdomains like gist.github.com, it tries gist.github.com.js, github.com.js, and com.js in sequence. It includes jQuery 1.9 by default and runs a Ruby web server on localhost:3131 to serve these files to the extension. Simple two-tier architecture: (1) Ruby backend (bin/djsd) runs a tiny web server on port 3131 serving files from ~/.js. (2) Chrome extension (ext/manifest.json, ext/dotjs.js) injects jQuery and makes AJAX requests to localhost:3131 to fetch and execute domain-matched JS files. LaunchAgent (com.github.dotjs.plist) auto-starts the Ruby server.
👥Who it's for
Power users and web developers on macOS who want to customize favorite websites with client-side JavaScript without publishing GreaseMonkey scripts or managing browser extensions—think developers who need quick tweaks to GitHub's UI or Google's layout on the fly.
🌱Maturity & risk
This project is archived and unmaintained (README explicitly states this). It targets OS X with Ruby 1.8, uses jQuery 1.9, and was designed for Chrome extensions circa 2012–2014. The successor project Witchcraft is recommended for active use. Not suitable for new projects; use only as historical reference or for legacy macOS systems.
Critical risks: (1) Project is officially abandoned—no active maintenance or security updates. (2) OS X only—requires macOS and specific LaunchAgent plist setup; zero cross-platform support. (3) Outdated dependencies—jQuery 1.9, Ruby 1.8, Chrome extension manifest v2 (deprecated). (4) Single maintainer (defunkt/Ryan Tomayko)—no active community. Not recommended for production use.
Active areas of work
Nothing—this project is archived. No active development, no recent commits, no open PRs or milestones. The README directs users to the Witchcraft successor project instead.
🚀Get running
git clone https://github.com/defunkt/dotjs
cd dotjs
rake install
Then open https://localhost:3131 in Chrome, manually trust the self-signed certificate via Keychain, and install the extension from the Chrome Web Store (http://bit.ly/dotjs). Requires macOS, Ruby, rake, and Google Chrome.
Daily commands:
The Rakefile contains install/uninstall targets. Post-install, the LaunchAgent (~/Library/LaunchAgents/com.github.dotjs.plist) auto-starts the Ruby server. Manual start: ruby bin/djsd. The extension communicates with localhost:3131 automatically; no additional dev server startup needed.
🗺️Map of the codebase
ext/manifest.json— Chrome extension manifest that defines permissions, content scripts, and extension metadata—required for the extension to load and function.ext/dotjs.js— Core content script that executes user JavaScript files from ~/.js based on domain matching logic—the heart of the extension.bin/djsd— Daemon script that serves JavaScript files from ~/.js directory to the extension—handles local file serving and domain-to-file mapping.ext/jquery.js— jQuery 1.9 dependency bundled with extension to ensure jQuery is available in all injected scripts regardless of site support.README.markdown— Documents the core concept, usage patterns, and subdomain resolution logic that inform how the extension matches domains to JavaScript files.com.github.dotjs.plist— macOS LaunchAgent configuration that ensures djsd daemon runs persistently in the background.Rakefile— Build and installation orchestration—defines how the extension is packaged and installed into Chrome.
🧩Components & responsibilities
- Chrome Extension (dotjs.js) (Chrome Content Scripts API, DOM manipulation, HTTP fetch) — Detects page load, parses current domain, generates cascade file list, fetches scripts from djsd, injects jQuery, executes user scripts.
- Failure mode: If djsd is not running, all file requests fail silently (404 handled gracefully); page loads normally without customizations.
- djsd Daemon (Ruby HTTP server, filesystem I/O) — Listens on localhost HTTP port, maps incoming domain-based requests to ~/.js file lookups, serves file contents or 404.
- Failure mode: If daemon crashes or is not running, extension cannot fetch scripts; user must manually restart djsd or reboot.
- Manifest & LaunchAgent (Chrome manifest.json, macOS plist) — Declares extension permissions, content script scope, and auto-start configuration for daemon.
- Failure mode: Misconfiguration prevents extension load in Chrome or daemon startup on login; requires manual remediation.
- jQuery Bundle (jQuery 1.9 library) — Injected into every page before user scripts run; provides DOM query and manipulation API.
- Failure mode: If jQuery injection fails, user scripts will error on jQuery calls; page may break.
🔀Data flow
Browser (user navigation)→Chrome Extension— User visits URL; Chrome fires content_scripts matching domain.Chrome Extension→djsd Daemon (localhost)— Extension sends HTTP GET requests for domain-matched .js filenames (e.g., /default.js, /google.com.js).djsd Daemon→Filesystem (~/.js)— Daemon looks up .js files; reads content and returns to extension or 404 if not found.djsd Daemon→Chrome Extension— Daemon returns file contents as plain text/JavaScript.Chrome Extension→Page DOM— Extension injects jQuery library, then evaluates downloaded .js scripts in page global context.User Scripts→Page DOM— User scripts execute, modifying DOM, adding event listeners, or injecting content via jQuery.
🛠️How to make changes
Add a custom script for a new website
- Create a new .js file in ~/.js named after the domain you want to customize (
~/.js/example.com.js (user-created, not in repo)) - Add JavaScript code that will be executed when you visit that domain; jQuery is pre-loaded (
~/.js/example.com.js (user-created)) - Optionally add shared utilities to ~/.js/default.js which loads on every page (
~/.js/default.js (user-created))
Modify domain-to-file matching logic
- Edit the domain parsing and cascade logic in the content script (
ext/dotjs.js) - Update manifest if new permissions or content script patterns are needed (
ext/manifest.json) - Rebuild the extension using Rakefile and reload in Chrome (
Rakefile)
Install or upgrade the extension
- Ensure djsd daemon is configured to start on system boot (
com.github.dotjs.plist) - Run build and installation tasks (
Rakefile) - Extension is loaded into Chrome; djsd runs in background serving files from ~/.js (
ext/manifest.json)
🔧Why these technologies
- Google Chrome Extension API — Native browser integration without extra software; content scripts run in page context with DOM access.
- jQuery 1.9 — Bundled to guarantee DOM manipulation is easy for user scripts, even on sites that don't use jQuery.
- Local HTTP Daemon (djsd) — Securely serves user's local ~/.js files to extension without exposing entire filesystem; works around Chrome's file:// restrictions.
- macOS LaunchAgent (plist) — Standard macOS mechanism to auto-start background daemon on login without user intervention.
⚖️Trade-offs already made
-
Domain-based file naming + cascade matching
- Why: Simple mental model: google.com → google.com.js, gist.github.com → gist.github.com.js + github.com.js + com.js.
- Consequence: No fine-grained URL path matching; entire domain shares one script. Users cannot target subpaths or query parameters.
-
Background daemon (djsd) instead of bundled file serving
- Why: Allows users to add/edit ~/.js files without reloading extension; live development experience.
- Consequence: Adds startup complexity and macOS-specific configuration; requires djsd to always be running.
-
Content script injection over iframe sandbox
- Why: Full DOM access and page context integration; user scripts can modify site behavior seamlessly.
- Consequence: Security boundary is weaker; malicious ~/.js files can access page cookies/tokens; only suitable if user controls ~/.js.
-
jQuery 1.9 (2012 version) as bundled dependency
- Why: Lightweight, reliable, reduces site load time compared to fetching from CDN.
- Consequence: Outdated jQuery API; misses modern features and security patches; not compatible with modern site frameworks.
🚫Non-goals (don't propose these)
- Cross-browser support (Chrome-only extension; archived and unmaintained)
- Real-time synchronization of ~/.js files across machines
- User authentication or permission system for ~/.js scripts
- Conditional script loading based on URL path or query parameters
- Script versioning or rollback mechanisms
- GUI for managing scripts (file-system based only)
⚠️Anti-patterns to avoid
- Silent failure on file not found (Medium) —
ext/dotjs.js: When djsd returns 404 for a domain file, no error is logged or reported; user has no feedback if script failed to load. - Hardcoded localhost port (Medium) —
ext/dotjs.js: Extension assumes djsd listens on fixed localhost port; if port is in use or daemon runs elsewhere, extension silently fails. - No Content Security Policy (CSP) handling —
ext/manifest.json: undefined
🪤Traps & gotchas
(1) Self-signed certificate required: Ruby server uses HTTPS on port 3131 with a self-signed cert; you must manually trust it in macOS Keychain or the extension will fail silently. (2) macOS LaunchAgent path: installation expects ~/Library/LaunchAgents to exist and assumes you can write there. (3) Ruby 1.8 constraint: the code likely uses old Ruby syntax; won't run on Ruby 2.0+. (4) Chrome Manifest V2 deprecated: Google has removed MV2 support; the extension won't work in modern Chrome versions. (5) Port 3131 conflict: if another service uses port 3131, the server fails with no fallback.
🏗️Architecture
💡Concepts to learn
- Content Script Injection — dotjs's core mechanism: ext/dotjs.js runs in the browser context of every page and dynamically loads/executes user scripts. Understanding this is essential to modifying extension behavior.
- Local Proxy Server Pattern — The Ruby server on localhost:3131 acts as a bridge between the sandboxed Chrome extension and the local filesystem (~/.js), circumventing the browser's file:// protocol security model.
- Domain Hierarchical Fallback — dotjs matches subdomains by trying progressively shorter domain components (gist.github.com → github.com → com), allowing cascading script inclusion. This pattern is non-obvious and critical to understanding how scripts compose.
- macOS LaunchAgent — The com.github.dotjs.plist file registers a persistent background service in ~/Library/LaunchAgents, auto-starting the Ruby server on login. Essential for understanding system-level integration on macOS.
- Chrome Extension Manifest V2 — ext/manifest.json defines permissions and content script behavior using MV2 spec (now deprecated). Understanding MV2's content_scripts, permissions, and background page model is necessary to modify the extension.
- Self-Signed Certificate HTTPS — The Ruby server uses HTTPS with a self-signed certificate on port 3131. The extension must trust this cert at the OS level (Keychain), introducing a manual trust-on-first-use workflow.
- Ruby Rake Build Automation — The Rakefile orchestrates multi-step installation: copying plist to LaunchAgents, reloading the LaunchAgent, and installing the Chrome extension. Understanding task dependencies and Ruby file operations is necessary to maintain or modify install logic.
🔗Related repos
luciopaiva/witchcraft— The official successor to dotjs—cross-platform (macOS, Linux, Windows), actively maintained, and recommended in this repo's README as the replacementglenbot/dotjs-ubuntu— Community Linux port of dotjs; shows how the pattern was adapted for non-macOS systems with systemd or cron-based server startupp3lim/dotjs-universal— Windows reimplementation of dotjs; demonstrates the same domain-file-matching paradigm ported to Windows with different service management (likely Task Scheduler)rlr/dotjs-addon— Firefox add-on version; shows the same core idea (domain-based JS execution) adapted to Firefox's extension API, useful for understanding cross-browser patternsdefunkt/tinder— By the same author (Ryan Tomayko); exemplifies the 'tiny Ruby service' philosophy that dotjs embodies—minimal, focused, do-one-thing-well utilities
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add automated tests for ext/dotjs.js content script execution logic
The core extension logic in ext/dotjs.js handles URL matching, file loading, and script injection for domain-specific and default.js execution. There are no visible test files in the repo, making it risky to refactor or verify the filename matching algorithm (e.g., gist.github.com → load gist.github.com.js + github.com.js + com.js). Adding unit tests would prevent regressions and make the codebase more maintainable for future contributors.
- [ ] Create test/ directory with test runner (e.g., using Jest or Mocha)
- [ ] Write tests for URL-to-filename mapping logic in ext/dotjs.js (subdomain matching)
- [ ] Write tests for jQuery injection and script loading order
- [ ] Add npm test script to Rakefile or package.json
Create CONTRIBUTING.md with setup instructions for local development and testing
The HACKING file exists but the repo lacks clear contribution guidelines. New contributors need to know: how to load the extension locally in Chrome, how to test changes to ext/dotjs.js, what the bin/djsd daemon does, and the relationship between com.github.dotjs.plist (macOS property list) and the extension. This is critical for an archived project receiving PRs.
- [ ] Document how to load ext/ as an unpacked Chrome extension
- [ ] Explain the purpose of bin/djsd and com.github.dotjs.plist for macOS integration
- [ ] Document the ~/.js directory structure and filename conventions
- [ ] Add troubleshooting section for common issues (e.g., jQuery conflicts, CSP violations)
Add manifest.json v3 migration guide or compatibility layer in ext/manifest.json
The extension currently uses Chrome Manifest V2 (deprecated since 2022, removed in 2024). The ext/manifest.json file needs to be updated to Manifest V3 to remain functional. This is a high-impact PR since the extension is now non-functional on modern Chrome. A migration guide or updated manifest would restore usability and serve as a reference for users of the archived project.
- [ ] Review current ext/manifest.json against Manifest V3 specification
- [ ] Update permissions and host_permissions keys for V3 compliance
- [ ] Migrate content script injection to use dynamic content scripts (scripting API)
- [ ] Create MIGRATION.md documenting breaking changes and how to adapt user scripts
- [ ] Test with Chrome 127+ to verify functionality
🌿Good first issues
- Add comprehensive test coverage for bin/djsd: Currently no test/ or spec/ directory exists. Write Ruby tests (RSpec or Minitest) to cover file serving, domain matching logic (e.g., gist.github.com → gist.github.com.js + github.com.js + com.js), and default.js loading.
- Document the certificate setup process with screenshots: The README describes dragging cert icons to Keychain but lacks images or step-by-step clarity. Create a CERTIFICATE_SETUP.md with actual screenshots and common error messages (e.g., 'certificate validation failed').
- Add E2E test: Create a test that spawns the Ruby server, starts Chrome headless, navigates to a test domain (via localhost mapping or test server), and verifies that a script in ~/.js/test-domain.js was executed. This would catch breakage in the extension or server quickly.
⭐Top contributors
Click to expand
Top contributors
- @defunkt — 56 commits
- @chris123457 — 9 commits
- @arvindsv — 4 commits
- @tmuellerleile — 3 commits
- @theshortcut — 2 commits
📝Recent commits
Click to expand
Recent commits
434eaba— dotjs is dead. long live witchcraft (defunkt)bde001e— Merge pull request #109 from ghost/optimize-via-picabot (defunkt)b27ef6a— Merge pull request #110 from jayproulx/master (defunkt)1671ee2— Merge pull request #113 from crzidea/patch-1 (defunkt)6dfbbca— Merge pull request #121 from Jimbly/patch-1 (defunkt)87afab0— Merge pull request #111 from maena/master (defunkt)f29ebff— Make the URL in the setup instructions a clickable link (Jimbly)bfd2fab— Change header format (crzidea)7b71c5b— Update README (maena)812588d— Add jquery.min.map (Jay Proulx)
🔒Security observations
dotjs has critical security vulnerabilities centered around arbitrary local JavaScript execution without proper sandboxing, validation, or code signing. The automatic jQuery 1.9 injection introduces known vulnerabilities. Most critically, the project is archived and unmaintained, meaning no security updates will be provided. The extension's core design of loading and executing user-controlled scripts from the filesystem with browser privileges poses inherent risks. Users should migrate to maintained alternatives immediately. This codebase should not be used in any security-sensitive context.
- Critical · Arbitrary JavaScript Execution from Filesystem —
ext/dotjs.js, core functionality. dotjs executes JavaScript files from ~/.js directory based on domain names without apparent sandboxing or validation. An attacker with local filesystem access could place malicious scripts in ~/.js/ to execute arbitrary code in the context of any visited website. This allows complete compromise of user data, credentials, and browsing activity. Fix: Implement strict code validation, sandboxing, and digital signatures for loaded scripts. Consider restricting to explicitly whitelisted domains. Provide user confirmation before executing scripts. - Critical · No Content Security Policy (CSP) —
ext/manifest.json. As a Chrome extension, dotjs likely lacks proper CSP headers in manifest.json. This increases vulnerability to injection attacks and unauthorized script execution within the extension context. Fix: Implement strict Content Security Policy in manifest.json. Use 'script-src' to restrict script sources and avoid 'unsafe-inline' and 'unsafe-eval'. - High · Local File Access Without Validation —
ext/dotjs.js. The extension reads JavaScript files from ~/.js/ directory without apparent validation of file contents or origin verification. Symlink attacks or file tampering could lead to execution of unintended code. Fix: Validate file integrity using checksums or signatures. Implement strict permission checks. Prevent symlink traversal attacks by validating canonical paths. - High · jQuery Library Injection —
ext/dotjs.js, bonus feature. The extension automatically injects jQuery 1.9 on every page. jQuery 1.9 is severely outdated (released 2013) and contains multiple known vulnerabilities. This could be exploited via XSS vectors. Fix: Update jQuery to the latest stable version or remove automatic jQuery injection. If injected, use Content Security Policy to restrict its scope and capabilities. - High · Archived/Unmaintained Project —
README.markdown. Project is explicitly archived and no longer maintained. No security patches or updates will be provided. Known vulnerabilities discovered post-archival will never be fixed. Fix: Users should migrate to the maintained successor 'Witchcraft' or other actively maintained alternatives. Do not use in production or security-sensitive environments. - Medium · Potential XSS in Script Execution —
ext/dotjs.js. If user-controlled data from webpage is used to construct script names or passed to eval-like functions, XSS vulnerabilities could occur. Fix: Use Content Security Policy to prevent inline script execution. Avoid eval() or dynamic script generation. Use strict input validation for any domain-based file matching. - Medium · Missing Security Headers in Extension Manifest —
ext/manifest.json. No visible security directives in manifest.json (permissions, host permissions not shown). Extension may request excessive permissions beyond its functionality. Fix: Audit and minimize requested permissions. Use narrow host_permissions instead of wildcard patterns. Document why each permission is necessary. - Low · Outdated Dependencies Documentation —
ext/jquery.js. jQuery 1.9 included in the extension is from 2013. While specific vulnerabilities depend on context, best practices recommend current versions. Fix: If jQuery must be included, update to the latest 1.x or 3.x version. Evaluate if jQuery is still necessary for modern browser APIs.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.