Skip to content
Murali Krishnan A
Home

Writing

Notes

Things I have had to learn twice, written down so I only have to learn them once more.

22 posts

Earlier

2026

  1. Tarsha, and what counted as an AI agent before LLMs existed

    In 2019 I built a chatbot for my college's placement cell on Dialogflow, before anything like ChatGPT existed. Revisiting the code, the thing that stands out is how cleanly it split the job: a trained model recognized what you wanted, and code I wrote by hand decided what to do about it.

    22 Sept 2026 · 9 min

  2. Jellyfin from scratch, part 5: making it survive a reboot

    The last part of the Jellyfin series. Turning the bot script into a systemd service, keeping the local Telegram API server alive with Docker's own restart policy, log rotation, and a short security checklist for the whole setup.

    21 Sept 2026 · 4 min

  3. Jellyfin from scratch, part 4: the script that turns an upload into a library refresh

    Part four of the Jellyfin series. The actual bot handler: turning the path a local Telegram server hands back into a file in Jellyfin's library, a permissions bug that only shows up on the first real file, and getting a Jellyfin API key to trigger the rescan.

    20 Sept 2026 · 6 min

  4. Jellyfin from scratch, part 3: a Telegram bot, and why it needs its own API server

    Part three of the Jellyfin series. Creating a Telegram bot with BotFather, hitting the 20 MB download wall almost immediately, and running your own local Telegram Bot API server so files up to 2 GB are just a path on disk instead of a capped download.

    18 Sept 2026 · 6 min

  5. Jellyfin from scratch, part 2: a real domain and HTTPS instead of an IP address

    Part two of the Jellyfin series. Pointing a domain at your Lightsail static IP, putting Caddy in front of Jellyfin for automatic HTTPS, and closing the port you no longer need open to the world.

    16 Sept 2026 · 4 min

  6. Jellyfin from scratch, part 1: a media server on a $10 Lightsail box

    The first of a five-part guide to running your own Jellyfin server and wiring a Telegram bot into it. This part covers what Jellyfin is, setting up an Ubuntu instance on Amazon Lightsail, installing Jellyfin, opening the right ports, and getting through the first-run wizard.

    14 Sept 2026 · 7 min

  7. Artificial cleverness: what Penrose and Tao are actually arguing about

    After a year of building software with these models I could not shake the feeling that everything was a rearrangement of something. So can pattern matching find anything genuinely new, and is that what we do anyway? Working through Cantor, the halting problem and Gödel to find out.

    16 Aug 2026 · 16 min

  8. Ollama from scratch, part 5: putting your own data into the model

    The final part of the beginner's guide. 'Train Ollama on my own data' almost always means one of three cheaper things. This part walks through all three, in order: a one-line system prompt in a Modelfile, retrieval so the model answers from your documents, and actual fine-tuning with the tools that do it and the path back into Ollama.

    07 Jul 2026 · 5 min

  9. Ollama from scratch, part 4: using Ollama as a server

    Part four of the beginner's guide. Ollama has been a web server the whole time. This part covers calling its HTTP API from curl, Python and other tools, keeping a model loaded so the first request is not slow, running several models at once, exposing it on your network safely, and setting the environment variables that control all of it on macOS, Windows and Linux.

    19 Jun 2026 · 5 min

  10. Ollama from scratch, part 3: adding models that are not in the library

    Part three of the beginner's guide. The Ollama library is a curated slice of what exists. This part covers pulling models straight from Hugging Face, importing a GGUF file with a Modelfile, what makes a model compatible with Ollama in the first place, and how to read the error when one will not load.

    04 Jun 2026 · 5 min

  11. Ollama from scratch, part 2: model names, pulling, and what will actually run

    Part two of the beginner's guide. How to read a model name like llama3.1:8b-instruct-q4_K_M, what a pull actually downloads, why an 8-billion-parameter model is a 4.7 GB file and not a 16 GB one, and how to check whether a model will run on your machine before you download it.

    21 May 2026 · 6 min

  12. Ollama from scratch, part 1: installing it and running your first model

    The first of a five-part beginner's guide to running AI models on your own computer with Ollama. This part covers what Ollama actually is, how to install it on macOS, Windows and Linux, running your first model, and where everything lives on disk.

    06 May 2026 · 7 min

  13. Running models on your own machine with Ollama

    What actually happens when you pull a model, why the file is smaller than the parameter count suggests, how to work out whether your laptop can hold it, and the settings that matter once it runs.

    11 Feb 2026 · 8 min

2025

  1. JSONata: when transformation logic should be data, not code

    A query and transformation language for JSON that lets you store integration logic in a database row instead of a deployment, and reshape data from many systems into one output.

    09 Dec 2025 · 8 min

  2. rrweb: a session is a string, not a video

    The DOM is a tree of nodes, so a whole browsing session serializes to plain text. rrweb does that well enough to build on: I used it to stream physics simulations to classrooms, it is what PostHog session replay runs on, and it turns a bug report into a string you can re-render pixel for pixel anywhere.

    07 Oct 2025 · 7 min

  3. Googling was the skill. Now it's prompting.

    For years the best programmers were the best searchers. That skill has moved, and most of what made someone good at it still applies.

    19 Aug 2025 · 5 min

  4. Elasticsearch, OpenSearch, Typesense: what I learned running search at scale

    How an inverted index actually works, why relevance is a tuning problem and not a feature, and an honest comparison of the three engines most teams end up choosing between.

    04 Mar 2025 · 8 min

2024

  1. CRDTs, ProseMirror, and why Google Docs doesn't use either

    The math behind conflict-free collaborative editing, how it fits into ProseMirror and Tiptap, and the reason the most famous collaborative editor in the world took a completely different route.

    12 Nov 2024 · 8 min

2022

  1. npm, yarn, pnpm: I moved for speed, stayed for the hard link

    I switched package managers twice, the second time because node_modules was eating my laptop. The thing that actually saves the disk is not the part I gave credit to. This is what a full node_modules folder taught me about symlinks, hard links, and the folder I had never looked inside.

    13 Feb 2022 · 5 min

2020

  1. Building a consent system for airports on Hyperledger Fabric

    My first blockchain project. Why a permissioned chain instead of Ethereum, what chaincode actually is, why the personal data never touched the ledger, and the design decisions I would defend today.

    22 Sept 2020 · 15 min

  2. I rewrote SSL in my first year of college. Here is what it taught me.

    Hedge won a Facebook productization grant in 2017. It captured browsing activity in internet cafes, scored it with NLP, and moved it over a handshake I built myself. Most of what I learned came from the parts I got wrong.

    14 Jun 2020 · 9 min