[{"data":1,"prerenderedAt":192},["ShallowReactive",2],{"profile":3,"projects:page:\u002Fprojects\u002Fforevermore":22,"projects:docs:\u002Fprojects\u002Fforevermore":160,"structured-data:current-stack":179},{"id":4,"alias":5,"current":6,"email":10,"extension":11,"headline":12,"links":13,"location":17,"meta":18,"name":19,"stem":20,"__hash__":21},"profile\u002Fprofile.yml","readonly",{"role":7,"company":8,"companyUrl":9},"Fullstack Engineer — Tech Lead","DataCose","https:\u002F\u002Fdatacose.com","redonemini18@gmail.com","yml","Fullstack Engineer",{"github":14,"linkedin":15,"twitch":16},"https:\u002F\u002Fgithub.com\u002FRedoni18","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fredon-emini\u002F","https:\u002F\u002Fwww.twitch.tv\u002Fr3adonly","Pristina, Kosovo",{},"Redon Emini","profile","Fbb1IAp4nuUOOtgXdwpzcqSmG0CUKtZ4D0ifPqdK5QU",{"id":23,"title":24,"body":25,"description":135,"extension":136,"featured":137,"kind":138,"links":139,"meta":141,"navigation":137,"order":142,"path":143,"period":144,"preview":145,"seo":149,"stack":150,"stem":157,"year":158,"__hash__":159},"projects\u002Fprojects\u002Fforevermore\u002Findex.md","Forevermore",{"type":26,"value":27,"toc":128},"minimark",[28,32,35,61,66,69,102,105,109,112,118,123],[29,30,31],"p",{},"Forevermore lets you send someone a small animated world. You pick a scene from a catalog (a fairground at night, a manor seen in cross-section, a coral reef), fill it with your own photos, a short letter and a song, and send it the way you'd send any message. The person on the other end opens a link on their phone. There's no account to create and nothing to install.",[29,33,34],{},"I design, build and ship it on my own, from the illustrations on the catalog cards to the Postgres migrations underneath.",[36,37,38,46,51,56],"gallery",{},[39,40],"figure",{"alt":41,"caption":42,"height":43,"src":44,"width":45},"Hand-illustrated poster art for a ferris wheel world at night","The Fairground",1600,"\u002Fprojects\u002Fforevermore\u002Ffairground.webp",1200,[39,47],{"alt":48,"caption":49,"height":43,"src":50,"width":45},"Hand-illustrated poster art of a cross-section dollhouse-style manor at night","The Manor","\u002Fprojects\u002Fforevermore\u002Fmanor.webp",[39,52],{"alt":53,"caption":54,"height":43,"src":55,"width":45},"Hand-illustrated poster art of an underwater reef scene with a glowing pearl","Deep Reef Dive","\u002Fprojects\u002Fforevermore\u002Fdeep-reef-dive.webp",[39,57],{"alt":58,"caption":59,"height":43,"src":60,"width":45},"Hand-illustrated poster art of a paper airplane flying past planets toward a heart-shaped constellation","Starlit Letter","\u002Fprojects\u002Fforevermore\u002Fstarlit-letter.webp",[62,63,65],"h2",{"id":64},"how-its-built","How it's built",[29,67,68],{},"It's a pnpm monorepo with five apps and two shared packages. The apps are split by who's looking at the screen:",[70,71,72,81,88,95],"ul",{},[73,74,75,76,80],"li",{},"a ",[77,78,79],"strong",{},"marketing site",",",[73,82,83,84,87],{},"an ",[77,85,86],{},"editor",", where someone builds a gift and pays for it,",[73,89,90,91,94],{},"a small ",[77,92,93],{},"viewer"," that shows the finished gift to the person receiving it,",[73,96,97,98,101],{},"and two ",[77,99,100],{},"internal tools"," that no customer ever sees.",[29,103,104],{},"The customer-facing apps are Nuxt 4 on Cloudflare, with Supabase for Postgres, auth and file storage, and Paddle for payments. The worlds themselves are either Three.js scenes or 2D scenes built with SVG, CSS and GSAP. Both kinds read the same data contract, which is a big part of why a new editor feature doesn't mean updating dozens of worlds one by one.",[62,106,108],{"id":107},"what-the-write-ups-cover","What the write-ups cover",[29,110,111],{},"When I started, I assumed the hard part would be the animation. It turned out to be the plumbing: giving every gift its own subdomain, making sure the browser can never mark a gift as paid, and building worlds in a way that doesn't turn each new one into a from-scratch project.",[113,114],"link-card",{"description":115,"title":116,"to":117},"A subdomain for every gift, and a Postgres permission model that keeps payment state out of the browser's reach.","Subdomains and permissions","\u002Fprojects\u002Fforevermore\u002Farchitecture",[113,119],{"description":120,"title":121,"to":122},"One data contract for every world, videos that pretend to be photos, and 3D assets written as code.","One payload, many worlds","\u002Fprojects\u002Fforevermore\u002Frendering-pipeline",[113,124],{"description":125,"title":126,"to":127},"A separate content pipeline with compare-and-swap updates and every expensive dependency behind a seam.","A marketing pipeline built as a state machine","\u002Fprojects\u002Fforevermore\u002Fautopilot",{"title":129,"searchDepth":130,"depth":131,"links":132},"",2,3,[133,134],{"id":64,"depth":130,"text":65},{"id":107,"depth":130,"text":108},"A platform for personalized animated gift worlds. Pick a scene, fill it with photos and a song, and send it like a message.","md",true,"personal",{"live":140},"https:\u002F\u002Fgetforevermore.co",{},1,"\u002Fprojects\u002Fforevermore","2026 — Present",{"src":146,"alt":147,"og":148},"\u002Fprojects\u002Fforevermore\u002Fpreview.webp","Forevermore: 'Create a world for someone you love.' beside three animated gift worlds fanned out like postcards","\u002Fprojects\u002Fforevermore\u002Fog.png",{"title":24,"description":135},[151,152,153,154,155,156],"Nuxt 4","Tailwind CSS v4","Supabase","Cloudflare Workers","Three.js","Paddle","projects\u002Fforevermore\u002Findex","2026","3-5_hEHd7btdL5lmKS7YY-E9WPl-MOF34DlnSzZglU8",[161,163,169,174],{"path":143,"title":24,"stem":157,"navigation":137,"description":135,"preview":162},{"src":146,"alt":147,"og":148},{"path":117,"title":116,"stem":164,"navigation":165,"description":167,"preview":168},"projects\u002Fforevermore\u002F1.architecture",{"title":166},"Architecture","How every gift gets its own address on a host that doesn't support wildcard domains, and how Postgres grants keep payment state out of the browser's reach.",null,{"path":122,"title":121,"stem":170,"navigation":171,"description":173,"preview":168},"projects\u002Fforevermore\u002F2.rendering-pipeline",{"title":172},"Rendering pipeline","How dozens of very different worlds read one data contract, why a video is secretly a photo, and why most of the 3D assets are code instead of files.",{"path":127,"title":126,"stem":175,"navigation":176,"description":178,"preview":168},"projects\u002Fforevermore\u002F3.autopilot",{"title":177},"Autopilot","Autopilot plans, writes, renders and checks a week of social posts on its own. How a state machine, compare-and-swap updates and injected dependencies make it safe to run unattended.",[180,181,182,183,184,185,186,187,188,189,153,190,191],"TypeScript","Vue 3","Nuxt","Pinia","Tailwind CSS","Python","FastAPI","SQLAlchemy","Pydantic","PostgreSQL","GCP","Firebase",1790468886577]