What It Is
Josty queries public search backends in parallel through ddgs, fuses rankings with Cormack-Clarke Reciprocal Rank Fusion (RRF), canonicalizes URLs, and optionally extracts bounded page text.
It is designed for AI agents and developer scripts that need a self-contained search step without API keys, background daemons, or browser engines.
┌──────────────────────────────┐
│ Local Agent / Script Step │
└──────────────┬───────────────┘
│ single search execution
▼
┌──────────────────────────────┐
│ Josty │
│ - Bounded parallel fanout │
│ - Domain-weighted RRF (k=60)│
│ - In-process breaker & cache│
│ - Trafilatura text extract │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ Public Backends via ddgs │
│ (Brave, DuckDuckGo, Yahoo, │
│ Mojeek, Startpage, Google) │
└──────────────────────────────┘
Installation
# Run instantly with uvx (no install step needed):
uvx josty "Python 3.13 features" --limit 5
# Or install globally:
uv tool install josty
# or: pipx install josty
Quickstart
# 1. Basic search (returns top 5 results):
josty "Python 3.13 release highlights" --limit 5
# 2. Boost technical documentation domains (dev profile):
josty "FastAPI dependency injection" --profile dev --limit 5
# 3. Restrict search to specific domains (up to 5):
josty "httpx connection pool timeout" --site github.com --site python-httpx.org
# 4. Extract bounded Markdown page text from top results:
josty "RRF rank fusion algorithm" --limit 3 --fetch
# 5. Unix pipeline (stream search results straight into fetch):
josty search "FastAPI dependency injection" --limit 3 | josty fetch --stdin
Output & Status Contract
Normal searches emit one JSON document on stdout. Diagnostics and warnings route strictly to stderr.
{
"schema_version": "1.0",
"query": "FastAPI dependency injection",
"status": "complete",
"count": 3,
"partial": false,
"cached": false,
"provider_count": 6,
"nonempty_provider_count": 2,
"coverage": 0.333,
"providers": [...],
"results": [
{
"title": "Dependencies - FastAPI",
"url": "https://fastapi.tiangolo.com/tutorial/dependencies/",
"snippet": "FastAPI has a very powerful but intuitive Dependency Injection system...",
"sources": ["duckduckgo", "brave"],
"score": 0.039024,
"content": null
}
]
}
Status Values & Exit Codes
| Status | Meaning | Exit Code |
|---|---|---|
complete |
Results found; no backend failed. | 0 |
empty |
No results found; no backend failed (count=0). |
0 |
degraded |
Results found, but at least one backend failed; or page extraction failed. | 0 |
failed |
Every attempted backend failed; zero results returned. | 1 |
| Validation Error | Invalid CLI options or empty query. | 2 |
Limitations & Non-Goals
- No Privacy or Anonymity Guarantees: Josty does not proxy or anonymize traffic. Queries are sent directly to upstream search engines.
- Best-Effort Availability: Upstream public engines may throttle (HTTP 429), present anti-bot challenges, or change response formats. Josty isolates failures via circuit breakers and surfaces errors honestly rather than hiding them behind infinite retries.
- Not a Search Engine: Josty does not maintain an index or crawl the web. It is a lightweight client adapter over
ddgs. - No Hidden Query Rewriting: If a search returns empty, Josty reports
status: "empty". The caller decides whether to broaden terms or adjust site filters.
Documentation
- Agent Tool Specification:
.agents/skills/josty/SKILL.md(full flag specifications, schemas, provider telemetry, and agent research rules). - Coding Agent Guide:
AGENTS.md(invariants, test commands, and module layout for agents working on this codebase). - Security Policy:
SECURITY.md.
Release files for josty 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| josty-0.7.0.tar.gz | 122.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| josty-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 160.8 kB
Release files / josty-0.7.0.tar.gz
| Download URL | josty-0.7.0.tar.gz |
|---|---|
| Size | 122.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
101d3ddbc2a3011feb7176f613c6864c519c45e473e94835b3c96e5ac804f817
|
|
BLAKE2b-256 checksum How to use checksums |
84fa83dd8848e0daadea2df6efe99f1ad703751f19815897d61354586263d5e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / josty-0.7.0-py3-none-any.whl
| Download URL | josty-0.7.0-py3-none-any.whl |
|---|---|
| Size | 38.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
47b885053ee904025e874c9dce59dca283d65cd33eaccd8cd60b013ff45d7143
|
|
BLAKE2b-256 checksum How to use checksums |
4a9d965fe29a53a17711102bcd2c40715111ecba4937adf2d9a027cf7ffa4b3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|