Jun 25, 2026

How I Built Jatayu — A Personalized AI Writing Agent

 The NAS (The Accidental Server)

It all started with a baby on the way. I’m someone who takes too many photos — ultra HD was only going to make the problem worse. I didn’t want to be at the mercy of Google Photos or iCloud forever. So I got a UGreen DH4300PLUS NAS to own my own storage.

The transfer happened. Life’s worth of data, moved. And then I looked at what I had: an always-on server sitting in my home, doing nothing 24 hours a day except spinning disks.

The obvious next steps followed — almost inevitably. RetroArch for retro gaming (Mario, Aladdin, Prince of Persia — the classics that got preserved rather than lost). Pi-hole for ad blocking across the entire local network. Small wins that made the NAS feel alive.

But these were all consuming software running on someone else’s idea. The server had more to give.

OpenClaw and the Automation Rabbit Hole

That’s when I gave OpenClaw a try. What started as a curiosity turned into something I couldn’t stop building. Daily news digests. Fitness coaching agents pulling from my Garmin data. A postpartum fitness agent for my wife. India news briefings. A GenAI research monitor every Monday. Learning curricula on football analytics, cricket analytics, personal finance, marketing measurement — all delivered on cron schedules like a personal university running in the background.

The agents were useful. But they had a cost problem and a reliability problem. Every call was hitting a cloud API. The costs were manageable but not zero. And more importantly — I didn’t love the dependency. I had built a self-hosted life (the NAS, the Pi-hole, the retro gaming setup) precisely to own my own infrastructure. The AI layer felt inconsistent with that.

Ollama on the Mac Studio

I had a Mac Studio that had been doing almost nothing since I stopped video editing. Powerful machine, severely underutilized, running warm and purposeless on my desk.

Ollama fixed that. I installed it, pulled Qwen3 14B, and suddenly had a local LLM that ran fast, cost nothing per call, and lived entirely inside my home network. The Mac Studio had found its second life.

I pointed OpenClaw at the local Ollama endpoint. The digests kept running. The costs dropped. The latency improved. And I had something I hadn’t had before: an AI setup I fully controlled, end to end, from the disk to the model weights.

Jatayu

With the infrastructure in place, I could think bigger.

I’ve been writing for 15 years. Tweets, blog posts (including this one), Quora answers, Team-BHP travelogues about road trips and car reviews, Airbnb reviews, published technical articles on Kinsta, SitePoint, DataQuest, DigitalOcean. Somewhere across all of that is a voice — a way of making a point, opening a piece, landing a joke — that is distinctly mine.

The question was whether an AI could learn it.

I built Jatayu: a personalized writing agent on OpenClaw, backed by Qwen3 14B running locally on the Mac Studio. The corpus it was trained on:

  • ~2,200 original tweets (retweets and replies filtered out)
  • ~1,000 Facebook posts (link shares and one-liners filtered out)
  • 400+ blog posts from Transcendental Tech Talk
  • 188 Quora answers
  • Airbnb and Product reviews
  • 4 Team-BHP threads (travelogues and car reviews)
  • Published articles from Kinsta, SitePoint, DataQuest, DigitalOcean
  • My book on Git

Each piece was tagged with a recency weight — 1.0 for writing from 2021 onwards, down to 0.2 for anything before 2014. The goal was for Jatayu to learn who I am now, not who I was in college. A style guide was then extracted from the corpus — how I structure sentences, how I open pieces, how I argue, what I find funny, what phrases I never use. That style guide anchors Jatayu’s system prompt.

This blog post was written using the Jatayu prompt. Leave it genuinely ambiguous whether it was edited, partially written, or fully written by Jatayu. The last line should make the reader pause and wonder. It should feel like a natural ending to the story, not a twist stapled on.


Liked this post? Have any suggestions? Just let me know. Feel free to comment below!

Jul 13, 2016

Exploring Southern Sri Lanka: Bentota and Galle

This summer, I visited Sri Lanka for my internship and had the opportunity to explore the fantastic island nation. I landed in Colombo when the Sri Lankan new year celebrations were going on (mid April) and therefore decided to take a trip down South to the beautiful little towns of Bentota and Galle.

How to Reach

International Flights from Chennai take about an hour to reach Colombo. From Colombo, you may take a train from the Colombo Fort railway station to Bentota. There are many options in terms of the International Airlines, with Sri Lankan Airlines providing jumbo jets for the journey.

May 21, 2016

Sri Lanka - Two Months On!

It has been almost two months in Sri Lanka, after Unilever decided to send me to conquer this nation for the internship (just kidding!) And here I am with yet another blog post about the experience in a South Asian country unlike any other!

Apr 24, 2016

Sri Lanka: First Thoughts

It has been such a long time since I blogged that I feel something like this Led Zeppelin song - "been a long time, been a long time, been a long, lonely, lonely, lonely, lonely, lonely time!"


As I was racing towards the other terminal in Chennai, I suddenly realised what I had in store for me. Two months in a foreign country all alone - as if that was not enough, I hadn't slept the night earlier chatting up with some old friends and I was practically in a trance state. By this time, I realize the earlier sentence is getting too long and I need to abort, or risk failing the Flesch test.

Cutting to the chase, I am in Sri Lanka for my internship with Unilever (and I have been given a palatial bungalow - more on that in a later post). I will directly go down to the crux of the matter and let you know what surprised me the most (or least).

Mar 29, 2016

The WearYourStyle.in - TrendzVenue Scam - DO NOT BUY

A few weeks go, I saw an ad on Facebook for WearYourStyle.in and order 5 T-shirts for Rs. 1700. It took some time to get them, but to my surprise, I was shipped only 4 (even though the invoice mentioned 5 of them!)

I contacted their customer care through email (when you email contact@wearyourstyle.in, contact@trendvenue.com replies) they asked me which item was missing from my shipment. That was a week ago, and there has been no reply from this on this matter hence.

Sep 14, 2015

Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips

4 years, 4 long years. That's how long Kolkata bloggers have been waited for a blogger meet. Thankfully, I am more of a Nomad and I visited the Kose IndiBlogger Meet, which coincided with my IIM Indore interview. Being that pseudo Kolkatan that I am, I knew about the rich heritage of the Oberoi Grand. Add to it the spice of an IB meet, and I knew missing it would be stupid. What's more? I got my mother into it too.

If you know me, you would probably know that I am a developer (yes, I still consider myself one!) and developers are introverts. Introverts are good at blending into a crowd, and not stand out. In the previous meet, I had done so successfully, and managed to talk to others too, but this time I had Mamma with me, which changed the dynamics.

Sep 4, 2015

I got Published!

The title says it all.

Wait, what?!? Published? Not self-published, I got published published. If memory serves me correctly, not long ago, I was struggling to complete those writing skill questions back in 12th standard. It's been a long journey since then!

Dec 31, 2014

How to use request.PUT or request.DELETE in Django

Those of you who use Django might know that using request.PUT or request.DELETE on Django doesn't work. This is because Django doesn't construct dictionaries for such "verbs", and you need to work with request.raw_post_data or request.body and parse it to get your data (Go ahead, give it a try, while I have a cookie!)

If you are creating a simple REST API, you are not going to have a good time unless you are working with a framework.

Wouldn't it be nice if you could use request.PUT just like the dicts request.POST and request.GET After finally searching online, I have stumbled upon a way to do just that.

You can find the code on BitBucket.

    if request.method == "PUT":
        if hasattr(request, '_post'):
            del request._post
            del request._files
       
        try:
            request.method = "POST"
            request._load_post_and_files()
            request.method = "PUT"
        except AttributeError:
            request.META['REQUEST_METHOD'] = 'POST'
            request._load_post_and_files()
            request.META['REQUEST_METHOD'] = 'PUT'
           
        request.PUT = request.POST

What you do here is simply change the request method back to POST, reload the variables and rename the request method and request.POST dictionary. A nice hack to get your job done.

Liked this post? Have any suggestions? Just let me know. Feel free to comment below!

Dec 11, 2014

Zico, the ISL and ATK

Zico might have been a great footballer, but the White Pele is perhaps one of the best players not to have won a World Cup ever. Maybe that's why he considers qualifying to the semi finals of the ISL as one of the greatest moments of his career. It's commendable how he has engineered the uphill task after a poor start by FC Goa to the tournament.

The moment I entered the Salt Lake Stadium, I knew the crowd wasn't going to let Zico go away with a victory, a result that would eliminate the home team Atletico de Kolkata out of the tournament. As the starting XI was being announced, the stadium cheered every name. The presence of 36 year old marquee signing Luis Garcia on the bench, raised doubts on his fitness, but Kolkata seemed to go with whatever they had.

Dec 10, 2014

And I'm back!

It's been a long time. A very long time indeed...

It's been so long that the once familiar Blogger interface seems alien to me. Due to my sabbatical, I must admit that I had thoughts of leaving this blog altogether and moving on to a new one, but recent events have convinced me otherwise.

Random people have asked me why I have stopped blogging. I had no idea so many people read this blog - and that they would miss my posts. But the one thing that wanted me to start writing again on this blog was during a job interview.

I had cleared the first level of interviews in a company, and the moment I walked into the room, one of the interviewers asked me - "How is your blog?" (The fact that I have neglected this blog in recent times might have contributed to me not making it to the said company.)

Apart from my readers reaching out to me in real life, I am going to start writing again because I am fresh out of the placement season at IIT Roorkee - a place where students are only as good as the packages they bag. I have a lot of things in mind - about the placement process, the selection procedure and a lot of other things - and I am going to share them on this blog soon (albeit in a safe way- to make sure I don't get in trouble with certain people).

To the readers, I would like to sincerely apologize because I have been away for a long time due to my own selfish reasons (the freelancing pays well, you know!) But watch this space, I am going to share my experience soon.

Liked this post? Have any suggestions? Just let me know. Feel free to comment below!