hatchet retweeted
C++ was the first language I learnt and abstractions were quite important from day one. The way objects can mutate their way to various identities and the compiler makes it all work is one of the beautiful ways of reasoning about writing useful code, something that OOP languages brought with them.
If you're building a startup today, one of the core strategies to become a winner in your space is to build a platform with abstractions and primitives that scale across various use-cases. I tend to always think on these lines given my early intro to programming with languages like C++ and Java.
So naturally, I love working at @hatchet_dev where we are building the orchestration engine to power every workload out there. The primitives we have built over the time have been extremely powerful to provide our users with an abstraction layer over all of their running workflows and jobs, ranging from AI agents to data pipelines and even notification systems.
hatchet retweeted
Our European takeover continues. We're so excited to have JB on the @hatchet_dev team!
please join us in welcoming jean-baptiste souvestre to the team! based in paris (ooh-lala), JB joins our growing engineering squad in europe. 🥖🇪🇺🍷
we asked him some questions to get to know him better, here's what he said:
➡️ light mode or dark mode?
🎤 what is a light mode?
➡️ we're told you're a cat man. tell us about your cats.
🎤 so i have 3 cats, kiki, chablis, and croche-pattes, all of whom are scoundrels in one way or the other. they love wet food, waking up at 4pm, and going to bed at 5.
➡️ how did you first come across hatchet?
🎤 i wanted to introduce hatchet to my last company because i liked the tech that much, but i figured it might just be more fun to work on it directly.
➡️ if i were in paris for one (1) day and wanted to get the best croissant, where would you suggest i go?
🎤 that's mamiche, in the 10th arrondissement, for sure.
➡️ what's something that surprised you in your first week here?
🎤 honestly can't decide between the tech maturity at such a young startup and the amount of custom frog emojis one can add to slack.
➡️ last, but not least: claude code or codex?
🎤 claude, but just because it was a french first name.
bienvenue à bord, JB! 🚀
hatchet retweeted
back in february, when we first released the @hatchet_dev CLI, we were pretty adamant that it was the CLI, and not an MCP, that would be the primary entrypoint for agents using Hatchet. and this has definitely been the case! but the rise of coding agents and the latest MCP spec are making MCPs much more usable across a wider range of services by supporting serverless request/response. and, frankly, we've been using MCP servers much more -- shoutout to @Posthog and @Figma.
so we're releasing a new and updated MCP which does everything you'd expect -- debugging runs, triggering workflows and runs, and inspecting configuration of workflows and tasks -- so you can use either the CLI or the MCP (or the regular SDKs) to accomplish what you need.
hatchet retweeted
our new overview page 1) is great for observability over your workflow orchestration; and also 2) offers relief from the sisyphean burden of shame and guilt over limited metric visibility that we all must carry as we roam this mortal coil. it's great
Replying to @hatchet_dev
wracked with #GUILT because you don't have visibility into key metrics? CLEANSE YOUR CONSCIENCE!! 🌈
hatchet retweeted
We've gotten some great feedback already on our new overview page, excited to share it with everyone!
hatchet retweeted
we're open sourcing a library we’ve been working on at Hatchet called pgoutbox. github.com/hatchet-dev/pgout…
it implements a high-performance transactional outbox (specifically, for Go applications that use postgres via the pgx driver, but we'd like to make it available in other languages soon).
we’ve been running it in production for the past 3 months at Hatchet, processing tens of thousands of messages per second. benchmarks on my local laptop have it going > 200k messages / second.
what's a transactional outbox? it's a pattern for solving a lost-write problem in distributed systems. imagine a user signs up for your app and you’d like to create a new row in your users table and send them a welcome email. if your API crashes or restarts after you commit to the users table, but before sending a welcome email, the write to the email service is lost forever. so instead, you write the message to an outbox table as part of the same tx as the user write.
obviously there’s a lot of intersection with task queues built on Postgres — transactional enqueuing is one of the main benefits! we had a few requirements that make typical task queue libraries a poor fit.
first, it needs to support hundreds of thousands of different topics with exclusive consumers. this can get a bit tricky to scale due to MVCC on Postgres; if you attach a lease with a heartbeat to each topic, you’ll perform wayy too many updates and accumulate lots of dead tuples.
second, it needs to support immediate message deletion with configurable retention policies per topic. this is quite different from a durable queue, where you’d like to preserve messages for future replays and auditing.
third, it needed a solid scaling story and APIs built around batching.
here for feedback / questions!
hatchet retweeted
our cto has a way with words ...
... he is not wrong though; but i'd call us efficient rather than cheap :) and all that efficiency work allows us to pass on (some of the) savings to customers
xitter.cf/gabe_ruttner/status/21…
I won the battle on using the word cheap to describe @hatchet_dev's new pricing, so i'm going to take full advantage: cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap
hatchet retweeted
really excited for this one. this is the result of ~2 years of obsessing about one thing: performance.
building a general-purpose workflow engine is a double-edged sword; it's great for developers and coding agents because you can use it to solve a bunch of different problems, but at the same time, users might run tasks using a mixture of features you've never seen before.
you see this all the time with general-purpose databases, btw, like postgres -- super fast in most cases but if you use just the wrong combination of features it gets really slow and non-performant.
so there were a few workloads on hatchet cloud which cost us an insane amount of $$$ to run. deeply negative margins. but rather than raise prices for these users, we basically just doubled down, then doubled down again, on improving performance.
we've actually kept our infra spend pretty much flat for ~14 months, despite increasing revenue over 4x in that time period. better performance means less load on the databases, smaller spikes, and fewer machines. which leads directly to savings for users.
hatchet retweeted
we're cutting our prices!!! yes, we're making less money, and i couldn't be more excited.
@hatchet_dev cloud is now pure pay-as-you-go: 1M free task runs a month with no plan fees
why? we're betting on an async future, and we want hatchet to be where it runs.
hatchet retweeted
I won the battle on using the word cheap to describe @hatchet_dev's new pricing, so i'm going to take full advantage: cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap cheap
some photos from the wonderful @hatchet_dev offsite. unfortunately, did not see any cod, but was able to hang out with some very cool people
hatchet retweeted
best people, best location, best company, best offsite
Here's a look behind the scenes at our team offsite in Cape Cod last week! ⛵️🚲🦞🎄🌊
(Not shown here: @igor_kupczynski trying a lobster roll for the first time, loving it, and then ordering a second, third, fourth, etc.)
hatchet retweeted
shoutout to the charcuterie king @vqtbl4q who personally arranged the baby carrots on the board in descending rows from smallest to largest
Here's a look behind the scenes at our team offsite in Cape Cod last week! ⛵️🚲🦞🎄🌊
(Not shown here: @igor_kupczynski trying a lobster roll for the first time, loving it, and then ordering a second, third, fourth, etc.)
hatchet retweeted
I asked Megan: why bananas? The answer: I feel like they're a silly fruit, I'm a silly person.
There's no deeper meaning here. Enjoy!
hatchet retweeted
We're getting close to releasing a new feature called operators, which enable Hatchet workers to run anywhere (not just a long-lived containers with gRPC support). Turns out that includes @useTRMNL e-ink displays!
The entire Hatchet team is in Cape Cod for a hackathon, and I'd occasionally look over and see @vqtbl4q and @mnafees with a huge rig of TRMNLs rendering some crazy Rorschach-looking things. The video doesn't show this, but you can also register new TRMNLs as part of this rig and it'll synchronize and resize the bitmaps on each display. All of this synchronization is handled by the Hatchet serverless operator.
Naturally, @mnafees also built a Hatchet dashboard into TRMNL, pictured below. We're working on getting this on the TRMNL marketplace soon!
We got these @useTRMNL e-ink displays for the Hatchet hackathon, and naturally @mnafees and I wanted to get these running as Hatchet workers.
Initially we tried to get a vibe coded C SDK running. This worked, but the esp32-c3 processors only have 400kb of RAM, so we were limited to spawning tasks with payloads <25 chars.
So instead we started playing around with a new feature in Hatchet called operators, which lets you turn anything that can run an HTTP server into a hatchet worker. This isn't natively supported on TRMNLs, but modifying the firmware to add /heartbeat and /trigger endpoints was very easy.
Obviously, the next step was sending base64 images, and then playing Bad Apple at around 1 fps. Had to do some more firmware shenanigans to disable "full refresh" to get below .3fps, but it ended up working pretty nicely.
We got these @useTRMNL e-ink displays for the Hatchet hackathon, and naturally @mnafees and I wanted to get these running as Hatchet workers.
Initially we tried to get a vibe coded C SDK running. This worked, but the esp32-c3 processors only have 400kb of RAM, so we were limited to spawning tasks with payloads <25 chars.
So instead we started playing around with a new feature in Hatchet called operators, which lets you turn anything that can run an HTTP server into a hatchet worker. This isn't natively supported on TRMNLs, but modifying the firmware to add /heartbeat and /trigger endpoints was very easy.
Obviously, the next step was sending base64 images, and then playing Bad Apple at around 1 fps. Had to do some more firmware shenanigans to disable "full refresh" to get below .3fps, but it ended up working pretty nicely.
hatchet retweeted
problem: wifi doesn't work at the airbnb for @hatchet_dev's cape cod offsite
solution: get @Starlink delivered ✅
hatchet retweeted
This is one of those "break glass in case of emergency" features that we've gotten a bunch of requests for.
Sometimes you'll just have large batches of work failing due to things outside of your control (Github down, Claude down, Azure down). Being able to temporarily pause a workflow until the issue is resolved will make it much less painful to dig out later.
We also made it programmatic, so you could in theory build a nightly scheduler where you queue work throughout the day and unpause your workflows at night, to relieve pressure on your systems during peak hours.
Excited to see this one released!
New Feature: Workflow Pause
→ Temporarily stop a workflow from executing new runs
→ While the workflow is paused, new runs will automatically queue up to a queue TTL and all in-flight runs continue to run
Read the docs: docs.hatchet.run/v1/pausing-…
hatchet retweeted
Just announced a ton of solid new updates, including workflow pause, viewer roles, @hatchet_dev Embedded Mode and more
hatchet retweeted
You can now run workers with a full Hatchet engine and a Postgres database running as a sidecar process.
This took a long time to get right. Hatchet is a push-based scheduler. Work gets assigned by the engine to a worker, and gets sent over a network (gRPC) call to a worker. We made this choice after seeing the performance limitations of pull-based Postgres queues (based around FOR UPDATE SKIP LOCKED) as you add more queue requirements: global rate limits, concurrency and fairness strategies, etc. The Hatchet engine also handles things like RBAC, user management, tracking worker health, and internal maintenance that would require leadership election in a pull-based model.
The tradeoff, of course, is that Hatchet runs separate from the worker process. Which is absolutely the right call in production, but makes local development and CI testing more difficult.
While we were at it, we started experimenting with `embedded-postgres`, to remove another external dependency while still building on the Postgres we all know and love.
Instantiating a client is literally a single function call.
Some more docs here: docs.hatchet.run/v1/embedded

























