[{"data":1,"prerenderedAt":439},["ShallowReactive",2],{"\u002Fuses":3},{"id":4,"title":5,"body":6,"description":430,"extension":431,"meta":432,"navigation":433,"path":434,"seo":435,"sitemap":436,"stem":437,"__hash__":438},"pages\u002Fuses.md","Uses — Eko Susilo",{"type":7,"value":8,"toc":420},"minimark",[9,14,23,34,41,45,52,101,120,127,131,156,159,232,236,243,290,304,308,314,321,324,335,338,346,350,376,399,413],[10,11,13],"h2",{"id":12},"hardware","Hardware",[15,16,17,18,22],"p",{},"My main machine is a ",[19,20,21],"strong",{},"MacBook Pro M1"," — the one I reach for everything. It handles local dev, Docker containers, and build pipelines without breaking a sweat. I don't run an external monitor at my desk; the built-in display is good enough and I move around too much to justify the setup.",[15,24,25,26,29,30,33],{},"For input I use an ",[19,27,28],{},"Apple Magic Keyboard"," (full-size with numeric pad) and a ",[19,31,32],{},"Magic Mouse",". Not the most ergonomic setup, but it stays out of the way and pairing is instant when I switch between machines.",[15,35,36,37,40],{},"Headphones are ",[19,38,39],{},"Sony WH-1000XM4"," — essential for deep work in a busy office. Nothing fancy on the audio side beyond that.",[10,42,44],{"id":43},"editor-terminal","Editor + Terminal",[15,46,47,48,51],{},"My editor is ",[19,49,50],{},"VS Code"," with the following extensions doing real work day-to-day:",[53,54,55,62,68,85,91],"ul",{},[56,57,58,61],"li",{},[19,59,60],{},"Volar"," — Vue 3 language support (replaces Vetur)",[56,63,64,67],{},[19,65,66],{},"ESLint"," — inline lint feedback, especially useful for the flat config setup in this project",[56,69,70,73,74,78,79,78,82],{},[19,71,72],{},"Prettier"," — format on save; I configure it to run on ",[75,76,77],"code",{},".vue",", ",[75,80,81],{},".ts",[75,83,84],{},".md",[56,86,87,90],{},[19,88,89],{},"GitLens"," — blame annotations and history navigation without leaving the editor",[56,92,93,96,97,100],{},[19,94,95],{},"REST Client"," — quick HTTP requests from ",[75,98,99],{},".http"," files without opening Postman",[15,102,103,104,107,108,111,112,115,116,119],{},"Theme is ",[19,105,106],{},"One Dark Pro",". Font is ",[19,109,110],{},"JetBrains Mono"," at 14px with ligatures enabled — the ligature for ",[75,113,114],{},"=>"," and ",[75,117,118],{},"!=="," alone justify the install.",[15,121,122,123,126],{},"Terminal is ",[19,124,125],{},"iTerm2"," with the Minimal theme. I spend most of my time in the integrated VS Code terminal for project work and only switch to iTerm2 when I need multiple persistent sessions (e.g., dev server + wrangler + a watch script running in parallel).",[10,128,130],{"id":129},"shell-cli","Shell + CLI",[15,132,133,134,137,138,141,142,78,145,78,148,151,152,155],{},"Shell is ",[19,135,136],{},"zsh"," with ",[19,139,140],{},"oh-my-zsh",". Active plugins: ",[75,143,144],{},"git",[75,146,147],{},"zsh-autosuggestions",[75,149,150],{},"zsh-syntax-highlighting",". Prompt is ",[19,153,154],{},"Powerlevel10k"," — the lean config, not the full glyphs-everywhere version.",[15,157,158],{},"Tools I actually use and would miss if they were gone:",[53,160,161,166,172,178,192,209,215],{},[56,162,163,165],{},[19,164,144],{}," — obviously",[56,167,168,171],{},[19,169,170],{},"wrangler"," — Cloudflare Pages deploys and local preview; used daily during this site's build phases",[56,173,174,177],{},[19,175,176],{},"jq"," — piping JSON from API responses without opening a browser devtools panel",[56,179,180,183,184,187,188,191],{},[19,181,182],{},"fzf"," — fuzzy history search (",[75,185,186],{},"Ctrl-R",") and ",[75,189,190],{},"cd"," autocomplete; changes how you use the shell",[56,193,194,197,198,201,202,205,206,208],{},[19,195,196],{},"ripgrep"," (",[75,199,200],{},"rg",") — faster grep; I alias ",[75,203,204],{},"grep"," to ",[75,207,200],{}," on all machines",[56,210,211,214],{},[19,212,213],{},"curl"," — for quick API checks before writing the actual fetch call",[56,216,217,220,221,224,225,228,229],{},[19,218,219],{},"npm"," \u002F ",[19,222,223],{},"node"," — Node 22 pinned via ",[75,226,227],{},".node-version",", managed via ",[19,230,231],{},"nvm",[10,233,235],{"id":234},"core-dev-stack","Core dev stack",[15,237,238,239,242],{},"At Privy I work primarily as a ",[19,240,241],{},"System Engineer",", which means Go services and infrastructure are a big part of the day job. This site is TypeScript\u002FNuxt, but my actual polyglot reality:",[53,244,245,251,264,274,280],{},[56,246,247,250],{},[19,248,249],{},"Languages",": TypeScript (frontend + Nuxt tooling), Go (backend services at work), Shell (automation, CI scripts)",[56,252,253,256,257,259,260,263],{},[19,254,255],{},"Runtime",": Node.js 22 (pinned via ",[75,258,227],{}," — Cloudflare Pages Build v3 reads this file, not ",[75,261,262],{},"package.json#engines.node",")",[56,265,266,269,270,273],{},[19,267,268],{},"Frameworks",": Nuxt 3 + Vue 3 for this site; Echo or standard ",[75,271,272],{},"net\u002Fhttp"," for Go services",[56,275,276,279],{},[19,277,278],{},"Databases",": Cloudflare D1 (SQLite) for this site's content layer via Nuxt Content v3; PostgreSQL and Redis at Privy",[56,281,282,285,286,289],{},[19,283,284],{},"Infrastructure",": Cloudflare Pages for this site (Nitro ",[75,287,288],{},"cloudflare_pages"," preset); Docker + Kubernetes in the Privy environment",[15,291,292,293,295,296,299,300,303],{},"Package manager for this project is ",[19,294,219],{}," locked to 10.9.2 via ",[75,297,298],{},"corepack",". There was a ",[75,301,302],{},"yarn.lock"," in the repo at one point — removed to eliminate toolchain confusion.",[10,305,307],{"id":306},"ai-tools","AI tools",[15,309,310,313],{},[19,311,312],{},"Claude Code"," is in my daily workflow for this site's build. I use it via the GSD (Get Shit Done) command system which produces planning artifacts and then spawns executor agents to implement them. The value isn't \"write code for me\" — it's that the planning\u002Fexecution loop surfaces decisions before they become bugs and keeps context across multiple sessions.",[15,315,316,317,320],{},"For in-editor completions I use ",[19,318,319],{},"GitHub Copilot",". It's most useful for filling out repetitive TypeScript types, generating test cases I'd otherwise skip, and autocompleting Tailwind class strings where the pattern is obvious. I turn it off in markdown files where the suggestions are usually wrong.",[15,322,323],{},"Where AI genuinely helps:",[53,325,326,329,332],{},[56,327,328],{},"Rubber-ducking a design decision out loud before writing any code",[56,330,331],{},"First drafts of documentation (then edited — AI prose is too generic to ship raw)",[56,333,334],{},"Generating the boilerplate of a new pattern (then I read it and understand it before committing)",[15,336,337],{},"Where I don't trust it:",[53,339,340,343],{},[56,341,342],{},"Security-sensitive code — I read every line",[56,344,345],{},"Anything touching the Cloudflare D1 schema — the nuances of D1's SQLite dialect bite if you're not careful",[10,347,349],{"id":348},"hosting-deployment","Hosting + deployment",[15,351,352,353,356,357,363,364,367,368,371,372,375],{},"This site runs on ",[19,354,355],{},"Cloudflare Pages"," with Nuxt 3 and the ",[19,358,359,360,362],{},"Nitro ",[75,361,288],{}," preset",". The build output is a ",[75,365,366],{},"_worker.js"," bundle that Cloudflare's edge network executes. Deploy command is ",[75,369,370],{},"wrangler pages deploy .\u002Fdist"," via the ",[75,373,374],{},"pages:deploy"," npm script.",[15,377,378,379,382,383,386,387,390,391,394,395,398],{},"Deployment tool is ",[19,380,381],{},"wrangler v4"," (pinned in ",[75,384,385],{},"package.json","). The local preview workflow is ",[75,388,389],{},"npm run pages:preview"," which builds and runs wrangler against the ",[75,392,393],{},"dist\u002F"," output — much closer to production than ",[75,396,397],{},"npm run dev",".",[15,400,401,402,115,405,408,409,412],{},"Two Cloudflare dashboard settings that must stay OFF on this project (they're enabled by default and both break Vue SSR hydration): ",[19,403,404],{},"Rocket Loader",[19,406,407],{},"Email Address Obfuscation",". They can't be set via ",[75,410,411],{},"wrangler.toml"," — they live in the dashboard under Speed and Security respectively.",[15,414,415,416,419],{},"For other personal projects I use ",[19,417,418],{},"Fly.io"," for small Go services where I need persistent compute. Nothing elaborate — just a couple of apps that need to stay awake without a serverless cold-start penalty.",{"title":421,"searchDepth":422,"depth":422,"links":423},"",2,[424,425,426,427,428,429],{"id":12,"depth":422,"text":13},{"id":43,"depth":422,"text":44},{"id":129,"depth":422,"text":130},{"id":234,"depth":422,"text":235},{"id":306,"depth":422,"text":307},{"id":348,"depth":422,"text":349},"Hardware, editor, terminal, shell, dev stack, AI tools, and hosting that Eko Susilo uses daily.","md",{},true,"\u002Fuses",{"title":5,"description":430},{"loc":434},"uses","XVqEHYEO0pLkiWGc_Ae5V3tyE3UVPX7Q0B2qIL10uc4",1780134919528]