[{"data":1,"prerenderedAt":276},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fmy-dev-setup":46,"\u002Fblog\u002Fmy-dev-setup-surround":271},[4],{"title":5,"path":6,"stem":7,"children":8,"page":45},"Blog","\u002Fblog","blog",[9,13,17,21,25,29,33,37,41],{"title":10,"path":11,"stem":12},"Audio Augmentation Techniques for Deep Learning","\u002Fblog\u002Faudio-augmentation","blog\u002Faudio-augmentation",{"title":14,"path":15,"stem":16},"Speed Up Whisper with CTranslate2","\u002Fblog\u002Fc-translate","blog\u002Fc-translate",{"title":18,"path":19,"stem":20},"Calling C++ and Go from Dart using FFI","\u002Fblog\u002Fdart-ffi-native-bridge","blog\u002Fdart-ffi-native-bridge",{"title":22,"path":23,"stem":24},"Russey Keo High School Memories","\u002Fblog\u002Fmemory","blog\u002Fmemory",{"title":26,"path":27,"stem":28},"My Dev Setup: Same Keys Everywhere","\u002Fblog\u002Fmy-dev-setup","blog\u002Fmy-dev-setup",{"title":30,"path":31,"stem":32},"Data Extraction with LangChain and Ollama Locally","\u002Fblog\u002Fpydantic-llm","blog\u002Fpydantic-llm",{"title":34,"path":35,"stem":36},"7-Segment LED Display with Proteus Simulation","\u002Fblog\u002Fseven-segment","blog\u002Fseven-segment",{"title":38,"path":39,"stem":40},"Understanding JWT Refresh Token Rotation & Revocation","\u002Fblog\u002Funderstand-refresh-token","blog\u002Funderstand-refresh-token",{"title":42,"path":43,"stem":44},"Khmer Speech Recognition","\u002Fblog\u002Fwhisper","blog\u002Fwhisper",false,{"id":47,"title":26,"author":48,"body":52,"date":260,"description":261,"extension":262,"image":263,"meta":264,"minRead":254,"navigation":268,"path":27,"seo":269,"stem":28,"__hash__":270},"blog\u002Fblog\u002Fmy-dev-setup.md",{"name":49,"avatar":50},"Phanith LIM",{"src":51,"alt":49},"\u002Fmyprofile.jpg",{"type":53,"value":54,"toc":249},"minimark",[55,63,66,71,78,89,93,99,102,130,137,141,147,154,158,169,173,180,224,227,231,240,243],[56,57,58,59],"p",{},"I switch between a lot of tools in a day: a terminal, Neovim, IntelliJ for Java, a browser. For a long time each one had its own shortcuts, and my hands kept pressing the wrong ones. So I rebuilt my setup around one rule: ",[60,61,62],"strong",{},"the same keys should do the same thing everywhere.",[56,64,65],{},"Here is what that looks like.",[67,68,70],"h3",{"id":69},"the-desktop-omarchy-and-hyprland","The desktop: Omarchy and Hyprland",[56,72,73],{},[74,75],"img",{"alt":76,"src":77},"Hyprland","\u002Fblog\u002Fmy-dev-setup\u002Fhyprland.svg",[56,79,80,81,88],{},"I run ",[82,83,87],"a",{"href":84,"rel":85},"https:\u002F\u002Fomarchy.org",[86],"nofollow","Omarchy",", an Arch Linux setup built on the Hyprland window manager. Windows tile themselves, and everything is a keyboard shortcut. Each monitor gets its own workspaces 1–10, and one key throws a window between my laptop and my external screen.",[67,90,92],{"id":91},"the-editor-neovim","The editor: Neovim",[56,94,95],{},[74,96],{"alt":97,"src":98},"Neovim","\u002Fblog\u002Fmy-dev-setup\u002Fneovim.png",[56,100,101],{},"Most of my writing and coding happens in Neovim with LazyVim. A few things I added on top:",[103,104,105,112,124],"ul",{},[106,107,108,111],"li",{},[60,109,110],{},"Harpoon"," for the four files I am working on right now, one key each.",[106,113,114,115,118,119,123],{},"A ",[60,116,117],{},"floating terminal"," on ",[120,121,122],"code",{},"Ctrl + \u002F",".",[106,125,126,129],{},[60,127,128],{},"Spring Boot support"," for Java, including a key that checks my Spring Modulith module boundaries.",[56,131,132,133,136],{},"When I want smooth animations, I open the same config in ",[60,134,135],{},"Neovide",", a GUI for Neovim.",[67,138,140],{"id":139},"sessions-tmux","Sessions: tmux",[56,142,143],{},[74,144],{"alt":145,"src":146},"tmux","\u002Fblog\u002Fmy-dev-setup\u002Ftmux.png",[56,148,149,150,153],{},"tmux keeps my terminals alive between sessions. I gave its bar rounded \"pills\" that recolour themselves when I change my desktop theme. In Neovide I copied tmux's ",[120,151,152],{},"Ctrl + b"," keys, so opening a tab or a split is the same in both.",[67,155,157],{"id":156},"java-intellij-with-vim-keys","Java: IntelliJ with Vim keys",[56,159,160,161,164,165,168],{},"For big Java projects I still use IntelliJ, with the IdeaVim plugin. I mapped it to match Neovim: the same leader key, the same ",[120,162,163],{},"gd",", the same ",[120,166,167],{},"Alt + 1–4"," to jump between my main files.",[67,170,172],{"id":171},"the-keyboard-cornix-lp","The keyboard: Cornix LP",[56,174,175,176,179],{},"The last piece is a split keyboard, the Cornix LP. Its layers turn the home row into shortcuts. My favourite part is that ",[60,177,178],{},"H \u002F J \u002F K \u002F L"," moves focus at every level:",[181,182,183,196],"table",{},[184,185,186],"thead",{},[187,188,189,193],"tr",{},[190,191,192],"th",{},"Hold",[190,194,195],{},"+ H \u002F J \u002F K \u002F L",[197,198,199,208,216],"tbody",{},[187,200,201,205],{},[202,203,204],"td",{},"Layer 1",[202,206,207],{},"Arrow keys",[187,209,210,213],{},[202,211,212],{},"Ctrl",[202,214,215],{},"Neovim splits and tmux panes",[187,217,218,221],{},[202,219,220],{},"Layer 2",[202,222,223],{},"Hyprland windows",[56,225,226],{},"One motion, three tools, no thinking.",[67,228,230],{"id":229},"try-it","Try it",[56,232,233,234,239],{},"Everything is in my ",[82,235,238],{"href":236,"rel":237},"https:\u002F\u002Fgithub.com\u002Fphanithlim\u002Fdotfiles",[86],"dotfiles on GitHub",", with a page of keybindings for each tool.",[56,241,242],{},"The best setup is not the one with the most features. It is the one where you stop noticing the tools.",[56,244,245],{},[246,247,248],"em",{},"Images: Neovim and tmux logos by Jason Long, Hyprland logo from the Hyprland project.",{"title":250,"searchDepth":251,"depth":251,"links":252},"",2,[253,255,256,257,258,259],{"id":69,"depth":254,"text":70},3,{"id":91,"depth":254,"text":92},{"id":139,"depth":254,"text":140},{"id":156,"depth":254,"text":157},{"id":171,"depth":254,"text":172},{"id":229,"depth":254,"text":230},"2026-10-05","Omarchy, Neovim, tmux, IntelliJ and a split keyboard, set up so one habit works in every tool.","md","\u002Fblog\u002Fmy-dev-setup\u002Fthumbnail.webp",{"tags":265},[266,97,267],"Linux","Productivity",true,{"title":26,"description":261},"I1CFIWCT88teEiYNfSjZB04U-TdAuJxa2AnLGdbHIPg",[272,274],{"title":22,"path":23,"stem":24,"description":273,"children":-1},"A video of my high school years, made after the BACII exam.",{"title":30,"path":31,"stem":32,"description":275,"children":-1},"Getting typed rows out of a local LLM with Pydantic and LangChain.",1791981008543]