Tracks price drops at Vinmonopolet, the Norwegian wine and spirits monopoly.
Vinmonopolet changes prices across its catalogue every month. Vintilbud records those changes, works out which ones are genuine reductions, and keeps the ones still worth buying — filtering out anything already sold out. The result is a list of what has recently become cheaper, with how much came off each price.
A single Flutter codebase for both platforms. It lists the current price drops, lets you filter by product type and sort by discount, price, percentage or alcohol content, and links straight through to the product page on vinmonopolet.no.
State is handled with signals; the app talks to the JSON API below and holds no database of its own.
A single Go binary behind nginx, backed by PostgreSQL. Schema changes run as versioned migrations on start-up, so a deploy is one binary plus whatever migrations it carries.
A scraping job reads Vinmonopolet's own product API, compares each price against the last one stored, and writes any change it finds. A second pass fetches each changed product's page and parses its embedded JSON-LD for stock and availability, which is how sold-out items get dropped from the list. Only products that actually changed are re-checked.
Responses are cached in memory, request bodies are capped, and all requests are rate limited. The refresh endpoints require a token; reading the offers does not.