Getting a Gemini API key is an exercise in frustration

Last week, I started working on a new side-project. It’s a standard React app partly made up of run-of-the-mill CRUD views—a perfect fit for LLM-assisted programming. I reasoned that if I could get an LLM to quickly write the boring code for me, I’d have more time to focus on the interesting problems I wanted to solve.

I’ve pretty much settled on Claude Code as my coding assistant of choice, but I’d been hearing great things about Google’s Gemini 3 Pro. Despite my aversion to Google products, I decided to try it out on my new codebase.

I already had Gemini CLI installed, but that only gave me access to Gemini 2.5 with rate limits. I wanted to try out Gemini 3 Pro, and I wanted to avoid being rate limited. I had some spare cash to burn on this experiment, so I went looking for ways to pay for a Gemini Pro plan, if such a thing existed.

Thus began my grand adventure in trying to give Google my money.

What is a Gemini, really?

The name “Gemini” is so overloaded that it barely means anything. Based on the context, Gemini could refer to:

  • The chatbot available at gemini.google.com.
  • The mobile app that lets you use the same Gemini chatbot on your iPhone or Android.
  • The voice assistant on Android phones.
  • The AI features built into Google Workspace, Firebase, Colab, BigQuery, and other Google products.
  • Gemini CLI, an agentic coding tool for your terminal that works the same way as Claude Code or OpenAI Codex.
  • The Gemini Code Assist suite of products, which includes extensions for various IDEs, a GitHub app, and Gemini CLI.
  • The underlying LLM powering all these products.
  • Probably three more products by the time I finish writing this blog post.

To make things even more confusing, Google has at least three different products just for agentic coding: Gemini Code Assist (Gemini CLI is a part of this suite of products), Jules, and Antigravity.

And then there’s a bunch of other GenAI stuff that is powered by Gemini but doesn’t have the word Gemini in the name: Vertex AI Platform, Google AI Studio, NotebookLM, and who knows what else.

I just wanted to plug my credit card information into a form and get access to a coding assistant. Instead, I was dunked into an alphabet soup of products that all seemed to do similar things and, crucially, didn’t have any giant “Buy Now!” buttons for me to click.

In contrast, both Anthropic and OpenAI have two primary ways you can access their products: via their consumer offerings at claude.ai and chatgpt.com respectively, or via API credits that you can buy through their respective developer consoles. In each case, there is a form field where you can plug in your credit card details, and a big, friendly “Buy Now!” button to click.

After half an hour of searching the web, I did the obvious thing and asked the free version of Gemini (the chatbot, not one of those other Geminis) what to do:

How do I pay for the pro version of Gemini so i can use it in the terminal for writing code? I specifically want to use the Gemini 3 Pro model.

It thought for a suspiciously long time and told me that Gemini 3 Pro required a developer API key to use. Since the new model is still in preview, it’s not yet available on any of the consumer plans. When I asked follow up questions about pricing, it told me that “Something went wrong”. Which translates to: we broke something, but we won’t tell you how to fix it.

So I asked Claude for help. Between the two LLMs, I was able to figure out how to create an API key for the Gemini I wanted.

Creating an API key is easy

Google AI Studio is supposed to be the all-in-one dashboard for Google’s generative AI models. This is where you can experiment with model parameters, manage API keys, view logs, and manage billing for your projects.

I logged into Google AI Studio and created a new API key. This part was pretty straightforward: I followed the on-screen instructions and had a fresh new key housed under a project in a few seconds. I then verified that my key was working with Gemini CLI.

It worked! Now all that was left to do was to purchase some API credits. Back in Google AI Studio, I saw a link titled “Set up billing” next to my key. It looked promising, so I clicked it.

That’s where the fun really began.

Google doesn’t want my money

The “Set up billing” link kicked me out of Google AI Studio and into Google Cloud Console, and my heart sank. Every time I’ve logged into Google Cloud Console or AWS, I’ve wasted hours upon hours reading outdated documentation, gazing in despair at graphs that make no sense, going around in circles from dashboard to dashboard, and feeling a strong desire to attain freedom from this mortal coil.

Turns out I can’t just put $100 into my Gemini account. Instead, I must first create a Billing Account. After I’ve done that, I must associate it with a project. Then I’m allowed to add a payment method to the Billing Account. And then, if I’m lucky, my API key will turn into a paid API key with Gemini Pro privileges.

So I did the thing. The whole song and dance. Including the mandatory two-factor OTP verification that every Indian credit card requires. At the end of the process, I was greeted with a popup telling me I had to verify my payment method before I’d be allowed to use it.

Wait. Didn’t I just verify my payment method? When I entered the OTP from my bank?

Nope, turns out Google hungers for more data. Who’d have thunk it?

To verify my payment method for reals, I had to send Google a picture of my government-issued ID and the credit card I’d just associated with my Billing Account. I had to ensure all the numbers on my credit card were redacted by manually placing black bars on top of them in an image editor, leaving only my name and the last four digits of the credit card number visible.

This felt unnecessarily intrusive. But by this point, I was too deep in the process to quit. I was invested. I needed my Gemini 3 Pro, and I was willing to pay any price.

The upload form for the government ID rejected my upload twice before it finally accepted it. It was the same exact ID every single time, just in different file formats. It wanted a PNG file. Not a JPG file, nor a PDF file, but a PNG file. Did the upload form mention that in the instructions? Of course not.

After jumping through all these hoops, I received an email from Google telling me that my verification will be completed in a few days.

A few days? Nothing to do but wait, I suppose.

403 Forbidden

At this point, I closed all my open Cloud Console tabs and went back to work. But when I was fifteen minutes into writing some code by hand like a Neanderthal, I received a second email from Google telling me that my verification was complete.

So for the tenth time that day, I navigated to AI Studio. For the tenth time I clicked “Set up billing” on the page listing my API keys. For the tenth time I was told that my project wasn’t associated with a billing account. For the tenth time I associated the project with my new billing account. And finally, after doing all of this, the “Quota tier” column on the page listing my API keys said “Tier 1” instead of “Set up billing”.

Wait, Tier 1? Did that mean there were other tiers? What were tiers, anyway? Was I already on the best tier? Or maybe I was on the worst one? Not important. The important part was that I had my API key and I’d managed to convince Google to charge me for it.

I went back to the Gemini CLI, ran the /settings command, and turned on the “Enable experimental features” option. I ran the /models command, which told me that Gemini 3 Pro was now available.

Success? Not yet.

When I tried sending a message to the LLM, it failed with this 403 error:

{
  "error": {
    "message": "{\n  \"error\": {\n    \"code\": 403,\n    \"message\": \"The caller does not have permission\",\n    \"status\":\"PERMISSION_DENIED\"\n  }\n}\n",
    "code": 403,
    "status": "Forbidden"
  }
}

Is that JSON inside a string inside JSON? Yes. Yes it is.

To figure out if my key was even working, I tried calling the Gemini API from JavaScript, reproducing the basic example from Google’s own documentation.

No dice. I ran into the exact same error.

I then tried talking to Gemini 3 Pro using the Playground inside Google AI Studio. It showed me a toast message saying Failed to generate content. Please try again. The chat transcript said An internal error has occurred.

At this point I gave up and walked away from my computer. It was already 8pm. I’d been trying to get things to work since 5pm. I needed to eat dinner, play Clair Obscur, and go to bed. I had no more time to waste and no more fucks to give.

Your account is in good standing at this time

Just as I was getting into bed, I received an email from Google with this subject line:

Your Google Cloud and APIs billing account XXXXXX-XXXXXX-XXXXXX is in good standing at this time.

With the message inside saying:

Based on the information you provided and further analysis by Google, we have reinstated your billing account XXXXXX-XXXXXX-XXXXXX. Your account is in good standing, and you should now have full access to your account and related Project(s) and Service(s).

I have no idea what any of this means, but Gemini 3 Pro started working correctly after I received this email. It worked in the Playground, directly by calling the API from JavaScript, and with Gemini CLI.

Problem solved, I guess. Until Google mysteriously decides that my account is no longer in good standing.

This was a waste of time

This was such a frustrating experience that I still haven’t tried using Gemini with my new codebase, nearly a week after I made all those sacrifices to the Gods of Billing Account.

I understand why the process for getting a Gemini API key is so convoluted. It’s designed for large organizations, not an individual developers trying to get work done; it serves the bureaucracy, not the people doing the work; it’s designed for maximum compliance with government regulations, not for efficiency or productivity.

Google doesn’t want my money unless I’m an organization that employs ten thousand people.

In contrast to Google, Anthropic and OpenAI are much smaller and much more nimble. They’re able to make the process of setting up a developer account quick and easy for those of us who just want to get things done. Unlike Google, they haven’t yet become complacent. They need to compete for developer mindshare if they are to survive a decade into the future. Maybe they’ll add the same level of bureaucracy to their processes as they become larger, but for now they’re fairly easy to deal with.

I’m still going to try using Gemini 3 Pro with Gemini CLI as my coding assistant, but I’ll probably cap the experiment to a month. Unless Gemini 3 Pro is a massive improvement over its competitors, I’ll stick to using tools built by organizations that want me as a customer.

My first online shopping experience, at the tender age of twelve

I wrote the first draft of this post as an exercise during a meeting of IndieWebClub Bangalore.

When I was eleven or twelve, a friend at school told me that video games like Age of Empires were built using a language called C. When pressed for details, he had nothing more to tell me. What did he mean by language? Was it like English? How could you use a language to make things move around on the computer screen? He didn’t know. His older brother had informed him about the existence of C and its relationship with video games, but he had inquired no further.

I was desperate to learn C, whatever it was.

Only, I had no idea who to ask or how to go about learning this “language”. I could’ve searched the web, but this was 2002. If I was lucky, I was allowed to use the dial-up for an hour every week. Search engines were bad and my search skills were rudimentary. The web was not yet filled with thousands upon thousands of freely available programming tutorials. And in any case, it was far more important to download the latest Linkin’ Park MP3.

Luckily, Dad knew somebody who worked at the National Institute for Science Communication and Policy Research. They had just published a series of computer education books targeted towards an increasing population of new computer users. My dad had mentioned to him that I was interested in computers, so one day he handed him a giant brown envelope containing two books: a book about the basics of Microsoft PowerPoint, and a slim volume called The C Adventure.

The C Adventure only covered the very basics of C: variables, conditionals, loops, and functions. It didn’t cover structs, pointers, macros, splitting programs into multiple files, build systems, or anything else that would allow me to build the kind of real-world programs I wanted to build. But that didn’t matter. The universe had heard my plea. I finally knew what C was. I could even write a bit of it! They were simple programs that ran in the terminal, but at the time I felt drunk with power. I was one step closer to building Age of Empires.

I could do anything with a computer, anything at all. The only limit was myself.

But The C Adventure wasn’t enough. If I wanted to build games, there was a lot more I’d need to learn: reading and writing files, connecting to the internet, opening windows, rendering 3D graphics, playing sound, writing game AI, and who knew what else. But once again, I didn’t know where to find more learning resources.

The government had come to my aid once, but I couldn’t rely on obscure government departments to come to my aid every time. I had to take matters into my own hands. And I did just that, this time finding my salvation in the free market.

I had no idea where to buy programming books in Delhi, but I reasoned that it might be possible to buy them on the internet. I’d visited American e-commerce websites. Might there be Indian equivalents? I’d seen TV and newspaper ads for a website called Baazee.com. The ads said something about buying and selling. Perhaps this was where I’d find my next C book?

One evening, during my one weekly hour of parentally approved and monitored internet session, I typed Baazee.com into the Internet Explorer 6 URL bar and began my search.

A few minutes of searching led me to a product called “101 Programming eBooks”. It was allegedly a CD containing, well, 101 programming ebooks. The seller had good reviews, and the product description looked compelling so, with an excess of hope, I clicked the buy button.

At the end of the checkout process, the website asked for my credit card details, and that’s where I realized my whole endeavor had been doomed from the very start.

The problem was that my parents didn’t have a credit card at the time, and no amount of convincing on my part would induce them to get one. They’d heard too many horror stories of people getting deep into credit card debt and losing their homes. The newspapers were filled with stories of scams and frauds on the nascent internet, most of which involved stealing people’s credit card details and using them to run up huge bills.

But teenage Ankur needed to learn C. It was a life and death situation, couldn’t they see? I would not allow my parents’ stubborn disapproval of predatory American financial instruments to stand between myself and Age of Empires. So I did what anyone in my place would have done: I begged my Dad to get a credit card, just this once, just for this one purchase. I threw a tantrum. I cried until I ran out of tears.

But nope, it was all in vain. Computers and money were not allowed to mix, not in our household. No credit cards, full stop.

Dejected, I went back to the computer to close all my Internet Explorer 6 windows, when the universe once again chose to smile upon me. The person selling “101 Programming Ebooks” had left their email address on the product description page! Dad urged me to write to them and figure out if we could pay for the CD with cash or cheque.

So I sent an email, and the seller responded with his phone number. He lived in Delhi, not very far from where my family lived. He said we could pick up the CD from his address and pay him in cash. Oh sweet joy! Oh divine providence!

I wanted to go meet the seller myself, and do so immediately. But Dad was more cautious. He first talked to the seller on the phone to make sure he was a real person. He asked him a bunch of questions. When he was satisfied that nothing shady was going on, he went to pick up the CD himself. He might have taken a friend or co-worker with him. He’d read enough scary stories about the internet in the newspapers, and he did not want to appear on page seven or whatever of Times of India.

The seller was just a college kid, still in his early twenties. He was pirating ebooks, burning them to CDs, and selling them online out of his bedroom for some extra cash. My dad was impressed by the entrepreneurial spirit on display, but neither him nor I understood that selling pirated ebooks was illegal. It didn’t matter, though. Everything that had to do with computers and the internet in India was illegal in the 2000s, so nobody cared.

One joyous evening Dad returned home with the CD. It came in an unmarked white paper envelope, with the words “101 Programming Ebooks” scrawled on the disc in permanent marker.

I inserted the disc into the family computer and found it contained exactly what had been advertised: a collection of technical ebooks sorted into directories, mostly published by O’Reilly, in PDF and CHM formats. In fact, there were a lot more than just 101 ebooks in there! My first online purchase had turned out to be incredibly satisfying. The Baazee.com pirate had underpromised and overdelivered.

I spent a lot of time reading the books on that CD. I don’t remember if I ever read any single one of them cover to cover, but I remember dipping in and out of tens of them, picking up something at random whenever the fancy struck me. I remember learning a bit of Perl and writing some simple programs. I remember trying to learn Java but being turned off by public static void main. I remember spending hours reading a book about XML but having no clue why I would want to use it. Could I use it to build Age of Empires? No? Then I didn’t care.

I never ended up building my own version of Age of Empires, but I did go on to use some of the books in the collection to learn and use C (and some C++) profitably for many small projects. Later, when I was in college I even learned some Objective-C, and made a bit of money building an iPad game for a small marketing agency. So technically I’ve been paid to build a video game, and technically some part of it was built with C. Success? Let’s call it a success.

While no single book on the “101 Programming Ebooks” CD changed my life, the collection gave me a vast buffet of tools and technologies to sample from. It expanded my mind and allowed me to see the full spectrum of possibilities in a computer career. Looking back at that event 23 years later, the only book I can remember clearly is the Camel Book, but I’m sure there were many more in that collection that I used to occupy slow evenings.

I sometimes wonder where that college kid is now, the one who was selling pirated ebooks out of his bedroom. Did he go on to start his own tech company? Did he move to America, as so many people in tech do? Or does he still live somewhere in Delhi, ripping Hindi TV shows off Amazon Prime and helping people jailbreak their Nintendo Switches?

Wherever he is, I hope he’s done well for himself. I am forever grateful for “101 Programming Ebooks” and the wild-west internet of the 2000s.

Using LLMs for web search

I have two main use-cases for LLMs: writing code and searching the web. There’s a lot of discussion online about LLM-assisted programming but very little about LLM-assisted search, so here are some unstructured thoughts about just that.


OpenAI calls their web search feature ChatGPT Deep Research, Google has Gemini Deep Research, and Anthropic just uses the word Research. Regardless of the label, all these products work the same way:

  • You enter a prompt, just like in any other LLM workflow.
  • The LLM may ask you a clarifying question (for some reason it’s always a single clarifying question, never more than that).
  • The LLM searches the web for pages matching your prompt using a traditional search engine.
  • It uses the web pages it found to generate a long report, citing its sources wherever it makes a claim within the text of the report.

I like this feature a lot, and I lean on it heavily when I’m looking for high-quality long-form writing by actual human beings on a topic that’s new to me. I use Kagi for most of my search queries, but it helps to turn to an LLM when I’m completely unfamiliar with a topic, when I’m not even sure what keywords to search for.

Or, sometimes, when I just don’t feel like sifting through thousands of words of SEO content to find a few good results.


I rarely ask LLMs factual questions because I don’t trust the answers they return. Unless I have a way to verify their output, I consider anything an LLM says to be a hallucination. This is doubly true when I’m learning something new. If I’m new to Rust, how can I be sure that the Rust best practices Claude is telling me about are truly the best of all Rust practices?

I find it much easier to trust LLM-generated output when it cites web pages I can read myself. This lets me verify that the information comes from an entity I can trust, an entity that’s (hopefully) a real person or institution with real expertise. Grounding the LLM in web search also means I’m likely to find more up to date information that’s not in its training data yet (though, in my experience, this is not always guaranteed).


Whenever I get curious about something these days, I write down a detailed question, submit it to Claude, and go off to get some work done while it churns away browsing hundreds of web pages looking for answers. Sometimes I end up with multiple browser tabs with a different search query running in each of them.

For most questions, Claude is able to write me a detailed report with citations in five to ten minutes, and it looks at about a hundred pages in the process. Sometimes it decides to spend a lot more time browsing, reading multiple hundreds of web pages. For one question, it churned away for almost seventeen minutes and looked at five hundred and fifty sources to generate its report.

I don’t actually care for the report Claude produces at the end of its research process. I almost never read it. It’s a a whole lot of LLM slop: unreadable prose, needlessly verbose, often misrepresenting the very sources it quotes. I only care about the links it finds, which are usually entirely different from what I get out of Kagi.

My workflow is to skim the report to get an idea of its general structure, open all the links in new tabs, and close the report itself. I wish there was a mode where the “report” could just be a list of useful links, though I suppose I could accomplish that with some clever prompting.


The web pages Claude surfaces always surprise me. I can’t tell what search index it uses, what search keywords it uses under the hood, or how it decides what links are worth clicking. Whatever the secret sauce is, I regularly end up on web pages that I’d never be able to find through a regular search engine: personal websites that were last updated 20 years ago, columns from long-defunct magazines, ancient Blogger and LiveJournal blogs, pages hidden deep inside some megcorporation’s labyrinthian support website, lecture notes hosted on university websites, PDFs from exposed wp-content directories, and other unexpected wonders from a web that search engines try their best to hide away.

Sometimes Claude links to pages that aren’t even online anymore! How is it able to cite these pages if it can’t actually read them? Unclear. I often have to pull up a cached version of such pages using the Internet Archive. For example, one of the reports it produced linked to On Outliners and Outline Processing and Getting Started Blogging with Drummer, both of which no longer exist on the web.


I can’t tell whether any major LLM providers take their web search products seriously (outside of Perplexity, which is not technically an LLM provider). I certainly haven’t seen any new changes made to them since they were introduced, and nobody seems to talk about them very much. For me, though, web search is one of the main reasons I use LLMs at all. That’s partly why I’m giving Anthropic that $20 every month.

I have a long wishlist of features I want to see in LLM-powered search products:

  • Stop hiding away web search inside a menu! Let me directly click “New search” in the same way I click “New chat” or “Code” in the Claude sidebar.
  • Let me edit the LLM’s research plan before it starts searching (Gemini lets me do this to some degree).
  • Let me edit the keywords the LLM will use to start its research process. Or, let me ask it to automatically refine those keywords before it begins.
  • What if the LLM finds new information online that re-contextualizes my original query? In those cases, allow it to interrupt its research process and ask for clarifications.
  • Let me look at the raw search results for each keyword the LLM searched for.
  • Add a mode where the LLM picks the best search results for me and only returns a list of links, like a traditional search engine.
  • Let me use “lenses” in the same way I use them on Kagi. Allow me to place limits on my sources (e.g social media, personal blogs, news websites, or academic journals).
  • Let me uprank/downrank/ban certain sources in the same way Kagi allows.

Maybe Kagi Assistant will grow into this in the future? Maybe I should try using Perplexity? I’ve had meh experiences with both these products, and I’m not sure whether they can compete with the quality of results ChatGPT/Claude/Gemini surface.


Anyway, yeah. I like LLM-powered search.

Weeknote 2025-W45: Text message bankruptcy

Work

  • Once again, did zero work on the novel this week.
  • Didn’t work on the comic for Indie Comix Fest either. Blame my broken brain.
  • Ironically, I wrote and published a blog post about my relationship with work. Whatever you’re thinking right now, stop thinking it immediately.
  • Does emotional work count as work? Because I did a lot of that this week. I spent many of my days reading, taking notes, and writing in my journal. I have little to show for it in terms of output, but I feel more at peace today than I did at the end of last week.

Not work

  • I mentioned in my last weeknote that I wanted to carve out more time for myself. I’m happy to report that I managed to do just that on most days this week, spending much of my time on things that make me happy and content. As I write this, I feel a lot more like myself.
  • The orange cat I mentioned last week had to have his tail amputated because of necrosis. It’s a terrible shame, but the doctors said it was the only way he could have a life free of pain and infection. He’s still recovering at the vet’s, but he should be back home this coming week.
  • I’m declaring text message bankruptcy. If you’ve texted me in the past few weeks and haven’t received a response, I apologize profusely. Abandon all hope at this point, because I’m not likely to respond back.
  • I gifted Tanvi a MagiClick AI Button as a late birthday present. The previous version of the MagiClick button was sold as a programmable macropad powered by an ESP32. This new version is sold as a sort of AI assistant, and comes with a pre-installed firmware that allows you to talk to an LLM served by XiaoZhi AI using your voice. The control panel allows you to chose between a couple of popular Chinese open-weights models, tweak a bunch of parameters, and set a custom system prompt. The default prompt tells the LLM to act like an AI girlfriend who is a “biker chick”. All I’m going to say is that some choices were made. Regardless, the button is fun to play with and can presumably be used to control something like Home Assistant.
  • I finally met fellow weeknoter Nats and her partner Rudy on Saturday. We spent an entire evening talking about stationery, Hobonichi Techos, Sakura Microns, gothic literature, Rust, LLM assisted programming, and bare-chested Stalin on a horse.
  • My new therapist had to cancel our appointment on Monday because she broke her ankle. I know I sound selfish as I say this, but I was incredibly upset when I received the cancellation message. I’d been feeling awful the previous week and really needed the support. I couldn’t have been more grateful to her when she rescheduled our appointment for later in the week, despite still being in pain from her injury. She didn’t have to do it, and I hadn’t asked for a fresh appointment. She did it anyway, not just for me but for her other clients as well. I’m filled with gratitude, even as I understand that working while sick is unsustainable in the long run. (Didn’t I already say I feel selfish? That absolves me from all guilt. Them’s the rules.)

Media diet

  • Finished playing A Short Hike
  • Finished watching Superstore
  • Started watching Nobody Wants This
  • Still reading Fingersmith and All About Love. Sigh.

The solace of work

I like my work and I like working. Would I say I love my work? I’m not sure. Maybe? I don’t know what it means to love something that’s not alive. In any case, the distinction is not important.

As far back as I can remember, I’ve enjoyed working and looked forward to my workdays. I count myself lucky in that sense. I’ve somehow stumbled into work that I find meaningful.

To me, writing code or fiction or essays does not feel significantly different from playing a video game or watching a TV show. It’s all play and it’s all work and it’s all really the same to me.

Of course, there are always some parts of any kind of work that are frustrating. I lose motivation when I’m forced to work on something I believe has no value. Work that’s not challenging enough can be fun in small doses, but starts to feel depressing after a while. Work with unreasonable deadlines or constantly changing requirements is usually a recipe for burnout (though even this nightmare scenario can sometimes present a satisfying exercise in creative problem solving under extreme constraints). And self-directed work, such as this blog post, always feels more meaningful compared to work I do for other people in exchange for money.


The idea of separating my work from the rest of my life—the idea of leaving my work at work—makes no sense to me. My work and life have always been deeply intertwined. I’ve met some of my closest friends through work. Work gave me the financial freedom to move out of my parents’ house and start a new life here in Bangalore, where I met many of the people I love most dearly today. Traveling for work allowed me to experience new places, new cultures, new ways of being.

How do I pull out the one strand marked “work” from the rich braid of my life and cast it aside, even temporarily? It’s impossible. Work, life, play, love—they’re all the same thing.


Lately work has been a source of comfort. My life has been tumultuous this year, but the pleasures of work have remained constant. With all the emotional ups and downs, there has always been blog posts to write, software to build, plot outlines to wrangle, and poetry to scribble in the back of notebooks.

It’s a powerful feeling. Come heartbreak or contentment or grief or celebration, I have always been able to come back to the work. The notebook and pen, terminal and editor, have always been ready for me, waiting for me to put my mark on their canvas. They have been my constants, my anchors in a turbulent sea. They have been my lighthouses, always guiding me back to myself.

I like my work. You might go as far as to say that I love my work. But most importantly, I’m grateful that it exists, that it is never-ending, that it waits for me every morning. I’m grateful that I can lose myself in it whenever I want and, eventually, hopefully, if I do it right, find myself.

Weeknote 2025-W44: Oklahoma smash

Work

  • I haven’t worked on the novel in two weeks. The week I was traveling for Diwali was going to be a wash anyway, but my inability to work during this post-Diwali week caught me by surprise. A combination of social commitments, mild sickness, physical exhaustion, and poor mental health kept me away from my desk.
  • Itihas led the session for this week’s IndieWebClub, where they talked about digital gardens and showed off their note-taking and digital gardening setup. As expected, the discussion veered off into note-taking methods, PKM, non-linear thinking and writing, and the joys of hypertext. I realized during the session that I prefer to think in neat, linear narratives and do not wish to start a digital garden (even though I’m fascinated by other people’s gardens).
  • At Writers Club, we used the submission guidelines for the Journal of Imaginary Research to write abstracts for fictional papers. My abstract was a mix of sci-fi with a subtle horror element. After two weeks of zero creative work, writing something and calling it done felt good. I’ve grown to enjoy writing using writing prompts. They challenge myself to think in different ways, and they’re especially fun to do in a group setting. I want to do a lot more of this!
  • I’m helping a friend write a comic for Indie Comix Fest. The submission deadline is next week, so I’m not sure if we’ll make it. But we’re going to try our darndest.

Not work

  • I’ve been struggling with mental health lately, especially when it comes to intimate relationships and close friendships (aren’t they the same?) To help me work through these (long-standing) issues, I’ve started going to a new therapist. The first session on Monday was promising and left me feeling hopeful, and I’m looking forward to the next one.
  • I’ve been finding it difficult to carve out time for myself, which is probably a contributing factor to my poor state of mind. In the coming few weeks I will attempt to find my way back to myself.
  • I’ve also been finding it difficult to set priorities for myself. I’ve been taking time away from my most important tasks and spending them on trivialities instead. The problem is exacerbated by my sleep cycle being completely out of whack. A good recipe for burnout and resentment.
  • The silver lining in all of this was a lovely dinner date with somebody I have come to care about deeply.
  • Guerilla Diner makes the best Oklahoma smash, don’t @ me.
  • For the last three years, an orange cat has made a home in the common areas of my apartment building. Sometime this week, he came back badly injured, with deep wounds across his body. The family on the ground floor—who take care of him and feed him—found him yowling outside their window, demanding to be fed but otherwise unable to move without pain. We tried for a few days to get him into a crate so we could take him to the vet, but he refused to let anybody come near him. Close to midnight on Thursday, my friend Shruti finally lured him into the crate and we drove him to the vet. I’m happy to report that he is pain-free and on his way to recovery!

Everything is index cards

I wrote this post as an exercise during a meeting of IndieWebClub Bangalore.

Much of the knowledge-management software we use today is modeled after stacks of index cards. Here is a growing list of applications that are directly or indirectly digital recreations of processes and techniques commonly used with index cards in the analog world.

I’ll keep appending to this list.

HyperCard

Hypercard

Image credit: https://wiki.xxiivv.com/site/hypertalk.html

More information: https://en.wikipedia.org/wiki/HyperCard

Trello

Trello

Image credit: https://www.atlassian.com/blog/trello/trello-manage-team

More information: https://trello.com

Google Keep

Google Keep

Image credit: https://zapier.com/blog/google-keep-vs-evernote/

More information: https://keep.google.com

Scrivener

Google Keep

Image credit: https://startupstash.com/tools/scrivener/

More information: https://www.literatureandlatte.com

TiddlyWiki

TiddlyWiki

Screenshot from https://zettelkasten.sorenbjornstad.com/

More information: https://tiddlywiki.com

Weeknote 2025-W42: Magical and terrifying

Work

  • Wrote this weeknote on an airplane flying to Delhi. Magical and terrifying.
  • Zero progress on the novel this week. Instead, I spent most of my time rushing to doctors’ appointments, preparing for my Delhi trip, and collapsed facedown on my bed after driving across the city for three hours straight.
  • Next week is likely to be a wash, too.
  • I should probably check my calendar before I set writing goals.
  • I’m hoping to at least get some reading done. Looking forward to finishing Fingersmith and moving on to Close to the Machine: Technophilia and Its Discontents.

Not work

  • I’m mildly allergic to eucalyptus and English plantain. The allergies clog my nose when I’m outdoors, which makes me susceptible to upper respiratory infections. On my allergist’s recommendation, I’ve been taking supplements, regularly washing out my nose with a saline nasal spray, and using a nasal decongestant at night. Thanks to these treatments, I haven’t been sick as sick this year as I usually get. Last month, the allergist recommended that I start immunotherapy, which could fix my upper respiratory issues once and for all. So for the past few days, I’ve been putting a tiny drop of custom-made medication under my tongue right after I wake up. I can’t tell if it’s doing anything, because it feels like nothing.
  • To scratch my programming itch, I’ve started learning Clojure. I’m treating it the same way people treat Wordle or the daily crossword: an entertaining way to give my brain a vigorous workout. I’m not expecting to use it for production projects, at least not in the immediate future.
  • I wasted too many hours reading tech news last week, which is something I only do when I’m trying to hide from negative emotions. It’s not surprising. I’ve had a tumultuous few months. But thankfully I’m doing better this weekend, and I’ve set up an appointment with a therapist for when I get back home to Bangalore.
  • I don’t like being in Delhi. It’ve never felt at home there. But I’m looking forward to seeing my brother and parents after a while, and probably some cousins I haven’t seen in over a decade.

Just read

I wrote this post as an exercise during a meeting of IndieWebClub Bangalore.

I started this year with a goal to read thirty-six books. Towards the end of last year I was easily averaging two to three books a month, so thirty-six seemed like an achievable goal.

I clearly overestimated myself, because I’ve only read ten books so far in 2025. In fact, this might end up being my worst year of reading since I started tracking my books on Goodreads in 2013.

So what happened this year that prevented me from reading more? It wasn’t a lack of time, energy, or interest. I didn’t take up a new hobby, start a challenging job, or get into a new relationship. I didn’t travel more than usual, nor did I fall sick more often than I usually do.

What went wrong was that I kept getting in my own way.

I turned reading into a chore by insisting on taking detailed notes on everything I read. Instead of relaxing on my couch with a good book and a hot beverage, I read at my desk with a pencil in hand, underlining interesting passages and scribbling in the margins. For some books that I considered particularly important, I typed up extensive notes.

This changed my relationship with reading. Instead of something I did for pleasure in my free time, it started feeling like work. Instead of something I could pick up and put down whenever I wanted, books became sacred objects that could only be approached at specific times in specific parts of my house. I started avoiding reading, which bred guilt, which bred resentment.

Today, reading has gone from being a normal part of my daily life to something I do once or twice a week, something I have to put on my todo list and check off like a chore.

It sucks.

So I’ve been trying something new: I’m reading without taking notes, highlighting important lines, or even trying to remember everything I read. If I encounter something important, I re-read it or stop to reflect for a minute. But at no point do I turn my reading time into a study session.

I’m finding this surprisingly difficult to do. I’ve become so used to extracting maximum value out of my books that to just read them for pleasure feels like a radical, uncomfortable act. Without that pencil in my hand, I’m actively anxious while reading.

But I keep reminding myself to just read. To not try to remember and catalog every little bit of information I come across. Books are not resources to be mined, but meals to be enjoyed. If something is important, it will come back to me. If it’s not, no amount of highlighting or note-taking will make it stick.

I’m hoping by allowing myself to just read, I can change my relationship to reading and go back to enjoying it like I used to. The number of books I finish this year is not even important. I just want reading to once again become something I do as a matter of course in my daily life, not as a sacred act that requires complex rituals.

I miss reading for pleasure. I’m hoping I can find that joy once again.

Weeknote 2025-W41: Starfish on the floor

Work

  • What do novelists do between getting a promising idea for a story and starting to type out their first lines? Is there a planning phase of some sort? Do they sit at their desks and just think really hard? Do they draw diagrams? Meditate? Go on walks? Consult the oracle? I’ve spent a lot of time learning about the writing processes of a whole bunch of authors, but I still have no clue what happens during the pre-writing process.
  • For my own novel, I’m spending my time researching, thinking, planning, and frantically scribbling notes to myself. Sometimes I starfish on the floor of my home office in despair. I’m not sure if this is valuable work or plain old procrastination. There is no way to tell.
  • That said, I’ve made satisfactory progress this week. The broad strokes of my plot are now clear to me, though I still have to iron out the specifics. I vaguely understand the mysteries behind the fantastic elements of my story world. I have a deeper understanding of my themes, and with it my protagonist’s psyche.
  • Next up, I need to figure out my main cast outside of the protagonist, outline some important climactic events, and finish reading the seventy three Wikipedia tabs I’ve opened in my browser. I’m hoping to draw up an outline for at least the first chapter by the end of the upcoming week. If I’m good and kind and brave, I might even be able to outline the first two or three chapters.
  • I’ve finally found a home for all my long-form writing in Ulysses. I’d prefer to use Scrivener for this work, but I don’t want to deal with its archaic and unreliable cloud sync. I briefly considered iA Writer, which is my default Markdown editor on all my computers, but it doesn’t have the tools to manage projects that contain more than two or three of files.
  • I will not be evaluating any other writing apps. I’m done with that life.

Not work

  • I’m going back to therapy. I recently had an insight about an issue that had stumped me for years, and I need to work through it with a professional.
  • I haven’t been able to make time for Hades 2. In general, games have taken a backset in my life this year. That’s fine, I suppose? Different seasons and all that. I don’t see myself putting significant time into a game again for a few months at least.
  • I’m itching to write code again. I haven’t worked on a significant programming project since March. Ugh.
  • I’ve started tracking my habits using Streaks. It’s silly, but watching that little star appear in the app motivates me to keep journaling and cleaning the litter boxes every day. Just goes to show I’m so easily manipulated, I can do it to myself.
  • I’m grateful for all the new friends I’ve made this year at IndieWebClub Bangalore and other local events. I’m also grateful for all the old friends I’ve reconnected with. If you’re reading this, know that I love you!