BlueLens is an ocean-toned OSINT console for image investigation: inspect locally, upload deliberately, relay one image into many search engines, explain dead ends, and suppress bad matches during the current session.
- Local-first image review
- preview, dimensions, hashes, clean-copy generation, and metadata extraction stay local
- OCR and pivot extraction
- text extraction plus URLs, emails, handles, phones, people, organizations, locations, and dates
- Multi-engine image relay
- one upload can stage follow-up doors for:
- Google Lens
- Bing Visual Search
- Yandex Images
- TinEye
- Pinterest follow-up
- SauceNAO
- IQDB
- Baidu Image Search
- ASCII2D
- Google Images
- one upload can stage follow-up doors for:
- No-result autopsy
- when nothing useful lands, BlueLens explains likely failure modes such as:
- heavy crop
- low resolution
- generic subject matter
- stripped metadata
- blocked provider tabs
- private / unindexed imagery
- when nothing useful lands, BlueLens explains likely failure modes such as:
- False-positive suppressor
- mark bad matches and keep them suppressed for the current session
- Source contradiction panel
- if dated results disagree, BlueLens shows the conflict instead of pretending there is one clean truth
- Likely original / repost labeling
- each ingested result is tagged as a likely original, repost, scraped mirror, meme derivative, stock duplicate, or review-needed lead
- Investigation surface
- graph, timeline, sonar, and swarm views share one investigation model
- Evidence output
- report export, evidence pack export, upload provenance, OCR settings, and runtime metadata
- Batch export
- batch mode now supports reviewer-friendly JSON and CSV summaries with best match, earliest date, source URLs, confidence, duplicate count, and notes
BlueLens is designed for disciplined image triage:
- Load the image
- Inspect local signals
- Run OCR if needed
- Launch the multi-engine relay
- Ingest external hits
- Suppress junk
- Check contradictions and source labels
- Use the autopsy when the queue stays empty
The default posture is explicit and restrained:
- image load stays local
- uploads happen only when you choose a launch action
- provider URLs are temporary external artifacts
- OCR models are pulled only when OCR is invoked
BlueLens already had a launchpad; it now reads more accurately as a one upload, many doors workflow.
- Search All prepares the relay from a single public handoff URL
- the launchpad tracks queue state, blocked tabs, opened tabs, and analyst dispositions
- art-focused follow-ups such as SauceNAO, IQDB, and ASCII2D sit beside the broader web engines
- the intake queue dedupes pasted findings and now supports per-session suppression of false positives
- the intake layer now tags results as likely originals, reposts, mirrors, meme derivatives, or stock duplicates
- contradictory years across sources are surfaced as conflicts instead of being silently averaged into nonsense
Pinterest does not expose the same clean public URL handoff as the other providers, so BlueLens treats it as a best-effort follow-up door rather than a guaranteed automated match lane.
When the intake queue is empty after a relay run, BlueLens does not shrug. It performs a compact autopsy using:
- current dimensions
- crop shape
- OCR / attribution sparsity
- EXIF presence
- blocked-engine state
- staged engine coverage
This keeps “no result” from being a dead screen. It becomes a concrete explanation of why the image likely failed to match.
BlueLens now treats external results as evidence, not revelation.
- if one source says 2020 and another says 2024, the contradiction panel shows both sides
- intake results are labeled with a likely posture:
- Likely original
- Likely repost
- Scraped mirror
- Meme derivative
- Stock duplicate
- each label carries confidence and short notes so the analyst can challenge the machine instead of obeying it
This is not a claim of omniscience. It is a structured argument surface.
Drop a large set of images and BlueLens will build a sortable dashboard plus export artifacts for review.
- JSON export keeps the full per-file reports
- CSV export produces a summary table with:
- best match
- earliest date
- source URLs
- confidence
- duplicate count
- analyst notes
BlueLens expects Node.js 18 or newer.
npm startOpen:
Direct equivalent:
node server.jsRun tests:
npm test- choosing an image stays local until you launch a provider action
- upload proxy uses ranked temporary-host failover
- OCR model files load from a CDN on first use
- Browser-loaded libraries: BlueLens loads external libraries (exifr, Tesseract.js, SparkMD5, sha256) directly in the browser via CDN for flexibility and to keep the server-side footprint minimal. These are not listed as npm dependencies because they're browser-loaded, not bundled.
- capture-time exports preserve raw value, normalized value, source field, and timezone ambiguity notes
- the evidence pack includes report data and reproducibility metadata
BLUELENS_ALLOW_PRIVATE_FETCH=1is for controlled local testing only
npm run desktop-iconOr double-click bluelens-start.cmd.
The start script waits for /api/ping before opening the browser.
For detailed documentation, see the docs/ folder:
- Architecture: System design and component overview
- API Documentation: Server endpoints and client functions
- Deployment Guide: Installation, production setup, and monitoring
- Modularization Notes: Code organization strategy
Install development tools:
npm installRun tests:
npm testRun tests with coverage:
npm run test:coverageLinting:
npm run lint
npm run lint:fixFormatting:
npm run format:check
npm run format
