LostDock is an industry-grade, cross-platform Google-dorking desktop tool built in Python. It gives you a visual query builder for every search-engine operator, multi-engine execution with rate limiting and proxy rotation, persistent result storage, live URL re-checking, recurring scheduled dorks, regex highlighting, and a plugin system — all in a native PySide6 (Qt) UI that runs on Windows, macOS, and Linux.
Read this README in: 中文 · Español · Français · Deutsch · हिन्दी · Português · Русский · 日本語 · 한국어 · Italiano · العربية
- Features
- Screenshot
- Architecture
- Installation
- Usage
- Supported Operators
- Search Engines
- Proxies
- Scheduled Dorks
- URL Re-checking
- Plugins
- Export
- Data Storage
- Packaging
- Development
- Disclaimer
- License
- Visual dork builder — compose queries from keywords, exact phrases, boolean logic
(
AND/OR/NOT), exclusions, required terms, sites, file types, and every Google operator, with a live query-preview. - Multi-engine — Google, DuckDuckGo, and Bing adapters behind one interface; pick any in the UI.
- Rate limiting & anti-block — token-bucket limiter with jitter, rotating User-Agents, exponential retries, and CAPTCHA/bot-check detection.
- Proxy rotation — pool of proxies with round-robin rotation, failure cooldown, and validation.
- Persistent storage — every job and result stored in SQLite, deduplicated across engines.
- Live URL re-checking — re-fetch stored URLs and annotate status code / content type / title.
- Scheduled dorks — run saved dorks on a recurring interval in the background.
- Regex highlighting — instantly highlight rows matching a pattern.
- Filters — domain whitelist/blacklist and URL-regex keep-filters applied on export.
- Export — JSON, CSV, Markdown, and a styled self-contained HTML report.
- Saved dork library — name, save, load, and delete dorks.
- Plugin system — drop Python modules into
~/.lostdock/plugins/withsetup,on_result, andon_exporthooks. - Cross-platform — single codebase packaged for Windows (
.exe), macOS (.app), and Linux.
┌─ UI Layer (PySide6/Qt) ───────────────────────────────┐
│ Dork Builder │ Results Grid │ Scheduler │ Settings │
└───────────────┬────────────────────────────────────────┘
┌───────────────▼────────────────────────────────────────┐
│ Service Layer │
│ Repository │ Query │ Filter │ Crawler │ Scheduler │
│ Exporter │ Plugins │
└───────────────┬────────────────────────────────────────┘
┌───────────────▼────────────────────────────────────────┐
│ Core Engine │
│ Adapters (Google / DuckDuckGo / Bing) │
│ Rate Limiter │ Proxy Pool │ Compiler │ Operators │
└───────────────┬────────────────────────────────────────┘
┌───────────────▼────────────────────────────────────────┐
│ SQLite (jobs, results, saved dorks, schedules) │
└─────────────────────────────────────────────────────────┘
Installation instructions are intentionally provided in English only.
- Python 3.10+ — python.org
- uv (fast package manager) — docs.astral.sh/uv
# 1. Clone the repository
git clone https://github.com/your-user/lostdock.git
cd lostdock
# 2. Create a virtual environment and install
uv venv
uv pip install -e ".[dev]"
# 3. Install the headless Chromium used by the Google engine's anti-block fallback
uv run python -m playwright install chromium
# 4. Run
uv run lostdockIf you do not have uv, you can use plain pip:
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
python -m playwright install chromium
lostdockcd src
QT_QPA_PLATFORM=offscreen python -m lostdock.main # offscreen for headless testing- Build a query — type keywords, add an exact phrase, exclusions,
AND/ORterms, sites (site:), file types, and inline operators. The compiled query updates live. - Pick an engine (Google / DuckDuckGo / Bing) and the number of pages.
- Click Run Search. Results stream into the table; every result is persisted to SQLite.
- Use Re-check URLs to fetch each result and annotate its live status.
- Set a Highlight regex to spotlight interesting rows.
- Click Export... to save as JSON, CSV, Markdown, or an HTML report.
The builder supports the full Google operator set:
| Operator | Meaning |
|---|---|
site: |
Restrict results to a domain |
inurl: / allinurl: |
Words in the URL |
intitle: / allintitle: |
Words in the title |
intext: / allintext: |
Words in the body text |
inanchor: |
Words in link anchor text |
filetype: / ext: |
Restrict to a file type |
cache: |
Google's cached version |
link: |
Pages linking to a URL |
related: |
Similar pages |
info: |
Page overview |
define: |
Definition of a term |
author: |
Author of a result |
daterange: / numrange: |
Numeric ranges |
loc: |
Location |
after: / before: |
Date filters (YYYY-MM-DD) |
lang: |
Language restriction |
"phrase" |
Exact phrase |
-term |
Exclude a term |
~term |
Include synonyms |
* |
Wildcard |
term1 OR term2 |
Either term |
All engines share the same interface (SearchEngine in adapters/base.py) and are
rate-limited by default. Add a new engine by subclassing SearchEngine and registering it
in adapters/__init__.py.
Note on Google: Google restricts automated access. The Google adapter first tries plain HTTP scraping; if Google responds with a CAPTCHA / rate-limit block, it automatically re-renders the SERP in a real headless Chromium (via Playwright), which defeats Google's behavioral bot-detection on most residential networks. On datacenter IPs Google may block at the IP level regardless — add proxies in Tools → Settings, or use another engine. Requires the Chromium binary once (
python -m playwright install chromium). For fully compliant production use, integrate the Google Custom Search JSON API (100 free queries/day).
Set proxies in Tools → Settings. One per line:
http://127.0.0.1:8080
socks5://127.0.0.1:1080
Proxies rotate per request; failed proxies go into a cooldown period. Run the
"validate" path (in code, ProxyPool.validate()) to drop dead proxies.
- Save a dork (name it in the "Dork name" field).
- In Tools → Settings, select the dork, set an interval in minutes, and save.
- A background scheduler runs due dorks, stores results as new jobs, and bumps the next run.
The Re-check URLs button fetches every URL in the current results with politeness delays
and annotates each row with status code, content type, and a live <title>. Failures are
annotated inline and never crash the UI.
Drop *.py files into ~/.lostdock/plugins/ (or the bundled plugins/ directory).
A plugin module may export any subset of:
NAME = "my_plugin"
def setup(app): ... # once at startup
def on_result(result): return result # return None to drop the result
def on_export(results, fmt, path): ... # before exportSee plugins/example_skip_tracking.py for a working example.
| Format | Extension | Notes |
|---|---|---|
| JSON | .json |
Full structured results |
| CSV | .csv |
Spreadsheet-ready (UTF-8 BOM) |
| Markdown | .md |
Human-readable |
| HTML | .html |
Self-contained report, clickable links |
- Database:
~/.lostdock/lostdock.db(SQLite) - Plugins:
~/.lostdock/plugins/ - Tables:
jobs,results,saved_dorks,schedules. Old databases migrate automatically.
The project includes a lostdock.spec for PyInstaller. Build per-platform:
uv pip install pyinstaller
pyinstaller lostdock.spec # creates dist/lostdock- Windows:
dist/lostdock.exe(or--onefile) - macOS: bundle into
dist/lostdock.app(sign withcodesignfor distribution) - Linux:
dist/lostdockbinary, or wrap in an AppImage/Flatpak
Releases are tag-driven and automated. Cutting a new release requires git-cliff
(cargo install git-cliff):
make release # bumps the version, regenerates CHANGELOG.md, commits and tagsmake release reads the conventional commits since the last tag to pick the next
semver version (or pass one explicitly: ./scripts/release.sh 0.2.0). It then bumps
the version in pyproject.toml and src/lostdock/__init__.py, runs the test suite,
regenerates CHANGELOG.md, and creates an annotated vX.Y.Z tag.
Pushing the tag triggers CI, which builds the Windows/Linux binaries and publishes a GitHub Release with auto-generated notes (grouped features/fixes, issue references, and contributors) via git-cliff.
uv run pytest # run the test suite
uv run python -m compileall -q src # sanity-check importsProject layout:
src/lostdock/
├── core/ Dork model, operators, query compiler, rate limiter, proxy pool
├── adapters/ Google / DuckDuckGo / Bing engine adapters
├── services/ repository, query, filter, crawler, scheduler, exporter, plugins
├── ui/ PySide6 widgets: dork builder, results grid, worker, settings, main window
└── main.py entry point
tests/ pytest suite (compiler, engines, services, proxy, scheduler, plugins)
LostDock is a security research and OSINT tool. Use it only against systems you own or are explicitly authorized to test. Respect search-engine Terms of Service: keep rate limits low, use proxies responsibly, and never use this tool for unauthorized access, scraping of personal data, or any unlawful activity. The authors are not responsible for misuse.
MIT — see LICENSE.