<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Avil Page</title><link>https://avilpage.com/</link><description>Avil Page - Personal &amp; tech blog by Pandikunta Anand Reddy (aka Chillar Anand)</description><atom:link href="https://avilpage.com/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Fri, 31 Jul 2026 17:07:15 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Handy - Best cross platform Dictation app (Free)</title><link>https://avilpage.com/2026/07/handy-stt-dictation-cross-platform.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;h4&gt;Context&lt;/h4&gt;
&lt;p&gt;Around 2016, I explored various speech-to-text (STT) tools to reduce strain on writs due to RSI(Repetetive Strain Injury) and gave up on them due to their limitations.&lt;/p&gt;
&lt;p&gt;With AI advancements, these tools have come a long way.&lt;/p&gt;
&lt;h4&gt;Open Source STT Tools&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/cjpais/Handy"&gt;Handy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/TypeWhisper"&gt;TypeWhisper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/altic-dev/FluidVoice"&gt;FluidVoice&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ray-amjad/hyperwhisper-app"&gt;HyperWhisper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Beingpax/VoiceInk"&gt;VoiceInk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are couple of paid tools but they didn't work well in noisy environment.&lt;/p&gt;
&lt;p&gt;After trying out all these tools with local models like Parakeet, Voxstral, and Cohere Transcribe, I found that Handy + Cohere Transcribe is the best combination for my needs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="mac-tts-models.png" src="https://avilpage.com/images/mac-tts-models.png"&gt;&lt;/p&gt;
&lt;p&gt;Handy has post processing as an experimental feature where we can send output of STT to other LLM models and get a fine grained output.&lt;/p&gt;
&lt;p&gt;&lt;img alt="mac-tts-post-process.png" src="https://avilpage.com/images/mac-tts-post-process.png"&gt;&lt;/p&gt;
&lt;p&gt;For example, when I dictate "git push dash dash force", the output is "git push --force" after post processing.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;I let AI to write &lt;a href="https://github.com/ChillarAnand/init/blob/main/handy_stats.py"&gt;handy_stats.py&lt;/a&gt; script to track my dictation stats. I am dictating more than 10K characters per day which reduces strain on my fingers/writs.&lt;/p&gt;</description><category>cross-platform</category><category>dictation</category><category>speech-to-text</category><guid>https://avilpage.com/2026/07/handy-stt-dictation-cross-platform.html</guid><pubDate>Tue, 28 Jul 2026 23:49:39 GMT</pubDate></item><item><title>Moving from TailScale to NetBird</title><link>https://avilpage.com/2026/06/moving-from-tailscale-to-netbird.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;p&gt;I have been using &lt;a href="https://avilpage.com/tags/tailscale.html"&gt;TailScale&lt;/a&gt; from 4 years. 
Recently, I wanted to self-host HeadScale(open source TailScale server) on my own server. &lt;/p&gt;
&lt;p&gt;During self hosting, I realised that HeadScale is not a drop-in replacement for TailScale.
HeadScale &lt;a href="https://github.com/juanfont/headscale/issues/1651"&gt;doesn't support app-connectors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="netbird" src="https://avilpage.com/images/netbird.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/netbirdio/netbird"&gt;NetBird&lt;/a&gt; is completely open source and has a self-hosted server. 
Setting up split DNS tunneling and routing is easier with NetBird.&lt;/p&gt;
&lt;p&gt;NetBird still doesn't have support for light theme yet. 
Since I am not accustomed to dark theme, I am using &lt;a href="https://github.com/openstyles/stylus"&gt;Stylus&lt;/a&gt; extension
and changing the theme to light theme.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;invert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;hue-rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="kt"&gt;deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;svg&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;video&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;canvas&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;"background-image"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;invert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;hue-rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="kt"&gt;deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>networking</category><category>self-hosting</category><guid>https://avilpage.com/2026/06/moving-from-tailscale-to-netbird.html</guid><pubDate>Sat, 27 Jun 2026 05:43:54 GMT</pubDate></item><item><title>Everyday AI Tools</title><link>https://avilpage.com/2026/05/everyday-ai-tools.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;p&gt;CLI Tools: GitHub Copilot CLI, Claude Code &amp;amp; Open Code&lt;/p&gt;
&lt;p&gt;IDE: GitHub Copilot Plugin&lt;/p&gt;
&lt;h4&gt;Caveman&lt;/h4&gt;
&lt;p&gt;&lt;img alt="caveman" src="https://avilpage.com/images/caveman.png"&gt;&lt;/p&gt;
&lt;p&gt;Reduces token usage by eliminating clutter. It doesn't affect thinking/reasoning.&lt;/p&gt;
&lt;p&gt;Alternatives: &lt;a href="https://avilpage.com/2026/05/everyday-ai-tools.html"&gt;Ponytail&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These tools will help in saving more than 30% of our time to read model output and money(tokens).&lt;/p&gt;
&lt;h4&gt;Claude-mem&lt;/h4&gt;
&lt;p&gt;&lt;img alt="claude-mem" src="https://avilpage.com/images/claude-mem.png"&gt;&lt;/p&gt;
&lt;p&gt;Claude-mem preserves context across sessions by automatically capturing tool usage observations, 
generating semantic summaries, and making them available to future sessions. 
This enables Claude to maintain continuity of knowledge about projects even after sessions end or reconnect.&lt;/p&gt;
&lt;p&gt;This will improve developer productivity as well.&lt;/p&gt;
&lt;p&gt;Alternatives: &lt;a href="https://github.com/rohitg00/agentmemory"&gt;AgentMemory&lt;/a&gt; (backed by Linux Foundation)&lt;/p&gt;
&lt;h4&gt;CodeGraph&lt;/h4&gt;
&lt;p&gt;We work with multiple code bases on a daily basis and claude-code spawns Explore agents 
that scan files with grep, glob and read. They consume tokens on every tool call.&lt;/p&gt;
&lt;p&gt;CodeGraph provides a pre-indexed knowledge graph to those agents, which reduces 50% tokens.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Alternatives&lt;/em&gt;: &lt;a href="https://github.com/safishamsi/graphify"&gt;Graphify&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;rtk&lt;/h4&gt;
&lt;p&gt;CLI proxy that reduces LLM token consumption by ~75% on common dev commands like ls, cat, git, etc.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Similar tool&lt;/em&gt;: &lt;a href="https://github.com/headroomlabs-ai/headroom"&gt;Headroom&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Misc&lt;/h4&gt;
&lt;p&gt;andrej-karpathy-skills&lt;/p&gt;
&lt;p&gt;ccstatusline&lt;/p&gt;
&lt;p&gt;Custom instructions for agents in plain markdown files&lt;/p&gt;</description><category>AI</category><guid>https://avilpage.com/2026/05/everyday-ai-tools.html</guid><pubDate>Sun, 31 May 2026 17:47:04 GMT</pubDate></item><item><title>First 30 Days in a Senior Technical Role</title><link>https://avilpage.com/2026/04/first-30-days-senior-tech-role.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;h4&gt;A little trust goes a long way&lt;/h4&gt;
&lt;p&gt;As a senior technical person, you will have certain professional authority.
But to be effective, you need to build personal trust with your team and peers.
That can happen only if you are approachable &amp;amp; transparent.&lt;/p&gt;
&lt;p&gt;Set up 1:1 meetings with your team members and cross-functional team leads.
Go on a listening tour and take your notes.&lt;/p&gt;
&lt;p&gt;Be specific on how people can reach you and how you will communicate with them.
Setup routine 1:1 meetings if required.&lt;/p&gt;
&lt;h4&gt;Follow the money&lt;/h4&gt;
&lt;p&gt;It is important to have high level overview of the business. 
This will help you make informed decisions and prioritize your work effectively.&lt;/p&gt;
&lt;p&gt;&lt;img alt="follow the money" src="https://avilpage.com/images/follow-the-money.png"&gt;&lt;/p&gt;
&lt;center&gt;
&lt;i&gt;
Sankey chart of Apple's revenue
&lt;/i&gt;
&lt;/center&gt;

&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;If the company is public, you can get quarterly &amp;amp; annual reports.
If not, try to get a good sense of where the money is coming from and where the money is going.&lt;/p&gt;
&lt;h4&gt;Follow the data&lt;/h4&gt;
&lt;p&gt;Get a high level overview of product(s), infrastructure, tools, data flow.
This is crucial to make informed technical decisions or architectural changes.&lt;/p&gt;
&lt;h4&gt;Start Small&lt;/h4&gt;
&lt;p&gt;For the first 30 days, you should be in "listening mode" or "absorbing mode".
Try to understand the company, the team, the product, the customers, the culture, and the processes.&lt;/p&gt;
&lt;p&gt;It is better to avoid any big changes in the first 30 days. There will be plenty of time for that later.&lt;/p&gt;
&lt;h4&gt;30-60-90 Day Plan&lt;/h4&gt;
&lt;p&gt;Note down action items for next 60 and 90 days.&lt;/p&gt;
&lt;p&gt;It could be anything from setting up a new monitoring system,
to improving the deployment process, to hiring new team members, providing simple tools for self service, etc.&lt;/p&gt;
&lt;p&gt;Commnicate the plan with all stakeholders and avoid any surprises.&lt;/p&gt;
&lt;h4&gt;Reduce Cloud &amp;amp; SaaS Costs&lt;/h4&gt;
&lt;p&gt;If these are a significant part of the company's expenses,
then review the costs and see if there is any room for reducing these costs.&lt;/p&gt;
&lt;p&gt;On cloud, moving compute instances to reserved or spot can save 70-90% of costs.&lt;/p&gt;
&lt;p&gt;That can have a big impact on the company's bottom line.&lt;/p&gt;
&lt;h4&gt;Buy or build good tools&lt;/h4&gt;
&lt;p&gt;On the other hand, if there are any tools that can help the team to be more productive, 
then it is worth investing in those tools.&lt;/p&gt;
&lt;p&gt;To do that, you should already have a good toolset under your belt.&lt;/p&gt;
&lt;p&gt;Sometimes building a simple tool which can make team self sufficient 
can have a big impact on the team's productivity and morale.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;The first 30 days in a senior technical role are crucial for building trust, 
understanding the business, and setting the foundation for the next step.&lt;/p&gt;
&lt;p&gt;Without much work to do, you can have a big impact on the company by following the tips mentioned above.&lt;/p&gt;</description><category>careers</category><guid>https://avilpage.com/2026/04/first-30-days-senior-tech-role.html</guid><pubDate>Thu, 30 Apr 2026 06:17:29 GMT</pubDate></item><item><title>Build/Deploy Full Stack Web Apps with only Config</title><link>https://avilpage.com/2026/03/config-first-tools.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;blockquote&gt;
&lt;p&gt;The best code is the code you don't have to write&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Config First Tools&lt;/h4&gt;
&lt;p&gt;Any tool that provides first class support for configuration files can be considered a Config First Tool. 
These tools allow developers to setup/build/deploy applications by writing configuration files instead of writing code.&lt;/p&gt;
&lt;p&gt;In DevOps world, tools like Terraform, Ansible, and Kubernetes are examples of Config First Tools. 
These kinds of tools are not that popular in the web development world.&lt;/p&gt;
&lt;p&gt;In this article, lets see how we can build a full stack web application using only configuration files.&lt;/p&gt;
&lt;h4&gt;Todo - Web App&lt;/h4&gt;
&lt;p&gt;A simple backend API that allows users to manage todo lists.
A simple frontend that uses the backend API.
A simple script to deploy the backend and frontend applications.&lt;/p&gt;
&lt;h4&gt;Backend API&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://pocketbase.io/"&gt;PocketBase&lt;/a&gt; is a backend API that provides a simple way to create and manage databases, authentication, and file storage.
It is a great tool for building simple backend APIs without writing any code.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pocketbase
$&lt;span class="w"&gt; &lt;/span&gt;pocketbase&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can create a collection called &lt;code&gt;Todo&lt;/code&gt; with required fields and pocketbase will automatically generate the API for us.&lt;/p&gt;
&lt;p&gt;&lt;img alt="config-first-tools" src="https://avilpage.com/images/config-first-tools-backend.png"&gt;&lt;/p&gt;
&lt;h4&gt;Frontend&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://lowdefy.com/"&gt;Lowdefy&lt;/a&gt; is a config first tool that allows us to build web applications using yaml config.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;lowdefy
$&lt;span class="w"&gt; &lt;/span&gt;lowdefy&lt;span class="w"&gt; &lt;/span&gt;init
$&lt;span class="w"&gt; &lt;/span&gt;lowdefy&lt;span class="w"&gt; &lt;/span&gt;dev
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For basic crud apps, instead of us writing the boilerplate config, we can ask an AI agent to write the config for us.&lt;/p&gt;
&lt;h4&gt;Deployment&lt;/h4&gt;
&lt;p&gt;For deployment, we can use Ansible to deploy both the backend and frontend applications. Here also we can just AI agent to write the playbook for us.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ansible
$&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook&lt;span class="w"&gt; &lt;/span&gt;deploy.yml
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;OliveTin&lt;/h4&gt;
&lt;p&gt;&lt;img alt="config-first-tools" src="https://avilpage.com/images/config-first-tools-devops.png"&gt;&lt;/p&gt;
&lt;p&gt;Even though we can use ansible to deploy the applications, it is not that convenient to run ansible playbooks on mobile.
&lt;a href="https://www.olivetin.app"&gt;OliveTin&lt;/a&gt; is a config first tool that allows us to create web UIs for our scripts.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Deploy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ToDo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;App"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;popupOnStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;execution-dialog&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ansible-playbook deploy.yml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;6000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"🤖"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can create a simple web UI for our deployment script with just 5 lines.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;For quick prototyping and simple applications, config first tools can be a great choice as they allow us to build applications without writing any code.
They also allow us to focus on the application logic rather than the implementation details.&lt;/p&gt;
&lt;p&gt;With the rise of AI, it is much easy to maintain 500 lines of config than 5000 lines of code.&lt;/p&gt;</description><category>AI</category><category>devops</category><category>web development</category><guid>https://avilpage.com/2026/03/config-first-tools.html</guid><pubDate>Sat, 28 Mar 2026 06:17:29 GMT</pubDate></item><item><title>Talk: Classify Billion base pairs per Second</title><link>https://avilpage.com/2026/02/classify-billion-base-pairs-per-second.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;p&gt;During 25th Feb 2026, a &lt;a href="https://www.meetup.com/bangpypers/events/311155506"&gt;joint meetup&lt;/a&gt; was hosted by BangPypers &amp;amp; SciPy India. &lt;/p&gt;
&lt;p&gt;There was a slot for lightning talk &amp;amp; I gave a talk on Kraken2 performance optimisations titled as "Classify billion base pairs per second".&lt;/p&gt;
&lt;p&gt;Since it was a lightning talk, I didn't had time to polish the slides. During the talk, I briefly covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is metagenomics?&lt;/li&gt;
&lt;li&gt;Overview of open source classification tools &lt;/li&gt;
&lt;li&gt;Brief intro to Kraken2&lt;/li&gt;
&lt;li&gt;Performance optimizations in Kraken2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Few years back, I wrote a series of posts on &lt;a href="https://avilpage.com/2024/07/mastering-kraken2-initial-runs.html"&gt;Mastering Kraken2&lt;/a&gt; where I covered all the optimizations in detail.
If you want to dig deeper into the topic, you can check out the series.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://avilpage.com/images/anand-talk-kraken.png" alt="Anand's talk on Kraken" width="600"&gt;&lt;/p&gt;</description><category>talks</category><guid>https://avilpage.com/2026/02/classify-billion-base-pairs-per-second.html</guid><pubDate>Sat, 28 Feb 2026 01:27:43 GMT</pubDate></item><item><title>In Praise of OliveTin</title><link>https://avilpage.com/2026/01/in-praise-of-olivetin.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;p&gt;&lt;img alt="olivetin" src="https://avilpage.com/images/olivetin.png"&gt;&lt;/p&gt;
&lt;p&gt;In a world of complex internal tools, &lt;a href="https://www.olivetin.app"&gt;OliveTin&lt;/a&gt; bridges the gap between raw CLI and usable web UI with just yaml config.&lt;/p&gt;
&lt;h4&gt;Server Admin Panel&lt;/h4&gt;
&lt;p&gt;I used admin panels like &lt;a href="https://avilpage.com/2024/12/install-cockpit-on-remote-linux-vm.html"&gt;CockPit&lt;/a&gt;, Ajenti, etc to provide simple web UI 
for non-developers to provide access to services. Developing custom widgets is time consuming and requires programming skills as well.&lt;/p&gt;
&lt;p&gt;With OliveTin, I can provide web UI directly with just yaml config. This saves a lot of time and effort.
It also provides a clean UI as it starts from scratch.&lt;/p&gt;
&lt;h4&gt;Backend Driven UI&lt;/h4&gt;
&lt;p&gt;For existing python scripts, I often use tools like Streamlit, NiceGUI, etc to create web UIs.
Organizing the UI components for multiple scripts is time consuming.&lt;/p&gt;
&lt;p&gt;OliveTin can provide web UI directly python scripts and they can be organized in groups with just yaml config.&lt;/p&gt;
&lt;h4&gt;Mobile Friendly&lt;/h4&gt;
&lt;p&gt;To do a simple deployment on mobile, I need to open an app that supports ssh, ssh into the server, navigate to a directory, 
run a script to deploy.&lt;/p&gt;
&lt;p&gt;OliveTin provides a "Deploy" button on mobile browser which is way convenient.&lt;/p&gt;
&lt;h4&gt;Authentication&lt;/h4&gt;
&lt;p&gt;&lt;img alt="olivetin-oauth2" src="https://avilpage.com/images/olivetin-oauth2.png"&gt;&lt;/p&gt;
&lt;p&gt;OliveTin provides authentication(local users, OAuth2, JWT, etc), authorization(ACLs) &amp;amp; accounting(logs) out of the box.
With just yaml config, we can secure the web UI.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;There are hundreds of other features provided by OliveTin like scheduling, file uploads, webhooks, etc.&lt;/p&gt;
&lt;p&gt;If you ever want to provide a simple web UI for scripts with low code or no code, give OliveTin a try!&lt;/p&gt;</description><category>automation</category><category>cross-platform</category><category>devops</category><guid>https://avilpage.com/2026/01/in-praise-of-olivetin.html</guid><pubDate>Fri, 30 Jan 2026 20:13:11 GMT</pubDate></item><item><title>Remote Access to k3d/k3s Kubernetes cluster</title><link>https://avilpage.com/2025/12/remote-access-to-k3d-k3s-cluster.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;We learnt how to &lt;a href="https://avilpage.com/2023/03/setup-k8s-anywhere-k3d.html"&gt;deploy kubernetes cluster anywhere with a single k3d command&lt;/a&gt;. 
By default, k3d cluster is accessible only from the host machine.&lt;/p&gt;
&lt;h4&gt;Remote Access&lt;/h4&gt;
&lt;p&gt;&lt;img alt="k3d-remote-access" src="https://avilpage.com/images/k3s-remote-access.png"&gt;&lt;/p&gt;
&lt;p&gt;Create new cluster with&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;k3d&lt;span class="w"&gt; &lt;/span&gt;cluster&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;cloud-k8s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--api-port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;:6443@loadbalancer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--k3s-arg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--tls-san=&amp;lt;remote-ip&amp;gt;@server:*"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--api-port 6443:6443@loadbalancer&lt;/code&gt; maps port 6443 on the host machine to the cluster's API server load balancer. 
This can be changed (e.g., 8080:6443) if 6443 is taken on the host.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--k3s-arg "--tls-san=..."&lt;/code&gt;  adds the host's public IP to the certificate, preventing SSL errors later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure remote server firewall allows incoming traffic on the chosen port (e.g., 6443 or 8080). 
To verify, run &lt;code&gt;telnet &amp;lt;remote-ip&amp;gt; 6443&lt;/code&gt; from local machine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the remote server, get kubeconfig:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;k3d&lt;span class="w"&gt; &lt;/span&gt;kubeconfig&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;cloud-k8s
---
apiVersion:&lt;span class="w"&gt; &lt;/span&gt;v1
clusters:
-&lt;span class="w"&gt; &lt;/span&gt;cluster:
&lt;span class="w"&gt;    &lt;/span&gt;server:&lt;span class="w"&gt; &lt;/span&gt;https://0.0.0.0:6443
&lt;span class="w"&gt;  &lt;/span&gt;name:&lt;span class="w"&gt; &lt;/span&gt;k3d-rk
&lt;span class="w"&gt;   &lt;/span&gt;...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# truncated for brevity&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Copy this kubeconfig, replace &lt;code&gt;0.0.0.0&lt;/code&gt; with the remote server's public IP.&lt;/p&gt;
&lt;p&gt;Open &lt;a href="https://github.com/freelensapp/freelens"&gt;Free Lens&lt;/a&gt;, paste this config and connect to the remote k3d cluster.&lt;/p&gt;
&lt;p&gt;&lt;img alt="k3d-remote-access" src="https://avilpage.com/images/k3s-remote-access-freelens.png"&gt;&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;You can use your favorite Kubernetes tools (kubectl, FreeLens, k9s, etc.) to manage the remote k8s cluster.&lt;/p&gt;</description><category>devops</category><category>kubernetes</category><category>linux</category><guid>https://avilpage.com/2025/12/remote-access-to-k3d-k3s-cluster.html</guid><pubDate>Wed, 17 Dec 2025 03:10:39 GMT</pubDate></item><item><title>Setup Tailscale App Connector in 3 easy steps</title><link>https://avilpage.com/2025/11/tailscale-app-connectors-quick-setup.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;h4&gt;Problem Statement&lt;/h4&gt;
&lt;p&gt;In the earlier post, we have seen how to &lt;a href="https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html"&gt;route specific websites to an exit node&lt;/a&gt; using a SOCKS proxy &amp;amp; browser extension(or a PAC file).&lt;/p&gt;
&lt;p&gt;With this approach, when we need to work on multiple computers, we need to setup the SOCKS proxy &amp;amp; browser extension individually.&lt;/p&gt;
&lt;p&gt;Instead we can use Tailscale's App Connectors to route specific websites through selected nodes.&lt;/p&gt;
&lt;p&gt;Tailscale docs are too complicated for this App connectors. Here is a simplified version of the steps.&lt;/p&gt;
&lt;h4&gt;Tailscale - App Connectors&lt;/h4&gt;
&lt;p&gt;Note: There is no need for publicly reachable IP address for the Tailscale node which is used as App Connector.
(Thanks &lt;a href="https://chameth.com"&gt;Chris Smith&lt;/a&gt; for pointing it out. Tailscale docs are misleading in this regard.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the Tailscale admin console, go to the "Access control" section &amp;amp; add &lt;code&gt;tagOwners&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"tagOwners"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"tag:home-connector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;"autogroup:member"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="tailscale app connector acl" src="https://avilpage.com/images/tailscale-app-connector-acl.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use any Linux machine (it doesn't need static IP) to setup the App Connector. Install Tailscale on it. Advertise it as an app connector.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tailscale&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;--advertise-tags&lt;span class="o"&gt;=&lt;/span&gt;tag:home-connector&lt;span class="w"&gt; &lt;/span&gt;--accept-routes
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Enable IP forwarding on the machine. If your Linux system has a &lt;code&gt;/etc/sysctl.d&lt;/code&gt; directory, run&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'net.ipv4.ip_forward = 1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;/etc/sysctl.d/99-tailscale.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'net.ipv6.conf.all.forwarding = 1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;/etc/sysctl.d/99-tailscale.conf
sudo&lt;span class="w"&gt; &lt;/span&gt;sysctl&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/etc/sysctl.d/99-tailscale.conf
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Otherwise, run&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;From the Tailscale admin console, create a new app connector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="tailscale app connector" src="https://avilpage.com/images/tailscale-app-connector.png"&gt;&lt;/p&gt;
&lt;p&gt;In the "Target" field, we can select any existing app or we can use custom target so that we can route our desired websites.
For now, I am adding &lt;code&gt;ip.me&lt;/code&gt; domain so that we can verify if the traffic is routed through the connector.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From the "Machines" page, select the device and approve the requested subnets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="tailscale app connector subnet" src="https://avilpage.com/images/tailscale-app-connector-subnet.png"&gt;&lt;/p&gt;
&lt;p&gt;From browser, lets visit 2ip.io to see our device ip address. Next, lets visit ip.me to ensure we are seeing the connector's IP as this domain will be served by app connector.&lt;/p&gt;
&lt;p&gt;&lt;img alt="tailscale app connector verify" src="https://avilpage.com/images/tailscale-app-connector-verify.png"&gt;&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;We can use App Connectors to route specific websites through a Tailscale node without needing to setup SOCKS proxy or browser extensions on each device.&lt;/p&gt;</description><category>networking</category><category>tailscale</category><guid>https://avilpage.com/2025/11/tailscale-app-connectors-quick-setup.html</guid><pubDate>Sat, 22 Nov 2025 12:48:18 GMT</pubDate></item><item><title>TailScale - Use Exit Node for Specific Websites only</title><link>https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html</link><dc:creator>Anand Reddy Pandikunta</dc:creator><description>&lt;h4&gt;Problem&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://avilpage.com/tags/tailscale.html"&gt;Tailscale&lt;/a&gt;&lt;sup id="fnref:tailscale"&gt;&lt;a class="footnote-ref" href="https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html#fn:tailscale"&gt;1&lt;/a&gt;&lt;/sup&gt; provides zero-config mesh VPN built on top of Wiregaurd.&lt;/p&gt;
&lt;p&gt;It provides an option to use an exit node for routing all traffic through it. 
But it can't route only specific domains through the exit node.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tailscale Exit Node Option" src="https://avilpage.com/images/tailscale-exit-node-option.png"&gt;&lt;/p&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;Setup a SOCKS proxy using &lt;code&gt;ssh&lt;/code&gt; command line tool.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;-D&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1080&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;-N&lt;span class="w"&gt; &lt;/span&gt;user@exit-node-ip
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;-D 1080&lt;/code&gt; : Specifies the local port to listen on for SOCKS connections.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-f&lt;/code&gt; : Requests ssh to go to background just before command execution.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-C&lt;/code&gt; : Enables compression.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-q&lt;/code&gt; : Quiet mode.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-N&lt;/code&gt; : Do not execute remote commands.&lt;/p&gt;
&lt;p&gt;Once it is started, we can use &lt;a href="https://github.com/zero-peak/ZeroOmega"&gt;ZeroOmega&lt;/a&gt;&lt;sup id="fnref:zeroomega"&gt;&lt;a class="footnote-ref" href="https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html#fn:zeroomega"&gt;2&lt;/a&gt;&lt;/sup&gt; browser extension to route specific domains through the SOCKS proxy.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ZeroOmega Config" src="https://avilpage.com/images/zeroomega-config.png"&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;auto switch&lt;/code&gt; profile, we can setup specific domains which needs to be directed to the proxy. 
For all other domains, it will use the direct connection.&lt;/p&gt;
&lt;p&gt;This works only for the browser where the extension is installed.&lt;/p&gt;
&lt;p&gt;To apply this at the system level, we can use &lt;code&gt;pac&lt;/code&gt; file and update the system proxy settings to use the &lt;code&gt;pac&lt;/code&gt; file.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Tailscale provides app connector feature to route specific apps through the exit node, but it is needs publicly reachable IPs &amp;amp; Linux based OS for now.&lt;/p&gt;
&lt;p&gt;Setting up SOCKS proxy &amp;amp; using a browser extension or PAC file is much easy &amp;amp; straight forward solution to route specific domains through Tailscale exit node.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:tailscale"&gt;
&lt;p&gt;&lt;a href="https://tailscale.com"&gt;https://tailscale.com&lt;/a&gt; &lt;a class="footnote-backref" href="https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html#fnref:tailscale" title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:zeroomega"&gt;
&lt;p&gt;&lt;a href="https://github.com/zero-peak/ZeroOmega"&gt;https://github.com/zero-peak/ZeroOmega&lt;/a&gt; &lt;a class="footnote-backref" href="https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html#fnref:zeroomega" title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><category>how-to</category><category>tailscale</category><guid>https://avilpage.com/2025/10/tailscale-exit-node-specific-domains.html</guid><pubDate>Wed, 22 Oct 2025 22:20:58 GMT</pubDate></item></channel></rss>