[{"data":1,"prerenderedAt":156},["ShallowReactive",2],{"project-guild-linktree":3},{"slug":4,"title":5,"category":6,"summary":7,"tags":8,"role":17,"period":18,"link":20,"metrics":21,"relatedCapabilities":40,"featured":44,"createdAt":45,"published":44,"sections":46},"guild-linktree","The GUILD Bio Link Surface","ecosystem","Instagram gives every account exactly one link in the bio. We replaced that one link with a self-hosted surface at links.guildgemlab.com — featured campaigns, the latest posts, the official subdomains, every social account, all surfaced from the same backend that runs the rest of the operation. The killer feature: the post grid is a SQL join between social content and Aurora Awards entries.",[9,10,11,12,13,14,15,16],"Self-hosted Surface","Bio Link","Cloudflare Pages + ISR","Worker Proxy","Cross-system SQL","UTM Analytics","Instagram + Aurora","Config-driven Campaign","Product, Design & Engineering",{"start":19},"2025-09","\u002Fprojects\u002Fguild-linktree",[22,25,28,31,34,37],{"label":23,"value":24},"Self-hosted on","links.guildgemlab.com",{"label":26,"value":27},"Edge cache","Cloudflare Pages",{"label":29,"value":30},"ISR","1h",{"label":32,"value":33},"Cross-system join","Social + Aurora",{"label":35,"value":36},"Time to swap a campaign","5 min",{"label":38,"value":39},"3rd-party tool dependency","0",[41,42,43],"product","design","marketing",true,"2025-09-15",[47,65,79,105,130],{"id":48,"index":49,"title":50,"tagline":51,"body":52},"thesis","01","The thesis","An Instagram bio link is not a link. It is a tiny homepage, with a featured campaign, the latest posts, the official subdomains, and every social account — all served from the same backend that runs the rest of the operation.",[53,56,58,60,63],{"type":54,"text":55},"p","Instagram gives every account exactly one link in the bio. One URL, one chance, one slot. You can change it — once a week, if you are disciplined — but you cannot make it dynamic, you cannot segment it, and you cannot know what each visitor actually wanted.",{"type":54,"text":57},"For a personal account, one link is fine. For a brand running two entities, six channels, four subdomains, and an international competition, one link is not a link. It is a bottleneck. Every campaign fights for the same slot. The slot always loses.",{"type":54,"text":59},"We tried the obvious answer first — a third-party linktree. It worked for a while. Then it stopped working. The tool was a black box: no analytics worth trusting, no backend integration, no way to surface the Aurora Awards entries we were running. The single link was a black hole, not a surface.",{"type":61,"text":62},"quote","An Instagram bio link is not a link. It is a tiny homepage. Build it like you would build a homepage.",{"type":54,"text":64},"The GUILD Bio Link Surface is what we built instead. A self-hosted page at links.guildgemlab.com, backed by the same data layer that runs the rest of the operation. A featured campaign slot, configurable from a single file. A post grid that joins two systems in SQL. A social follow row. And a UTM analytics layer that knows which post brought which click.",{"id":66,"index":67,"title":68,"tagline":69,"body":70},"origin","02","The origin","The campaign that broke the static link.",[71,73,75,77],{"type":54,"text":72},"In 2025, GUILD launched the Aurora Awards — an international gem and jewelry competition. Entries started flowing in. Each entry was a Reel on Instagram. The static bio link was pointing at the main website. The competition lived somewhere else. The two never met.",{"type":54,"text":74},"One day, looking at the analytics on the third-party linktree, I realized it was not surfacing the Aurora entries at all. They were just regular Instagram posts in the grid, indistinguishable from everything else. The most important campaign of the year was getting the same treatment as a Tuesday morning post.",{"type":54,"text":76},"That was the moment. The link in the bio could not be a third-party tool anymore. It had to be a surface that knew about our backend, our campaigns, and our competition. It had to be a homepage — a 720-pixel-wide one, optimized for a thumb tap, but a homepage nonetheless.",{"type":54,"text":78},"The rest of this case study is the system that fell out of that moment. Every module, every line of the worker proxy, every UTM parameter — they exist because of a single observation: the one link Instagram gives you is not enough, and a third-party tool can never know enough to fill the gap.",{"id":80,"index":81,"title":82,"tagline":83,"modules":84},"system","03","The system","Five modules, one surface, all from the same backend.",[85,89,93,97,101],{"name":86,"role":87,"description":88},"The Featured Banner","Config-driven campaign slot","The most important thing on the page, sitting at the top above everything else. Backed by a single config file (site-banner.ts) that anyone on the team can edit — title, image, link, CTA, eyebrow, theme. Swap a campaign in five minutes: change the file, push to git, deploy. No code changes, no meeting, no ticket.",{"name":90,"role":91,"description":92},"Static Link Sections","The official surfaces","Two sections that rarely change: \"Our Websites\" (GUILD Gem Laboratories, GUILD Institute, Field Gemology) and \"Knowledge & Research\" (Latest News, Scientific Papers). These earn their place by being the most-trafficked destinations over the long term, not by being flashy. The link to the main domain is here, in plain sight, every time.",{"name":94,"role":95,"description":96},"Dynamic Post Grid","Instagram + Aurora, joined in SQL","The killer feature. Pulls the latest 90 posts from the backend via the worker proxy. Posts with is_public=True show up. Posts with aurora_no bound AND the corresponding Aurora work has lab data AND images ALSO show up — with an \"Aurora\" badge, a play icon, and a click that jumps to the official Aurora page (guildgemlab.com\u002Faurora\u002Fworks\u002F{aurora_no}). The backend query joins two systems (Social Media + Aurora) and decides visibility at the database level, not the page level.",{"name":98,"role":99,"description":100},"Social Follow Row","5 platforms, 2 IG accounts","Two Instagram accounts (GUILD Gem Laboratories + GUILD Institute of Gemology), Facebook, LinkedIn, YouTube. Each gets its own icon, label, and analytics event tag. The follow row is the \"everything else\" layer — for visitors who arrived for a specific campaign but might want to follow the brand long-term.",{"name":102,"role":103,"description":104},"Analytics Layer","UTM + gtag, per-link","Every outbound link gets ?utm_source=links.guildgemlab.com&utm_medium=bio_link&utm_campaign=guild_linktree. Per-link utm_content is set from the link tag (e.g. \"post-147\", \"banner-aurora\", \"ig-lab\") for granular tracking. gtag fires on every click for cross-platform attribution in GA4. The third-party tool we used before gave us \"X clicks\". This gives us \"X clicks on Aurora Award #47 from the Instagram post grid, by visitors arriving from mobile.\"",{"id":106,"index":107,"title":108,"tagline":109,"body":110},"wiring","04","The wiring","The page is a surface. The backend is the source.",[111,113,116,118,120,122,124,126,128],{"type":54,"text":112},"The page lives on Cloudflare Pages. The home route is ISR-cached at one hour, so the worker only calls the backend 24 times a day. All users get cached HTML from the nearest Cloudflare PoP. The deep-Shenzhen backend latency is hidden at the worker level, not the user level.",{"type":114,"text":115},"h3","The worker proxy",{"type":54,"text":117},"\u002Fapi\u002Fposts is a server-side Nuxt route that runs inside the Cloudflare Worker — never in the user's browser. It calls the GUILD_UNION_BACKEND at \u002Fsocial-media\u002Flinktree\u002Fposts, with a 10-second timeout (generous for LAN+WAN to Shenzhen). On success it returns the items + total. On failure it returns an empty list — ISR does not break, the static link sections still work, the user never sees a broken page.",{"type":114,"text":119},"The cross-system SQL",{"type":54,"text":121},"The backend query is the heart of the system: SELECT posts WHERE is_public = true OR (aurora_no is bound AND the Aurora work is publicly visible). One query, two systems joined, visibility decided in SQL — not in JavaScript, not in the page. The page just renders what the backend says. Marketing decides visibility in one place; the page is dumb.",{"type":114,"text":123},"The UTM layer",{"type":54,"text":125},"A single outboundUrl(href, content) utility handles every external link: trailing slash normalization, default UTM params, per-link utm_content. The same utility is used for the static links, the post grid, the social row, and the banner. One function, one place to evolve the analytics story.",{"type":114,"text":127},"The SEO stance",{"type":54,"text":129},"The page is noindex, follow. The canonical URL points at the main site's \u002Flinks page. All SEO weight is attributed to guildgemlab.com, not to links.guildgemlab.com. The linktree is for humans, not for Google.",{"id":131,"index":132,"title":133,"tagline":134,"metrics":135,"body":147},"outcome","05","The outcome","One link, but not the kind Instagram meant.",[136,137,139,142,144,145],{"label":23,"value":24},{"label":26,"value":138},"Cloudflare Pages · 1h ISR",{"label":140,"value":141},"Backend calls","24 \u002F day",{"label":32,"value":143},"Social Media + Aurora",{"label":35,"value":36},{"label":38,"value":146},"Zero",[148,150,152,154],{"type":54,"text":149},"The link in the bio now does what it was supposed to do. It is a surface that knows about our backend, our campaigns, and our competition. It does not just sit there — it learns, because every click is logged with full attribution, and every campaign is one config-file change away.",{"type":54,"text":151},"When a new Aurora entry comes in, it shows up in the grid automatically — with the right badge, the right click destination, the right analytics. The marketing team does not touch a thing. The system handles it. That is the test of a system: it works whether or not the person who built it is in the room.",{"type":54,"text":153},"When a new campaign launches, we edit a config file, push to git, and five minutes later the new banner is live. The third-party tool we used before would have taken a meeting, a ticket, and a manual link update. The GUILD Bio Link Surface takes a single line of TypeScript.",{"type":61,"text":155},"A bio link is the most constrained real estate in modern marketing. Build it like you would build a homepage — because that is what it is.",1785988758942]