[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site:languages:id":3,"site:settings:id":22,"site:navigation:id":43,"blog:categories:id":169,"blog:list:id":215},[4,13],{"id":5,"code":6,"name":7,"nativeName":7,"direction":8,"flagEmoji":9,"isDefault":10,"isActive":10,"sortOrder":11,"createdAt":12,"updatedAt":12},"cms5x82ws0000p90jaubd6xdp","en","English","LTR","🇬🇧",true,0,"2026-07-29T10:07:30.747Z",{"id":14,"code":15,"name":16,"nativeName":17,"direction":8,"flagEmoji":18,"isDefault":19,"isActive":10,"sortOrder":20,"createdAt":21,"updatedAt":21},"cms5x82x90001p90je35iy8zx","id","Indonesian","Bahasa Indonesia","🇮🇩",false,1,"2026-07-29T10:07:30.766Z",{"site.name":23,"site.shortName":24,"site.logo_dark":25,"site.logo_light":26,"site.url":27,"site.defaultLocale":6,"contact.email":28,"contact.sales_email":29,"contact.phone":30,"contact.whatsapp":31,"contact.address":32,"contact.map_embed_url":33,"contact.office_hours":34,"company.legal_name":23,"company.founded":35,"seo.default_title":36,"seo.default_description":37,"seo.twitter_handle":38,"seo.default_og_image":39,"social.links":40,"features.newsletter_enabled":41,"features.blog_enabled":41,"features.careers_enabled":41,"integrations.google_analytics_id":42,"integrations.recaptcha_site_key":42},"PT Moodkuit Solutions Technologies","Moodkuit","\u002Fimages\u002Flogo\u002Fblack-logo.png","\u002Fimages\u002Flogo\u002Fwhite-logo.png","https:\u002F\u002Fmoodkuit.com","hello@moodkuit.com","sales@moodkuit.com","+62 21 5010 8899","+62 812 1000 8899","Menara Kuningan, 12th Floor, Jl. H. R. Rasuna Said, Jakarta Selatan 12940, Indonesia","https:\u002F\u002Fmaps.google.com\u002F?q=-6.2238,106.8317","Mon–Fri, 09:00–18:00 WIB","2018","Moodkuit — Enterprise Software House","Moodkuit designs, builds and operates enterprise software platforms — custom systems, web, mobile, cloud and data.","@moodkuit","\u002Fimages\u002Fhero\u002Fhero-slider.jpg","[{\"platform\":\"linkedin\",\"url\":\"https:\u002F\u002Flinkedin.com\u002Fcompany\u002Fmoodkuit\"},{\"platform\":\"github\",\"url\":\"https:\u002F\u002Fgithub.com\u002Fmoodkuit\"},{\"platform\":\"x\",\"url\":\"https:\u002F\u002Fx.com\u002Fmoodkuit\"},{\"platform\":\"instagram\",\"url\":\"https:\u002F\u002Finstagram.com\u002Fmoodkuit\"}]","true","",{"HEADER":44,"FOOTER_PRIMARY":93,"FOOTER_SECONDARY":106,"LEGAL":127,"SOCIAL":143},[45,52,57,63,69,75,81,87],{"id":46,"href":47,"target":48,"icon":49,"sortOrder":11,"label":50,"caption":49,"children":51},"cms5x85l800nvp90jgvd1p33h","\u002F","_self",null,"Beranda",[],{"id":53,"href":54,"target":48,"icon":49,"sortOrder":20,"label":55,"caption":49,"children":56},"cms5x85lq00o1p90j6pq2ixue","\u002Fabout","Tentang",[],{"id":58,"href":59,"target":48,"icon":49,"sortOrder":60,"label":61,"caption":49,"children":62},"cms5x85m700o7p90jfrpuma9c","\u002Fservices",2,"Layanan",[],{"id":64,"href":65,"target":48,"icon":49,"sortOrder":66,"label":67,"caption":49,"children":68},"cms5x85ml00odp90jhbidzcte","\u002Fportfolio",3,"Portofolio",[],{"id":70,"href":71,"target":48,"icon":49,"sortOrder":72,"label":73,"caption":49,"children":74},"cms5x85mw00ojp90jm01w80sb","\u002Fcase-studies",4,"Studi Kasus",[],{"id":76,"href":77,"target":48,"icon":49,"sortOrder":78,"label":79,"caption":49,"children":80},"cms5x85n700opp90j8c67qr9t","\u002Fblog",5,"Blog",[],{"id":82,"href":83,"target":48,"icon":49,"sortOrder":84,"label":85,"caption":49,"children":86},"cms5x85nk00ovp90jzoeadygb","\u002Fcareers",6,"Karier",[],{"id":88,"href":89,"target":48,"icon":49,"sortOrder":90,"label":91,"caption":49,"children":92},"cms5x85nu00p1p90jb67ikv77","\u002Fcontact",7,"Kontak",[],[94,97,100,103],{"id":95,"href":54,"target":48,"icon":49,"sortOrder":11,"label":55,"caption":49,"children":96},"cms5x85od00p8p90j616esl9i",[],{"id":98,"href":83,"target":48,"icon":49,"sortOrder":20,"label":85,"caption":49,"children":99},"cms5x85ot00pep90jrto5fvh7",[],{"id":101,"href":71,"target":48,"icon":49,"sortOrder":60,"label":73,"caption":49,"children":102},"cms5x85p400pkp90jd8usqva3",[],{"id":104,"href":89,"target":48,"icon":49,"sortOrder":66,"label":91,"caption":49,"children":105},"cms5x85pg00pqp90jvlmbrz8q",[],[107,112,117,122],{"id":108,"href":109,"target":48,"icon":49,"sortOrder":11,"label":110,"caption":49,"children":111},"cms5x85q100pxp90juyka7vco","\u002Fservices\u002Fcustom-software-development","Perangkat Lunak Khusus",[],{"id":113,"href":114,"target":48,"icon":49,"sortOrder":20,"label":115,"caption":49,"children":116},"cms5x85qj00q3p90jdh85gytx","\u002Fservices\u002Fweb-platform-engineering","Platform Web",[],{"id":118,"href":119,"target":48,"icon":49,"sortOrder":60,"label":120,"caption":49,"children":121},"cms5x85r400q9p90jdhsjcffv","\u002Fservices\u002Fmobile-application-development","Aplikasi Mobile",[],{"id":123,"href":124,"target":48,"icon":49,"sortOrder":66,"label":125,"caption":49,"children":126},"cms5x85rw00qfp90j1rs0xc9k","\u002Fservices\u002Fcloud-devops","Cloud & DevOps",[],[128,133,138],{"id":129,"href":130,"target":48,"icon":49,"sortOrder":11,"label":131,"caption":49,"children":132},"cms5x85sm00qmp90jki97thzi","\u002Fprivacy","Kebijakan Privasi",[],{"id":134,"href":135,"target":48,"icon":49,"sortOrder":20,"label":136,"caption":49,"children":137},"cms5x85sw00qsp90j96hsi9if","\u002Fterms","Syarat & Ketentuan",[],{"id":139,"href":140,"target":48,"icon":49,"sortOrder":60,"label":141,"caption":49,"children":142},"cms5x85ta00qyp90je9qxvdrq","\u002Ffaq","FAQ",[],[144,151,157,163],{"id":145,"href":146,"target":147,"icon":148,"sortOrder":11,"label":149,"caption":49,"children":150},"cms5x85to00r5p90jlpp2dj9y","https:\u002F\u002Flinkedin.com\u002Fcompany\u002Fmoodkuit","_blank","linkedin","LinkedIn",[],{"id":152,"href":153,"target":147,"icon":154,"sortOrder":20,"label":155,"caption":49,"children":156},"cms5x85u000rbp90jz220we6w","https:\u002F\u002Fgithub.com\u002Fmoodkuit","github","GitHub",[],{"id":158,"href":159,"target":147,"icon":160,"sortOrder":60,"label":161,"caption":49,"children":162},"cms5x85uc00rhp90j909vvybj","https:\u002F\u002Fx.com\u002Fmoodkuit","x","X",[],{"id":164,"href":165,"target":147,"icon":166,"sortOrder":66,"label":167,"caption":49,"children":168},"cms5x85un00rnp90j4c6x21gw","https:\u002F\u002Finstagram.com\u002Fmoodkuit","instagram","Instagram",[],[170,185,200],{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":173,"_count":184},"cms5x84dx00a0p90jq4hj1xcq","2026-07-29T10:07:32.661Z",[174,179],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},"cms5x84e300a2p90jrmk5oan0","Engineering","engineering","2026-07-29T10:07:32.667Z",{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},"cms5x84e900a4p90jp567w33d","Rekayasa","rekayasa","2026-07-29T10:07:32.674Z",{"posts":66},{"id":186,"parentId":49,"sortOrder":20,"createdAt":187,"updatedAt":187,"deletedAt":49,"translations":188,"_count":199},"cms5x84eh00a5p90jy18t0toq","2026-07-29T10:07:32.681Z",[189,194],{"id":190,"categoryId":186,"locale":6,"name":191,"slug":192,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":193,"updatedAt":193},"cms5x84ek00a7p90jtwmn33gk","Product","product","2026-07-29T10:07:32.685Z",{"id":195,"categoryId":186,"locale":15,"name":196,"slug":197,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":198,"updatedAt":198},"cms5x84er00a9p90jkb1sr9kr","Produk","produk","2026-07-29T10:07:32.689Z",{"posts":20},{"id":201,"parentId":49,"sortOrder":60,"createdAt":202,"updatedAt":202,"deletedAt":49,"translations":203,"_count":214},"cms5x84ey00aap90jb6oji1s9","2026-07-29T10:07:32.698Z",[204,209],{"id":205,"categoryId":201,"locale":6,"name":206,"slug":207,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":208,"updatedAt":208},"cms5x84f100acp90j2y6m0s42","Company","company","2026-07-29T10:07:32.701Z",{"id":210,"categoryId":201,"locale":15,"name":211,"slug":212,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":213,"updatedAt":213},"cms5x84f600aep90jj3uqmqhi","Perusahaan","perusahaan","2026-07-29T10:07:32.706Z",{"posts":20},{"data":216,"meta":316},[217,257,287],{"id":218,"authorId":219,"coverImageId":220,"status":221,"publishedAt":222,"readingMinutes":72,"viewCount":223,"isFeatured":19,"allowComments":19,"createdAt":224,"updatedAt":225,"deletedAt":49,"coverImage":226,"author":240,"categories":243,"translation":249},"cms5x84kj00bnp90j5qo7aas1","cms5x83ok0035p90j1tmyvb7d","cms5x83yk005zp90jsek60xg4","PUBLISHED","2026-06-10T09:00:00.000Z",16,"2026-07-29T10:07:32.899Z","2026-07-29T13:22:52.647Z",{"id":220,"folderId":227,"uploadedById":228,"type":229,"filename":230,"originalName":230,"mimeType":231,"size":232,"width":233,"height":234,"storageKey":235,"url":236,"thumbnailUrl":236,"alt":237,"caption":49,"blurhash":49,"createdAt":238,"updatedAt":239,"deletedAt":49},"cms5x83pu003jp90j5lwg5qs2","cms5x83o00034p90jw5cmslod","IMAGE","post-4.jpg","image\u002Fjpeg",36028,850,402,"seed\u002Fpost\u002Fcore-web-vitals-budgets-that-survive-the-second-sprint\u002Fpost-4.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fcore-web-vitals-budgets-that-survive-the-second-sprint\u002Fpost-4.jpg","Performance budget failing a continuous integration run","2026-07-29T10:07:32.108Z","2026-07-29T10:31:55.623Z",{"id":219,"name":241,"avatarUrl":242},"Rani Prameswari","\u002Fimages\u002Fnews\u002Fauthor_img2.jpg",[244],{"postId":218,"categoryId":171,"category":245},{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":246},[247,248],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},{"id":250,"postId":218,"locale":15,"title":251,"slug":252,"excerpt":253,"content":254,"seoTitle":255,"seoDescription":253,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":256,"updatedAt":256},"cms5x84kr00brp90jge79ik4t","Anggaran Core Web Vitals yang bertahan sampai sprint kedua","anggaran-core-web-vitals-yang-bertahan-sampai-sprint-kedua","Skor Lighthouse saat rilis hanyalah potret. Anggaran di CI adalah jaminan.","\u003Cp>Regresi performa datang satu impor sepele setiap kali. Perbaikannya bersifat struktural: anggaran ditegakkan di CI, dan build gagal saat LCP atau ukuran bundel melewati batas.\u003C\u002Fp>","Anggaran Core Web Vitals yang bertahan sampai sprint kedua | Moodkuit","2026-07-29T10:07:32.907Z",{"id":258,"authorId":219,"coverImageId":259,"status":221,"publishedAt":260,"readingMinutes":78,"viewCount":261,"isFeatured":19,"allowComments":19,"createdAt":262,"updatedAt":263,"deletedAt":49,"coverImage":264,"author":272,"categories":273,"translation":279},"cms5x84j900bbp90jgvsq13h5","cms5x83y9005vp90j0shkjq4a","2026-05-25T09:00:00.000Z",11,"2026-07-29T10:07:32.853Z","2026-07-29T12:57:43.806Z",{"id":259,"folderId":227,"uploadedById":228,"type":229,"filename":265,"originalName":265,"mimeType":231,"size":266,"width":233,"height":234,"storageKey":267,"url":268,"thumbnailUrl":268,"alt":269,"caption":49,"blurhash":49,"createdAt":270,"updatedAt":271,"deletedAt":49},"post-2.jpg",30668,"seed\u002Fpost\u002Fshipping-a-multilingual-site-without-duplicating-your-codebase\u002Fpost-2.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fshipping-a-multilingual-site-without-duplicating-your-codebase\u002Fpost-2.jpg","Locale-prefixed routes mapped out on a whiteboard","2026-07-29T10:07:32.097Z","2026-07-29T10:31:55.658Z",{"id":219,"name":241,"avatarUrl":242},[274],{"postId":258,"categoryId":171,"category":275},{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":276},[277,278],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},{"id":280,"postId":258,"locale":15,"title":281,"slug":282,"excerpt":283,"content":284,"seoTitle":285,"seoDescription":283,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":286,"updatedAt":286},"cms5x84jh00bfp90jcufpo2op","Merilis situs multibahasa tanpa menggandakan basis kode","merilis-situs-multibahasa-tanpa-menggandakan-basis-kode","Routing berprefiks locale, hreflang, URL canonical, dan slug per locale — ditangani sekali di router.","\u003Cp>Sebagian besar situs multibahasa keliru di tempat yang sama: URL. Begitu slug berbeda per locale, routing naif memaksa halaman ganda atau URL berbahasa Inggris di mana-mana.\u003C\u002Fp>\u003Ch2>Kontrak routing\u003C\u002Fh2>\u003Cp>Locale default disajikan tanpa prefiks. Locale lain diberi prefiks. Slug diselesaikan per locale dari basis data, dan setiap halaman memancarkan set lengkap \u003Ccode>hreflang\u003C\u002Fcode> beserta \u003Ccode>x-default\u003C\u002Fcode>.\u003C\u002Fp>","Merilis situs multibahasa tanpa menggandakan basis kode | Moodkuit","2026-07-29T10:07:32.861Z",{"id":288,"authorId":219,"coverImageId":289,"status":221,"publishedAt":290,"readingMinutes":72,"viewCount":261,"isFeatured":10,"allowComments":19,"createdAt":291,"updatedAt":292,"deletedAt":49,"coverImage":293,"author":301,"categories":302,"translation":308},"cms5x84i100b5p90j5aybdulu","cms5x83y2005tp90jglrwh85p","2026-05-17T09:00:00.000Z","2026-07-29T10:07:32.810Z","2026-07-29T12:58:11.777Z",{"id":289,"folderId":227,"uploadedById":228,"type":229,"filename":294,"originalName":294,"mimeType":231,"size":295,"width":233,"height":234,"storageKey":296,"url":297,"thumbnailUrl":297,"alt":298,"caption":49,"blurhash":49,"createdAt":299,"updatedAt":300,"deletedAt":49},"post-1.jpg",52352,"seed\u002Fpost\u002Fwhy-we-model-translations-as-rows-not-json\u002Fpost-1.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fwhy-we-model-translations-as-rows-not-json\u002Fpost-1.jpg","Database schema sketch comparing JSON blobs with translation tables","2026-07-29T10:07:32.090Z","2026-07-29T10:31:55.693Z",{"id":219,"name":241,"avatarUrl":242},[303],{"postId":288,"categoryId":171,"category":304},{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":305},[306,307],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},{"id":309,"postId":288,"locale":15,"title":310,"slug":311,"excerpt":312,"content":313,"seoTitle":314,"seoDescription":312,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":315,"updatedAt":315},"cms5x84ik00b9p90jmkopb6ke","Mengapa kami memodelkan terjemahan sebagai baris, bukan JSON","mengapa-kami-memodelkan-terjemahan-sebagai-baris-bukan-json","Blob terjemahan JSON terasa praktis sampai Anda perlu menemukan setiap judul yang belum diterjemahkan. Tabel terjemahan relasional hanya menambah satu join dan menjawabnya dalam milidetik.","\u003Cp>Menyimpan terjemahan dalam kolom JSON tampak pragmatis. Satu kolom, tanpa join, tanpa migrasi saat menambah locale. Tagihannya datang belakangan.\u003C\u002Fp>\u003Ch2>Yang rusak\u003C\u002Fh2>\u003Cp>Pelaporan cakupan terjemahan menjadi pemindaian tabel penuh dengan ekspresi JSON path. Keunikan slug per locale tidak dapat ditegakkan basis data. Indeks parsial untuk konten terpublikasi per locale tidak tersedia.\u003C\u002Fp>\u003Ch2>Yang kami lakukan\u003C\u002Fh2>\u003Cp>Setiap entitas yang dapat diterjemahkan memiliki tabel pendamping dengan kunci \u003Ccode>(entity_id, locale)\u003C\u002Fcode> dan batasan unik kedua pada \u003Ccode>(locale, slug)\u003C\u002Fcode>. Menambah bahasa Jepang cukup satu insert ke tabel \u003Ccode>languages\u003C\u002Fcode>.\u003C\u002Fp>","Mengapa kami memodelkan terjemahan sebagai baris, bukan JSON | Moodkuit","2026-07-29T10:07:32.828Z",{"page":20,"limit":317,"total":66,"totalPages":20,"hasNextPage":19,"hasPreviousPage":19},9]