feat(beefcake): page the phone when LPCAMM2 is listed cheaply #1215

Closed
lytedev wants to merge 3 commits from propose/lpcamm-watch into main
Owner

See the two commit messages. Deploy pebble before beefcake.

🤖 Generated with Claude Code

https://claude.ai/code/session_01D6HRbierL4ThD2XJP7ajKd

See the two commit messages. Deploy pebble before beefcake. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01D6HRbierL4ThD2XJP7ajKd
beefcake's lpcamm-watch (next commit) publishes shopping alerts as
the existing `alerts` user. Access is granted per topic in the
ExecStartPost provisioner, so the topic has to be granted here before
beefcake can publish to it: pebble must be deployed first, or every
announcement 403s and is retried each run until it is.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6HRbierL4ThD2XJP7ajKd
feat(beefcake): page the phone when LPCAMM2 is listed cheaply
Some checks failed
/ check-format (push) Successful in 12s
/ build (push) Has been cancelled
3524a1acac
fennec (Framework 13 Pro) needs a 64GB LPCAMM2 module, and they sell
out or are listed under odd names. Following the r/framework advice
(automated alerts, typo search terms, local markets, no auctions),
a 15-minute timer checks eBay (Browse API, fixed-price only),
Craigslist within 150 miles of Kansas City, r/hardwareswap and
r/framework, Newegg, Central Computers and Crucial, and publishes to
ntfy when a module is under $400 (64GB) or $200 (32GB).

Considered and not used: changedetection.io. It diffs whole pages, so
it cannot hold each capacity to its own ceiling, dedupe a listing
across sources, or tell "WTB LPCAMM2" from a sale, and it would add a
headless Chromium to beefcake.

Reddit allows roughly one anonymous request per minute from this IP
(x-ratelimit-remaining 0 after one feed; a second subreddit 429ed
even 10s later), so both subreddits come from one combined
r/hardwareswap+framework feed.

Tested: the unit tests run in the package build (30 tests). A full
run of the built binary from dragon (same egress IP as beefcake) with
the real config read every source except eBay: reddit 100, central 37,
newegg 2, crucial 1+1, craigslist 0 listings, nothing under a ceiling
at the time (Crucial: 64GB $451.99, 32GB $232.99), so nothing was
published. Not yet exercised live: the eBay source (needs a keyset)
and the ntfy publish (needs the hardware-deals topic deployed to
pebble first).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6HRbierL4ThD2XJP7ajKd
fix(beefcake/lpcamm-watch): stop trusting Crucial's product data
All checks were successful
/ check-format (push) Successful in 10s
/ build (push) Successful in 15m51s
0eaa2ddbcc
Crucial's product pages embed a schema.org Offer with a price and
InStock availability that the page itself does not display. Checked
by rendering https://www.crucial.com/memory/lpcamm2/ct64g75c2lp5x in
headless Chromium: title, part number and specs, but no price and no
Add to Cart. The embedded data also carries "show-wtb": "true", which
looks like a "where to buy" redirect to other retailers. A source that
reports stock that is not for sale can only produce false pages, so it
is dropped rather than patched to read show-wtb, whose meaning is a
guess.

The generic structured-data parser stays: it is correct for sites
whose Offer matches the page, and the list of product URLs is where
such a site would go.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6HRbierL4ThD2XJP7ajKd
lytedev closed this pull request 2026-09-25 16:51:44 -05:00
All checks were successful
/ check-format (push) Successful in 10s
Required
Details
/ build (push) Successful in 15m51s
Required
Details

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
lytedev/nix!1215
No description provided.