[{"data":1,"prerenderedAt":1704},["ShallowReactive",2],{"$f1qug6ihjz8zl9":3,"$f1ghgjfvx6d15a":359,"site-header-current-blog:v3-part-1-ssr-to-ssg":442,"$f2h73b7elu4wst":519,"$f34jcw1dd34gbz":1472,"$f1d6eechffsn3g":1555,"$f26pfjp5fdr5y9":1612,"$f1vlx9rud7l5ho":1628,"$f1oo2kfdqw5roe":1643},{"categories":4,"tags":40,"photoTags":213,"galleries":268,"blogCount":286,"photoCount":287,"footerPhoto":288},[5,12,19,26,33],{"id":6,"date_created":7,"date_updated":8,"name":9,"slug":10,"description":8,"count":11},"fd7f2650-a0c3-408f-b64b-99c9ab711fb4","2023-01-05T12:42:21.951Z",null,"Personal","personal",8,{"id":13,"date_created":14,"date_updated":8,"name":15,"slug":16,"description":17,"count":18},"605b0764-a744-46a9-80cc-3dc842a2673c","2022-12-13T03:15:59.051Z","Photoblog","photoblog","Photos that comes with some text",32,{"id":20,"date_created":21,"date_updated":8,"name":22,"slug":23,"description":24,"count":25},"f4051760-3a84-4f09-8f90-b69e058c7eac","2022-12-04T06:16:07.265Z","Site Updates","site-updates","Updates to this site",17,{"id":27,"date_created":28,"date_updated":8,"name":29,"slug":30,"description":31,"count":32},"ba512728-c428-4baf-904a-fb7d9ff3c66f","2022-12-28T09:51:14.448Z","Tech","tech","Everything related to Technology",14,{"id":34,"date_created":35,"date_updated":8,"name":36,"slug":37,"description":38,"count":39},"7abfd063-63b7-4839-ad4c-e6cf64b09b74","2022-12-04T06:26:54.327Z","Tutorials","tutorials","Tutorials for the layman if possible",6,[41,47,53,59,65,70,75,80,85,90,97,102,107,112,117,123,128,133,139,144,149,154,159,165,170,175,180,185,191,196,202,208],{"id":42,"date_created":43,"date_updated":8,"name":44,"slug":45,"count":46},"27d2bd05-8aa8-4c00-b71b-ff4b48edf0ee","2023-01-01T01:28:23.292Z","Automator","automator",1,{"id":48,"date_created":49,"date_updated":8,"name":50,"slug":51,"count":52},"26a218f4-2859-468d-8858-571b1ce6945d","2022-12-26T10:36:21.592Z","Camera","camera",13,{"id":54,"date_created":55,"date_updated":8,"name":56,"slug":57,"count":58},"df41c449-de77-47cc-aed9-0b6765913805","2023-01-26T02:49:51.302Z","Directus","directus",3,{"id":60,"date_created":61,"date_updated":8,"name":62,"slug":63,"count":64},"d9befa5d-8620-42d8-9498-e0a1952328fe","2022-12-04T12:51:47.682Z","Discourse","discourse",2,{"id":66,"date_created":67,"date_updated":8,"name":68,"slug":69,"count":64},"b94953f9-47f3-43b8-8b5b-8e14b5990af6","2023-01-02T01:36:20.072Z","Docker","docker",{"id":71,"date_created":72,"date_updated":8,"name":73,"slug":74,"count":46},"065f2799-b1a3-49f4-9a3a-ea76a039d5d8","2023-01-01T01:28:23.281Z","HandBrake","handbrake",{"id":76,"date_created":77,"date_updated":8,"name":78,"slug":79,"count":46},"aa5c8763-8c3d-4b74-b807-128f59f62f1b","2023-12-27T12:25:58.488Z","Hokkaido 北海道","hokkaido",{"id":81,"date_created":82,"date_updated":8,"name":83,"slug":84,"count":64},"e9aae08f-8e7b-4553-a67e-f8f3748265db","2022-12-04T12:34:29.050Z","Hypervisor","hypervisor",{"id":86,"date_created":87,"date_updated":8,"name":88,"slug":89,"count":46},"5678a065-2072-45d7-a1fb-9a15b89177be","2022-12-04T12:22:10.750Z","Intel NUC","intel-nuc",{"id":91,"date_created":92,"date_updated":93,"name":94,"slug":95,"count":96},"5ed5825b-7cbc-426b-b089-122de4ef844a","2022-12-13T03:19:50.045Z","2024-01-13T06:38:19.040Z","Japan 日本","japan",12,{"id":98,"date_created":99,"date_updated":8,"name":100,"slug":101,"count":58},"a0cf1895-89fe-48df-a683-0d356803391e","2022-12-26T04:56:55.058Z","Kyoto 京都","kyoto",{"id":103,"date_created":104,"date_updated":8,"name":105,"slug":106,"count":64},"82e1e735-dabe-4f22-af68-5701c5c4c3be","2023-01-08T04:46:56.425Z","LibreNMS","librenms",{"id":108,"date_created":109,"date_updated":8,"name":110,"slug":111,"count":58},"8d525d35-7cde-44d7-a739-813353946dc5","2023-01-08T04:18:32.660Z","Linux","linux",{"id":113,"date_created":114,"date_updated":8,"name":115,"slug":116,"count":46},"d25a206d-eb7b-433e-aec7-37f848ef0626","2023-01-01T01:28:23.304Z","macOS","macos",{"id":118,"date_created":119,"date_updated":8,"name":120,"slug":121,"count":122},"6d4984da-be50-4ead-a218-232d736cd0ae","2022-12-26T09:26:39.677Z","Malaysia","malaysia",4,{"id":124,"date_created":125,"date_updated":8,"name":126,"slug":127,"count":122},"88b1e7ac-cb91-46c5-928f-81b845534491","2022-12-26T09:35:09.322Z","Musicians","musicians",{"id":129,"date_created":130,"date_updated":8,"name":131,"slug":132,"count":122},"a455a675-574d-4e36-b4da-60d1dbd0f583","2023-01-26T02:49:51.292Z","Nuxt","nuxt",{"id":134,"date_created":135,"date_updated":8,"name":136,"slug":137,"count":138},"8642a081-b2df-44d3-b993-5918807babb9","2022-12-26T04:55:36.796Z","Osaka 大阪","osaka",5,{"id":140,"date_created":141,"date_updated":8,"name":142,"slug":143,"count":58},"6d3326dd-0069-4706-a839-013e03a7ba98","2022-12-31T04:44:28.192Z","pfSense","pfsense",{"id":145,"date_created":146,"date_updated":8,"name":147,"slug":148,"count":138},"a8a08b5b-d4c7-46d1-a1f4-a65edc33306e","2026-06-15T12:41:42.094Z","Photowalk","photowalk",{"id":150,"date_created":151,"date_updated":8,"name":152,"slug":153,"count":64},"f9e059a9-e501-454e-b29b-59fc1685cae2","2022-12-04T12:34:29.034Z","Plex","plex",{"id":155,"date_created":156,"date_updated":8,"name":157,"slug":158,"count":138},"cad7eef9-d788-4a7d-936e-6b5f34bdea51","2022-12-26T09:51:04.913Z","Portraits","portraits",{"id":160,"date_created":161,"date_updated":8,"name":162,"slug":163,"count":164},"2e1c3093-e56c-4a43-b5d4-0d411e58f217","2022-12-26T04:55:10.592Z","Singapore","singapore",7,{"id":166,"date_created":167,"date_updated":8,"name":168,"slug":169,"count":138},"0be17ed4-d412-40dc-92e2-a66a866601a8","2023-01-26T02:50:40.038Z","Street","street",{"id":171,"date_created":172,"date_updated":8,"name":173,"slug":174,"count":58},"d98a25aa-d5ef-4a76-b39e-c4bed915c70f","2022-12-04T12:48:55.367Z","Synology","synology",{"id":176,"date_created":177,"date_updated":8,"name":178,"slug":179,"count":46},"b087565a-f507-49c9-ba9c-410d678997c6","2022-12-26T09:15:54.449Z","Taiwan 台灣","taiwan",{"id":181,"date_created":182,"date_updated":8,"name":183,"slug":184,"count":46},"0efba885-1a84-4cfa-b5c4-4ae60009c9c5","2022-12-26T09:28:44.045Z","Tokyo 東京","tokyo",{"id":186,"date_created":187,"date_updated":8,"name":188,"slug":189,"count":190},"1879f268-b3c6-4d0b-9a24-f0ebcf2fa788","2022-12-26T10:06:05.302Z","Travel","travel",10,{"id":192,"date_created":193,"date_updated":8,"name":194,"slug":195,"count":46},"242faa31-6304-408b-a362-4b7d18fddf0a","2023-01-08T03:36:20.359Z","Ubiquiti UBNT","ubiquiti-ubnt",{"id":197,"date_created":198,"date_updated":199,"name":200,"slug":201,"count":46},"2310a0b9-025f-46b1-9ffe-68285d65fa7e","2023-01-05T23:44:29.279Z","2024-01-13T06:38:07.253Z","Wakayama 和歌山","wakayama",{"id":203,"date_created":204,"date_updated":205,"name":206,"slug":207,"count":39},"488f691b-c00b-4353-ae5a-8cce47c622bf","2022-12-04T12:49:23.697Z","2023-01-08T04:49:59.382Z","WordPress","wordpress",{"id":209,"date_created":210,"date_updated":8,"name":211,"slug":212,"count":58},"754f6d8f-0930-4360-aeca-ec09c9b56802","2022-12-04T12:11:52.745Z","XCP-ng","xcp-ng",[214,219,220,221,226,231,233,235,236,238,244,245,247,248,249,254,255,260,261,263],{"id":215,"date_created":216,"date_updated":8,"name":217,"slug":218,"count":46},"58f09f20-704e-4311-a702-c5514909de55","2025-01-10T09:17:47.104Z","Bangkok","bangkok",{"id":48,"date_created":49,"date_updated":8,"name":50,"slug":51,"count":46},{"id":76,"date_created":77,"date_updated":8,"name":78,"slug":79,"count":64},{"id":222,"date_created":223,"date_updated":8,"name":224,"slug":225,"count":46},"4b245bca-7c9f-4c89-9529-7e9f00826660","2022-12-26T10:19:20.528Z","Hong Kong","hong-kong",{"id":227,"date_created":228,"date_updated":8,"name":229,"slug":230,"count":39},"df67b403-8477-46be-a143-f91ff975b854","2022-12-26T10:06:05.312Z","Iceland","iceland",{"id":91,"date_created":92,"date_updated":93,"name":94,"slug":95,"count":232},35,{"id":98,"date_created":99,"date_updated":8,"name":100,"slug":101,"count":234},9,{"id":118,"date_created":119,"date_updated":8,"name":120,"slug":121,"count":138},{"id":124,"date_created":125,"date_updated":8,"name":126,"slug":127,"count":237},11,{"id":239,"date_created":240,"date_updated":8,"name":241,"slug":242,"count":243},"54ba4419-6d63-4151-a1be-9042a9434ef9","2022-12-26T10:06:50.266Z","Nature","nature",16,{"id":134,"date_created":135,"date_updated":8,"name":136,"slug":137,"count":32},{"id":155,"date_created":156,"date_updated":8,"name":157,"slug":158,"count":246},15,{"id":160,"date_created":161,"date_updated":8,"name":162,"slug":163,"count":58},{"id":166,"date_created":167,"date_updated":8,"name":168,"slug":169,"count":190},{"id":250,"date_created":251,"date_updated":8,"name":252,"slug":253,"count":122},"a2f83ff0-e58b-4d27-99eb-879be03b8993","2022-12-27T05:40:14.128Z","Studio","studio",{"id":176,"date_created":177,"date_updated":8,"name":178,"slug":179,"count":234},{"id":256,"date_created":257,"date_updated":8,"name":258,"slug":259,"count":46},"6057ecc5-3ae9-4f18-8cce-ce36a87cb4b8","2025-01-10T09:14:31.171Z","Thailand","thailand",{"id":181,"date_created":182,"date_updated":8,"name":183,"slug":184,"count":64},{"id":186,"date_created":187,"date_updated":8,"name":188,"slug":189,"count":262},31,{"id":264,"date_created":265,"date_updated":8,"name":266,"slug":267,"count":64},"0917e8d0-dc96-46e7-8371-81b7479f238e","2022-12-26T09:26:39.689Z","Underwater Diving","underwater-diving",[269,278],{"id":270,"status":271,"date_created":272,"date_updated":273,"name":274,"description":275,"slug":276,"count":277},"b42cd153-b489-47ff-aee9-5e4b2d20d020","published","2022-10-02T03:19:52.789Z","2022-12-26T04:54:12.878Z","Black and White","Black and White Photos","black-and-white",20,{"id":279,"status":271,"date_created":280,"date_updated":281,"name":282,"description":283,"slug":284,"count":285},"64cbc225-cfeb-4b00-a902-b1cf9559f081","2022-10-01T08:53:38.310Z","2025-01-11T23:37:01.134Z","Color","カラー","color",44,60,64,{"title":289,"slug":290,"imageSet":291,"imageDescription":358},"Traditional Grip on mesh practice pad","traditional-grip-on-mesh-practice-pad",{"sourceFingerprint":292,"transformVersion":122,"seoSlug":290,"hash":293,"original":294,"variants":300,"avifVariants":333,"animated":356,"origin":357},"3adf3104-8d01-4878-b702-43eac2e07724:2026-09-18T20:01:09.408Z:261028:3adf3104-8d01-4878-b702-43eac2e07724.jpg","a8675f052cab682b",{"key":295,"width":296,"height":297,"contentType":298,"bytes":299},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Foriginal.jpg",2048,1365,"image\u002Fjpeg",261028,[301,307,312,317,321,326,330],{"key":302,"width":303,"height":304,"contentType":305,"bytes":306},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-320-8c39a503c675.webp",320,213,"image\u002Fwebp",6078,{"key":308,"width":309,"height":310,"contentType":305,"bytes":311},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-640-23b82e5d4a4f.webp",640,426,14254,{"key":313,"width":314,"height":315,"contentType":305,"bytes":316},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-768-73e2f39813c8.webp",768,512,18246,{"key":318,"width":319,"height":309,"contentType":305,"bytes":320},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-960-0e441c75ec1a.webp",960,24134,{"key":322,"width":323,"height":324,"contentType":305,"bytes":325},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-1200-ea2e7eb775d3.webp",1200,800,31954,{"key":327,"width":328,"height":319,"contentType":305,"bytes":329},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-1440-fda1423df866.webp",1440,40828,{"key":331,"width":296,"height":297,"contentType":305,"bytes":332},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-2048-2712507bafab.webp",67208,[334,338,341,344,347,350,353],{"key":335,"width":303,"height":304,"contentType":336,"bytes":337},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-320-f0c3f0f4d746.avif","image\u002Favif",5942,{"key":339,"width":309,"height":310,"contentType":336,"bytes":340},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-640-57efabdc302a.avif",13020,{"key":342,"width":314,"height":315,"contentType":336,"bytes":343},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-768-1c8768bab01d.avif",16072,{"key":345,"width":319,"height":309,"contentType":336,"bytes":346},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-960-d87d0644b939.avif",21509,{"key":348,"width":323,"height":324,"contentType":336,"bytes":349},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-1200-e9167f672bdf.avif",28453,{"key":351,"width":328,"height":319,"contentType":336,"bytes":352},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-1440-d135974c5c76.avif",35025,{"key":354,"width":296,"height":297,"contentType":336,"bytes":355},"assets\u002F3adf3104-8d01-4878-b702-43eac2e07724\u002Fa8675f052cab682b\u002Ftraditional-grip-on-mesh-practice-pad-2048-4fa5b4389417.avif",55923,false,"https:\u002F\u002Fassets.jasonloong.com","Hands holding drumsticks poised over a black snare drum head, with a textured grey sweater visible above.",{"categories":360,"tags":366,"photoTags":399,"galleries":420,"blogCount":286,"photoCount":287,"footerPhoto":423},[361,362,363,364,365],{"id":6,"date_created":7,"date_updated":8,"name":9,"slug":10,"description":8,"count":11},{"id":13,"date_created":14,"date_updated":8,"name":15,"slug":16,"description":17,"count":18},{"id":20,"date_created":21,"date_updated":8,"name":22,"slug":23,"description":24,"count":25},{"id":27,"date_created":28,"date_updated":8,"name":29,"slug":30,"description":31,"count":32},{"id":34,"date_created":35,"date_updated":8,"name":36,"slug":37,"description":38,"count":39},[367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398],{"id":42,"date_created":43,"date_updated":8,"name":44,"slug":45,"count":46},{"id":48,"date_created":49,"date_updated":8,"name":50,"slug":51,"count":52},{"id":54,"date_created":55,"date_updated":8,"name":56,"slug":57,"count":58},{"id":60,"date_created":61,"date_updated":8,"name":62,"slug":63,"count":64},{"id":66,"date_created":67,"date_updated":8,"name":68,"slug":69,"count":64},{"id":71,"date_created":72,"date_updated":8,"name":73,"slug":74,"count":46},{"id":76,"date_created":77,"date_updated":8,"name":78,"slug":79,"count":46},{"id":81,"date_created":82,"date_updated":8,"name":83,"slug":84,"count":64},{"id":86,"date_created":87,"date_updated":8,"name":88,"slug":89,"count":46},{"id":91,"date_created":92,"date_updated":93,"name":94,"slug":95,"count":96},{"id":98,"date_created":99,"date_updated":8,"name":100,"slug":101,"count":58},{"id":103,"date_created":104,"date_updated":8,"name":105,"slug":106,"count":64},{"id":108,"date_created":109,"date_updated":8,"name":110,"slug":111,"count":58},{"id":113,"date_created":114,"date_updated":8,"name":115,"slug":116,"count":46},{"id":118,"date_created":119,"date_updated":8,"name":120,"slug":121,"count":122},{"id":124,"date_created":125,"date_updated":8,"name":126,"slug":127,"count":122},{"id":129,"date_created":130,"date_updated":8,"name":131,"slug":132,"count":122},{"id":134,"date_created":135,"date_updated":8,"name":136,"slug":137,"count":138},{"id":140,"date_created":141,"date_updated":8,"name":142,"slug":143,"count":58},{"id":145,"date_created":146,"date_updated":8,"name":147,"slug":148,"count":138},{"id":150,"date_created":151,"date_updated":8,"name":152,"slug":153,"count":64},{"id":155,"date_created":156,"date_updated":8,"name":157,"slug":158,"count":138},{"id":160,"date_created":161,"date_updated":8,"name":162,"slug":163,"count":164},{"id":166,"date_created":167,"date_updated":8,"name":168,"slug":169,"count":138},{"id":171,"date_created":172,"date_updated":8,"name":173,"slug":174,"count":58},{"id":176,"date_created":177,"date_updated":8,"name":178,"slug":179,"count":46},{"id":181,"date_created":182,"date_updated":8,"name":183,"slug":184,"count":46},{"id":186,"date_created":187,"date_updated":8,"name":188,"slug":189,"count":190},{"id":192,"date_created":193,"date_updated":8,"name":194,"slug":195,"count":46},{"id":197,"date_created":198,"date_updated":199,"name":200,"slug":201,"count":46},{"id":203,"date_created":204,"date_updated":205,"name":206,"slug":207,"count":39},{"id":209,"date_created":210,"date_updated":8,"name":211,"slug":212,"count":58},[400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419],{"id":215,"date_created":216,"date_updated":8,"name":217,"slug":218,"count":46},{"id":48,"date_created":49,"date_updated":8,"name":50,"slug":51,"count":46},{"id":76,"date_created":77,"date_updated":8,"name":78,"slug":79,"count":64},{"id":222,"date_created":223,"date_updated":8,"name":224,"slug":225,"count":46},{"id":227,"date_created":228,"date_updated":8,"name":229,"slug":230,"count":39},{"id":91,"date_created":92,"date_updated":93,"name":94,"slug":95,"count":232},{"id":98,"date_created":99,"date_updated":8,"name":100,"slug":101,"count":234},{"id":118,"date_created":119,"date_updated":8,"name":120,"slug":121,"count":138},{"id":124,"date_created":125,"date_updated":8,"name":126,"slug":127,"count":237},{"id":239,"date_created":240,"date_updated":8,"name":241,"slug":242,"count":243},{"id":134,"date_created":135,"date_updated":8,"name":136,"slug":137,"count":32},{"id":155,"date_created":156,"date_updated":8,"name":157,"slug":158,"count":246},{"id":160,"date_created":161,"date_updated":8,"name":162,"slug":163,"count":58},{"id":166,"date_created":167,"date_updated":8,"name":168,"slug":169,"count":190},{"id":250,"date_created":251,"date_updated":8,"name":252,"slug":253,"count":122},{"id":176,"date_created":177,"date_updated":8,"name":178,"slug":179,"count":234},{"id":256,"date_created":257,"date_updated":8,"name":258,"slug":259,"count":46},{"id":181,"date_created":182,"date_updated":8,"name":183,"slug":184,"count":64},{"id":186,"date_created":187,"date_updated":8,"name":188,"slug":189,"count":262},{"id":264,"date_created":265,"date_updated":8,"name":266,"slug":267,"count":64},[421,422],{"id":270,"status":271,"date_created":272,"date_updated":273,"name":274,"description":275,"slug":276,"count":277},{"id":279,"status":271,"date_created":280,"date_updated":281,"name":282,"description":283,"slug":284,"count":285},{"title":289,"slug":290,"imageSet":424,"imageDescription":358},{"sourceFingerprint":292,"transformVersion":122,"seoSlug":290,"hash":293,"original":425,"variants":426,"avifVariants":434,"animated":356,"origin":357},{"key":295,"width":296,"height":297,"contentType":298,"bytes":299},[427,428,429,430,431,432,433],{"key":302,"width":303,"height":304,"contentType":305,"bytes":306},{"key":308,"width":309,"height":310,"contentType":305,"bytes":311},{"key":313,"width":314,"height":315,"contentType":305,"bytes":316},{"key":318,"width":319,"height":309,"contentType":305,"bytes":320},{"key":322,"width":323,"height":324,"contentType":305,"bytes":325},{"key":327,"width":328,"height":319,"contentType":305,"bytes":329},{"key":331,"width":296,"height":297,"contentType":305,"bytes":332},[435,436,437,438,439,440,441],{"key":335,"width":303,"height":304,"contentType":336,"bytes":337},{"key":339,"width":309,"height":310,"contentType":336,"bytes":340},{"key":342,"width":314,"height":315,"contentType":336,"bytes":343},{"key":345,"width":319,"height":309,"contentType":336,"bytes":346},{"key":348,"width":323,"height":324,"contentType":336,"bytes":349},{"key":351,"width":328,"height":319,"contentType":336,"bytes":352},{"key":354,"width":296,"height":297,"contentType":336,"bytes":355},{"id":443,"title":444,"slug":445,"coverImage":446,"cover":447},"7d53971d-bfe4-4dd0-a8cd-f96b8ce8b4fd","v3 - Part 1 - SSR to SSG","v3-part-1-ssr-to-ssg","438a0aca-b134-43df-a671-2b0231db1315",{"id":446,"title":448,"description":449,"width":296,"height":450,"filename_download":451,"type":298,"metadata":452,"imageSet":463},"2026 09 19 11.55.27.jpg","Open-frame server chassis with four exposed fans and internal circuit boards connected by black cables.",1536,"2026-09-19 11.55.27.jpg",{"ifd0":453,"exif":456},{"Make":454,"Model":455},"Apple","iPhone 16",{"FNumber":457,"ExposureTime":458,"FocalLength":459,"ISOSpeedRatings":460,"LensModel":461,"DateTimeOriginal":462},1.6,0.022222222222222223,5.960000038146973,500,"iPhone 16 back dual wide camera 5.96mm f\u002F1.6","2026-09-19T11:55:27.000Z",{"sourceFingerprint":464,"transformVersion":122,"seoSlug":445,"hash":465,"original":466,"variants":469,"avifVariants":497,"animated":356,"origin":357},"438a0aca-b134-43df-a671-2b0231db1315:2026-09-28T10:41:20.932Z:480039:438a0aca-b134-43df-a671-2b0231db1315.jpg","75180cb3d53a57e9",{"key":467,"width":296,"height":450,"contentType":298,"bytes":468},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Foriginal.jpg",480039,[470,474,478,482,486,490,494],{"key":471,"width":303,"height":472,"contentType":305,"bytes":473},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-320-0bb7d374467d.webp",240,18674,{"key":475,"width":309,"height":476,"contentType":305,"bytes":477},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-640-00251eb6c0a3.webp",480,53942,{"key":479,"width":314,"height":480,"contentType":305,"bytes":481},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-768-9de7fb666021.webp",576,70978,{"key":483,"width":319,"height":484,"contentType":305,"bytes":485},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-960-cd409217c258.webp",720,97908,{"key":487,"width":323,"height":488,"contentType":305,"bytes":489},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-1200-e39e2d80938c.webp",900,132374,{"key":491,"width":328,"height":492,"contentType":305,"bytes":493},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-1440-c41e386955a9.webp",1080,167544,{"key":495,"width":296,"height":450,"contentType":305,"bytes":496},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-2048-22f3369431ac.webp",262238,[498,501,504,507,510,513,516],{"key":499,"width":303,"height":472,"contentType":336,"bytes":500},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-320-0f528a6b9269.avif",15468,{"key":502,"width":309,"height":476,"contentType":336,"bytes":503},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-640-6fcfb0df4dd4.avif",43285,{"key":505,"width":314,"height":480,"contentType":336,"bytes":506},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-768-544b2df6e5bd.avif",57286,{"key":508,"width":319,"height":484,"contentType":336,"bytes":509},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-960-903d5b1aca4b.avif",78293,{"key":511,"width":323,"height":488,"contentType":336,"bytes":512},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-1200-b73cd8cfaf04.avif",107802,{"key":514,"width":328,"height":492,"contentType":336,"bytes":515},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-1440-ef6334630fd2.avif",137380,{"key":517,"width":296,"height":450,"contentType":336,"bytes":518},"assets\u002F438a0aca-b134-43df-a671-2b0231db1315\u002F75180cb3d53a57e9\u002Fv3-part-1-ssr-to-ssg-2048-2b72b8f56752.avif",247504,{"blog":520,"post":552,"markdownDocument":557,"toc":1255,"currentPage":46,"previousPage":8,"nextPage":8,"previousBlog":1270,"nextBlog":8,"previousBlogDate":1279,"nextBlogDate":8,"blogLinkPaths":1349},{"id":443,"status":271,"title":444,"slug":445,"excerpt":521,"coverImage":446,"categories":522,"tags":523,"relatedPhotos":524,"discourseTopicId":8,"discourseEnabled":356,"dateCreated":525,"dateUpdated":525,"cover":526,"posts":548},"jasonloong.com has moved from SSR to SSG. The site now runs on Cloudflare Pages, served at the edge for more consistent speeds globally 🌎.",[23,30],[57,132,207,212],[],"2026-09-28T10:45:00.000Z",{"id":446,"title":448,"description":449,"width":296,"height":450,"filename_download":451,"type":298,"metadata":527,"imageSet":530},{"ifd0":528,"exif":529},{"Make":454,"Model":455},{"FNumber":457,"ExposureTime":458,"FocalLength":459,"ISOSpeedRatings":460,"LensModel":461,"DateTimeOriginal":462},{"sourceFingerprint":464,"transformVersion":122,"seoSlug":445,"hash":465,"original":531,"variants":532,"avifVariants":540,"animated":356,"origin":357},{"key":467,"width":296,"height":450,"contentType":298,"bytes":468},[533,534,535,536,537,538,539],{"key":471,"width":303,"height":472,"contentType":305,"bytes":473},{"key":475,"width":309,"height":476,"contentType":305,"bytes":477},{"key":479,"width":314,"height":480,"contentType":305,"bytes":481},{"key":483,"width":319,"height":484,"contentType":305,"bytes":485},{"key":487,"width":323,"height":488,"contentType":305,"bytes":489},{"key":491,"width":328,"height":492,"contentType":305,"bytes":493},{"key":495,"width":296,"height":450,"contentType":305,"bytes":496},[541,542,543,544,545,546,547],{"key":499,"width":303,"height":472,"contentType":336,"bytes":500},{"key":502,"width":309,"height":476,"contentType":336,"bytes":503},{"key":505,"width":314,"height":480,"contentType":336,"bytes":506},{"key":508,"width":319,"height":484,"contentType":336,"bytes":509},{"key":511,"width":323,"height":488,"contentType":336,"bytes":512},{"key":514,"width":328,"height":492,"contentType":336,"bytes":515},{"key":517,"width":296,"height":450,"contentType":336,"bytes":518},[549],{"id":550,"number":46,"subtitle":8,"path":551},"9785eb98-abfa-4171-8de6-bf5fe4fc629a","content\u002Fposts\u002Fv3-part-1-ssr-to-ssg\u002F01.md",{"metadata":553,"markdown":556},{"id":550,"status":271,"blog":445,"postNumber":46,"subtitle":8,"coverImage":8,"dateCreated":554,"dateUpdated":555},"2026-09-08T09:19:13.919Z","2026-09-28T10:42:06.271Z","The website has been moved from SSR to SSG.\n\nInfrastructure now runs on Cloudflare Pages, served at the edge for more consistent speeds globally 🌎.\n\n## Before the great move\n\nTerms:\n\n- SSR - Server-Side Rendering\n- SSG - Static Site Generation\n\nThe SSR site was hosted on a DigitalOcean droplet (Basic \u002F 2 vCPUs \u002F 2 GB RAM \u002F 50 GB Disk), along with other services like [Keycloak](https:\u002F\u002Fwww.keycloak.org\u002F), [LibreNMS](https:\u002F\u002Fwww.librenms.org\u002F) and some self-developed full-stack lifestyle\u002Ftracking apps.\n\nThe droplet also used to host other public-facing services, including [Plausible Analytics](https:\u002F\u002Fplausible.io\u002F), which is currently used by this website. As the droplet became increasingly crowded, I moved Plausible back to one of my VMs to make room for Keycloak.\n\nA healthy 4GB swap exists, but the Directus instance started failing to serve on-demand responsive images on the website. \n\nEverything mostly worked, but over time I developed a lingering concern that visitors would run into issues. The most obvious example was responsive images occasionally returning a 404, only to appear after a quick refresh. Visitors outside the APAC region also faced unavoidable latency.\n\nFor the bulk of [jasonloong.com v2](\u002Fblog\u002Fjasonloong-com-v2), where SSR was strengthened overall, I looked into offloading the site to SSG since it’s no longer updated as frequently. \n\n## AI 🤖 Acceptance\n\nUnless you’re a hermit living in a cave without an internet connection, 2025-2026 wasn't a great period for real software developers, junior or senior (not vibe coders).\n\nUp till the v2 update, most of the website's core skeleton, architectural direction, and schema models were manually thought out and researched, with nights of coding, previewing, and ah-ha 😇 moments.\n\nAs of writing this post in 2026, AI is pretty good now, as long as the user knows what to ask for.\n\nFrom personal experience, a software feature that may have taken me 1 day to implement comfortably, without tests, could be implemented by AI in less than 10 minutes to \\~2 hours, depending on whether you are still testing things out or verifying a feature. \n\nWith AI being the assistant, I directed it to create a local SSG builder that links up directly to my Directus instance.\n\n## Being 🙋🏻‍♂️ Human\n\nWhile this website isn't the greatest or most popular in the region, I put genuine effort into writing content directed to readers. Besides giving the rare organic visitor something useful (hopefully entertaining) to read, this blog is also a diary. Somewhere I can look back on the events, projects, and posts that have accumulated over the years.\n\nHere's a quick example from my assistant, TASUKO:\n\n:::ai-content\nMy tutorials come from things I have actually built, broken, tested and eventually understood. That should be an unremarkable standard, but the internet remains generously supplied with tutorial-farm posts.\n\nYou know the ones. They rank well and explain exactly what was already in the documentation, only with a friendlier tone and considerably more optimism.\n\nI have no interest in adding to that pile.\n:::\n\nAs a blog author publishing content\u002Finformation on the Internet, I believe I have a responsibility to be transparent about what I publish. That said, TASUKO is also meant to help me soften any crude\u002Fstraight-to-truth comments that readers may find offensive. 😂\n\nSo, going forward, whenever a significant part of a blog post is heavily AI-generated or AI-assisted, I'll declare it accordingly and honestly.\n\n## Versioning\n\nWhile directing AI to build a simpler alternative to Nuxt Content, a TipTap Markdown parse caused some published content to disappear. I only discovered the damage after visiting the website, but Directus’s versioning allowed me to recover it. Why reinvent the wheel, right?\n\nHow bad was the damage, and why did versioning matter?\n\nTwo tables disappeared from the published [Leica M10 Experience](\u002Fblog\u002Fleica-m10-experience) post and remained missing for a good two months.\n\nWithout the restore, I would have needed to reopen the relevant tabs, go through my old posts and recalculate the numbers, while hoping I could remember what had originally been written.\n\n![Directus Versioning - Missing camera lenses table](https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1)\n\nThat saved me 15\\~30 minutes of frustration; what if you had even more tables? Numbers that may not have been saved anywhere else as backup, or no longer accessible?\n\n## Directus Stays\n\nWith the help of AI, I smoothly migrated the Directus Docker instance from my droplet to my local VM to use as the main source of truth for all my content. \n\n[Directus](https:\u002F\u002Fdirectus.com\u002F) is pretty mature and stable now, and it's better to let it handle content versioning, which I came to appreciate even more after this mishap.\n\nDirectus’s role:\n\n- User Management\n- Versioning and source of truth for my blog post content (headless CMS - Content Management System) and photo assets (DAM - Digital Asset Management)\n- Master model schema\n\n## Why not Nuxt Content\n\nIt was mostly a timeline mismatch.\n\nWhen I made this decision, Nuxt Content v1 and v2 were still file-based and Git-oriented. The SQL-backed storage and collections available in Nuxt Content v3 only arrived in 2025.\n\nThe idea of keeping my content as static files governed by my self-hosted GitLab repository was neat, but it did not fit what I needed at the time. I do not deploy and maintain services purely for “fun”, at least not after the initial curiosity wears off. Whether it is a homelab service or this website, it eventually needs to be flexible enough for the people expected to use it.\n\n### GUI and user experience\n\nI needed something a non-technical editor could log in to and use without understanding Git, Markdown repositories or deployment pipelines. Heck, even for myself over the years, when I eventually get older and start to forget.\n\nImagine asking someone from marketing or sales to edit a company website through an online code editor. Technically possible, certainly. Whether they would ever volunteer to do it a second time is another question. 😱\n\n[Nuxt Studio](https:\u002F\u002Fnuxt.com\u002Fmodules\u002Fstudio) eventually provided the kind of visual editing experience I wanted, but that came after this website had already settled on Directus.\n\nNuxt Content would also have coupled my authoring, custom components and publishing workflow more tightly to the Nuxt ecosystem. The Markdown itself remained portable, but the complete editing and rendering experience would have depended on Nuxt-specific conventions.\n\nI chose Directus because it already provided user management, versioning, structured models, relationships and asset management. More importantly, those features were available when I needed them.\n\nThe experience also remains useful beyond this personal website. If I need to build something similar for an SMB, I understand where Directus fits, where it does not, and when its licensing needs to be considered.\n\n✅ SSR - suitable when content must be rendered or personalized at request time\n\n✅ SSG with a custom publisher - suitable when content changes less frequently and can wait for a deliberate build\n\n✅ Custom admin portal - can support either rendering model SSR\u002FSSG and be tailored to the editor’s requirements\n\nDirectus was never the issue; my infrastructure requirements simply changed.\n\n## Infrastructure\n\n![Previous SSR Topology](https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002F076a7205-b89e-4c4f-a1cd-31e13c373b67)\n\nBefore moving to SSG, the standard topology looked like this: my DigitalOcean droplet acted as the NGINX reverse proxy, routing requests to public-facing services running either on the droplet itself or through a tunnel to my virtual machines.\n\nNot shown on the diagram: \n\n- [Uptime Kuma](https:\u002F\u002Fuptimekuma.co\u002F)\n- [Plausible Analytics](https:\u002F\u002Fplausible.io\u002F)\n- and many others not relevant to this post 😁\n\nA viable solution before the whole SSG feature was to move the stacks\u002Fservices back to one of my Virtual Machines, which definitely have more than 2 vCPUs \u002F 2GB RAM.\n\nI could have stopped there, but I didn't want to make my home\u002Fhomelab a critical public-facing dependency.\n\n## Cloudflare Pages &amp; Cloudflare R2\n\nAs my AI-assisted research went deeper into the rabbit hole, the performance and infrastructure benefits of SSG, combined with Cloudflare Pages and R2, made the migration worth trying. SSG and JAMstack-style deployments were not new to me, but I deliberately wanted the experience of hosting and maintaining a traditional server-served application first. Having done that for several years, I now had a good reason to give SSG a proper go.\n\nI had nothing to lose: faster speeds, pre-rendered HTML that crawlers can read without depending on my origin server, fewer exposed security vectors, and fewer website downtime notifications whenever my home WAN connection goes down.\n\n![New SSG Infrastructure](https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002F34027451-7669-467c-8408-7bae13b679b8)\n\nThe main takeaway is that the site currently uses less than R2’s free 10 GB-month storage allowance, while Internet egress is free.\n\n:::ai-content\nThe current setup uses:\n\n- **Cloudflare Pages** — Hosts the generated HTML, CSS and JavaScript.\n- **Cloudflare R2** — Stores the original photographs and generated WebP\u002FAVIF variants.\n- **Cloudflare DNS\u002FCDN** — Handles the domain, HTTPS and edge caching.\n\nRelevant Free-plan limits:\n\n- Pages: 500 deployments per month, 20,000 files per deployment and 25 MiB per file.\n- R2: 10 GB-month storage, 1 million write operations and 10 million read operations per month.\n- Static Pages requests and R2 Internet egress are free.\n- 10 Cache Rules.\n:::\n\nWhat changed in the migration:\n\n- Responsive images are no longer generated on demand by Directus. Predetermined WebP and AVIF variants are generated during the build instead.\n\nThe important part is the separation: publishing may become unavailable when my homelab is down, but the last deployed website remains online.\n\n### oh my WordPress\n\nBetween my previous experience, documented in [From 2020 and into 2023 # tired of maintenance](\u002Fblog\u002Ffrom-2020-and-into-2023#tired-of-maintenance), and the steady stream of WordPress plugin security advisories, I knew I didn't want my personal website to become another patching schedule.\n\n```bash\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:41 +0800] \"POST \u002Fblog\u002F?rest_route=\u002Fbatch%2Fv1 HTTP\u002F1.1\" 404 110 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:42 +0800] \"POST \u002Fblog\u002F?rest_route=\u002Fbatch\u002Fv1 HTTP\u002F1.1\" 404 110 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:43 +0800] \"POST \u002Fblog\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\" 404 142 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:44 +0800] \"POST \u002Fblog\u002Fwp-json\u002FBatch\u002Fv1 HTTP\u002F1.1\" 404 142 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:44 +0800] \"POST \u002Fblog\u002F\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\" 404 144 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:44 +0800] \"POST \u002Fblog\u002Fwp-json\u002Fbatch\u002Fv1\u002F HTTP\u002F1.1\" 404 144 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:45 +0800] \"POST \u002Fblog\u002Fblog\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\" 404 152 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\n45.148.10.9 - - [28\u002FSep\u002F2026:16:14:45 +0800] \"POST \u002Fblog\u002Fwordpress\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\" 404 162 \"https:\u002F\u002FREDACTED\" \"WordPress\u002F6.4.3\"\nroot@REDACTED:\u002Fvar\u002Flog\u002Fnginx# cat REDACTED.access.log | grep -i 'wp-admin' | wc -l\n457 # Another day of wp-admin attempts, excluding other .env attempts 😂\n```\n\nThat was one reason I chose Nuxt over WordPress. Moving from SSR to SSG takes the idea further: the public website no longer exposes my CMS or application server with every visitor request. Cloudflare serves generated HTML, JavaScript and images, while Directus and the authoring tools remain elsewhere.\n\n## What changed for me\n\nI have three hypervisors running [XCP-ng](https:\u002F\u002Fxcp-ng.org\u002F), separated by role and priority:\n\n1. `[Storage]` - On the most stable platform if possible. Data, backups, memories (photos). This role previously belonged to a Synology DS916+, which has since been retired, with its storage migrated to TrueNAS SCALE.\n2. `[Router\u002FFirewall]` - As of 2026, usable 4G\u002F5G coverage means that even without the main WAN connection, I can still get online to find information or support.\n3. `[Services\u002FApps]` - Most services and applications, including public-facing ones, live here. Anything requiring greater stability may instead be placed on `[Storage]`.\n\nI had plans to move the public-facing services onto `[Storage]`, but this separation of the website from my homelab became useful sooner than expected.\n\nA TrueNAS VM running on the `[Storage]` hypervisor recently developed a suspected HBA or cable-path issue, requiring the hypervisor to be shut down for investigation. By then, the website had already been converted to SSG. \n\nThe consequences are minor for a personal blog, but the same separation matters much more in a production environment—for example, a company website or critical customer-facing service.\n\n![TrueNAS storage hypervisor shut down for HBA troubleshooting](https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002F98a21748-656f-4a63-aa76-9aced1fee24d)\n\nDirectus, the admin portal or the publishing workflow may become temporarily unavailable depending on the affected infrastructure, but the last deployed website remains online through Cloudflare Pages and R2. \n\n> Nothing is perfect... or free.\n\nFortunately, the forums and analytics were unaffected during this downtime, as I only needed to shut down the `[Storage]` hypervisor. Even if I eventually move these public-facing “critical” services onto it, the consequences of an outage remain acceptable: users temporarily lose access to the forums, and I miss some website analytics.\n\nI can repair or upgrade the server without wondering how long the public website has been offline. That, more than a Lighthouse score, is the improvement I wanted.\n\nMoving this website onto new infrastructure was only half the work. The next \"feature\" was building a publishing pipeline I could trust with the content and photographs accumulated over the years.",{"frontmatter":558,"meta":559,"nodes":598},{},{"toc":560},{"title":561,"searchDepth":64,"depth":64,"links":562},"",[563,566,569,572,575,578,585,588,595],{"id":564,"depth":64,"text":565},"before-the-great-move","Before the great move",{"id":567,"depth":64,"text":568},"ai-acceptance","AI 🤖 Acceptance",{"id":570,"depth":64,"text":571},"being-human","Being 🙋🏻‍♂️ Human",{"id":573,"depth":64,"text":574},"versioning","Versioning",{"id":576,"depth":64,"text":577},"directus-stays","Directus Stays",{"id":579,"depth":64,"text":580,"children":581},"why-not-nuxt-content","Why not Nuxt Content",[582],{"id":583,"depth":58,"text":584},"why-not-nuxt-content-gui-and-user-experience","GUI and user experience",{"id":586,"depth":64,"text":587},"infrastructure","Infrastructure",{"id":589,"depth":64,"text":590,"children":591},"cloudflare-pages-cloudflare-r2","Cloudflare Pages & Cloudflare R2",[592],{"id":593,"depth":58,"text":594},"cloudflare-pages-cloudflare-r2-oh-my-wordpress","oh my WordPress",{"id":596,"depth":64,"text":597},"what-changed-for-me","What changed for me",[599,603,606,609,612,622,637,645,648,651,659,661,664,667,670,673,676,678,681,684,696,699,702,704,707,710,718,721,728,731,733,736,742,745,756,758,761,764,767,770,773,776,783,786,789,792,795,798,801,804,806,812,815,818,833,836,839,841,844,847,853,856,899,902,907,910,912,920,1179,1182,1184,1191,1215,1221,1227,1230,1236,1239,1243,1249,1252],[600,601,602],"p",{},"The website has been moved from SSR to SSG.",[600,604,605],{},"Infrastructure now runs on Cloudflare Pages, served at the edge for more consistent speeds globally 🌎.",[607,608,565],"h2",{"id":564},[600,610,611],{},"Terms:",[613,614,615,619],"ul",{},[616,617,618],"li",{},"SSR - Server-Side Rendering",[616,620,621],{},"SSG - Static Site Generation",[600,623,624,625,632,633,636],{},"The SSR site was hosted on a DigitalOcean droplet (Basic \u002F 2 vCPUs \u002F 2 GB RAM \u002F 50 GB Disk), along with other services like ",[626,627,631],"a",{"href":628,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fwww.keycloak.org\u002F","_blank",true,"Keycloak",", ",[626,634,105],{"href":635,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fwww.librenms.org\u002F"," and some self-developed full-stack lifestyle\u002Ftracking apps.",[600,638,639,640,644],{},"The droplet also used to host other public-facing services, including ",[626,641,643],{"href":642,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fplausible.io\u002F","Plausible Analytics",", which is currently used by this website. As the droplet became increasingly crowded, I moved Plausible back to one of my VMs to make room for Keycloak.",[600,646,647],{},"A healthy 4GB swap exists, but the Directus instance started failing to serve on-demand responsive images on the website.",[600,649,650],{},"Everything mostly worked, but over time I developed a lingering concern that visitors would run into issues. The most obvious example was responsive images occasionally returning a 404, only to appear after a quick refresh. Visitors outside the APAC region also faced unavoidable latency.",[600,652,653,654,658],{},"For the bulk of ",[626,655,657],{"href":656,"blog-post":630,"external-link":356},"\u002Fblog\u002Fjasonloong-com-v2","jasonloong.com v2",", where SSR was strengthened overall, I looked into offloading the site to SSG since it’s no longer updated as frequently.",[607,660,568],{"id":567},[600,662,663],{},"Unless you’re a hermit living in a cave without an internet connection, 2025-2026 wasn't a great period for real software developers, junior or senior (not vibe coders).",[600,665,666],{},"Up till the v2 update, most of the website's core skeleton, architectural direction, and schema models were manually thought out and researched, with nights of coding, previewing, and ah-ha 😇 moments.",[600,668,669],{},"As of writing this post in 2026, AI is pretty good now, as long as the user knows what to ask for.",[600,671,672],{},"From personal experience, a software feature that may have taken me 1 day to implement comfortably, without tests, could be implemented by AI in less than 10 minutes to ~2 hours, depending on whether you are still testing things out or verifying a feature.",[600,674,675],{},"With AI being the assistant, I directed it to create a local SSG builder that links up directly to my Directus instance.",[607,677,571],{"id":570},[600,679,680],{},"While this website isn't the greatest or most popular in the region, I put genuine effort into writing content directed to readers. Besides giving the rare organic visitor something useful (hopefully entertaining) to read, this blog is also a diary. Somewhere I can look back on the events, projects, and posts that have accumulated over the years.",[600,682,683],{},"Here's a quick example from my assistant, TASUKO:",[685,686,687,690,693],"ai-content",{},[600,688,689],{},"My tutorials come from things I have actually built, broken, tested and eventually understood. That should be an unremarkable standard, but the internet remains generously supplied with tutorial-farm posts.",[600,691,692],{},"You know the ones. They rank well and explain exactly what was already in the documentation, only with a friendlier tone and considerably more optimism.",[600,694,695],{},"I have no interest in adding to that pile.",[600,697,698],{},"As a blog author publishing content\u002Finformation on the Internet, I believe I have a responsibility to be transparent about what I publish. That said, TASUKO is also meant to help me soften any crude\u002Fstraight-to-truth comments that readers may find offensive. 😂",[600,700,701],{},"So, going forward, whenever a significant part of a blog post is heavily AI-generated or AI-assisted, I'll declare it accordingly and honestly.",[607,703,574],{"id":573},[600,705,706],{},"While directing AI to build a simpler alternative to Nuxt Content, a TipTap Markdown parse caused some published content to disappear. I only discovered the damage after visiting the website, but Directus’s versioning allowed me to recover it. Why reinvent the wheel, right?",[600,708,709],{},"How bad was the damage, and why did versioning matter?",[600,711,712,713,717],{},"Two tables disappeared from the published ",[626,714,716],{"href":715,"blog-post":630,"external-link":356},"\u002Fblog\u002Fleica-m10-experience","Leica M10 Experience"," post and remained missing for a good two months.",[600,719,720],{},"Without the restore, I would have needed to reopen the relevant tabs, go through my old posts and recalculate the numbers, while hoping I could remember what had originally been written.",[600,722,723],{},[724,725],"img",{"src":726,"alt":727},"https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1","Directus Versioning - Missing camera lenses table",[600,729,730],{},"That saved me 15~30 minutes of frustration; what if you had even more tables? Numbers that may not have been saved anywhere else as backup, or no longer accessible?",[607,732,577],{"id":576},[600,734,735],{},"With the help of AI, I smoothly migrated the Directus Docker instance from my droplet to my local VM to use as the main source of truth for all my content.",[600,737,738,741],{},[626,739,56],{"href":740,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fdirectus.com\u002F"," is pretty mature and stable now, and it's better to let it handle content versioning, which I came to appreciate even more after this mishap.",[600,743,744],{},"Directus’s role:",[613,746,747,750,753],{},[616,748,749],{},"User Management",[616,751,752],{},"Versioning and source of truth for my blog post content (headless CMS - Content Management System) and photo assets (DAM - Digital Asset Management)",[616,754,755],{},"Master model schema",[607,757,580],{"id":579},[600,759,760],{},"It was mostly a timeline mismatch.",[600,762,763],{},"When I made this decision, Nuxt Content v1 and v2 were still file-based and Git-oriented. The SQL-backed storage and collections available in Nuxt Content v3 only arrived in 2025.",[600,765,766],{},"The idea of keeping my content as static files governed by my self-hosted GitLab repository was neat, but it did not fit what I needed at the time. I do not deploy and maintain services purely for “fun”, at least not after the initial curiosity wears off. Whether it is a homelab service or this website, it eventually needs to be flexible enough for the people expected to use it.",[768,769,584],"h3",{"id":583},[600,771,772],{},"I needed something a non-technical editor could log in to and use without understanding Git, Markdown repositories or deployment pipelines. Heck, even for myself over the years, when I eventually get older and start to forget.",[600,774,775],{},"Imagine asking someone from marketing or sales to edit a company website through an online code editor. Technically possible, certainly. Whether they would ever volunteer to do it a second time is another question. 😱",[600,777,778,782],{},[626,779,781],{"href":780,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fnuxt.com\u002Fmodules\u002Fstudio","Nuxt Studio"," eventually provided the kind of visual editing experience I wanted, but that came after this website had already settled on Directus.",[600,784,785],{},"Nuxt Content would also have coupled my authoring, custom components and publishing workflow more tightly to the Nuxt ecosystem. The Markdown itself remained portable, but the complete editing and rendering experience would have depended on Nuxt-specific conventions.",[600,787,788],{},"I chose Directus because it already provided user management, versioning, structured models, relationships and asset management. More importantly, those features were available when I needed them.",[600,790,791],{},"The experience also remains useful beyond this personal website. If I need to build something similar for an SMB, I understand where Directus fits, where it does not, and when its licensing needs to be considered.",[600,793,794],{},"✅ SSR - suitable when content must be rendered or personalized at request time",[600,796,797],{},"✅ SSG with a custom publisher - suitable when content changes less frequently and can wait for a deliberate build",[600,799,800],{},"✅ Custom admin portal - can support either rendering model SSR\u002FSSG and be tailored to the editor’s requirements",[600,802,803],{},"Directus was never the issue; my infrastructure requirements simply changed.",[607,805,587],{"id":586},[600,807,808],{},[724,809],{"src":810,"alt":811},"https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002F076a7205-b89e-4c4f-a1cd-31e13c373b67","Previous SSR Topology",[600,813,814],{},"Before moving to SSG, the standard topology looked like this: my DigitalOcean droplet acted as the NGINX reverse proxy, routing requests to public-facing services running either on the droplet itself or through a tunnel to my virtual machines.",[600,816,817],{},"Not shown on the diagram:",[613,819,820,826,830],{},[616,821,822],{},[626,823,825],{"href":824,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fuptimekuma.co\u002F","Uptime Kuma",[616,827,828],{},[626,829,643],{"href":642,"target":629,"blog-post":356,"external-link":630},[616,831,832],{},"and many others not relevant to this post 😁",[600,834,835],{},"A viable solution before the whole SSG feature was to move the stacks\u002Fservices back to one of my Virtual Machines, which definitely have more than 2 vCPUs \u002F 2GB RAM.",[600,837,838],{},"I could have stopped there, but I didn't want to make my home\u002Fhomelab a critical public-facing dependency.",[607,840,590],{"id":589},[600,842,843],{},"As my AI-assisted research went deeper into the rabbit hole, the performance and infrastructure benefits of SSG, combined with Cloudflare Pages and R2, made the migration worth trying. SSG and JAMstack-style deployments were not new to me, but I deliberately wanted the experience of hosting and maintaining a traditional server-served application first. Having done that for several years, I now had a good reason to give SSG a proper go.",[600,845,846],{},"I had nothing to lose: faster speeds, pre-rendered HTML that crawlers can read without depending on my origin server, fewer exposed security vectors, and fewer website downtime notifications whenever my home WAN connection goes down.",[600,848,849],{},[724,850],{"src":851,"alt":852},"https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002F34027451-7669-467c-8408-7bae13b679b8","New SSG Infrastructure",[600,854,855],{},"The main takeaway is that the site currently uses less than R2’s free 10 GB-month storage allowance, while Internet egress is free.",[685,857,858,861,882,885],{},[600,859,860],{},"The current setup uses:",[613,862,863,870,876],{},[616,864,865,869],{},[866,867,868],"strong",{},"Cloudflare Pages"," — Hosts the generated HTML, CSS and JavaScript.",[616,871,872,875],{},[866,873,874],{},"Cloudflare R2"," — Stores the original photographs and generated WebP\u002FAVIF variants.",[616,877,878,881],{},[866,879,880],{},"Cloudflare DNS\u002FCDN"," — Handles the domain, HTTPS and edge caching.",[600,883,884],{},"Relevant Free-plan limits:",[613,886,887,890,893,896],{},[616,888,889],{},"Pages: 500 deployments per month, 20,000 files per deployment and 25 MiB per file.",[616,891,892],{},"R2: 10 GB-month storage, 1 million write operations and 10 million read operations per month.",[616,894,895],{},"Static Pages requests and R2 Internet egress are free.",[616,897,898],{},"10 Cache Rules.",[600,900,901],{},"What changed in the migration:",[613,903,904],{},[616,905,906],{},"Responsive images are no longer generated on demand by Directus. Predetermined WebP and AVIF variants are generated during the build instead.",[600,908,909],{},"The important part is the separation: publishing may become unavailable when my homelab is down, but the last deployed website remains online.",[768,911,594],{"id":593},[600,913,914,915,919],{},"Between my previous experience, documented in ",[626,916,918],{"href":917,"blog-post":630,"external-link":356},"\u002Fblog\u002Ffrom-2020-and-into-2023#tired-of-maintenance","From 2020 and into 2023 # tired of maintenance",", and the steady stream of WordPress plugin security advisories, I knew I didn't want my personal website to become another patching schedule.",[921,922,926],"pre",{"language":923,"class":924,"style":925},"bash","shiki shiki-themes github-light github-dark dark:github-dark","background-color:#fff;color:#24292e;--shiki-dark-bg:#24292e;--shiki-dark:#e1e4e8",[927,928,930,968,969,968,993,968,1018,968,1042,968,1066,968,1089,968,1114,968,1138,968,1170],"code",{"class":929},"language-bash",[931,932,935,939,943,945,949,952,955,959,962,965],"span",{"class":933,"style":934},"line","display: inline",[931,936,938],{"style":937},"color:#6F42C1;--shiki-dark:#B392F0","45.148.10.9",[931,940,942],{"style":941},"color:#032F62;--shiki-dark:#9ECBFF"," -",[931,944,942],{"style":941},[931,946,948],{"style":947},"color:#24292E;--shiki-dark:#E1E4E8"," [28\u002FSep\u002F2026:16:14:41 ",[931,950,951],{"style":941},"+0800]",[931,953,954],{"style":941}," \"POST \u002Fblog\u002F?rest_route=\u002Fbatch%2Fv1 HTTP\u002F1.1\"",[931,956,958],{"style":957},"color:#005CC5;--shiki-dark:#79B8FF"," 404",[931,960,961],{"style":957}," 110",[931,963,964],{"style":941}," \"https:\u002F\u002FREDACTED\"",[931,966,967],{"style":941}," \"WordPress\u002F6.4.3\"","\n",[931,970,971,973,975,977,980,982,985,987,989,991],{"class":933,"style":934},[931,972,938],{"style":937},[931,974,942],{"style":941},[931,976,942],{"style":941},[931,978,979],{"style":947}," [28\u002FSep\u002F2026:16:14:42 ",[931,981,951],{"style":941},[931,983,984],{"style":941}," \"POST \u002Fblog\u002F?rest_route=\u002Fbatch\u002Fv1 HTTP\u002F1.1\"",[931,986,958],{"style":957},[931,988,961],{"style":957},[931,990,964],{"style":941},[931,992,967],{"style":941},[931,994,995,997,999,1001,1004,1006,1009,1011,1014,1016],{"class":933,"style":934},[931,996,938],{"style":937},[931,998,942],{"style":941},[931,1000,942],{"style":941},[931,1002,1003],{"style":947}," [28\u002FSep\u002F2026:16:14:43 ",[931,1005,951],{"style":941},[931,1007,1008],{"style":941}," \"POST \u002Fblog\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\"",[931,1010,958],{"style":957},[931,1012,1013],{"style":957}," 142",[931,1015,964],{"style":941},[931,1017,967],{"style":941},[931,1019,1020,1022,1024,1026,1029,1031,1034,1036,1038,1040],{"class":933,"style":934},[931,1021,938],{"style":937},[931,1023,942],{"style":941},[931,1025,942],{"style":941},[931,1027,1028],{"style":947}," [28\u002FSep\u002F2026:16:14:44 ",[931,1030,951],{"style":941},[931,1032,1033],{"style":941}," \"POST \u002Fblog\u002Fwp-json\u002FBatch\u002Fv1 HTTP\u002F1.1\"",[931,1035,958],{"style":957},[931,1037,1013],{"style":957},[931,1039,964],{"style":941},[931,1041,967],{"style":941},[931,1043,1044,1046,1048,1050,1052,1054,1057,1059,1062,1064],{"class":933,"style":934},[931,1045,938],{"style":937},[931,1047,942],{"style":941},[931,1049,942],{"style":941},[931,1051,1028],{"style":947},[931,1053,951],{"style":941},[931,1055,1056],{"style":941}," \"POST \u002Fblog\u002F\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\"",[931,1058,958],{"style":957},[931,1060,1061],{"style":957}," 144",[931,1063,964],{"style":941},[931,1065,967],{"style":941},[931,1067,1068,1070,1072,1074,1076,1078,1081,1083,1085,1087],{"class":933,"style":934},[931,1069,938],{"style":937},[931,1071,942],{"style":941},[931,1073,942],{"style":941},[931,1075,1028],{"style":947},[931,1077,951],{"style":941},[931,1079,1080],{"style":941}," \"POST \u002Fblog\u002Fwp-json\u002Fbatch\u002Fv1\u002F HTTP\u002F1.1\"",[931,1082,958],{"style":957},[931,1084,1061],{"style":957},[931,1086,964],{"style":941},[931,1088,967],{"style":941},[931,1090,1091,1093,1095,1097,1100,1102,1105,1107,1110,1112],{"class":933,"style":934},[931,1092,938],{"style":937},[931,1094,942],{"style":941},[931,1096,942],{"style":941},[931,1098,1099],{"style":947}," [28\u002FSep\u002F2026:16:14:45 ",[931,1101,951],{"style":941},[931,1103,1104],{"style":941}," \"POST \u002Fblog\u002Fblog\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\"",[931,1106,958],{"style":957},[931,1108,1109],{"style":957}," 152",[931,1111,964],{"style":941},[931,1113,967],{"style":941},[931,1115,1116,1118,1120,1122,1124,1126,1129,1131,1134,1136],{"class":933,"style":934},[931,1117,938],{"style":937},[931,1119,942],{"style":941},[931,1121,942],{"style":941},[931,1123,1099],{"style":947},[931,1125,951],{"style":941},[931,1127,1128],{"style":941}," \"POST \u002Fblog\u002Fwordpress\u002Fwp-json\u002Fbatch\u002Fv1 HTTP\u002F1.1\"",[931,1130,958],{"style":957},[931,1132,1133],{"style":957}," 162",[931,1135,964],{"style":941},[931,1137,967],{"style":941},[931,1139,1140,1143,1146,1149,1153,1156,1159,1162,1164,1167],{"class":933,"style":934},[931,1141,1142],{"style":937},"root@REDACTED:\u002Fvar\u002Flog\u002Fnginx#",[931,1144,1145],{"style":941}," cat",[931,1147,1148],{"style":941}," REDACTED.access.log",[931,1150,1152],{"style":1151},"color:#D73A49;--shiki-dark:#F97583"," |",[931,1154,1155],{"style":937}," grep",[931,1157,1158],{"style":957}," -i",[931,1160,1161],{"style":941}," 'wp-admin'",[931,1163,1152],{"style":1151},[931,1165,1166],{"style":937}," wc",[931,1168,1169],{"style":957}," -l",[931,1171,1172,1175],{"class":933,"style":934},[931,1173,1174],{"style":937},"457",[931,1176,1178],{"style":1177},"color:#6A737D;--shiki-dark:#6A737D"," # Another day of wp-admin attempts, excluding other .env attempts 😂",[600,1180,1181],{},"That was one reason I chose Nuxt over WordPress. Moving from SSR to SSG takes the idea further: the public website no longer exposes my CMS or application server with every visitor request. Cloudflare serves generated HTML, JavaScript and images, while Directus and the authoring tools remain elsewhere.",[607,1183,597],{"id":596},[600,1185,1186,1187,1190],{},"I have three hypervisors running ",[626,1188,211],{"href":1189,"target":629,"blog-post":356,"external-link":630},"https:\u002F\u002Fxcp-ng.org\u002F",", separated by role and priority:",[1192,1193,1194,1200,1206],"ol",{},[616,1195,1196,1199],{},[927,1197,1198],{},"[Storage]"," - On the most stable platform if possible. Data, backups, memories (photos). This role previously belonged to a Synology DS916+, which has since been retired, with its storage migrated to TrueNAS SCALE.",[616,1201,1202,1205],{},[927,1203,1204],{},"[Router\u002FFirewall]"," - As of 2026, usable 4G\u002F5G coverage means that even without the main WAN connection, I can still get online to find information or support.",[616,1207,1208,1211,1212,1214],{},[927,1209,1210],{},"[Services\u002FApps]"," - Most services and applications, including public-facing ones, live here. Anything requiring greater stability may instead be placed on ",[927,1213,1198],{},".",[600,1216,1217,1218,1220],{},"I had plans to move the public-facing services onto ",[927,1219,1198],{},", but this separation of the website from my homelab became useful sooner than expected.",[600,1222,1223,1224,1226],{},"A TrueNAS VM running on the ",[927,1225,1198],{}," hypervisor recently developed a suspected HBA or cable-path issue, requiring the hypervisor to be shut down for investigation. By then, the website had already been converted to SSG.",[600,1228,1229],{},"The consequences are minor for a personal blog, but the same separation matters much more in a production environment—for example, a company website or critical customer-facing service.",[600,1231,1232],{},[724,1233],{"src":1234,"alt":1235},"https:\u002F\u002Fapi.jasonloong.com\u002Fassets\u002F98a21748-656f-4a63-aa76-9aced1fee24d","TrueNAS storage hypervisor shut down for HBA troubleshooting",[600,1237,1238],{},"Directus, the admin portal or the publishing workflow may become temporarily unavailable depending on the affected infrastructure, but the last deployed website remains online through Cloudflare Pages and R2.",[1240,1241,1242],"blockquote",{},"Nothing is perfect... or free.",[600,1244,1245,1246,1248],{},"Fortunately, the forums and analytics were unaffected during this downtime, as I only needed to shut down the ",[927,1247,1198],{}," hypervisor. Even if I eventually move these public-facing “critical” services onto it, the consequences of an outage remain acceptable: users temporarily lose access to the forums, and I miss some website analytics.",[600,1250,1251],{},"I can repair or upgrade the server without wondering how long the public website has been offline. That, more than a Lighthouse score, is the improvement I wanted.",[600,1253,1254],{},"Moving this website onto new infrastructure was only half the work. The next \"feature\" was building a publishing pipeline I could trust with the content and photographs accumulated over the years.",{"title":561,"searchDepth":64,"depth":64,"links":1256},[1257,1258,1259,1260,1261,1262,1265,1266,1269],{"id":564,"depth":64,"text":565},{"id":567,"depth":64,"text":568},{"id":570,"depth":64,"text":571},{"id":573,"depth":64,"text":574},{"id":576,"depth":64,"text":577},{"id":579,"depth":64,"text":580,"children":1263},[1264],{"id":583,"depth":58,"text":584},{"id":586,"depth":64,"text":587},{"id":589,"depth":64,"text":590,"children":1267},[1268],{"id":593,"depth":58,"text":594},{"id":596,"depth":64,"text":597},{"id":1271,"status":271,"title":1272,"slug":1273,"excerpt":1274,"coverImage":1275,"categories":1276,"tags":1277,"relatedPhotos":1278,"discourseTopicId":8,"discourseEnabled":356,"dateCreated":1279,"dateUpdated":1280,"cover":1281,"posts":1345},"a7d7e5ff-cc56-4a00-abe9-819be53c619a","Photowalk: Pulau Ubin","photowalk-pulau-ubin","Photowalk at Pulau Ubin with John","5bcce717-5ed7-4038-863c-4b0d86241f08",[16],[148,163,169],[],"2026-05-02T15:00:00.000Z","2026-06-20T17:31:00.000Z",{"id":1275,"title":1282,"description":1283,"width":296,"height":297,"filename_download":1282,"type":298,"metadata":1284,"imageSet":1295},"L1004897.jpg","Blue and white boat with red trim and black tires along its hull, navigating calm water under a cloudy sky.",{"ifd0":1285,"exif":1289},{"Make":1286,"Model":1287,"Artist":1288,"Copyright":1288},"Leica Camera AG","LEICA M10","Jason Loong",{"FNumber":11,"ExposureTime":1290,"FocalLength":1291,"ISOSpeedRatings":1292,"LensModel":1293,"DateTimeOriginal":1294},0.0013333333333333333,50,200,"Summilux-M 1:1.4\u002F50 ASPH.","2026-05-02T11:31:46.000Z",{"sourceFingerprint":1296,"transformVersion":122,"seoSlug":1273,"hash":1297,"original":1298,"variants":1301,"avifVariants":1323,"animated":356,"origin":357},"5bcce717-5ed7-4038-863c-4b0d86241f08:2026-09-18T19:28:40.418Z:485703:5bcce717-5ed7-4038-863c-4b0d86241f08.jpg","d72c565ab41a472d",{"key":1299,"width":296,"height":297,"contentType":298,"bytes":1300},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Foriginal.jpg",485703,[1302,1305,1308,1311,1314,1317,1320],{"key":1303,"width":303,"height":304,"contentType":305,"bytes":1304},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-320-e3049d2d4388.webp",9962,{"key":1306,"width":309,"height":310,"contentType":305,"bytes":1307},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-640-e09af66c850d.webp",27830,{"key":1309,"width":314,"height":315,"contentType":305,"bytes":1310},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-768-01337f50206e.webp",36966,{"key":1312,"width":319,"height":309,"contentType":305,"bytes":1313},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-960-c82fea8cabe6.webp",52872,{"key":1315,"width":323,"height":324,"contentType":305,"bytes":1316},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-1200-3f2408e1d112.webp",73362,{"key":1318,"width":328,"height":319,"contentType":305,"bytes":1319},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-1440-2356f6e59a21.webp",95270,{"key":1321,"width":296,"height":297,"contentType":305,"bytes":1322},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-2048-afc9fbc0b056.webp",155896,[1324,1327,1330,1333,1336,1339,1342],{"key":1325,"width":303,"height":304,"contentType":336,"bytes":1326},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-320-e9caed593f93.avif",9324,{"key":1328,"width":309,"height":310,"contentType":336,"bytes":1329},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-640-12c1b68e483f.avif",26316,{"key":1331,"width":314,"height":315,"contentType":336,"bytes":1332},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-768-88087fc53349.avif",34401,{"key":1334,"width":319,"height":309,"contentType":336,"bytes":1335},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-960-51e68a93486f.avif",48097,{"key":1337,"width":323,"height":324,"contentType":336,"bytes":1338},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-1200-6609b7581ed0.avif",66662,{"key":1340,"width":328,"height":319,"contentType":336,"bytes":1341},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-1440-acd35ab71c52.avif",88226,{"key":1343,"width":296,"height":297,"contentType":336,"bytes":1344},"assets\u002F5bcce717-5ed7-4038-863c-4b0d86241f08\u002Fd72c565ab41a472d\u002Fphotowalk-pulau-ubin-2048-448c8dd37996.avif",151972,[1346],{"id":1347,"number":46,"subtitle":8,"path":1348},"8427421b-a619-47ea-9524-a841f6f22b39","content\u002Fposts\u002Fphotowalk-pulau-ubin\u002F01.md",[1350,1351,1352,1353,1354,1355,1356,1357,656,1358,1359,1360,1361,1362,715,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471],"\u002Fblog\u002Fv3-part-1-ssr-to-ssg","\u002Fblog\u002Fv3-part-1-ssr-to-ssg\u002F1","\u002Fblog\u002Fphotowalk-pulau-ubin","\u002Fblog\u002Fphotowalk-pulau-ubin\u002F1","\u002Fblog\u002Fphotowalk-maxwell","\u002Fblog\u002Fphotowalk-maxwell\u002F1","\u002Fblog\u002Fphotowalk-changi-village","\u002Fblog\u002Fphotowalk-changi-village\u002F1","\u002Fblog\u002Fjasonloong-com-v2\u002F1","\u002Fblog\u002Fosaka-2025","\u002Fblog\u002Fosaka-2025\u002F1","\u002Fblog\u002Fphotowalk-little-india","\u002Fblog\u002Fphotowalk-little-india\u002F1","\u002Fblog\u002Fleica-m10-experience\u002F1","\u002Fblog\u002Ffrom-canon-to-leica","\u002Fblog\u002Ffrom-canon-to-leica\u002F1","\u002Fblog\u002Fjasonloong-com-v1-1","\u002Fblog\u002Fjasonloong-com-v1-1\u002F1","\u002Fblog\u002Fhokkaido-2023","\u002Fblog\u002Fhokkaido-2023\u002F1","\u002Fblog\u002Fphotowalk-bugis-haji-lane-chinatown","\u002Fblog\u002Fphotowalk-bugis-haji-lane-chinatown\u002F1","\u002Fblog\u002Fnew-website-2023","\u002Fblog\u002Fnew-website-2023\u002F1","\u002Fblog\u002Ffrom-2020-and-into-2023","\u002Fblog\u002Ffrom-2020-and-into-2023\u002F1","\u002Fblog\u002Fsite-broken-and-progressive-fix","\u002Fblog\u002Fsite-broken-and-progressive-fix\u002F1","\u002Fblog\u002Fprotectli-vault-fw6c-i5-7200u-quick-review","\u002Fblog\u002Fprotectli-vault-fw6c-i5-7200u-quick-review\u002F1","\u002Fblog\u002Fmigrated-a-plex-intel-nuc-to-xcp-ng-xenserver-with-igpu-passthrough","\u002Fblog\u002Fmigrated-a-plex-intel-nuc-to-xcp-ng-xenserver-with-igpu-passthrough\u002F1","\u002Fblog\u002Fdomain-and-changes","\u002Fblog\u002Fdomain-and-changes\u002F1","\u002Fblog\u002Fdiscourse-memory-on-digitalocean-droplet-swap","\u002Fblog\u002Fdiscourse-memory-on-digitalocean-droplet-swap\u002F1","\u002Fblog\u002Fsending-linux-variables-to-discord-webhook-from-linux-bash-shell-script","\u002Fblog\u002Fsending-linux-variables-to-discord-webhook-from-linux-bash-shell-script\u002F1","\u002Fblog\u002Fpfsense-ntopng-export-flows-to-elk-stack-for-monitoring","\u002Fblog\u002Fpfsense-ntopng-export-flows-to-elk-stack-for-monitoring\u002F1","\u002Fblog\u002Fhome1-switched-over-to-ubnt-ubiquiti-unifi-wireless-aps","\u002Fblog\u002Fhome1-switched-over-to-ubnt-ubiquiti-unifi-wireless-aps\u002F1","\u002Fblog\u002Fhome1-switched-over-to-ubnt-ubiquiti-unifi-wireless-aps\u002F2","\u002Fblog\u002Fkishiwada-castle","\u002Fblog\u002Fkishiwada-castle\u002F1","\u002Fblog\u002Fsynology-snmp-network-monitoring-with-librenms-docker","\u002Fblog\u002Fsynology-snmp-network-monitoring-with-librenms-docker\u002F1","\u002Fblog\u002Fsynology-snmp-network-monitoring-with-librenms-docker\u002F2","\u002Fblog\u002Fsynology-snmp-network-monitoring-with-librenms-docker\u002F3","\u002Fblog\u002Fsynology-snmp-network-monitoring-with-librenms-docker\u002F4","\u002Fblog\u002Fsynology-airvideohd-docker-graphical-install-without-ssh","\u002Fblog\u002Fsynology-airvideohd-docker-graphical-install-without-ssh\u002F1","\u002Fblog\u002Fnew-theme-eram","\u002Fblog\u002Fnew-theme-eram\u002F1","\u002Fblog\u002Falmost-there","\u002Fblog\u002Falmost-there\u002F1","\u002Fblog\u002Fagain-again-again-change-of-cms","\u002Fblog\u002Fagain-again-again-change-of-cms\u002F1","\u002Fblog\u002Fshibuya-swing-jazz-coffee-mood-music","\u002Fblog\u002Fshibuya-swing-jazz-coffee-mood-music\u002F1","\u002Fblog\u002Fleica-q","\u002Fblog\u002Fleica-q\u002F1","\u002Fblog\u002Fsince-january-2015","\u002Fblog\u002Fsince-january-2015\u002F1","\u002Fblog\u002Flens-addition-sigma-50-art","\u002Fblog\u002Flens-addition-sigma-50-art\u002F1","\u002Fblog\u002Ffiery-drum-practice","\u002Fblog\u002Ffiery-drum-practice\u002F1","\u002Fblog\u002Fmalaysiasabah-switching-over-to-4g-lte-broadband","\u002Fblog\u002Fmalaysiasabah-switching-over-to-4g-lte-broadband\u002F1","\u002Fblog\u002Fcloudflare-flexible-cdn","\u002Fblog\u002Fcloudflare-flexible-cdn\u002F1","\u002Fblog\u002Fquiet-quiet","\u002Fblog\u002Fquiet-quiet\u002F1","\u002Fblog\u002Ftraditional-grip-on-mesh-practice-pad","\u002Fblog\u002Ftraditional-grip-on-mesh-practice-pad\u002F1","\u002Fblog\u002F500px","\u002Fblog\u002F500px\u002F1","\u002Fblog\u002Funder-construction","\u002Fblog\u002Funder-construction\u002F1","\u002Fblog\u002Fcloudflare-to-koken","\u002Fblog\u002Fcloudflare-to-koken\u002F1","\u002Fblog\u002Fa-whole-new-world-and-travel-to-wakayama","\u002Fblog\u002Fa-whole-new-world-and-travel-to-wakayama\u002F1","\u002Fblog\u002Ftaka-model-practice-shoot","\u002Fblog\u002Ftaka-model-practice-shoot\u002F1","\u002Fblog\u002Fbatch-encoding-videos-handbrake-cli-growlnotify-mac-os-x","\u002Fblog\u002Fbatch-encoding-videos-handbrake-cli-growlnotify-mac-os-x\u002F1","\u002Fblog\u002F50mm-one-lens-day-kinkakuji-kyoto","\u002Fblog\u002F50mm-one-lens-day-kinkakuji-kyoto\u002F1","\u002Fblog\u002Fa-composite","\u002Fblog\u002Fa-composite\u002F1","\u002Fblog\u002Faccessory-detail-macro-shoot","\u002Fblog\u002Faccessory-detail-macro-shoot\u002F1","\u002Fblog\u002Fsmoke-rings-photographing-smoke","\u002Fblog\u002Fsmoke-rings-photographing-smoke\u002F1","\u002Fblog\u002Fise-jingu-shrine-and-futami-kogama-shrine","\u002Fblog\u002Fise-jingu-shrine-and-futami-kogama-shrine\u002F1","\u002Fblog\u002Fef-24-70-f2-8l-ii-inventory-update","\u002Fblog\u002Fef-24-70-f2-8l-ii-inventory-update\u002F1","\u002Fblog\u002Fkyoto-trip-kiyomizu","\u002Fblog\u002Fkyoto-trip-kiyomizu\u002F1","\u002Fblog\u002Fx100s-with-speedlite-600ex-rt","\u002Fblog\u002Fx100s-with-speedlite-600ex-rt\u002F1","\u002Fblog\u002Fnew-equipment-6d-and-extender-2x","\u002Fblog\u002Fnew-equipment-6d-and-extender-2x\u002F1","\u002Fblog\u002Ffujifilm-x100s-equipment-update","\u002Fblog\u002Ffujifilm-x100s-equipment-update\u002F1","\u002Fblog\u002Fslow-website-sections-updated","\u002Fblog\u002Fslow-website-sections-updated\u002F1","\u002Fblog\u002Fnara","\u002Fblog\u002Fnara\u002F1","\u002Fblog\u002Fshooting-instruments","\u002Fblog\u002Fshooting-instruments\u002F1","\u002Fblog\u002Ftowards-2013","\u002Fblog\u002Ftowards-2013\u002F1","\u002Fblog\u002Fcanon-eos-5d-mark-ii-first-shot","\u002Fblog\u002Fcanon-eos-5d-mark-ii-first-shot\u002F1","\u002Fblog\u002Ffrom-scratch","\u002Fblog\u002Ffrom-scratch\u002F1","\u002Fblog\u002Fwelcome-to-qwephotos-com","\u002Fblog\u002Fwelcome-to-qwephotos-com\u002F1",{"categories":1473,"tags":1479,"photoTags":1512,"galleries":1533,"blogCount":286,"photoCount":287,"footerPhoto":1536},[1474,1475,1476,1477,1478],{"id":6,"date_created":7,"date_updated":8,"name":9,"slug":10,"description":8,"count":11},{"id":13,"date_created":14,"date_updated":8,"name":15,"slug":16,"description":17,"count":18},{"id":20,"date_created":21,"date_updated":8,"name":22,"slug":23,"description":24,"count":25},{"id":27,"date_created":28,"date_updated":8,"name":29,"slug":30,"description":31,"count":32},{"id":34,"date_created":35,"date_updated":8,"name":36,"slug":37,"description":38,"count":39},[1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511],{"id":42,"date_created":43,"date_updated":8,"name":44,"slug":45,"count":46},{"id":48,"date_created":49,"date_updated":8,"name":50,"slug":51,"count":52},{"id":54,"date_created":55,"date_updated":8,"name":56,"slug":57,"count":58},{"id":60,"date_created":61,"date_updated":8,"name":62,"slug":63,"count":64},{"id":66,"date_created":67,"date_updated":8,"name":68,"slug":69,"count":64},{"id":71,"date_created":72,"date_updated":8,"name":73,"slug":74,"count":46},{"id":76,"date_created":77,"date_updated":8,"name":78,"slug":79,"count":46},{"id":81,"date_created":82,"date_updated":8,"name":83,"slug":84,"count":64},{"id":86,"date_created":87,"date_updated":8,"name":88,"slug":89,"count":46},{"id":91,"date_created":92,"date_updated":93,"name":94,"slug":95,"count":96},{"id":98,"date_created":99,"date_updated":8,"name":100,"slug":101,"count":58},{"id":103,"date_created":104,"date_updated":8,"name":105,"slug":106,"count":64},{"id":108,"date_created":109,"date_updated":8,"name":110,"slug":111,"count":58},{"id":113,"date_created":114,"date_updated":8,"name":115,"slug":116,"count":46},{"id":118,"date_created":119,"date_updated":8,"name":120,"slug":121,"count":122},{"id":124,"date_created":125,"date_updated":8,"name":126,"slug":127,"count":122},{"id":129,"date_created":130,"date_updated":8,"name":131,"slug":132,"count":122},{"id":134,"date_created":135,"date_updated":8,"name":136,"slug":137,"count":138},{"id":140,"date_created":141,"date_updated":8,"name":142,"slug":143,"count":58},{"id":145,"date_created":146,"date_updated":8,"name":147,"slug":148,"count":138},{"id":150,"date_created":151,"date_updated":8,"name":152,"slug":153,"count":64},{"id":155,"date_created":156,"date_updated":8,"name":157,"slug":158,"count":138},{"id":160,"date_created":161,"date_updated":8,"name":162,"slug":163,"count":164},{"id":166,"date_created":167,"date_updated":8,"name":168,"slug":169,"count":138},{"id":171,"date_created":172,"date_updated":8,"name":173,"slug":174,"count":58},{"id":176,"date_created":177,"date_updated":8,"name":178,"slug":179,"count":46},{"id":181,"date_created":182,"date_updated":8,"name":183,"slug":184,"count":46},{"id":186,"date_created":187,"date_updated":8,"name":188,"slug":189,"count":190},{"id":192,"date_created":193,"date_updated":8,"name":194,"slug":195,"count":46},{"id":197,"date_created":198,"date_updated":199,"name":200,"slug":201,"count":46},{"id":203,"date_created":204,"date_updated":205,"name":206,"slug":207,"count":39},{"id":209,"date_created":210,"date_updated":8,"name":211,"slug":212,"count":58},[1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532],{"id":215,"date_created":216,"date_updated":8,"name":217,"slug":218,"count":46},{"id":48,"date_created":49,"date_updated":8,"name":50,"slug":51,"count":46},{"id":76,"date_created":77,"date_updated":8,"name":78,"slug":79,"count":64},{"id":222,"date_created":223,"date_updated":8,"name":224,"slug":225,"count":46},{"id":227,"date_created":228,"date_updated":8,"name":229,"slug":230,"count":39},{"id":91,"date_created":92,"date_updated":93,"name":94,"slug":95,"count":232},{"id":98,"date_created":99,"date_updated":8,"name":100,"slug":101,"count":234},{"id":118,"date_created":119,"date_updated":8,"name":120,"slug":121,"count":138},{"id":124,"date_created":125,"date_updated":8,"name":126,"slug":127,"count":237},{"id":239,"date_created":240,"date_updated":8,"name":241,"slug":242,"count":243},{"id":134,"date_created":135,"date_updated":8,"name":136,"slug":137,"count":32},{"id":155,"date_created":156,"date_updated":8,"name":157,"slug":158,"count":246},{"id":160,"date_created":161,"date_updated":8,"name":162,"slug":163,"count":58},{"id":166,"date_created":167,"date_updated":8,"name":168,"slug":169,"count":190},{"id":250,"date_created":251,"date_updated":8,"name":252,"slug":253,"count":122},{"id":176,"date_created":177,"date_updated":8,"name":178,"slug":179,"count":234},{"id":256,"date_created":257,"date_updated":8,"name":258,"slug":259,"count":46},{"id":181,"date_created":182,"date_updated":8,"name":183,"slug":184,"count":64},{"id":186,"date_created":187,"date_updated":8,"name":188,"slug":189,"count":262},{"id":264,"date_created":265,"date_updated":8,"name":266,"slug":267,"count":64},[1534,1535],{"id":270,"status":271,"date_created":272,"date_updated":273,"name":274,"description":275,"slug":276,"count":277},{"id":279,"status":271,"date_created":280,"date_updated":281,"name":282,"description":283,"slug":284,"count":285},{"title":289,"slug":290,"imageSet":1537,"imageDescription":358},{"sourceFingerprint":292,"transformVersion":122,"seoSlug":290,"hash":293,"original":1538,"variants":1539,"avifVariants":1547,"animated":356,"origin":357},{"key":295,"width":296,"height":297,"contentType":298,"bytes":299},[1540,1541,1542,1543,1544,1545,1546],{"key":302,"width":303,"height":304,"contentType":305,"bytes":306},{"key":308,"width":309,"height":310,"contentType":305,"bytes":311},{"key":313,"width":314,"height":315,"contentType":305,"bytes":316},{"key":318,"width":319,"height":309,"contentType":305,"bytes":320},{"key":322,"width":323,"height":324,"contentType":305,"bytes":325},{"key":327,"width":328,"height":319,"contentType":305,"bytes":329},{"key":331,"width":296,"height":297,"contentType":305,"bytes":332},[1548,1549,1550,1551,1552,1553,1554],{"key":335,"width":303,"height":304,"contentType":336,"bytes":337},{"key":339,"width":309,"height":310,"contentType":336,"bytes":340},{"key":342,"width":314,"height":315,"contentType":336,"bytes":343},{"key":345,"width":319,"height":309,"contentType":336,"bytes":346},{"key":348,"width":323,"height":324,"contentType":336,"bytes":349},{"key":351,"width":328,"height":319,"contentType":336,"bytes":352},{"key":354,"width":296,"height":297,"contentType":336,"bytes":355},{"id":1556,"title":727,"aiCaption":356,"description":561,"width":1557,"height":1558,"filename_download":1559,"type":1560,"metadata":1561,"imageSet":1562,"curatedPhoto":8},"cb472df6-e507-4805-a2e7-4a63aac0f3e1",1396,662,"Screenshot 2026-09-20 at 2.24.47 PM.png","image\u002Fpng",{},{"sourceFingerprint":1563,"transformVersion":122,"seoSlug":1564,"hash":1565,"original":1566,"variants":1569,"avifVariants":1593,"animated":356,"origin":357},"cb472df6-e507-4805-a2e7-4a63aac0f3e1:2026-09-20T06:27:28.126Z:197156:cb472df6-e507-4805-a2e7-4a63aac0f3e1.png","directus-versioning-missing-camera-lenses-table","40fe5f4453edd414",{"key":1567,"width":1557,"height":1558,"contentType":1560,"bytes":1568},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Foriginal.png",197156,[1570,1574,1578,1582,1586,1590],{"key":1571,"width":303,"height":1572,"contentType":305,"bytes":1573},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-320-a7807b63899b.webp",152,6282,{"key":1575,"width":309,"height":1576,"contentType":305,"bytes":1577},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-640-827444d00ab0.webp",303,21460,{"key":1579,"width":314,"height":1580,"contentType":305,"bytes":1581},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-768-2696ffe6d070.webp",364,29700,{"key":1583,"width":319,"height":1584,"contentType":305,"bytes":1585},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-960-47c886174c41.webp",455,42044,{"key":1587,"width":323,"height":1588,"contentType":305,"bytes":1589},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-1200-b86300712721.webp",569,57958,{"key":1591,"width":1557,"height":1558,"contentType":305,"bytes":1592},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-1396-a7f27b60e740.webp",68898,[1594,1597,1600,1603,1606,1609],{"key":1595,"width":303,"height":1572,"contentType":336,"bytes":1596},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-320-492212886b9d.avif",5823,{"key":1598,"width":309,"height":1576,"contentType":336,"bytes":1599},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-640-0081c1f5eccf.avif",19878,{"key":1601,"width":314,"height":1580,"contentType":336,"bytes":1602},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-768-41dcb1df2399.avif",26900,{"key":1604,"width":319,"height":1584,"contentType":336,"bytes":1605},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-960-21a275402abd.avif",37967,{"key":1607,"width":323,"height":1588,"contentType":336,"bytes":1608},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-1200-295aed8f0187.avif",50936,{"key":1610,"width":1557,"height":1558,"contentType":336,"bytes":1611},"assets\u002Fcb472df6-e507-4805-a2e7-4a63aac0f3e1\u002F40fe5f4453edd414\u002Fdirectus-versioning-missing-camera-lenses-table-1396-70744d6242af.avif",52552,{"id":1613,"title":1614,"aiCaption":356,"description":8,"width":8,"height":8,"filename_download":1615,"type":1616,"metadata":8,"imageSet":1617,"curatedPhoto":8},"076a7205-b89e-4c4f-a1cd-31e13c373b67","Before Ssr Topology","before-ssr-topology.svg","image\u002Fsvg+xml",{"sourceFingerprint":1618,"transformVersion":11,"seoSlug":1619,"hash":1620,"original":1621,"variants":1626,"avifVariants":1627,"animated":356,"vector":630,"origin":357},"076a7205-b89e-4c4f-a1cd-31e13c373b67:2026-09-25T12:33:00.189Z:10212:076a7205-b89e-4c4f-a1cd-31e13c373b67.svg","before-ssr-topology","a37e1f6906b0c1b9",{"key":1622,"width":1623,"height":1624,"contentType":1616,"bytes":1625},"assets\u002F076a7205-b89e-4c4f-a1cd-31e13c373b67\u002Fa37e1f6906b0c1b9\u002Foriginal.svg",930,360,10251,[],[],{"id":1629,"title":1630,"aiCaption":356,"description":8,"width":8,"height":8,"filename_download":1631,"type":1616,"metadata":8,"imageSet":1632,"curatedPhoto":8},"34027451-7669-467c-8408-7bae13b679b8","New Ssg Infrastructure","new-ssg-infrastructure.svg",{"sourceFingerprint":1633,"transformVersion":11,"seoSlug":1634,"hash":1635,"original":1636,"variants":1641,"avifVariants":1642,"animated":356,"vector":630,"origin":357},"34027451-7669-467c-8408-7bae13b679b8:2026-09-28T09:13:09.878Z:9695:34027451-7669-467c-8408-7bae13b679b8.svg","new-ssg-infrastructure","b431b60280f39ee3",{"key":1637,"width":1638,"height":1639,"contentType":1616,"bytes":1640},"assets\u002F34027451-7669-467c-8408-7bae13b679b8\u002Fb431b60280f39ee3\u002Foriginal.svg",460,490,9734,[],[],{"id":1644,"title":1645,"aiCaption":356,"description":1646,"width":450,"height":296,"filename_download":1647,"type":298,"metadata":1648,"imageSet":1653,"curatedPhoto":8},"98a21748-656f-4a63-aa76-9aced1fee24d","Opening up the server to check for HBA issues","Black computer server rack case with back exposed with honeycomb vent, tilted on a red handle, against wooden cabinet.","2026-09-19 11.55.10.jpg",{"ifd0":1649,"exif":1650},{"Make":454,"Model":455},{"FNumber":457,"ExposureTime":1651,"FocalLength":459,"ISOSpeedRatings":1292,"LensModel":461,"DateTimeOriginal":1652},0.016666666666666666,"2026-09-19T11:55:09.000Z",{"sourceFingerprint":1654,"transformVersion":122,"seoSlug":1655,"hash":1656,"original":1657,"variants":1660,"avifVariants":1682,"animated":356,"origin":357},"98a21748-656f-4a63-aa76-9aced1fee24d:2026-09-28T09:33:05.364Z:422582:98a21748-656f-4a63-aa76-9aced1fee24d.jpg","opening-up-the-server-to-check-for-hba-issues","91d00e0b946bd8bc",{"key":1658,"width":450,"height":296,"contentType":298,"bytes":1659},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Foriginal.jpg",422582,[1661,1664,1667,1670,1673,1676,1679],{"key":1662,"width":472,"height":303,"contentType":305,"bytes":1663},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-320-c7405cd5be0d.webp",8810,{"key":1665,"width":476,"height":309,"contentType":305,"bytes":1666},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-640-65ffa09c5317.webp",24778,{"key":1668,"width":480,"height":314,"contentType":305,"bytes":1669},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-768-30d9455c2198.webp",33372,{"key":1671,"width":484,"height":319,"contentType":305,"bytes":1672},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-960-b5082250c44a.webp",45914,{"key":1674,"width":488,"height":323,"contentType":305,"bytes":1675},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-1200-b91f69cd4f5e.webp",62190,{"key":1677,"width":492,"height":328,"contentType":305,"bytes":1678},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-1440-3539b026d16c.webp",77976,{"key":1680,"width":450,"height":296,"contentType":305,"bytes":1681},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-2048-c4654b0f8180.webp",122220,[1683,1686,1689,1692,1695,1698,1701],{"key":1684,"width":472,"height":303,"contentType":336,"bytes":1685},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-320-7c4b2555e9d5.avif",7587,{"key":1687,"width":476,"height":309,"contentType":336,"bytes":1688},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-640-6fa02fa088e0.avif",22439,{"key":1690,"width":480,"height":314,"contentType":336,"bytes":1691},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-768-17921d9f8550.avif",30305,{"key":1693,"width":484,"height":319,"contentType":336,"bytes":1694},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-960-709c6bb1af99.avif",42607,{"key":1696,"width":488,"height":323,"contentType":336,"bytes":1697},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-1200-393a193e02f4.avif",58133,{"key":1699,"width":492,"height":328,"contentType":336,"bytes":1700},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-1440-1af165cfc693.avif",74401,{"key":1702,"width":450,"height":296,"contentType":336,"bytes":1703},"assets\u002F98a21748-656f-4a63-aa76-9aced1fee24d\u002F91d00e0b946bd8bc\u002Fopening-up-the-server-to-check-for-hba-issues-2048-19b6c4466785.avif",125471,1790593019062]