[{"data":1,"prerenderedAt":181},["ShallowReactive",2],{"work-wayta-peru":3,"work-siblings-wayta-peru":143},{"id":4,"title":5,"accent":6,"body":7,"completedAt":121,"cover":122,"coverAlt":123,"description":13,"extension":124,"external":125,"liveUrl":126,"meta":127,"navigation":128,"order":129,"path":130,"role":131,"seo":132,"stack":133,"status":138,"stem":139,"summary":140,"year":141,"__hash__":142},"work\u002Fwork\u002Fwayta-peru.md","Wayta Perú","#9a3412",{"type":8,"value":9,"toc":112},"minimark",[10,14,19,22,41,45,57,63,66,72,76,83,97,101,104],[11,12,13],"p",{},"Wayta Perú runs guided trips through the Sacred Valley. They needed a site that reads as a\nserious operator in two languages, and they needed to change the copy themselves without opening\na pull request or waiting on me for a typo.",[15,16,18],"h2",{"id":17},"the-problem-underneath-the-brief","The problem underneath the brief",[11,20,21],{},"Small operators usually end up with two half solutions. Either the site is a static build that\nlooks right and cannot be edited, or it is a page builder that can be edited and never quite\nlooks right. Both fail in the same place: the second language. Translation gets bolted on as a\nduplicate page tree, the two copies drift apart within a season, and the English side quietly\nbecomes the stale one.",[23,24,25,31,36],"metric-row",{},[26,27],"metric",{"label":28,"note":29,"value":30},"Locales","Spanish is the default, English is a first class peer rather than a translation layer.","2",[26,32],{"label":33,"note":34,"value":35},"Deployment","Marketing pages, blog, and the editing studio all ship together.","1",[26,37],{"label":38,"note":39,"value":40},"Duplicated page trees","One route definition, two locales resolved from it.","0",[15,42,44],{"id":43},"how-it-is-built","How it is built",[11,46,47,48,52,53,56],{},"Next.js 15 App Router, with ",[49,50,51],"code",{},"next-intl"," owning the locale segment. The routes are declared once\nand both locales resolve through the same tree, so a section added in Spanish exists in English\nthe moment its copy lands. Sanity holds every editable string and the blog, and the studio is\nembedded at ",[49,54,55],{},"\u002Fstudio"," in the same deployment, which means the client has one URL to remember and\none login to lose.",[58,59],"shot",{"alt":60,"caption":61,"src":62},"The Wayta Perú home page at desktop width, showing the itinerary section.","The home page is one anchored document rather than a set of thin sub pages, which suits how people actually read an operator site.","\u002Fwork\u002Fwayta-peru\u002Fshot-home.png",[11,64,65],{},"The interesting constraint was the language switch. Moving between locales has to keep the reader\nwhere they were. Someone halfway down the itineraries section who taps English and lands back at\nthe top of the home page has been punished for wanting to read it in their own language.",[67,68],"demo",{"component":69,"note":70,"origin":5,"title":71},"LocaleDemo","The switch is labelled in the language it will take you to, not the one you are already reading. That single rule removes most of the confusion around language toggles.","Locale switch that keeps your place",[15,73,75],{"id":74},"the-rest-of-the-site","The rest of the site",[77,78],"reel",{"alt":79,"caption":80,"poster":81,"src":82},"A scroll through the Wayta Perú home page from the hero down to the contact section.","A scroll capture rather than an embedded frame, so this keeps working exactly as it is even after the live site changes.","\u002Fwork\u002Fwayta-peru\u002Freel-poster.png","\u002Fwork\u002Fwayta-peru\u002Freel.mp4",[84,85,87,92],"gallery",{"columns":30,"label":86},"Screens from Wayta Perú",[58,88],{"alt":89,"caption":90,"src":91},"A blog entry rendered from Sanity Portable Text, with the language switch in the header.","Blog entries come out of Sanity as Portable Text.","\u002Fwork\u002Fwayta-peru\u002Fshot-blog.png",[58,93],{"alt":94,"caption":95,"src":96},"The embedded Sanity studio at the studio route, showing the itinerary document type.","The studio ships inside the same deployment.","\u002Fwork\u002Fwayta-peru\u002Fshot-studio.png",[15,98,100],{"id":99},"what-i-would-keep","What I would keep",[11,102,103],{},"The one deployment decision paid for itself immediately. The client edits in the same place they\nvisit, there is no separate CMS host to renew, and preview builds show real content because there\nis only ever one source of it.",[105,106,109],"callout",{"title":107,"tone":108},"Carried into later work","accent",[11,110,111],{},"Every multilingual project since starts from the routing model rather than the design. If the\nlocale strategy is decided after the layout, the layout has already made assumptions that the\nsecond language will break.",{"title":113,"searchDepth":114,"depth":115,"links":116},"",2,3,[117,118,119,120],{"id":17,"depth":114,"text":18},{"id":43,"depth":114,"text":44},{"id":74,"depth":114,"text":75},{"id":99,"depth":114,"text":100},"2026-03","\u002Fwork\u002Fwayta-peru\u002Fcover.png","The Wayta Perú home page, a full width valley photograph under a bilingual navigation bar.","md",null,"https:\u002F\u002Fwaytaperu.com",{},true,1,"\u002Fwork\u002Fwayta-peru","Design and build, end to end",{"title":5,"description":13},[134,135,136,51,137],"Next.js 15","React 19","Sanity","Tailwind v4","completed","work\u002Fwayta-peru","A bilingual travel operator site where the marketing page, the blog, and the studio the client edits in are one deployment.",2026,"iEZyI3UTpDqgOBEOIIp4l6o27UGEkPZ_sTH8HsBAGaM",[144,145,149,153,157,161,165,169,173,177],{"path":130,"title":5,"summary":140},{"path":146,"title":147,"summary":148},"\u002Fwork\u002Fpersonae","Personae","A persona library built on IBM Carbon, where every profile links out to its research and every reader can flag a claim that no longer holds.",{"path":150,"title":151,"summary":152},"\u002Fwork\u002Farsonistai","ArsonistAI","An AI design consultancy with two audiences on one homepage, enterprises hiring for AI augmented product work, and individual designers buying tools off the shelf.",{"path":154,"title":155,"summary":156},"\u002Fwork\u002Fhcit","HCIT","A five vertical AI and infrastructure integrator whose site had to make enterprise grade credibility legible without turning into an alphabet soup of sub brands.",{"path":158,"title":159,"summary":160},"\u002Fwork\u002Flynne","Lynne","A lead capture first booking site for a solo telehealth counseling practice, sized to get one action in front of a visitor rather than a full site's worth of pages.",{"path":162,"title":163,"summary":164},"\u002Fwork\u002Fn-hub","N Brand Portal","An internal brand portal holding the logos, color tokens, and templates a small team actually needs, so the approved asset stops living in an eight month old Slack thread.",{"path":166,"title":167,"summary":168},"\u002Fwork\u002Freductivist","Reductivist","A minimalist goods brand selling a handful of well made objects, where the real commerce problem was resisting the urge to add a fourth product to the homepage.",{"path":170,"title":171,"summary":172},"\u002Fwork\u002Fpattern-library","Pattern Library","Four hundred and twenty two documented interaction patterns across web, mobile, and cross platform concerns, with the rationale that makes each one work.",{"path":174,"title":175,"summary":176},"\u002Fwork\u002Fflow-society-mx","Flow Society MX","An e-bike tour operator in Jalisco, with a six step booking flow, a per departure availability calendar, and an operator dashboard behind it.",{"path":178,"title":179,"summary":180},"\u002Fwork\u002Fcytron-motorcycles","Cytron Motorcycles","A Tokyo motorcycle brand invented end to end, drawn as a working prototype and then built as the site that prototype had been arguing for.",1789230933860]