<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>DeepakNess - Everything</title>
  <subtitle>Blog posts and raw notes in one feed.</subtitle>
  <link href="https://deepakness.com/feed/archive.xml" rel="self" />
  <link href="https://deepakness.com/archive/" />
  <updated>2026-10-10T15:36:58Z</updated>
  <id>https://deepakness.com/archive/</id>
  <icon>https://deepakness.com/img/deepakness.png</icon>
  <logo>https://deepakness.com/img/deepakness.png</logo>
  <author>
    <name>DeepakNess</name>
  </author><entry>
    <title>CogSend now deploys in one click</title>
    <link href="https://deepakness.com/raw/cogsend-one-click-deploy/" />
    <updated>2026-10-10T15:36:58Z</updated>
    <id>https://deepakness.com/raw/cogsend-one-click-deploy/</id>
    <summary>CogSend now has a Deploy to Cloudflare button, so it deploys without a terminal and keeps itself updated after that.</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/cogsend/cogsend&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CogSend&lt;/a&gt; now has a &lt;a href=&quot;https://cogsend.com/docs/deploy/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Deploy to Cloudflare button&lt;/a&gt;, so you can deploy it to your own Cloudflare account without a terminal. Here&#39;s the step-by-step process to deploy and update.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://cogsend.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;cogsend.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Deploy to Cloudflare&lt;/strong&gt; button and sign in to Cloudflare.&lt;/li&gt;
&lt;li&gt;Select your GitHub account, and tick &amp;quot;Create private Git repository&amp;quot;.&lt;/li&gt;
&lt;li&gt;Get an &lt;code&gt;APP_ENCRYPTION_KEY&lt;/code&gt; from &lt;a href=&quot;https://cogsend.com/key/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;cogsend.com/key&lt;/a&gt; or by running &lt;code&gt;openssl rand -hex 32&lt;/code&gt; command in your terminal, fill it in, and save a copy.&lt;/li&gt;
&lt;li&gt;Click &amp;quot;Create and deploy&amp;quot;, and wait for the build to complete. It usually takes less than a minute.&lt;/li&gt;
&lt;li&gt;Open the workers.dev URL it assigns, enter the same key with an email and password to create your account, then scan the QR with an authenticator app for TOTP setup.&lt;/li&gt;
&lt;li&gt;And done! Connect your accounts, and start scheduling.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I also asked Claude to create a video showing the same, and I think it did a great job.&lt;/p&gt;
&lt;video controls=&quot;&quot; preload=&quot;none&quot; playsinline=&quot;&quot; data-plyr=&quot;&quot; poster=&quot;https://assets.deepakness.com/raw/cogsend-one-click-deploy/cogsend-new-intro-poster.webp&quot;&gt;
  &lt;source src=&quot;https://assets.deepakness.com/raw/cogsend-one-click-deploy/cogsend-new-intro.mp4&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;p&gt;Updates go through the GitHub repository the button created, with no Cloudflare token.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first time, go to Settings → Instance → &amp;quot;Add the Update action to the repository&amp;quot; and commit the file GitHub opens.&lt;/li&gt;
&lt;li&gt;When a new release is out, click &amp;quot;Update on GitHub&amp;quot; → Run workflow, and it deploys in a couple of minutes.&lt;/li&gt;
&lt;li&gt;Or add the repo variable &lt;code&gt;AUTO_UPDATE=true&lt;/code&gt;, and patch releases install themselves daily.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And every release is signed, and the update action refuses any file the signature doesn&#39;t cover. More details are in &lt;a href=&quot;https://cogsend.com/docs/updates/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the updating docs&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Animating webpages with Claude is fun</title>
    <link href="https://deepakness.com/raw/animations-with-claude/" />
    <updated>2026-10-04T10:33:43Z</updated>
    <id>https://deepakness.com/raw/animations-with-claude/</id>
    <summary>I tried animating some stuff on webpages and it&#39;s so fun and easy to do stuff like these with the new Opus 5.5 model.</summary>
    <content type="html">&lt;p&gt;For a project, I decided to add a cute animation on the &lt;code&gt;/admin&lt;/code&gt; login page where a mascot looks away and closes its eyes when typing the username or password, and with just one prompt Claude did a great job. I asked it to create multiple different versions that I can choose from, and here&#39;s a video showing the same.&lt;/p&gt;
&lt;video controls=&quot;&quot; preload=&quot;none&quot; playsinline=&quot;&quot; data-plyr=&quot;&quot; poster=&quot;https://assets.deepakness.com/raw/animations-with-claude/login-screen-animations-poster.webp&quot;&gt;
  &lt;source src=&quot;https://assets.deepakness.com/raw/animations-with-claude/login-screen-animations.mp4&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;p&gt;It was a very simple prompt, and I&#39;m sure that Claude could have done much better with a more defined prompt.&lt;/p&gt;
&lt;p&gt;It&#39;s crazy.&lt;/p&gt;
</content>
  </entry><entry>
    <title>I wish I set up a local LLM before a long journey</title>
    <link href="https://deepakness.com/raw/local-llm-before-travel/" />
    <updated>2026-10-01T10:39:49Z</updated>
    <id>https://deepakness.com/raw/local-llm-before-travel/</id>
    <summary>I forgot to download and set up a local LLM before a long train journey and now I regret it.</summary>
    <content type="html">&lt;p&gt;I&#39;m on a long ~20-hour train journey right now (you know I &lt;a href=&quot;https://deepakness.com/about/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;love train journeys&lt;/a&gt;), and now thinking that I should have downloaded and set up any small LLM which runs smoothly on my 16GB MacBook M2 Air. Like I wouldn&#39;t do hardcore coding with it, but I still could do a lot of things with it, as even a 1B parameter would be much smarter than me in many fields today.&lt;/p&gt;
&lt;p&gt;I tried downloading Gemma 7B and a few others, but the network is not stable and it&#39;s failing each time. My best chance is downloading when the train stops for 15-20 mins on a major station for re-stocking supplies.&lt;/p&gt;
&lt;p&gt;Fingers crossed. 🤞&lt;/p&gt;
</content>
  </entry><entry>
    <title>CogSend has its first sponsor</title>
    <link href="https://deepakness.com/raw/cogsend-first-sponsor/" />
    <updated>2026-09-27T04:04:45Z</updated>
    <id>https://deepakness.com/raw/cogsend-first-sponsor/</id>
    <summary>Zernio just started sponsoring CogSend by providing another way to connect your socials without setting up developer apps of your own.</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/deepakness/cogsend&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CogSend&lt;/a&gt; also as a sponsor now!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zernio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Zernio&lt;/a&gt; has just started sponsoring &lt;a href=&quot;https://cogsend.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CogSend&lt;/a&gt; and that brings a convenient way to connect socials to CogSend without creating developer apps of your own. It&#39;s optional, and connecting directly with your own apps still works.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Zernio meets CogSend&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/cogsend-first-sponsor/zernio-optional-connection.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;By the way, it&#39;s a monthly pledge, and it will help me keep working on CogSend to make it better. And you can learn more about this &lt;a href=&quot;https://cogsend.com/docs/zernio/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;from our docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Excited for this.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Nearing 2 Billion tokens usage in a day</title>
    <link href="https://deepakness.com/raw/2b-tokens-today/" />
    <updated>2026-09-25T02:09:18Z</updated>
    <id>https://deepakness.com/raw/2b-tokens-today/</id>
    <summary>I have been DeepSeekMaxxing a lot and, I think, will soon be touching 2B tokens per day usage mark.</summary>
    <content type="html">&lt;p&gt;I think &lt;a href=&quot;https://deepakness.com/raw/deepseek-v4-1-flash-price/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DeepSeek V4.1 Flash&lt;/a&gt; is the best model that&#39;s ever released, especially when price is considered. I have been using hundreds of millions of DeepSeek tokens every single day, and was about to touch the 2B mark yesterday.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;OpenCode usage dashboard&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/2b-tokens-today/opencode-usage.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m mostly using via OpenCode Go API inside &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the Pi agent&lt;/a&gt; these days and their new dashboard is pretty awesome to show the total usage even when you use via their API. And as you see in the screenshot by yourself. I am working on &lt;a href=&quot;https://deepakness.com/blog/cogsend-intro/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CogSend&lt;/a&gt;, &lt;a href=&quot;https://deepakness.com/sharepdf/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;SharePDF&lt;/a&gt;, and a few other projects and was running 5-6 agents continuously that amounted to this many tokens.&lt;/p&gt;
&lt;p&gt;In fact, I am surprised myself about my token usage. In the last few months, so much has changed in how and how much I use AI for coding, and I&#39;m only optimistic about the future.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Building CogSend: A Self-Hosted Social Media Scheduler</title>
    <link href="https://deepakness.com/blog/cogsend-intro/" />
    <updated>2026-09-23T09:09:51Z</updated>
    <id>https://deepakness.com/blog/cogsend-intro/</id>
    <summary>CogSend is a self-hosted social media scheduler for Mastodon, Bluesky, LinkedIn, Threads and X that runs on your own Cloudflare account.</summary>
    <content type="html">&lt;p&gt;I have been using &lt;a href=&quot;https://go.deepakness.com/typefully&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Typefully&lt;/a&gt; for a long time and it is genuinely great, but it supports a fixed set of platforms and I wanted to decide that for myself. So I built my own. Say hello to &lt;a href=&quot;https://cogsend.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CogSend&lt;/a&gt;, a self-hosted social media scheduler.&lt;/p&gt;
&lt;p&gt;CogSend is &lt;a href=&quot;https://github.com/cogsend/cogsend&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;open source under the MIT license&lt;/a&gt; and it runs on your own free Cloudflare account. There is no monthly fee and no account with me, and your platform credentials stay in your infrastructure. It currently supports Mastodon, Bluesky, LinkedIn, Threads and X with more platform support coming soon.&lt;/p&gt;
&lt;video controls=&quot;&quot; preload=&quot;none&quot; playsinline=&quot;&quot; data-plyr=&quot;&quot; poster=&quot;https://assets.deepakness.com/blog/cogsend-intro/cogsend-demo-poster.webp&quot;&gt;
  &lt;source src=&quot;https://assets.deepakness.com/blog/cogsend-intro/cogsend-demo.mp4&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;h2&gt;What it can do&lt;/h2&gt;
&lt;p&gt;The main idea is, you write a post once, then customize it per platform if you want. There is a Global tab plus a tab for each platform you override, so the X version can stay short while the LinkedIn version says the same thing at length. If you paste a long draft, it splits into a thread that fits the tightest platform you selected, counted the way that platform counts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Publish now or schedule:&lt;/strong&gt; Every destination reports its own result, so one platform failing does not take the rest down with it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retries take care of themselves:&lt;/strong&gt; Retryable failures back off and try again a few times. If a platform keeps refusing (sometimes, happens with Threads), the post parks under Failed with the reason, and you can fix it and retry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manage it all from Posts:&lt;/strong&gt; Cancel or reschedule a queued post without opening it, or retry only the destinations that failed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images and links:&lt;/strong&gt; Supports up to four images per post with alt text for each one and preview cards for links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insights:&lt;/strong&gt; Published against failed over 7, 30 or 90 days, bucketed in your own timezone, with failures grouped by reason instead of a wall of API errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Locked down:&lt;/strong&gt; One admin account with an authenticator app, credentials encrypted at rest, and an API key for scripts, Shortcuts and cron jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;Compose screenshot from CogSend app&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/blog/cogsend-intro/cogsend-screenshot.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;How to install&lt;/h2&gt;
&lt;p&gt;You need Node and a Cloudflare account with Workers access, D1 and R2 available. And the whole install process is just two commands:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/cogsend/cogsend.git cogsend
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; cogsend &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run setup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;setup&lt;/code&gt; does everything – creates the database and the bucket, generates the secrets, applies the migrations, deploys the Worker, and then signs in once against the live site to prove it works. At the end just open the final URL it prints, scan the QR with an authenticator app, save the backup codes, and start connecting your social accounts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Cloudflare free plan is enough for a personal instance. By the way, R2 does ask for a payment method on file even on the free tier, but the first 10 GB each month are free.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think, it&#39;s more than enough for a single user, no?&lt;/p&gt;
&lt;h2&gt;Why I built it&lt;/h2&gt;
&lt;p&gt;Every new post and note I published went out through a &lt;a href=&quot;https://deepakness.com/blog/publish-fast/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;small script&lt;/a&gt; to the same two platforms. It worked, but I wanted per-post control over where things go, and room to add the platforms I actually use. That is the part CogSend fixes, and now the accounts and the scheduling are mine to change.&lt;/p&gt;
&lt;p&gt;I already self-host a few other things, like &lt;a href=&quot;https://deepakness.com/blog/pi-website-stack/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this website running from a Raspberry Pi&lt;/a&gt;, so putting the scheduler on infrastructure I control felt natural, and the best thing is I loved the process of building it.&lt;/p&gt;
&lt;h2&gt;What&#39;s next&lt;/h2&gt;
&lt;p&gt;First, I will be fixing the documentation and I want the setup to be clear enough that nobody has to read the repo to understand it. And I will record a few short videos for the parts that are easier to show than to write.&lt;/p&gt;
&lt;p&gt;After that, will focus on adding more platforms – Instagram, TikTok and YouTube are the ones I am thinking about. Along with these, I&#39;m thinking about more integration options as well.&lt;/p&gt;
&lt;p&gt;These are early thoughts though, not the final roadmap.&lt;/p&gt;
&lt;p&gt;The code is on &lt;a href=&quot;https://github.com/cogsend/cogsend&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub&lt;/a&gt; and the site is &lt;a href=&quot;https://cogsend.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;cogsend.com&lt;/a&gt;. It is MIT licensed, so fork it and change whatever you want, and send PR as well.&lt;/p&gt;
&lt;p&gt;That&#39;s it.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Raspberry Pi 4B with and without the fan</title>
    <link href="https://deepakness.com/raw/pi-fan-vs-no-fan/" />
    <updated>2026-09-15T03:08:11Z</updated>
    <id>https://deepakness.com/raw/pi-fan-vs-no-fan/</id>
    <summary>How the temperature on the Raspberry Pi 4B changes when the fan is on vs when the fan is turned off.</summary>
    <content type="html">&lt;p&gt;I tried to keep my Raspberry Pi 4B device without the fan, and it reaches up to 50°C when it&#39;s hosting this &lt;a href=&quot;https://pi.deepakness.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;experiment site pi.deepakness.com&lt;/a&gt;, as you see in the below screenshot.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Temperature on the Raspberry Pi 4B without the fan&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/pi-fan-vs-no-fan/pi-no-fan-temp.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;But when I keep it in my room under the ceiling fan, the temperature is consistently below 40°C. By the way, earlier &lt;a href=&quot;https://x.com/DeepakNesss/status/2099017478487859690&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;when it crashed&lt;/a&gt;, the temperature had reached over 75°C.&lt;/p&gt;
&lt;p&gt;For now, I am keeping it without the fan but if temperature goes above 60 or so, I will place it under the fan.&lt;/p&gt;
&lt;p&gt;Let&#39;s see.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Serving a Website from a 1 GB Pi 4B on Home WiFi</title>
    <link href="https://deepakness.com/blog/pi-website-stack/" />
    <updated>2026-09-13T22:00:16Z</updated>
    <id>https://deepakness.com/blog/pi-website-stack/</id>
    <summary>How a 1 GB Raspberry Pi 4B on home WiFi serves pi.deepakness.com, through Caddy and a Cloudflare Tunnel.</summary>
    <content type="html">&lt;p&gt;I have a Raspberry Pi 4B at home on WiFi, and it serves a public website. It is a Rev 1.5 board with 4x Cortex-A72 at 1.8 GHz, 1 GB of RAM, a 64 GB microSD card and Debian 13 (trixie). Nothing is forwarded on my router, no ports are open, and my home IP address is never published.&lt;/p&gt;
&lt;p&gt;The page is live at &lt;a href=&quot;https://pi.deepakness.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pi.deepakness.com&lt;/a&gt;, and it is about the machine serving it. You get live readings for CPU, memory, temperature, disk, network and WiFi signal, an hour of history, an availability record with the state of every service, the home connection measured four times a day, and how many &lt;a href=&quot;https://x.com/DeepakNesss/status/2098992508256788748&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;people are reading right now&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The https://pi.deepakness.com website&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/blog/pi-website-stack/piserver.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The path from the internet to the Pi&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;The Pi sits on my home WiFi as a normal client.&lt;/li&gt;
&lt;li&gt;Caddy serves the site files on &lt;code&gt;127.0.0.1:8080&lt;/code&gt;, which exists only inside the Pi.&lt;/li&gt;
&lt;li&gt;A Cloudflare Tunnel dials out to Cloudflare and holds that connection open.&lt;/li&gt;
&lt;li&gt;Cloudflare publishes the local address as a subdomain of mine, with TLS handled at the edge.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Caddy listens on localhost only, so nothing on my network can reach the site directly, and the tunnel is the only way in. There is no port forwarding on the router, no static IP, and no dynamic DNS record to keep updated.&lt;/p&gt;
&lt;p&gt;I had the tunnel pattern written down earlier when I was looking at &lt;a href=&quot;https://deepakness.com/raw/local-apps-to-internet/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ways to publish local apps&lt;/a&gt;, and the feed reader that runs on this Pi &lt;a href=&quot;https://deepakness.com/blog/freshrss-on-pi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;uses the same route&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Raspberry Pi via Cloudflare Tunnel&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/pi-website-stack/pi-cloudflare-tunnel.png&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Getting in without opening SSH&lt;/h3&gt;
&lt;p&gt;Tailscale is the other half of this setup. The Pi is on my tailnet, which is a private network between my own devices, and it is how I open a shell on the Pi or reach anything else at home from anywhere. It runs as a system service and is not in the serving path at all. The website would work without it, and the admin access would work without the tunnel.&lt;/p&gt;
&lt;p&gt;Port 22 is never exposed to the internet, and I still get a terminal on the Pi from basically anywhere.&lt;/p&gt;
&lt;h2&gt;What Caddy does&lt;/h2&gt;
&lt;p&gt;The config is mostly security headers and caching. These are the parts that matter, minus the headers:&lt;/p&gt;
&lt;pre class=&quot;language-caddyfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddyfile&quot;&gt;:8080 {
	bind 127.0.0.1

	@page path / /index.html
	handle @page {
		header Cache-Control &quot;public, max-age=0, s-maxage=60&quot;
		file_server
	}

	@live path /hits.json /uptime.json /speedtest.json
	handle @live {
		header Cache-Control &quot;public, max-age=0, s-maxage=15&quot;
		file_server
	}

	handle /hit {
		respond 204
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The page is cached at the edge for 60 seconds and the data files for 15, which is just longer than the collector&#39;s sampling interval. The numbers stay seconds behind the Pi without the Pi answering every poll from every open tab, and the page&#39;s own polls still carry &lt;code&gt;no-store&lt;/code&gt;, so those do come here.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/hit&lt;/code&gt; is one request per page load, answered with an empty 204 and never cached. That is how page views are counted. Counting them from the access log stopped working once the page was cached at the edge, since the Pi only saw cache fills and the counter advanced about once per edge location per minute, whatever the size of the audience.&lt;/p&gt;
&lt;p&gt;That caching is what got it through the afternoon it was shared. Four IP addresses and later much more fetched the page in a loop, the combined peak reached &lt;strong&gt;1,028 requests per second&lt;/strong&gt;, and the first version of this setup crashed badly.&lt;/p&gt;
&lt;p&gt;However, the same board then took 91 million requests in around 15 hours, with 85 million stopped at Cloudflare and &lt;strong&gt;2.76 million served by origin&lt;/strong&gt;, and it still stayed up.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Cloudflare analytics dashboard showing 91 million requests&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/pi-website-stack/cf-91m.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;What keeps it running&lt;/h2&gt;
&lt;p&gt;Caddy, the collector and the speed test run as systemd user services, symlinked into &lt;code&gt;~/.config/systemd/user/&lt;/code&gt; from the project. And changes are committed in the repo on the Pi, then the affected unit restarts.&lt;/p&gt;
&lt;p&gt;Each service has a memory cap, because memory is the thing that actually runs out on a 1 GB board:&lt;/p&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;MemoryMax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;256M&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;MemoryHigh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;192M&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;GOMEMLIMIT=192MiB&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, Caddy and cloudflared are both Go, and Go holds on to its heap after a burst instead of giving it back. The &lt;code&gt;GOMEMLIMIT&lt;/code&gt; above is the setting doing the real work, since the runtime then keeps itself under the soft cap instead of borrowing memory the Pi does not have.&lt;/p&gt;
&lt;p&gt;A watchdog covers what I cannot. A two minute timer probes the public URL and reads the tunnel&#39;s memory, and restarts the tunnel if two probes fail or if it crosses 250 MB. It has restarted it a few times, mostly during the attack. A five second restart is cheaper than an outage nobody is watching.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;systemctl --user status output for both units&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/pi-website-stack/pi-services-status.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The collector&lt;/h2&gt;
&lt;p&gt;Everything on the page comes from one Python file with no dependencies outside the standard library. It reads &lt;code&gt;/proc&lt;/code&gt; and &lt;code&gt;/sys&lt;/code&gt; every 10 seconds.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;meminfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; rfile&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/proc/meminfo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;splitlines&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;partition&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        out&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; out&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The JSON goes into &lt;code&gt;/dev/shm&lt;/code&gt;, which is RAM, because a file every 10 seconds is over 3 million writes a year and the SD card is the first part of a Pi to fail. The counters are the only thing that touches the card, flushed once a minute with a &lt;code&gt;.bak&lt;/code&gt; beside them, and every write goes through &lt;code&gt;os.replace&lt;/code&gt; so a reader never sees a half-written file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The bug worth reading this post for:&lt;/strong&gt; The collector used to empty the access log once it passed a size cap. Caddy holds that file open and keeps its own position in it, so the next write landed past the new end – a sparse file, enormous in size and nearly empty in content, over the cap again on the next tick, emptied again ten seconds later, forever. Visitors read 1 while the site was fast, the CPU was idle and every service reported active. But now, Caddy rotates the log itself, and the collector only reads it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The counters:&lt;/strong&gt; Page views come from the page&#39;s own &lt;code&gt;/hit&lt;/code&gt; request, and readers are counted per device – an open tab sends a random id it keeps in &lt;code&gt;localStorage&lt;/code&gt; on the JSON polls it already makes, so two devices on one WiFi count as two. What reaches the collector is a salted hash, held in memory for three minutes, with an address as the fallback for a browser that keeps no storage. And nothing is written to disk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Response times and the speed test:&lt;/strong&gt; Response times come from the access log. The speed test runs four times a day against Cloudflare&#39;s edge, since Ookla&#39;s own CLI does not work here, so the script uses &lt;code&gt;curl&lt;/code&gt; with a browser user agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A weak power supply:&lt;/strong&gt; The collector also reads &lt;code&gt;vcgencmd get_throttled&lt;/code&gt; for undervoltage and throttling flags, so a weak charger shows up on the page.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The Right Now section with uptime, CPU, memory, temperature and more&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/pi-website-stack/pi-page-now.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The live page itself&lt;/h2&gt;
&lt;p&gt;Four files with no framework and no build step. &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, &lt;code&gt;app.js&lt;/code&gt; and a one line &lt;code&gt;beacon.js&lt;/code&gt; that reports the page load come to about &lt;strong&gt;14 KB gzipped&lt;/strong&gt; in total.&lt;/p&gt;
&lt;p&gt;The icons are one inline SVG sprite with 26 symbols, so a page with this many small labels still makes no extra requests. By the way, I printed the numbers in full with separators, so a visitor count reads 1,247 rather than 1.2k.&lt;/p&gt;
&lt;p&gt;There are no cookies and no third-party requests, and a &lt;code&gt;default-src &#39;self&#39;&lt;/code&gt; policy keeps it that way. The one identifier anywhere is the random device id above, and it never leaves the browser except as a salted hash in memory. For my other sites I use &lt;a href=&quot;https://deepakness.com/blog/self-hosting-umami-analytics/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the analytics setup I run on a VPS&lt;/a&gt;, and this page needs none of that.&lt;/p&gt;
&lt;h2&gt;The WiFi link, measured&lt;/h2&gt;
&lt;p&gt;The Pi is a client on my network rather than a server, so the WiFi link is the slowest part of the setup.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The link runs on 5 GHz, channel 36, at a reported 270 Mbit/s, but the real throughput measures around 43 Mbps against Cloudflare&#39;s edge.&lt;/li&gt;
&lt;li&gt;Upload matters more than download here, because the visitors pull the page from my house, so the upload side of the line is what everyone shares.&lt;/li&gt;
&lt;li&gt;Power save can add latency, and NetworkManager reports it as &lt;code&gt;default&lt;/code&gt; on this setup, and it is the first setting I would check if SSH felt sluggish.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;The Pi next to the router&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/pi-website-stack/pi-and-router.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;What it costs to run&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Between 3-5 W of electricity.&lt;/li&gt;
&lt;li&gt;Around 250 MB of the 906 MB of RAM the OS can see, with the web server, the collector and the tunnel running.&lt;/li&gt;
&lt;li&gt;Under 2% CPU while idle, and about a millisecond for Caddy to hand over the page at the median.&lt;/li&gt;
&lt;li&gt;43 Mbps of a 200 Mbps fiber line, which is the WiFi link rather than the board.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the way, could a Zero 2 W do the same job?&lt;/p&gt;
&lt;h2&gt;What I learned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory is what fills first:&lt;/strong&gt; Caddy and cloudflared both kept growing under load, on a board with 906 MB. The caps are what stop that from ending in an outage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caching made the biggest difference:&lt;/strong&gt; The page is answered at the edge now, so the Pi stopped handing the same bytes to every visitor, and the size of the audience stopped mattering as much.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The WiFi link is the slowest part:&lt;/strong&gt; Slower than the board and slower than the line it sits on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The SD card fails first:&lt;/strong&gt; Keeping the writes in RAM is the one habit I would keep from this project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Counting readers without collecting anything was the hard half:&lt;/strong&gt; Reading &lt;code&gt;/proc&lt;/code&gt; is a solved problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The page is live at &lt;a href=&quot;https://pi.deepakness.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pi.deepakness.com&lt;/a&gt;, and it updates every 10 seconds. The Caddyfile, the collector, the units, and the watchdog are &lt;a href=&quot;https://github.com/deepakness/piserver&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;on GitHub&lt;/a&gt; in a public repo.&lt;/p&gt;
&lt;p&gt;Overall, it was a super fun project and I loved every bit of it.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Hetzner&#39;s dedicated server is cheaper than VPS</title>
    <link href="https://deepakness.com/raw/hetzner-vps-vs-dedicated-server/" />
    <updated>2026-09-12T05:27:50Z</updated>
    <id>https://deepakness.com/raw/hetzner-vps-vs-dedicated-server/</id>
    <summary>Hetzner&#39;s AX41 bare metal gives 64 GB RAM and 1 TB NVMe for €59/mo, while the comparable CPX42 VPS costs €69.49/mo.</summary>
    <content type="html">&lt;p&gt;I just noticed that &lt;a href=&quot;https://www.hetzner.com/dedicated-rootserver/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hetzner&#39;s dedicated servers&lt;/a&gt;, also known as bare metal, are cheaper than &lt;a href=&quot;https://go.deepakness.com/hetzner&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;their VPS plans&lt;/a&gt;. Here&#39;s a quick comparison from both pricing pages, with prices excluding VAT.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server Type&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VPS (CPX42)&lt;/td&gt;
&lt;td&gt;€69.49/mo&lt;/td&gt;
&lt;td&gt;8 vCPU&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;320 GB SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dedicated Machine (AX41)&lt;/td&gt;
&lt;td&gt;€59.00/mo&lt;/td&gt;
&lt;td&gt;6 cores/12 threads&lt;/td&gt;
&lt;td&gt;64 GB&lt;/td&gt;
&lt;td&gt;2 × 512 GB NVMe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;So the AX41 gives 4x the RAM and 3x the storage for €10.49 less every month, and it has no setup fee. The CPX42 also ends up at €69.99 in the console once the IPv4 address is added.&lt;/p&gt;
&lt;p&gt;Hetzner dedicated server pricing:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Hetzner dedicated server pricing&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/hetzner-vps-vs-dedicated-server/dedicated-server-pricing.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hetzner VPS pricing:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Hetzner VPS pricing&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/hetzner-vps-vs-dedicated-server/vps-pricing.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;The usual worry with bare metal is the extra setup work, and it&#39;s the same short checklist either way. &lt;a href=&quot;https://deepakness.com/raw/hetzner-vps-tailscale/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Put the admin panels behind Tailscale&lt;/a&gt;, keep the websites public through Cloudflare, and &lt;a href=&quot;https://deepakness.com/blog/hetzner-storage-box-backup-via-rsync/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;run off-site backups with rsync&lt;/a&gt; or maybe BackBlaze, and you&#39;re done.&lt;/p&gt;
&lt;p&gt;And if you&#39;re okay with going one step further &lt;a href=&quot;https://x.com/theo/status/2093840679860568280&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;you can even get a physical device&lt;/a&gt; and host everything there. But it&#39;s a bit extreme as stable internet and even electricity availability might be challenging for different locations.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am not immediately migrating to it, but it should be pretty fun setting up. And a lot of learning experiences.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Will explore this soon.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Fixing Threads API publishing errors</title>
    <link href="https://deepakness.com/raw/threads-api-publishing-fix/" />
    <updated>2026-09-10T18:29:18Z</updated>
    <id>https://deepakness.com/raw/threads-api-publishing-fix/</id>
    <summary>Publishing to the Threads API kept failing for two reasons that had nothing to do with permissions, an unusable user id from OAuth and Meta failing to download the image.</summary>
    <content type="html">&lt;p&gt;I have been adding Threads support to my own posting setup, and the &lt;a href=&quot;https://developers.facebook.com/docs/threads&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Threads API&lt;/a&gt; kept failing with an error that looked like a permissions problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first one was &lt;code&gt;code 100, error_subcode 33&lt;/code&gt;, &amp;quot;Object with ID ... does not exist&amp;quot;, on every single post.&lt;/strong&gt; The ID in that message is the &lt;code&gt;user_id&lt;/code&gt; that comes back from the OAuth token exchange, and the Graph API doesn&#39;t accept it as a publishing target. I wasted time re-authorizing the account and toggling permissions because the message says &amp;quot;missing permissions&amp;quot;, but that wording is boilerplate that shows up on code 100 whatever the token actually grants. What worked was asking Meta who the token belongs to and publishing as that.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://graph.threads.net/v1.0/me?fields=id,username&amp;amp;access_token=&lt;span class=&quot;token variable&quot;&gt;$TOKEN&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The id from &lt;code&gt;/me&lt;/code&gt; published fine on the first try, and since then I refresh the stored id on every publish so an old row repairs itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Then a threaded post with an image failed with &lt;code&gt;code 1, error_subcode 2207052&lt;/code&gt;, &amp;quot;Media download has failed&amp;quot;.&lt;/strong&gt; Meta downloads the &lt;code&gt;image_url&lt;/code&gt; on their side when the container is created, and here their crawler couldn&#39;t fetch it. I pulled both files out of storage to compare and they were byte-identical, same MD5, one failed and the other published seconds later, so it&#39;s a flake and not something wrong with the image. I made the container creation retry with a freshly signed URL, and left that failure retryable so a scheduled post tries again instead of parking as failed.&lt;/p&gt;
&lt;p&gt;The truncated error text never told me any of this. The full response body did, and the &lt;code&gt;error_subcode&lt;/code&gt; is what showed me which of the two I was looking at.&lt;/p&gt;
</content>
  </entry><entry>
    <title>MacBook looking at itself in a mirror to self-improve</title>
    <link href="https://deepakness.com/raw/computer-using-mirror/" />
    <updated>2026-09-12T00:00:00Z</updated>
    <published>2026-09-10T13:07:08Z</published>
    <id>https://deepakness.com/raw/computer-using-mirror/</id>
    <summary>Came across this post on X that a MacBook is looking at itself using its webcam via a mirror and improving itself.</summary>
    <content type="html">&lt;p&gt;Came across this rather interesting and funny picture &lt;a href=&quot;https://x.com/jpschroeder/status/2097758256420565442&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;in a post on X&lt;/a&gt; where an AI agent on a MacBook is using its webcam to look at its screen in a mirror to improve itself. As explained in the X post, it&#39;s working on improving the AMD Radeon chip support in Omarchy Linux.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;MacBook looking at itself in a mirror to self-improve&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/computer-using-mirror/macbook-mirror.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Someone asks Grok in a reply below why this approach is better than taking screenshots and then looking at them to improve itself, and Grok replies:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Screenshots grab the compositor or DRM framebuffer. The path to the actual panel runs through the GPU display engine, timings, gamma LUTs and scanout hardware. AMD driver bugs frequently break only that stage (black screens, color shifts, tearing, freezes) while software readback still succeeds. The webcam+mirror sees the real photons.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had no idea about this.&lt;/p&gt;
&lt;p&gt;Very interesting, actually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;AI fixing Omarchy external display support&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/computer-using-mirror/omarchy-fixing-display-support.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Just saw this update from Justin on this that the MacBook with Omarchy on it fixed its external monitor support for AMD Radeon chips by looking at the screen via the webcam.&lt;/p&gt;
&lt;p&gt;Fascinating!&lt;/p&gt;
</content>
  </entry><entry>
    <title>DeepSeek v4.1 Flash is here with a new price</title>
    <link href="https://deepakness.com/raw/deepseek-v4-1-flash-price/" />
    <updated>2026-09-09T23:50:01Z</updated>
    <id>https://deepakness.com/raw/deepseek-v4-1-flash-price/</id>
    <summary>DeepSeek has released the new v4.1 Flash with a new promise and a new price, and it&#39;s already here.</summary>
    <content type="html">&lt;p&gt;The new DeepSeek v4.1 Flash model is here and the two most important things about the model is that it has &lt;strong&gt;native vision capabilities&lt;/strong&gt;, and it&#39;s significantly cheaper after the price hike last month. I have updated the pricing on the &lt;a href=&quot;https://deepakness.com/deepseek/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DeepSeek peak/off-peak clock page&lt;/a&gt; already.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DeepSeek v4.1 Flash announcement&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/deepseek-v4-1-flash-price/deepseek-v4-1-announcement.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Another interesting thing is, as you see above, the new v4.1 Flash has surpassed the existing v4 Pro on all metrics so from now on all requests to the Pro model will be routed to the new Flash model.&lt;/p&gt;
&lt;p&gt;Interesting!&lt;/p&gt;
&lt;p&gt;About the new price, here&#39;s the price table and comparison with the old pricing (all prices in per million tokens):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Off-peak, old&lt;/th&gt;
&lt;th&gt;Off-peak, new&lt;/th&gt;
&lt;th&gt;Peak, old&lt;/th&gt;
&lt;th&gt;Peak, new&lt;/th&gt;
&lt;th&gt;Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input, cache hit&lt;/td&gt;
&lt;td&gt;$0.007&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;$0.014&lt;/td&gt;
&lt;td&gt;$0.006&lt;/td&gt;
&lt;td&gt;57.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input, cache miss&lt;/td&gt;
&lt;td&gt;$0.22&lt;/td&gt;
&lt;td&gt;$0.15&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;td&gt;31.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;$0.66&lt;/td&gt;
&lt;td&gt;$0.60&lt;/td&gt;
&lt;td&gt;$1.32&lt;/td&gt;
&lt;td&gt;$1.20&lt;/td&gt;
&lt;td&gt;9.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I used the model a lot yesterday, and it&#39;s visible that it&#39;s significantly better than other models, and it just has a better taste. I tested it for writing, and it already writes better than other DeepSeek models and even more natural than Claude or GPT models.&lt;/p&gt;
&lt;p&gt;Good job, DeepSeek! And thank you.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Ubuntu 26.04 on Mid-2014 MacBook Pro – it finally works</title>
    <link href="https://deepakness.com/raw/ubuntu-macbook-setup/" />
    <updated>2026-09-09T06:50:01Z</updated>
    <id>https://deepakness.com/raw/ubuntu-macbook-setup/</id>
    <summary>Wi-Fi, camera, mic, speakers, and fans all work on Ubuntu 26.04 on my Mid-2014 MacBook Pro now, and here&#39;s the setup.</summary>
    <content type="html">&lt;p&gt;After &lt;a href=&quot;https://deepakness.com/raw/fixing-wifi-fedora-macbook/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Fedora 44&lt;/a&gt; and &lt;a href=&quot;https://deepakness.com/raw/fixing-wifi-linux-mint/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Linux Mint&lt;/a&gt;, I wiped &lt;a href=&quot;https://deepakness.com/blog/mbp-mid-2014/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the old MacBook Pro&lt;/a&gt; and installed Ubuntu 26.04.1 LTS on it. Wi-Fi, camera, mic, speakers, and fans all work now. Here&#39;s everything I had to fix, in case I need to redo it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wi-Fi&lt;/strong&gt; didn&#39;t work out of the box. The BCM4360 chip needs the proprietary &lt;code&gt;wl&lt;/code&gt; driver because &lt;code&gt;b43&lt;/code&gt; grabs the card first.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Preferred&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; broadcom-sta-dkms
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms autoinstall

&lt;span class=&quot;token comment&quot;&gt;# Or from the .deb (dpkg skips dependencies, fix them after)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; http://mirrors.kernel.org/ubuntu/pool/restricted/b/broadcom-sta/broadcom-sta-dkms_6.30.223.271-29ubuntu1_amd64.deb
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; broadcom-sta-dkms_6.30.223.271-29ubuntu1_amd64.deb
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; --fix-broken &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Either way&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; update-initramfs &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; modprobe wl
&lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;link&lt;/span&gt; show &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; wl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I used the &lt;code&gt;.deb&lt;/code&gt; from &lt;a href=&quot;https://forums.linuxmint.com/viewtopic.php?p=2807520#p2807520&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;a Linux Mint forum thread&lt;/a&gt;, and it broke until &lt;code&gt;--fix-broken install&lt;/code&gt; fixed it. The &lt;code&gt;update-initramfs -u&lt;/code&gt; step is required for the &lt;code&gt;b43&lt;/code&gt; blacklists to apply at boot.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;FaceTime HD camera&lt;/strong&gt; needs three pieces, the DKMS module, the firmware, and the sensor files.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; dkms build-essential linux-headers-&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/patjak/bcwc_pcie.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; bcwc_pcie
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms build facetimehd/0.7.0.1
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; facetimehd/0.7.0.1
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; depmod
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; modprobe facetimehd
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; facetimehd &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; /etc/modules &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; /dev/video0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check &lt;code&gt;cat dkms.conf | grep PACKAGE_VERSION&lt;/code&gt; first, because the repo says &lt;code&gt;0.7.0.1&lt;/code&gt; while guides still say &lt;code&gt;0.2&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/patjak/facetimehd-firmware.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; facetimehd-firmware
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;            &lt;span class=&quot;token comment&quot;&gt;# fails on the assistant hash, this is expected&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /tmp/facetime-fw &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /tmp/facetime-fw
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9112&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1771&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1871&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1874&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${f}&lt;/span&gt;_01XX.dat &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    https://raw.githubusercontent.com/eudoxos/skoly/main/tweaks/macbook-air/firmware/&lt;span class=&quot;token variable&quot;&gt;${f}&lt;/span&gt;_01XX.dat
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; *.dat /usr/lib/firmware/facetimehd/
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; modprobe &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; facetimehd &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; modprobe facetimehd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;make&lt;/code&gt; failure is expected, and &lt;code&gt;firmware.bin&lt;/code&gt; still extracts fine. After the sensor files, &lt;code&gt;dmesg | grep facetimehd&lt;/code&gt; should show no more &lt;code&gt;failed with error -2&lt;/code&gt; lines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For the fans&lt;/strong&gt;, &lt;code&gt;mbpfan&lt;/code&gt; with the default config is enough.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; mbpfan
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl status mbpfan
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /sys/devices/platform/applesmc.768/fan*_input&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The fans spike to ~6000 RPM during install, then settle back to ~2000 RPM.&lt;/p&gt;
&lt;p&gt;That&#39;s it.&lt;/p&gt;
&lt;p&gt;On a fresh install, the order is apt update/upgrade, Wi-Fi, camera, mbpfan, reboot, and check Wi-Fi, &lt;code&gt;/dev/video0&lt;/code&gt;, and mbpfan.&lt;/p&gt;
</content>
  </entry><entry>
    <title>SharePDF gets its first intro video</title>
    <link href="https://deepakness.com/raw/created-sharepdf-intro-video/" />
    <updated>2026-09-09T01:40:24Z</updated>
    <id>https://deepakness.com/raw/created-sharepdf-intro-video/</id>
    <summary>Finally got the time, and the first intro video for SharePDF is now live on YouTube.</summary>
    <content type="html">&lt;p&gt;I was procrastinating this for a long time but finally spent some time and created the very first intro video for &lt;a href=&quot;https://sharepdf.app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;SharePDF&lt;/a&gt;, and now it&#39;s live on SharePDF YouTube channel. You can also &lt;a href=&quot;https://www.youtube.com/watch?v=Qn2sLQQZMWc&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;watch it here&lt;/a&gt; though:&lt;/p&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/paulirish/lite-youtube-embed@0.3.3/src/lite-yt-embed.min.css&quot;&gt;
&lt;script defer=&quot;defer&quot; src=&quot;https://cdn.jsdelivr.net/gh/paulirish/lite-youtube-embed@0.3.3/src/lite-yt-embed.min.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;Qn2sLQQZMWc&quot; class=&quot;eleventy-plugin-youtube-embed&quot;&gt;&lt;lite-youtube videoid=&quot;Qn2sLQQZMWc&quot; style=&quot;background-image: url(&#39;https://i.ytimg.com/vi/Qn2sLQQZMWc/hqdefault.jpg&#39;);&quot; params=&quot;rel=0&quot;&gt;&lt;div class=&quot;lty-playbtn&quot;&gt;&lt;/div&gt;&lt;/lite-youtube&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes, that&#39;s me. But please ignore the low-effort thumbnail, I will make it better later.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am planning to create at least one video per week from now on, and will create short videos as well. I can create videos for individual features that the app has.&lt;/p&gt;
&lt;p&gt;Still have to do a lot of thinking to create a more robust long-term video strategy.&lt;/p&gt;
&lt;p&gt;All the best to me!&lt;/p&gt;
</content>
  </entry><entry>
    <title>Why AI will never be able to take over humans</title>
    <link href="https://deepakness.com/raw/ai-wont-take-over/" />
    <updated>2026-09-05T01:45:49Z</updated>
    <id>https://deepakness.com/raw/ai-wont-take-over/</id>
    <summary>My thoughts on why artificial intelligence is not capable of taking over human intelligence.</summary>
    <content type="html">&lt;p&gt;AI is capable of doing many things better than humans, but it doesn&#39;t have human-like curiosity. AI &lt;strong&gt;does not wonder&lt;/strong&gt; on its own and answers only when asked.&lt;/p&gt;
&lt;p&gt;So I think AI will never be able to take over humans because without genuine curiosity, it just remains a powerful tool.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Two new improvements in my work setup recently</title>
    <link href="https://deepakness.com/raw/two-improvements-recently/" />
    <updated>2026-09-04T13:30:47Z</updated>
    <id>https://deepakness.com/raw/two-improvements-recently/</id>
    <summary>In the last few weeks, I have two small changes in my work setup that I am absolutely loving it so far.</summary>
    <content type="html">&lt;p&gt;In the last few days, I have adopted two new changes in my work setup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Started using Herdr with Ghostty, and&lt;/li&gt;
&lt;li&gt;Turned on &lt;strong&gt;More Space&lt;/strong&gt; display scaling option on macOS&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Earlier, I was hopping between different apps like Claude Code, Cursor, etc. and wasn&#39;t using CLI coding harnesses a lot. But my productivity has significantly increased ever since I started using this &lt;a href=&quot;https://deepakness.com/raw/herdr-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Herdr terminal multiplexer via the Ghostty&lt;/a&gt; terminal. And I even went a step ahead and unbound certain keybindings from Ghostty and &lt;a href=&quot;https://deepakness.com/raw/ghostty-herdr-keybindings/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;bound them inside Herder&lt;/a&gt;, and now opening tabs, splitting panes, and other things are much easier.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;macOS More Space display scaling&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/two-improvements-recently/more-space-macos.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;About the other thing, as you see above, I turned on the &amp;quot;More Space&amp;quot; display scaling option on my macOS device. Initially, it took some time to adjust, but now I don&#39;t even need my second display as I can see much more information on the main display itself. And it&#39;s less distracting than using the second screen.&lt;/p&gt;
&lt;p&gt;That&#39;s it.&lt;/p&gt;
&lt;p&gt;These two small changes recently have significantly improved my productivity.&lt;/p&gt;
</content>
  </entry><entry>
    <title>I used 28 different OpenCode models last month</title>
    <link href="https://deepakness.com/raw/opencode-usage-aug/" />
    <updated>2026-09-01T00:22:10Z</updated>
    <id>https://deepakness.com/raw/opencode-usage-aug/</id>
    <summary>After my Claude Max subscription ended, I didn&#39;t renew and started using OpenCode models a lot.</summary>
    <content type="html">&lt;p&gt;I didn&#39;t renew my Claude Max subscription after it ended last month, and decided to &lt;a href=&quot;https://go.deepakness.com/opencode&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;use OpenCode&lt;/a&gt; for some time. And it&#39;s been more than ~15 days of using OpenCode models, and I&#39;ve missed Claude models only a few times.&lt;/p&gt;
&lt;p&gt;From OpenCode&#39;s usage tab, I have used 28 different models last month, as you see in the screenshot.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;OpenCode usage last month&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/opencode-usage-aug/opencode-usage-august.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Among all the models you see in the screenshot, only a few stood out.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek V4 Flash&lt;/strong&gt; (0731): Love this model for simpler tasks like doing some research from multiple different sources and creating interactive HTML pages for better visualization, fixing quick UI bugs, etc. It&#39;s very fast and mostly accurate for these tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek V4 Pro&lt;/strong&gt; (0813): This model is great for a lot of tasks, and I have used this for fixing some serious bugs on &lt;a href=&quot;https://sharepdf.app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;SharePDF&lt;/a&gt;, building websites, brainstorming, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GLM 5.3 Flash&lt;/strong&gt;: Been using this model a lot since it came, and it&#39;s a great one for UI and research. The only issue is that it&#39;s very slow in OpenCode Go, so I use it for low-priority tasks, and sometimes I even keep it &lt;a href=&quot;https://x.com/DeepakNesss/status/2093521185837638015&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;running overnight&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek V4 Flash Vision Exp&lt;/strong&gt;: While I use &lt;a href=&quot;https://pi.dev/packages/pi-vision-handoff&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;an extension in Pi&lt;/a&gt; that uses another model for vision, I found this model to be great at browser automation tasks. I used it a lot via the Orca app for automating stuff in my browser, and it&#39;s good and fast too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mimo v2.5&lt;/strong&gt;: Sometimes I use this model for really simple, low-priority tasks, and it&#39;s good at that. But don&#39;t use it for anything else.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Apart from these, most models you see in the chart above are only for trying and testing. I&#39;m mostly using these 5 models via my OpenCode Go subscription.&lt;/p&gt;
&lt;p&gt;Most of the time I use these in the &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi coding agent&lt;/a&gt; via &lt;a href=&quot;https://deepakness.com/raw/herdr-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my new Herdr + Ghostty setup&lt;/a&gt;, but sometimes also using Pi inside the Orca app for browser use tasks. I&#39;m rarely using OpenCode models inside the OpenCode harness actually.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Playing with the Grok bot</title>
    <link href="https://deepakness.com/raw/playing-with-grok-bot/" />
    <updated>2026-08-31T17:31:50Z</updated>
    <id>https://deepakness.com/raw/playing-with-grok-bot/</id>
    <summary>Downloaded and installed the new Grok bot and playing with to see how it can fit in my workflow.</summary>
    <content type="html">&lt;p&gt;Yesterday, I downloaded and installed &lt;a href=&quot;https://x.ai/bot&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the new Grok bot&lt;/a&gt; and playing with it to see how it can fit in my workflow. I have connected it to &lt;a href=&quot;https://deepakness.com/raw/supergrok-3-months/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my existing SuperGrok subscription&lt;/a&gt; and so far it&#39;s working fine.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Grok bot app sidebar on macOS&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/playing-with-grok-bot/grok-bot-sidebar.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;As of now, I have set up 3 bots that do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Emails bot: reads my emails twice a day, gives me a summary and reminds me of something important that needs to be done.&lt;/li&gt;
&lt;li&gt;AI Research bot: researches for AI related updates from the internet and sends me a summary twice a week.&lt;/li&gt;
&lt;li&gt;Ticky bot: manages my to-do list via Notion and email, sends an email every morning about today&#39;s and other upcoming tasks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I know this very basic and people must be using it for more complex tasks, but I&#39;m just exploring and learning about it. I haven&#39;t yet seen any tutorials about it, but will do and improve my setup.&lt;/p&gt;
&lt;p&gt;By the way, I&#39;m pretty impressed by it so far.&lt;/p&gt;
&lt;p&gt;Lastly, the different pricing plans and different login options using Grok and Cursor make it very very confusing. I hope they solve it quickly.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Unbinding Ghostty&#39;s Cmd keys and binding them in Herdr</title>
    <link href="https://deepakness.com/raw/ghostty-herdr-keybindings/" />
    <updated>2026-08-30T14:32:34Z</updated>
    <id>https://deepakness.com/raw/ghostty-herdr-keybindings/</id>
    <summary>I unbound the Cmd shortcuts in Ghostty and bound the same keys directly in Herdr. One set of shortcuts for tabs, panes, and workspaces, with prefix mode still around as a fallback.</summary>
    <content type="html">&lt;p&gt;Since &lt;a href=&quot;https://deepakness.com/raw/herdr-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;setting up Herdr&lt;/a&gt; inside Ghostty, the same actions had two shortcuts, &lt;code&gt;Cmd+T&lt;/code&gt; for a Ghostty tab and &lt;code&gt;Ctrl+B C&lt;/code&gt; for a Herdr tab, and that made things a bit confusing and then I had to keep using my mouse for everything in Herdr. But Oron Ben &lt;a href=&quot;https://x.com/oronbz/status/2093071220879081756&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;suggested something on X&lt;/a&gt; and that clicked, I then followed &lt;a href=&quot;https://dev.to/oronbz/making-ghostty-and-herdr-share-one-keyboard-4p0g&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;his write-up&lt;/a&gt; to unbound the Cmd keys in Ghostty and bound the same keys directly in Herdr.&lt;/p&gt;
&lt;p&gt;Now, Ghostty passes the keypress through to the terminal and Herdr answers it, no prefix and no escape-code translation.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;My Herdr setup&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/ghostty-herdr-keybindings/herdr-setup.png&quot;&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Before (Ghostty)&lt;/th&gt;
&lt;th&gt;Now (Herdr)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;new tab&lt;/td&gt;
&lt;td&gt;new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+W&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;close tab&lt;/td&gt;
&lt;td&gt;close pane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;split right&lt;/td&gt;
&lt;td&gt;split pane vertically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+Shift+D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;split down&lt;/td&gt;
&lt;td&gt;split pane horizontally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+]&lt;/code&gt; &amp;amp; &lt;code&gt;Cmd+[&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;focus next and previous split&lt;/td&gt;
&lt;td&gt;cycle next and previous pane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+Shift+]&lt;/code&gt; &amp;amp; &lt;code&gt;Cmd+Shift+[&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;next and previous tab&lt;/td&gt;
&lt;td&gt;next and previous tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cmd+1..9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;jump to tab&lt;/td&gt;
&lt;td&gt;switch workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Alt+1..9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;types special characters&lt;/td&gt;
&lt;td&gt;switch tab&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ghostty keeps everything else, &lt;code&gt;Cmd+N&lt;/code&gt; for a new window, &lt;code&gt;Cmd+C&lt;/code&gt; / &lt;code&gt;Cmd+V&lt;/code&gt; for copy and paste, search, and font size. And Herdr&#39;s &lt;code&gt;Ctrl+B&lt;/code&gt; prefix mode keeps working as a fallback, with &lt;code&gt;Ctrl+B ?&lt;/code&gt; showing the help panel.&lt;/p&gt;
&lt;p&gt;I also created a short video to show how easier it is to navigate inside Herdr using these keyboard shortcuts.&lt;/p&gt;
&lt;video controls=&quot;&quot; preload=&quot;none&quot; playsinline=&quot;&quot; data-plyr=&quot;&quot; poster=&quot;https://assets.deepakness.com/raw/ghostty-herdr-keybindings/ghostty-herdr-keybindings-poster.webp&quot;&gt;
  &lt;source src=&quot;https://assets.deepakness.com/raw/ghostty-herdr-keybindings/ghostty-herdr-keybindings.mp4&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;p&gt;The Ghostty side lives in the same config file &lt;a href=&quot;https://deepakness.com/raw/cmux-config/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my cmux setup&lt;/a&gt; already used at &lt;code&gt;~/Library/Application Support/com.mitchellh.ghostty/config.ghostty&lt;/code&gt;, symlinked from &lt;code&gt;~/.config/ghostty/config&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;macos-option-as-alt&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+t=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+w=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+d=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+shift+d=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+[=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+]=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+shift+[=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+shift+]=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+1=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_1=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+2=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_2=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+3=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_3=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+4=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_4=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+5=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_5=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+6=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_6=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+7=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_7=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+8=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_8=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+9=unbind&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;keybind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;cmd+digit_9=unbind&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ghostty binds both &lt;code&gt;cmd+1&lt;/code&gt; and &lt;code&gt;cmd+digit_1&lt;/code&gt; by default, &lt;code&gt;1&lt;/code&gt; matches the character and &lt;code&gt;digit_1&lt;/code&gt; the physical key, so both lines are needed for every digit. You can check with &lt;code&gt;ghostty +show-config --default | grep goto_tab&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The Herdr side goes into &lt;code&gt;~/.config/herdr/config.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;new_tab&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+t&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;close_pane&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+w&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;split_vertical&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+d&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;split_horizontal&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+shift+d&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;cycle_pane_next&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+]&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;cycle_pane_previous&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+[&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;next_tab&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+shift+]&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;previous_tab&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+shift+[&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;switch_workspace&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd+1..9&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;switch_tab&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alt+1..9&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;herdr config check&lt;/code&gt; validates the TOML and &lt;code&gt;herdr server reload-config&lt;/code&gt; applies it to the running server without a restart. For Alt to work at all, &lt;code&gt;macos-option-as-alt = true&lt;/code&gt; is required in Ghostty, otherwise Option types special characters.&lt;/p&gt;
&lt;p&gt;So far, I&#39;m loving the setup.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Using OpenCode Go models in ZCode harness</title>
    <link href="https://deepakness.com/raw/opencode-go-in-zcode/" />
    <updated>2026-08-28T16:28:56Z</updated>
    <id>https://deepakness.com/raw/opencode-go-in-zcode/</id>
    <summary>How to use OpenCode Go models like GLM-5.3-flash, Kimi, and DeepSeek inside ZCode by adding OpenCode as a custom OpenAI-compatible provider.</summary>
    <content type="html">&lt;p&gt;I subscribe to &lt;a href=&quot;https://go.deepakness.com/opencode&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OpenCode Go&lt;/a&gt; for its open coding models, and the same models work inside ZCode too, because ZCode accepts any custom provider that speaks the OpenAI or Anthropic protocol. Same trick as when I &lt;a href=&quot;https://deepakness.com/raw/nvidia-models-via-opencode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pointed OpenCode itself at NVIDIA&#39;s models&lt;/a&gt; a while back.&lt;/p&gt;
&lt;p&gt;The setup is just a few fields in ZCode&#39;s Model settings. Click &amp;quot;Add provider&amp;quot;, name it OpenCode, and fill these in:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Base URL:   https://opencode.ai/zen/go/v1
API format: Chat completions (/chat/completions)
API key:    your key from opencode.ai/auth&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then click &amp;quot;Add model&amp;quot; and type the model IDs you want, like &lt;code&gt;glm-5.3-flash&lt;/code&gt; or &lt;code&gt;deepseek-v4-flash&lt;/code&gt;, and enable the provider.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;OpenCode provider configured in ZCode with glm-5.3-flash and deepseek-v4-flash&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/opencode-go-in-zcode/zcode-opencode-provider.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;One catch is that Go splits its catalog across two formats. The Qwen and MiniMax models are only served through the Anthropic messages format, so for those add a second provider with the same key, set the format to Anthropic messages (/v1/messages), and use &lt;code&gt;https://opencode.ai/zen/go&lt;/code&gt; as the base URL. ZCode appends &lt;code&gt;/v1/messages&lt;/code&gt; itself. Grok 4.6 and GPT 5.6 Luna don&#39;t work at all, they only exist on OpenAI&#39;s Responses API, which ZCode doesn&#39;t speak.&lt;/p&gt;
&lt;p&gt;Once a model responds, open its edit dialog and set the real context window, max output tokens, and input types. The input types matter most, that&#39;s how ZCode knows &lt;code&gt;glm-5.3-flash&lt;/code&gt; accepts screenshots while &lt;code&gt;deepseek-v4-flash&lt;/code&gt; is text-only.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Editing the glm-5.3-flash model settings in ZCode&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/opencode-go-in-zcode/zcode-edit-model-settings.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;The full live model list stays at &lt;code&gt;https://opencode.ai/zen/go/v1/models&lt;/code&gt;, so I just paste a new ID into ZCode whenever a new model shows up. Go&#39;s limits are dollar-based, $12 per 5 hours, $30 weekly, $60 monthly, so cheaper models like &lt;code&gt;deepseek-v4-flash&lt;/code&gt; stretch the plan much further. And if you are about to subscribe, &lt;a href=&quot;https://deepakness.com/raw/opencode-referral-reward/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;use a referral link&lt;/a&gt;, the $5 reward cuts the 5-hour limit by up to 41%.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Omarchy is the best Linux distro for old laptops</title>
    <link href="https://deepakness.com/raw/the-omarchy/" />
    <updated>2026-08-25T13:54:13Z</updated>
    <id>https://deepakness.com/raw/the-omarchy/</id>
    <summary>After trying Ubuntu, Fedora, and Linux Mint, I think Omarchy is the best Linux distro to install on decade old hardwares.</summary>
    <content type="html">&lt;p&gt;I installed &lt;a href=&quot;https://omarchy.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Omarchy&lt;/a&gt; on my decade-old MacBook Pro this week, and after distro-hopping through Fedora and Mint on the same machine, I am convinced this is the best Linux distro you can put on old hardware. &lt;a href=&quot;https://deepakness.com/raw/fixing-wifi-fedora-macbook/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Fedora needed a lot of surgery&lt;/a&gt; just to get Wi-Fi and the webcam working, and &lt;a href=&quot;https://deepakness.com/raw/fixing-wifi-linux-mint/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mint managed to break its own Wi-Fi driver on the first update&lt;/a&gt;, but Omarchy simply installed cleanly, booted fast, and everything just worked.&lt;/p&gt;
&lt;p&gt;It&#39;s &lt;a href=&quot;https://dhh.dk/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DHH&lt;/a&gt;&#39;s Arch-based distribution with the Hyprland tiling window manager and the Quickshell desktop shell, all configured out of the box. It ships with everything a developer needs on day one, from Neovim to Chromium, Obsidian to LibreOffice, and even Kdenlive and OBS Studio. But what surprised me most is how light it runs, and a laptop from 2014 now boots in seconds and apps open instantly. Yes, faster than others I tried.&lt;/p&gt;
&lt;p&gt;It also helps that the Omarchy community is thriving. The project crossed 30,000 stars on GitHub within a year, and there is now an &lt;a href=&quot;https://deepakness.com/raw/the-year-of-linux/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Omacom foundation&lt;/a&gt; backing it. I already love this distro enough to have been &lt;a href=&quot;https://deepakness.com/raw/omarchy-resource-library/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;collecting Omarchy themes, setups, and resources in one place&lt;/a&gt; for a while.&lt;/p&gt;
&lt;p&gt;I took a lot of photos and screenshots during the install, and here they are.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Installation completed in 1 minutes 57 seconds&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/the-omarchy/install-time.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A beautiful Omarchy theme&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/the-omarchy/theme-1.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A beautiful Omarchy theme&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/the-omarchy/theme-2.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Two tiled windows in a workspace&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/the-omarchy/tiling-windows.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Beautiful, aren&#39;t they?&lt;/p&gt;
</content>
  </entry><entry>
    <title>Linux Mint Wi-Fi and failed update fix on 2014 MacBook Pro</title>
    <link href="https://deepakness.com/raw/fixing-wifi-linux-mint/" />
    <updated>2026-08-25T05:29:20Z</updated>
    <id>https://deepakness.com/raw/fixing-wifi-linux-mint/</id>
    <summary>The first system update on Linux Mint failed on my Mid-2014 MacBook Pro because the Broadcom Wi-Fi driver couldn&#39;t build against the new 7.0 kernel. Here&#39;s the complete fix.</summary>
    <content type="html">&lt;p&gt;After &lt;a href=&quot;https://deepakness.com/raw/fixing-wifi-fedora-macbook/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the Fedora 44 test&lt;/a&gt;, I wiped &lt;a href=&quot;https://deepakness.com/blog/mbp-mid-2014/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the old MacBook Pro&lt;/a&gt; and installed Linux Mint 22 on it, and accepted the Broadcom driver installation that the Driver Manager popup showed. But then the first system update failed, so I spent some time and finally got it fixed.&lt;/p&gt;
&lt;p&gt;The update pulled in the HWE kernel 7.0.0-30, and DKMS couldn&#39;t rebuild the proprietary &lt;code&gt;wl&lt;/code&gt; driver for it, so &lt;code&gt;linux-headers-7.0.0-30-generic&lt;/code&gt;, &lt;code&gt;linux-headers-generic-hwe-24.04&lt;/code&gt;, &lt;code&gt;linux-generic-hwe-24.04&lt;/code&gt;, and &lt;code&gt;linux-image-7.0.0-30-generic&lt;/code&gt; were left unconfigured. By the way, the Wi-Fi was working on the old 6.14 kernel.&lt;/p&gt;
&lt;p&gt;Then, canonical patches &lt;code&gt;wl&lt;/code&gt; 6.30.223.271 for every kernel bump, and while &lt;code&gt;23ubuntu1.2&lt;/code&gt; fixed 6.17, &lt;a href=&quot;https://launchpad.net/bugs/2161038&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;only 23ubuntu1.3 in noble-proposed has the linux-7.0 fix&lt;/a&gt;. I booted into 6.14, and ran this.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;deb http://archive.ubuntu.com/ubuntu noble-proposed restricted&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/noble-proposed.list
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; broadcom-sta-dkms&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6.30&lt;/span&gt;.223.271-23ubuntu1.3
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;--configure&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; /etc/apt/sources.list.d/noble-proposed.list
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;reboot&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The driver install builds &lt;code&gt;wl&lt;/code&gt; for 7.0, and &lt;code&gt;dpkg --configure -a&lt;/code&gt; finishes the stuck packages. After reboot, &lt;code&gt;uname -r&lt;/code&gt; showed &lt;code&gt;7.0.0-30-generic&lt;/code&gt;, &lt;code&gt;lsmod | grep wl&lt;/code&gt; showed the module loaded, and &lt;code&gt;nmcli device status&lt;/code&gt; showed &lt;code&gt;wlp2s0&lt;/code&gt; connected on 5 GHz.&lt;/p&gt;
&lt;p&gt;The locale warnings in the update output went away after &lt;code&gt;sudo dpkg-reconfigure locales&lt;/code&gt; with &lt;code&gt;en_IN.UTF-8&lt;/code&gt; selected, because &lt;code&gt;en_IN.ISO8859-1&lt;/code&gt; was never generated on the system. And for next time, &lt;code&gt;b43&lt;/code&gt; doesn&#39;t support this BCM4360&#39;s AC revision, installing the driver after the update wouldn&#39;t have helped either, and after any future kernel update the same check applies.&lt;/p&gt;
&lt;p&gt;Can look at &lt;code&gt;apt-cache policy broadcom-sta-dkms&lt;/code&gt; for a newer version in noble-proposed.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Fedora 44 Wi-Fi and Webcam fix on Mid-2014 MacBook Pro</title>
    <link href="https://deepakness.com/raw/fixing-wifi-fedora-macbook/" />
    <updated>2026-08-24T17:20:00Z</updated>
    <id>https://deepakness.com/raw/fixing-wifi-fedora-macbook/</id>
    <summary>Wi-Fi and the FaceTime webcam didn&#39;t work after installing Fedora 44 on my Mid 2014 MacBook Pro, and here are the fixes.</summary>
    <content type="html">&lt;p&gt;I installed Fedora 44 on &lt;a href=&quot;https://deepakness.com/blog/mbp-mid-2014/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the $100 MacBook Pro I bought recently&lt;/a&gt; just to test Linux on it, and Wi-Fi simply didn&#39;t exist – no network, no wlan interface, and literally nothing in NetworkManager. And after spending a lot of time, here&#39;s the short version of how it was fixed.&lt;/p&gt;
&lt;p&gt;I discovered, the MacBook has a Broadcom BCM4360 Wi-Fi chip &lt;code&gt;14e4:43a0&lt;/code&gt; and the open-source &lt;code&gt;b43&lt;/code&gt; driver that Fedora loads by default doesn&#39;t support this 802.11ac chip, so the card sits there unable to do anything. It needs the proprietary &lt;code&gt;broadcom-wl&lt;/code&gt; driver, which lives in the RPM Fusion nonfree repo, and obviously doesn&#39;t automatically get installed.&lt;/p&gt;
&lt;p&gt;So the fix starts with enabling the nonfree repo and installing the driver.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rpm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; %fedora&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;.noarch.rpm

&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; akmod-wl kernel-devel-&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;akmod-wl&lt;/code&gt; package builds the &lt;code&gt;wl&lt;/code&gt; kernel module for your running kernel and rebuilds it automatically after future kernel updates. Next, needed to stop the open drivers from claiming the card by creating &lt;code&gt;/etc/modprobe.d/broadcom-wl.conf&lt;/code&gt; with these lines.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;blacklist b43
blacklist b43legacy
blacklist brcmsmac
blacklist ssb
blacklist bcma
blacklist bcm43xx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And make sure &lt;code&gt;wl&lt;/code&gt; loads at boot by putting a single line in &lt;code&gt;/etc/modules-load.d/wl.conf&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then build the module and reboot.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; akmods
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;reboot&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After the reboot Wi-Fi showed up in the toolbar and in GNOME settings and connected without any issues. By the way, &lt;a href=&quot;https://wiki.gentoo.org/wiki/Android_USB_tethering&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;USB tethering via my Android device&lt;/a&gt; got me through the setup, because that was the only way to use internet on the Fedora device.&lt;/p&gt;
&lt;p&gt;Apart from this, &lt;strong&gt;the webcam also didn&#39;t work&lt;/strong&gt; and needed more work. This MacBook has a Broadcom 720p FaceTime HD camera (&lt;code&gt;14e4:1570&lt;/code&gt;) with no open driver at all, so &lt;code&gt;/dev/video0&lt;/code&gt; never appears. The fix has two parts, and I also installed &lt;code&gt;lm_sensors&lt;/code&gt; along the way to read fan speeds and temperatures.&lt;/p&gt;
&lt;p&gt;First the driver. It&#39;s out-of-tree and built via DKMS, which already has &lt;code&gt;kernel-devel&lt;/code&gt; available from the Wi-Fi setup.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; dkms

&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/patjak/bcwc_pcie.git
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; bcwc_pcie /usr/src/facetimehd-0.7.0.1
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; facetimehd/0.7.0.1
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms build facetimehd/0.7.0.1
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dkms &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; facetimehd/0.7.0.1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then the firmware. The camera needs Apple&#39;s proprietary firmware extracted from the macOS 10.12.6 update, and there&#39;s a script that pulls only the needed chunks from Apple&#39;s CDN and verifies them by SHA256.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/patjak/facetimehd-firmware.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; facetimehd-firmware
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ./facetimehd-firmware-install.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The script drops &lt;code&gt;firmware.bin&lt;/code&gt; and eleven sensor calibration files into &lt;code&gt;/usr/lib/firmware/facetimehd/&lt;/code&gt;. Then load the module and the camera appears.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; modprobe facetimehd
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; /dev/video0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I verified it with a one-frame &lt;code&gt;ffmpeg&lt;/code&gt; capture, which produced a proper 122 KB JPEG. To make it persistent across reboots, add &lt;code&gt;facetimehd&lt;/code&gt; to &lt;code&gt;/etc/modules-load.d/facetimehd.conf&lt;/code&gt; and &lt;code&gt;/etc/dracut.conf.d/facetimehd.conf&lt;/code&gt;, then rebuild the initramfs.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;facetimehd&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/modules-load.d/facetimehd.conf
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;add_drivers+=&quot; facetimehd &quot;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/dracut.conf.d/facetimehd.conf
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dracut &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DKMS rebuilds the camera module automatically on kernel updates, the same way akmods handles the Wi-Fi driver. Secure Boot is a non-issue on this machine since Apple&#39;s EFI doesn&#39;t support it, so the unsigned modules load without any key enrollment.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Get 10% off Z.ai GLM coding with a referral link</title>
    <link href="https://deepakness.com/raw/z-ai-referral-discount/" />
    <updated>2026-08-22T20:31:30Z</updated>
    <id>https://deepakness.com/raw/z-ai-referral-discount/</id>
    <summary>Z.ai gives invited users a 10% instant discount on their first GLM Coding subscription. Sign up through my referral link and the discount is applied automatically at checkout.</summary>
    <content type="html">&lt;p&gt;Z.ai runs an &amp;quot;Invite Friends, Get Credits&amp;quot; campaign, and if you sign up to the GLM Coding plan through &lt;a href=&quot;https://go.deepakness.com/z-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my Z.ai referral link&lt;/a&gt;, you get a 10% instant discount on your first subscription. The discount is applied automatically at checkout, so there&#39;s no coupon code to remember.&lt;/p&gt;
&lt;p&gt;Here are the conditions from the &lt;a href=&quot;https://docs.z.ai/devpack/credit-campaign-rules&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;official campaign rules&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The discount works for new accounts and for existing accounts with no paid subscription history.&lt;/li&gt;
&lt;li&gt;It applies to the first GLM Coding order only. Renewals, upgrades, and downgrades are not eligible.&lt;/li&gt;
&lt;li&gt;It can&#39;t be stacked with other similar first-order discounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On my side, if you subscribe through the link, I earn credits worth 10% of what you pay, and up to 20% with their tiered bonus. It&#39;s a win-win, similar to &lt;a href=&quot;https://deepakness.com/raw/opencode-referral-reward/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the OpenCode referral reward&lt;/a&gt; I wrote about earlier.&lt;/p&gt;
&lt;p&gt;That&#39;s it.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Find all subdomains of a domain with crt.name</title>
    <link href="https://deepakness.com/raw/find-subdomains/" />
    <updated>2026-08-21T23:14:19Z</updated>
    <id>https://deepakness.com/raw/find-subdomains/</id>
    <summary>crt.name is a pre-built subdomain index compiled from CT logs and other archives. Query it from the browser with a single URL.</summary>
    <content type="html">&lt;p&gt;Came across &lt;a href=&quot;https://x.com/cryptoshan484/status/2090486831137886703&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this post on X&lt;/a&gt; that shared a trick to find all subdomains of a domain. You add your domain in the URL below, visit it in your browser, and it shows you a bunch of subdomains:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://crt.name/v1/search?apex=YOUR_DOMAIN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Just replace &lt;code&gt;YOUR_DOMAIN&lt;/code&gt; with a domain and it lists every subdomain it has on file. The index is pre-built, and as &lt;a href=&quot;https://crt.name/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;their website explains&lt;/a&gt;, the data is assembled from multiple archives. Certificate transparency logs, retired CT logs replayed from the Internet Archive, Common Crawl, ICANN CZDS zone files, ProjectDiscovery Chaos, HaGeZi blocklists, and a prober that checks common hostnames against known apexes.&lt;/p&gt;
&lt;p&gt;Since it aggregates so many sources, the results lean toward anything that ever existed for that apex. During my testing, most of the subdomains were either old, dead, or even something that I never set up in the first place.&lt;/p&gt;
</content>
  </entry><entry>
    <title>2026: The year of Linux Desktops</title>
    <link href="https://deepakness.com/raw/the-year-of-linux/" />
    <updated>2026-08-21T16:48:21Z</updated>
    <id>https://deepakness.com/raw/the-year-of-linux/</id>
    <summary>Omarchy downloads are near 5,000 a day, the Omacom foundation launched with $8 million, and I&#39;m finally ready to move back to Linux.</summary>
    <content type="html">&lt;p&gt;Welcome to the year of Linux desktops, 2026!&lt;/p&gt;
&lt;p&gt;DHH has truly created a revolution with his &lt;a href=&quot;https://omarchy.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Linux distro Omarchy&lt;/a&gt;. Just over a year after the &lt;a href=&quot;https://github.com/basecamp/omarchy/releases/tag/v1.1.1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;initial launch&lt;/a&gt;, the Omarchy ISO is now being downloaded &lt;a href=&quot;https://x.com/dhh/status/2090527345534722053&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;almost 5,000 times&lt;/a&gt; every day.&lt;/p&gt;
&lt;p&gt;Recently, the &lt;a href=&quot;https://omarchy.org/news/2026/08/omacom-foundation-launches-with-8-million/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Omacom foundation was launched&lt;/a&gt; with a whopping $8 million in funds, and the following 8 patrons contributed $1 million each for the cause.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Omarchy Omacom Patrons&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/the-year-of-linux/omarchy-patrons.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Legendary folks, no?&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&quot;https://deepakness.com/blog/manjaro-linux/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Linux for 5–6 years&lt;/a&gt;, then went back to Windows and am currently using macOS, but I have never been more excited to try Linux again. I watched &lt;a href=&quot;https://www.youtube.com/watch?v=F7fe9pa8OeE&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DHH&#39;s new video&lt;/a&gt;. The new &lt;a href=&quot;https://github.com/basecamp/omarchy/releases/tag/v4.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Omarchy Quattro&lt;/a&gt; looks amazing. And the next chance I get to upgrade my setup, I am moving to Linux once and for all.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Chrome Web Store revises limits on extensions</title>
    <link href="https://deepakness.com/raw/chrome-extensions-limits/" />
    <updated>2026-08-20T22:31:32Z</updated>
    <id>https://deepakness.com/raw/chrome-extensions-limits/</id>
    <summary>Chrome Web Store has revised the limits of publishing Chrome extensions from the Web Store developer dashboard.</summary>
    <content type="html">&lt;p&gt;Recently, Chrome Web Store has revised its limits on number of extensions you can publish to the Web Store. I don&#39;t know what the limit was earlier, but now, for new accounts it starts from the limit of 2 published extensions as explained &lt;a href=&quot;https://developer.chrome.com/docs/webstore/publish/#item_limits&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;on this docs page&lt;/a&gt;. You can request an increase when you hit the limit of 2, and then limits increased to 4 or more, as you progress. Right now, I&#39;m at this limit of 10 published extensions as you see in the screenshot.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Chrome Web Store published extensions limits&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/chrome-extensions-limits/cws-my-limiits.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;And I see the below message in a popup when I click on this 8/10 limits button.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Chrome Web Store message shown for limits&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/chrome-extensions-limits/cws-limits-message.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Neither in their docs and nor in the developer dashboard it&#39;s mentioned if they will further entertain my request to increase limits from 10 to more. But I&#39;m about to publish a few extensions so let&#39;s see how it goes.&lt;/p&gt;
&lt;p&gt;I will keep this page updated as I learn more.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Managing AI agent workspaces with Herdr</title>
    <link href="https://deepakness.com/raw/herdr-setup/" />
    <updated>2026-08-20T19:38:13Z</updated>
    <id>https://deepakness.com/raw/herdr-setup/</id>
    <summary>A quick breakdown of how I use Herdr as a terminal workspace manager that ties Pi, Grok, and Antigravity sessions to project panes.</summary>
    <content type="html">&lt;p&gt;After &lt;a href=&quot;https://deepakness.com/raw/cmux-config/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;configuring cmux&lt;/a&gt; and &lt;a href=&quot;https://deepakness.com/raw/using-kero/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;trying out Kero&lt;/a&gt;, I&#39;ve been testing &lt;a href=&quot;https://herdr.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;herdr&lt;/a&gt; as a terminal workspace manager built around coding agents. Each project gets its own workspace with tabs and panes, and herdr remembers which agent session lives where.&lt;/p&gt;
&lt;p&gt;Everything sits in plain files under &lt;code&gt;~/.config/herdr/&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;~/.config/herdr/config.toml    settings and theme
~/.config/herdr/session.json   workspaces, tabs, panes, agent sessions
~/.config/herdr/herdr.log      plus herdr-server.log and herdr-client.log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My herdr config is small, a gruvbox UI theme with agent labels on pane borders.&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;ui&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;status_indicators&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;symbols&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;show_agent_labels_on_pane_borders&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gruvbox&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;auto_switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;ui.toast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;delivery&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;terminal&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I run herdr as a TUI inside the Ghostty terminal. Ghostty reads the same config file my cmux setup already used at &lt;code&gt;~/.config/ghostty/config&lt;/code&gt;, so the terminal look carried over as-is. I only changed the theme to Gruvbox Dark and left everything else default. Here&#39;s how it looks currently, but obviously I will keep improving it:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Using Herdr in Ghostty&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/herdr-setup/herdr-in-ghostty.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Herdr detects the agents in each pane and shows their state, working, blocked, or idle, right in the sidebar. And it&#39;s all just so convenient to use and manage.&lt;/p&gt;
&lt;p&gt;Everything is saved to &lt;code&gt;session.json&lt;/code&gt;, so reopening herdr brings back every workspace exactly as it was, which was the one thing I missed in Kero and it somewhat worked in cmux but wasn&#39;t reliable. I&#39;m still testing it alongside cmux, but it&#39;s looking like it could become my permanent setup, eventually.&lt;/p&gt;
&lt;p&gt;Apart from this, the most clear, to the point, and convincing video I ever watched about herdr is &lt;a href=&quot;https://www.youtube.com/watch?v=qnIu-Xu64H0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this one from Jilles&lt;/a&gt;. This video is the reason I installed and started using herdr.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Don&#39;t send report, send prompt instead</title>
    <link href="https://deepakness.com/raw/send-prompt-instead/" />
    <updated>2026-08-20T08:00:31Z</updated>
    <id>https://deepakness.com/raw/send-prompt-instead/</id>
    <summary>This post from Naval made me laugh and it also points out the irony in today&#39;s AI world.</summary>
    <content type="html">&lt;p&gt;&lt;img alt=&quot;Don&#39;t send me the report, just send me the prompt.&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/send-prompt-instead/naval-quote.png&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&#39;t send me the report, just send me the prompt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This &lt;a href=&quot;https://x.com/naval/status/2089273166049009797&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;post on X from Naval&lt;/a&gt; made me laugh that basically points out the irony when people use AI for everything.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Setting up Hetzner Qwen3.8-27B in the Pi agent</title>
    <link href="https://deepakness.com/raw/hetzner-qwen-in-pi/" />
    <updated>2026-08-19T04:47:37Z</updated>
    <id>https://deepakness.com/raw/hetzner-qwen-in-pi/</id>
    <summary>Adding Hetzner&#39;s experimental Inference API as a provider in the Pi coding agent via models.json, with the full config to copy.</summary>
    <content type="html">&lt;p&gt;I added the &lt;a href=&quot;https://docs.hetzner.com/general/company-and-policy/experiments/inference/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hetzner Inference API&lt;/a&gt; as a provider in my &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi agent&lt;/a&gt;, the same way I &lt;a href=&quot;https://deepakness.com/raw/nvidia-models-via-opencode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;set up NVIDIA models in OpenCode&lt;/a&gt;. Hetzner runs an OpenAI-compatible REST API at &lt;code&gt;inference.hetzner.com&lt;/code&gt; serving open-weight Qwen models. To get an API token you log in to &lt;a href=&quot;https://experiments.hetzner.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;experiments.hetzner.com&lt;/a&gt; and create one from the Inference app there. The service is free while it stays experimental, but you still have to add a credit card to the account before it lets you generate a token. The docs are at Hetzner&#39;s Inference API page linked above.&lt;/p&gt;
&lt;p&gt;Custom providers in pi live in &lt;code&gt;~/.pi/agent/models.json&lt;/code&gt; and the model ID to use is &lt;code&gt;Qwen3.8-27B&lt;/code&gt;, and you can always check the live model list with:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; https://inference.hetzner.com/api/v1/models &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Authorization: Bearer &amp;lt;YOUR_TOKEN&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is the full provider config:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;providers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;hetzner&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;baseUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://inference.hetzner.com/api/v1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;openai-completions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;apiKey&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;YOUR_TOKEN&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;compat&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;supportsDeveloperRole&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;supportsReasoningEffort&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;models&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Qwen3.8-27B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Qwen3.8 27B (Hetzner)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;reasoning&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;contextWindow&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;262144&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;cost&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;output&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cacheRead&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cacheWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;compat&lt;/code&gt; flags tell pi to send a plain &lt;code&gt;system&lt;/code&gt; message instead of the &lt;code&gt;developer&lt;/code&gt; role and to skip the &lt;code&gt;reasoning_effort&lt;/code&gt; field, which the Qwen server does not understand. &lt;code&gt;reasoning: true&lt;/code&gt; enables thinking mode, &lt;code&gt;input&lt;/code&gt; allows text and image messages, and the context window is 262k tokens.&lt;/p&gt;
&lt;p&gt;No restart needed. Open &lt;code&gt;/model&lt;/code&gt; inside pi and the model appears as Qwen3.8 27B (Hetzner), since the file reloads whenever you open the model picker. Keep &lt;code&gt;models.json&lt;/code&gt; readable only by your user because the key sits in plain text. Rate limits are 10 requests and 100k output tokens per minute, and going over returns HTTP 429.&lt;/p&gt;
</content>
  </entry><entry>
    <title>A page for personal websites I like</title>
    <link href="https://deepakness.com/raw/personal-websites-page/" />
    <updated>2026-08-18T02:49:36Z</updated>
    <id>https://deepakness.com/raw/personal-websites-page/</id>
    <summary>Added a personal websites page to the site, collecting websites I like as screenshot cards with homepage snapshots.</summary>
    <content type="html">&lt;p&gt;I added a new page on my site for &lt;a href=&quot;https://deepakness.com/personal-websites/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;personal websites I like&lt;/a&gt;. Each site gets a card with a snapshot of its homepage, taken the day the site was added, so the screenshot may not match what the site looks like today. The card also shows the site&#39;s dominant background color and how heavy the homepage&#39;s code is, meaning the HTML, CSS, JavaScript and fonts it loads, with images and video excluded.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Personal sites I like&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/personal-websites-page/personal-sites.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;The page sorts the cards by name by default, with options to sort by newest or oldest added, plus a filter for the code weight bands. Cards past the second row are deferred with &lt;code&gt;content-visibility: auto&lt;/code&gt;, so the page stays fast as the collection grows.&lt;/p&gt;
&lt;p&gt;I will keep adding interesting personal websites as I discover more.&lt;/p&gt;
</content>
  </entry><entry>
    <title>A clock for DeepSeek&#39;s time-of-day pricing</title>
    <link href="https://deepakness.com/raw/deepseek-price-clock/" />
    <updated>2026-08-22T00:00:00Z</updated>
    <published>2026-08-17T04:53:35Z</published>
    <id>https://deepakness.com/raw/deepseek-price-clock/</id>
    <summary>DeepSeek API pricing now varies by time of day, so I built a clock page to show which half of the day I&#39;m in.</summary>
    <content type="html">&lt;p&gt;DeepSeek &lt;a href=&quot;https://api-docs.deepseek.com/news/news260813/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;moved its API rates to time-of-day pricing&lt;/a&gt; with the V4 Pro release. The cheap hours cost exactly half of the expensive ones, and the boundaries are fixed in UTC. Anywhere else in the world that means converting in your head every single time, so I built &lt;a href=&quot;https://deepakness.com/deepseek/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;a DeepSeek peak/off-peak pricing clock page&lt;/a&gt; that shows which half of the day I&#39;m in right now.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DeepSeek peak/off-peak pricing clock&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/deepseek-price-clock/ds-peak-time-clock.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;By the way, &lt;a href=&quot;https://deepakness.com/deepseek/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;you can check the clock here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The page shows whether it&#39;s cheap or expensive right now, how long the window lasts, when it flips next in local time, and what both models cost either way. In IST the cheap stretch runs from 3:30 PM to 6:30 AM, with expensive blocks at 6:30–9:30 AM and 11:30 AM–3:30 PM.&lt;/p&gt;
&lt;p&gt;I queue my non-urgent jobs during the cheap half and the bill drops by 50%. I&#39;ve been running V4 Pro as my daily model since &lt;a href=&quot;https://deepakness.com/raw/deepseek-v4-pro/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;an earlier note&lt;/a&gt;, so the clock has been earning its keep. The rates come straight from &lt;a href=&quot;https://api-docs.deepseek.com/quick_start/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the official pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Sat Aug 22, 2026&lt;/p&gt;
&lt;p&gt;DeepSeek &lt;a href=&quot;https://api-docs.deepseek.com/quick_start/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;changed the weekend rules&lt;/a&gt; barely a week after launching the clock. From 00:00 Beijing time on August 23, 2026, Saturdays and Sundays (Beijing time) are billed at the off-peak rate all day, and the weekday windows stay exactly as they were. In IST the cheap stretch now runs non-stop from Friday 3:30 PM to Monday 6:30 AM. The clock page handles the weekend schedule automatically, so it&#39;s still the one URL to keep open.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Trying the New DeepSeek Harness</title>
    <link href="https://deepakness.com/blog/deepseek-harness/" />
    <updated>2026-08-16T12:48:37Z</updated>
    <id>https://deepakness.com/blog/deepseek-harness/</id>
    <summary>My experience of installing and setting up the new DeepSeek harness, running it with DeepSeek models via OpenCode Go, and what I liked and disliked about it.</summary>
    <content type="html">&lt;p&gt;After building such great Pro and Flash models, DeepSeek has decided to step into the harness game as well. Their harness is based on this philosophy of &amp;quot;everything is a plugin&amp;quot;, much like the &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi coding agent&lt;/a&gt;. I have been using Pi with DeepSeek models for months now, so I was curious to see DeepSeek&#39;s own take on the idea.&lt;/p&gt;
&lt;p&gt;All tech news and influencers are talking about &lt;a href=&quot;https://deepseek.com/harness/en/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the new DeepSeek harness&lt;/a&gt;, so I had to give it a try. And my experience so far is pretty good to be honest. In this post, I will explain how I installed and set up the harness for myself and what I liked and disliked about it.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DeepSeek harness landing page&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/dsh.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;What is the DeepSeek Harness?&lt;/h2&gt;
&lt;p&gt;The DeepSeek Harness or &lt;code&gt;dsh&lt;/code&gt; is an open-source agent harness from DeepSeek AI, and that tagline is not just marketing – every part of the product, from the model adapter to the session log to the agent loop itself, is a plugin. It runs on &lt;a href=&quot;https://github.com/cordiverse/cordis&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cordis&lt;/a&gt;, so there is no core to patch. You swap a part by mounting another plugin beside it.&lt;/p&gt;
&lt;p&gt;The agent can read and edit workspace files, run commands, delegate work to subagents, and keep a plan as it goes.&lt;/p&gt;
&lt;p&gt;It is currently in developer preview, and the team is upfront about it in the repo README. It ships as a Web UI at &lt;code&gt;http://127.0.0.1:3080&lt;/code&gt;, but that is just one way to use it. There is also a headless mode and a Python SDK for programmatic use, though I did not use them this time.&lt;/p&gt;
&lt;h2&gt;Installing the DeepSeek Harness&lt;/h2&gt;
&lt;p&gt;As mentioned on &lt;a href=&quot;https://github.com/deepseek-ai/deepseek-harness&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;their GitHub repo page&lt;/a&gt;, using the &lt;code&gt;npx @deepseek-ai/dsh web&lt;/code&gt; command in the terminal is the best way to quickly install and use the harness. But it didn&#39;t work for me and threw the following errors.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DeepSeek harness installation npx command error&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/npx-command-errors.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I then quickly cloned the repo and ran it from the source with the following commands.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/deepseek-ai/deepseek-harness.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; deepseek-harness
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; run build
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; dsh web&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&#39;s straightforward, and the process takes just over a minute. You get this &lt;code&gt;http://127.0.0.1:3080&lt;/code&gt; URL in the terminal that I opened in the browser. It showed me an &amp;quot;internal testing warning&amp;quot; popup and then asked me to provide the official DeepSeek API key or configure later, as you see.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DeepSeek official API key&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/ds-api-key.png&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Setting up a provider&lt;/h2&gt;
&lt;p&gt;My first impression was that this only works with the official DeepSeek provider, but it works with almost all major providers, and you can add custom ones for any OpenAI-compatible endpoint. Everything lives under Settings &amp;gt; Models.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DeepSeek harness provider setup&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/ds-model-picker.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I added &lt;a href=&quot;https://go.deepakness.com/opencode&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my OpenCode Go API key&lt;/a&gt; as you see above, and everything was set to start using OpenCode models inside the harness.&lt;/p&gt;
&lt;p&gt;I already use DeepSeek v4 Pro and Flash through my OpenCode Go subscription inside Pi, so the harness now runs the same models with the same thinking levels. The key itself lands in &lt;code&gt;~/.dsh/.credentials.yaml&lt;/code&gt;, while the settings file keeps only a reference to it – the UI never shows the secret back. My &lt;code&gt;~/.dsh/settings.yaml&lt;/code&gt; looks like this.&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;llm-pi-ai&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;opencode-go&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;apiKeyEnv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; OPENCODE_GO_API_KEY
&lt;span class=&quot;token key atrule&quot;&gt;agent-default-model&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; opencode&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;go
  &lt;span class=&quot;token key atrule&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; deepseek&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;v4&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;pro
  &lt;span class=&quot;token key atrule&quot;&gt;reasoningEffort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; max&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;llm-pi-ai&lt;/code&gt; key at the top is a fun detail. The generic provider adapter is built on &lt;a href=&quot;https://github.com/earendil-works/pi/tree/main/packages/ai&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pi-ai&lt;/a&gt;, the model-provider library from the same team behind Pi. So the harness and my favorite terminal agent share more than just the plugin philosophy.&lt;/p&gt;
&lt;p&gt;Model changes apply on the next request without restarting the server.&lt;/p&gt;
&lt;h2&gt;Using the DeepSeek Harness&lt;/h2&gt;
&lt;p&gt;After I added a local folder (they call it a workspace), honestly, it felt like I&#39;m using the Codex app or ChatGPT web interface. All sessions are on the left side, and you can easily switch among them across different projects.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Working with the DeepSeek harness&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/agents-working.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I really liked the UI and UX.&lt;/p&gt;
&lt;p&gt;The first real task I gave it was a deep read-only audit of this very website&#39;s repo. I asked it to go through every single line of code, from all perspectives, and give me a brief report. It read my &lt;code&gt;AGENTS.md&lt;/code&gt; file first, so all my site rules were in the conversation. Then it split the entire audit into six parallel subagents. One took &lt;code&gt;scripts/&lt;/code&gt;, another &lt;code&gt;_data/&lt;/code&gt;, one went through all 161 blog posts, another all 491 raw notes, and the rest took templates, CSS, and the top-level content pages.&lt;/p&gt;
&lt;p&gt;And here is the part I really liked. Each subagent got its own session, and the dropdown at the top showed me exactly how many were working and the progress on each of them.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Subagent dropdown in DeepSeek harness&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/subagents-dropdown.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Apart from the subagents, I also loved the live stats at the bottom – tok/sec, cache hit rate, tool calls, turns, steps. None of it is necessary, but it makes the whole session feel transparent.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Harness useful info&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/useful-info.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;There is also a &lt;a href=&quot;https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-trajectory/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Trajectory tab&lt;/a&gt; for each session that shows the whole session as a timeline – every turn, step, tool call, and nested sub-tool call, each with its token usage and how long it took. Clicking a request opens its input, output, and timing details. It is the most transparent agent UI I have used.&lt;/p&gt;
&lt;p&gt;It also felt safe. Everything ran inside the workspace, and the UI asked before anything that needed approval.&lt;/p&gt;
&lt;h2&gt;Session modes&lt;/h2&gt;
&lt;p&gt;The harness ships with four session modes, and you pick one when you start a session. A session&#39;s mode is fixed at creation – you cannot switch it mid-session, so a different mode means starting a new session.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;dsh different session modes&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/blog/deepseek-harness/session-modes.png&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Standard mode&lt;/strong&gt; is the full coding agent – file editing, shell, file and web search, skills, planning, goals, subagents, and workflows. It is the default, and the mode I have been using for everything so far.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code mode&lt;/strong&gt; has all of Standard&#39;s capabilities, but the tools are presented through the Code Mode SDK. Instead of one tool call per action, the model writes a single TypeScript program against a generated SDK and runs it in one go – a sequence that would take five round trips becomes one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal mode&lt;/strong&gt; is the opposite extreme, just two tools, a persistent bash shell and the &lt;code&gt;str_replace_editor&lt;/code&gt; file editor. No search, no skills, no subagents, no planning. The smallest possible coding agent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creator mode&lt;/strong&gt; is for making your own presets. It has all of Standard&#39;s capabilities plus a toolset that can inspect the running harness, experiment with plugins, and author presets. You can duplicate any built-in preset and make it yours, or let the agent draft a custom one for you in Creator mode.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The picker lives in the Agent presets section of the UI, and you can set a default mode for new sessions so you do not have to pick every time.&lt;/p&gt;
&lt;h2&gt;Things I like about the DeepSeek Harness&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Everything is a plugin, for real.&lt;/strong&gt; There is no core to patch, unlike most tools where you get whatever the vendor ships. It feels like Pi&#39;s philosophy with a polished GUI on top, and it is fully open source under MIT – no company decides what features I get.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Web UI is clean.&lt;/strong&gt; Sessions on the left, workspaces, and a Codex, ChatGPT or Gemini-like feel without giving up local files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subagents with live progress.&lt;/strong&gt; The parallel audit would have taken forever in a single thread. Six agents, one dropdown, and live progress on each one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Honest stats at the bottom.&lt;/strong&gt; tok/sec, cache hit rate, tool calls, turns, steps. I wish more tools showed numbers like these.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Any provider you want.&lt;/strong&gt; I plugged in &lt;a href=&quot;https://go.deepakness.com/opencode&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OpenCode Go&lt;/a&gt; and was done. Keys stay in &lt;code&gt;~/.dsh/&lt;/code&gt; on my machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safe by default.&lt;/strong&gt; A workspace-only sandbox plus approval prompts before risky operations.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Things I didn&#39;t like&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;npx&lt;/code&gt; install did not work for me and I had to run it from source. Not a big deal, but the &amp;quot;one command&amp;quot; pitch should work.&lt;/li&gt;
&lt;li&gt;Starting it is not instant. I have to launch the server from a terminal and then open the localhost URL in the browser before I can start working. It is fine once it is running, but it is more friction than just typing &lt;code&gt;pi&lt;/code&gt; in the terminal.&lt;/li&gt;
&lt;li&gt;It does not ping you when a task finishes. No sound, no notification – the harness just sits quietly in its browser tab, so for long-running tasks I keep switching back to check whether the agent is done yet.&lt;/li&gt;
&lt;li&gt;DeepSeek models are text-only, so pasting an image into the harness does not work. In Pi I use a vision-handoff package that describes images with a separate vision model, and I have not found the equivalent setup in the harness yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;DeepSeek Harness is the GUI-shaped plugin agent I did not know I wanted. Pi stays my terminal agent for side projects and experiments, and Grok Build and Claude Code keep their roles in my &lt;a href=&quot;https://deepakness.com/ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AI stack&lt;/a&gt; – the harness is a strong addition, not a replacement yet.&lt;/p&gt;
&lt;p&gt;After Pi and &lt;a href=&quot;https://deepakness.com/blog/omp-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OMP&lt;/a&gt;, the plugin-first idea has clearly spread, and now DeepSeek ships their own take with real polish. I will keep using it for this site&#39;s work and update this post as I learn more.&lt;/p&gt;
&lt;p&gt;If something breaks, &lt;a href=&quot;https://github.com/deepseek-ai/deepseek-harness/discussions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub Discussions&lt;/a&gt; and &lt;a href=&quot;https://discord.gg/Ycq5dCaS4&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;their Discord server&lt;/a&gt; are the places to report it.&lt;/p&gt;
</content>
  </entry><entry>
    <title>DeepSeek models are better for writing</title>
    <link href="https://deepakness.com/raw/deepseek-better-for-writing/" />
    <updated>2026-08-14T09:56:59Z</updated>
    <id>https://deepakness.com/raw/deepseek-better-for-writing/</id>
    <summary>While I don&#39;t write anything using AI, I tried different models for writing and I feel DeepSeek models are much more real and natural at writing.</summary>
    <content type="html">&lt;p&gt;I do many things using AI, but writing isn&#39;t one of them. However, I tried different models for writing and I feel both DeepSeek v4 Pro (0813) and DeepSeek v4 Flash (0731) models are much better at writing than others. Their writing style is more natural and very close to how I write, but the writing from Grok, GPT, and Claude models isn&#39;t that good.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Antigravity login bans for omp and Pi agent users</title>
    <link href="https://deepakness.com/raw/antigravity-omp-bans/" />
    <updated>2026-08-13T19:21:52Z</updated>
    <id>https://deepakness.com/raw/antigravity-omp-bans/</id>
    <summary>Using your Google AI Pro subscription&#39;s Antigravity access inside omp or Pi can get your account banned. Both projects have the ban reports, and Pi&#39;s maintainer removed the providers because of it.</summary>
    <content type="html">&lt;p&gt;I already &lt;a href=&quot;https://deepakness.com/raw/google-bans-accounts/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;wrote about Google banning users&lt;/a&gt; for using Antigravity with OpenClaw back in February this year. And it turns out the same applies to terminal coding agents like &lt;strong&gt;omp&lt;/strong&gt; and &lt;strong&gt;Pi&lt;/strong&gt;, which use your Google login to hit the Antigravity backend.&lt;/p&gt;
&lt;p&gt;The omp maintainer &lt;a href=&quot;https://github.com/can1357/oh-my-pi/issues/190&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;was asked&lt;/a&gt; whether using it via OAuth is safe, and his answer was &amp;quot;You can get banned, I can&#39;t really give you any guarantee.&amp;quot;&lt;/p&gt;
&lt;p&gt;In fact, one user got banned 20 minutes after opening a Pro plan through the standard &lt;code&gt;/login&lt;/code&gt; flow, another omp user &lt;a href=&quot;https://github.com/can1357/oh-my-pi/issues/478&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;got suspended a day after logging in&lt;/a&gt;, and a Pi user got banned after using Pi with Antigravity &lt;a href=&quot;https://github.com/google-gemini/gemini-cli/discussions/20632&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;just once&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The reports were consistent enough that &lt;a href=&quot;https://github.com/earendil-works/pi/commit/fe66edd9&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi&#39;s maintainer removed both the Antigravity and Gemini CLI providers&lt;/a&gt; from the project in April. In &lt;a href=&quot;https://github.com/earendil-works/pi/issues/2361&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this Pi issue&lt;/a&gt;, a banned user was told point blank, &amp;quot;DO NOT use Pi with Google auth under any circumstances, if you want to use Gemini models you must get an API key from Google Cloud/Vertex&amp;quot;.&lt;/p&gt;
&lt;p&gt;Google&#39;s &lt;a href=&quot;https://antigravity.google/terms&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Antigravity terms&lt;/a&gt; call using third-party software with your Antigravity login a direct ToS breach. The first flag is probably recoverable through an appeal form, the second one is a permanent ban, and Google also &lt;a href=&quot;https://developers.google.com/gemini-code-assist/docs/deprecations/code-assist-individuals&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;killed the consumer Gemini CLI &amp;quot;Login with Google&amp;quot; option&lt;/a&gt; a few months ago.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I also made this mistake and was using both Antigravity and Claude Code models via omp, but thankfully people warned me when I shared about this on Reddit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So... if you want to use Gemini models, use an AI Studio API key or Vertex AI instead. Otherwise, use the Antigravity CLI, it&#39;s not so bad.&lt;/p&gt;
</content>
  </entry><entry>
    <title>How I embed videos in notes now</title>
    <link href="https://deepakness.com/raw/co-located-videos/" />
    <updated>2026-08-13T16:42:55Z</updated>
    <id>https://deepakness.com/raw/co-located-videos/</id>
    <summary>How videos get added to this site. Drop a recording into the note folder and pnpm ready transcodes it, makes a poster, and uploads everything to R2.</summary>
    <content type="html">&lt;p&gt;Every video on this site now lives next to the note that uses it, the &lt;a href=&quot;https://deepakness.com/blog/better-images/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;same way images do&lt;/a&gt;. I drop a video into the note folder, reference it with one shortcode line, and &lt;code&gt;pnpm ready&lt;/code&gt; handles the rest – transcoding, thumbnail/poster, upload, and the player.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drop the recording into the note folder, like &lt;code&gt;content/raw/some-note/demo.mov&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reference the mp4 name in the note, even when the dropped file is a &lt;code&gt;.mov&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;{% video &amp;quot;./demo.mp4&amp;quot; %}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Running &lt;code&gt;pnpm ready&lt;/code&gt; transcodes the file to an optimized web-ready MP4 (H.264, yuv420p, faststart, crf 26, width capped at 1600px), extracts a poster frame from about 25% in as &lt;code&gt;demo-poster.webp&lt;/code&gt;, records state in &lt;code&gt;_data/cache/video-cache.json&lt;/code&gt;, and uploads the mp4 and poster to R2 under &lt;code&gt;raw/some-note/&lt;/code&gt; folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The above shortcode attaches the poster automatically, the player loads nothing until someone presses play, and nothing is fetched from a third party. I used to do this by hand and &lt;a href=&quot;https://deepakness.com/raw/compress-videos-using-ffmpeg/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;wrote down the ffmpeg commands&lt;/a&gt; earlier, but now it&#39;s all automatic.&lt;/p&gt;
&lt;p&gt;Also, a few things worth knowing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If I place my own &lt;code&gt;demo-poster.webp&lt;/code&gt; next to the video, the pipeline keeps it instead of generating one&lt;/li&gt;
&lt;li&gt;Videos are gitignored like images, so recordings never reach the repository&lt;/li&gt;
&lt;li&gt;To reprocess a video, run &lt;code&gt;node scripts/process-videos.js --force&lt;/code&gt; again&lt;/li&gt;
&lt;li&gt;The whole thing runs through ffmpeg, which keeps surprising me with &lt;a href=&quot;https://deepakness.com/blog/ffmpeg-is-wild/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;what it can do&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first video I published this way is the demo in &lt;a href=&quot;https://deepakness.com/raw/whimsical-pi-extension/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my whimsical Pi extension note&lt;/a&gt;, showing the rotating status phrases while Pi works.&lt;/p&gt;
</content>
  </entry><entry>
    <title>The best Pi web search extension?</title>
    <link href="https://deepakness.com/raw/pi-web-search-extensions/" />
    <updated>2026-08-13T13:12:43Z</updated>
    <id>https://deepakness.com/raw/pi-web-search-extensions/</id>
    <summary>Comparing pi-web-access and pi-web-agent, the two main web search packages for the Pi coding agent, and which one fits my setup.</summary>
    <content type="html">&lt;p&gt;I run the &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi coding agent&lt;/a&gt; with &lt;a href=&quot;https://github.com/nicobailon/pi-web-access&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pi-web-access&lt;/a&gt; installed, and recently I compared it against &lt;a href=&quot;https://github.com/demigodmode/pi-web-agent&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pi-web-agent&lt;/a&gt;, the other popular web search package for Pi. They solve the same problem in two different ways.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pi-web-access&lt;/code&gt; is a toolbox. It gives the model direct tools like &lt;code&gt;web_search&lt;/code&gt;, &lt;code&gt;source_check&lt;/code&gt;, and &lt;code&gt;fetch_content&lt;/code&gt;, and the model chains them itself. But &lt;code&gt;pi-web-agent&lt;/code&gt; is a bounded research workflow. It exposes one tool, &lt;code&gt;web_explore&lt;/code&gt;, which plans queries, picks candidate pages, reads them, and synthesizes an answer with caveats, all internally.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;pi-web-access&lt;/th&gt;
&lt;th&gt;pi-web-agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model interface&lt;/td&gt;
&lt;td&gt;Direct tools, chained by the model&lt;/td&gt;
&lt;td&gt;One &lt;code&gt;web_explore&lt;/code&gt; call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search providers&lt;/td&gt;
&lt;td&gt;20+, including zero-config Exa MCP&lt;/td&gt;
&lt;td&gt;6 backends, DuckDuckGo by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page reading&lt;/td&gt;
&lt;td&gt;HTTP fetch plus readability extraction&lt;/td&gt;
&lt;td&gt;HTTP plus headless Chromium rendering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification&lt;/td&gt;
&lt;td&gt;&lt;code&gt;source_check&lt;/code&gt; with passage citations&lt;/td&gt;
&lt;td&gt;Built-in evidence quality and caveats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Special content&lt;/td&gt;
&lt;td&gt;GitHub cloning, PDFs, YouTube, video&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;AGPL-3.0-only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For my setup, &lt;code&gt;pi-web-access&lt;/code&gt; is the better default. It searches through Exa&#39;s MCP endpoint with no API key, while &lt;code&gt;pi-web-agent&lt;/code&gt;&#39;s hosted backends need keys and otherwise fall back to scraping DuckDuckGo. &lt;code&gt;pi-web-access&lt;/code&gt; also has &lt;code&gt;source_check&lt;/code&gt; for verifying claims, plus GitHub, PDF, and video support that the other package does not have.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pi-web-agent&lt;/code&gt; wins in two places. It can render pages in headless Chromium, which handles bot checks and JavaScript-only sites that plain HTTP reads miss. And it is honest about weak evidence, reporting unreadable threads and narrow source sets as caveats instead of pretending. It also keeps transcripts much shorter in compact mode.&lt;/p&gt;
&lt;p&gt;For everyday coding work, fetch this page, check this claim, search this API, &lt;code&gt;pi-web-access&lt;/code&gt; covers more ground. For deep multi-source research where you want a disciplined workflow, &lt;code&gt;pi-web-agent&lt;/code&gt; is the better fit.&lt;/p&gt;
</content>
  </entry><entry>
    <title>People genuinely hate WebP images</title>
    <link href="https://deepakness.com/raw/people-hate-webp/" />
    <updated>2026-08-13T10:04:41Z</updated>
    <id>https://deepakness.com/raw/people-hate-webp/</id>
    <summary>I am now convinced that people hate the image format WebP and I don&#39;t even understand why.</summary>
    <content type="html">&lt;p&gt;I have known for a long time that some of my friends don&#39;t like or rather don&#39;t understand the &lt;a href=&quot;https://en.wikipedia.org/wiki/WebP&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WebP image format&lt;/a&gt;, but I didn&#39;t know that &lt;a href=&quot;https://x.com/OldHollowTree/status/2087547144597053844&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;people genuinely hate the format&lt;/a&gt; for some reason.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;People hate WebP image format&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/people-hate-webp/people-hate-webp.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://deepakness.com/blog/better-images/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WebP images on this site&lt;/a&gt; and love them for how good they are – high quality at significantly smaller file sizes. In fact, WebP images also support alpha transparency just like PNGs, and are now &lt;a href=&quot;https://caniuse.com/webp&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;supported by almost all web browsers&lt;/a&gt; out there.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;WebP is supported by almost all browsers&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/people-hate-webp/webp-browser-support.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Practically, I don&#39;t understand why people hate WebP images, but the following could be reasons when I think from others&#39; perspective:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unsupported by legacy apps and systems, and people had to convert them to other formats to use. Like you import it into a presentation or in a document, and it doesn&#39;t work.&lt;/li&gt;
&lt;li&gt;Browsers and other major platforms suddenly started serving WebP versions of images, and it was kind of forced on them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I think, people will keep hating the WebP format, always. And it will soon become outdated too, as there are better formats like &lt;a href=&quot;https://en.wikipedia.org/wiki/AVIF&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AVIF&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/JPEG_XL&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;JPEG XL&lt;/a&gt; slowly taking over. These newer formats have better compression sizes, maintain sharper details, and even support full HDR color spaces.&lt;/p&gt;
&lt;p&gt;Let&#39;s see.&lt;/p&gt;
&lt;p&gt;By the way, I found this &lt;a href=&quot;https://jpegxl.info/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;cool community website about JPEG XL&lt;/a&gt; that has a lot of comparisons and information about the format.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Whimsical working messages extension for Pi</title>
    <link href="https://deepakness.com/raw/whimsical-pi-extension/" />
    <updated>2026-08-12T19:19:16Z</updated>
    <id>https://deepakness.com/raw/whimsical-pi-extension/</id>
    <summary>A small Pi extension that rotates playful status phrases in fresh colors every couple of seconds while the agent is working.</summary>
    <content type="html">&lt;p&gt;I use a small custom extension in the &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi coding agent&lt;/a&gt; that replaces the plain working status with playful phrases that keep changing while it thinks. It&#39;s based on Armin Ronacher&#39;s &lt;a href=&quot;https://github.com/mitsuhiko/agent-stuff/blob/main/extensions/whimsical.ts&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;whimsical extension&lt;/a&gt;, which I customized with more colors, decorative symbols, and phrases that rotate every two seconds.&lt;/p&gt;
&lt;p&gt;The phrase list has hundreds of entries, from short verbs to longer jokes and phrases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Schlepping&lt;/li&gt;
&lt;li&gt;Flibbertigibbeting&lt;/li&gt;
&lt;li&gt;Negotiating with entropy&lt;/li&gt;
&lt;li&gt;Herding cats in memory, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each update picks a random phrase and color, and it never shows the same phrase or color twice in a row. The status line resets as soon as Pi finishes the turn.&lt;/p&gt;
&lt;video controls=&quot;&quot; preload=&quot;none&quot; playsinline=&quot;&quot; data-plyr=&quot;&quot; poster=&quot;https://assets.deepakness.com/raw/whimsical-pi-extension/pi-agent-custom-footer-whimsical-poster.webp&quot;&gt;
  &lt;source src=&quot;https://assets.deepakness.com/raw/whimsical-pi-extension/pi-agent-custom-footer-whimsical.mp4&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;p&gt;The extension lives at &lt;code&gt;~/.pi/agent/extensions/whimsical.ts&lt;/code&gt; and loads automatically on every startup. To try it, copy the code from &lt;a href=&quot;https://gist.github.com/deepakness/cebf2c46c4c3158f6a4484bd2a058f6d&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this gist&lt;/a&gt; into your extensions folder and restart Pi. I also covered the extension in &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my pi agent setup post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I like this setup and collection of words and phrases better than &lt;a href=&quot;https://deepakness.com/raw/claude-spinner-verbs/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;what Claude Code shows&lt;/a&gt;, because of better verbs and jokes, and cool colors as well.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Get $5 as the OpenCode referral reward</title>
    <link href="https://deepakness.com/raw/opencode-referral-reward/" />
    <updated>2026-08-23T00:00:00Z</updated>
    <published>2026-08-12T18:06:50Z</published>
    <id>https://deepakness.com/raw/opencode-referral-reward/</id>
    <summary>Using my referral link, you can get a $5 referral reward that you can use to increase your OpenCode usage limits.</summary>
    <content type="html">&lt;p&gt;Since OpenCode offers a referral reward, if you &lt;a href=&quot;https://go.deepakness.com/opencode&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sign up to OpenCode by clicking on this link&lt;/a&gt;, you and I both get a reward of $5. It can be used to reduce your workspace&#39;s current usage.&lt;/p&gt;
&lt;p&gt;For example, I signed up using someone&#39;s link and received the $5 reward that looks like this in my account:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;OpenCode referral reward&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/opencode-referral-reward/opencode-dollar-5-reward.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I couldn&#39;t find any concrete explanation for this, but as far as I understand, if I&#39;m about to hit my monthly limits, I can redeem the reward to reduce my limits by that value. Awesome, right?&lt;/p&gt;
&lt;p&gt;Again, &lt;a href=&quot;https://go.deepakness.com/opencode&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&#39;s my OpenCode referral link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&#39;s it.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;How much usage are reduced when using a referral reward in OpenCode&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/opencode-referral-reward/opencode-reward-usage.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see in the screenshot above, applying one $5 referral reward in your OpenCode Go plan reduces the weekly usage significantly:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Limit Type&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Usage reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;5 hour limit&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;by 41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Weekly limit&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;by 16%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Monthly limit&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;by 8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cool, right?&lt;/p&gt;
&lt;p&gt;One thing worth knowing. The reward only lowers your Go plan&#39;s usage counters. If you don&#39;t renew Go, unapplied rewards show a disabled &lt;a href=&quot;https://github.com/anomalyco/opencode/issues/28713&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Subscribe to unlock button&lt;/a&gt; in the console, and applying one without an active plan fails. I couldn&#39;t find any expiry policy, so they likely stay on your account until you resubscribe.&lt;/p&gt;
&lt;p&gt;And if you&#39;re really asking, the credit also can&#39;t be converted to Zen balance.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Grok 4.6 is here</title>
    <link href="https://deepakness.com/raw/grok-4-6-launched/" />
    <updated>2026-08-12T16:31:43Z</updated>
    <id>https://deepakness.com/raw/grok-4-6-launched/</id>
    <summary>xAI just launched Grok 4.6 with a focus on long-running agents and interactive projects.</summary>
    <content type="html">&lt;p&gt;xAI &lt;a href=&quot;https://x.ai/news/grok-4-6&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;just launched Grok 4.6&lt;/a&gt;, a little over a month after &lt;a href=&quot;https://deepakness.com/raw/grok-4-5-first-impressions/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Grok 4.5&lt;/a&gt;. I loved Grok 4.5 because it was fast, reliable, and reasonably priced.&lt;/p&gt;
&lt;p&gt;This time, as explained by xAI, the focus is on a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Staying with complex tasks across many steps&lt;/li&gt;
&lt;li&gt;Better self-testing and verification during longer tasks&lt;/li&gt;
&lt;li&gt;Stronger first passes on visual and interactive projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On xAI&#39;s benchmarks, Grok 4.6 High scores &lt;code&gt;61&lt;/code&gt; on the &lt;em&gt;Artificial Analysis Intelligence Index&lt;/em&gt;, exactly matching &lt;code&gt;GPT-5.6 Sol Max&lt;/code&gt; and coming just behind &lt;code&gt;Fable 5 Max&lt;/code&gt; at &lt;code&gt;62&lt;/code&gt;. Benchmarks are benchmarks, though, and I am more interested in seeing how it feels during real coding work.&lt;/p&gt;
&lt;p&gt;I have used it a little inside Grok Build, and my first impression is that it feels a bit slower than Grok 4.5. It is still fast enough, and the overall quality is good, but the difference is noticeable. I have not used it enough yet to say whether the stronger reasoning and long-running agent capabilities make up for the slower responses.&lt;/p&gt;
&lt;p&gt;The normal API pricing is unchanged, but cached input is now more expensive.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Price per 1M tokens&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Grok 4.5&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Grok 4.6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cached input, short context&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$0.30&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cached input, long context (≥200k)&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$0.60&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$6&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt=&quot;Grok 4.5 and 4.6 pricing comparison&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/grok-4-6-launched/grok-4-6-pricing.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Grok 4.6 has a 500k context window, reasoning levels up to &lt;code&gt;xhigh&lt;/code&gt;, and a fast variant that costs twice as much. It is available through the xAI API, Grok Build, and Cursor. I am still on the &lt;a href=&quot;https://deepakness.com/raw/supergrok-3-months/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;3-month SuperGrok offer&lt;/a&gt;, so I tried it in Grok Build.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Apart from this, xAI is offering 2x the usual included usage in Grok Build and Cursor for the first week.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I also discovered &lt;a href=&quot;https://x.com/ericzakariasson/status/2087566447178547494&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this write-up from Eric&lt;/a&gt; at Cursor, and it has some really good suggestions about using Grok 4.6. He has been using it as his daily driver for a few weeks. Here are the tips that stood out.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;skip phrases like &amp;quot;work very hard&amp;quot;, they barely change the outcome&lt;/li&gt;
&lt;li&gt;a short prompt plus a clear preference is usually enough, because the model&#39;s taste is good&lt;/li&gt;
&lt;li&gt;write a long spec only when you already know exactly what you want&lt;/li&gt;
&lt;li&gt;say what done means, instead of telling it to keep going&lt;/li&gt;
&lt;li&gt;ask it to open the app, click through real user paths, and fix what it finds&lt;/li&gt;
&lt;li&gt;for visual work, tell it to capture a screenshot, list what is wrong, then fix only those things&lt;/li&gt;
&lt;li&gt;do not trust a summary that says it is finished, run it and look&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The verification one is the highest leverage. He tried a two-page spreadsheet spec and a three-sentence prompt, and both apps came back almost the same. Adding that one &amp;quot;use it and check&amp;quot; sentence is what actually changed the result.&lt;/p&gt;
&lt;p&gt;Honestly, I&#39;m pretty excited about xAI and Grok. I think, it has a lot of potential to win the AI race. I found this post on X that I completely agree with.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Grok 4.7 wins*&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/grok-4-6-launched/grok-4-7.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you think, only a few months ago xAI&#39;s Grok wasn&#39;t used by anyone, at least for coding. But now, everyone is talking about it.&lt;/p&gt;
&lt;p&gt;I&#39;m hopeful, but let&#39;s see.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Claude will watermark AI-generated content</title>
    <link href="https://deepakness.com/raw/claude-ai-watermarks/" />
    <updated>2026-08-12T00:00:00Z</updated>
    <published>2026-08-11T03:20:54Z</published>
    <id>https://deepakness.com/raw/claude-ai-watermarks/</id>
    <summary>Claude will add invisible watermarks to generated text and provenance metadata to supported files.</summary>
    <content type="html">&lt;p&gt;Anthropic says supported Claude models will add &lt;a href=&quot;https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;imperceptible watermarks&lt;/a&gt; to generated text. The watermark is part of the text itself, so it can travel with copied text and can even survive some editing.&lt;/p&gt;
&lt;p&gt;For supported images and other files, Claude will attach signed C2PA provenance metadata instead. Anthropic says detection tools and technical details are still to come, and these marks are signals rather than perfect proof of origin.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;How Claude will watermark generated texts&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/claude-ai-watermarks/how-claude-marks-text.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I am not sure how this works, but I think it might work &lt;a href=&quot;https://arxiv.org/abs/2305.08883&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;based on this paper&lt;/a&gt;. And this is similar to &lt;a href=&quot;https://deepmind.google/models/synthid/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Google&#39;s SynthID&lt;/a&gt; that also embeds imperceptible watermarks in AI-generated content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Aug 12, 2026&lt;/p&gt;
&lt;p&gt;Just saw an update on this as &lt;a href=&quot;https://x.com/trq212/status/2087333847298158866&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Thariq from Anthropic confirmed&lt;/a&gt; that the watermark detection API will be free to use.&lt;/p&gt;
&lt;p&gt;I predict lots of big publishing platforms like Substack, Medium, and even search engines like Google and others will use the Claude API internally to decide what content to give more priority. And in the future, I guess, more AI providers will launch such an API.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Pi agent is just better</title>
    <link href="https://deepakness.com/raw/pi-is-just-better/" />
    <updated>2026-08-10T16:26:56Z</updated>
    <id>https://deepakness.com/raw/pi-is-just-better/</id>
    <summary>Composio benchmarked 8 agent harnesses on DeepSeek V4 Flash and Pi agent came out on top on pass rate and cost.</summary>
    <content type="html">&lt;p&gt;Composio ran DeepSeek V4 Flash through 8 agent harnesses on 30 agentic tasks, and &lt;a href=&quot;https://x.com/composio/status/2086814488162972027&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;as per the report&lt;/a&gt; Pi agent came out on top in almost every metric. Here is the leaderboard for tasks passed.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Tasks passed across all 8 agent harnesses on DeepSeek V4 Flash&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/pi-is-just-better/composio-passed.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pi agent passed 20 of 30 tasks, 3 more than the next best harness (Oh My Pi at 17). Claude Code, Codex, and Deep Agents tied at 16, and the rest were at 14-15.&lt;/p&gt;
&lt;p&gt;Cost per successful task is where Pi pulls ahead the most. It came in at $0.028, the cheapest of all 8 harnesses, while Claude Code at the other end cost $0.195, almost 7x more. Pi&#39;s median time per task was 132 seconds, only Claude Code and OpenCode were slightly faster.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Cost per successful task across all 8 agent harnesses&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/pi-is-just-better/composio-cost.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;The same model delivered 47-67% task success, cost $0.019-$0.104 per task, and took 122-272 seconds median time, depending on the harness. Their closing point is a good one. Benchmark the model-harness pair you will actually use, not the model in isolation.&lt;/p&gt;
&lt;p&gt;Nice to see Pi win a third party eval like this, since I run &lt;a href=&quot;https://deepakness.com/blog/pi-agent-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi with DeepSeek as my default setup&lt;/a&gt; anyway.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Kapture Fast – one-click screenshot to clipboard</title>
    <link href="https://deepakness.com/raw/kapture-fast/" />
    <updated>2026-08-10T03:22:51Z</updated>
    <id>https://deepakness.com/raw/kapture-fast/</id>
    <summary>Built a tiny Chrome extension that captures the visible tab and copies it to the clipboard in one click, with no network calls or analytics.</summary>
    <content type="html">&lt;p&gt;I built a tiny Chrome extension called &lt;a href=&quot;https://github.com/deepakness/kapture-fast&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kapture Fast&lt;/a&gt; that captures the visible part of a tab and copies it to the clipboard in one click. Just click the toolbar icon or right-click the page and pick &amp;quot;Copy screenshot to clipboard&amp;quot;.&lt;/p&gt;
&lt;p&gt;It only captures the visible viewport, not the full page. A checkmark flashes on the icon when it works, and on failure a &lt;code&gt;!&lt;/code&gt; badge shows the reason on hover.&lt;/p&gt;
&lt;p&gt;It needs just four permissions, no network requests, no analytics, and the screenshot never leaves the machine. Open source under MIT, load it unpacked from the repo in about a minute.&lt;/p&gt;
&lt;p&gt;This is another Chrome extension I&#39;ve shipped after &lt;a href=&quot;https://deepakness.com/raw/minimal-x-2-0/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the Minimal X cleanup extension&lt;/a&gt;, and I&#39;ve been using it daily.&lt;/p&gt;
&lt;p&gt;Once the screenshot is in the clipboard, I paste it on socials, drop it into chats while vibe coding, or &lt;a href=&quot;https://deepakness.com/raw/save-clipboard-image-macos/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;save it on macOS&lt;/a&gt; when I need it as a file.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Cursor Pro and SuperGrok usage comparison</title>
    <link href="https://deepakness.com/raw/cursor-pro-supergrok/" />
    <updated>2026-08-10T02:20:47Z</updated>
    <id>https://deepakness.com/raw/cursor-pro-supergrok/</id>
    <summary>Which subscription gets you the most usage – Cursor Pro ($20/mo) or SuperGrok ($30/mo)?</summary>
    <content type="html">&lt;p&gt;I had this question: which subscription is more value for money when using the Grok 4.5 model – Cursor Pro ($20/mo) or SuperGrok ($30/mo). And I just came across &lt;a href=&quot;https://x.com/MiaAI_lab/status/2086576283211710957&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this post on X&lt;/a&gt; that does a comparison between the two.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Cursor Pro vs. SuperGrok&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/cursor-pro-supergrok/cursor-pro-vs-supergrok.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here, I have created a comparison table to better understand the usage these subscriptions get you.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subscription&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Tokens per month&lt;/th&gt;
&lt;th&gt;Tokens per $&lt;/th&gt;
&lt;th&gt;Value advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cursor Pro&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;716,077,180&lt;/td&gt;
&lt;td&gt;35,803,859&lt;/td&gt;
&lt;td&gt;Better value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SuperGrok&lt;/td&gt;
&lt;td&gt;$30/mo&lt;/td&gt;
&lt;td&gt;987,902,940&lt;/td&gt;
&lt;td&gt;32,930,098&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Basically, if you consider the $10 price difference between the two, Cursor gets you ~8.73% more tokens than SuperGrok.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tl;dr – Cursor Pro is better than Grok.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have used Cursor previously, and I am currently using SuperGrok, but since &lt;a href=&quot;https://deepakness.com/raw/supergrok-3-months/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;I availed their promotional offer&lt;/a&gt; of $30 for 3 months (i.e., $10/mo), SuperGrok is better value for money for me right now.&lt;/p&gt;
</content>
  </entry><entry>
    <title>How &#39;keep reading&#39; picks related posts now</title>
    <link href="https://deepakness.com/raw/keep-reading-matching/" />
    <updated>2026-08-09T17:36:38Z</updated>
    <id>https://deepakness.com/raw/keep-reading-matching/</id>
    <summary>Reworked the related-entry matching under posts and notes so it weighs rare tags, title similarity, and internal links instead of just counting shared tags.</summary>
    <content type="html">&lt;p&gt;The &amp;quot;keep reading&amp;quot; block under every post and note used to pick its suggestions by counting shared tags. Most matches won.&lt;/p&gt;
&lt;p&gt;That sounds reasonable until you look at my tags. The &lt;code&gt;ai&lt;/code&gt; tag alone sits on 186 of my 637 posts and notes, so sharing it counted for as much as sharing something rare like &lt;code&gt;hetzner&lt;/code&gt;. Hundreds of candidates tied for one shared tag. The tiebreakers collapsed, and the sort quietly turned into &amp;quot;show the newest thing tagged ai&amp;quot;.&lt;/p&gt;
&lt;p&gt;Three things stood out when I finally measured it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;289 entries had never shown up as a suggestion anywhere on the site&lt;/li&gt;
&lt;li&gt;one note about my terminal config was sitting on 113 pages&lt;/li&gt;
&lt;li&gt;most entries were getting three suggestions instead of five&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now it scores every pair of entries instead of sorting them, and four things feed that score.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;shared tags, weighted so rare ones count for more than common ones&lt;/li&gt;
&lt;li&gt;how similar the titles and descriptions are&lt;/li&gt;
&lt;li&gt;internal links, counted both ways, so linking A to B also points B back at A&lt;/li&gt;
&lt;li&gt;recency, but only enough to break ties&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The title matching did most of the heavy lifting here. Around 40% of my entries carry a single tag, so tags were never going to say much about them, but titles always do. The &lt;a href=&quot;https://deepakness.com/blog/adding-internal-links-in-old-posts/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;internal links I add by hand&lt;/a&gt; turned out to be the most trustworthy signal of the lot.&lt;/p&gt;
&lt;p&gt;Where it landed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;every entry now gets a full five suggestions&lt;/li&gt;
&lt;li&gt;entries that never surfaced dropped from 289 to 36&lt;/li&gt;
&lt;li&gt;nothing appears on more than 20 pages anymore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can also pin suggestions from the frontmatter now, where scoring fills whatever slots are left.&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;related&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /blog/some&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;post/
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /raw/some&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;note/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It all runs once at build time instead of per page, so the build did not get any slower. I had &lt;a href=&quot;https://deepakness.com/raw/updated-footer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;reorganized this block once before&lt;/a&gt;, and this time it is the matching underneath that got fixed.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Just learned that Ahrefs DR API is free</title>
    <link href="https://deepakness.com/raw/ahrefs-dr-api/" />
    <updated>2026-08-09T15:00:04Z</updated>
    <id>https://deepakness.com/raw/ahrefs-dr-api/</id>
    <summary>I just got to know that Ahrefs has a free API that returns DR (Domain Rating) for domains, and it&#39;s completely free to use.</summary>
    <content type="html">&lt;p&gt;I just got to know that &lt;a href=&quot;https://docs.ahrefs.com/en/api/reference/public/get-domain-rating-free&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ahrefs has a free API&lt;/a&gt; that returns DR (Domain Rating) for domains, and it&#39;s completely free to use. You do require a free API key and requests do not consume any API units.&lt;/p&gt;
&lt;p&gt;I tested it for &lt;code&gt;deepakness.com&lt;/code&gt; with a free API key, and DR comes out to be &lt;code&gt;46&lt;/code&gt;, as you see in the response below.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Authorization: Bearer YOUR_API_KEY&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;https://api.ahrefs.com/v3/public/domain-rating-free?target=deepakness.com&amp;amp;output=json&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Actual response:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;domain_rating&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;domain_rating&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;46.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;license&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://ahrefs.com/legal/domain-rating-license&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unauthenticated calls still work today but return a deprecation warning as they now return 401 unless you send the free key. If you use the data, Ahrefs requires attribution as &amp;quot;Domain Rating by Ahrefs&amp;quot; with a link to &lt;a href=&quot;https://ahrefs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ahrefs.com&lt;/a&gt;, under their &lt;a href=&quot;http://ahrefs.com/legal/domain-rating-license&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Domain Rating License&lt;/a&gt; program.&lt;/p&gt;
&lt;p&gt;I liked this because this can be used for analyzing domains in bulk and then there can be other interesting uses as well.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Pi agent supports Mermaid diagrams now</title>
    <link href="https://deepakness.com/raw/pi-mermaid-support/" />
    <updated>2026-08-07T14:11:46Z</updated>
    <id>https://deepakness.com/raw/pi-mermaid-support/</id>
    <summary>From the new v0.84.0, the Pi agent has now started supporting Mermaid diagrams directly inside the terminal.</summary>
    <content type="html">&lt;p&gt;From the new v0.84.0 update, the Pi coding agent has now started supporting Mermaid diagrams natively. The agent can now show a preview of the diagram directly inside the terminal you&#39;re using, as you see below.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Pi agent Mermaid diagram preview in terminal&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/pi-mermaid-support/mermaid-diagram-preview.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s turned on by default when you update to the &lt;a href=&quot;https://pi.dev/news/releases/0.84.0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;new 0.84.0 version&lt;/a&gt; by running the &lt;code&gt;pi update --all&lt;/code&gt; command. It&#39;s set to &lt;code&gt;streaming&lt;/code&gt; as you see below, but you can turn it off or change it to &lt;code&gt;final&lt;/code&gt; as well, and you can learn about it more &lt;a href=&quot;https://pi.dev/docs/latest/settings#markdown&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;from the docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mermaid diagram related settings in Pi agent&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://assets.deepakness.com/raw/pi-mermaid-support/mermaid-settings-in-pi.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;I think, this is a nice addition to the agent as it helps users visualize complex ideas in a better way. If you see the first diagram above, that is basically the entire architecture of deepakness.com.&lt;/p&gt;
&lt;p&gt;Apart from this, I loved the new &lt;code&gt;fullscreen&lt;/code&gt; TUI mode that you &lt;a href=&quot;https://pi.dev/docs/latest/settings#ui-display&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;can turn on&lt;/a&gt; from the settings. It keeps the text-box pinned at the bottom when you scroll. It&#39;s very useful.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Removing webmentions from this site</title>
    <link href="https://deepakness.com/raw/removing-webmentions/" />
    <updated>2026-08-07T04:20:55Z</updated>
    <id>https://deepakness.com/raw/removing-webmentions/</id>
    <summary>I removed webmentions from deepakness.com because they were not adding much value and the UI under posts felt messy.</summary>
    <content type="html">&lt;p&gt;I removed webmentions from this site entirely today.&lt;/p&gt;
&lt;p&gt;How the setup worked (receiving via webmention.io + Bridgy, sending via webmention.app, Eleventy fetch at build time, UI under posts) is already &lt;a href=&quot;https://deepakness.com/blog/adding-webmentions/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;written up in an earlier post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I removed them because they were not adding much value, and the UI below posts felt messy. Email and Mastodon CTAs already cover how to reply, and the webmention block mostly cluttered the bottom of posts without making the site better to use.&lt;/p&gt;
&lt;p&gt;What still shows under posts and notes is Comment via Email, and Comment on Mastodon when a post has a status URL.&lt;/p&gt;
&lt;p&gt;By the way, I am not against the webmention protocol. But it&#39;s a clean slate for now; the implementation post is enough if I ever rebuild it.&lt;/p&gt;
</content>
  </entry><entry>
    <title>Parakeet Unified EN 0.6B model in Handy is great</title>
    <link href="https://deepakness.com/raw/handy-new-model/" />
    <updated>2026-08-06T00:00:00Z</updated>
    <published>2026-08-06T05:04:29Z</published>
    <id>https://deepakness.com/raw/handy-new-model/</id>
    <summary>The Parakeet Unified EN 0.6B model in the Handy app makes local speech-to-text transcription faster, more accurate, and much better than earlier models.</summary>
    <content type="html">&lt;p&gt;Recently, a new model called &lt;a href=&quot;https://huggingface.co/nvidia/parakeet-unified-en-0.6b&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Parakeet Unified EN 0.6B&lt;/a&gt; appeared in the &lt;a href=&quot;https://handy.computer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Handy&lt;/a&gt; app. When I wrote about finding the &lt;a href=&quot;https://deepakness.com/raw/local-speech-to-text-app/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;best local speech-to-text app&lt;/a&gt;, I was using Parakeet v3, which was already great. But this new Unified EN 0.6B model is on another level.&lt;/p&gt;
&lt;p&gt;It is significantly faster and much more accurate than the earlier models. The latency drop is immediately noticeable, and words appear almost instantly as you speak, with virtually zero delay. I am running it on an M2 MacBook Air with 16 GB RAM, and it works flawlessly without slowing down the system.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Handy app running Parakeet Unified EN 0.6B model&quot; decoding=&quot;async&quot; loading=&quot;eager&quot; fetchpriority=&quot;high&quot; src=&quot;https://assets.deepakness.com/raw/handy-new-model/handy-parakeet-model.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Punctuation, capitalization, and technical terms are also handled much better.&lt;/p&gt;
</content>
  </entry>
</feed>
