[{"data":1,"prerenderedAt":140},["ShallowReactive",2],{"navigation":3,"project-ace-naps":46},[4],{"title":5,"path":6,"stem":7,"children":8,"page":45},"Blog","\u002Fblog","blog",[9,13,17,21,25,29,33,37,41],{"title":10,"path":11,"stem":12},"2025: My Biggest Year of Growth","\u002Fblog\u002F2025-year-in-review","blog\u002F2025-year-in-review",{"title":14,"path":15,"stem":16},"The 6 AI tools that are accelerating my life","\u002Fblog\u002F6-ai-tools-accelerating-my-life","blog\u002F6-ai-tools-accelerating-my-life",{"title":18,"path":19,"stem":20},"My biggest mistake (And What I Learned)","\u002Fblog\u002Faccount-screen-bug","blog\u002Faccount-screen-bug",{"title":22,"path":23,"stem":24},"Introducing Tab Constellation: Automatic Tab Grouping Done Right","\u002Fblog\u002Fintroducing-tab-constellation-automatic-tab-grouping-done-right","blog\u002Fintroducing-tab-constellation-automatic-tab-grouping-done-right",{"title":26,"path":27,"stem":28},"The Cost of Knowing More Than You Can Say","\u002Fblog\u002Fthe-cost-of-knowing-more-than-you-can-say","blog\u002Fthe-cost-of-knowing-more-than-you-can-say",{"title":30,"path":31,"stem":32},"What 90 Days of Deliberate Inner Work Taught Me","\u002Fblog\u002Fwhat-90-days-of-deliberate-inner-work-taught-me","blog\u002Fwhat-90-days-of-deliberate-inner-work-taught-me",{"title":34,"path":35,"stem":36},"Fulfilling a Five-Year-Old's Promise: The Making of Xal's Path","\u002Fblog\u002Fxals-path","blog\u002Fxals-path",{"title":38,"path":39,"stem":40},"Xal's Path v1.2.0 - A Sneak Peek at the New Look","\u002Fblog\u002Fxals-path-1.2.0","blog\u002Fxals-path-1.2.0",{"title":42,"path":43,"stem":44},"Xal's Path: Art & Story Archive","\u002Fblog\u002Fxals-path-art-and-story-archive","blog\u002Fxals-path-art-and-story-archive",false,{"id":47,"title":48,"blocks":49,"date":57,"description":58,"extension":59,"image":60,"imageAlt":61,"links":62,"meta":78,"sections":79,"slug":132,"stem":133,"summary":134,"tags":138,"url":74,"youtubeId":102,"youtubeLabel":103,"__hash__":139},"projects\u002Fprojects\u002Face-naps.yml","Ace Naps",[50,51,52,53,54,55,56],"hero","why","uploader","loops","how-it-works","tech-stack","status","2026-07-05","A quiet way to nap with Ace, wherever you are.","yml","\u002Fimages\u002Fprojects\u002Face-naps\u002Fbanner.jpg","Ace Naps banner with a cream-and-white dog and the line A quiet way to nap with Ace, wherever you are",[63,67,71,75],{"label":64,"icon":65,"to":66},"Follow on Instagram","i-simple-icons-instagram","https:\u002F\u002Fwww.instagram.com\u002Face_naps\u002F",{"label":68,"icon":69,"to":70},"Watch on YouTube","i-simple-icons-youtube","https:\u002F\u002Fwww.youtube.com\u002F@ace_naps",{"label":72,"icon":73,"to":74},"Uploader on GitHub","i-simple-icons-github","https:\u002F\u002Fgithub.com\u002Fkevinlogan94\u002Face-naps-posts",{"label":76,"icon":73,"to":77},"Loops on GitHub","https:\u002F\u002Fgithub.com\u002Fkevinlogan94\u002Face-naps-loops",{},[80,83,99,104,120,128],{"id":51,"title":81,"body":82},"Why it exists","People kept asking how they could nap with Ace. I get to be with him every day, and I wanted to share that with everyone.",{"id":52,"title":84,"body":85,"notes":86,"images":87},"Part 1: the uploader","Friends and family I invite can photograph Ace napping and upload photos from their phone. The photos land in a Supabase queue. A scheduled cron job publishes them to Instagram @ace_naps through the Instagram API.","Nuxt for the invite-only upload UI. Supabase for the queue and the scheduled job. Instagram API for the daily post.",[88,93,96],{"src":89,"alt":90,"href":66,"width":91,"height":92},"\u002Fimages\u002Fprojects\u002Face-naps\u002Face-nap-1.webp","Ace, a fluffy cream-and-white dog, asleep curled up on a gray couch, his head resting on a black-and-white pillow with a green blanket behind him",1200,900,{"src":94,"alt":95,"href":66,"width":92,"height":91},"\u002Fimages\u002Fprojects\u002Face-naps\u002Face-nap-2.webp","Ace, a fluffy cream-and-white dog, napping curled up on a soft beige carpet with his eyes closed and the tip of his tongue peeking out",{"src":97,"alt":98,"href":66,"width":92,"height":91},"\u002Fimages\u002Fprojects\u002Face-naps\u002Face-nap-3.webp","Ace, a fluffy cream-and-white dog, curled up asleep in a patch of sunlight on a navy patterned blanket, the tip of his tongue poking out",{"id":53,"title":100,"body":101,"youtubeId":102,"youtubeLabel":103},"Part 2: the loops","Phaser stitches Ace's pixel-art animations into 15-minute loops, then those loops go up on YouTube. The Halloween one below is a longer cut: three hours of a cozy fall evening.","ClAkKkYFMIg","Play: Cozy Halloween loop (3 hours)",{"id":54,"title":105,"columns":106},"How it works",[107,114],{"title":108,"steps":109},"The uploader",[110,111,112,113],"Photograph Ace napping","Friends and family I invite upload from a phone","Photos wait in a queue","A cron job posts to Instagram",{"title":115,"steps":116},"The loops",[117,118,119],"Pixel-art animations of Ace","Phaser stitches them into a 15-minute loop","Rendered and uploaded to YouTube",{"id":55,"title":121,"items":122},"Tech stack",[123,124,125,126,127],"Nuxt","Supabase","Instagram API","Phaser","YouTube",{"id":56,"title":129,"body":130,"showLinks":131},"Where things stand","Ace is napping on Instagram, and the loops are up on YouTube. The uploader stays invite-only for people I share it with. The code for both parts is on GitHub.",true,"ace-naps","projects\u002Face-naps",{"stack":135,"status":136,"code":137},"Nuxt, Supabase, Instagram API, Phaser","Live on Instagram and YouTube. Uploader is invite-only.","Public GitHub for the uploader and the loops",[125,126,127],"srzlXEPqhjoTb7owPbO7aI6q6EjYKkanf651El2a_zo",1791415366357]