{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Ashwin Gopalsamy Library",
  "home_page_url": "https://ashwingopalsamy.in/library",
  "feed_url": "https://ashwingopalsamy.in/library/feed.json",
  "description": "Books, watching, notes, and links",
  "items": [
    {
      "id": "https://ashwingopalsamy.in/library/notes/designing-rate-limiters-for-payment-systems",
      "url": "https://ashwingopalsamy.in/library/notes/designing-rate-limiters-for-payment-systems",
      "title": "Designing Rate Limiters for Payment Systems",
      "content_text": "Rate limiting in payment systems is different from rate limiting in a typical web API. A false positive -- rejecting a legitimate authorization -- is a failed transaction. A customer's card gets…",
      "date_published": "2026-04-07T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/understanding-iso8583-bitmaps",
      "url": "https://ashwingopalsamy.in/library/notes/understanding-iso8583-bitmaps",
      "title": "Understanding ISO 8583 Bitmap Parsing",
      "content_text": "Every ISO 8583 message begins with a Message Type Indicator (MTI), followed by one or two bitmaps that declare which data elements are present in the message. What is a Bitmap? A bitmap is a binary…",
      "date_published": "2026-04-01T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-error-wrapping",
      "url": "https://ashwingopalsamy.in/library/notes/go-error-wrapping",
      "title": "Go Error Wrapping Patterns",
      "content_text": "The pattern is the standard way to add context to errors in Go. But there are nuances worth knowing. Always wrap with context that answers \"what were you trying to do?\" not \"what went wrong?\" The…",
      "date_published": "2026-03-28T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/litellm-supply-chain-attack",
      "url": "https://ashwingopalsamy.in/library/notes/litellm-supply-chain-attack",
      "title": "Anatomy of a Supply Chain Attack: LiteLLM on PyPI",
      "content_text": "On March 24, 2026, Callum McMahon at FutureSearch was testing a Cursor MCP plugin that pulled in litellm as a transitive dependency. Shortly after, his machine became unresponsive. He traced it to a…",
      "date_published": "2026-03-25T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/consistent-hashing-distributed-caches",
      "url": "https://ashwingopalsamy.in/library/notes/consistent-hashing-distributed-caches",
      "title": "Consistent Hashing in Distributed Caches",
      "content_text": "When you distribute data across multiple cache nodes, the naive approach is modular hashing: . This works until you add or remove a node. The Problem with Modular Hashing If you have 4 nodes and add…",
      "date_published": "2026-03-15T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/slog-structured-logging",
      "url": "https://ashwingopalsamy.in/library/notes/slog-structured-logging",
      "title": "Why slog Over zerolog",
      "content_text": "Go 1.21 introduced in the standard library. For new projects, I now default to slog over zerolog. The API is cleaner, it is part of the standard library (no dependency), and the handler interface…",
      "date_published": "2026-03-10T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/uuids-for-idempotency",
      "url": "https://ashwingopalsamy.in/library/notes/uuids-for-idempotency",
      "title": "Why UUIDs Matter for Idempotency",
      "content_text": "In payment processing, processing the same authorization twice is worse than rejecting it. A customer charged twice loses trust immediately. Idempotency keys prevent this. The Problem A client sends…",
      "date_published": "2026-02-20T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Cloud Native Go",
      "content_text": "",
      "date_published": "2026-01-05T00:00:00.000Z",
      "tags": [
        "books"
      ]
    },
    {
      "id": "https://www.alexedwards.net/blog",
      "url": "https://www.alexedwards.net/blog",
      "title": "Alex Edwards - Let's Go",
      "content_text": "alexedwards.net",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://www.alexedwards.net/blog"
    },
    {
      "id": "https://antonz.org/all/",
      "url": "https://antonz.org/all/",
      "title": "Anton Zaides - All Articles",
      "content_text": "antonz.org",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://antonz.org/all/"
    },
    {
      "id": "https://mitchellh.com/writing/building-large-technical-projects",
      "url": "https://mitchellh.com/writing/building-large-technical-projects",
      "title": "Building Large Technical Projects",
      "content_text": "mitchellh.com",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://mitchellh.com/writing/building-large-technical-projects"
    },
    {
      "id": "https://blog.cloudflare.com/",
      "url": "https://blog.cloudflare.com/",
      "title": "Cloudflare Blog",
      "content_text": "blog.cloudflare.com",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://blog.cloudflare.com/"
    },
    {
      "id": "https://dave.cheney.net/",
      "url": "https://dave.cheney.net/",
      "title": "Dave Cheney's Blog",
      "content_text": "dave.cheney.net",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://dave.cheney.net/"
    },
    {
      "id": "https://go.dev/doc/effective_go",
      "url": "https://go.dev/doc/effective_go",
      "title": "Effective Go",
      "content_text": "go.dev",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://go.dev/doc/effective_go"
    },
    {
      "id": "https://benhoyt.com/writings/go-1brc/",
      "url": "https://benhoyt.com/writings/go-1brc/",
      "title": "How I Solved the 1BRC in Go",
      "content_text": "benhoyt.com",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://benhoyt.com/writings/go-1brc/"
    },
    {
      "id": "https://divan.dev/posts/go_concurrency_visualize/",
      "url": "https://divan.dev/posts/go_concurrency_visualize/",
      "title": "Visualizing Go Concurrency",
      "content_text": "divan.dev",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://divan.dev/posts/go_concurrency_visualize/"
    },
    {
      "id": "https://peter.bourgon.org/go-for-industrial-programming/",
      "url": "https://peter.bourgon.org/go-for-industrial-programming/",
      "title": "Go for Industrial Programming",
      "content_text": "peter.bourgon.org",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://peter.bourgon.org/go-for-industrial-programming/"
    },
    {
      "id": "https://grafana.com/blog/how-i-write-http-services-in-go-after-13-years/",
      "url": "https://grafana.com/blog/how-i-write-http-services-in-go-after-13-years/",
      "title": "How I Write HTTP Services in Go After 13 Years",
      "content_text": "grafana.com",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://grafana.com/blog/how-i-write-http-services-in-go-after-13-years/"
    },
    {
      "id": "https://blog.pragmaticengineer.com/",
      "url": "https://blog.pragmaticengineer.com/",
      "title": "The Pragmatic Engineer",
      "content_text": "blog.pragmaticengineer.com",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://blog.pragmaticengineer.com/"
    },
    {
      "id": "https://www.uber.com/in/en/blog/engineering/",
      "url": "https://www.uber.com/in/en/blog/engineering/",
      "title": "Uber Engineering Blog",
      "content_text": "uber.com",
      "date_published": "2026-01-01T00:00:00.000Z",
      "tags": [
        "articles"
      ],
      "external_url": "https://www.uber.com/in/en/blog/engineering/"
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-maps-iteration-order",
      "url": "https://ashwingopalsamy.in/library/notes/go-maps-iteration-order",
      "title": "Go Maps Iteration Order",
      "content_text": "I was working on a minimal word counter. Read from stdin, normalize the input, increment the value for the keys in a . The output looked sorted. Alphabetically sorted. I ran it again. Same order.…",
      "date_published": "2025-12-25T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Database Internals",
      "content_text": "",
      "date_published": "2025-11-20T00:00:00.000Z",
      "tags": [
        "books"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-floating-point-tolerance-testing",
      "url": "https://ashwingopalsamy.in/library/notes/go-floating-point-tolerance-testing",
      "title": "Floating-Point Tolerance Testing in Go",
      "content_text": "Last Tuesday, I was knee-deep in a financial calculation service when my tests started failing. You know that sinking feeling when doesn't equal ? That was my afternoon. This got me thinking about…",
      "date_published": "2025-08-17T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Designing Data-Intensive Applications",
      "content_text": "",
      "date_published": "2025-08-15T00:00:00.000Z",
      "tags": [
        "books"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/runes-bytes-and-graphemes-in-go",
      "url": "https://ashwingopalsamy.in/library/notes/runes-bytes-and-graphemes-in-go",
      "title": "Runes, Bytes, and Graphemes in Go",
      "content_text": "I once ran into this problem while handling names in Tamil and emoji in a Go web app: a string that looked short wasn't, and reversing it produced gibberish. 1. Bytes Go represents strings as…",
      "date_published": "2025-08-09T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-was-never-bad",
      "url": "https://ashwingopalsamy.in/library/notes/go-was-never-bad",
      "title": "Go Was Never Bad",
      "content_text": "Every time I see that GitHub repo go-is-not-good making the rounds again, I laugh. It's always shared by people who mistake language cleverness for engineering. Let me say this clearly: Go is not for…",
      "date_published": "2025-06-21T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Rookie",
      "content_text": "",
      "date_published": "2025-06-15T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-goroutine-stack-growth",
      "url": "https://ashwingopalsamy.in/library/notes/go-goroutine-stack-growth",
      "title": "How Goroutine Stacks Grow and Shrink",
      "content_text": "If you ask any mid-senior Go dev what makes goroutines lightweight you'll get the reply: They start with 2 KB of stack instead of 1 MB like OS threads. They're not wrong. But they're not thinking…",
      "date_published": "2025-06-08T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-scheduler-infinite-loops",
      "url": "https://ashwingopalsamy.in/library/notes/go-scheduler-infinite-loops",
      "title": "Go Scheduler, Yield Points, and Infinite Loops",
      "content_text": "I've been reviewing performance-critical code, and I keep coming back to this pattern: versus The runtime implications are fascinating. The GMP Model Go's scheduler uses a GMP model: Goroutines (G)…",
      "date_published": "2025-05-24T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Software Architecture: The Hard Parts",
      "content_text": "",
      "date_published": "2025-05-18T00:00:00.000Z",
      "tags": [
        "books"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/review-your-own-pr-first",
      "url": "https://ashwingopalsamy.in/library/notes/review-your-own-pr-first",
      "title": "Review Your Own PR First",
      "content_text": "Like most developers, I've been on both sides of Pull Requests. What I've noticed is that the best PRs, the ones that get merged smoothly with minimal back-and-forth, are where the author has already…",
      "date_published": "2025-01-15T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-generics-comparable-constraint",
      "url": "https://ashwingopalsamy.in/library/notes/go-generics-comparable-constraint",
      "title": "The comparable Constraint in Go Generics",
      "content_text": "While working on a generic function in Go, I once encountered this error: 'incomparable types in type set'. It led me to dig deeper into the constraint. With this post, I'll walk you through what is,…",
      "date_published": "2024-12-25T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-program-entry-point",
      "url": "https://ashwingopalsamy.in/library/notes/go-program-entry-point",
      "title": "What Happens Before main() in Go",
      "content_text": "When we first start with Go, the function seems almost too simple. But before even begins, the Go runtime orchestrates careful initialization of all imported packages, runs their functions and…",
      "date_published": "2024-12-13T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "The Art of Doing Science and Engineering",
      "content_text": "",
      "date_published": "2024-12-01T00:00:00.000Z",
      "tags": [
        "books"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-pointers-and-memory-management",
      "url": "https://ashwingopalsamy.in/library/notes/go-pointers-and-memory-management",
      "title": "Go Pointers and Memory Management",
      "content_text": "When I first started learning Go, I was intrigued by its approach to memory management. Go handles memory in a way that's both efficient and safe, but it can be a bit of a black box if you don't peek…",
      "date_published": "2024-11-17T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "The Office",
      "content_text": "",
      "date_published": "2024-11-15T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/git-practices-for-production-codebases",
      "url": "https://ashwingopalsamy.in/library/notes/git-practices-for-production-codebases",
      "title": "Git Practices for Production Codebases",
      "content_text": "Git is the backbone of every software project. Working in FinTech systems, I've learned that Git isn't just a tool -- it's a shared language and a safety net. In FinTech and regulated environments,…",
      "date_published": "2024-11-14T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-constants-beyond-basics",
      "url": "https://ashwingopalsamy.in/library/notes/go-constants-beyond-basics",
      "title": "Go Constants Beyond the Basics",
      "content_text": "When I first got into Go, I thought constants were simple and limited -- just fixed values, nothing fancy. But as I delved deeper, I found they're quite versatile. Yes, they're fixed values, but Go…",
      "date_published": "2024-11-13T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library/notes/go-utf8-identifier-limitation",
      "url": "https://ashwingopalsamy.in/library/notes/go-utf8-identifier-limitation",
      "title": "Go's UTF-8 Identifier Limitation",
      "content_text": "I've been exploring Go's UTF-8 support and was curious about how well it handles non-Latin scripts in code. Go source files are UTF-8 encoded by default. You can use Unicode characters in variable…",
      "date_published": "2024-11-12T00:00:00.000Z",
      "tags": [
        "notes"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Avatar: The Last Airbender",
      "content_text": "",
      "date_published": "2024-07-20T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Learning Go",
      "content_text": "",
      "date_published": "2024-06-10T00:00:00.000Z",
      "tags": [
        "books"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Chotta Bheem",
      "content_text": "",
      "date_published": "2024-05-01T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Suits",
      "content_text": "",
      "date_published": "2024-03-10T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "The Social Network",
      "content_text": "",
      "date_published": "2024-01-20T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "BoJack Horseman",
      "content_text": "",
      "date_published": "2023-10-14T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Breaking Bad",
      "content_text": "",
      "date_published": "2023-08-14T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Never Have I Ever",
      "content_text": "",
      "date_published": "2023-06-08T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Ben 10",
      "content_text": "",
      "date_published": "2023-02-12T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Vikings",
      "content_text": "",
      "date_published": "2022-09-30T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Money Heist",
      "content_text": "",
      "date_published": "2021-12-03T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Mr. Robot",
      "content_text": "",
      "date_published": "2020-08-22T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "13 Reasons Why",
      "content_text": "",
      "date_published": "2020-06-05T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Silicon Valley",
      "content_text": "",
      "date_published": "2020-05-01T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Chernobyl",
      "content_text": "",
      "date_published": "2019-06-03T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    },
    {
      "id": "https://ashwingopalsamy.in/library",
      "url": "https://ashwingopalsamy.in/library",
      "title": "Game of Thrones",
      "content_text": "",
      "date_published": "2019-05-20T00:00:00.000Z",
      "tags": [
        "watch"
      ]
    }
  ]
}