[SNPE] Snipe — Auction sniping and seller trust scoring #14

Open
opened 2026-02-27 13:54:00 -08:00 by pyr0ball · 1 comment
Owner

[SNPE] Snipe

Auction sniping and seller trust scoring -- eBay, CT Bids, antiques, estate auctions

Status

Beta -- actively deployed at menagerie.circuitforge.tech/snipe · current: v0.4.0


Done

Core pipeline

  • FastAPI (port 8510, host networking) + Vue 3 + Pinia + UnoCSS + nginx (port 8509)
  • Playwright + playwright-stealth + Xvfb scraper (Kasada bypass via headed Chromium)
  • eBay Browse API adapter with scraper fallback (auto-detected, or user-selectable)
  • Parallel execution: search + market comps run concurrently (halves cold-search time)
  • Pagination: 1/2/3/5 eBay pages (48 listings/page), parallel Playwright calls per page
  • Self-hosted install: Docker + no-Docker paths, working on fresh Debian 13 (strahl verified)

Trust scoring

  • 5 metadata signals: account age, feedback count, feedback ratio, price vs market, category history
  • Composite score: available_sum / available_max x 100 (partial-score flagged when signals missing)
  • Zero-feedback hard cap: composite capped at 35 -- a 0-feedback seller cannot appear trustworthy
  • Condition field scanning: eBay formal condition "for parts or not working" -> scratch_dent_mentioned flag
  • Established retailer suppression: phash dedup suppressed for 1000+ feedback sellers (stock photos)
  • Market comps from completed sales (Browse Insights API + BTF scraper fallback, 6h SQLite TTL)
  • DB staging: times_seen, first_seen_at, price_at_first_seen -> long_on_market + price_drop flags
  • Scammer blocklist (Phase 1 -- local): add/remove sellers, established_bad_actor red flag in scoring
  • Community trust signals: POST /api/community/signal stores confirm/dispute feedback in SQLite (#31 #32 #33)
  • 129 unit/integration tests

Search and filters

  • Must-include / must-exclude keyword filtering (two fields, eBay query forwarding for excludes)
  • Faceted filter sidebar: trust score slider, price range, condition, seller thresholds, hide-flags checkboxes
  • Category selector in search bar
  • Clear filters button (shows active filter count, resets to defaults)
  • Saved searches (store/restore query + full filter state) -- all tiers
  • On-demand enrichment per listing (refresh button, AbortController cancel support)
  • Search with AI (#29, Paid+): natural language prompt -> eBay search filters via local LLM (cf-orch, llama3.1:8b). QueryTranslator + EbayCategoryCache (eBay Taxonomy API, 7-day TTL) + LLMQueryPanel.vue with collapsible a11y-wired UI.

UX and platform

  • Light + dark theme (system color-scheme aware, theme.css)
  • Triple Red easter egg: pulsing glow + glitch on highest-risk listings
  • Cloud deployment (menagerie.circuitforge.tech/snipe): per-user SQLite isolation, Heimdall licensing
  • Tier system: Free / Paid / Premium with BYOK unlock for AI features
  • eBay affiliate links (EPN, user-configurable campaign ID with CF fallback via cf-core wrap_url)
  • In-app feedback FAB (routes submissions to Forgejo issue filing via cf-core router)
  • Vision task scheduler (background photo analysis queue + runner infrastructure, cf-core LLMRouter)
  • SSE live score push (#1): trust scores update live as background enrichment completes
  • User preferences system: dot-path JSON store (get_user_preference / set_user_preference), Pinia preferencesStore bootstrapped after session
  • A11y (accessibility) fixes: skip-to-main link before nav (WCAG 2.4.1), LLMQueryPanel keyboard nav + aria-live

Infrastructure

  • Forgejo Actions CI/CD: pytest + ruff + Vue typecheck + vitest on PR/push (#22)
  • Release workflow: Docker multi-arch build + Forgejo release on v* tags
  • Mirror workflow: GitHub + Codeberg push on main/tags
  • install.sh full rewrite: colored output, --docker / --bare-metal, auto-detection (#25)
  • nginx-self-hosted.conf sample config (#24)
  • compose.override.yml cf-orch agent sidecar (#15)

In Progress

  • Vision classification pipeline (#21) -- structured condition scoring, fraud signals from listing photos

Backlog

Issue Feature Tier
#2 eBay OAuth in cf-core (full trust scores without BTF scraping) Paid
#4 eBay T&S batch reporting + CF community blocklist (Phases 2+3) Free / Cloud
#5 UPC/product lookup -> LLM-crafted search Paid
#6 Cloud: shared seller/scammer DB (opt-in, no PII) Cloud
#7 Cloud: shared image hash DB (opt-in consent design required) Cloud
#9 Bid scheduling and snipe execution engine Premium
#10 Multi-platform adapter support (CT Bids, AuctionZip, HiBid, Invaluable) Free
#12 Background saved-search monitoring with alert notifications Paid / Premium
#13 Post-win workflow: payment routing, shipping coordination, provenance docs All
#23 Publish circuitforge-core to Forgejo Packages (private PyPI) Infra

Architecture

nginx (8509) -> /api/ -> FastAPI (8510, host networking)
                            |
                eBay Browse API (app-level OAuth)
                + ScrapedEbayAdapter (Playwright + Xvfb, Kasada bypass)
                            |
                TrustScorer
                  metadata signals (5) + phash dedup (free)
                  + vision analysis (paid -- background task queue, cf-core scheduler)
                            |
                SQLite: user_db (per-user) + shared_db (cloud: community blocklist)
                EbayCategoryCache (SQLite, 7-day TTL from eBay Taxonomy API)

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


Dependencies

  • circuitforge-core >= 0.9.0 -- db, llm (LLMRouter), tiers, config, affiliates, tasks, resources, preferences

Repository

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

Milestones

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


Tier System

Tier What you get
Free Core pipeline, scraper + API search, trust scoring, market comps, keyword filters, saved searches, scammer blocklist, SSE live enrichment, community trust signals
Paid Search with AI (natural language query builder), vision photo analysis, background monitoring (5 searches), eBay affiliate links, cloud LLM
Premium Background monitoring (25 searches), bid scheduling, auto-bidding

License

Discovery pipeline: MIT -- AI/LLM features: BSL 1.1 (converts to MIT after 4 years)

## [SNPE] Snipe > Auction sniping and seller trust scoring -- eBay, CT Bids, antiques, estate auctions ### Status **Beta -- actively deployed at `menagerie.circuitforge.tech/snipe`** · current: v0.4.0 --- ### Done #### Core pipeline - [x] FastAPI (port 8510, host networking) + Vue 3 + Pinia + UnoCSS + nginx (port 8509) - [x] Playwright + playwright-stealth + Xvfb scraper (Kasada bypass via headed Chromium) - [x] eBay Browse API adapter with scraper fallback (auto-detected, or user-selectable) - [x] Parallel execution: search + market comps run concurrently (halves cold-search time) - [x] Pagination: 1/2/3/5 eBay pages (48 listings/page), parallel Playwright calls per page - [x] Self-hosted install: Docker + no-Docker paths, working on fresh Debian 13 (strahl verified) #### Trust scoring - [x] 5 metadata signals: account age, feedback count, feedback ratio, price vs market, category history - [x] Composite score: `available_sum / available_max x 100` (partial-score flagged when signals missing) - [x] Zero-feedback hard cap: composite capped at 35 -- a 0-feedback seller cannot appear trustworthy - [x] Condition field scanning: eBay formal condition "for parts or not working" -> scratch_dent_mentioned flag - [x] Established retailer suppression: phash dedup suppressed for 1000+ feedback sellers (stock photos) - [x] Market comps from completed sales (Browse Insights API + BTF scraper fallback, 6h SQLite TTL) - [x] DB staging: times_seen, first_seen_at, price_at_first_seen -> long_on_market + price_drop flags - [x] Scammer blocklist (Phase 1 -- local): add/remove sellers, established_bad_actor red flag in scoring - [x] Community trust signals: `POST /api/community/signal` stores confirm/dispute feedback in SQLite (#31 #32 #33) - [x] 129 unit/integration tests #### Search and filters - [x] Must-include / must-exclude keyword filtering (two fields, eBay query forwarding for excludes) - [x] Faceted filter sidebar: trust score slider, price range, condition, seller thresholds, hide-flags checkboxes - [x] Category selector in search bar - [x] Clear filters button (shows active filter count, resets to defaults) - [x] Saved searches (store/restore query + full filter state) -- all tiers - [x] On-demand enrichment per listing (refresh button, AbortController cancel support) - [x] **Search with AI** (#29, Paid+): natural language prompt -> eBay search filters via local LLM (cf-orch, llama3.1:8b). `QueryTranslator` + `EbayCategoryCache` (eBay Taxonomy API, 7-day TTL) + `LLMQueryPanel.vue` with collapsible a11y-wired UI. #### UX and platform - [x] Light + dark theme (system color-scheme aware, theme.css) - [x] Triple Red easter egg: pulsing glow + glitch on highest-risk listings - [x] Cloud deployment (menagerie.circuitforge.tech/snipe): per-user SQLite isolation, Heimdall licensing - [x] Tier system: Free / Paid / Premium with BYOK unlock for AI features - [x] eBay affiliate links (EPN, user-configurable campaign ID with CF fallback via cf-core wrap_url) - [x] In-app feedback FAB (routes submissions to Forgejo issue filing via cf-core router) - [x] Vision task scheduler (background photo analysis queue + runner infrastructure, cf-core LLMRouter) - [x] SSE live score push (#1): trust scores update live as background enrichment completes - [x] User preferences system: dot-path JSON store (`get_user_preference` / `set_user_preference`), Pinia `preferencesStore` bootstrapped after session - [x] A11y (accessibility) fixes: skip-to-main link before nav (WCAG 2.4.1), `LLMQueryPanel` keyboard nav + `aria-live` #### Infrastructure - [x] Forgejo Actions CI/CD: pytest + ruff + Vue typecheck + vitest on PR/push (#22) - [x] Release workflow: Docker multi-arch build + Forgejo release on `v*` tags - [x] Mirror workflow: GitHub + Codeberg push on main/tags - [x] `install.sh` full rewrite: colored output, `--docker` / `--bare-metal`, auto-detection (#25) - [x] `nginx-self-hosted.conf` sample config (#24) - [x] `compose.override.yml` cf-orch agent sidecar (#15) --- ### In Progress - [ ] Vision classification pipeline (#21) -- structured condition scoring, fraud signals from listing photos --- ### Backlog | Issue | Feature | Tier | |-------|---------|------| | #2 | eBay OAuth in cf-core (full trust scores without BTF scraping) | Paid | | #4 | eBay T&S batch reporting + CF community blocklist (Phases 2+3) | Free / Cloud | | #5 | UPC/product lookup -> LLM-crafted search | Paid | | #6 | Cloud: shared seller/scammer DB (opt-in, no PII) | Cloud | | #7 | Cloud: shared image hash DB (opt-in consent design required) | Cloud | | #9 | Bid scheduling and snipe execution engine | Premium | | #10 | Multi-platform adapter support (CT Bids, AuctionZip, HiBid, Invaluable) | Free | | #12 | Background saved-search monitoring with alert notifications | Paid / Premium | | #13 | Post-win workflow: payment routing, shipping coordination, provenance docs | All | | #23 | Publish circuitforge-core to Forgejo Packages (private PyPI) | Infra | --- ### Architecture ``` nginx (8509) -> /api/ -> FastAPI (8510, host networking) | eBay Browse API (app-level OAuth) + ScrapedEbayAdapter (Playwright + Xvfb, Kasada bypass) | TrustScorer metadata signals (5) + phash dedup (free) + vision analysis (paid -- background task queue, cf-core scheduler) | SQLite: user_db (per-user) + shared_db (cloud: community blocklist) EbayCategoryCache (SQLite, 7-day TTL from eBay Taxonomy API) ``` **Kasada gotcha:** Only headed Chromium via Xvfb passes. `requests`, `curl_cffi`, headless Playwright, and `/usr/` `/fdbk/` profile pages are all blocked. `/itm/` listing pages are clean and contain BTF seller card with account age. --- ### Dependencies - **circuitforge-core >= 0.9.0** -- db, llm (LLMRouter), tiers, config, affiliates, tasks, resources, preferences ### Repository https://git.opensourcesolarpunk.com/Circuit-Forge/snipe ### Milestones https://git.opensourcesolarpunk.com/Circuit-Forge/snipe/milestones --- ### Tier System | Tier | What you get | |------|--------------| | Free | Core pipeline, scraper + API search, trust scoring, market comps, keyword filters, saved searches, scammer blocklist, SSE live enrichment, community trust signals | | Paid | Search with AI (natural language query builder), vision photo analysis, background monitoring (5 searches), eBay affiliate links, cloud LLM | | Premium | Background monitoring (25 searches), bid scheduling, auto-bidding | ### License Discovery pipeline: MIT -- AI/LLM features: BSL 1.1 (converts to MIT after 4 years)
pyr0ball added the
priority:medium
status:concept
labels 2026-02-27 13:54:00 -08:00
pyr0ball added
status:active-dev
and removed
status:concept
labels 2026-03-25 10:00:18 -07:00
pyr0ball added
status:beta
and removed
status:active-dev
labels 2026-04-04 16:37:32 -07:00
pyr0ball added the
free-tier:live
label 2026-04-04 20:01:22 -07:00
pyr0ball changed title from [SNPE] Snipe — Auction sniping — CT Bids, antiques, estate auctions, eBay to [SNPE] Snipe — Auction sniping and seller trust scoring 2026-04-05 21:51:01 -07:00
Author
Owner

2026-05-04: Mercari support shipped alongside eBay — same trust-score pipeline. Snipe is now multi-platform. Four root-cause fixes required to get Playwright working in Docker (Xvfb -ac flag, display counter :200+, sortBy=SORT_SCORE removed, image rebuild required on changes).

2026-05-04: Mercari support shipped alongside eBay — same trust-score pipeline. Snipe is now multi-platform. Four root-cause fixes required to get Playwright working in Docker (Xvfb -ac flag, display counter :200+, sortBy=SORT_SCORE removed, image rebuild required on changes).
Sign in to join this conversation.
No description provided.