← Javier Lee

// BUILD LOG

Things I built.

I spent four years doing partnerships at crypto exchanges, and I'm moving into AI. These are the tools I've built along the way, mostly to fix small problems of my own. Each entry covers what it does, how it works, what broke, and what I'd do next.

Oct 2026 · Claude agent · Node · Telegram

AI Job Hunter

An AI agent that reads each morning's new job posts in Singapore and sends a job seeker the few that fit their CV.

Who it's for

Anyone hunting for a job who is tired of checking the same sites every day and opening listings that turn out to need a different background. The job seeker adds their CV and what they're looking for. Every morning they get one message with the jobs worth their time, plus a first draft of a cover letter for the best one. The code is open source, so anyone can set up their own copy.

How it works

What broke

The first digest never arrived. Telegram replied "chat not found". The new bot had never been started, and a Telegram bot can't message anyone until they press Start. The setup guide now covers this step.

The agent signed its commits as "Claude". Every run saves a log to GitHub, and the first one showed up under Claude's name. The instructions now tell it to commit under the owner's name.

Some descriptions came through as junk. One job board sends its HTML escaped twice, so the agent was reading tag soup and paying for it. Decoding it first made every run cheaper.

What's next

Track which jobs each user actually applies to, so the scoring can learn from their choices. Running it on Sonnet for the scoring and keeping Opus for the cover letters would also make each run a lot cheaper.

Oct 2026 · n8n · JavaScript · Telegram

LinkedIn Digest

A morning list of AI and Singapore tech news worth posting about, so I never stare at an empty LinkedIn box.

Why I built it

I wanted to post on LinkedIn more often, and finding something to say took longer than writing it. So I automated the finding and kept the opinion for myself.

How it works

A self-hosted n8n workflow reads seven news feeds and the Hacker News front page, scores each story on the topics I care about, and sends me the top picks on Telegram. When one catches my eye, I paste it into Claude with a prompt that writes in my voice and avoids the usual AI phrases.

The n8n workflow: two triggers, a once-a-day check, feeds and Hacker News combined, scored and sent to Telegram
The workflow in n8n after a test run. The numbers on the lines are how many items passed through each step.
Telegram message: Post ideas for Sunday, 18 Oct, five picks from 107 new items
What lands on my phone each morning.

What broke

My PC is often off at 9:30am. An n8n schedule only fires if n8n is running at that moment. Now n8n starts when I log in, waits a minute for the network, and sends the digest if today's hasn't gone out yet.

Code that worked locally failed inside n8n. n8n's code node doesn't have the URL helper that normal JavaScript has, so reading a link's website crashed. A plain regex did the job.

What I'd do next

After a few weeks, check which sources I actually post from and drop the rest.

Oct 2026 · JavaScript · Vercel · NEA data

Can I Run?

A Yes, Maybe or Nope on whether it's a good time to run outdoors in Singapore, from live NEA data.

Why I built it

I didn't want to keep checking NEA's sites before every run, and I wanted something interactive that gave me one clear answer. Friends started using it too, and 340 people used it in its first few days.

How it works

It checks haze, heat stress, rain and lightning, and UV for your part of Singapore. The worst one decides the answer, because clean air doesn't matter if there's lightning nearby.

Can I Run? showing a Nope verdict for Central Singapore during haze

What broke

NEA started blocking me. The first version called six NEA APIs straight from the browser, and after a few refreshes I hit the rate limit. Friends would have seen sample data. Now one small server function fetches everything and caches it for five minutes, so NEA gets a few requests no matter how many people open the app.

What I'd do next

A morning notification on days when the best running window is early.