pyr0ball opened issue Circuit-Forge/roadmap#14

pyr0ball
Fri, 27 Feb 2026 13:54:00 -0800

[SNPE] Snipe

Auction sniping — CT Bids, antiques, estate auctions, eBay

Status

MVP core complete. Actively testing. Keyword filtering in progress.

MVP is eBay-only. The scraper tier (Playwright + Xvfb, no API key required) is fully operational:

Done

FastAPI layer (port 8510) — search endpoint with trust scoring, market comp, seller map

Vue 3 + Pinia + UnoCSS frontend (port 8509, nginx proxy)

Playwright + playwright-stealth + Xvfb scraper (Kasada-bypass via headed chromium)

Three-layer caching: HTML (5 min in-memory), phash (permanent in-memory), market comp (SQLite, 6h TTL)

Parallel execution: search() and get_completed_sales() run concurrently — halves cold-search time

Pagination: 1/2/3/5 pages selector in UI (48 listings/page), parallel Playwright calls per page (max 3 concurrent)

Xvfb display counter (:200–:299) prevents lock conflicts on sequential calls

Trust scoring: metadata signals (account age, feedback, price vs market, category history) + phash dedup

Market price comp from sold listings — proper median (averages two middle values for even sets)

Faceted filter sidebar: trust score, price, condition, seller thresholds, hide-flags

Auction dim style (opacity 0.72 for auctions >1h remaining)

DB migrations (SQLite): 001 init, 002 buying_format/ends_at, 003 nullable account_age_days

Bug fixes: false suspicious_price flags (None→0 sentinel), false new_account flags (account_age=None), title pollution (eBay a11y span)

48 unit tests — scraper parsers runnable on host without Docker (lazy Playwright imports)

In Progress

Keyword filtering — must-include / must-exclude terms; negatives forwarded to eBay query and applied client-side

Backlog

Seller profile enrichment via listing page BTF card ("Joined Jun 2022" scraped from /itm/ after scroll — Kasada allows these)

Bulk flag/report UI for scammers — multi-select listings → eBay deep-link report + optional CF community blocklist

Snipe scheduling with configurable bid-time offset

Human approval gate before any bid is placed

Saved searches

Vue 3 SPA refinements: mobile filter drawer, listing detail view

Architecture

nginx (8509) → /api/ → FastAPI (8510, network_mode: host)
                          ↓
              ScrapedEbayAdapter
                 Playwright + Xvfb
                 HTML cache (5 min)
                          ↓
              TrustScorer → metadata + phash
                          ↓
              SQLite (data/snipe.db)

Critical gotcha: eBay uses Kasada bot protection. Only headed Chromium via Xvfb passes. requests, curl_cffi, headless Playwright, and /usr/ /fdbk/ profile pages are all blocked. /itm/ listing pages load and contain BTF seller card with account age.

Dependencies

circuitforge-core — shared scaffold (db, config, tiers) — editable install from ../circuitforge-core

Repository

https://git.opensourcesolarpunk.com/Circuit-Forge/snipe

Milestones

https://git.opensourcesolarpunk.com/Circuit-Forge/snipe/milestones

Design Pillars

Privacy · Safety · Accessibility — co-equal, non-negotiable.
Neurodivergent and adaptive needs users are a primary audience.

Tier System

| Tier | What you get |
|------|------------||
| Free | Core pipeline, scraper tier (no API key), local LLM only |
| Paid | Cloud LLM, seller profile enrichment, saved searches |
| Premium | Fine-tuned models, multi-user, advanced analytics |
| Ultra | Human-in-the-loop operator (bid execution, CAPTCHA handling) |

License