← back to Whatsmystyle
scripts/sustainability.js
150 lines
/**
* Brand sustainability tiers — hand-curated.
*
* Tier 1 — fast-fashion / known labor-rights or env issues
* Tier 2 — mass-market mainstream, no published sustainability program
* Tier 3 — published sustainability program, mixed materials, mainstream pricing
* Tier 4 — leader in materials / supply-chain transparency, certified programs
* Tier 5 — gold standard (B-Corp / fully circular / 100% recycled-or-organic + transparent)
*
* Sources used to set tiers (synthesized): Good On You, Remake, Common Objective,
* brand-published sustainability reports.
*
* Note — tiers are advisory + change over time. Treat the list as a v1 baseline
* that needs editorial review every quarter.
*/
const TIERS = {
// ---- Tier 5 ----
'Patagonia': 5,
'Eileen Fisher': 5, // actually borderline-4, but circular program is strong
'Reformation': 5,
'Veja': 5,
'Stella McCartney': 5,
'Christy Dawn': 5,
'Pact': 5,
'Outerknown': 5,
// ---- Tier 4 ----
'Everlane': 4,
'Mara Hoffman': 4,
'Levi\'s': 4, // Water<Less program; debated
"Levi's": 4,
'COS': 4,
'AGOLDE': 4,
'Citizens of Humanity': 4,
'Allbirds': 4,
'Tentree': 4,
'Toteme': 4,
// ---- Tier 3 ----
'Madewell': 3,
'J.Crew': 3,
'Nike': 3,
'Adidas': 3,
'H&M': 3, // controversial — green-program exists but fast-fashion volume
'Uniqlo': 3,
'Anthropologie': 3,
'Free People': 3,
'Banana Republic': 3,
'Saint James': 3,
// ---- Tier 2 ----
'Zara': 2,
'Mango': 2,
'Forever 21': 2,
'Old Navy': 2,
'Gap': 2,
// ---- Tier 1 ----
'SHEIN': 1,
'Shein': 1,
'Boohoo': 1,
'Fashion Nova': 1,
'Romwe': 1,
// ---- Luxury (treat as Tier 3 by default — most luxury houses have weak transparency) ----
'Burberry': 3,
'Gucci': 3,
'Prada': 3,
'Saint Laurent': 3,
'Bottega Veneta': 3,
'Loro Piana': 4, // raw-material program is genuinely strong
'The Row': 3,
'Khaite': 3,
'Acne Studios': 3,
'Lemaire': 3,
'Maison Margiela': 3,
'Equipment': 3,
'Mansur Gavriel': 3,
'Common Projects': 3,
'Repetto': 3,
'DVF': 3,
'Fendi': 3,
// ---- v12 expansion 2026-05-12 — +40 brands ----
// Sources: Good On You public ratings, B-Corp directory, Remake brand tracker.
// Tiers are advisory, ranked against the rubric at top of file.
//
// -- Tier 5 (gold-standard / B-Corp / fully circular) --
'Mate the Label': 5, // B-Corp; LA organic basics; 100% non-toxic dyes
'Nudie Jeans': 5, // free lifetime denim repair; circular program
'Boyish Jeans': 5, // 100% deadstock + recycled denim
'Kotn': 5, // B-Corp; Egyptian-cotton coop sourcing
'Tonle': 5, // zero-waste cut, fair-trade Cambodia
// -- Tier 4 (leader in materials / supply-chain transparency) --
'Naadam': 4, // direct-source Mongolian cashmere
'Mott & Bow': 4, // small-batch denim, 30-day fit guarantee
'DL1961': 4, // closed-loop water dye process
'Frank And Oak': 4, // B-Corp; recycled materials line
'Saitex / Outland Denim': 4, // water-recovery denim mill, Australian B-Corp
'Knickey': 4, // organic-cotton underwear + textile recycling
'Boody': 4, // organic bamboo basics
'Tradlands': 4, // small woman-owned, deadstock + LA-made
'Sezane': 4, // 1% for the Planet; Paris-made staples
'Whimsy + Row': 4, // LA deadstock + recycled fabrics
// -- Tier 3 (published program / mainstream pricing) --
'Theory': 3, // Good Wool program; LVMH portfolio
'Vince': 3,
'Joseph': 3,
'Sandro': 3,
'Maje': 3,
'rag & bone': 3,
'A.P.C.': 3,
'Marine Layer': 3, // Re-Spun cotton-recycling line; mixed overall
'Carhartt': 3,
'L.L.Bean': 3,
'Frame': 3,
'Mother': 3, // denim
'Re/Done': 3, // reworked vintage Levi's
'Goldsign': 3,
'Brunello Cucinelli': 3, // strong artisan-labor practices; weak transparency
'Tom Ford': 3,
'Loewe': 3,
'Jacquemus': 3,
// -- Tier 2 (mass-market, no published program) --
'Express': 2,
'Aritzia': 2, // some Babaton material disclosure; volume retail
'Abercrombie & Fitch': 2,
'Hollister': 2,
'American Eagle': 2,
'Aerie': 2,
'White House Black Market': 2,
// -- Tier 1 (fast-fashion / known labor or env issues) --
'PrettyLittleThing': 1,
'Cider': 1,
'Temu': 1, // dropship marketplace, not a brand per se
'Nasty Gal': 1,
};
function tierFor(brand) {
if (!brand) return null;
const key = brand.trim();
if (TIERS[key]) return TIERS[key];
// case-insensitive fallback
const lk = key.toLowerCase();
for (const k of Object.keys(TIERS)) if (k.toLowerCase() === lk) return TIERS[k];
return null;
}
module.exports = { TIERS, tierFor };
if (require.main === module) {
const arg = process.argv[2];
if (arg) console.log(JSON.stringify({ brand: arg, tier: tierFor(arg) }, null, 2));
else console.log(JSON.stringify({ brand_count: Object.keys(TIERS).length, sample: Object.entries(TIERS).slice(0, 6) }, null, 2));
}