Day 2 of my latest project

A few updates from Day 2 of my latest project: mirroring my BlueSky posts to a static Jekyll blog.

First, I liked it so much I made it the landing page for https://monsur.hossa.in

Second, and more interestingly, I wanted to refresh the UI to be cleaner. I started by looking into the al-folio theme, but Claude actually advised against it:

“I can help you convert your site to use the al-folio theme, but this will be a significant change that replaces your current Jekyll setup. The al-folio theme is an academic portfolio theme that’s quite different from your current simple blog setup.”

So I asked Claude what theme it’d recommend, and it shared a few alternatives, one of which was Minima (the default Jekyll theme).

I like this theme, but Claude had me worried that this would be a large refactoring (and I’ve had bad luck with refactoring and AI in the past).

Instead, I asked if it could recreate the Minima theme on my site (without actually using Minima).

Here’s the interesting bit: Claude visited the Minima GitHub site, “looked at” the Sass file and recreated the CSS in my default template! Very cool!

(Plus I assume this is all legit since Minima is under an MIT license).

Vibecoding on a Sunday afternoon

Another small vibecoding project from a Sunday afternoon: mirroring my BlueSky posts to a Jekyll blog http://monsur.hossa.in/blog. I’ve been posting here more (I can get into the why in the future), and I wanted to have my own archive of this content.

Even though BlueSky captures bite-sized content, I envision a BlueSky thread as a single coherent blog post.

This Python script concatenates a BlueSky thread into a Markdown file which serves as a single blog post.

It was built using Claude Code. I was dipping in and out throughout the afternoon, but it was maybe an hour, hour and a half of work in total.

While the script could automatically run when there’s a new post, I’m running it manually for now so I can inspect the output.

Claude used the public BlueSky API, no authentication required. I assumed I’d have to authenticate given how locked-down APIs tend to be these days. Yay for open APIs!

Claude also had a clever solution for ensuring all the posts are mine. I would have just hardcoded my username directly in the script. Claude saves the username of the first post, and then ensures the user is the same for subsequent posts. This is a much more scalable approach!

How do you learn?

Keeping up with innovation in the AI space can feel overwhelming. Understanding your preferred learning style is an important part of that journey.

Do you prefer to read, listen to podcasts, watch videos? Do you like diving into detailed academic papers, or leveraging AI as a tool to build.

There isn’t one right answer, and your answer may change over time.

Things I’ve learned about myself: I am an avid reader, but when it comes to technical topics, I prefer visuals that convey how pieces fit together. I’m a hands-on learner, I like building. I’ll sometimes walk through an example from https://simonwillison.net to get a “feel” for how it works.

AI is great for supporting this style of learning. AI chats lend themselves well to the Socratic method, where I can ask questions and explore a topic from different perspectives, rather than rely only on the text in front of me.

I’ve adopted a sorta “backwards learning” approach, where I’ll start with a definition I don’t know, and work backwards to learn how it fits into an overall picture (rather than say, reading an article, where you might start with the foundational pieces and work your way up).

An example of this was the HuggingFace post about GPT OSS, where I used my chat session to dig into every unknown term in the article: https://huggingface.co/blog/welcome-openai-gpt-oss

This approach turned a static document into a living, dynamic experience that yielded something greater than just the words on the page.

AI is still about the end user

One new insight after building plai-ball.com and listening to it for a few months: The podcast format requires focused attention. The teams and game scores are mentioned once at the beginning, and if you miss it, you are lost.

I mostly listen to podcasts in the background while driving and its easy to miss things.

Its a good reminder that sometimes our AI challenges are human rather than technical. AI is cool, but it ultimately needs to meet the user’s need.

Potential fixes include introducing repetition in the transcript to reinforce key details, or adopting a two-person format (as I’ve seen other AI generated podcasts use). The two-person format would be more conversational, and give space for the listener to absorb the content.

An AI Shopping Assistant with Gradio

Cool practical example of stringing together different AI tools to create a demo app. The AI is cool, but I’m also amazed at how this new generation of tooling makes complicated things easy.

For example: Sharing a gradio demo is as simple as setting share=True. That simple boolean does a lot of heavy lifting to make an app appear at a url.

Contrast that to what often feels like hours of getting your environment configs just right to do modern web development.

The old timers who built the early web are coding with AI like it's 1995.

“The old timers who built the early web are coding with AI like it’s 1995.”

https://www.linkedin.com/posts/christinawodtke_the-old-timers-who-built-the-early-web-are-activity-7356335847614402560-8nKx/

I couldn’t agree more. There’s an element of play to AI that makes technology fun again!

But I worry about costs. Many AI tools cost money out the gate. Old-timers have the means to support that, but a kid new to computer science might not.

The early web was just so freaking awesome for anyone to play with! View source, copy/paste, refresh, repeat. It was so much fun!

plAI ball!

I wanted to share a little side project I’ve been working on: https://www.plai-ball.com

Its been running for about a month, and I think I’ve worked out most of the issues.

I love baseball, but it’s hard to keep up with all the games every day. So I built plAI ball!, an AI-generated podcast that gives a quick daily recap of every MLB game. It’s designed for people like me who want to quickly catch up on yesterday’s game over morning coffee.

But beyond the baseball, this was a chance to experiment with AI tools and APIs—and it reminded me how energizing it is to turn an idea into a working product.

Learning #1: AI supercharges prototyping - The first version came together in under an hour, thanks to AI coding tools (Cursor and GitHub CoPilot). It felt like magic!

Learning #2: Real products need more than AI - Once I moved past the prototype, I had to do a lot of traditional engineering: stitching together data, building an RSS feed, handling edge cases. The “AI” part was just a couple of calls—but integrating it into a pipeline took most of the effort.

Learning #3: AI + hand-coded refinement offered a nice balance. AI codegen took me from 0 to 1. But when I wanted something more complicated the output was buggy and I had to dive in and refactor the code myself. I ended up embracing this hybrid workflow.

Learning #4: I learn best by building - Docs and tutorials are great, but nothing beats rolling up your sleeves. Playing with APIs in a real-world context helped me understand the tradeoffs and limitations a lot faster.

This was a fun reminder that building things doesn’t have to be a heavy lift. With the tools we have today, you can go from idea to MVP incredibly fast—and learn a ton in the process.

Updating a 14 year old GitHub project

I used Gemini CLI to update a GitHub project I haven’t touched in 14 years: https://github.com/monsur/echo-server

I actually tried this a few weeks back using IDE integration, and it got stuck on unit tests. This time it worked much better (and I think I’ve gotten better at prompting).

It was able to uncover functionality I forgot I added (e.g. conditional support), and then updated the README so I wouldn’t forget.

It even fixed a security bug:

“I made a significant security improvement. The original server used new Function(), which could execute arbitrary JavaScript from a URL parameter—a major security risk. The modernized version replaces this with a safer, more specific conditional logic”

My key takeaway is the time savings. This was less than an hour of messing around on a weeknight. While I understood all the changes being made, it would have taken SO much longer to do them all myself.

Here’s the full conversation if you’re curious.

AI in Canva's interview process

“We believe the future belongs to engineers who can seamlessly blend human creativity and judgment with AI capabilities. Proficiency with AI tools isn’t just helpful for success in our interviews, it is essential for thriving in our day-to-day role at Canva.”

https://www.canva.dev/blog/engineering/yes-you-can-use-ai-in-our-interviews/

Hello World

This is my first blog post! Welcome to my Jekyll blog.

Getting Started

This blog is built with Jekyll and hosted on GitHub Pages. Each post is written in Markdown and stored in the _posts directory.

How to Add New Posts

To create a new blog post:

  1. Create a new .md file in the _posts directory
  2. Name it with the format: YYYY-MM-DD-title.md
  3. Add front matter with title, date, and categories
  4. Write your content in Markdown

That’s it! Jekyll will automatically generate the HTML and make it available at /blog/.