[{"data":1,"prerenderedAt":591},["ShallowReactive",2],{"blog-list":3},[4,48,184,276,453],{"id":5,"title":6,"author":7,"body":8,"category":37,"date":38,"description":39,"extension":40,"image":41,"meta":42,"navigation":43,"path":44,"seo":45,"stem":46,"__hash__":47},"blog\u002Fblog\u002Fjejak-yang-tertinggal.md","Jejak Yang Tertinggal","Ecy",{"type":9,"value":10,"toc":33},"minimark",[11,15,18,21,24,27,30],[12,13,14],"p",{},"Ada hal-hal yang tidak benar-benar pergi. Mereka hanya berubah bentuk—menjadi kenangan yang diam-diam hidup di sela waktu, atau menjadi rasa yang tiba-tiba muncul saat kita tidak siap.",[12,16,17],{},"Aku pernah mencintai seseorang dengan cara yang sederhana, tapi dalam. Tidak banyak kata, tidak banyak janji. Hanya kehadiran yang terasa cukup untuk menjelaskan semuanya. Namun, hidup tidak selalu memberi ruang bagi dua orang untuk tetap berjalan berdampingan.",[12,19,20],{},"Kehilangan datang tanpa banyak peringatan. Awalnya hanya jarak kecil, lalu percakapan yang mulai jarang, sampai akhirnya… diam menjadi satu-satunya bahasa yang tersisa. Tidak ada perpisahan yang benar-benar jelas, hanya perasaan yang perlahan pudar dan kita yang pura-pura kuat.",[12,22,23],{},"Yang paling sulit dari kehilangan bukanlah saat ia pergi, tapi saat kita menyadari bahwa kita masih menyimpan semua hal tentangnya. Cara dia tertawa, hal-hal kecil yang dulu terasa biasa, hingga momen sederhana yang kini terasa begitu mahal.",[12,25,26],{},"Aku belajar bahwa mencintai tidak selalu berarti memiliki. Kadang, mencintai adalah tentang merelakan—meski hati masih ingin bertahan. Dan kehilangan, pada akhirnya, bukan tentang melupakan, tapi tentang berdamai dengan apa yang tidak bisa kita ubah.",[12,28,29],{},"Mungkin suatu hari nanti, kita akan melihat kembali semua ini tanpa rasa sesak di dada. Tapi untuk sekarang, biarkan waktu bekerja. Biarkan hati pelan-pelan belajar bahwa tidak semua yang datang harus tinggal.",[12,31,32],{},"Dan mungkin, itu tidak apa-apa.",{"title":34,"searchDepth":35,"depth":35,"links":36},"",2,[],"Love","2026-04-29","Sebuah refleksi tentang cinta yang tidak berakhir dengan kebersamaan, tetapi meninggalkan jejak yang sulit dilupakan.","md","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1516980907201-943c13a8d03c?q=80&w=870&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3Dbu",{},true,"\u002Fblog\u002Fjejak-yang-tertinggal",{"title":6,"description":39},"blog\u002Fjejak-yang-tertinggal","NR0ouxK7Z4LS9JIfRgVsK9lZVrb_rmWsc1tXXmnTF04",{"id":49,"title":50,"author":51,"body":52,"category":176,"date":38,"description":177,"extension":40,"image":178,"meta":179,"navigation":43,"path":180,"seo":181,"stem":182,"__hash__":183},"blog\u002Fblog\u002Fmasa-depan-coding-ketika-developer-bukan-lagi-sekadar-penulis-kode.md","Masa Depan Coding: Ketika Developer Bukan Lagi Sekadar Penulis Kode","Nielno",{"type":9,"value":53,"toc":172},[54,59,62,67,75,88,91,95,98,101,104,115,118,122,125,133,136,140,143,154,161,166,169],[55,56,58],"h1",{"id":57},"pendahuluan","Pendahuluan",[12,60,61],{},"Dulu, menjadi programmer berarti duduk berjam-jam di depan layar, mengetik baris demi baris kode untuk membuat sesuatu “berfungsi”. Namun hari ini, definisi itu sudah jauh berubah. Coding bukan lagi sekadar membuat program berjalan—melainkan menciptakan pengalaman, membangun sistem kompleks, dan bahkan membentuk masa depan teknologi.",[63,64,66],"h4",{"id":65},"dari-coding-ke-creating","Dari Coding ke Creating",[12,68,69,70,74],{},"Sekarang, developer tidak hanya berpikir soal ",[71,72,73],"em",{},"syntax",", tetapi juga:",[76,77,78,82,85],"ul",{},[79,80,81],"li",{},"Bagaimana user merasakan produk",[79,83,84],{},"Seberapa cepat dan scalable sistem berjalan",[79,86,87],{},"Bagaimana desain dan interaksi terasa hidup",[12,89,90],{},"Framework seperti React, Svelte, hingga tools berbasis AI membuat proses development lebih cepat—tapi juga menuntut kreativitas yang lebih tinggi.",[63,92,94],{"id":93},"era-ai-developer-hybrid","Era AI & Developer Hybrid",[12,96,97],{},"Dengan munculnya AI, banyak yang takut coding akan “digantikan”. Tapi realitanya?",[12,99,100],{},"Developer justru naik level.",[12,102,103],{},"Sekarang, peran developer berubah menjadi:",[76,105,106,109,112],{},[79,107,108],{},"Problem solver",[79,110,111],{},"System designer",[79,113,114],{},"AI collaborator",[12,116,117],{},"AI bisa membantu generate kode, tapi ide, struktur, dan logika tetap berasal dari manusia.",[63,119,121],{"id":120},"coding-seni-logika","Coding = Seni + Logika",[12,123,124],{},"Website modern, aplikasi, bahkan game—semuanya adalah kombinasi antara:",[76,126,127,130],{},[79,128,129],{},"Seni (UI\u002FUX, animasi, feel)",[79,131,132],{},"Logika (algoritma, struktur data, backend)",[12,134,135],{},"Developer terbaik saat ini bukan hanya yang pintar coding, tapi juga yang punya sense desain dan pengalaman pengguna.",[63,137,139],{"id":138},"kenapa-ini-keren","Kenapa Ini Keren?",[12,141,142],{},"Karena sekarang, dengan skill coding:",[76,144,145,148,151],{},[79,146,147],{},"Kamu bisa bikin produk sendiri",[79,149,150],{},"Kamu bisa menghasilkan uang dari ide",[79,152,153],{},"Kamu bisa membangun sesuatu dari nol jadi besar",[12,155,156,157,160],{},"Coding bukan cuma skill teknis—ini adalah ",[71,158,159],{},"power"," untuk menciptakan sesuatu dari imajinasi.",[162,163,165],"h3",{"id":164},"penutup","Penutup",[12,167,168],{},"Dunia programming terus berkembang, dan satu hal yang pasti:\nyang bertahan bukan yang paling jago syntax, tapi yang paling bisa beradaptasi dan terus belajar.",[12,170,171],{},"Jadi, kalau kamu sedang belajar coding—lanjutkan.\nKarena kamu bukan cuma belajar bahasa pemrograman…\nkamu sedang belajar bagaimana menciptakan masa depan.",{"title":34,"searchDepth":35,"depth":35,"links":173},[174],{"id":164,"depth":175,"text":165},3,"Systems","Sebuah refleksi tentang bagaimana dunia programming berkembang dari sekadar menulis kode menjadi membangun pengalaman, ekosistem, dan bahkan “realitas digital” itu sendiri.","https:\u002F\u002Fplus.unsplash.com\u002Fpremium_photo-1683121710572-7723bd2e235d?q=80&w=1032&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",{},"\u002Fblog\u002Fmasa-depan-coding-ketika-developer-bukan-lagi-sekadar-penulis-kode",{"title":50,"description":177},"blog\u002Fmasa-depan-coding-ketika-developer-bukan-lagi-sekadar-penulis-kode","F3l7JsOfq6Kg65lBiNennp93X0ZGgYTxUkmhd9yn7uw",{"id":185,"title":186,"author":187,"body":188,"category":176,"date":268,"description":269,"extension":40,"image":270,"meta":271,"navigation":43,"path":272,"seo":273,"stem":274,"__hash__":275},"blog\u002Fblog\u002Frust-for-js-developers.md","Learning Rust as a JavaScript Developer","Natan Nobel",{"type":9,"value":189,"toc":264},[190,193,196,201,204,243,246,250,257,260],[12,191,192],{},"I came to Rust as a JavaScript developer. I expected to hate it. For the first two weeks, I did.",[12,194,195],{},"And then something shifted.",[197,198,200],"h2",{"id":199},"the-borrow-checker-is-your-friend-eventually","The Borrow Checker Is Your Friend (Eventually)",[12,202,203],{},"Every JavaScript developer's first Rust experience is the same: you try to do something completely normal in JS and the compiler screams at you about ownership.",[205,206,210],"pre",{"className":207,"code":208,"language":209,"meta":34,"style":34},"language-rust shiki shiki-themes github-light github-dark","fn main() {\n    let s = String::from(\"hello\");\n    takes_ownership(s);\n    println!(\"{}\", s); \u002F\u002F ERROR: value moved\n}\n","rust",[211,212,213,221,226,231,237],"code",{"__ignoreMap":34},[214,215,218],"span",{"class":216,"line":217},"line",1,[214,219,220],{},"fn main() {\n",[214,222,223],{"class":216,"line":35},[214,224,225],{},"    let s = String::from(\"hello\");\n",[214,227,228],{"class":216,"line":175},[214,229,230],{},"    takes_ownership(s);\n",[214,232,234],{"class":216,"line":233},4,[214,235,236],{},"    println!(\"{}\", s); \u002F\u002F ERROR: value moved\n",[214,238,240],{"class":216,"line":239},5,[214,241,242],{},"}\n",[12,244,245],{},"Once you internalize why ownership gives you memory safety without runtime overhead — the borrow checker stops feeling like an enemy and starts feeling like a very strict but honest collaborator.",[197,247,249],{"id":248},"the-payoff","The Payoff",[12,251,252,253,256],{},"When your Rust code compiles, it ",[71,254,255],{},"works",". Not \"probably works.\" The compiler has verified so many potential bugs out of existence that what remains is typically correct. Coming from JavaScript, this is revelatory.",[12,258,259],{},"Start with the Rust Book (free online). Build something small. It's worth it.",[261,262,263],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":34,"searchDepth":35,"depth":35,"links":265},[266,267],{"id":199,"depth":35,"text":200},{"id":248,"depth":35,"text":249},"2024-08-20","The borrow checker will humble you. The compiler errors will educate you. And then, slowly, something clicks.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1518432031352-d6fc5c10da5a?w=1200&q=80",{},"\u002Fblog\u002Frust-for-js-developers",{"title":186,"description":269},"blog\u002Frust-for-js-developers","nwwGU4oXCicZSTU1TiazwdGchWuVbPLgEf_lEYk4rB0",{"id":277,"title":278,"author":187,"body":279,"category":444,"date":445,"description":446,"extension":40,"image":447,"meta":448,"navigation":43,"path":449,"seo":450,"stem":451,"__hash__":452},"blog\u002Fblog\u002Fsvelte-vs-react-unpopular-opinion.md","Svelte vs React: An Unpopular Opinion",{"type":9,"value":280,"toc":439},[281,284,291,295,298,422,426,429,433,436],[12,282,283],{},"This will upset some people. That's fine.",[12,285,286,287,290],{},"React is the dominant frontend framework. If you want to be employable as a frontend developer, you learn React. But here's my unpopular opinion: Svelte is a genuinely better framework for ",[71,288,289],{},"building things",".",[197,292,294],{"id":293},"the-reactivity-problem","The Reactivity Problem",[12,296,297],{},"React's mental model requires you to constantly think about what causes re-renders, what needs to be memoized, why your useEffect is firing. Svelte's model: \"this variable changed, update the DOM node.\" That's it.",[205,299,303],{"className":300,"code":301,"language":302,"meta":34,"style":34},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F Svelte — just works\nlet count = 0\n$: doubled = count * 2\n\n\u002F\u002F React\nconst [count, setCount] = useState(0)\nconst doubled = useMemo(() => count * 2, [count])\n","js",[211,304,305,311,328,347,352,357,392],{"__ignoreMap":34},[214,306,307],{"class":216,"line":217},[214,308,310],{"class":309},"sJ8bj","\u002F\u002F Svelte — just works\n",[214,312,313,317,321,324],{"class":216,"line":35},[214,314,316],{"class":315},"szBVR","let",[214,318,320],{"class":319},"sVt8B"," count ",[214,322,323],{"class":315},"=",[214,325,327],{"class":326},"sj4cs"," 0\n",[214,329,330,334,337,339,341,344],{"class":216,"line":175},[214,331,333],{"class":332},"sScJk","$",[214,335,336],{"class":319},": doubled ",[214,338,323],{"class":315},[214,340,320],{"class":319},[214,342,343],{"class":315},"*",[214,345,346],{"class":326}," 2\n",[214,348,349],{"class":216,"line":233},[214,350,351],{"emptyLinePlaceholder":43},"\n",[214,353,354],{"class":216,"line":239},[214,355,356],{"class":309},"\u002F\u002F React\n",[214,358,360,363,366,369,372,375,378,380,383,386,389],{"class":216,"line":359},6,[214,361,362],{"class":315},"const",[214,364,365],{"class":319}," [",[214,367,368],{"class":326},"count",[214,370,371],{"class":319},", ",[214,373,374],{"class":326},"setCount",[214,376,377],{"class":319},"] ",[214,379,323],{"class":315},[214,381,382],{"class":332}," useState",[214,384,385],{"class":319},"(",[214,387,388],{"class":326},"0",[214,390,391],{"class":319},")\n",[214,393,395,397,400,403,406,409,412,414,416,419],{"class":216,"line":394},7,[214,396,362],{"class":315},[214,398,399],{"class":326}," doubled",[214,401,402],{"class":315}," =",[214,404,405],{"class":332}," useMemo",[214,407,408],{"class":319},"(() ",[214,410,411],{"class":315},"=>",[214,413,320],{"class":319},[214,415,343],{"class":315},[214,417,418],{"class":326}," 2",[214,420,421],{"class":319},", [count])\n",[197,423,425],{"id":424},"bundle-size","Bundle Size",[12,427,428],{},"Svelte compiles to vanilla JavaScript. A Svelte app ships less JS than a React \"Hello World.\" For performance-sensitive apps, this matters enormously.",[197,430,432],{"id":431},"my-conclusion","My Conclusion",[12,434,435],{},"Use React when you need to. Use Svelte when you can. The web is better when we have real alternatives.",[261,437,438],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":34,"searchDepth":35,"depth":35,"links":440},[441,442,443],{"id":293,"depth":35,"text":294},{"id":424,"depth":35,"text":425},{"id":431,"depth":35,"text":432},"Frontend","2024-10-05","React is everywhere. Svelte is nowhere near as popular. And yet, every time I go back to React after Svelte, I feel like I'm putting on wet socks.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1633356122544-f134324a6cee?w=1200&q=80",{},"\u002Fblog\u002Fsvelte-vs-react-unpopular-opinion",{"title":278,"description":446},"blog\u002Fsvelte-vs-react-unpopular-opinion","IpX1rCB5VCEGufkWb6Mdp2yn5vpb57s31ItWhGj05-8",{"id":454,"title":455,"author":187,"body":456,"category":582,"date":583,"description":584,"extension":40,"image":585,"meta":586,"navigation":43,"path":587,"seo":588,"stem":589,"__hash__":590},"blog\u002Fblog\u002Fwhy-i-switched-to-bun.md","Why I Switched to Bun and Never Looked Back",{"type":9,"value":457,"toc":578},[458,461,464,468,479,482,486,489,572,575],[12,459,460],{},"I've been a JavaScript developer for a while, and I've used every runtime under the sun. Node.js was my first love — reliable, battle-tested, with an ecosystem that could solve any problem if you were willing to wade through enough npm packages.",[12,462,463],{},"Then Deno came along with its promises of security, native TypeScript, and a standard library that didn't feel like it was assembled from duct tape and prayers. I liked it. But adoption was slow, and the ecosystem gap was real.",[197,465,467],{"id":466},"enter-bun","Enter Bun",[12,469,470,471,474,475,478],{},"Bun isn't just fast — it's ",[71,472,473],{},"offensively"," fast. The first time I ran ",[211,476,477],{},"bun install"," on a project that normally took 45 seconds with npm, it finished in under 3. I thought I'd done something wrong.",[12,480,481],{},"But speed is just the surface. What I actually fell in love with is the DX. Bun ships with a test runner, a bundler, a package manager, and a runtime — all in one binary.",[197,483,485],{"id":484},"the-real-selling-point-elysiajs","The Real Selling Point: ElysiaJS",[12,487,488],{},"The Bun ecosystem has been quietly building something special. ElysiaJS is the fastest HTTP framework I've ever used, and the end-to-end type safety feels almost magical.",[205,490,492],{"className":300,"code":491,"language":302,"meta":34,"style":34},"import { Elysia } from 'elysia'\n\nconst app = new Elysia()\n  .get('\u002Fhealth', () => ({ status: 'ok' }))\n  .listen(3000)\n",[211,493,494,509,513,531,558],{"__ignoreMap":34},[214,495,496,499,502,505],{"class":216,"line":217},[214,497,498],{"class":315},"import",[214,500,501],{"class":319}," { Elysia } ",[214,503,504],{"class":315},"from",[214,506,508],{"class":507},"sZZnC"," 'elysia'\n",[214,510,511],{"class":216,"line":35},[214,512,351],{"emptyLinePlaceholder":43},[214,514,515,517,520,522,525,528],{"class":216,"line":175},[214,516,362],{"class":315},[214,518,519],{"class":326}," app",[214,521,402],{"class":315},[214,523,524],{"class":315}," new",[214,526,527],{"class":332}," Elysia",[214,529,530],{"class":319},"()\n",[214,532,533,536,539,541,544,547,549,552,555],{"class":216,"line":233},[214,534,535],{"class":319},"  .",[214,537,538],{"class":332},"get",[214,540,385],{"class":319},[214,542,543],{"class":507},"'\u002Fhealth'",[214,545,546],{"class":319},", () ",[214,548,411],{"class":315},[214,550,551],{"class":319}," ({ status: ",[214,553,554],{"class":507},"'ok'",[214,556,557],{"class":319}," }))\n",[214,559,560,562,565,567,570],{"class":216,"line":239},[214,561,535],{"class":319},[214,563,564],{"class":332},"listen",[214,566,385],{"class":319},[214,568,569],{"class":326},"3000",[214,571,391],{"class":319},[12,573,574],{},"For greenfield projects, Bun is my default. Give it a shot.",[261,576,577],{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":34,"searchDepth":35,"depth":35,"links":579},[580,581],{"id":466,"depth":35,"text":467},{"id":484,"depth":35,"text":485},"Runtime","2024-11-12","Node was fine. Deno was interesting. But Bun? Bun feels like the runtime I've always wanted — and here's why.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1555066931-4365d14bab8c?w=1200&q=80",{},"\u002Fblog\u002Fwhy-i-switched-to-bun",{"title":455,"description":584},"blog\u002Fwhy-i-switched-to-bun","AVDZykHeEKu5_jJI8u46h3DO9U_LA0AHaMORJO6BLGY",1781756851063]