<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Souvik De - Blog</title><description>Building developer tools, maintaining opensource projects, and shipping fast, thoughtful software with a focus on usability and performance.</description><link>https://souvik.de</link><language>en-us</language><item><title>Your Coding Agent Should Be Doing Your Job Research</title><link>https://souvik.de/blog/why-im-building-jobscout</link><guid isPermaLink="true">https://souvik.de/blog/why-im-building-jobscout</guid><description>I spent my last job hunt buried in browser tabs doing research by hand. Now I&apos;m building a job search app that hands that work to the AI agents already on your machine.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you write code, you probably have Claude Code, Codex, or OpenCode installed.I personally use both claude code and opencode daily for my work and side projects.&lt;/p&gt;
&lt;p&gt;But the last time I was looking for a job, I didn&apos;t use it once. I did all the research by hand, like it was 2015.&lt;/p&gt;
&lt;p&gt;Looking back, that&apos;s kind of ridiculous. Interviews were stressful, sure, but the stuff that actually wore me down was everything around them. I&apos;d have a dozen tabs open at any point, spread across job boards, careers pages and review sites. If I found a role I liked, there was nowhere good to put it. I tried bookmarks for a while, then a spreadsheet that I stopped updating after a week.&lt;/p&gt;
&lt;p&gt;The research was worse. Before applying anywhere I wanted to know what the company was actually like: what stack they use, and whether people who work there seem happy. Each of those was another search and more tabs, and somehow an hour would be gone. Some days it felt less like job hunting and more like data entry.&lt;/p&gt;
&lt;p&gt;That&apos;s exactly the kind of work I hand off to an agent when I&apos;m coding. It just never occurred to me to do it for my job search.&lt;/p&gt;
&lt;h2&gt;Bring your own agent&lt;/h2&gt;
&lt;p&gt;So I&apos;m building JobScout. That&apos;s the working name, anyway. The site lives at &lt;a href=&quot;https://www.findmejob.xyz/&quot;&gt;findmejob.xyz&lt;/a&gt;, which should tell you how settled the name is.&lt;/p&gt;
&lt;p&gt;It connects to the AI agents you already run locally, like Claude Code, OpenCode, and Codex. You don&apos;t need another subscription or another account for yet another &quot;AI-powered&quot; job tool. It just uses the agent you already have.&lt;/p&gt;
&lt;p&gt;The idea is that you shouldn&apos;t be the one opening twelve tabs to decide if a company is worth applying to. You point your agent at the company and let it do the digging, then read what it found.&lt;/p&gt;
&lt;p&gt;Later I want the agent to help with applications too. Not mass-applying to a hundred jobs, though. More like drafting something for a specific role, which you read and fix before anything gets sent.&lt;/p&gt;
&lt;p&gt;Underneath all of that, it&apos;s the thing I wanted during my last search. You save companies you&apos;re interested in, shortlist the ones you really want, and the research stays attached to each one. When I open it I can see where I am and what I still need to look into, instead of hunting for a link I know I saved somewhere.&lt;/p&gt;
&lt;p&gt;I&apos;m mostly building it for myself. But I doubt I&apos;m the only one who&apos;s had this problem.&lt;/p&gt;
&lt;h2&gt;Try it out&lt;/h2&gt;
&lt;p&gt;One thing I should be upfront about: this is still very much in development. A lot of what I described above isn&apos;t built yet. It&apos;s what I&apos;m working toward, and I&apos;m hoping to ship those pieces soon. So if you try it now, you&apos;re getting an early version, rough edges included.&lt;/p&gt;
&lt;p&gt;If you&apos;re job hunting and already use a coding agent, you can download it from &lt;a href=&quot;https://www.findmejob.xyz/&quot;&gt;findmejob.xyz&lt;/a&gt;. I&apos;d really like to hear what works and what doesn&apos;t, and which agent you&apos;d want it to support best. That kind of feedback will shape what I build next.&lt;/p&gt;
&lt;p&gt;Oh, and the name will probably change. Honestly, writing this post is partly a way to make myself finish it.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://souvik.de/blog/why-im-building-jobscout&quot;&gt;Read the full article on souvik.de →&lt;/a&gt;&lt;/p&gt;</content:encoded><category>job-search</category><category>side-project</category><category>build-in-public</category><category>ai-agents</category><category>career</category><author>souvikde.tech@gmail.com</author></item><item><title>An Introduction to Glee: A Spec-First Framework for Event-Driven APIs</title><link>https://souvik.de/blog/introduction-to-glee-spec-first-framework</link><guid isPermaLink="true">https://souvik.de/blog/introduction-to-glee-spec-first-framework</guid><description>How Glee turned an AsyncAPI specification into a running WebSocket server, and why a spec-first approach keeps your code, docs, and API in sync.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Glee was archived on August 4, 2025 and is no longer maintained. I&apos;m keeping this walkthrough around as a reference — it&apos;s a useful example of building with a spec-first mindset. This post originally appeared on the &lt;a href=&quot;https://www.asyncapi.com/blog/introduction-to-glee-a-spec-first-framework&quot;&gt;AsyncAPI blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;During my time working full-time on AsyncAPI, I helped build a framework called &lt;a href=&quot;https://github.com/asyncapi/glee&quot;&gt;Glee&lt;/a&gt;. This post is a broad introduction to what Glee does, why a spec-first approach is worth your attention, and how to spin up a working WebSocket API in a few minutes.&lt;/p&gt;
&lt;h2&gt;What is Glee?&lt;/h2&gt;
&lt;p&gt;Glee is a spec-first framework for building server-side, event-driven applications. The core idea is that your &lt;a href=&quot;https://www.asyncapi.com/docs/concepts&quot;&gt;AsyncAPI specification&lt;/a&gt; is the single source of truth, and Glee does the plumbing around it — creating connections, managing message flow, and keeping everything wired to the spec — so you can focus on business logic instead of connection management.&lt;/p&gt;
&lt;p&gt;Two things stand out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your code, spec, and docs stay in sync.&lt;/strong&gt; Because the spec drives everything, you can&apos;t quietly drift away from it. When the API evolves, the specification and documentation move with it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection management is handled for you.&lt;/strong&gt; Performance, scalability, and resilience concerns are off your plate, so you spend your time on the logic that actually matters to your users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Let&apos;s build something concrete: a WebSocket server that receives the current time and the client&apos;s name, then replies with a greeting based on the hour.&lt;/p&gt;
&lt;p&gt;You&apos;ll need Node.js and npm. Check they&apos;re installed:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node -v
npm -v
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Create a Glee project&lt;/h3&gt;
&lt;p&gt;The quickest way to scaffold a project is the official AsyncAPI CLI. It creates the directory for you, so run it from wherever you want the app to live:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;asyncapi new glee
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can install the CLI via &lt;a href=&quot;https://www.npmjs.com/package/@asyncapi/cli&quot;&gt;npm&lt;/a&gt; or grab binaries from the &lt;a href=&quot;https://github.com/asyncapi/cli/releases&quot;&gt;releases page&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Define the spec&lt;/h3&gt;
&lt;p&gt;Because Glee is spec-first, you start with the spec — not the code. Here&apos;s a minimal AsyncAPI 3.0.0 document that describes our greet API:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;asyncapi: 3.0.0
info:
  title: Greet Bot
  version: 0.1.0
servers:
  websockets:
    host: &apos;0.0.0.0:3000&apos;
    protocol: ws
channels:
  greet:
    address: greet
    messages:
      onGreet.message:
        $ref: &apos;#/components/messages/time&apos;
      subscribe.message:
        $ref: &apos;#/components/messages/greet&apos;
operations:
  onGreet: # operationId
    action: receive
    channel:
      $ref: &apos;#/channels/greet&apos;
    messages:
      - $ref: &apos;#/components/messages/time&apos;
  greet.subscribe:
    action: send
    channel:
      $ref: &apos;#/channels/greet&apos;
    messages:
      - $ref: &apos;#/components/messages/greet&apos;
components:
  messages:
    time:
      payload:
        type: object
        properties:
          currentTime:
            type: number
          name:
            type: string
    greet:
      payload:
        type: string
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important bit is the &lt;code&gt;operationId&lt;/code&gt;. Glee uses it to connect the spec to your business logic: whenever the &lt;code&gt;/greet&lt;/code&gt; channel receives a message, Glee calls the function with that &lt;code&gt;operationId&lt;/code&gt;. In other words, the spec doesn&apos;t just describe the API — it names the entry points your code plugs into.&lt;/p&gt;
&lt;h3&gt;Write the operation function&lt;/h3&gt;
&lt;p&gt;Create &lt;code&gt;functions/onGreet.js&lt;/code&gt; with the greeting logic. Every file in &lt;code&gt;functions/&lt;/code&gt; is a handler that exports an async function taking an &lt;code&gt;event&lt;/code&gt; parameter, which gives you access to the payload and server details:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export default async function (event) {
  const { name, currentTime } = event.payload;
  const hour = new Date(currentTime).getHours();

  let response = &quot;&quot;;
  if (hour &amp;#x3C; 12) {
    response = `Good Morning ${name}`;
  } else if (hour &amp;#x3C; 18) {
    response = `Good Afternoon ${name}`;
  } else {
    response = `Good Evening ${name}`;
  }

  return {
    reply: [
      {
        payload: response,
      },
    ],
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Run and test&lt;/h3&gt;
&lt;p&gt;Start the app:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm run dev
# or
npm run start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then point a WebSocket client at the server (I used Postman) and send a message with a &lt;code&gt;currentTime&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt;. You should get a greeting back based on the time of day.&lt;/p&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;That&apos;s the whole loop: define the spec, map operations to functions, and run. There&apos;s a full working example in the &lt;a href=&quot;https://github.com/Souvikns/greet-bot&quot;&gt;Greet Bot repo&lt;/a&gt; if you want to poke around.&lt;/p&gt;
&lt;p&gt;Glee was evolving quickly and supported MQTT and WebSocket while I worked on it, but the project has since been archived. The ideas behind it — spec-first development, code and docs that can&apos;t drift apart — are still worth carrying into whatever you build next.&lt;/p&gt;
&lt;p&gt;You can read the original version of this post on the &lt;a href=&quot;https://www.asyncapi.com/blog/introduction-to-glee-a-spec-first-framework&quot;&gt;AsyncAPI blog&lt;/a&gt;, and find the archived source in &lt;a href=&quot;https://github.com/asyncapi-archived-repos/glee&quot;&gt;asyncapi-archived-repos/glee&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://souvik.de/blog/introduction-to-glee-spec-first-framework&quot;&gt;Read the full article on souvik.de →&lt;/a&gt;&lt;/p&gt;</content:encoded><category>asyncapi</category><category>glee</category><category>websocket</category><category>event-driven</category><author>souvikde.tech@gmail.com</author></item></channel></rss>