Clicked this beautiful scene from the train
Was traveling via train a few days ago and looked outside from the window to see this beautiful scene and clicked a photo. I think it came out to be awesome, like this a lot.
Short notes, links, and thoughts – shared as I go through my day.
Was traveling via train a few days ago and looked outside from the window to see this beautiful scene and clicked a photo. I think it came out to be awesome, like this a lot.
CogSend now posts to Instagram, which makes it six platforms along with Mastodon, Bluesky, LinkedIn, Threads and X. In the intro post I said Instagram, TikTok and YouTube were the ones I was thinking about next, and this is the first one out.
From v1.21.0, you can publish and schedule to an Instagram Business or Creator account from the same composer as everything else.
What goes out depends on what you attach.
The thing is, Instagram is stricter than the others and needs a photo or video, takes photos only from 4:5 tall to 1.91:1 wide, and takes no GIFs. When an Instagram account is selected and a post breaks one of these, the composer shows a line naming the problem with an Uncheck Instagram button, and Publish and Schedule stay disabled until you fix it. The other accounts are never held to these rules.
It also takes only JPEG, so when you attach a PNG or WebP, the browser stores a full-size JPEG copy for Instagram, and every other platform still gets the original.
Connecting needs your own Meta app, but there's no App Review for an account you own. A personal Instagram account can switch to Creator for free, no Facebook Page is needed, and an app you already use for Threads works too. The steps are in the Instagram setup docs.
And if you'd rather skip the developer app, Instagram accounts connected through Zernio get the same rules and the JPEG copy.
Apart from this, I have done multiple small adjustments and improvements in the app ever since and much more is coming.
That's it, for now.
I got access to the new Rex terminal by the Superlogical team a week ago and have been regularly using and enjoying the terminal ever since. Even though it's in beta currently, it's still very polished and amazing to use.
Here's what my setup looks like:
I have been using Herdr for the last few months and was even using their new Herdr native app from day one. I wasn't ready to shift to Rex, but now I think I am. And some things I like about Rex so far are:
cmd+shift+p that makes everything easier.
I haven't mentioned all here, and I will write more on it as I use it more.
Update:
I am back to using Herdr for only reason that my Claude sessions don't survive computer restarts, unlike Herdr.
Herdr launched a new native app for macOS, Linux, and Windows, and I've been using it since day one. It feels more polished than running the Herdr TUI inside Ghostty, which was my setup until now. Visually it's mostly the same, but it's noticeably snappier and workspaces are better managed.
My one complaint is the "Changes" tab, which is basic and not feature rich yet. So for now I'm running lazygit in a narrow resized pane and that's working fine for me.
The DeepSeek Price Clock extension now has a Firefox build. And as earlier, the whale icon is green off-peak and red at peak, the popup shows the countdown and current rates, and optional alerts fire when the price flips.
The build is signed by Mozilla for self-distribution, so it stays installed across restarts. It isn't listed on addons.mozilla.org, doesn't auto-update, and needs Firefox 140 or newer.
Both builds use the same pricing logic as the clock page.
YouTube keeps the player in a narrow column next to the recommendations, and fullscreen takes over the whole screen. Wide Stage is a small Chrome extension that fills the browser tab with the player instead.
Press ` on any watch page, or click the new button before the fullscreen button. The sidebar, description, and comments disappear and the video stretches to the size of the tab. It keeps its aspect ratio, so it fills the screen when the shape matches and shows bars when it doesn't.
Under the hood it's one class on the <html> element and a stylesheet that pins the player to the viewport and hides the extra columns.
It's open source on GitHub. Since it isn't on the Chrome Web Store, download the ZIP and load the extracted folder from chrome://extensions with Developer mode on.
Update: Oct 25, 2026
Wide Stage now works in Firefox too. Download the Mozilla-signed .xpi from the latest release and open it in Firefox 140 or newer, and it should work. Chrome users can grab the ready-to-load ZIP from the same page.
Update: Nov 08, 2026
Version 1.2.0 makes the wide view work with the rest of YouTube. Moving the pointer to the top edge brings up YouTube's top bar with the logo, search, and account menu, and it hides again when the pointer moves away.
Pressing Esc goes back to the default view, the same way it does in fullscreen. YouTube's cinema mode button and the t key now leave the wide view and switch the view, instead of changing it hidden behind the player. The fullscreen and wide view buttons in the player also no longer get cut off after leaving the wide view.
I set up AdGuard Home on my Raspberry Pi 4B (1 GB RAM) to block ads on all my devices. The usual way is to set the Pi as the DNS server in the Wi-Fi router, but my Airtel Xstream router has this setting locked. You can see the DNS options, but there's no button to save them.
So I used Tailscale instead. The Pi is on my tailnet, and in the Tailscale admin DNS settings, I added the Pi's Tailscale IP as the only global nameserver and turned on "Override DNS servers". Now my Mac and Android phone use the Pi for DNS whenever Tailscale is on, at home or outside on mobile data. If the Pi is ever down, I just turn off Tailscale.
I kept the AdGuard Home settings minimal because I only want ads blocked, nothing else.
The Pi isn't open to the internet either. The AdGuard admin panel is only reachable over Tailscale, SSH only accepts keys, and the firewall drops everything else. It's the same idea I used when locking down my Hetzner VPS.
One limitation is that DNS blocking can't remove YouTube ads in the YouTube app, because the ads come from the same servers as the videos. And this would have been the same even if I used Pi-hole as well.
It's not blocking 100% of the apps, but I'm still pretty happy with everything.
From v1.15.1 onwards, CogSend has a seamless in-app update system which works with just a click. When a new release is out, Settings → Instance shows an Update to vX.Y.Z from here button, and the update installs right from the browser.
The first time, it needs a Cloudflare token.
After that, every update only asks for your CogSend password, which your password manager fills, so it's literally one click on Install. The saved token is encrypted with a key made from your password and not the APP_ENCRYPTION_KEY, so even someone with your database and that key can't read it.
Here's a quick video showing how flawless the updates are now:
The new version is uploaded beside the running one and has to pass a health check before it gets any traffic, so a failed update just leaves the old version serving. And if something breaks after an update, there's a Roll back button in the same place.
This works alongside the GitHub Action updates for one-click deploy installs, and CogSend now checks for new releases every hour. More details are in the updating docs.
CogSend now has a Deploy to Cloudflare button, so you can deploy it to your own Cloudflare account without a terminal. Here's the step-by-step process to deploy and update.
APP_ENCRYPTION_KEY from cogsend.com/key or by running openssl rand -hex 32 command in your terminal, fill it in, and save a copy.I also asked Claude to create a video showing the same, and I think it did a great job.
Updates go through the GitHub repository the button created, with no Cloudflare token.
AUTO_UPDATE=true, and patch releases install themselves daily.And every release is signed, and the update action refuses any file the signature doesn't cover. More details are in the updating docs.
For a project, I decided to add a cute animation on the /admin 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's a video showing the same.
It was a very simple prompt, and I'm sure that Claude could have done much better with a more defined prompt.
It's crazy.
I'm on a long ~20-hour train journey right now (you know I love train journeys), 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'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.
I tried downloading Gemma 7B and a few others, but the network is not stable and it'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.
Fingers crossed. 🤞
CogSend also as a sponsor now!
Zernio has just started sponsoring CogSend and that brings a convenient way to connect socials to CogSend without creating developer apps of your own. It's optional, and connecting directly with your own apps still works.
By the way, it's a monthly pledge, and it will help me keep working on CogSend to make it better. And you can learn more about this from our docs.
Excited for this.
I think DeepSeek V4.1 Flash is the best model that'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.
I'm mostly using via OpenCode Go API inside the Pi agent 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 CogSend, SharePDF, and a few other projects and was running 5-6 agents continuously that amounted to this many tokens.
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'm only optimistic about the future.
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.
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.
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 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.
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.
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.
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:
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!
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.
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.
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.
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!
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.
In the last few days, I have adopted two new changes in my work setup:
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.
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 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.
Among all the models you see in the screenshot, only a few stood out.
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.
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.
As of now, I have set up 3 bots that do the following:
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.
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.
| 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.