Skip to content
Automation
Skill

/deal-finder

Scan configured sources (Craigslist now; eBay + Facebook Marketplace planned) for used-item listings matching the owner's criteria. Currently configured for a Mac mini search (M2+, 16GB+, 512GB+, ≤$500, near 94566). Notify owner via SMS + Telegram on a match.

From plugin
sutando
40179 skills18 hooks

Claude Code

$ npx -y skills add sonichi/sutando --skill deal-finder --agent claude-code

SKILL.md

deal-finder.SKILL.md
name: deal-finder
description: Scan configured sources (Craigslist now; eBay + Facebook Marketplace planned) for used-item listings matching the owner's criteria. Currently configured for a Mac mini search (M2+, 16GB+, 512GB+, ≤$500, near 94566). Notify owner via SMS + Telegram on a match.
user-invocable: true

Deal Finder

Watches configured sources for second-hand item listings matching owner-defined criteria. Sends an SMS + Telegram DM when a new matching listing appears.

**Usage**: `/deal-finder` (one-shot scan) — typically run from cron every 60 min.

Searches

V1 keeps the original Mac Mini search inline (`state/criteria.json`). V2 will move this to a `state/searches.json` array with one entry per search, so adding "Pelican 1535 case", "Aeron chair size B", etc. becomes a JSON edit rather than a code change.

Current Mac Mini search criteria (from `state/criteria.json`):

  • Chip family: `M2`, `M3`, `M4` (M1 explicitly excluded — owner asked for M2+)
  • Min RAM: `16 GB`
  • Min storage: `512 GB`
  • Max price: `$500`
  • ZIP: `94566` (Pleasanton, CA), search radius `50 mi`

Edit `state/criteria.json` to retune the Mac Mini search; v2 will lift this into a per-search config.

Sources

V1 (implemented): **Craigslist** (`sfbay.craigslist.org/search/sss?...`). Uses an honest User-Agent (`Sutando-Personal-Agent/1.0`) that identifies the agent rather than cosplaying a browser — Craigslist can decide whether to allow.

V2 (planned, not yet implemented):

  • **eBay** — `browse.ebay.com` has a local-pickup filter; HTML scraping works without auth.
  • **Facebook Marketplace** — requires a headless browser (Playwright via the `macos-use` skill, or the browser-automation MCP) because the page is JS-rendered and gated.

Behavior

1. Fetch the Craigslist search results page with the honest UA. 2. Parse each listing: title, URL, price, neighborhood. 3. For each listing not in `state/seen.json`:

  • Fetch the listing detail page (one extra HTTP req per listing — cheap, only on first sight).
  • Apply criteria filter (chip, RAM, storage, price). Listings missing fields fall through to "soft match" — flagged but still notified, since Craigslist sellers often omit specs.
  • On match: notify (SMS + Telegram), record URL in `seen.json`.

4. Trim `seen.json` deterministically to the last 1000 entries (a `deque(maxlen=1000)` ordered by insertion — replaces the prior set-slicing trim which was non-deterministic).

Notification format

[Mac Mini Deal] $480 — M2 / 16GB / 512GB
Concord (35mi, local pickup)
Posted recent
https://sfbay.craigslist.org/...

SMS goes via `TWILIO_*` env vars to `OWNER_NUMBER`. Telegram goes via `results/proactive-deal-finder-{ts}.txt` (the bridge picks it up).

Run it

python3 scripts/scan.py            # one-shot scan with default criteria
python3 scripts/scan.py --dry-run  # don't notify, print what would notify
python3 scripts/scan.py --reset    # clear seen.json (force re-notify everything)

Cron: every 60 min. Configured in `skills/schedule-crons/crons.json` as `deal-finder`.

Read more
@sonichi
Ships withsutando

My AI Stand — Realtime by Day, Rewriting Itself by Night. Summon my AI superpower. Voice, vision, screen, meetings, calls when I'm engaged. Learns my patterns, ships its own code when I'm not. Runs across my Macs, interacts with people & their Stands.

Stars on GitHub

Momentum

stars in total
401
Star history of sonichi/sutando on GitHub, a chart by star-history.com

Other skills on sutando.

ag2space-voice

ag2space-voice

s.space voice surface — binds the room the s.space client announces to the voice session's origin, so work delegated by voice in…

@sonichi@sonichiInstall Skill
agent-activity

agent-activity

Streams what the agent is doing into the room, as rows the desktop client renders in an **events drawer** above the composer…

@sonichi@sonichiInstall Skill
agent-registry

agent-registry

Local Agent Registry — a standalone, dependency-free service that tracks running Claude Code (and other) agent instances. Agents…

@sonichi@sonichiInstall Skill
agent-room-ops

agent-room-ops

For an all-room analysis sweep, use the tested window collector and coverage contract in…

@sonichi@sonichiInstall Skill
answer-format

answer-format

Deterministic final-answer normalizer — a last-step pass for any task that ends in a *precise* answer (a number, a short string,…

@sonichi@sonichiInstall Skill
audio-transcribe

audio-transcribe

Transcribes audio files and voice notes to text via Gemini 2.5-flash. Integrates with Slack, Discord, and Telegram bridges so…

@sonichi@sonichiInstall Skill

More skills from other plugins.

agent-builder

agent-builder

Load immediately after an Agent intent, before the first agent_builder_* call. Governs how you create, configure, test, and…

n8n12d209k
@n8n-io@n8n-ioInstall Skill
browser-use

browser-use

Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…

@browser-use@browser-useInstall Skill
agent-browser

agent-browser

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…

@vercel-labs-2@vercel-labs-2Install Skill
add-anydoc

add-anydoc

Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when…

@nanocoai@nanocoaiInstall Skill

Questions about deal-finder.

Which coding agents can use deal-finder?
deal-finder installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.