En liten Go-tjänst som bevakar Tradera efter felprisade iPhones. Den bygger sin egen historik över vad varje modell faktiskt säljs för, och flaggar köp nu-annonser som ligger rejält under det.
Fliken Aktiva annonser är radarn: allt som är till salu just nu, jämfört med medianen av sålda exemplar med exakt samma modell och lagring. Fynd blir gröna. Visar sig ett fynd vara en sprucken skärm i förklädnad markerar ett klick den som trasig (röd), och priset hålls utanför statistiken.
Sålda fynd är facit: alla försäljningar de senaste 90 dagarna som gick under medianen, och hur länge annonsen låg ute innan någon högg. De bästa brukar gå inom ett dygn, vilket är hela anledningen till att det här går på timer istället för att jag sitter och uppdaterar sidan.
Var 30:e minut skrapas Traderas sålda och aktiva annonser. Varje annons sorteras i en bucket per modell och lagring, och aktiva köp nu-annonser jämförs med medianpriset för sålda i samma bucket. Ligger priset tillräckligt långt under blir det ett fynd (grönt i radarn). Allt som inte kan klassificeras med säkerhet — tillbehör, paket, reservdelsobjekt, titlar utan tydlig modell eller lagring — hoppas över, för en felgissning i prishistoriken är värre än en saknad datapunkt.
Notiser är bevakningsstyrda: du får bara en notis (en gång per annons) för de modeller du lagt till som bevakning under Inställningar. Utan bevakningar skickas inga notiser — radarn visar ändå alla fynd.
go run . --once # en skrapning+jämförelse, sedan klart
go run . # loop + webbgränssnitt på :8080En färdig image finns på ghcr.io/klppl/ifynd:latest, byggd av GitHub
Actions-workflowet i repot (körs manuellt från Actions-fliken).
services:
ifynd:
image: ghcr.io/klppl/ifynd:latest
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ifynd-data:/data
volumes:
ifynd-data:docker compose pull && docker compose up -dhttp://<host>:8080/ visar aktiva annonser och historiska fynd, med filter
för modell och fritext. Modellfiltret grupperar per generation: välj
Alla iPhone 16 för att se alla varianter (16, 16e, 16 Plus, 16 Pro,
16 Pro Max) på en gång, eller en enskild modell. Filtren speglas i URL:en så
att en filtrerad vy går att bokmärka eller dela — /?gen=iPhone+16 (hela
generationen), /?model=iPhone+16+Pro (en modell), /?view=bargains,
/?q=pro+max&hits=1. Modell och generation matchas tolerant, så
/?gen=iphone16 funkar också. Varje annons har två knappar: Trasig
(röd, kan aldrig bli fynd, priset hålls utanför statistiken) och
Exkludera (tas bort och kommer inte tillbaka). Bakom sidan ligger ett
litet JSON-API — /api/listings, /api/bargains, /api/hits,
/api/buckets, /api/status — plus /healthz.
Fliken Inställningar styr tre saker, sparade i databasen (ingen omstart behövs):
- Detektering — tröskel, min. antal sålda och min. pris överstyr
IFYND_*-standardvärdena. - Notiskanaler — lägg till valfritt antal av Discord, ntfy, Gotify och generisk webhook (fungerar även för Slack/Mattermost). Alla aktiva kanaler får varje notis, och en Testa-knapp skickar en provnotis direkt.
- Bevakningar — en modell eller en hel generation, med valfri lagring, egen tröskel och takpris. Bara bevakade modeller ger notiser.
Är sidan nåbar från internet, sätt IFYND_PUBLIC=true och ett
IFYND_WEB_PASSWORD. Då är läsning fortfarande öppen, men knapparna och
admin-fliken kräver inloggning (knappen Logga in uppe till höger).
Allt styrs med miljövariabler. De viktigaste:
| Variabel | Standard | Betydelse |
|---|---|---|
IFYND_INTERVAL |
30m |
Hur ofta Tradera skrapas |
IFYND_THRESHOLD_PCT |
15 |
Minsta % under medianen för att räknas som fynd (kan överstyras i admin) |
IFYND_MIN_SAMPLES |
5 |
Minsta antal sålda innan en bucket litas på (kan överstyras i admin) |
IFYND_DB_PATH |
ifynd.db |
SQLite-databasen (/data/ifynd.db i Docker) |
IFYND_PUBLIC |
false |
Sätt till true när GUI:t är nåbart från internet |
IFYND_WEB_PASSWORD |
— | Krävs när IFYND_PUBLIC är på; låser upp Trasig/Exkludera |
Resten — sidtak, skrapfönster, kategorier med mera — har vettiga
standardvärden och finns i loadConfig() i main.go.
Om en kategori tas bort ur IFYND_CATEGORIES (t.ex. iPad/MacBook) ligger
dess gamla annonser kvar i databasen. Rensa dem med en engångskörning som
tar bort allt som inte längre är konfigurerat:
go run . --prune-retired
# i Docker:
docker compose exec ifynd /ifynd --prune-retiredThe Lagom License — inte för mycket frihet, inte för lite. Precis lagom.

