Raw notes

(516 notes)

Short notes, links, and thoughts – shared as I go through my day.


Raspberry Pi 4B with and without the fan

I tried to keep my Raspberry Pi 4B device without the fan, and it reaches up to 50°C when it's hosting this experiment site pi.deepakness.com, as you see in the below screenshot.

Temperature on the Raspberry Pi 4B without the fan

But when I keep it in my room under the ceiling fan, the temperature is consistently below 40°C. By the way, earlier when it crashed, the temperature had reached over 75°C.

For now, I am keeping it without the fan but if temperature goes above 60 or so, I will place it under the fan.

Let's see.


Hetzner's dedicated server is cheaper than VPS

I just noticed that Hetzner's dedicated servers, also known as bare metal, are cheaper than their VPS plans. Here's a quick comparison from both pricing pages, with prices excluding VAT.

Server Type Pricing CPU RAM Storage
VPS (CPX42) €69.49/mo 8 vCPU 16 GB 320 GB SSD
Dedicated Machine (AX41) €59.00/mo 6 cores/12 threads 64 GB 2 × 512 GB NVMe

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.

Hetzner dedicated server pricing:

Hetzner dedicated server pricing

Hetzner VPS pricing:

Hetzner VPS pricing

The usual worry with bare metal is the extra setup work, and it's the same short checklist either way. Put the admin panels behind Tailscale, keep the websites public through Cloudflare, and run off-site backups with rsync or maybe BackBlaze, and you're done.

And if you're okay with going one step further you can even get a physical device and host everything there. But it's a bit extreme as stable internet and even electricity availability might be challenging for different locations.

I am not immediately migrating to it, but it should be pretty fun setting up. And a lot of learning experiences.

Will explore this soon.


Fixing Threads API publishing errors

I have been adding Threads support to my own posting setup, and the Threads API kept failing with an error that looked like a permissions problem.

The first one was code 100, error_subcode 33, "Object with ID ... does not exist", on every single post. The ID in that message is the user_id that comes back from the OAuth token exchange, and the Graph API doesn't accept it as a publishing target. I wasted time re-authorizing the account and toggling permissions because the message says "missing permissions", 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.

curl "https://graph.threads.net/v1.0/me?fields=id,username&access_token=$TOKEN"

The id from /me published fine on the first try, and since then I refresh the stored id on every publish so an old row repairs itself.

Then a threaded post with an image failed with code 1, error_subcode 2207052, "Media download has failed". Meta downloads the image_url on their side when the container is created, and here their crawler couldn'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'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.

The truncated error text never told me any of this. The full response body did, and the error_subcode is what showed me which of the two I was looking at.


MacBook looking at itself in a mirror to self-improve

Came across this rather interesting and funny picture in a post on X 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's working on improving the AMD Radeon chip support in Omarchy Linux.

MacBook looking at itself in a mirror to self-improve

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:

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.

I had no idea about this.

Very interesting, actually.

Update:

AI fixing Omarchy external display support

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.

Fascinating!


DeepSeek v4.1 Flash is here with a new price

The new DeepSeek v4.1 Flash model is here and the two most important things about the model is that it has native vision capabilities, and it's significantly cheaper after the price hike last month. I have updated the pricing on the DeepSeek peak/off-peak clock page already.

DeepSeek v4.1 Flash announcement

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.

Interesting!

About the new price, here's the price table and comparison with the old pricing (all prices in per million tokens):

Metric Off-peak, old Off-peak, new Peak, old Peak, new Reduction
Input, cache hit $0.007 $0.003 $0.014 $0.006 57.1%
Input, cache miss $0.22 $0.15 $0.44 $0.30 31.8%
Output $0.66 $0.60 $1.32 $1.20 9.1%

I used the model a lot yesterday, and it's visible that it'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.

Good job, DeepSeek! And thank you.


Ubuntu 26.04 on Mid-2014 MacBook Pro – it finally works

After Fedora 44 and Linux Mint, I wiped the old MacBook Pro and installed Ubuntu 26.04.1 LTS on it. Wi-Fi, camera, mic, speakers, and fans all work now. Here's everything I had to fix, in case I need to redo it.

Wi-Fi didn't work out of the box. The BCM4360 chip needs the proprietary wl driver because b43 grabs the card first.

# Preferred
sudo apt install broadcom-sta-dkms
sudo dkms autoinstall

# Or from the .deb (dpkg skips dependencies, fix them after)
wget http://mirrors.kernel.org/ubuntu/pool/restricted/b/broadcom-sta/broadcom-sta-dkms_6.30.223.271-29ubuntu1_amd64.deb
sudo dpkg -i broadcom-sta-dkms_6.30.223.271-29ubuntu1_amd64.deb
sudo apt --fix-broken install

# Either way
sudo update-initramfs -u
sudo modprobe wl
ip link show | grep wl

I used the .deb from a Linux Mint forum thread, and it broke until --fix-broken install fixed it. The update-initramfs -u step is required for the b43 blacklists to apply at boot.

The FaceTime HD camera needs three pieces, the DKMS module, the firmware, and the sensor files.

sudo apt install dkms build-essential linux-headers-$(uname -r) git curl
git clone https://github.com/patjak/bcwc_pcie.git
cd bcwc_pcie
sudo dkms add .
sudo dkms build facetimehd/0.7.0.1
sudo dkms install facetimehd/0.7.0.1
sudo depmod
sudo modprobe facetimehd
echo facetimehd | sudo tee -a /etc/modules > /dev/null
ls /dev/video0

Check cat dkms.conf | grep PACKAGE_VERSION first, because the repo says 0.7.0.1 while guides still say 0.2.

git clone https://github.com/patjak/facetimehd-firmware.git
cd facetimehd-firmware
make            # fails on the assistant hash, this is expected
sudo make install

mkdir -p /tmp/facetime-fw && cd /tmp/facetime-fw
for f in 9112 1771 1871 1874; do
  curl -fsSL -o ${f}_01XX.dat \
    https://raw.githubusercontent.com/eudoxos/skoly/main/tweaks/macbook-air/firmware/${f}_01XX.dat
done
sudo cp *.dat /usr/lib/firmware/facetimehd/
sudo modprobe -r facetimehd && sudo modprobe facetimehd

The make failure is expected, and firmware.bin still extracts fine. After the sensor files, dmesg | grep facetimehd should show no more failed with error -2 lines.

For the fans, mbpfan with the default config is enough.

sudo apt install -y mbpfan
sudo systemctl status mbpfan
cat /sys/devices/platform/applesmc.768/fan*_input

The fans spike to ~6000 RPM during install, then settle back to ~2000 RPM.

That's it.

On a fresh install, the order is apt update/upgrade, Wi-Fi, camera, mbpfan, reboot, and check Wi-Fi, /dev/video0, and mbpfan.


SharePDF gets its first intro video

I was procrastinating this for a long time but finally spent some time and created the very first intro video for SharePDF, and now it's live on SharePDF YouTube channel. You can also watch it here though:

Yes, that's me. But please ignore the low-effort thumbnail, I will make it better later.

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.

Still have to do a lot of thinking to create a more robust long-term video strategy.

All the best to me!


Why AI will never be able to take over humans

AI is capable of doing many things better than humans, but it doesn't have human-like curiosity. AI does not wonder on its own and answers only when asked.

So I think AI will never be able to take over humans because without genuine curiosity, it just remains a powerful tool.


Two new improvements in my work setup recently

In the last few days, I have adopted two new changes in my work setup:

  1. Started using Herdr with Ghostty, and
  2. Turned on More Space display scaling option on macOS

Earlier, I was hopping between different apps like Claude Code, Cursor, etc. and wasn't using CLI coding harnesses a lot. But my productivity has significantly increased ever since I started using this Herdr terminal multiplexer via the Ghostty terminal. And I even went a step ahead and unbound certain keybindings from Ghostty and bound them inside Herder, and now opening tabs, splitting panes, and other things are much easier.

macOS More Space display scaling

About the other thing, as you see above, I turned on the "More Space" display scaling option on my macOS device. Initially, it took some time to adjust, but now I don't even need my second display as I can see much more information on the main display itself. And it's less distracting than using the second screen.

That's it.

These two small changes recently have significantly improved my productivity.


I used 28 different OpenCode models last month

I didn't renew my Claude Max subscription after it ended last month, and decided to use OpenCode for some time. And it's been more than ~15 days of using OpenCode models, and I've missed Claude models only a few times.

From OpenCode's usage tab, I have used 28 different models last month, as you see in the screenshot.

OpenCode usage last month

Among all the models you see in the screenshot, only a few stood out.

  1. DeepSeek V4 Flash (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's very fast and mostly accurate for these tasks.
  2. DeepSeek V4 Pro (0813): This model is great for a lot of tasks, and I have used this for fixing some serious bugs on SharePDF, building websites, brainstorming, etc.
  3. GLM 5.3 Flash: Been using this model a lot since it came, and it's a great one for UI and research. The only issue is that it's very slow in OpenCode Go, so I use it for low-priority tasks, and sometimes I even keep it running overnight.
  4. DeepSeek V4 Flash Vision Exp: While I use an extension in Pi 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's good and fast too.
  5. Mimo v2.5: Sometimes I use this model for really simple, low-priority tasks, and it's good at that. But don't use it for anything else.

Apart from these, most models you see in the chart above are only for trying and testing. I'm mostly using these 5 models via my OpenCode Go subscription.

Most of the time I use these in the Pi coding agent via my new Herdr + Ghostty setup, but sometimes also using Pi inside the Orca app for browser use tasks. I'm rarely using OpenCode models inside the OpenCode harness actually.


Playing with the Grok bot

Yesterday, I downloaded and installed the new Grok bot and playing with it to see how it can fit in my workflow. I have connected it to my existing SuperGrok subscription and so far it's working fine.

Grok bot app sidebar on macOS

As of now, I have set up 3 bots that do the following:

  1. Emails bot: reads my emails twice a day, gives me a summary and reminds me of something important that needs to be done.
  2. AI Research bot: researches for AI related updates from the internet and sends me a summary twice a week.
  3. Ticky bot: manages my to-do list via Notion and email, sends an email every morning about today's and other upcoming tasks.

I know this very basic and people must be using it for more complex tasks, but I'm just exploring and learning about it. I haven't yet seen any tutorials about it, but will do and improve my setup.

By the way, I'm pretty impressed by it so far.

Lastly, the different pricing plans and different login options using Grok and Cursor make it very very confusing. I hope they solve it quickly.


Unbinding Ghostty's Cmd keys and binding them in Herdr

Since setting up Herdr inside Ghostty, the same actions had two shortcuts, Cmd+T for a Ghostty tab and Ctrl+B C 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 suggested something on X and that clicked, I then followed his write-up to unbound the Cmd keys in Ghostty and bound the same keys directly in Herdr.

Now, Ghostty passes the keypress through to the terminal and Herdr answers it, no prefix and no escape-code translation.

My Herdr setup

Shortcut Before (Ghostty) Now (Herdr)
Cmd+T new tab new tab
Cmd+W close tab close pane
Cmd+D split right split pane vertically
Cmd+Shift+D split down split pane horizontally
Cmd+] & Cmd+[ focus next and previous split cycle next and previous pane
Cmd+Shift+] & Cmd+Shift+[ next and previous tab next and previous tab
Cmd+1..9 jump to tab switch workspace
Alt+1..9 types special characters switch tab

Ghostty keeps everything else, Cmd+N for a new window, Cmd+C / Cmd+V for copy and paste, search, and font size. And Herdr's Ctrl+B prefix mode keeps working as a fallback, with Ctrl+B ? showing the help panel.

I also created a short video to show how easier it is to navigate inside Herdr using these keyboard shortcuts.

The Ghostty side lives in the same config file my cmux setup already used at ~/Library/Application Support/com.mitchellh.ghostty/config.ghostty, symlinked from ~/.config/ghostty/config.

macos-option-as-alt = true

keybind = cmd+t=unbind
keybind = cmd+w=unbind
keybind = cmd+d=unbind
keybind = cmd+shift+d=unbind
keybind = cmd+[=unbind
keybind = cmd+]=unbind
keybind = cmd+shift+[=unbind
keybind = cmd+shift+]=unbind
keybind = cmd+1=unbind
keybind = cmd+digit_1=unbind
keybind = cmd+2=unbind
keybind = cmd+digit_2=unbind
keybind = cmd+3=unbind
keybind = cmd+digit_3=unbind
keybind = cmd+4=unbind
keybind = cmd+digit_4=unbind
keybind = cmd+5=unbind
keybind = cmd+digit_5=unbind
keybind = cmd+6=unbind
keybind = cmd+digit_6=unbind
keybind = cmd+7=unbind
keybind = cmd+digit_7=unbind
keybind = cmd+8=unbind
keybind = cmd+digit_8=unbind
keybind = cmd+9=unbind
keybind = cmd+digit_9=unbind

Ghostty binds both cmd+1 and cmd+digit_1 by default, 1 matches the character and digit_1 the physical key, so both lines are needed for every digit. You can check with ghostty +show-config --default | grep goto_tab.

The Herdr side goes into ~/.config/herdr/config.toml:

[keys]
new_tab = "cmd+t"
close_pane = "cmd+w"
split_vertical = "cmd+d"
split_horizontal = "cmd+shift+d"
cycle_pane_next = "cmd+]"
cycle_pane_previous = "cmd+["
next_tab = "cmd+shift+]"
previous_tab = "cmd+shift+["
switch_workspace = "cmd+1..9"
switch_tab = "alt+1..9"

herdr config check validates the TOML and herdr server reload-config applies it to the running server without a restart. For Alt to work at all, macos-option-as-alt = true is required in Ghostty, otherwise Option types special characters.

So far, I'm loving the setup.


Using OpenCode Go models in ZCode harness

I subscribe to OpenCode Go 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 pointed OpenCode itself at NVIDIA's models a while back.

The setup is just a few fields in ZCode's Model settings. Click "Add provider", name it OpenCode, and fill these in:

Base URL:   https://opencode.ai/zen/go/v1
API format: Chat completions (/chat/completions)
API key:    your key from opencode.ai/auth

Then click "Add model" and type the model IDs you want, like glm-5.3-flash or deepseek-v4-flash, and enable the provider.

OpenCode provider configured in ZCode with glm-5.3-flash and deepseek-v4-flash

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 https://opencode.ai/zen/go as the base URL. ZCode appends /v1/messages itself. Grok 4.6 and GPT 5.6 Luna don't work at all, they only exist on OpenAI's Responses API, which ZCode doesn't speak.

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's how ZCode knows glm-5.3-flash accepts screenshots while deepseek-v4-flash is text-only.

Editing the glm-5.3-flash model settings in ZCode

The full live model list stays at https://opencode.ai/zen/go/v1/models, so I just paste a new ID into ZCode whenever a new model shows up. Go's limits are dollar-based, $12 per 5 hours, $30 weekly, $60 monthly, so cheaper models like deepseek-v4-flash stretch the plan much further. And if you are about to subscribe, use a referral link, the $5 reward cuts the 5-hour limit by up to 41%.


Omarchy is the best Linux distro for old laptops

I installed Omarchy 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. Fedora needed a lot of surgery just to get Wi-Fi and the webcam working, and Mint managed to break its own Wi-Fi driver on the first update, but Omarchy simply installed cleanly, booted fast, and everything just worked.

It's DHH'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.

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 Omacom foundation backing it. I already love this distro enough to have been collecting Omarchy themes, setups, and resources in one place for a while.

I took a lot of photos and screenshots during the install, and here they are.

Installation completed in 1 minutes 57 seconds

A beautiful Omarchy theme

A beautiful Omarchy theme

Two tiled windows in a workspace

Beautiful, aren't they?


Linux Mint Wi-Fi and failed update fix on 2014 MacBook Pro

After the Fedora 44 test, I wiped the old MacBook Pro 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.

The update pulled in the HWE kernel 7.0.0-30, and DKMS couldn't rebuild the proprietary wl driver for it, so linux-headers-7.0.0-30-generic, linux-headers-generic-hwe-24.04, linux-generic-hwe-24.04, and linux-image-7.0.0-30-generic were left unconfigured. By the way, the Wi-Fi was working on the old 6.14 kernel.

Then, canonical patches wl 6.30.223.271 for every kernel bump, and while 23ubuntu1.2 fixed 6.17, only 23ubuntu1.3 in noble-proposed has the linux-7.0 fix. I booted into 6.14, and ran this.

echo 'deb http://archive.ubuntu.com/ubuntu noble-proposed restricted' | sudo tee /etc/apt/sources.list.d/noble-proposed.list
sudo apt update
sudo apt install broadcom-sta-dkms=6.30.223.271-23ubuntu1.3
sudo dpkg --configure -a
sudo rm /etc/apt/sources.list.d/noble-proposed.list
sudo apt update
sudo reboot

The driver install builds wl for 7.0, and dpkg --configure -a finishes the stuck packages. After reboot, uname -r showed 7.0.0-30-generic, lsmod | grep wl showed the module loaded, and nmcli device status showed wlp2s0 connected on 5 GHz.

The locale warnings in the update output went away after sudo dpkg-reconfigure locales with en_IN.UTF-8 selected, because en_IN.ISO8859-1 was never generated on the system. And for next time, b43 doesn't support this BCM4360's AC revision, installing the driver after the update wouldn't have helped either, and after any future kernel update the same check applies.

Can look at apt-cache policy broadcom-sta-dkms for a newer version in noble-proposed.


Fedora 44 Wi-Fi and Webcam fix on Mid-2014 MacBook Pro

I installed Fedora 44 on the $100 MacBook Pro I bought recently just to test Linux on it, and Wi-Fi simply didn't exist – no network, no wlan interface, and literally nothing in NetworkManager. And after spending a lot of time, here's the short version of how it was fixed.

I discovered, the MacBook has a Broadcom BCM4360 Wi-Fi chip 14e4:43a0 and the open-source b43 driver that Fedora loads by default doesn't support this 802.11ac chip, so the card sits there unable to do anything. It needs the proprietary broadcom-wl driver, which lives in the RPM Fusion nonfree repo, and obviously doesn't automatically get installed.

So the fix starts with enabling the nonfree repo and installing the driver.

sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

sudo dnf install akmod-wl kernel-devel-$(uname -r)

The akmod-wl package builds the wl 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 /etc/modprobe.d/broadcom-wl.conf with these lines.

blacklist b43
blacklist b43legacy
blacklist brcmsmac
blacklist ssb
blacklist bcma
blacklist bcm43xx

And make sure wl loads at boot by putting a single line in /etc/modules-load.d/wl.conf.

wl

Then build the module and reboot.

sudo akmods
sudo reboot

After the reboot Wi-Fi showed up in the toolbar and in GNOME settings and connected without any issues. By the way, USB tethering via my Android device got me through the setup, because that was the only way to use internet on the Fedora device.

Apart from this, the webcam also didn't work and needed more work. This MacBook has a Broadcom 720p FaceTime HD camera (14e4:1570) with no open driver at all, so /dev/video0 never appears. The fix has two parts, and I also installed lm_sensors along the way to read fan speeds and temperatures.

First the driver. It's out-of-tree and built via DKMS, which already has kernel-devel available from the Wi-Fi setup.

sudo dnf install dkms

git clone --depth 1 https://github.com/patjak/bcwc_pcie.git
sudo cp -r bcwc_pcie /usr/src/facetimehd-0.7.0.1
sudo dkms add facetimehd/0.7.0.1
sudo dkms build facetimehd/0.7.0.1
sudo dkms install facetimehd/0.7.0.1

Then the firmware. The camera needs Apple's proprietary firmware extracted from the macOS 10.12.6 update, and there's a script that pulls only the needed chunks from Apple's CDN and verifies them by SHA256.

git clone --depth 1 https://github.com/patjak/facetimehd-firmware.git
cd facetimehd-firmware
sudo ./facetimehd-firmware-install.sh

The script drops firmware.bin and eleven sensor calibration files into /usr/lib/firmware/facetimehd/. Then load the module and the camera appears.

sudo modprobe facetimehd
ls /dev/video0

I verified it with a one-frame ffmpeg capture, which produced a proper 122 KB JPEG. To make it persistent across reboots, add facetimehd to /etc/modules-load.d/facetimehd.conf and /etc/dracut.conf.d/facetimehd.conf, then rebuild the initramfs.

echo "facetimehd" | sudo tee /etc/modules-load.d/facetimehd.conf
echo 'add_drivers+=" facetimehd "' | sudo tee /etc/dracut.conf.d/facetimehd.conf
sudo dracut --force

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's EFI doesn't support it, so the unsigned modules load without any key enrollment.


Get 10% off Z.ai GLM coding with a referral link

Z.ai runs an "Invite Friends, Get Credits" campaign, and if you sign up to the GLM Coding plan through my Z.ai referral link, you get a 10% instant discount on your first subscription. The discount is applied automatically at checkout, so there's no coupon code to remember.

Here are the conditions from the official campaign rules.

  • The discount works for new accounts and for existing accounts with no paid subscription history.
  • It applies to the first GLM Coding order only. Renewals, upgrades, and downgrades are not eligible.
  • It can't be stacked with other similar first-order discounts.

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's a win-win, similar to the OpenCode referral reward I wrote about earlier.

That's it.


Find all subdomains of a domain with crt.name

Came across this post on X 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:

https://crt.name/v1/search?apex=YOUR_DOMAIN

Just replace YOUR_DOMAIN with a domain and it lists every subdomain it has on file. The index is pre-built, and as their website explains, 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.

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.


2026: The year of Linux Desktops

Welcome to the year of Linux desktops, 2026!

DHH has truly created a revolution with his Linux distro Omarchy. Just over a year after the initial launch, the Omarchy ISO is now being downloaded almost 5,000 times every day.

Recently, the Omacom foundation was launched with a whopping $8 million in funds, and the following 8 patrons contributed $1 million each for the cause.

Omarchy Omacom Patrons

Legendary folks, no?

I used Linux for 5–6 years, then went back to Windows and am currently using macOS, but I have never been more excited to try Linux again. I watched DHH's new video. The new Omarchy Quattro looks amazing. And the next chance I get to upgrade my setup, I am moving to Linux once and for all.


Chrome Web Store revises limits on extensions

Recently, Chrome Web Store has revised its limits on number of extensions you can publish to the Web Store. I don't know what the limit was earlier, but now, for new accounts it starts from the limit of 2 published extensions as explained on this docs page. 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'm at this limit of 10 published extensions as you see in the screenshot.

Chrome Web Store published extensions limits

And I see the below message in a popup when I click on this 8/10 limits button.

Chrome Web Store message shown for limits

Neither in their docs and nor in the developer dashboard it's mentioned if they will further entertain my request to increase limits from 10 to more. But I'm about to publish a few extensions so let's see how it goes.

I will keep this page updated as I learn more.


Managing AI agent workspaces with Herdr

After configuring cmux and trying out Kero, I've been testing herdr 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.

Everything sits in plain files under ~/.config/herdr/.

~/.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

My herdr config is small, a gruvbox UI theme with agent labels on pane borders.

[ui]
status_indicators = "symbols"
show_agent_labels_on_pane_borders = true

[theme]
name = "gruvbox"
auto_switch = false

[ui.toast]
delivery = "terminal"

I run herdr as a TUI inside the Ghostty terminal. Ghostty reads the same config file my cmux setup already used at ~/.config/ghostty/config, so the terminal look carried over as-is. I only changed the theme to Gruvbox Dark and left everything else default. Here's how it looks currently, but obviously I will keep improving it:

Using Herdr in Ghostty

Herdr detects the agents in each pane and shows their state, working, blocked, or idle, right in the sidebar. And it's all just so convenient to use and manage.

Everything is saved to session.json, 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't reliable. I'm still testing it alongside cmux, but it's looking like it could become my permanent setup, eventually.

Apart from this, the most clear, to the point, and convincing video I ever watched about herdr is this one from Jilles. This video is the reason I installed and started using herdr.


Don't send report, send prompt instead

Don't send me the report, just send me the prompt.

Don't send me the report, just send me the prompt.

This post on X from Naval made me laugh that basically points out the irony when people use AI for everything.


Setting up Hetzner Qwen3.8-27B in the Pi agent

I added the Hetzner Inference API as a provider in my Pi agent, the same way I set up NVIDIA models in OpenCode. Hetzner runs an OpenAI-compatible REST API at inference.hetzner.com serving open-weight Qwen models. To get an API token you log in to experiments.hetzner.com 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's Inference API page linked above.

Custom providers in pi live in ~/.pi/agent/models.json and the model ID to use is Qwen3.8-27B, and you can always check the live model list with:

curl -s https://inference.hetzner.com/api/v1/models \
  -H "Authorization: Bearer <YOUR_TOKEN>"

Here is the full provider config:

{
  "providers": {
    "hetzner": {
      "baseUrl": "https://inference.hetzner.com/api/v1",
      "api": "openai-completions",
      "apiKey": "<YOUR_TOKEN>",
      "compat": {
        "supportsDeveloperRole": false,
        "supportsReasoningEffort": false
      },
      "models": [
        {
          "id": "Qwen3.8-27B",
          "name": "Qwen3.8 27B (Hetzner)",
          "reasoning": true,
          "input": ["text", "image"],
          "contextWindow": 262144,
          "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
        }
      ]
    }
  }
}

The compat flags tell pi to send a plain system message instead of the developer role and to skip the reasoning_effort field, which the Qwen server does not understand. reasoning: true enables thinking mode, input allows text and image messages, and the context window is 262k tokens.

No restart needed. Open /model inside pi and the model appears as Qwen3.8 27B (Hetzner), since the file reloads whenever you open the model picker. Keep models.json 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.


A page for personal websites I like

I added a new page on my site for personal websites I like. 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's dominant background color and how heavy the homepage's code is, meaning the HTML, CSS, JavaScript and fonts it loads, with images and video excluded.

Personal sites I like

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 content-visibility: auto, so the page stays fast as the collection grows.

I will keep adding interesting personal websites as I discover more.


A clock for DeepSeek's time-of-day pricing

DeepSeek moved its API rates to time-of-day pricing 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 a DeepSeek peak/off-peak pricing clock page that shows which half of the day I'm in right now.

DeepSeek peak/off-peak pricing clock

By the way, you can check the clock here.

The page shows whether it'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.

I queue my non-urgent jobs during the cheap half and the bill drops by 50%. I've been running V4 Pro as my daily model since an earlier note, so the clock has been earning its keep. The rates come straight from the official pricing page.

Update: Sat Aug 22, 2026

DeepSeek changed the weekend rules 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's still the one URL to keep open.