{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Hamza Arya — Notes",
  "home_page_url": "https://hamzaarya.com/",
  "feed_url": "https://hamzaarya.com/feed.json",
  "description": "Short technical writing by Hamza Arya.",
  "authors": [
    {
      "name": "Hamza Arya",
      "url": "https://hamzaarya.com/"
    }
  ],
  "items": [
    {
      "id": "https://hamzaarya.com/notes/tokens-not-restyles",
      "url": "https://hamzaarya.com/notes/tokens-not-restyles",
      "title": "Tokens, not restyles",
      "summary": "One spread of this site is bone-white on black. No component knows it is being inverted, and that is the whole trick.",
      "image": "https://hamzaarya.com/og/notes/tokens-not-restyles.png",
      "date_published": "2026-08-09T00:00:00Z",
      "tags": [
        "Design systems",
        "CSS"
      ]
    },
    {
      "id": "https://hamzaarya.com/notes/cursor-never-enters-react-state",
      "url": "https://hamzaarya.com/notes/cursor-never-enters-react-state",
      "title": "The cursor never enters React state",
      "summary": "A custom cursor updates at pointer rate. Routing that through useState re-renders the tree sixty times a second to move one div.",
      "image": "https://hamzaarya.com/og/notes/cursor-never-enters-react-state.png",
      "date_published": "2026-07-28T00:00:00Z",
      "tags": [
        "Performance",
        "Interface"
      ]
    },
    {
      "id": "https://hamzaarya.com/notes/one-scroll-loop",
      "url": "https://hamzaarya.com/notes/one-scroll-loop",
      "title": "One scroll loop",
      "summary": "Lenis and ScrollTrigger each want to own the frame. Letting both have it is how you get a page that reads its own position one frame late.",
      "image": "https://hamzaarya.com/og/notes/one-scroll-loop.png",
      "date_published": "2026-07-14T00:00:00Z",
      "tags": [
        "Motion",
        "Architecture"
      ]
    }
  ]
}
