Proxy Pool
Total Proxies
12
pool.count()
Healthy
7
status: healthy
Degraded
3
status: degraded
Blocked / Dead
2
status: blocked | dead
datacenter: 6
residential: 4
mobile: 2
ID (sha1[:12])TypeTagsRegionStatusSuccess RateLatencyProbesLast Probed
a1b2c3d4e5f6 http datacenter us-east healthy
0.94
142ms 50 2026-06-29T09:40Z
7e8f9a0b1c2d socks5 residential us-west healthy
0.88
214ms 32 2026-06-29T09:38Z
3d4e5f6a7b8c http mobile eu-west degraded
0.60
388ms 15 2026-06-29T09:35Z
9c0d1e2f3a4b https datacenter ap-south blocked
0.00
8 2026-06-29T09:20Z
5b6c7d8e9f0a socks5 residential us-central healthy
1.00
98ms 3 2026-06-29T09:44Z
Probe History
ProbeResult[] — last 500 entries · FailureMode: success | proxy-blocked | ip-banned | rate-limited | captcha | target-down | unknown
Probed AtProxy IDTargetSuccessHTTPLatencyFailureModeReasoning
2026-06-29 09:44 5b6c7d8e9f0a greenhouse.io true 200 98ms success
2026-06-29 09:40 a1b2c3d4e5f6 greenhouse.io true 200 142ms success
2026-06-29 09:38 7e8f9a0b1c2d loxo.co true 200 214ms success
2026-06-29 09:35 3d4e5f6a7b8c greenhouse.io false 429 388ms rate-limited 429 Too Many Requests — backoff required
2026-06-29 09:20 9c0d1e2f3a4b loxo.co false 403 510ms proxy-blocked IP range detected as datacenter, request denied
2026-06-29 08:50 a1b2c3d4e5f6 remoteok.io false 407 201ms ip-banned Proxy auth failed, IP added to blocklist
2026-06-29 08:30 7e8f9a0b1c2d loxo.co/apply false 403 445ms captcha Cloudflare challenge page detected
Session Bindings
SessionBinding: { profileId, proxyId, boundAt, targetDomain? } — ghost-relay bind <profileId> <proxyId> [domain]
Profile → Proxy (global)
profileIda3f7b2c8-d1e4
proxyIda1b2c3d4e5f6
boundAt2026-06-29T08:00Z
targetDomainundefined
Profile → Proxy (domain-scoped)
profileId9e2c4a01-b5f3
proxyId7e8f9a0b1c2d
boundAt2026-06-29T09:10Z
targetDomaingreenhouse.io
Profile → Proxy (domain-scoped)
profileId9e2c4a01-b5f3
proxyId5b6c7d8e9f0a
boundAt2026-06-29T09:22Z
targetDomainloxo.co
Key format: profileId for global bindings, profileId:targetDomain for domain-scoped. Domain-scoped takes precedence over global when both exist.
Pool Health Overview
successRate: 0.0–1.0 float (CLI renders as 10-block bar: █░░░░░░░░░) — updateHealth() rolling window
Proxy IDTagsStatusSuccess RateCLI BarProbe CountAvg Latency
5b6c7d8e9f0a residential healthy
1.00
██████████ 3 98ms
a1b2c3d4e5f6 datacenter healthy
0.94
█████████░ 50 142ms
7e8f9a0b1c2d residential healthy
0.88
████████░░ 32 214ms
3d4e5f6a7b8c mobile degraded
0.60
██████░░░░ 15 388ms
9c0d1e2f3a4b datacenter blocked
0.00
░░░░░░░░░░ 8
Health Thresholdsfrom constants.ts
≥ 0.8healthy
≥ 0.5degraded
< 0.5blocked / dead
Pool Configuration
Store Paths~/.ghost-relay/
Pool store ~/.ghost-relay/pool.json
Session bindings ~/.ghost-relay/bindings.json
Probe history ~/.ghost-relay/history.json
Constantsshared/constants.ts
PROBE_WINDOW (rolling success rate) 20
MAX_HISTORY_ENTRIES 500
HEALTH_THRESHOLD_HEALTHY 0.8
HEALTH_THRESHOLD_DEGRADED 0.5
Proxy ID Format
IDs are derived from the proxy URL using sha1(url).slice(0,12) — deterministic, collision-resistant, 12-char hex.
crypto.createHash('sha1').update(url).digest('hex').slice(0, 12)
// "http://user:pass@host:8080" → "a1b2c3d4e5f6"