15 comments

  • rileyt 17 minutes ago

    here are a few more resources:

    - example daemon files: https://github.com/charlie-labs/daemons

    - reference docs: https://docs.charlielabs.ai/daemons

    happy to answer questions. all feedback appreciated.

  • potter098 an hour ago

    The drift detection angle is interesting. I'd be curious how you handle cases where two daemons touch related files — is there a way to declare ordering constraints in the .md file, or do they run in isolated branches?

    • rybosome an hour ago

      Each daemon runs in its own isolate, but the output is typically shared state; eg multiple daemons contribute to the same PR from separate container runtimes.

      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.

  • razvanneculai 17 minutes ago

    Looks pretty interesting, will try it out and give you feedback! keep up the good work.

  • jb_hn 44 minutes ago

    Looks really interesting -- quick question though: how does this differ from hooks (e.g., https://code.claude.com/docs/en/hooks)?

    • simonw 36 minutes ago

      Looks more similar to routines for me (just launched the other day): https://code.claude.com/docs/en/routines

      • rileyt 22 minutes ago

        simonw is right, daemons are closer to routines.

        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.

  • newsdeskx 32 minutes ago

    the hook model is event-driven - something happens, hook fires. daemons sound like they're proposing a different mental model where you have persistent processes that observe and react. the difference is the same as cron vs a running service. both work but the daemon approach makes sense when you need stateful observation across multiple events rather than just per-action triggers

  • handfuloflight an hour ago

    How does this compare to OpenProse, it looks similar? https://openprose.ai/

    Are the two competitive or additive?

    • rileyt an hour ago

      hadn't seen this before, but it looks like the daemon schedules and watch conditions could be helpful for activating openprose contracts.

  • panosfilianos an hour ago

    Why couldn't these just be callable skills?

    • rybosome an hour ago

      Callable skills can’t activate on a schedule or listen for events. Making a daemon which invokes other callable skills is a great use case!

      I’m an eng on the team that built this, in full disclosure.

      • Bootvis 14 minutes ago

        I do really like the idea.

        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.

        • rybosome 6 minutes ago

          Very fair question.

          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.
    • briandoll an hour ago

      Daemons are autonomous. From the site:

      > Daemons are self-initiated — they observe the environment, detect drift, and act without a prompt.