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.
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
A scheduled Claude session starts in the cloud every morning, so it runs even when the job seeker's laptop is off.
A small script collects new posts from MyCareersFuture and the job boards of companies like OpenAI, Anthropic and MongoDB. It drops roles that don't match the target roles or location, which costs nothing.
Claude scores the 25 that are left against the job seeker's CV, out of 10, with the reason and the gaps.
The top five and one or two cover letters arrive on Telegram.
The first real run, 19 Oct
New matching jobs found
150
Scored by Claude
25
Scored 7+
4
Cover letters
2
Bar lengths use a log scale so the small numbers stay visible. Only the second step uses AI.
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.
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 workflow in n8n after a test run. The numbers on the lines are how many items passed through each step.What lands on my phone each morning.
One morning's run
Items read from all feeds
2,400
Posted in the last 30 hours
107
Sent to my phone
5
Log scale. No AI in this pipeline, just keyword scoring, so it runs for free.
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.
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.
The worst signal wins
HazePM2.5 fine
HeatWBGT okay
Weatherlightning 6 km
UVmoderate
↓ one red flag is enough
YesMaybeNope
An example, not live data.
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.