[{"data":1,"prerenderedAt":683},["ShallowReactive",2],{"navigation":3,"search":241,"categories-nav":526,"\u002Fexperience\u002Fopen-source\u002Fanother-discord-bot":593,"\u002Fexperience\u002Fopen-source\u002Fanother-discord-bot-surround":679},[4],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Experience","\u002Fexperience","experience",[9,43,88,117,134,167,224],{"title":10,"path":11,"stem":12,"children":13,"page":42},"Open Source","\u002Fexperience\u002Fopen-source","experience\u002Fopen-source",[14,18,22,26,30,34,38],{"title":15,"path":16,"stem":17},"Another Discord Bot","\u002Fexperience\u002Fopen-source\u002Fanother-discord-bot","experience\u002Fopen-source\u002Fanother-discord-bot",{"title":19,"path":20,"stem":21},"Rabbit Hole","\u002Fexperience\u002Fopen-source\u002Frabbit-hole","experience\u002Fopen-source\u002Frabbit-hole",{"title":23,"path":24,"stem":25},"Lossless Compression","\u002Fexperience\u002Fopen-source\u002Flossless-compression","experience\u002Fopen-source\u002Flossless-compression",{"title":27,"path":28,"stem":29},"Smol WhatsApp","\u002Fexperience\u002Fopen-source\u002Fsmol-whatsapp","experience\u002Fopen-source\u002Fsmol-whatsapp",{"title":31,"path":32,"stem":33},"SEO Head Parser","\u002Fexperience\u002Fopen-source\u002Fseo-head-parser","experience\u002Fopen-source\u002Fseo-head-parser",{"title":35,"path":36,"stem":37},"Coordinate Manager","\u002Fexperience\u002Fopen-source\u002Fcoordinate-manager","experience\u002Fopen-source\u002Fcoordinate-manager",{"title":39,"path":40,"stem":41},"Nuxt Ecosystem","\u002Fexperience\u002Fopen-source\u002Fnuxt-ecosystem","experience\u002Fopen-source\u002Fnuxt-ecosystem",false,{"title":44,"path":45,"stem":46,"children":47,"page":42},"Self Taught","\u002Fexperience\u002Fself-taught","experience\u002Fself-taught",[48,52,56,60,64,68,72,76,80,84],{"title":49,"path":50,"stem":51},"From Ubuntu to CachyOS","\u002Fexperience\u002Fself-taught\u002Ffrom-ubuntu-to-cachyos","experience\u002Fself-taught\u002Ffrom-ubuntu-to-cachyos",{"title":53,"path":54,"stem":55},"Linux Workstation (Bazzite)","\u002Fexperience\u002Fself-taught\u002Flinux-workstation-bazzite","experience\u002Fself-taught\u002Flinux-workstation-bazzite",{"title":57,"path":58,"stem":59},"AI Sandbox","\u002Fexperience\u002Fself-taught\u002Fai-sandbox","experience\u002Fself-taught\u002Fai-sandbox",{"title":61,"path":62,"stem":63},"Generative Models","\u002Fexperience\u002Fself-taught\u002Fgenerative-models","experience\u002Fself-taught\u002Fgenerative-models",{"title":65,"path":66,"stem":67},"Custom Browser Extension","\u002Fexperience\u002Fself-taught\u002Fcustom-browser-extension","experience\u002Fself-taught\u002Fcustom-browser-extension",{"title":69,"path":70,"stem":71},"Simple Image Classification","\u002Fexperience\u002Fself-taught\u002Fsimple-image-classification","experience\u002Fself-taught\u002Fsimple-image-classification",{"title":73,"path":74,"stem":75},"My Portfolio","\u002Fexperience\u002Fself-taught\u002Fmy-portfolio","experience\u002Fself-taught\u002Fmy-portfolio",{"title":77,"path":78,"stem":79},"Auto Move Bot","\u002Fexperience\u002Fself-taught\u002Fauto-move-bot","experience\u002Fself-taught\u002Fauto-move-bot",{"title":81,"path":82,"stem":83},"Discord Music Bot","\u002Fexperience\u002Fself-taught\u002Fdiscord-music-bot","experience\u002Fself-taught\u002Fdiscord-music-bot",{"title":85,"path":86,"stem":87},"Local Cron","\u002Fexperience\u002Fself-taught\u002Flocal-cron","experience\u002Fself-taught\u002Flocal-cron",{"title":89,"path":90,"stem":91,"children":92,"page":42},"Freelance","\u002Fexperience\u002Ffreelance","experience\u002Ffreelance",[93,97,101,105,109,113],{"title":94,"path":95,"stem":96},"Garment Inventory Management","\u002Fexperience\u002Ffreelance\u002Fgarment-inventory-management","experience\u002Ffreelance\u002Fgarment-inventory-management",{"title":98,"path":99,"stem":100},"BSI Enterprise Risk Management System","\u002Fexperience\u002Ffreelance\u002Fbsi-enterprise-risk-management-system","experience\u002Ffreelance\u002Fbsi-enterprise-risk-management-system",{"title":102,"path":103,"stem":104},"SIMKUG TK","\u002Fexperience\u002Ffreelance\u002Fsimkug-tk","experience\u002Ffreelance\u002Fsimkug-tk",{"title":106,"path":107,"stem":108},"Babeh Finance","\u002Fexperience\u002Ffreelance\u002Fbabeh-finance","experience\u002Ffreelance\u002Fbabeh-finance",{"title":110,"path":111,"stem":112},"MyRepublic Stella","\u002Fexperience\u002Ffreelance\u002Fmyrepublic-stella","experience\u002Ffreelance\u002Fmyrepublic-stella",{"title":114,"path":115,"stem":116},"Yayasan BPI","\u002Fexperience\u002Ffreelance\u002Fyayasan-bpi","experience\u002Ffreelance\u002Fyayasan-bpi",{"title":118,"path":119,"stem":120,"children":121,"page":42},"Fajar Mulia Transindo","\u002Fexperience\u002Ffajar-mulia-transindo","experience\u002F4.fajar-mulia-transindo",[122,126,130],{"title":123,"path":124,"stem":125},"FMT OpenRemote","\u002Fexperience\u002Ffajar-mulia-transindo\u002Ffmt-openremote","experience\u002F4.fajar-mulia-transindo\u002Ffmt-openremote",{"title":127,"path":128,"stem":129},"PT. NAM Company Profile","\u002Fexperience\u002Ffajar-mulia-transindo\u002Fpt-nam-company-profile","experience\u002F4.fajar-mulia-transindo\u002Fpt-nam-company-profile",{"title":131,"path":132,"stem":133},"FMT App","\u002Fexperience\u002Ffajar-mulia-transindo\u002Ffmt-app","experience\u002F4.fajar-mulia-transindo\u002Ffmt-app",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Smooets Teknologi Outsourcing","\u002Fexperience\u002Fsmooets-teknologi-outsourcing","experience\u002F3.smooets-teknologi-outsourcing",[139,143,147,151,155,159,163],{"title":140,"path":141,"stem":142},"PaDiUMKM","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fpadiumkm","experience\u002F3.smooets-teknologi-outsourcing\u002Fpadiumkm",{"title":144,"path":145,"stem":146},"E-Dekidaka","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fe-dekidaka","experience\u002F3.smooets-teknologi-outsourcing\u002Fe-dekidaka",{"title":148,"path":149,"stem":150},"Meratus","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fmeratus","experience\u002F3.smooets-teknologi-outsourcing\u002Fmeratus",{"title":152,"path":153,"stem":154},"BJ Home","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fbj-home","experience\u002F3.smooets-teknologi-outsourcing\u002Fbj-home",{"title":156,"path":157,"stem":158},"Jixie","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fjixie","experience\u002F3.smooets-teknologi-outsourcing\u002Fjixie",{"title":160,"path":161,"stem":162},"Knowledge Catalyst","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fknowledge-catalyst","experience\u002F3.smooets-teknologi-outsourcing\u002Fknowledge-catalyst",{"title":164,"path":165,"stem":166},"Vallée","\u002Fexperience\u002Fsmooets-teknologi-outsourcing\u002Fvallee","experience\u002F3.smooets-teknologi-outsourcing\u002Fvallee",{"title":168,"path":169,"stem":170,"children":171,"page":42},"Internship","\u002Fexperience\u002Finternship","experience\u002F2.internship",[172,176,180,184,188,192,196,200,204,208,212,216,220],{"title":173,"path":174,"stem":175},"WhatsApp Widget","\u002Fexperience\u002Finternship\u002Fwhatsapp-widget","experience\u002F2.internship\u002Fwhatsapp-widget",{"title":177,"path":178,"stem":179},"Video Call","\u002Fexperience\u002Finternship\u002Fvideo-call","experience\u002F2.internship\u002Fvideo-call",{"title":181,"path":182,"stem":183},"URL to Image","\u002Fexperience\u002Finternship\u002Furl-to-image","experience\u002F2.internship\u002Furl-to-image",{"title":185,"path":186,"stem":187},"Text to Image","\u002Fexperience\u002Finternship\u002Ftext-to-image","experience\u002F2.internship\u002Ftext-to-image",{"title":189,"path":190,"stem":191},"Tracking Report","\u002Fexperience\u002Finternship\u002Ftracking-report","experience\u002F2.internship\u002Ftracking-report",{"title":193,"path":194,"stem":195},"Report Generator","\u002Fexperience\u002Finternship\u002Freport-generator","experience\u002F2.internship\u002Freport-generator",{"title":197,"path":198,"stem":199},"Project Monitoring","\u002Fexperience\u002Finternship\u002Fproject-monitoring","experience\u002F2.internship\u002Fproject-monitoring",{"title":201,"path":202,"stem":203},"Postage Calculator","\u002Fexperience\u002Finternship\u002Fpostage-calculator","experience\u002F2.internship\u002Fpostage-calculator",{"title":205,"path":206,"stem":207},"Organization Chart","\u002Fexperience\u002Finternship\u002Forganization-chart","experience\u002F2.internship\u002Forganization-chart",{"title":209,"path":210,"stem":211},"Kontakk","\u002Fexperience\u002Finternship\u002Fkontakk","experience\u002F2.internship\u002Fkontakk",{"title":213,"path":214,"stem":215},"Invoice Generator","\u002Fexperience\u002Finternship\u002Finvoice-generator","experience\u002F2.internship\u002Finvoice-generator",{"title":217,"path":218,"stem":219},"Image Compare","\u002Fexperience\u002Finternship\u002Fimage-compare","experience\u002F2.internship\u002Fimage-compare",{"title":221,"path":222,"stem":223},"Eager Loading","\u002Fexperience\u002Finternship\u002Feager-loading","experience\u002F2.internship\u002Feager-loading",{"title":225,"path":226,"stem":227,"children":228,"page":42},"High School","\u002Fexperience\u002Fhigh-school","experience\u002F1.high-school",[229,233,237],{"title":230,"path":231,"stem":232},"Forum RPL","\u002Fexperience\u002Fhigh-school\u002Fforum-rpl","experience\u002F1.high-school\u002Fforum-rpl",{"title":234,"path":235,"stem":236},"Competition Web Development Dinamik 14","\u002Fexperience\u002Fhigh-school\u002Fcompetition-web-development-dinamik-14","experience\u002F1.high-school\u002Fcompetition-web-development-dinamik-14",{"title":238,"path":239,"stem":240},"Competition Web Design \"AMIK Developer Day\"","\u002Fexperience\u002Fhigh-school\u002Fcompetition-web-design-amik-developer-day","experience\u002F1.high-school\u002Fcompetition-web-design-amik-developer-day",[242,246,252,257,260,265,271,276,282,287,292,297,302,307,312,317,322,327,332,337,342,345,350,355,360,365,368,373,378,383,387,390,393,396,399,402,405,408,411,415,418,421,424,427,430,433,436,439,442,445,448,451,454,457,460,463,466,469,472,475,478,481,484,487,490,493,496,499,502,505,508,511,514,517,520,523],{"id":16,"title":15,"titles":243,"content":244,"level":245},[],"Another Discord music bot rewritten in Rust. Yet another music bot. Source code available at https:\u002F\u002Fcodeberg.org\u002FAnOrdinaryPeople\u002Fdc-music-bot",1,{"id":247,"title":248,"titles":249,"content":250,"level":251},"\u002Fexperience\u002Fopen-source\u002Fanother-discord-bot#features","Features",[15],"Integrates with a self-hosted Invidious for audio streaming, replacing yt-dlp Reduces compiled size from 116.1 MB to 28.2 MB Handles DAVE and Opus at a lower level via Songbird, eliminating the N-API bridge Home server OS moved to uCore for its immutable and atomic updates, easing long-term maintenance",2,{"id":253,"title":254,"titles":255,"content":256,"level":251},"\u002Fexperience\u002Fopen-source\u002Fanother-discord-bot#why-rewrite","Why Rewrite?",[15],"Rewritten in Serenity after DisTube's yt-dlp fork was publicly archived, with youtubei.js mentioned as the intended replacement but never made compatible with the existing DisTube setup. Moving off yt-dlp\u002Fyoutubei.js in favor of a self-hosted Invidious instance also sidesteps the recurring IP-ban and extractor-breakage issues that shaped much of the bot's prior history, while the switch from Bun to Serenity\u002FSongbird. Songbird's use of Symphonia and opus2 for decoding further removes the need to maintain a custom FFmpeg build, cutting another source of operational upkeep.",{"id":20,"title":19,"titles":258,"content":259,"level":245},[],"A collection of optimization and compatibility experiments. A collection of optimization and compatibility experiments. All scripts are available at https:\u002F\u002Fcodeberg.org\u002FAnOrdinaryPeople\u002Frabbit-hole",{"id":261,"title":262,"titles":263,"content":264,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#discord-bot","Discord Bot",[19],"A minimal FFmpeg build for Discord bots with Opus and PCM audio codec support. Patches Discord.js dependencies to work with Bun's bun compile by rewriting dynamic N-API imports in prism-media and WebSocket modules as static imports.",{"id":266,"title":267,"titles":268,"content":269,"level":270},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#ffmpeg","FFmpeg",[19,262],"Built from source starting with --disable-everything, then selectively re-enabling only what a Discord audio bot requires.",3,{"id":272,"title":273,"titles":274,"content":275,"level":270},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#upstream-patches","Upstream Patches",[19,262],"bun compile bundles everything into a single binary at build time, so dynamically called require() breaks.",{"id":277,"title":278,"titles":279,"content":280,"level":281},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#prism-media","prism-media",[19,262,273],"FFmpeg detection: The original probes the system for FFmpeg by trying various paths at runtime. The patch hardcodes it, since the bot ships its own FFmpeg, discovery is unnecessary. Opus loader: The original uses a generic loader that walks through multiple Opus implementations at runtime. The patch replaces it entirely with a direct hardcoded require() pointing to a specific prebuilt .node binary.",4,{"id":283,"title":284,"titles":285,"content":286,"level":281},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#discordvoice-and-discordws","@discord\u002Fvoice and @discord\u002Fws",[19,262,273],"Both packages import the ws npm package. Since Bun exposes WebSocket natively via globalThis.WebSocket, the patch removes the import and replaces all references with globalThis.WebSocket.",{"id":288,"title":289,"titles":290,"content":291,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#pytorch-from-source","PyTorch from Source",[19],"At the time of this build, CUDA 13 had no official PyTorch prebuilt wheels. Blackwell (sm_120) was only partially supported in nightly builds, with stable releases capped at sm_90. CUDA 13.0 shipped on 2025-08-04 with full Turing-Blackwell coverage. The workaround was a full source build.",{"id":293,"title":294,"titles":295,"content":296,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#sageattention3","SageAttention3",[19],"Compiled from source, as no pip install distribution is officially provided. Bazzite DX is an immutable Linux distro whose system Python is a stripped-down build without CPython internals, compiling any Python extension that links against libpython or libffi (such as SageAttention's CUDA kernels) fails on the host. Distrobox spins up a mutable container that shares the home directory, making builds accessible both inside and outside the container without requiring system privileges.",{"id":298,"title":299,"titles":300,"content":301,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#ffmpeg-hwaccel","FFmpeg hwaccel",[19],"Built from source with NVIDIA hardware acceleration (NVENC\u002FNVDEC\u002FCUDA) and common codec support, targeting a custom CUDA 13 installation. patch.sh resolves a CUDA 13 header incompatibility with C++ before building.",{"id":303,"title":304,"titles":305,"content":306,"level":270},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#cuda-13-c-compatibility-fix","CUDA 13 C++ Compatibility Fix",[19,299],"The issue is in math_functions.h. CUDA 13 declares functions like rsqrt and rsqrtf as extern without noexcept, but C++17 requires consistent declarations, if a function is defined with noexcept somewhere and declared without it elsewhere, the compiler errors out. FFmpeg's CUDA compilation targets C++17 via --nvccflags=\"-std=c++17\", which triggers this conflict.",{"id":308,"title":309,"titles":310,"content":311,"level":270},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#nv-codec-headers","nv-codec-headers",[19,299],"NVIDIA's codec APIs (NVENC, NVDEC, CUVID) are not included in the CUDA toolkit. They're a separate header-only package maintained by the FFmpeg project, defining the interfaces FFmpeg calls at runtime against libnvidia-encode.so and libcuvid.so from the driver.",{"id":313,"title":314,"titles":315,"content":316,"level":270},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#static-build","Static Build",[19,299],"Produces a self-contained ffmpeg binary with no .so runtime dependencies. Unlike the Discord Bot build which used --enable-shared to stay as lightweight as possible, this one is a portable general-purpose tool.",{"id":318,"title":319,"titles":320,"content":321,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#pipewire-virtualization","PipeWire Virtualization",[19],"Bazzite's ujust setup-virtual-surround automates otherwise manual PipeWire filter-chain configuration. It creates a virtual surround sink that folds multichannel audio (5.1, 7.1) down to stereo using HRTFs.",{"id":323,"title":324,"titles":325,"content":326,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#forgejo-runner","Forgejo Runner",[19],"A minimal self-hosted runner for Codeberg, hosted on Fly.io. The machine auto-stops when no jobs are queued and auto-starts via a Forgejo Webhook on git push, a workaround since no job-queued hook exists yet, though a PR is open to add job-level hook support.",{"id":328,"title":329,"titles":330,"content":331,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#proton","Proton",[19],"Per-game compatibility notes on what each title required to run under Proton. Example game:",{"id":333,"title":334,"titles":335,"content":336,"level":270},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#god-of-war-ragnarok","God of War Ragnarok",[19,329],"The game includes the PlayStation PC SDK, which is incompatible with Linux and causes error popups among other issues. NoPSSDK addresses the known SDK-related problems. Per a Sony announcement, PSN will become optional on PC, making the NoPSSDK bypass a reasonable approach.",{"id":338,"title":339,"titles":340,"content":341,"level":251},"\u002Fexperience\u002Fopen-source\u002Frabbit-hole#related-projects","Related Projects",[19],"Discord Music Bot Generative Models Linux Workstation Bazzite",{"id":50,"title":49,"titles":343,"content":344,"level":245},[],"Migration of a personal secondary work laptop from Ubuntu to CachyOS, involving the setup of a customized environment with CMake and Tauri for enhanced performance and user experience. A secondary work laptop has been running on CachyOS since early April 2026, following a migration from Ubuntu that had been accumulating grievances since 22.04.",{"id":346,"title":347,"titles":348,"content":349,"level":251},"\u002Fexperience\u002Fself-taught\u002Ffrom-ubuntu-to-cachyos#what-prompted-the-move","What Prompted the Move",[49],"Ubuntu's pain (pun intended) releases have a reliable tradition of introducing problems that weren't invited. Two incidents that stucks: Electron app instability Certain Electron-based apps (Docker Desktop, VSCode) required opting into alpha releases to achieve stable behavior. The stable channel was the unstable one. The labeling was doing its best. The libfuse2 incident AppImages require libfuse2 to run. On 24.04, libfuse2 no longer exists under that name, it was quietly renamed to libfuse2t64. Installing libfuse2 instead gave APT enough rope to remove fuse3, ubuntu-session, and enough of the desktop session stack to ensure the laptop wouldn't boot into a GUI again. Recovery involved rolling back through GRUB. AppImages were subsequently avoided until further notice, which turned out to be indefinitely.",{"id":351,"title":352,"titles":353,"content":354,"level":251},"\u002Fexperience\u002Fself-taught\u002Ffrom-ubuntu-to-cachyos#whats-set-up","What's Set Up",[49],"Migrating LibreWolf profiles is straightforward without relying on online sync. The profiles are files. Files can be moved. This remains an underrated property. Several desktop environments were tested (e.g., System76 COSMIC, Niri). The process was called \"exploring options.\" KDE Plasma still won. The exploration happened anyway. Installing self-built Tauri apps requires AUR tooling to package and install locally, which took longer to figure out than the app itself took to build. Legacy projects, regardless of which company owns them, tend to get the same treatment: the revenue keeps flowing, the investment never arrives. Every proposal to modernize the stack is answered with “we'll do it later,” and “later” is a polite spelling of “no.” The runtime is frozen, so the environment is frozen with it. Distrobox turns that into a one-time cost: Distrobox is addictive for exactly this kind of problem, the way a clean sandbox is addictive once you've seen what the host looks like after a month of “just one more workaround.” The code needs an aging runtime, which needs old libraries current repositories stopped shipping, which needs extensions patched before they compile. On the host, that is a chain of dominoes with version managers fighting over PATH. In a disposable container, the chain is built once from a single image file, the host stays clean, and breaking everything is a recoverable hobby. DevContainers also work, but they put the IDE inside the container, which is a fine way to make a memory-hungry editor hungrier. Distrobox keeps the editor on the host and only the stack inside.",{"id":356,"title":357,"titles":358,"content":359,"level":251},"\u002Fexperience\u002Fself-taught\u002Ffrom-ubuntu-to-cachyos#why-cachyos","Why CachyOS?",[49],"Why not Arch? Arch is philosophically correct and practicallly exhausting as a starting point. CachyOS ships with a functioning system, sane defaults, and performance-oriented kernel patches without requiring the user to earn it first through ISO ritual. Some people find meaning in the manual process. This was not that occasion. The goal was a working system with the option to break it deliberately, not a guided tour of pacstrap. Self-inflicted breakage, on a schedule of one's choosing Ubuntu's regressions arrived uninvited with each point release. A rolling release doesn't eliminate instability, it just relocates the decisions. Updates happen when they happen, and any resulting fallout is owned rather than inherited. KDE QoL improvements GNOME operates on the philosophy that fewer settings produce better users. KDE disagrees, and the disagreement is visible. Special Application Settings alone justify the migration, per-window geometry, focus behavior, and virtual desktop rules that actually persist. System Settings expose controls that on GNOME would require a shell extension, a prayer, and a reboot to find out if it worked. Package management CachyOS ships with Shelly, a GUI package manager, for those who have apparently decided that typing pacman -S constitutes an unreasonable demand on one's time. It covers AUR, official repositories, AppImages, Flatpaks, and local packages. Terminal access still included for the unconvinced.",{"id":361,"title":362,"titles":363,"content":364,"level":251},"\u002Fexperience\u002Fself-taught\u002Ffrom-ubuntu-to-cachyos#any-quirks","Any Quirks?",[49],"Rolling release, KDE, and a custom kernel walk into a bar. Occasional hiccups: AUR dependency for self-built Tauri apps Tauri applications require AUR tooling to package and install locally. An AppImage path exists, but it proved more complicated than building a PKGBUILD. A blank page with no error in AppImage; .pkg.tar.zst just works. Konsole defaults to Fish Fish ships as the default shell in Konsole. Existing bash muscle memory does not transfer gracefully until bass savior is installed. Switching back is straightforward. The reason it hasn't happened is that fish's inline autocomplete predictions are genuinely useful in a way that bash's double-tab completion is not. Adaptation is ongoing. The muscle memory is not pleased. KDE credential prompts KDE enforces application-level access controls more visibly than most environments. VSCode VSCodium, for instance, surfaces a KWallet keyring prompt for credential storage. The behavior is correct and the intent is reasonable. It is also unexpected the first time, and second time, and occasional the third.",{"id":54,"title":53,"titles":366,"content":367,"level":245},[],"Migration of a personal workstation from Windows to Bazzite Linux with NVIDIA, audio, and AI tooling customization. A personal PC has been running on Bazzite since early February 2026 using Bazzite DX image, following a migration from Windows with targeted system and tooling customizations.",{"id":369,"title":370,"titles":371,"content":372,"level":251},"\u002Fexperience\u002Fself-taught\u002Flinux-workstation-bazzite#whats-actually-set-up","What's Actually Set Up",[53],"RTX 5080 supported out-of-the-box by Bazzite. No rituals, no tears. PipeWire filter chains configured for 7.1 surround sound using the SADIE KEMAR preset. Ears are happy. Isolated AI workload under Distrobox, because Bazzite's immutable host discourages direct modification, and the rules were followed. Mostly out of respect. Partially out of fear: A custom-built FFmpeg with full codec and feature support, as well as hardware acceleration, based on the latest upstream version. Overkill? Absolutely. PyTorch compiled from source to drag CUDA 13 runtime into existence. SageAttention3 compiled, which demands CUDA 13 toolkit, Triton, and a from-source Python build as entry fee. Bazzite DX's Python ships without CPython and LibFFI, so LibFFI also got the from-source treatment. Perfectly normal stack of dominoes. SageAttention2 also installed as fallback, for transformers still pretending SageAttention3 doesn't exist yet.",{"id":374,"title":375,"titles":376,"content":377,"level":251},"\u002Fexperience\u002Fself-taught\u002Flinux-workstation-bazzite#why-migrate","Why Migrate?",[53],"Hardware utilization and performance Ongoing use of Ubuntu on a secondary work laptop since 2023 showed measurable gains in battery life, performance consistency, and system-level customization. That evidence made the primary workstation an obvious next candidate. Vendor lock-in from Windows-only software Core functionality is routinely gated behind proprietary, subscription-based tooling. A notable example is Beyerdynamic Immerse charging annually for 7.1 virtual surround. Windows-side workarounds lean on OSS layers like HeSuVi, while Bazzite treats this as a first-class feature via PipeWire, including ujust setup-virtual-surround. Peripheral ecosystems often require heavyweight vendor software just to expose basics like DPI or profiles. Linux alternatives such as OpenRazer and Input Remapper deliver the same functionality without the ongoing hostage situation. Excessive telemetry and bundled features Persistent background telemetry and preinstalled AI slop apps that are unrelated to user workflows are enabled by default. Meaningful mitigation typically depends on third-party utilities (e.g., O&O ShutUp10) rather than supported, system-level controls. Update instability Mandatory updates have a habit of introducing regressions or invalidating existing configurations. Bazzite uses atomic updates with rollback support, making experimentation far less exciting in the wrong ways. Misconceptions around NVIDIA on Linux Claims of poor NVIDIA support are outdated. NVIDIA provides official Linux drivers and tooling with feature parity. Bazzite ships with the driver preinstalled and preconfigured, removing the manual setup obstacle course.",{"id":379,"title":380,"titles":381,"content":382,"level":251},"\u002Fexperience\u002Fself-taught\u002Flinux-workstation-bazzite#why-bazzite","Why Bazzite?",[53],"Why not use Windows LTSC? LTSC removes the ads, not the leash. Same plumbing, fewer stickers. It's still Windows and requires licensing. Also still quietly steering things back to defaults nobody explicitly invited. Maintenance-free system Atomic image updates are delivered as a complete image beside the old one, so nothing is ever half-applied. Misbehaves? Reboot into yesterday. Meanwhile, elsewhere, people still schedule weekends for updating, news-reading and prayer. Here it's automatic, drivers come pre-integrated, and the base is read-only. Detective work is available, just no longer mandatory. Beginner-friendly ;) Some people need spiritual validation from compiling their own kernel. Bazzite ships with proprietary GPU drivers baked in and handles the heavy lifting. Yes, that means fewer rites of passage. Tragic. Gaming performance Modern AAA releases lean hard on frame generation and reconstruction tricks. When half the FPS is synthetic anyway, chasing tiny distro deltas feels academic. FPS can be capped when FG isn't available, hardware stay under 70 °C and the electric bill remains pleasantly unremarkable. Power saving that actually saves Windows' Power Save mode takes the \"saving\" part personally and guts the FPS along with it. Bazzite's version just quietly does its job: temps drop from a toasty ~70 °C to a suspicious ~40 °C, FPS doesn't flinch, and the electric bill gets embarrassingly cheap. Skepticism is valid. At least on this PC, it actually works.",{"id":384,"title":362,"titles":385,"content":386,"level":251},"\u002Fexperience\u002Fself-taught\u002Flinux-workstation-bazzite#any-quirks",[53],"No distribution delivers flawless, out-of-the-box compatibility across all workloads. Occasional hiccups still appears: Gold-rated games Titles marked Gold on ProtonDB may still require minor tweaks or additional dependencies for optimal behavior. For example, Clair Obscur: Expedition 33 hides most graphics settings unless sd0 (disable Steam Deck mode) is added to launch parameters. Ray tracing RTX features may intermittently fail in certain games following NVIDIA driver updates. The practical workaround is to roll back to a known-good driver version until the regression is resolved. Anti-cheat Some games listed as Denied or Broken on AWACY are generally unplayable (looking at you, EA). In Denied cases, developers have explicitly chosen not to enable or support Linux-compatible anti-cheat solutions. Non-Steam games Audio occasionally decides to assert dominance at full volume, with in-game sliders cheerfully doing nothing. ALSA swaps and the usual Gold-rated ritual tweaks apply. Waydroid Waydroid doesn't run properly on NVIDIA GPUs, because proprietary drivers cannot resist reminding everyone who owns the leash. Bazzite's ujust configure-waydroid makes setup painless, and Android apps won't launch until the Waydroid instance is running, a revelation that only took hours of staring at a blank app. Atomic trade-offs Bazzite's image-based, immutable core keeps low-level tinkering on a tight leash. Fewer ways to quietly wreck the system, fewer late-night heroics. Stability stays boring. Ego occasionally sulks.",{"id":24,"title":23,"titles":388,"content":389,"level":245},[],"A smol tool for compressing PNG and JPG, built with Bun and Tauri. Features: Smol size (.deb package is ~6.7MB) Fully offline Lossless compression for PNG and JPG Drag-and-drop support Parallel procesing See more details at repository.",{"id":28,"title":27,"titles":391,"content":392,"level":245},[],"Smol wrapper for WhatsApp Web on Linux, built with Tauri. A smol wrapper for WhatsApp Web on Linux, built with Tauri. Features: Smol (~16MB), unlike Electron-based wrapper (100MB+) Notifications System tray thingy See more details at repository.",{"id":32,"title":31,"titles":394,"content":395,"level":245},[],"Lightweight SEO metadata extraction from a webpage's \u003Chead> section using a streaming HTML parser. Features: Extract major SEO metadata such as title, description, keywords, Open Graph, Twitter, App Links, and other meta tags. Streams HTML and stops after \u003C\u002Fhead>. Zero dependencies. See more details at repository.",{"id":36,"title":35,"titles":397,"content":398,"level":245},[],"A Fabric-based Minecraft mod that allows players to capture and manage coordinates with rich features, including instant capture, coordinate history, and bulk actions. Coordinate Manager is a Fabric-based Minecraft mod that allows players to capture and manage coordinate with rich features: Capture Modes: Instant: Save coordinate immediately without prompts. Pop-up: Show a dialog to set a name and adjust coordinate values before saving. Capture Cooldown: Prevent spam by setting a cooldown. Coordinate Thumbnail: Save a thumbnail of your current view when capturing a coordinate. Precise Coordinates: Saves coordinate values as decimals for accuracy. Auto-Copy on Capture: Automatically copies the saved coordinates to the clipboard when capturing a coordinate. Coordinate History Screen: View, copy, edit, and manage saved coordinates in-game. Copy Coordinates: Copy any coordinate entry to clipboard for easy sharing. Set Favorited Coordinates: Protect favorited coordinates from accidental deletion. Search Functionality: Find saved coordinates by name or coordinate values. Bulk Actions:\nFavorite: Toggle favorite status for multiple entries. Delete: Remove multiple selected coordinates at once. Delete Options:\nDelete Individual Coordinates: Remove specific entries. Clear World\u002FServer Coordinates: Delete all unfavorited coordinates from the current world or server. Development Highlights Driven by Pure Passion: A rare moment when coding felt exciting. It reflects genuine curiousity and the joy of building something meaningful. Learning by Doing: I didn't learn deeply about Java. Instead, I dove straight into Fabric documentation and studied open-source Minecraft mods. Figuring Things Out Along the Way: I Learned by observing how other mods worked, experimenting with code, and troubleshooting issues as they came up. Full Development Cycle: Independently handled design, coding, testing, and deployment. Source code",{"id":40,"title":39,"titles":400,"content":401,"level":245},[],"Contributed to multiple Nuxt projects, starting with the alpha release of Nuxt UI v3, and later expanding to Nuxt ecosystem. Contributed to multiple Nuxt projects, starting with the alpha release of Nuxt UI v3, and later expanding to improvements in Nuxt Content, Nuxt MDC, and Nuxt Hub. My work spanned performance optimizations, issue triaging, and peer review of core features. Nuxt UI: Identified inefficiencies in i18n handling, where unused locale data was bundled unnecessarily. Streamlined tree-shaking to include only default locale in builds, maintaining performance even with multiple languages. Collaborated with the Nuxt core team to ensure compatibility with real-world workflows. Nuxt Content & Nuxt MDC: Investigated and documented a bug affecting highlighting parsing. Reviewed and provided feedback on a Nuxt MDC PR that resolved the issue, ensuring seamless integration with Nuxt Content. Nuxt Hub Investigated and documented a regression between Nuxt Hub 0.10.4 and Nuxt Content 3.10.0. Category Links Repositories UI, Content, MDC, Hub Release Notes UI v3.0.0-alpha.10 Resolved Issues UI #2759, UI #2734, Content #3502, Hub #754 Merged\u002FReviewed PRs UI #2760, UI #2735, MDC #409, Hub #760",{"id":95,"title":94,"titles":403,"content":404,"level":245},[],"Discover how a custom garment inventory system streamlines retail and warehouse operations with secure transactions, barcode scanning, bundle detection, and low-stock alerts. Learn about the technical leadership behind database design, CI\u002FCD automation, and a immutable kiosk OS for tamper-proof store terminals. Served as Technical Project Consultant for a medium-scale garment inventory system deployed in client's retailers and warehouses. Led requirements analysis, sprint planning, technical architecture, team coordination, and code quality assurance, including the development of a secure custom kiosk OS for store terminals. Key Responsibilities: Translated client requirements into technical specifications and managed sprint execution. Designed database schema, enforced strict typing (zero any usage), and maintained code quality via reviews and Git hooks. Established CI\u002FCD pipelines for automated testing and deployment. Developed a immutable kiosk OS with encrypted storage, BIOS-level passwords, and no local data persistence to prevent tampering. Features: User, retailer, product, and bundle CRUD operations. Retailer-specific transactions with barcode scanning and dynamic price adjustment. Automatic bundle detection and low-stock notifications. Sales trend analysis and database archiving for performance. Technology Stack: Development Tools Dev Containers: Provides a consistent and isolated development environment. Bun: Supercharged runtime environment. Biome: All-in-one development toolchain such as analyzer, formatter, and linter. Scalar: API documentation that automatically generated by Elysia Swagger plugin. Lefthook: Runs Git hooks for code quality checks and enforces commit message conventions before CI\u002FCD verification. SonarQube: Code quality and security analysis tool to identify code smells, vulnerabilities, and bugs. Renovate: Automates dependency updates for packages, Dev Containers, and Forgejo Actions. Forgejo Actions: CI\u002FCD for code quality and automated deployment process. Backend Elysia: Top-performing TypeScript framework that offers E2E type safety, unified type system, and removes validation boilerplate. Drizzle ORM: ORM tool for simplifying database operations and supercharge query speed. PostgreSQL: Hosted on Aiven, providing a cheaper cost as data grows. Native Web Push: Utilized for real-time notifications. Turnstile: Integrated for bot protection and security. Frontend Next.js: React framework that seamlessly integrated with Elysia with minimal setup. Zustand: Lightweight and powerful state management compared to Redux. Shadcn: A collection of reusable components. Tanstack: Minimize boilerplates such as virtualization, table, and query. Valibot: A shared schemas between backend and frontend for validation and type inference. Kiosk OS Base OS: Custom immutable image built on Universal Blue with full-disk encryption. Lockdown: Enforced kiosk mode with full-screen application access and restricted system functions. Hardware Security: Configured BIOS passwords and disabled boot modifications to prevent unauthorized access. Stateless Design: No persistent user data; system resets to a secure baseline on reboot to mitigate tampering.",{"id":124,"title":123,"titles":406,"content":407,"level":245},[],"An IoT project for FMT OpenRemote. Assigned to learn OpenRemote, the open-source project. Worked as IoT Developer and DevOps. Responsibilities: Learn OpenRemote for familiarizing with OpenRemote's architecture, features, and configuration. MQTT integration as a communication between the devices and OpenRemote. developed script for GPS tracking on trucks and temperature monitoring for cold storage units. Deploy OpenRemote on server through Docker.",{"id":128,"title":127,"titles":409,"content":410,"level":245},[],"A company profile project for PT. Nusantara Agro Mandiri. A company profile website for PT. Nusantara Agro Mandiri, a cold chain services company. Built with Nuxt Content and running on the Bun runtime, managed under PM2. The site serves as the primary digital presence for PT. Nusantara Agro Mandiri. Its content is managed by the marketing team through Nuxt Studio, minimizing direct developer involvement with the codebase.",{"id":412,"title":248,"titles":413,"content":414,"level":251},"\u002Fexperience\u002Ffajar-mulia-transindo\u002Fpt-nam-company-profile#features",[127],"Company Profile Pages Structured content powered by Nuxt Content. SEO Optimization Out-of-the-box SEO features via Nuxt SEO. Image Optimization Smart scanning of content images results in prerendered images of Nuxt Image under Bun preset. This overcomes the typical limitations of prerendering found in non-static presets. Marketing Team Ownership Marketing team maintains and updates content independently via Nuxt Studio. Secure Forms Protected by invisible Cloudflare Turnstile with additional undisclosed security layers.",{"id":132,"title":131,"titles":416,"content":417,"level":245},[],"A legacy ERP logistic and transportations. A legacy ERP logistics and transportation. Responsibilities: Reduced a BUNCH of technical debt (approximately around 44k issues based on SonarQube reports). Resolved critical concurrency issues by implementing:\nAtomic upserts and improved contention models Deadlock elimination Detection and correction of silent errors Refactoring aligned with DRY principles stress testing using low-level shell tooling Standardized internal terminology by translating non-standard team vocabulary into industry-accepted concepts (e.g., \"Scalar\" as file, PDF \"line height\" as font height). Invoice integration with Meksmart. Optimized high-load report generation using chunked processing and Server-Sent Events. Isolated development with Distrobox to simplify onboarding setup, avoiding the hassle of outdated runtimes and dependencies.",{"id":58,"title":57,"titles":419,"content":420,"level":245},[],"A simple sandbox for experimenting with various pretrained AI models. Simple sandbox using Dev Containers for experimenting with various pretrained models. The base image using pytorch\u002Fpytorch:2.3.1-cuda11.8-cudnn8-devel. The image size is quite large, around 18.08GB. However, it should be reasonable considering the inclusion of GPU support and some AI libraries. For more details visit my AI Sandbox repository.",{"id":62,"title":61,"titles":422,"content":423,"level":245},[],"A comprehensive project exploring various generative AI models. The project focuses on four distinct generative tasks, namely text-to-image, image-to-image, text-to-video, and image-to-video, utilizing pretrained models licensed under MIT by Stability AI. This comprehensive approach, coupled with the choice of user-friendly tools and a permissive license, reflects a well-rounded strategy, not only in terms of technical implementation but also in accessibility and community collaboration.",{"id":66,"title":65,"titles":425,"content":426,"level":245},[],"A personal extension that can improve productivity.",{"id":99,"title":98,"titles":428,"content":429,"level":245},[],"Streamlined risk assessment, enhanced risk analytics, and mitigated financial and operational risks. Tackled urgent tasks immediately, reflecting team confidence amidst high responsibility and complex risk management challenges. A project about Enterprise Risk Management (ERM) that aims to streamline risk assesment processes, improve data visualization for risk analytics, and ensure a responsive and efficient UI. And its manage to mitigate various financial and operational risks effectively. I joined the project without any interview. Instead, due to urgent situation, I was immediately entrusted with numerous tasks, reflecting the team's confidence in my skills and sense of responsibility. Responsibilities: Handle Progress LPRO module. Handle KRI module. Handle CT module. Challenges: Urgency: The project faced critical issues requiring immediate attention and action to meet tight deadlines and address pressing concerns. High Responsibility: Being tasked with urgent assignments placed significant responsibility on me to deliver results promptly and effectively, despite the time constraints. Complex Risk Management: Managing diverse financial and operational risks demanded a deep understanding of risk management principles and the ability to devise effective mitigation strategies.",{"id":103,"title":102,"titles":431,"content":432,"level":245},[],"This project is the financial management for all Telkom schools. Responsibilities: Create Drafting RKA module. Create Expense Spending Input module. Create School Financial Report module. Create Policies and Guidelines module.",{"id":107,"title":106,"titles":434,"content":435,"level":245},[],"Simple project for my parents to track finance management.",{"id":70,"title":69,"titles":437,"content":438,"level":245},[],"A simple classification that predict image is cat or dog. A simple classification that predict image is cat or dog. Training the model first. Then trained model put on backend. Finally the frontend hit API for predict image.",{"id":74,"title":73,"titles":440,"content":441,"level":245},[],"My portfolio website containing overall about me, detail of my experiences, journey, and generate the PDF.",{"id":141,"title":140,"titles":443,"content":444,"level":245},[],"Developed a financing feature that allowed sellers to take loans from specific financial institutions. Managed unique vendor integrations, VPN access complexities, and ensured robust data security through direct collaboration and customized solutions. PaDiUMKM is a Telkom Indonesia platform initiated by the Ministry of BUMN. Responsibilities: As backend for admin, seller, and finance teams Disbursement transaction functionality on admin CMS Voucher Notification Scheduler Detailed Experience: During the course of the project, I was assigned to multiple teams as a backend developer, contributing to the administrative, seller, and finance functionalities. However, the project took an unexpected turn as September 2022 approached, and we realized that we had a three-day event for the Indonesian Ministry of BUMN rapidly approaching. To make matters more challenging, the deadline for deploying the production version of the project was set three days prior to the event, a detail that had been established at the project's inception a year prior. Recognizing the significance of the event, our teams willingly dedicated themselves to overtime work in order to expedite our tasks and ensure the timely completion of the project. Remarkably, even our CEO and CTO joined us during these intense sessions, actively participating and guiding us through the process. Moreover, they took on the responsibility of handling client communication alongside our project managers. The involvement of our client in the session further emphasized the importance of the project. As expected, the combination of tight deadlines, immense pressure, and prolonged working hours took a toll on our physical and mental well-being. Many team members, including myself, fell ill due to the strain. Additionally, certain internal dramas within the team temporarily hampered our progress, adding to the challenges we faced. Initially, our regular overtime hours extended until 11:00 PM, but as the week leading up to the production deployment approached, we found ourselves working until the early hours of the morning, often until 4:00 AM or 5:00 AM, only to resume our regular work schedule at 8:00 AM. Despite these grueling hours, we remained determined to deliver the best possible outcome for our client. Upon deploying the production version of the project, we encountered several issues stemming from the project's complexity. However, we promptly engaged in hotfixing the bugs to ensure a smooth experience for the users. Unfortunately, we were unable to address all the issues before the commencement of the big event. Consequently, our top priority shifted to fixing any bugs that arose during the event itself, adding further pressure to an already demanding situation. Understandably, the customer's satisfaction was negatively impacted by the unresolved issues, resulting in a deluge of unfavorable reviews. This placed even more strain on our team, intensifying the pressure we felt. However, three days after the event concluded, our client expressed understanding and approval of the tremendous effort we had put into the project, acknowledging the challenges we faced. While they recognized that there were still minor and major bugs to be resolved post-event, they were appreciative of our overworked efforts. To celebrate the completion of the project and acknowledge our dedication, our CEO generously offered us a feast. Additionally, our overtime work was duly compensated with an unusual overtime pay, highlighting the significance of our contributions and recognizing the exceptional circumstances under which we had operated. Challenges as Finance Teams: One significant feature I've been involved in is finance, allowing sellers to borrow funds from specific vendors. This feature involves direct collaboration and discussions from specific vendors. I have been deeply involved in the development of the finance feature. This has entailed direct communication and collaboration with multiple vendors, including Pegadaian, PNM, BRI Bank, Mandiri Bank, BTN Bank, Koinworks, and Investree. Through discussions with these vendors, I've contributed to shaping the feature's requirements and functionality, ensuring seamless integration with their systems while safeguarding data privacy and security. Vendor-Specific Integration: Coordinating with multiple vendors presented the challenge of accommodating their unique integration requirements. Each vendor had its own flow, making it impractical to develop a one-size-fits-all solution. This requires integration processes and APIs to align with each vendor's different workflows. Access Complexity: Some vendors mandated the use of VPNs for accessing their systems, adding an additional layer of complexity to the integration process. Managing VPN connections and ensuring secure data transmission posed logistical and technical challenges that needed to be addressed effectively. Data Sensitivity: Handling sensitive seller data required implementing robust security measures to safeguard privacy and prevent unauthorized access or data breaches.",{"id":111,"title":110,"titles":446,"content":447,"level":245},[],"ERP project for internet service provider. Responsibilities: Create a Product module. Create a Bundle Product module. Create a Promo Bundle module. Create a Custom Bundle Price module. Create a Hirarki Sales module. Create a Insentif Sales module. Create a Vendor module. Create a Billing Profile module. Create a Content Management module.",{"id":145,"title":144,"titles":449,"content":450,"level":245},[],"Factory management project with complex real-time calculations and a custom timeline chart feature. A factory management project, the complexity lies in precise real-time calculations, designed to display real-time calculation data if available, otherwise presenting pre-generated results. The timeline chart feature is developed entirely from scratch due to its intricate design and functionality tailored to client needs. For instance, the timeline's maximum duration is dynamically determined by the team's shift times, which can vary based on administrative inputs. Additionally, during chart runtime, users can input or scan data to generate reports reflecting activities at specific times. I was involved in implementing the complex timeline chart feature. This required close collaboration with stakeholders to understand their requirements thoroughly and translate them into a functional and intuitive user interface. I was tasked with architecting the real-time calculation engine, ensuring accuracy and efficiency in generating timeline data and reports. Responsibilities: Create a real-time timeline chart. Create an emergency call to users that have a higher role. Auto generate monthly reports based on category module. Create an Active Planned module. Create an Active Unplanned module. Create an Area module. Create a Category module. Create a Timesheet module. Challenges: Precision in Real-Time Calculations: Developing algorithms capable of accurately calculating and updating real-time data, such as timeline charts, requiring meticulous attention to detail and rigorous testing. Custom Timeline Chart Development: Building the timeline chart feature from scratch due to its unique design requirements. Such as accommodating varying shift times and enabling real-time data input. Integration of User Input and Scanning: Incorporating functionalities for users to input or scan data during chart runtime required seamless integration with the timeline interface while ensuring data integrity and system stability.",{"id":78,"title":77,"titles":452,"content":453,"level":245},[],"Bot that move based that statistic data and training with certain flags.",{"id":149,"title":148,"titles":455,"content":456,"level":245},[],"A legacy booking and tracking system for ships. A legacy booking and tracking system for ships, developed using CodeIgniter framework. My role in this project primarily focused on bug fixing, specifically addressing issues identified in the SonarQube report. Remarkably, the report highlighted over 7000 bugs across various severity levels, including minor, major, and critical. In less than two months, I managed to resolve all reported bugs. I was assigned the responsibility of rectifying the numerous bugs flagged by the SonarQube report in the Meratus project. This involved meticulously analyzing each reported issue, understanding its impact on system functionality, and implementing effective solutions to eliminate them. My efforts were aimed at enhancing the stability, performance, and security of the application by addressing the identified bugs. Responsibilities: Fix minor, major, and critical bugs from SonarQube (7000+ bugs) Create a Booking Dashboard. Create a Cargo Protection. Create a My Palisade. Challenges: Volume of Bugs: Dealing with over 7000 bugs required careful planning and systematic approach to ensure comprehensive coverage. Diverse Severity Levels: The reported bugs encompassed a wide range of severity levels, from minor issues to critical flaws affecting system functionality and security. Legacy Codebase: Working within a legacy CodeIgniter codebase posed additional challenges, including navigating through complex and possibly outdated code structures, limited documentation, and potential dependencies on deprecated libraries or features.",{"id":153,"title":152,"titles":458,"content":459,"level":245},[],"A E-Commerce project similar to IKEA. Responsibilities: Fix major and critical bugs.",{"id":157,"title":156,"titles":461,"content":462,"level":245},[],"A ads manager project. Responsibilities: Fix minor and major bugs. Create HOC world chart.",{"id":161,"title":160,"titles":464,"content":465,"level":245},[],"A certificate generator for The Hwa Chong Institution Integrated Programme. A certificate generator. Responsibilities: Create a HOC table that can be used on most pages. Fix the certificate generator in certain cases. Generate certificates that can be verified by The Hwa Chong Institution Integrated Programme.",{"id":165,"title":164,"titles":467,"content":468,"level":245},[],"A job finder application focused on Southeast Asia, featuring dynamic modules for articles, careers, and job listings. A Job finder that based on Southeast Asia location. Responsibilities: Create a Article module, similar to social media posts. Create a Career module, similar to the Article module. Create a CrelateJob module, retrieve all jobs from CrelateJob daily. Create a Menu module, dynamic navbar in frontend page. Create a Homepage module, dynamic position, text, and image for landing page. Create a Service module, similar to Article module. Create a Setting module, basic information like logo, company name, address, etc.",{"id":82,"title":81,"titles":470,"content":471,"level":245},[],"A personal use Discord music bot designed for cost-efficient deployment and optimized performance on minimal server resources. A lightweight, personal-use Discord music bot designed for cost-efficient deployment and optimized performance on minimal server resources. Hosting: Fly.io (Legacy Hobby plan, Singapore) Resources: Shared CPU (x1) + 256MB RAM Cost: ~$1.40\u002Fmonth (effectively free since Fly.io waives costs under $5\u002Fmonth for legacy users) The bot's architecture is highly optimized, ensuring smooth operation within strict resource limits. Optimization Highlights: OpenSSL: Provides secure TLS\u002FSSL connections required for encrypted audio streaming. Opus: High-performance audio codec for low-latency, high-quality voice transmission in Discord. Sodium: Cryptographic library used for authentication and secure voice communication. FFmpeg: Custom-built from source, stripped to essential configs for efficient streaming. Alpine: Ultra-lightweight base image utilizing multi-stage builds for optimized production deployment.\nBase image: alpine:x.x ~12.79 MB Compiled executable: ~116.1 MB (via bun build --compile --bytecode ...)\nBun runtime: ~104.82 MB N-API modules:\nDAVE (Discord Audio & Video E2EE): ~1.7 MB Opus: ~0.58 MB App size: 1 MB Precompiled bytecode: ~8 MB FFmpeg size: ~17.5 MB (via .\u002Fconfigure --disable-everything ... && make install) Custom patches: Implement static-analysis-friendly modifications for the Bun compiler.\nSubstitute dynamic NAPI imports from prism-media with a static import of opus.node Replace the dynamic detection of FFmpeg sources from prism-media with a static ffmpeg command Eliminate the ws dependency from @discordjs\u002Fvoice and @discordjs\u002Fws by using Bun's native WebSocket Development History: ~2018: Cloned MusicBot for quick launch locally ~2021: Write own bot in Discord.js and Distube ~2022: Migrated to TypeScript, Dockerized, added Dependabot, and deployed to Fly.io ~2023: Gradual migration to Bun; tweaking custom FFmpeg builds to fix OOM issues caused by npm-installed FFmpeg binary Late 2024: Fully stable on Bun. The final build is significantly reduced from ~300 MB to 1 MB Mid 2025: Deployed to the home server due to some music providers banned the Fly.io IPs Late 2025: Further optimization through custom patches, compiling with Bun, and using a highly stripped-down FFmpeg build (--disable-everything) Late 2026: Rewrite in Serenity, changed home server OS from Ubuntu Server to the uCore, and self-host Invidious instance instead of using yt-dlp. See Another Discord Bot for more details.",{"id":86,"title":85,"titles":473,"content":474,"level":245},[],"A very lightweight daily cronjob that checks whether today or tomorrow is a holiday and fetches the latest game releases. A very lightweight daily cronjob (6.5MB binary size) that checks whether today or tomorrow is a holiday and fetches the latest game releases. Previously, it relied on Discord Webhook for around six years. In late 2026, it was migrated to Fluxer Webhook.",{"id":174,"title":173,"titles":476,"content":477,"level":245},[],"Generate WhatsApp widget based on user input.",{"id":178,"title":177,"titles":479,"content":480,"level":245},[],"A video call with chat feature.",{"id":182,"title":181,"titles":482,"content":483,"level":245},[],"Generate text from UQL query with random background image.",{"id":186,"title":185,"titles":485,"content":486,"level":245},[],"Generate multiple texts with random background image.",{"id":190,"title":189,"titles":488,"content":489,"level":245},[],"Track daily report through user's email.",{"id":194,"title":193,"titles":491,"content":492,"level":245},[],"A report generator for project management.",{"id":198,"title":197,"titles":494,"content":495,"level":245},[],"A project monitoring with user management, employee, client, skill, role, and public holiday.",{"id":202,"title":201,"titles":497,"content":498,"level":245},[],"A postage calculator using Raja Ongkir API to calculate shipping costs in Indonesia.",{"id":206,"title":205,"titles":500,"content":501,"level":245},[],"Organization chart generator using Balkan OrgChart library.",{"id":210,"title":209,"titles":503,"content":504,"level":245},[],"A link generator that linked to user's social media accounts.",{"id":214,"title":213,"titles":506,"content":507,"level":245},[],"A simple invoice generator.",{"id":218,"title":217,"titles":509,"content":510,"level":245},[],"A simple image-based search engine.",{"id":222,"title":221,"titles":512,"content":513,"level":245},[],"A performance comparison between Eloquent, DB, and raw query.",{"id":115,"title":114,"titles":515,"content":516,"level":245},[],"Freelance project to create a company profile website for Yayasan BPI. Got a freelance during my school to make a company profile website for Yayasan BPI. The website is built using Laravel and Bootstrap, with jQuery for some interactive features. It also includes Tawk.to for live chat support.",{"id":231,"title":230,"titles":518,"content":519,"level":245},[],"Final exam project about forum that similar to StackOverflow. It has developer mode to access post, article, and company data.",{"id":235,"title":234,"titles":521,"content":522,"level":245},[],"A project-based competition web development with national region. Won as 2nd place. A project-based competition web development with national region. Won as 2nd place. This project is a consulting website that focused on students by providing questionnaires to check their mental health and personality test or chat directly to the teacher.",{"id":239,"title":238,"titles":524,"content":525,"level":245},[],"A live-code competition with schools in Bandung. And won as 2nd place.",[527,540,549,557,563,573,588],{"label":528,"to":45,"children":529},"Self-Taught",[530,531,532,533,534,535,536,537,538,539],{"label":49,"to":50},{"label":53,"to":54},{"label":57,"to":58},{"label":61,"to":62},{"label":65,"to":66},{"label":69,"to":70},{"label":73,"to":74},{"label":77,"to":78},{"label":81,"to":82},{"label":85,"to":86},{"label":10,"to":11,"children":541},[542,543,544,545,546,547,548],{"label":15,"to":16},{"label":19,"to":20},{"label":23,"to":24},{"label":27,"to":28},{"label":31,"to":32},{"label":35,"to":36},{"label":39,"to":40},{"label":89,"to":90,"children":550},[551,552,553,554,555,556],{"label":94,"to":95},{"label":98,"to":99},{"label":102,"to":103},{"label":106,"to":107},{"label":110,"to":111},{"label":114,"to":115},{"label":558,"to":119,"children":559},"PT. Fajar Mulia Transindo",[560,561,562],{"label":123,"to":124},{"label":127,"to":128},{"label":131,"to":132},{"label":564,"to":136,"children":565},"PT. Smooets Teknologi Outsourcing",[566,567,568,569,570,571,572],{"label":140,"to":141},{"label":144,"to":145},{"label":148,"to":149},{"label":152,"to":153},{"label":156,"to":157},{"label":160,"to":161},{"label":164,"to":165},{"label":168,"to":169,"children":574},[575,576,577,578,579,580,581,582,583,584,585,586,587],{"label":173,"to":174},{"label":177,"to":178},{"label":181,"to":182},{"label":185,"to":186},{"label":189,"to":190},{"label":193,"to":194},{"label":197,"to":198},{"label":201,"to":202},{"label":205,"to":206},{"label":209,"to":210},{"label":213,"to":214},{"label":217,"to":218},{"label":221,"to":222},{"label":225,"to":226,"children":589},[590,591,592],{"label":230,"to":231},{"label":234,"to":235},{"label":238,"to":239},{"id":594,"title":15,"body":595,"company":664,"description":665,"extension":666,"image":667,"key":668,"meta":669,"navigation":670,"path":16,"seo":671,"skills":672,"stem":17,"__hash__":678},"experience\u002Fexperience\u002Fopen-source\u002Fanother-discord-bot.md",{"type":596,"value":597,"toc":659},"minimark",[598,608,612,638,641,644],[599,600,601,602],"p",{},"Yet another music bot. Source code available at ",[603,604,605],"a",{"href":605,"rel":606},"https:\u002F\u002Fcodeberg.org\u002FAnOrdinaryPeople\u002Fdc-music-bot",[607],"nofollow",[609,610,248],"h2",{"id":611},"features",[613,614,615,619,626,629],"ul",{},[616,617,618],"li",{},"Integrates with a self-hosted Invidious for audio streaming, replacing yt-dlp",[616,620,621,622,625],{},"Reduces compiled size from ",[603,623,624],{"href":82},"116.1 MB"," to 28.2 MB",[616,627,628],{},"Handles DAVE and Opus at a lower level via Songbird, eliminating the N-API bridge",[616,630,631,632,637],{},"Home server OS moved to ",[603,633,636],{"href":634,"rel":635},"https:\u002F\u002Fgithub.com\u002Fublue-os\u002Fucore",[607],"uCore"," for its immutable and atomic updates, easing long-term maintenance",[609,639,254],{"id":640},"why-rewrite",[599,642,643],{},"Rewritten in Serenity after DisTube's yt-dlp fork was publicly archived, with youtubei.js mentioned as the intended replacement but never made compatible with the existing DisTube setup.",[599,645,646,647,652,653,658],{},"Moving off yt-dlp\u002Fyoutubei.js in favor of a self-hosted Invidious instance also sidesteps the recurring IP-ban and extractor-breakage issues that shaped much of the bot's prior history, while the switch from Bun to Serenity\u002FSongbird. Songbird's use of ",[603,648,651],{"href":649,"rel":650},"https:\u002F\u002Fgithub.com\u002Fpdeljanov\u002FSymphonia",[607],"Symphonia"," and ",[603,654,657],{"href":655,"rel":656},"https:\u002F\u002Fgithub.com\u002Fcijiugechu\u002Fopus2",[607],"opus2"," for decoding further removes the need to maintain a custom FFmpeg build, cutting another source of operational upkeep.",{"title":660,"searchDepth":251,"depth":251,"links":661},"",[662,663],{"id":611,"depth":251,"text":248},{"id":640,"depth":251,"text":254},"Self-taught Projects","Another Discord music bot rewritten in Rust.","md","\u002Fimages\u002Fexp-49.webp",49,{},true,{"title":15,"description":665},[673,674,675,676,677],"https:\u002F\u002Finvidious.io\u002F__https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FInvidious-00B6F0?style=for-the-badge&logo=invidious&logoColor=fff","https:\u002F\u002Fwww.rust-lang.org\u002F__https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FRust-000?style=for-the-badge&logo=rust&logoColor=fff","https:\u002F\u002Fgithub.com\u002Fserenity-rs\u002Fserenity__https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSerenity-gray?style=for-the-badge","https:\u002F\u002Fgithub.com\u002Fserenity-rs\u002Fsongbird__https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSongbird-gray?style=for-the-badge","https:\u002F\u002Fpodman.io\u002F__https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPodman-892CA0?style=for-the-badge&logo=podman&logoColor=fff","Cfeh2D-9iFOTLE0KeWtoE0vf8wIFrG3pQHpm4uQYwjs",[680,681],null,{"title":19,"path":20,"stem":21,"description":682,"children":-1},"A collection of optimization and compatibility experiments.",1794206156639]