1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/assets/hero-fabric-CjePol8E.jpg"/><title>The Grainline Mercantile â Curated Tools for Makers</title><meta name="author" content="The Grainline Mercantile"/><meta property="og:title" content="The Grainline Mercantile â Curated Tools for Makers"/><meta property="og:description" content="A curated shop for people who sew and make for a living. Tools, templates, patterns, and textiles sourced with expertise."/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="The Grainline Mercantile â Curated Tools for Makers"/><meta name="twitter:description" content="A curated shop for people who sew and make for a living. Tools, templates, patterns, and textiles sourced with expertise."/><meta property="og:image" content="https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/c64c3bdf-162a-433e-ae63-1e80dfc4810f"/><meta name="twitter:image" content="https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/c64c3bdf-162a-433e-ae63-1e80dfc4810f"/><meta name="description" content="We travel. We make. We build the tools we wish existed. A curated digital shop for people who sew and make for a living."/><link rel="modulepreload" href="/assets/main-CqrXbnE3.js"/><link rel="modulepreload" href="/assets/index-0A4Y358W.js"/><link rel="modulepreload" href="/assets/Layout-C3Dy6Jwe.js"/><link rel="modulepreload" href="/assets/button-Bhh3MjV7.js"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500&family=Jost:wght@300;400;500;600&display=swap"/><link rel="stylesheet" href="/assets/main-DvIWi4pv.css" type="text/css"/>
1<script src="https://app.lemonsqueezy.com/js/lemon.js" defer=""></script>
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"The Grainline Mercantile","url":"https://grainlinemercantile.com","logo":"https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/c64c3bdf-162a-433e-ae63-1e80dfc4810f","description":"A curated shop for people who sew and make for a living. Tools, templates, patterns, and textiles sourced with expertise.","founder":{"@type":"Person","name":"April Hoy"}}</script>
1</head><body><!--$--><div class="min-h-screen flex flex-col"><header class="sticky top-0 left-0 right-0 z-50 bg-background border-b border-border/50"><div class="container-narrow flex items-center justify-between px-6 md:py-8 py-px bg-violet-50"><a class="text-display text-xl md:text-2xl tracking-widest text-walnut font-medium uppercase py-[32px] active" href="/" data-status="active" aria-current="page">The Grainline Mercantile</a><nav class="hidden md:flex items-center gap-10"><a href="/shop" class="text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300">Shop</a><button type="button" id="radix-_R_55aq_" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300 flex items-center gap-1 outline-none">Apps <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button><a href="/free-resources" class="text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300">LEARN</a><a href="/about" class="text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300">About</a><a href="/work" class="text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300">Work</a><a href="/contact" class="text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300">Contact</a><a aria-label="Cart" href="/cart" class="relative flex items-center gap-2 text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors duration-300"><span class="hidden lg:inline">Cart</span><span class="relative"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shopping-bag" aria-hidden="true"><path d="M16 10a4 4 0 0 1-8 0"></path><path d="M3.103 6.034h17.794"></path><path d="M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z"></path></svg></span></a></nav><div class="md:hidden flex items-center gap-4"><a aria-label="Cart" href="/cart" class="relative flex items-center gap-2 text-sm tracking-[0.2em] uppercase text-foreground/70 hover:text-foreground transition-colors"><span class="hidden sm:inline">Cart</span><span class="relative"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shopping-bag" aria-hidden="true"><path d="M16 10a4 4 0 0 1-8 0"></path><path d="M3.103 6.034h17.794"></path><path d="M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z"></path></svg></span></a><button class="text-foreground p-1" aria-label="Toggle menu"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button></div></div></header><main class="flex-1"><section class="relative min-h-screen flex items-center justify-center overflow-hidden"><div class="absolute inset-0"><img src="/assets/hero-fabric-CjePol8E.jpg" alt="Luxurious fabric and brass pins on walnut wood" class="w-full h-full object-cover" width="1920" height="1080"/><div class="absolute inset-0 bg-walnut/60"></div></div><div class="relative z-10 text-center px-6 max-w-4xl mx-auto fade-in"><h1 class="text-walnut-foreground mb-8 leading-tight">Grainline Mercantile<br/><span class="block text-2xl md:text-4xl mt-4">Curated Tools, Patterns & Textiles for Makers</span></h1>
1<p class="text-walnut-foreground/80 text-lg md:text-xl max-w-2xl mx-auto leading-relaxed mb-10 font-light">We travel. We make. We build the tools we wish existed.<br class="hidden md:block"/>Everything here passed through the hands of someone who sews for a living or makes magic of life.</p><a href="/shop" class="inline-flex items-center justify-center gap-2 whitespace-nowrap tracking-wider uppercase transition-all duration-300 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 font-[var(--font-body)] border bg-transparent h-13 px-10 text-base border-walnut-foreground/40 text-walnut-foreground hover:bg-walnut-foreground/10 hover:text-walnut-foreground">Enter the Shop</a></div></section><section class="section-padding bg-walnut"><div class="container-narrow max-w-3xl text-center"><h2 class="text-walnut-foreground mb-8">About the Shop</h2><p class="text-walnut-foreground/70 leading-relaxed mb-4">The Grainline Mercantile is named for the invisible line that runs through every piece of fabric â the one that determines how it hangs, how it moves, how it wears. Get it wrong, and nothing works. Get it right, and everything falls into place.</p>
1<p class="text-walnut-foreground/70 leading-relaxed mb-10">This shop was built by someone who has spent years cutting along that line â literally and figuratively. Every product here exists because we needed it first.</p><a href="/about" class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm tracking-wider uppercase transition-all duration-300 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 font-[var(--font-body)] border bg-transparent h-11 px-8 py-2 border-walnut-foreground/30 text-walnut-foreground hover:bg-walnut-foreground/10 hover:text-walnut-foreground">Read Our Story</a></div></section></main><footer class="bg-walnut text-walnut-foreground"><div class="container-narrow px-6 py-16 md:py-20"><div class="grid grid-cols-1 md:grid-cols-3 gap-12 md:gap-16"><div><h3 class="text-xl tracking-widest uppercase mb-4 text-walnut-foreground/90">The Grainline Mercantile</h3>
1<p class="text-sm text-walnut-foreground/80 leading-relaxed max-w-xs">Curated tools, templates, and textiles for people who sew and make for a living.</p></div><div><h4 class="text-sm tracking-[0.2em] uppercase mb-6 text-walnut-foreground/75 font-[var(--font-display)]">Navigate</h4><nav class="flex flex-col gap-3"><a class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300 active" href="/" data-status="active" aria-current="page">Home</a><a href="/shop" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">Shop</a><a href="/about" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">About</a><a href="/contact" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">Contact</a></nav></div><div><h4 class="text-sm tracking-[0.2em] uppercase mb-6 text-walnut-foreground/75 font-[var(--font-display)]">Shop</h4><nav class="flex flex-col gap-3">
1<a href="/digital-tools" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">Digital Tools & Software</a><a href="/notion-templates" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">Notion Templates</a><a href="/patterns-embroidery" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">Patterns & Embroidery</a><a href="/fabric-lace" class="text-sm text-walnut-foreground/80 hover:text-walnut-foreground transition-colors duration-300">Fabric & Lace</a></nav></div></div><div class="ledger-line mt-12 pt-8 border-walnut-foreground/10"><p class="text-xs text-walnut-foreground/80 tracking-wider">© <!-- -->2026<!-- --> The Grainline Mercantile. All rights reserved.</p></div></div></footer></div>
1<script>(function(t){let s;try{s=JSON.parse(sessionStorage.getItem(t.storageKey)||"{}")}catch(e){console.error(e);return}const c=t.key||window.history.state?.__TSR_key,r=c?s[c]:void 0;if(t.shouldScrollRestoration&&r&&typeof r=="object"&&Object.keys(r).length>0){for(const e in r){const o=r[e];if(!o||typeof o!="object")continue;const l=o.scrollX,i=o.scrollY;if(!(!Number.isFinite(l)||!Number.isFinite(i))){if(e==="window")window.scrollTo({top:i,left:l,behavior:t.behavior});else if(e){let n;try{n=document.querySelector(e)}catch{continue}n&&(n.scrollLeft=l,n.scrollTop=i)}}}return}const a=window.location.hash.split("#",2)[1];if(a){const e=window.history.state?.__hashScrollIntoViewOptions??!0;if(e){const o=document.getElementById(a);o&&o.scrollIntoView(e)}return}window.scrollTo({top:0,left:0,behavior:t.behavior})})({"storageKey":"tsr-scroll-restoration-v1_3","shouldScrollRestoration":true});document.currentScript.remove()</script>
1<!--/$-->
1<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/main-CqrXbnE3.js"],assets:$R[5]=[$R[6]={tag:"link",attrs:$R[7]={rel:"stylesheet",href:"/assets/main-DvIWi4pv.css",type:"text/css"}},$R[8]={tag:"script",attrs:$R[9]={type:"module",async:!0},children:"import(\"/assets/main-CqrXbnE3.js\")"}]},"/":$R[10]={preloads:$R[11]=["/assets/index-0A4Y358W.js","/assets/Layout-C3Dy6Jwe.js","/assets/button-Bhh3MjV7.js"]}}},matches:$R[12]=[$R[13]={i:"__root__�",u:1791117223572,s:"success",ssr:!0},$R[14]={i:"��",u:1791117223572,s:"success",ssr:!0}],lastMatchId:"��"})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
1<script type="module" async="">import("/assets/main-CqrXbnE3.js")</script>
1</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.