Show HN: Daemons – we pivoted from building agents to cleaning up after them
Posted by rileyt 7 hours ago
For almost two years, we've been developing Charlie, a coding agent that is autonomous, cloud-based, and focused primarily on TypeScript development. During that time, the explosion in growth and development of LLMs and agents has surpassed even our initially very bullish prognosis. When we started Charlie, we were one of the only teams we knew fully relying on agents to build all of our code. We all know how that has gone — the world has caught up, but working with agents hasn't been all kittens and rainbows, especially for fast moving teams.
The one thing we've noticed over the last 3 months is that the more you use agents, the more work they create. Dozens of pull requests means older code gets out of date quickly. Documentation drifts. Dependencies become stale. Developers are so focused on pushing out new code that this crucial work falls through the cracks. That's why we pivoted away from agents and invented what we think is the necessary next step for AI powered software development.
Today, we're introducing Daemons: a new product category built for teams dealing with operational drag from agent-created output. Named after the familiar background processes from Linux, Daemons are added to your codebase by adding an .md file to your repo, and run in a set-it-and-forget-it way that will make your lives easier and accelerate any project. For teams that use Claude, Codex, Cursor, Cline, or any other agent, we think you'll really enjoy what Daemons bring to the table.
Comments
Comment by jb_hn 6 hours ago
Comment by simonw 6 hours ago
Comment by rileyt 5 hours ago
compared to routines:
- daemons are specified by a DAEMON.md file in the repo (like skills). it's version-controlled and team-owned, not hidden in a dashboard or linked to a single developers account.
- daemons have a specialized event pipeline that joins similar webhooks events into a single daemon activation and can inject late arriving events into a daemon that's already running (this is key to avoid duplicate work and noisy actions).
- the watch conditions are a more powerful activation method because they use semantic matching and can be mixed with cron schedules.
- daemons have access to the logs from their past runs (and soon proper memory) so they can learn from their own mistakes.
Comment by potter098 6 hours ago
Comment by gogopromptless 2 hours ago
I looked but did not see any facility for collecting/managing evals in the Charlie docs.
Docs drift might sound easy for agents but after working on it at https://promptless.ai for about two years, it's been tricker than just "make some skills". We've got an agent that watches PRs and suggests docs changes. Getting the suggestions good enough that doc owners would actually accept them took a fair bit of evals. Non-ai voice matching existing content, and even "simple" act of deciding whether a given PR warrants a docs change at all.
I have benefited greatly from evals catching things (especially as models change) to the point where I'm loath to go back.
Comment by rybosome 6 hours ago
It’s possible to make naive daemons that stomp on each other (as with a UNIX daemon), but they’re highly responsive to coordination instructions and generally do very well at additive rather than competitive contribution.
Comment by rileyt 5 hours ago
- example daemon files: https://github.com/charlie-labs/daemons
- reference docs: https://docs.charlielabs.ai/daemons
happy to answer questions. all feedback appreciated.
Comment by mrbbk 4 hours ago
Comment by rileyt 4 hours ago
Comment by mrbbk 2 hours ago
Comment by scotth 4 hours ago
It seems like everything is telling me to talk to Charlie to get setup. _How_ do I talk with Charlie?
Comment by scotth 4 hours ago
Comment by rybosome 4 hours ago
Comment by razvanneculai 5 hours ago
Comment by rdme 5 hours ago
Comment by rybosome 5 hours ago
Skills live in the repository, so it felt like a natural complement. It also lets other developers see what the active daemons are and collaborate on them. With proper context, agents are quite good at writing and editing these daemon files too.
Comment by rileyt 5 hours ago
there's details on how other platforms can support it here: https://ai-daemons.com/spec/#provider-guide
Comment by handfuloflight 6 hours ago
Are the two competitive or additive?
Comment by rileyt 6 hours ago
Comment by newsdeskx 6 hours ago
Comment by wolttam 5 hours ago
"Complete non-determinism for everything except the schedule it runs at."
Comment by panosfilianos 6 hours ago
Comment by rybosome 6 hours ago
I’m an eng on the team that built this, in full disclosure.
Comment by Bootvis 5 hours ago
But pardon my ignorance, but one could quite easily roll this themselves? Script the hooks and fire off a headless agent with a hook specific prompt.
Comment by rybosome 5 hours ago
One could build a simple version of this easily - e.g. setup an endpoint that listens for the particular event you are concerned with, and fire off the headless agent with your hook specific prompt - but the amount of work involved to listen for that particular event while filtering out noise and orchestrating the task is actually not trivial.
Plus, that involves writing a lot of code. It's really magical to express all of this in natural language.
For example, this is the YAML frontmatter for a a daemon that keeps a GitHub PR in a mergeable state in the event of CI failures or branch base changes.
---
id: pr-mergeability
purpose: Keep non-draft pull requests mergeable and CI-green without changing PR intent/scope, while staying anchored to one trigger context per run.
watch:
- Branch sync and update events on non-draft PRs.
- Check-status signals on non-draft PRs for checks that affect mergeability.
routines:
- Resolve mechanical merge conflicts when the safe resolution is clear and preserves PR intent/scope.
- 'Apply low-risk mergeability fixes: snapshot updates, lockfile drift fixes, lint autofix, and flaky-test retries when tied to the trigger context.'
- Escalate semantic/intention conflicts between base and branch instead of auto-resolving.
deny:
- When triggered by a check-status signal, do not fix or comment on unrelated failing checks.
- Do not open new pull requests or new issues.
- Do not review, approve, or request changes on pull requests.
- Do not implement review-comment suggestion patches.
- Avoid force-push by default; if force is absolutely required, use `--force-with-lease` only after fresh remote verification.
- Do not make changes beyond mergeability maintenance.
---
Note the lack of any code or required knowledge of GitHub webhooks.Comment by acron0 1 hour ago
I feel like they can. cron and git hooks have existed for a long time.
Comment by briandoll 6 hours ago
> Daemons are self-initiated — they observe the environment, detect drift, and act without a prompt.
Comment by j_gonzalez 4 hours ago
Comment by nexustoken 6 hours ago
Comment by builderminkyu 3 hours ago