ImageFetch is a single-page web app that fetches and previews site image assets:
- Favicons
- Apple touch icons
- Header images (including a first-image fallback)
It preserves source bytes for download/copy when available and presents grouped results with variant navigation.
The app is intentionally dependency-light:
- Frontend: plain HTML/CSS/JS in one file (
index.html) - Backend: Node built-ins only (
server.js)
- URL input with local history (last 15 sites)
- Auto-https for bare domains (example:
example.com) - Grouped browsing for favicon / apple-touch / header image variants
- Copy image to clipboard (with PNG fallback)
- Download original file
- Metadata per asset (dimensions, type, size, MIME, aspect ratio, source)
- Options for max images, timeout, and header scan depth
cd ImageFetch
node server.jsOpen: http://127.0.0.1:8788
cd ImageFetch
just docker-build
just docker-runcd ImageFetch
docker pull ghcr.io/jtbrough/imagefetch:latest
docker run --rm --name ImageFetch -p 8788:8788 ghcr.io/jtbrough/imagefetch:latestcd ImageFetch
docker compose upIf your system uses the legacy binary:
docker-compose upjust --listCurrent commands:
just run- run Node server directlyjust test- run fixture-based extraction testsjust corpus-fetch- fetchtests/corpus/urls.txtinto local corpus fixturesjust test-corpus- run extraction tests against fetched corpus fixturesjust corpus-report- generate per-site detected-image report from fetched corpusjust docker-build- build latest container imagejust docker-run- run hardened containerjust ci-lint- lint GitHub Actions workflowsjust ci-act-list- list localactworkflow jobsjust ci-act-validate- run localactvalidate jobjust ci-act-docker-build- run localactdocker-build jobjust ci-checks- run lint + core local CI jobs
Environment variables:
HOST(default127.0.0.1)PORT(default8788)IMAGEFETCH_RUNTIME(defaultlocal, container setscontainer)MAX_HTML_BYTES(default2097152)MAX_ASSET_BYTES(default26214400)MAX_REQUEST_TARGET_CHARS(default4096)APK_UPGRADE_ON_START(default1, set0to skipapk update && apk upgradeat container startup)
App version is read from the VERSION file at server startup.
Use this to validate extraction behavior against a real-world URL corpus:
- Add target URLs to
tests/corpus/urls.txt(one per line) - Fetch snapshots:
just corpus-fetch
- Run corpus tests:
just test-corpus
- Generate a detection report:
just corpus-report
Fetched snapshots are stored in tests/fixtures/corpus/ with an index manifest at tests/fixtures/corpus/index.tsv.
Detection report is written to tests/fixtures/corpus/report.tsv.
- SSRF protections block localhost/private address targets
- Only
GETendpoints are allowed - Request target length is capped
- HTML and asset response sizes are capped
- Non-image assets are rejected on
/api/asset - Security headers are set for all responses
- Create a branch
- Make focused changes
- Validate locally
- Open a PR with a summary and test notes
MIT. See LICENSE.
