My mother sews a lot, and over the years she has built up a sizeable collection of Gütermann sewing thread. The problem is a familiar one for anyone with a hobby that involves supplies: standing in the shop, she could never remember which colours she already had at home. So she kept buying duplicates of colours she owned and missing the ones she actually needed. A handwritten list never survived contact with reality, because Gütermann sells around 400 colours and many of them look almost identical.
I wanted to give her something better than a notebook, so I built Garen Collectie, a small Android app that does one thing well: it shows the complete Gütermann colour range and lets her track exactly which spools she owns.
The Problem: 400 Colours and No Overview
Gütermann’s sewing thread comes in roughly 400 shades, sold in two spool sizes: small 200m spools and large 1000m spools. The colours are identified by a number, not just a name, and a lot of them are subtle variations on the same hue. Without the physical spool in hand it is genuinely hard to tell “muisgrijs” from “donkergrijs”, or to remember whether you own 615 or 635.
For someone shopping for thread, that means two recurring frustrations: buying a colour you already have, or standing in front of the rack unsure whether a shade you need is missing from your collection. What was needed was a single overview of the entire range, with a clear marker on the ones she already owns.
The Solution: Catalogue Plus Inventory
The app has two screens. The first is the full catalogue of all 400 Gütermann colours, each with its official number, Dutch colour name, and a photo of the actual spool. The second is her personal inventory, the subset she owns, with the quantities she has of each.

The catalogue, the colour detail sheet, and the personal inventory.
Tapping a colour opens a detail sheet where she can record how many small (200m) and large (1000m) spools she has, and flag a colour as running low so it lands on the next shopping list. The inventory screen then summarises the whole collection at a glance: how many colours, how many spools, and which ones are nearly empty.
The result is that the question “do I already have this colour?” now has an instant answer in her pocket, and the follow-up question “which ones am I running low on?” does too.
Managing a Growing Collection
Editing a large collection one colour at a time gets tedious, so the inventory screen supports multi-select. She can pick several colours at once and mark them all as nearly empty so they land on the shopping list, mark them as replenished again, or remove them in a single action.
Because everything lives on the device, I also added simple backup and restore from the menu. The whole inventory can be exported to a JSON file and brought back later, either by replacing the current collection or by merging it in, with the quantities added together. A new phone or a reinstall never means rebuilding the list by hand.
Getting the Data: Scraping 400 Colours
An app like this is only as good as its catalogue, and I did not want to type 400 colours and their photos by hand. Gütermann does not publish a tidy machine-readable colour list, so I went looking for a source that already had every colour laid out with a consistent photo per shade.
I found it at fourniturenkraam.nl, a Dutch haberdashery that sells each Gütermann colour as its own product, complete with a clean studio photo of the spool. The shop runs on Shopify, which turned out to be the key that made scraping straightforward and polite: every Shopify collection exposes a paginated JSON feed at /collections/<handle>/products.json. That meant I never had to parse fragile HTML. I could read structured product data directly.
The individual 200m spools all live in one collection, and each product title encodes both pieces of information I needed:
"Gutermann naaigaren | 200m | 000 zwart" -> code "000", name "zwart"
"Gütermann garen | 200m | 100 donker mint" -> code "100", name "donker mint"
So the scraper stays tiny. It pages through the JSON feed, parses the colour code and Dutch name from the part of each title after the last |, and downloads the first product image. That is essentially the whole thing:
while products := json.loads(get(FEED.format(page)))["products"]:
for product in products:
code, _, name = product["title"].split("|")[-1].strip().partition(" ")
if not code.isdigit() or not product["images"]:
continue # skip the colour-card product and anything without a photo
(ASSETS / f"images/{code}.jpg").write_bytes(get(product["images"][0]["src"].split("?")[0]))
catalog[code] = {"code": code, "name": name, "image": f"images/{code}.jpg"}
page += 1
The output is a single gutermann-colors.json file plus an images folder, both written straight into the app’s assets/ directory so the app reads them offline with no backend at all. Two small details keep it robust: the parser skips any title whose trailing segment does not start with a number (that filters out the colour-card product), and it sends an honest gutermann-color-scraper/1.0 User-Agent because the shop’s bot protection returns a 403 for a spoofed browser one.
The script lives in the repo, so the catalogue can be regenerated any time the shop adds or renames a colour. It uses only the Python standard library, so there is nothing to install:
python3 scripts/scrape_gutermann_colors.py
The Technical Foundation
Garen Collectie is a native Android app written in Kotlin with Jetpack Compose and Material 3 for the UI. The architecture is a straightforward MVVM setup with a repository layer. The personal inventory is stored locally in a Room (SQLite) database, while the colour catalogue is loaded from the bundled JSON and parsed with Gson. Spool photos are loaded from the app’s assets with Coil. Everything runs on the device, with no server and no account, which suits a single-user app that just needs to work reliably in a fabric shop with shaky signal.
What I Built It For
This project was not about the tech. My mother is the only user, and the measure of success is simple: she stops buying thread she already owns and stops running out of the colours she uses most. Building it was a nice excuse to do a small, complete Android project end to end, from scraping the source data to a polished Compose UI, but the real reward is that it is genuinely useful to someone I care about.
Current Status
The app is finished and in regular use. The catalogue covers the full Gütermann range, the inventory does exactly what it needs to, and the scraper lives in the repo so the colour list can be refreshed whenever the source shop changes. If you would like to use it yourself, you can download the app from the releases page.