[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"header-categories":3,"post-progressive-web-apps-2025-relevant":73,"parsed-post-b227a75c-ed23-4047-937e-7c3b989f4c0b":142},{"success":4,"data":5},true,{"items":6,"pagination":70},[7,16,24,32,40,48,56,63],{"id":8,"name":9,"description":10,"parentId":11,"createdAt":12,"updatedAt":12,"parent":11,"children":13,"_count":14},"ai-future","AI & The Future","Artificial intelligence and emerging technology",null,"2026-07-24T06:02:45.990Z",[],{"posts":15},1,{"id":17,"name":18,"description":19,"parentId":11,"createdAt":20,"updatedAt":20,"parent":11,"children":21,"_count":22},"tools-productivity","Tools & Productivity","Developer tools and workflow optimization","2026-07-24T06:02:45.712Z",[],{"posts":23},7,{"id":25,"name":26,"description":27,"parentId":11,"createdAt":28,"updatedAt":28,"parent":11,"children":29,"_count":30},"career","Career & Growth","Professional development for developers","2026-07-24T06:02:45.486Z",[],{"posts":31},3,{"id":33,"name":34,"description":35,"parentId":11,"createdAt":36,"updatedAt":36,"parent":11,"children":37,"_count":38},"opinion","Opinion & Analysis","Industry analysis and technical opinions","2026-07-24T06:02:45.272Z",[],{"posts":39},6,{"id":41,"name":42,"description":43,"parentId":11,"createdAt":44,"updatedAt":44,"parent":11,"children":45,"_count":46},"tutorials","Tutorials","Step-by-step learning guides","2026-07-24T06:02:44.965Z",[],{"posts":47},21,{"id":49,"name":50,"description":51,"parentId":11,"createdAt":52,"updatedAt":52,"parent":11,"children":53,"_count":54},"software-engineering","Software Engineering","Best practices, patterns, and principles","2026-07-24T06:02:44.689Z",[],{"posts":55},24,{"id":57,"name":58,"description":59,"parentId":11,"createdAt":60,"updatedAt":60,"parent":11,"children":61,"_count":62},"devops-cloud","DevOps & Cloud","Infrastructure, deployment, and cloud computing","2026-07-24T06:02:44.453Z",[],{"posts":39},{"id":64,"name":65,"description":66,"parentId":11,"createdAt":67,"updatedAt":67,"parent":11,"children":68,"_count":69},"web-development","Web Development","Frontend and backend web development tutorials and guides","2026-07-24T06:02:44.169Z",[],{"posts":55},{"page":15,"limit":71,"total":71,"totalPages":15,"hasNext":72,"hasPrev":72},8,false,{"success":4,"data":74},{"id":75,"slug":76,"title":77,"excerpt":78,"content":79,"status":80,"visibility":81,"featuredImage":82,"canonicalUrl":11,"readingTime":23,"viewCount":83,"commentEnabled":4,"publishedAt":84,"scheduledAt":11,"createdAt":85,"updatedAt":86,"seoTitle":87,"seoDescription":78,"seoKeywords":11,"authorId":88,"author":89,"coAuthors":94,"tags":95,"categories":106,"comments":109,"_count":110,"relatedPosts":112},"b227a75c-ed23-4047-937e-7c3b989f4c0b","progressive-web-apps-2025-relevant","Progressive Web Apps in 2025: Still Relevant?","Are PWAs still worth building? An honest look at the current state of PWA capabilities, limitations, and when they make sense.","## The PWA Promise\n\nPWAs promised to bridge the gap between web and native apps: offline support, push notifications, home screen installation, and native-like performance.\n\nHow has that played out?\n\n## What PWAs Do Well\n\n### Offline Support\n\nService workers make offline-first architectures possible:\n\n```typescript\n\u002F\u002F service-worker.ts\nconst CACHE_NAME = 'app-v1'\nconst OFFLINE_URLS = ['\u002F', '\u002Foffline.html', '\u002Fstyles.css', '\u002Fapp.js']\n\nself.addEventListener('install', (event) => {\n  event.waitUntil(\n    caches.open(CACHE_NAME).then(cache => cache.addAll(OFFLINE_URLS))\n  )\n})\n\nself.addEventListener('fetch', (event) => {\n  event.respondWith(\n    caches.match(event.request).then(cached => {\n      return cached || fetch(event.request).catch(() => {\n        return caches.match('\u002Foffline.html')\n      })\n    })\n  )\n})\n```\n\n### Performance\n\nPrecaching critical assets means instant subsequent page loads:\n\n- First visit: normal network performance\n- Subsequent visits: near-instant (served from cache)\n\n### Installation\n\nUsers can \"install\" your web app to their home screen without app store review:\n\n```json\n{\n  \"name\": \"My App\",\n  \"short_name\": \"App\",\n  \"start_url\": \"\u002F\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#ffffff\",\n  \"theme_color\": \"#3b82f6\",\n  \"icons\": [{ \"src\": \"\u002Ficon-512.png\", \"sizes\": \"512x512\", \"type\": \"image\u002Fpng\" }]\n}\n```\n\n## The Limitations (Honest Assessment)\n\n### iOS Restrictions\n\nApple has historically limited PWA capabilities:\n- Push notifications only added in iOS 16.4 (2023)\n- No background sync\n- Storage can be evicted after 7 days of inactivity\n- No access to many native APIs\n\n### The \"App Gap\" Still Exists\n\nNative apps still have exclusive access to:\n- Advanced camera controls\n- Bluetooth (limited in PWA)\n- NFC (limited)\n- App store discovery\n- Background processing\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nPWAs work best as a complement to native apps, not a replacement. They excel for content-focused apps, internal tools, and markets where app store deployment is impractical.\n::\n\n## When PWAs Make Sense\n\n✅ **Good fit:**\n- Content\u002Fmedia sites (news, blogs, documentation)\n- Internal business tools\n- E-commerce (fast repeat visits)\n- Emerging markets (limited device storage)\n- Apps that need occasional offline access\n\n❌ **Bad fit:**\n- Games requiring GPU access\n- Apps needing deep OS integration\n- Apps relying on background processing\n- When app store presence is critical for discovery\n\n## My Take\n\nPWAs aren't dead — they're settled into their niche. For content-first experiences that benefit from caching and optional offline access, they're excellent. For anything requiring deep native integration, build native.\n\nThe best approach in 2025: build a great responsive web app first, add PWA capabilities (manifest + service worker caching) as a progressive enhancement. It costs almost nothing and genuinely improves UX for returning users.\n","published","public","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1516116216624-53e697fedbea?w=1200&q=80",959,"2026-04-28T06:04:28.940Z","2026-07-24T06:04:28.943Z","2026-07-28T12:20:37.368Z","Progressive Web Apps in 2025: Still Relevant? | BitBlog","fddb5d93-7a2c-4d86-a06a-fa32e73a01c6",{"email":90,"bio":91,"id":88,"name":92,"avatarUrl":93},"mbeahessilfieprince@gmail.com","Fullstack Software Developer ","Mbeah Essilfie","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F93322394?v=4",[],[96,101],{"id":97,"name":98,"color":99,"description":100},"javascript","JavaScript","#f7df1e","The language of the web",{"id":102,"name":103,"color":104,"description":105},"performance","Performance","#e535ab","Web performance optimization",[107,108],{"id":64,"name":65,"description":66},{"id":33,"name":34,"description":35},[],{"comments":111},0,[113,122,132],{"id":114,"slug":115,"title":116,"excerpt":117,"featuredImage":118,"viewCount":119,"readingTime":71,"publishedAt":120,"author":121},"2997028f-4d22-4eb7-9d86-894a54cb559a","building-type-safe-apis-nuxt3-prisma","Building Type-Safe APIs with Nuxt 3 and Prisma","Learn how to build end-to-end type-safe APIs using Nuxt 3 server routes and Prisma ORM for a seamless developer experience.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1498050108023-c5249f4df085?w=1200&q=80",1920,"2026-07-23T06:02:46.910Z",{"id":88,"name":92,"avatarUrl":93},{"id":123,"slug":124,"title":125,"excerpt":126,"featuredImage":127,"viewCount":128,"readingTime":129,"publishedAt":130,"author":131},"da9e4553-8b0d-411e-b4ec-f9684017e163","mastering-tailwind-css-design-systems","Mastering Tailwind CSS: From Utility Classes to Design Systems","Go beyond basic utility classes and learn how to build cohesive, maintainable design systems with Tailwind CSS.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1555066931-4365d14bab8c?w=1200&q=80",256,10,"2026-07-21T06:02:49.268Z",{"id":88,"name":92,"avatarUrl":93},{"id":133,"slug":134,"title":135,"excerpt":136,"featuredImage":137,"viewCount":138,"readingTime":139,"publishedAt":140,"author":141},"50add5fc-4026-4267-b917-7f71ea9e35b0","complete-guide-vue3-composables","The Complete Guide to Vue 3 Composables","Understand the power of Vue 3's Composition API through practical, real-world composable patterns that you can use today.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1517694712202-14dd9538aa97?w=1200&q=80",989,12,"2026-07-19T06:02:51.753Z",{"id":88,"name":92,"avatarUrl":93},{"data":143,"body":145,"toc":433},{"title":144,"description":144},"",{"type":146,"children":147},"root",[148,157,163,168,174,181,186,199,203,208,223,229,234,244,250,256,261,284,290,295,323,334,340,351,379,389,412,418,423,428],{"type":149,"tag":150,"props":151,"children":153},"element","h2",{"id":152},"the-pwa-promise",[154],{"type":155,"value":156},"text","The PWA Promise",{"type":149,"tag":158,"props":159,"children":160},"p",{},[161],{"type":155,"value":162},"PWAs promised to bridge the gap between web and native apps: offline support, push notifications, home screen installation, and native-like performance.",{"type":149,"tag":158,"props":164,"children":165},{},[166],{"type":155,"value":167},"How has that played out?",{"type":149,"tag":150,"props":169,"children":171},{"id":170},"what-pwas-do-well",[172],{"type":155,"value":173},"What PWAs Do Well",{"type":149,"tag":175,"props":176,"children":178},"h3",{"id":177},"offline-support",[179],{"type":155,"value":180},"Offline Support",{"type":149,"tag":158,"props":182,"children":183},{},[184],{"type":155,"value":185},"Service workers make offline-first architectures possible:",{"type":149,"tag":187,"props":188,"children":193},"pre",{"className":189,"code":190,"language":191,"meta":144,"style":192},"language-typescript","\u002F\u002F service-worker.ts\nconst CACHE_NAME = 'app-v1'\nconst OFFLINE_URLS = ['\u002F', '\u002Foffline.html', '\u002Fstyles.css', '\u002Fapp.js']\n\nself.addEventListener('install', (event) => {\n  event.waitUntil(\n    caches.open(CACHE_NAME).then(cache => cache.addAll(OFFLINE_URLS))\n  )\n})\n\nself.addEventListener('fetch', (event) => {\n  event.respondWith(\n    caches.match(event.request).then(cached => {\n      return cached || fetch(event.request).catch(() => {\n        return caches.match('\u002Foffline.html')\n      })\n    })\n  )\n})\n","typescript","undefined",[194],{"type":149,"tag":195,"props":196,"children":197},"code",{"__ignoreMap":144},[198],{"type":155,"value":190},{"type":149,"tag":175,"props":200,"children":201},{"id":102},[202],{"type":155,"value":103},{"type":149,"tag":158,"props":204,"children":205},{},[206],{"type":155,"value":207},"Precaching critical assets means instant subsequent page loads:",{"type":149,"tag":209,"props":210,"children":211},"ul",{},[212,218],{"type":149,"tag":213,"props":214,"children":215},"li",{},[216],{"type":155,"value":217},"First visit: normal network performance",{"type":149,"tag":213,"props":219,"children":220},{},[221],{"type":155,"value":222},"Subsequent visits: near-instant (served from cache)",{"type":149,"tag":175,"props":224,"children":226},{"id":225},"installation",[227],{"type":155,"value":228},"Installation",{"type":149,"tag":158,"props":230,"children":231},{},[232],{"type":155,"value":233},"Users can \"install\" your web app to their home screen without app store review:",{"type":149,"tag":187,"props":235,"children":239},{"className":236,"code":237,"language":238,"meta":144,"style":192},"language-json","{\n  \"name\": \"My App\",\n  \"short_name\": \"App\",\n  \"start_url\": \"\u002F\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#ffffff\",\n  \"theme_color\": \"#3b82f6\",\n  \"icons\": [{ \"src\": \"\u002Ficon-512.png\", \"sizes\": \"512x512\", \"type\": \"image\u002Fpng\" }]\n}\n","json",[240],{"type":149,"tag":195,"props":241,"children":242},{"__ignoreMap":144},[243],{"type":155,"value":237},{"type":149,"tag":150,"props":245,"children":247},{"id":246},"the-limitations-honest-assessment",[248],{"type":155,"value":249},"The Limitations (Honest Assessment)",{"type":149,"tag":175,"props":251,"children":253},{"id":252},"ios-restrictions",[254],{"type":155,"value":255},"iOS Restrictions",{"type":149,"tag":158,"props":257,"children":258},{},[259],{"type":155,"value":260},"Apple has historically limited PWA capabilities:",{"type":149,"tag":209,"props":262,"children":263},{},[264,269,274,279],{"type":149,"tag":213,"props":265,"children":266},{},[267],{"type":155,"value":268},"Push notifications only added in iOS 16.4 (2023)",{"type":149,"tag":213,"props":270,"children":271},{},[272],{"type":155,"value":273},"No background sync",{"type":149,"tag":213,"props":275,"children":276},{},[277],{"type":155,"value":278},"Storage can be evicted after 7 days of inactivity",{"type":149,"tag":213,"props":280,"children":281},{},[282],{"type":155,"value":283},"No access to many native APIs",{"type":149,"tag":175,"props":285,"children":287},{"id":286},"the-app-gap-still-exists",[288],{"type":155,"value":289},"The \"App Gap\" Still Exists",{"type":149,"tag":158,"props":291,"children":292},{},[293],{"type":155,"value":294},"Native apps still have exclusive access to:",{"type":149,"tag":209,"props":296,"children":297},{},[298,303,308,313,318],{"type":149,"tag":213,"props":299,"children":300},{},[301],{"type":155,"value":302},"Advanced camera controls",{"type":149,"tag":213,"props":304,"children":305},{},[306],{"type":155,"value":307},"Bluetooth (limited in PWA)",{"type":149,"tag":213,"props":309,"children":310},{},[311],{"type":155,"value":312},"NFC (limited)",{"type":149,"tag":213,"props":314,"children":315},{},[316],{"type":155,"value":317},"App store discovery",{"type":149,"tag":213,"props":319,"children":320},{},[321],{"type":155,"value":322},"Background processing",{"type":149,"tag":324,"props":325,"children":328},"callout",{"color":326,"icon":327},"info","i-lucide-info",[329],{"type":149,"tag":158,"props":330,"children":331},{},[332],{"type":155,"value":333},"PWAs work best as a complement to native apps, not a replacement. They excel for content-focused apps, internal tools, and markets where app store deployment is impractical.",{"type":149,"tag":150,"props":335,"children":337},{"id":336},"when-pwas-make-sense",[338],{"type":155,"value":339},"When PWAs Make Sense",{"type":149,"tag":158,"props":341,"children":342},{},[343,345],{"type":155,"value":344},"✅ ",{"type":149,"tag":346,"props":347,"children":348},"strong",{},[349],{"type":155,"value":350},"Good fit:",{"type":149,"tag":209,"props":352,"children":353},{},[354,359,364,369,374],{"type":149,"tag":213,"props":355,"children":356},{},[357],{"type":155,"value":358},"Content\u002Fmedia sites (news, blogs, documentation)",{"type":149,"tag":213,"props":360,"children":361},{},[362],{"type":155,"value":363},"Internal business tools",{"type":149,"tag":213,"props":365,"children":366},{},[367],{"type":155,"value":368},"E-commerce (fast repeat visits)",{"type":149,"tag":213,"props":370,"children":371},{},[372],{"type":155,"value":373},"Emerging markets (limited device storage)",{"type":149,"tag":213,"props":375,"children":376},{},[377],{"type":155,"value":378},"Apps that need occasional offline access",{"type":149,"tag":158,"props":380,"children":381},{},[382,384],{"type":155,"value":383},"❌ ",{"type":149,"tag":346,"props":385,"children":386},{},[387],{"type":155,"value":388},"Bad fit:",{"type":149,"tag":209,"props":390,"children":391},{},[392,397,402,407],{"type":149,"tag":213,"props":393,"children":394},{},[395],{"type":155,"value":396},"Games requiring GPU access",{"type":149,"tag":213,"props":398,"children":399},{},[400],{"type":155,"value":401},"Apps needing deep OS integration",{"type":149,"tag":213,"props":403,"children":404},{},[405],{"type":155,"value":406},"Apps relying on background processing",{"type":149,"tag":213,"props":408,"children":409},{},[410],{"type":155,"value":411},"When app store presence is critical for discovery",{"type":149,"tag":150,"props":413,"children":415},{"id":414},"my-take",[416],{"type":155,"value":417},"My Take",{"type":149,"tag":158,"props":419,"children":420},{},[421],{"type":155,"value":422},"PWAs aren't dead — they're settled into their niche. For content-first experiences that benefit from caching and optional offline access, they're excellent. For anything requiring deep native integration, build native.",{"type":149,"tag":158,"props":424,"children":425},{},[426],{"type":155,"value":427},"The best approach in 2025: build a great responsive web app first, add PWA capabilities (manifest + service worker caching) as a progressive enhancement. It costs almost nothing and genuinely improves UX for returning users.",{"type":149,"tag":429,"props":430,"children":431},"style",{},[432],{"type":155,"value":144},{"title":144,"searchDepth":434,"depth":434,"links":435},2,[436,437,442,446,447],{"id":152,"depth":434,"text":156},{"id":170,"depth":434,"text":173,"children":438},[439,440,441],{"id":177,"depth":31,"text":180},{"id":102,"depth":31,"text":103},{"id":225,"depth":31,"text":228},{"id":246,"depth":434,"text":249,"children":443},[444,445],{"id":252,"depth":31,"text":255},{"id":286,"depth":31,"text":289},{"id":336,"depth":434,"text":339},{"id":414,"depth":434,"text":417}]