<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Joshua Palti Sinaga</title><description>Portfolio and writing of Joshua Palti Sinaga, a software engineer building web, mobile, AI, and IoT products.</description><link>https://itsjo.dev/</link><language>en</language><item><title>Make Your Windows 10 Feel Fresh Again</title><link>https://itsjo.dev/blogs/make-windows-10-feel-fresh-again/</link><guid isPermaLink="true">https://itsjo.dev/blogs/make-windows-10-feel-fresh-again/</guid><description>My practical Windows 10 cleanup routine after lag, crashes, and a surprisingly busy system process started getting in the way.</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My Windows 10 computer had started feeling tired. Not dramatically broken, just slow in the annoying way that makes every small ta~sk feel like a negotiation.&lt;/p&gt;
&lt;p&gt;I noticed it while working on a project using &lt;a href=&quot;https://getomp.sh/&quot;&gt;Oh My Pi&lt;/a&gt; and &lt;a href=&quot;https://onorca.dev/&quot;&gt;Orca&lt;/a&gt;. Oh My Pi kept lagging and eventually crashed. Since blaming the computer is easier than blaming my code, I opened Task Manager to investigate.&lt;/p&gt;
&lt;p&gt;One process immediately caught my attention: &lt;code&gt;Service Host: Network Service&lt;/code&gt;. It was using around 30-50% of my CPU.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image1.png&quot; alt=&quot;Windows 10 Task Manager showing high CPU usage from Service Host: Network Service&quot;&gt;&lt;/p&gt;
&lt;p&gt;Because this is an internal Windows process, my first thought was, &amp;quot;Great, is this a virus now?&amp;quot; It might have been a problem with another program using the service, or it might have been something else entirely. I did not know yet, but the symptoms kept piling up.&lt;/p&gt;
&lt;p&gt;Apps started lagging, running out of memory, or crashing. Even Discord became unreliable while I was sharing my screen with a friend and talking about vibe UI/UX. A crash in the middle of a design discussion is a very effective way to make the design less fun.&lt;/p&gt;
&lt;p&gt;That was my sign to clean up Windows. I realized I had not done a proper cleanup in roughly one or two years, so I decided to give the system a deep-cleaning session.&lt;/p&gt;
&lt;h2&gt;Step 1: Scan for malware&lt;/h2&gt;
&lt;p&gt;First, I ran antivirus tools. Please do not use cracked antivirus software. It is a little difficult to improve your computer&apos;s security by installing a mystery program from a suspicious website.&lt;/p&gt;
&lt;p&gt;Free tools are fine if you choose reputable ones. I used Avast Free together with Malwarebytes Free, then ran file scans. They found several suspicious files and quarantined them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image2.png&quot; alt=&quot;Antivirus scan showing detected files in Windows 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Before permanently deleting quarantined files, review what was found. Antivirus tools can sometimes flag a clean and familiar program by mistake. Do not restore something obviously suspicious, but do make sure you understand what you are removing. Once you&apos;re done, you can keep the antivirus programs installed or uninstall them. I prefer uninstalling them afterward.&lt;/p&gt;
&lt;h2&gt;Step 2: Repair Windows system files&lt;/h2&gt;
&lt;p&gt;Next, I used Windows&apos; built-in repair tools. These check different parts of the operating system and can fix damaged files.&lt;/p&gt;
&lt;p&gt;Open Command Prompt or PowerShell as an administrator, then run these commands one at a time.&lt;/p&gt;
&lt;h3&gt;Check protected system files with SFC&lt;/h3&gt;
&lt;p&gt;System File Checker, or SFC, checks protected Windows files and replaces damaged or missing versions with correct copies.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;sfc /scannow
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Repair the Windows image with DISM&lt;/h3&gt;
&lt;p&gt;DISM stands for Deployment Image Servicing and Management. It repairs the Windows system image, which is the source Windows uses for system files. It can help when SFC cannot finish the repair on its own.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;dism /online /cleanup-image /restorehealth
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Check the drive with CHKDSK&lt;/h3&gt;
&lt;p&gt;CHKDSK checks the file system on your hard drive or SSD. The &lt;code&gt;/f&lt;/code&gt; option fixes logical errors, while &lt;code&gt;/r&lt;/code&gt; looks for bad sectors and tries to recover readable data.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;chkdsk /f /r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This last command can take a long time, especially on a large or older drive. Windows may ask to schedule the scan for the next restart, so save your work first.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image3.png&quot; alt=&quot;Windows system repair tools running in an administrator terminal&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Remove unnecessary files&lt;/h2&gt;
&lt;p&gt;For the cleanup itself, I used &lt;a href=&quot;https://github.com/bleachbit/bleachbit&quot;&gt;BleachBit&lt;/a&gt;, a free and open-source tool for removing cache files, logs, and other digital leftovers.&lt;/p&gt;
&lt;p&gt;I mainly used it to clean cached files and logs. I expected that to free some space, but I did not think it would make such a big difference. It freed around 8 GB from my system drive. Not bad for cleaning up what looked like simple leftovers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image4.png&quot; alt=&quot;BleachBit cleaning temporary files and freeing disk space&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Step 4: Review Windows settings carefully&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/christitustech/winutil&quot;&gt;Chris Titus Windows Utility&lt;/a&gt; should already be familiar to many people in IT, haha. It is a popular tool for fine-tuning Windows from one place. I used it to disable a few Windows 10 features I did not need, including Windows Update, Windows Defender, and some others.&lt;/p&gt;
&lt;p&gt;Open the &lt;strong&gt;Tweaks&lt;/strong&gt; tab, choose the &lt;strong&gt;Standard&lt;/strong&gt; preset, and click &lt;strong&gt;Run Tweaks&lt;/strong&gt;. Here are the tweaks I used:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image5.png&quot; alt=&quot;Chris Titus Windows Utility showing the selected Windows tweaks&quot;&gt;&lt;/p&gt;
&lt;p&gt;The utility also includes update-related settings:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image6.png&quot; alt=&quot;Chris Titus Windows Utility showing update-related settings&quot;&gt;&lt;/p&gt;
&lt;p&gt;For my setup, I always disable Windows Update when it keeps consuming too many resources or repeatedly causes new crashes. Turning updates off made the system feel much more stable. Just remember that you will need to manage updates manually later, especially security updates.&lt;/p&gt;
&lt;h2&gt;The result&lt;/h2&gt;
&lt;p&gt;After the cleanup, my computer felt much more responsive. Coding became enjoyable again, applications stopped crashing, and Discord went from barely opening to working normally. Don&apos;t ask me why Discord suddenly recovered. Maybe it was the cleanup, maybe it was a combination of repairs, or maybe Discord simply decided to forgive me. Let&apos;s just call it a small Discord miracle. Either way, I was happy to stop troubleshooting and get back to work.&lt;/p&gt;
&lt;p&gt;Here is the result after the cleanup:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/5.make-windows-10-feel-fresh-again/image7.png&quot; alt=&quot;Windows 10 Task Manager showing normal resource usage after the cleanup&quot;&gt;&lt;/p&gt;
&lt;p&gt;CPU usage and the other resource numbers look much more normal, even with several applications running.&lt;/p&gt;
&lt;p&gt;This is not a guaranteed cure for every Windows problem, but it gave my aging installation a fresh start. If you have another Windows cleanup trick that works for you, feel free to share it.&lt;/p&gt;
</content:encoded><category>windows-10</category><category>troubleshooting</category><category>system-maintenance</category><category>open-source</category></item><item><title>Setting Up Claude Code with a Custom Provider</title><link>https://itsjo.dev/blogs/claude-code-custom-provider/</link><guid isPermaLink="true">https://itsjo.dev/blogs/claude-code-custom-provider/</guid><description>A friendly walkthrough for connecting Claude Code to a custom provider like 9router with a few settings in one file.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Claude Code is a handy coding agent that runs right in your terminal. By default it uses Anthropic models through Anthropic&apos;s own API, but you can point it at a custom provider like 9router for more model options, often at a lower cost. I covered 9router in detail in &lt;a href=&quot;https://itsjo.dev/blogs/setting-up-9router-in-pi-dev&quot;&gt;this guide&lt;/a&gt;, and the whole setup here is just a few lines in one JSON file.&lt;/p&gt;
&lt;h2&gt;Quick setup&lt;/h2&gt;
&lt;p&gt;In a hurry? Replace the credentials below and copy this prompt to your coding agent in the terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;Configure Claude Code custom provider in `settings.json`.

Detect the OS and use:
* Windows: `%USERPROFILE%\.claude\settings.json`
* Linux/WSL/macOS: `~/.claude/settings.json`

Create or update the file, preserving existing settings. Add/replace `env` with:

{
  &amp;quot;ANTHROPIC_API_KEY&amp;quot;: &amp;quot;&amp;lt;API_KEY&amp;gt;&amp;quot;,
  &amp;quot;ANTHROPIC_BASE_URL&amp;quot;: &amp;quot;&amp;lt;BASE_URL&amp;gt;&amp;quot;,
  &amp;quot;ANTHROPIC_DEFAULT_OPUS_MODEL&amp;quot;: &amp;quot;&amp;lt;MODEL&amp;gt;&amp;quot;,
  &amp;quot;ANTHROPIC_DEFAULT_SONNET_MODEL&amp;quot;: &amp;quot;&amp;lt;MODEL&amp;gt;&amp;quot;,
  &amp;quot;ANTHROPIC_DEFAULT_HAIKU_MODEL&amp;quot;: &amp;quot;&amp;lt;MODEL&amp;gt;&amp;quot;
}

Ask for missing API key, base URL, or model. Keep valid JSON and do not expose the full API key.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 1: Install Claude Code&lt;/h2&gt;
&lt;p&gt;If you do not have Claude Code yet, install it first.&lt;/p&gt;
&lt;p&gt;macOS and Linux: open your terminal and run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://claude.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows (PowerShell): run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;irm https://claude.ai/install.ps1 | iex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alternative on macOS with Homebrew:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install --cask claude-code
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/4.claude-code-custom-provider/image1.png&quot; alt=&quot;Terminal showing Claude Code installed successfully&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Step 2: Configure the Custom Provider&lt;/h2&gt;
&lt;p&gt;Claude Code reads its settings from a &lt;code&gt;settings.json&lt;/code&gt; file. The location depends on your OS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows: &lt;code&gt;C:\Users\&amp;lt;YourUsername&amp;gt;\.claude\settings.json&lt;/code&gt; (resolves from &lt;code&gt;%USERPROFILE%\.claude\settings.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Linux / WSL: &lt;code&gt;~/.claude/settings.json&lt;/code&gt; (resolves to &lt;code&gt;/home/&amp;lt;username&amp;gt;/.claude/settings.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;macOS: &lt;code&gt;~/.claude/settings.json&lt;/code&gt; (resolves to &lt;code&gt;/Users/&amp;lt;username&amp;gt;/.claude/settings.json&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Open the file and add your custom provider configuration inside the &lt;code&gt;env&lt;/code&gt; block. For example, with 9router it looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;env&amp;quot;: {
    &amp;quot;ANTHROPIC_API_KEY&amp;quot;: &amp;quot;YOUR_CUSTOM_PROVIDER_API_KEY&amp;quot;,
    &amp;quot;ANTHROPIC_BASE_URL&amp;quot;: &amp;quot;http://localhost:20218/v1&amp;quot;,
    &amp;quot;ANTHROPIC_DEFAULT_OPUS_MODEL&amp;quot;: &amp;quot;provider-name/model-name&amp;quot;,
    &amp;quot;ANTHROPIC_DEFAULT_SONNET_MODEL&amp;quot;: &amp;quot;provider-name/model-name&amp;quot;,
    &amp;quot;ANTHROPIC_DEFAULT_HAIKU_MODEL&amp;quot;: &amp;quot;provider-name/model-name&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;env&lt;/code&gt; block sets environment variables for Claude Code. &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; points to your provider&apos;s endpoint, and the model variables pick which model each Claude Code tier uses.&lt;/p&gt;
&lt;p&gt;Fun fact: the hardest part of this step is usually remembering where you put the comma 🫪&lt;/p&gt;
&lt;h2&gt;Step 3: Verify the Configuration&lt;/h2&gt;
&lt;p&gt;Save the file and start Claude Code from your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;claude
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will be asked to confirm that you want to use your custom API key. Select yes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/4.claude-code-custom-provider/image2.png&quot; alt=&quot;Claude Code prompt asking to confirm the custom API key&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then check the header: it should show your selected custom model. Try sending a message to confirm everything responds correctly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/4.claude-code-custom-provider/image3.png&quot; alt=&quot;Claude Code terminal showing the selected custom model after the setup is done&quot;&gt;&lt;/p&gt;
&lt;p&gt;And you are good to go. Claude Code now runs with your custom provider.&lt;/p&gt;
</content:encoded><category>claude-code</category><category>9router</category><category>llm</category><category>coding-agent</category></item><item><title>Setting Up 9router in Pi.dev</title><link>https://itsjo.dev/blogs/setting-up-9router-in-pi-dev/</link><guid isPermaLink="true">https://itsjo.dev/blogs/setting-up-9router-in-pi-dev/</guid><description>A friendly walkthrough for connecting 9router to Pi.dev with the better-custom provider package.</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A clean agentic developer workflow is much nicer when model routing stays in one place. Pi.dev already works well from the terminal, and 9router can add a local routing layer for choosing which models power each session.&lt;/p&gt;
&lt;p&gt;9router has become popular because it makes model switching feel simple. It can sit between your tools and different LLM providers, expose an OpenAI-compatible endpoint, and keep routing rules in one local dashboard. That is helpful when testing many models, comparing responses, or keeping a coding agent setup flexible without changing every app config.&lt;/p&gt;
&lt;p&gt;This guide walks through connecting &lt;strong&gt;9router&lt;/strong&gt; to Pi.dev with the &lt;code&gt;better-custom&lt;/code&gt; package. After setup, Pi.dev can use models from a local 9router provider without needing a separate config for every model.&lt;/p&gt;
&lt;p&gt;This walkthrough follows the flow from my &lt;a href=&quot;https://www.instagram.com/p/DX0ydqivxLQ/&quot;&gt;Instagram Post&lt;/a&gt;, with a bit more context for each screen.&lt;/p&gt;
&lt;h2&gt;What this setup does&lt;/h2&gt;
&lt;p&gt;The goal is simple: connect Pi.dev to a local 9router endpoint using an OpenAI-compatible provider.&lt;/p&gt;
&lt;p&gt;For this setup, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pi.dev&lt;/li&gt;
&lt;li&gt;9router&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;better-custom&lt;/code&gt; Pi package&lt;/li&gt;
&lt;li&gt;a local 9router API endpoint&lt;/li&gt;
&lt;li&gt;a 9router API key&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once everything is connected, Pi.dev can see the models exposed by 9router and use them like any other provider.&lt;/p&gt;
&lt;h2&gt;Step 1: Find the better-custom package&lt;/h2&gt;
&lt;p&gt;Open the Pi.dev website and go to the Packages section.&lt;/p&gt;
&lt;p&gt;Search for &lt;a href=&quot;https://pi.dev/packages/better-custom&quot;&gt;&lt;strong&gt;better-custom&lt;/strong&gt;&lt;/a&gt;. This package adds custom provider support to Pi.dev, which is useful for connecting OpenAI-compatible endpoints like the local endpoint from 9router.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image1.png&quot; alt=&quot;Pi.dev Packages page showing the better-custom package for adding custom providers&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Step 2: Install the package&lt;/h2&gt;
&lt;p&gt;After finding the package, install it from the terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pi install npm:better-custom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This adds the extension to Pi.dev so it can be opened from inside the terminal UI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image2.png&quot; alt=&quot;Terminal showing the better-custom package installation command for Pi.dev&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Start 9router and copy the endpoint&lt;/h2&gt;
&lt;p&gt;Open another terminal tab and start 9router.&lt;/p&gt;
&lt;p&gt;Select the Web UI option so the local 9router dashboard can be opened in the browser.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image3.png&quot; alt=&quot;9router terminal screen with the Web UI option for opening the local dashboard&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image3-2.png&quot; alt=&quot;9router local dashboard showing the API endpoint for Pi.dev setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the 9router dashboard, copy the API endpoint. For a local setup, this usually points to a localhost address.&lt;/p&gt;
&lt;p&gt;Keep this endpoint nearby. Pi.dev will ask for it in the next step.&lt;/p&gt;
&lt;h2&gt;Step 4: Add 9router as a provider in Pi.dev&lt;/h2&gt;
&lt;p&gt;Start Pi.dev from the terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inside Pi.dev, open the &lt;code&gt;better-custom&lt;/code&gt; extension and choose the option to add a new provider.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image4.png&quot; alt=&quot;Pi.dev terminal showing the better-custom extension provider setup menu&quot;&gt;&lt;/p&gt;
&lt;p&gt;For provider type, select &lt;strong&gt;OpenAI-compatible&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image4-2.png&quot; alt=&quot;Pi.dev provider type selection showing the OpenAI-compatible option&quot;&gt;&lt;/p&gt;
&lt;p&gt;After that, Pi.dev asks for the API endpoint. Paste the endpoint from the 9router dashboard, then continue to the next prompt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image4-3.png&quot; alt=&quot;Pi.dev prompt for entering the 9router API endpoint&quot;&gt;&lt;/p&gt;
&lt;p&gt;This part creates the main connection: Pi.dev sends OpenAI-style requests, and 9router handles routing those requests to the models behind it.&lt;/p&gt;
&lt;h2&gt;Step 5: Add the API key&lt;/h2&gt;
&lt;p&gt;After the endpoint is set, Pi.dev asks for an API key.&lt;/p&gt;
&lt;p&gt;Go back to the 9router Web UI and generate a new API key.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image5-1.png&quot; alt=&quot;9router dashboard screen for creating a new API key&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then paste the API key into Pi.dev.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image5-2.png&quot; alt=&quot;Pi.dev prompt for entering the 9router API key&quot;&gt;&lt;/p&gt;
&lt;p&gt;Name the provider &lt;strong&gt;9router-local&lt;/strong&gt; so it is easy to recognize later. This small naming detail helps when testing multiple providers or switching models during a session.&lt;/p&gt;
&lt;h2&gt;Step 6: Select models and test it&lt;/h2&gt;
&lt;p&gt;For the last step, choose which models Pi.dev should use through 9router.&lt;/p&gt;
&lt;p&gt;In the model selection screen, look for the provider name created earlier: &lt;strong&gt;9router-local&lt;/strong&gt;. Under that provider, select the models that should be available in Pi.dev. You do not need to expose every model at once. Keep only the models that make sense for your coding workflow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image6-1.png&quot; alt=&quot;Pi.dev model selection screen showing models from the 9router-local provider&quot;&gt;&lt;/p&gt;
&lt;p&gt;After saving the provider and model selection, run the models command in Pi.dev to make sure the new 9router models show up. Then pick one model from &lt;strong&gt;9router-local&lt;/strong&gt; and send a quick greeting to confirm it responds correctly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/3.setting-up-9router-in-pi-dev/image6-2.png&quot; alt=&quot;Pi.dev terminal test showing a 9router-local model responding to a simple message&quot;&gt;&lt;/p&gt;
&lt;p&gt;That is the whole setup. Simple, but satisfying.&lt;/p&gt;
&lt;h2&gt;Why this setup is useful&lt;/h2&gt;
&lt;p&gt;This setup keeps model routing flexible without making the terminal workflow messy.&lt;/p&gt;
&lt;p&gt;You can stay inside Pi.dev, switch between models exposed by 9router, and keep a local routing layer in control. It is especially useful when testing different models with the same prompt or changing providers during a coding session.&lt;/p&gt;
&lt;p&gt;Not a huge setup, not a dramatic life-changing thing. Just one of those small workflow improvements that makes the whole day feel a little smoother.&lt;/p&gt;
</content:encoded><category>pi.dev</category><category>llm</category><category>coding-agent</category></item><item><title>pi.dev, OpenCode, and Codex Desktop Clock Benchmark</title><link>https://itsjo.dev/blogs/agent-clock-comparison/</link><guid isPermaLink="true">https://itsjo.dev/blogs/agent-clock-comparison/</guid><description>I tested GPT 5.5 Thinking High across pi.dev, OpenCode, and Codex Desktop. pi.dev won on speed, OpenCode won on UI, and Codex hit a lamp-switch bug.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Testing Prompt to the Agent&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Create a single-page web application using HTML5, CSS3, and Vanilla JavaScript that simulates an analog wall clock within a minimalist 3D-styled room. The room should be constructed using CSS perspective and gradients to provide a sense of depth, including both walls and floor elements. The wall clock must be circular with a modern skeuomorphic design, featuring subtle shadows and realistic material textures. Use Arabic numerals (1-12) styled with the &apos;Inter&apos; font from Google Fonts for a professional and clean aesthetic.&lt;/p&gt;
&lt;p&gt;Include an interactive light switch in the room that dynamically adjusts the ambient lighting and shadows when toggled. Implement an automatic theme system where the room transitions into a dark mode if the local time is between 6:00 PM and 6:00 AM, and switches back to light mode otherwise. For the clock animation, ensure the second hand moves in a continuous, smooth sweep using requestAnimationFrame rather than jumping stiffly every second.&lt;/p&gt;
&lt;p&gt;Add a separate control panel containing sliders for manually adjusting the hours, minutes, and seconds. Once a user interacts with these sliders, the clock should enter a manual mode where time continues to progress forward from the user-defined point. Provide a synchronization button that allows the user to instantly reset the clock to match the current system time.&lt;/p&gt;
&lt;p&gt;When writing the code, do not include any comments or error-checking and validation logic unless strictly necessary for core functionality. Use highly descriptive and meaningful variable names to ensure the code remains readable and self-explanatory. Maintain a clean, modular, and well-organized code structure, providing the HTML, CSS, and JavaScript as a complete, ready-to-run output.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3 Agents, 1 Model, 1 Prompt&lt;/h2&gt;
&lt;p&gt;I tested how &lt;strong&gt;GPT 5.5 Thinking High&lt;/strong&gt; behaves across different AI coding agent harnesses using the exact same high-detail UI/UX request.&lt;/p&gt;
&lt;p&gt;The challenge was simple in idea, but pretty demanding in execution: build a complete &lt;strong&gt;3D Wall Clock&lt;/strong&gt; web app with HTML5, CSS3, and vanilla JavaScript. It needed a 3D-styled room, skeuomorphic clock design, smooth second-hand animation, automatic theme switching, an interactive light switch, manual time controls, and a sync button.&lt;/p&gt;
&lt;p&gt;Repository for the benchmark project: &lt;a href=&quot;https://github.com/jo0707/llm-clock-benchmark&quot;&gt;github.com/jo0707/llm-clock-benchmark&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The three tools I compared:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pi.dev&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenCode&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codex Desktop&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Same model. Same prompt. Same goal.&lt;/p&gt;
&lt;p&gt;But the results? Surprisingly different.&lt;/p&gt;
&lt;h2&gt;Result Summary&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Duration&lt;/th&gt;
&lt;th&gt;Highlight&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;pi.dev&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;2:20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Winner for speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;OpenCode&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;2:50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Winner for UI/design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Codex Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;3:53&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encountered a lamp-switch bug&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The biggest surprise for me was &lt;strong&gt;pi.dev&lt;/strong&gt;. It finished in only &lt;strong&gt;2 minutes and 20 seconds&lt;/strong&gt;, while still producing a result that was in the same overall range as the others.&lt;/p&gt;
&lt;p&gt;That is fast. Like, “wait, did it already finish?” fast. 😄&lt;/p&gt;
&lt;h2&gt;Test 1: pi.dev — Winner for Speed&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/2.agent-clock-comparison/image2.png&quot; alt=&quot;pi.dev 3D wall clock website preview&quot;&gt;&lt;/p&gt;
&lt;p&gt;pi.dev completed the task in &lt;strong&gt;2:20&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This was the result that surprised me the most. The prompt was not tiny. It asked for visual depth, room perspective, clock animation, theme logic, lighting controls, manual sliders, and clean code structure.&lt;/p&gt;
&lt;p&gt;Yet pi.dev moved through it very quickly. The result was not just fast for the sake of being fast either. It still reached the expected direction and delivered a usable implementation.&lt;/p&gt;
&lt;p&gt;The best way I can describe it: &lt;strong&gt;pi.dev felt like it skipped the warm-up lap and immediately started sprinting.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For workflows where speed matters, like quick prototyping, repeated UI experiments, or rapid iteration, this kind of response time feels really nice.&lt;/p&gt;
&lt;h2&gt;Test 2: OpenCode — Winner for UI/Design&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/2.agent-clock-comparison/image3.png&quot; alt=&quot;OpenCode GPT 5.5 Thinking High coding time result&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/2.agent-clock-comparison/image4.png&quot; alt=&quot;OpenCode 3D wall clock website preview&quot;&gt;&lt;/p&gt;
&lt;p&gt;OpenCode finished in &lt;strong&gt;2:50&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This was still very quick, only &lt;strong&gt;30 seconds slower than pi.dev&lt;/strong&gt;. But what stood out here was the extra design personality.&lt;/p&gt;
&lt;p&gt;OpenCode went the extra mile with the &lt;strong&gt;“Quiet Room Timepiece”&lt;/strong&gt; branding, which made the result feel more polished and intentional. It was not only trying to satisfy the prompt mechanically; it added a little product-like feeling to the final page.&lt;/p&gt;
&lt;p&gt;So while pi.dev won the stopwatch, OpenCode gave me the strongest UI/design impression in this run.&lt;/p&gt;
&lt;p&gt;If your workflow cares more about visual direction, naming, and presentation polish, OpenCode might feel very comfortable.&lt;/p&gt;
&lt;h2&gt;Test 3: Codex Desktop — Slower, and a Bug Appeared&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/2.agent-clock-comparison/image5.png&quot; alt=&quot;Codex Desktop GPT 5.5 Thinking High coding time result&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/2.agent-clock-comparison/image6.png&quot; alt=&quot;Codex Desktop 3D wall clock website preview&quot;&gt;&lt;/p&gt;
&lt;p&gt;Codex Desktop completed the task in &lt;strong&gt;3:53&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The generated page was still useful, but this run had two drawbacks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It was the slowest result in this comparison.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;lamp/light switch feature had a bug and could not be switched properly&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That second point matters because the interactive light switch was one of the explicit requirements in the prompt. So even though Codex Desktop produced a working-looking page overall, it missed an important interaction detail.&lt;/p&gt;
&lt;p&gt;Compared with pi.dev, Codex Desktop took &lt;strong&gt;1 minute and 33 seconds longer&lt;/strong&gt;, and still needed extra fixing afterward.&lt;/p&gt;
&lt;h2&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;This small test made the differences between agent harnesses feel very real.&lt;/p&gt;
&lt;p&gt;Using the same model does not automatically mean the same experience. The surrounding coding agent interface, execution flow, editing behavior, and tool handling can change how fast and polished the final result feels.&lt;/p&gt;
&lt;p&gt;My quick takeaway:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;pi.dev&lt;/strong&gt; if you want speed and fast execution.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;OpenCode&lt;/strong&gt; if you care more about UI/design flavor and polished presentation.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Codex Desktop&lt;/strong&gt; if it fits your workflow, but be ready to inspect interactive features more carefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This is not a scientific benchmark, and I would not treat it like a universal ranking forever. Different prompts, machines, versions, and project contexts can absolutely change the result.&lt;/p&gt;
&lt;p&gt;But for this specific &lt;strong&gt;3D Wall Clock&lt;/strong&gt; challenge:&lt;/p&gt;
&lt;p&gt;🥇 &lt;strong&gt;pi.dev: 2m 20s&lt;/strong&gt; — winner for speed&lt;br&gt;
🥈 &lt;strong&gt;OpenCode: 2m 50s&lt;/strong&gt; — winner for UI/design&lt;br&gt;
🥉 &lt;strong&gt;Codex Desktop: 3m 53s&lt;/strong&gt; — encountered bugs&lt;/p&gt;
&lt;p&gt;The most surprising moment was still pi.dev finishing so quickly while producing a comparable final result. That kind of speed can make an AI coding tool feel less like a waiting game and more like a real pair-programming partner.&lt;/p&gt;
&lt;p&gt;Which one fits your workflow better? 🛠️&lt;/p&gt;
</content:encoded><category>AI</category><category>coding-agent</category><category>benchmark</category></item><item><title>Improve IoT Development Speed by Switching Arduino IDE to PlatformIO IDE</title><link>https://itsjo.dev/blogs/improve-iot-development-from-arduino-ide-to-platformio-ide/</link><guid isPermaLink="true">https://itsjo.dev/blogs/improve-iot-development-from-arduino-ide-to-platformio-ide/</guid><description>Project compiling feels slow? or no code auto suggestion? bad UI/UX? If you have those problem, maybe you should switch from Arduino IDE to PlatformIO IDE</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;&lt;strong&gt;Improve&lt;/strong&gt; IoT Development Speed by Switching Arduino IDE to PlatformIO IDE&lt;/h2&gt;
&lt;p&gt;Yesterday, my team and I were tasked with creating an embedded system project to solve a real-world problem. We came up with the idea to build a system that can &lt;strong&gt;detect early signs of a landslide&lt;/strong&gt; and &lt;strong&gt;warn people in nearby areas to evacuate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Our system uses &lt;strong&gt;ESP32&lt;/strong&gt; as the main microcontroller, &lt;strong&gt;Firebase&lt;/strong&gt; for real-time data storage, &lt;strong&gt;Telegram&lt;/strong&gt; to send alert notifications, &lt;strong&gt;Next.js&lt;/strong&gt; for the web dashboard, and &lt;strong&gt;Python&lt;/strong&gt; for backend data logging.&lt;/p&gt;
&lt;h2&gt;1. Arduino IDE &amp;amp; PlatformIO IDE&lt;/h2&gt;
&lt;p&gt;According to the &lt;a href=&quot;&quot;&gt;official Arduino documentation&lt;/a&gt;, the Arduino IDE is a development environment that includes a code editor, a message area, a text console, a toolbar with common function buttons, and a menu bar. It connects to Arduino hardware to upload programs and communicate with them. Although it is designed for Arduino boards, the IDE also supports other board types and manufacturers.&lt;/p&gt;
&lt;p&gt;As an alternative, &lt;a href=&quot;https://itsjo.dev/blogs&quot;&gt;PlatformIO &lt;/a&gt;is a professional, cross-platform, multi-architecture development tool for embedded systems engineers and software developers who build applications for embedded products. PlatformIO is integrated into Visual Studio Code, allowing developers to work within a powerful modern code editor while developing embedded system projects. This results in a smoother and more efficient experience, especially for larger projects.&lt;/p&gt;
&lt;h2&gt;2. The Problem&lt;/h2&gt;
&lt;p&gt;In the early stages of development, we used the Arduino IDE for building the IoT system. It worked well at first, with no major issues.&lt;/p&gt;
&lt;p&gt;However, once we added the Firebase library (&lt;a href=&quot;https://github.com/mobizt/Firebase-ESP32?tab=readme-ov-file&quot;&gt;mobizt/Firebase ESP32 Client&lt;/a&gt;) and the Telegram library (&lt;a href=&quot;https://itsjo.dev/blogs&quot;&gt;witnessmenow/UniversalTelegramBot&lt;/a&gt;) to our ESP32 project, things changed. The compile time in the Arduino IDE shot up to around &lt;strong&gt;4 minutes for every code change&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That means if we make just 10 small adjustments, we spend &lt;strong&gt;about 40+ minutes&lt;/strong&gt; just waiting for compilation! without even knowing if the build will succeed.&lt;/p&gt;
&lt;p&gt;On top of that, the Arduino IDE doesn’t utilize all CPU cores for compiling. On my machine, which has 12 cores, it only uses 2. That’s frustrating, right? Next, we will see the problem in more detailed explanation.&lt;/p&gt;
&lt;h2&gt;3. Measuring Compile Performance&lt;/h2&gt;
&lt;p&gt;We will use this sample code to measure each IDE compile time and resource usage: &lt;a href=&quot;https://gist.github.com/jo0707/1c583966fc80b6022353438c7a1e8526&quot;&gt;Source Code (GitHub Gist)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Platform: Arduino IDE&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Version: 2.3.4&lt;/li&gt;
&lt;li&gt;Board: DOIT ESP32 DEVKIT V1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s the result:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/improve-iot-development-from-arduino-ide-to-platformio-ide/arduino-usage.png&quot; alt=&quot;arduino-usage&quot;&gt;&lt;img src=&quot;https://itsjo.dev/improve-iot-development-from-arduino-ide-to-platformio-ide/arduino-time.png&quot; alt=&quot;arduino-time&quot;&gt;&lt;/p&gt;
&lt;p&gt;The final result: Arduino IDE required &lt;strong&gt;4 minutes and 17 seconds&lt;/strong&gt; to compile, while using only about &lt;strong&gt;20% of the available CPU&lt;/strong&gt;, indicating poor resource utilization.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Platform: PlatformIO IDE&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Version: 3.3.4&lt;/li&gt;
&lt;li&gt;Board: DOIT ESP32 DEVKIT V1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Initializing the project:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/improve-iot-development-from-arduino-ide-to-platformio-ide/platformio-setup.png&quot; alt=&quot;platformio-setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installing libraries:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/improve-iot-development-from-arduino-ide-to-platformio-ide/platformio-add-library.png&quot; alt=&quot;platformio-add-library.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Compile Result:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://itsjo.dev/improve-iot-development-from-arduino-ide-to-platformio-ide/platformio-result.png&quot; alt=&quot;platformio-result.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;The final result: PlatformIO IDE required &lt;strong&gt;57 seconds&lt;/strong&gt; to compile, and using &lt;strong&gt;100% of the available CPU&lt;/strong&gt;, indicating maximum resource utilization and better compile time.&lt;/p&gt;
&lt;h2&gt;4. Conclusion&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Arduino IDE&lt;/th&gt;
&lt;th&gt;PlatformIO IDE&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Compile Time&lt;/td&gt;
&lt;td&gt;4 minutes 17 seconds&lt;/td&gt;
&lt;td&gt;57 seconds&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 minutes 20 seconds reduction&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU Utilization&lt;/td&gt;
&lt;td&gt;~20%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+80%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;With this result, we &lt;strong&gt;drastically improve compile time and maximizing resource usage&lt;/strong&gt; by switching from Arduino IDE and PlatformIO IDE. Also, here is benefits by switching from Arduino IDE to PlatformIO IDE:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Code Suggestion,&lt;/strong&gt; we can get code suggestion and even AI completions, just like when working on another projects in Visual Studio Code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable Theme,&lt;/strong&gt; it&apos;s Visual Studio Code! you can use any theme you want&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easier Configuration&lt;/strong&gt;, We can have separate configuration for each project and it is fairly easy to add libraries to the project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration With Other Extension,&lt;/strong&gt; You can still use all other available Visual Studio Code extensions to enhance your development workflow while using PlatformIO.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s why I highly recommend switching to PlatformIO. It offers a much better developer experience and makes embedded development faster and more enjoyable.&lt;/p&gt;
&lt;p&gt;Cheers! 🥂&lt;/p&gt;
</content:encoded><category>IoT</category><category>embedded-system</category></item></channel></rss>