Bulk download your pet's photos from Rover.com. One click, one zip file, full quality.
Install it here – just drag a button to your bookmarks bar.
Rover.com has no bulk photo download. You can only view photos one at a time in a slideshow. This bookmarklet paginates Rover's internal API, fetches every image at full quality, zips them up, and triggers a single download.
- Extracts the pet's opk (identifier) from the
/dogs/{opk}/URL path - Paginates
/api/v7/pets/{opk}/images/to collect all photo metadata - Shows a confirmation modal with photo count, date range, and filter controls
- Downloads photos in parallel (concurrency: 3 workers — balances speed vs rate-limiting)
- Strips CDN query params from image URLs to get the original full-quality file
- Builds a zip in-memory using JSZip with
STOREcompression (JPEGs are already compressed) - Triggers a browser download via Blob URL
The bookmarklet is entirely self-contained — JSZip is bundled into the minified output by esbuild. No external scripts are loaded at runtime.
- No server — everything runs in your browser tab
- No tracking — no analytics, no cookies, no external requests beyond Rover's own API and CDN
- No data leaves your browser — photos go straight from Rover's CDN into a local zip file
- Your credentials stay local — uses your existing Rover.com login session; no passwords are accessed or stored
- Open source — read every line of code in
src/rover-dumper.js
| Browser | Status |
|---|---|
| Chrome | Supported |
| Firefox | Supported |
| Edge | Supported |
| Safari | Supported (drag-to-install may vary) |
| Mobile | Not supported (bookmarklets require a desktop browser) |
npm install # Install dependencies (jszip + esbuild)
npm run setup # Enable pre-commit auto-build
npm run build # Bundle + minify -> dist/rover-dumper.min.js
npm run release:check # Verify tests and version-bearing output
npm version <major|minor|patch> # Verify, bump, rebuild, commit, tag, and pushA pre-commit hook in hooks/ automatically rebuilds and stages dist/ and index.html whenever src/ changes are committed. Run npm run setup after cloning to enable it.
build.sh bundles JSZip into the bookmarklet source via esbuild as a single IIFE, strips template literals and license comments for single-line output, then injects the result into index.html between marker comments. The % character is pre-encoded as %25 in the HTML href to prevent browsers from misinterpreting JS modulo expressions as URL escape sequences.
Dependabot pull requests build dist/rover-dumper.min.js, index.html, and sitemap.xml in read-only CI. After that run succeeds, a default-branch workflow validates the Dependabot actor, same-repository npm branch, pull request file allowlist, exact head revision, and artifact contents before committing only those generated files. The write-enabled workflow never executes pull request code and explicitly dispatches CI for its generated-file commit.
Use npm version as the only release entrypoint. npm version <major|minor|patch> runs the clean-main and remote-synchronization guard, repeats the release check, updates the version-bearing bookmarklet and landing-page files, creates the version commit and annotated v<version> tag, and pushes both refs atomically. The tag-triggered GitHub Actions workflow verifies the exact tagged bookmarklet and creates the published GitHub Release; an explicit workflow dispatch can safely retry an existing tag.
npm run screenshots captures the built bookmarklet's confirmation dialog with fabricated photo metadata and no live Rover requests. CI runs the build and tests before capture, retains the PNG as an artifact, and publishes only a changed docs/screenshots/cover.png after successful default-branch verification. Pull requests render without publishing. A superseded source revision cannot overwrite the newer build's cover.
The project cover is rendered at 4x pixel density while preserving its logical viewport, so enlarged previews retain more detail. Higher density does not increase the displayed text size; use zoom to inspect small labels.
