[{"data":1,"prerenderedAt":236},["ShallowReactive",2],{"navigation":3,"/blog/jp-landing":51,"/blog/jp-landing-surround":233},[4],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Blog","/blog","blog",[9,13,35,39,43,47],{"title":10,"path":11,"stem":12},"Using the official exchange rate in Venezuela's e-commerce","/blog/bcv-scraper","blog/bcv-scraper",{"title":14,"path":15,"stem":16,"children":17,"page":34},"Case Studies","/blog/case-studies","blog/case-studies",[18,22,26,30],{"title":19,"path":20,"stem":21},"Rebuilding an e-commerce platform on NestJS + Next.js + Medusa in three months","/blog/case-studies/retail-ecommerce-rebuild","blog/case-studies/retail-ecommerce-rebuild",{"title":23,"path":24,"stem":25},"Stabilizing an inherited e-commerce platform on NestJS + Strapi","/blog/case-studies/retail-ecommerce-recovery","blog/case-studies/retail-ecommerce-recovery",{"title":27,"path":28,"stem":29},"A nationwide mobile sales-quotation app, integrated with SAP","/blog/case-studies/retail-sap-quotation-app","blog/case-studies/retail-sap-quotation-app",{"title":31,"path":32,"stem":33},"Shipping a high-scale PWA from an inherited e-commerce project","/blog/case-studies/supermarket-pwa-recovery","blog/case-studies/supermarket-pwa-recovery",false,{"title":36,"path":37,"stem":38},"From Nuxt to Hugo and Back Again","/blog/from-nuxt-to-hugo","blog/from-nuxt-to-hugo",{"title":40,"path":41,"stem":42},"The Intern is downloading movies again","/blog/intern-movie-torrent","blog/intern-movie-torrent",{"title":44,"path":45,"stem":46},"Japanese input in openSUSE Tumbleweed's KDE","/blog/japanese-input","blog/japanese-input",{"title":48,"path":49,"stem":50},"Jhey Pi: an official landing site for an aspiring musician","/blog/jp-landing","blog/jp-landing",{"id":52,"title":48,"author":53,"body":59,"category":211,"client":212,"date":213,"description":214,"extension":215,"featured":34,"image":216,"meta":217,"minRead":218,"navigation":219,"ogImage":212,"outcome_headline":220,"path":49,"repoUrl":221,"role":222,"seo":223,"stack":224,"stem":50,"tags":228,"team_size":230,"type":211,"year":231,"__hash__":232},"blog/blog/jp-landing.md",{"name":54,"username":55,"to":56,"avatar":57},"Iván Álvarez","ivanovertime","https://github.com/ivanovertime",{"src":58,"alt":54},"/avatar.jpg",{"type":60,"value":61,"toc":201},"minimark",[62,67,71,75,78,82,95,99,167,171,174,177,194,198],[63,64,66],"h2",{"id":65},"tldr","TL;DR",[68,69,70],"p",{},"Jhey Pi is the official landing site for an aspiring musician. I built it to keep the artist story, Spotify releases, and YouTube videos in one place, with a simple feed that stays easy to scan.",[63,72,74],{"id":73},"context","Context",[68,76,77],{},"The goal was to make a landing site that felt like a proper home for the artist, not just another promo page. The site pulls the latest Spotify releases and YouTube videos into one feed, so the content stays current without turning the page into a manual update burden.",[63,79,81],{"id":80},"constraints","Constraints",[83,84,85,89,92],"ul",{},[86,87,88],"li",{},"Keep the experience lightweight and easy to update.",[86,90,91],{},"Merge Spotify releases, artist profile data, and YouTube videos into one feed.",[86,93,94],{},"Support bilingual copy without making the page feel crowded.",[63,96,98],{"id":97},"decisions","Decisions",[100,101,102,118],"table",{},[103,104,105],"thead",{},[106,107,108,112,115],"tr",{},[109,110,111],"th",{},"Decision",[109,113,114],{},"Trade-off",[109,116,117],{},"Chose",[119,120,121,132,145,155],"tbody",{},[106,122,123,127,130],{},[124,125,126],"td",{},"Build a traditional promo site with separate pages for music and video",[124,128,129],{},"More room for content, but harder to keep current",[124,131],{},[106,133,134,137,140],{},[124,135,136],{},"Build a single landing site with a merged, auto-sorted feed",[124,138,139],{},"Easier to scan and maintain; the artist updates in one place",[124,141,142],{},[143,144],"decision-check",{},[106,146,147,150,153],{},[124,148,149],{},"Keep the copy monolingual",[124,151,152],{},"Simpler, but weaker reach for bilingual audiences",[124,154],{},[106,156,157,160,163],{},[124,158,159],{},"Support ES/EN copy",[124,161,162],{},"Better fit for the audience, with a little more content work",[124,164,165],{},[143,166],{},[63,168,170],{"id":169},"outcome","Outcome",[68,172,173],{},"The project shipped as a clean landing site for Jhey Pi with a single content feed, artist profile data, and room for bilingual copy. It also made the update flow simpler: new releases and videos can surface without needing the whole page to be rewritten.",[68,175,176],{},"Feature-wise, the useful pieces were:",[83,178,179,182,185,188,191],{},[86,180,181],{},"Spotify releases and artist profile via Spotify API.",[86,183,184],{},"YouTube latest videos via the channel feed.",[86,186,187],{},"Auto-sorted, paginated feed with embeds.",[86,189,190],{},"Bilingual copy in ES/EN.",[86,192,193],{},"ISR caching for the feed endpoint.",[63,195,197],{"id":196},"what-id-do-on-gcp-today","What I'd do on GCP today",[68,199,200],{},"If this needed to scale further, I would keep the feed endpoint cached with ISR-style behavior, move the integrations behind a small server layer, and host the front end on Cloud Run or Firebase Hosting with preview environments per pull request.",{"title":202,"searchDepth":203,"depth":203,"links":204},"",2,[205,206,207,208,209,210],{"id":65,"depth":203,"text":66},{"id":73,"depth":203,"text":74},{"id":80,"depth":203,"text":81},{"id":97,"depth":203,"text":98},{"id":169,"depth":203,"text":170},{"id":196,"depth":203,"text":197},"side-project",null,"2026-05-18T00:00:00.000Z","Official landing site for Jhey Pi, built with Nuxt 4 and Nuxt UI to combine Spotify releases and YouTube videos into a single feed.","md","/projects/jp-landing.png",{},3,true,"Shipped a focused artist landing site with a single feed for music updates and video content","https://github.com/ivanovertime/jp-landing","Engineer",{"title":48,"description":214},[225,226,227],"Nuxt","Vue","Tailwind CSS",[229,211],"nuxt",1,2026,"wTRxvyRnq-qGhONpRBPW3Wz7fgKZFHDAhP18rG2Xk3s",[234,212],{"title":44,"path":45,"stem":46,"description":235,"children":-1},"Here are the steps to install fcitx5 and fcitx5-mozc input method for Japanese in openSUSE Tumbleweed.",1779739958195]