Checked against the catalog
We read the page. Then we believe the page.
A product enters the feed only after a real product page states the fiber composition, and that statement is entirely natural fiber. Prices, weights, and countries are copied. If a number was not on the page, the field is null. We do not fill it from memory, a forum, or a size chart we liked better. This version of the feed holds 85 products.
What gets recorded
- Brand, product name, style, and the product-page URL.
- The fiber sentence, copied into
compositionQuote, plus a normalized composition that has to add to 100. - Fabric weight in the unit the seller used. Ounces of the garment on a scale are not fabric weight, and they are not stored.
- Country of manufacture only when the page names it. "Imported" is not a country.
- The price as displayed, the currency, and the date we looked. A sale price stays a sale price, with the previous figure when they printed one.
- A seller photograph when the page offered one, with the seller named in the credit. A missing photo stays a swatch. We do not invent one.
- A short note on why the piece is worth knowing about. That note is opinion. The specs above it are not.
Verification
The pass that built this version opened maker and retailer pages, including Shopify product data where the store publishes it, and checked the rendered copy for the composition line. A title that merely contains "100% cotton" is not enough if the description is empty. A body that says cotton without a percentage stays in the candidate file.
A disclosed synthetic component excludes the product even when the body cloth is excellent. Ash heather that is 2% polyester is excluded as a color, not allowed to stain the cotton colors of the same style. A satin lining whose fiber is unnamed is excluded, because satin in that role is often polyester or acetate and the page did not say silk. Regenerated cellulose — rayon, viscose, modal, lyocell — is rejected.
node scripts/validate.mjs refuses the catalog if any fiber is outside the natural allowlist, if
percents do not add to 100, or if the composition line contains polyester, nylon, acrylic, elastane, spandex,
rayon, viscose, modal, lyocell, or the rest of that list. It also checks that a derived gram weight, when we
compute one for sorting, follows a single published factor: 1 oz/yd² = 33.905747 g/m², rounded to the nearest
gram. If the seller printed both units and they disagree by more than 3%, both are kept and the conflict is
shown. Merz b. Schwanen's 3S48 is the case. The count has to stay between 80 and 180 so a quiet deletion does
not look like a publish.
Weight bands for the filter are ours, not the maker's adjectives. Under 400 g/m² is substantial. From 400 up to but not including 540 is heavy. 540 and above is ultra. Unstated stays unstated. Sorting uses the gram figure the seller printed when both units exist, including when they disagree.
Price bands
These are an editorial reading of the sticker in its own currency. They are not a foreign-exchange table. The upper edge of each band is exclusive.
| Currency | Modest | Mid | High | Rare air |
|---|---|---|---|---|
| USD | under 140 | 140–219 | 220–399 | 400 and up |
| CAD | under 160 | 160–279 | 280–449 | 450 and up |
| GBP | under 90 | 90–189 | 190–339 | 340 and up |
| EUR | under 120 | 120–209 | 210–359 | 360 and up |
| JPY | under 18,000 | 18,000–27,999 | 28,000–39,999 | 40,000 and up |
| DKK | under 1,600 | 1,600–2,399 | 2,400–3,999 | 4,000 and up |
| SEK | under 800 | 800–1,599 | 1,600–2,799 | 2,800 and up |
How a listing ages
checkedOn is the day a person, or the Monday pass, last accepted the page. The site computes age
from that date. After 45 days the card is marked stale. After 120 days it leaves
the default grid. The "Show hidden" box brings it back. A weekly GitHub Action fetches each product URL and
opens an issue when a link dies, the composition sentence disappears, the sticker is missing, or the page says
sold out. That job does not rewrite prices or fibers by itself. The machine-readable copy of the same files is
/data/catalog.json, which is what a Monday recheck can read without scraping the HTML.
What this pass did not do
No lab tests, no burn tests, no mystery shopping beyond the public page. A seller can be wrong. Silence on the rib is not a disclosed blend, and it is also not a lab test. The log of exclusions and the waiting room is kept out.
Open questions
These are in the feed, or next to it, and they want an editor's yes.
- Sunray's Laniakea crew is 450 GSM 100% cotton. The retailer page also says the labels are recycled polyester. A label is not the cloth. It is flagged in the product note in case a label counts as a component.
- Pro Club's vintage wash pullover says 100% cotton and heavyweight, and prints no ounces. It is in the feed as weight unstated. The famous 13 oz Pro Club hoodie is 60/40 and is excluded.
- Andersen-Andersen's navy knits and Lady White's raglan link sweater are wool, not fleece, and the pages do not give GSM. They are here because the fiber is only wool. Gauge is not grams.
- Pangaia's 365 heavyweight did not resolve to a product page with a composition we could quote. It is not in the feed. Kotn's classic crew URL 404'd. Smartwool's usual merino is nylon-reinforced and was not added from a guess.
- Iron Heart's 14 oz zip is filed as a zip sweater, not a zip hoodie. The page is a stand collar and a zipper.
- Affiliate links are still off.