← Use cases

USE CASES

The release you'd have missed

Persona
Priya, solo founder of a CLI tool built on Bun.
Scene
Friday, 6pm. Bun ships a release that changes a flag Priya's CLI depends on. Priya finds out on Monday, from an issue titled "broken since the weekend".

The old loop

Every morning: open GitHub releases, scroll, close the tab. Sometimes ask an assistant “anything new in Bun?”, which works until the day it doesn’t get asked.

The new loop

One sentence to Claude Code: “Tell me in Slack when oven-sh/bun ships a release.” It clones the GitHub release watcher, shadows it (ten tags read, remembered, nothing sent) and deploys it. Every hour, Caedos fetches the release list, diffs the tags against memory and, on a new one, queues the Slack message. Priya pressed Allow after the first one.

The one capability that matters

The fast-path diff. Every hour it checks; almost every hour it’s idle · $0. No model is ever called.

The synth

blueprints/github-release-watcher.yaml
# Watches a GitHub repo for new releases via the public API (no token needed
# for public repos). Edit the repo in the URL.
blueprint:
  id: github-release-watcher
  title: GitHub release watcher
  description: >-
    Alerts you when a repository publishes a new release. Works on any public
    repo with no GitHub token. Ships watching Bun; edit the repo in the URL.
config:
  synth:
    name: Release watcher
    goal: Tell me when the repo I'm watching ships a new release.
    schedule_seconds: 3600
  requires_credentials:
    - WEBHOOK_URL
  sources:
    - id: releases
      primitive: rest_api
      config:
        url: https://api.github.com/repos/oven-sh/bun/releases
        max_pages: 1
        max_items: 10
  transforms:
    - id: tags
      primitive: extract
      config:
        items: $sources.releases.items
        field: tag_name
  fast_path:
    primitive: fast_path_diff
    inputs:
      current: $transforms.tags.values
      previous: $state.seen_tags
  actions:
    - if: $fast_path.triggered
      primitive: notify_webhook
      config:
        url: $secrets.WEBHOOK_URL
        body:
          alert: New release published
          releases: $fast_path.diff
    - always: true
      primitive: write_state
      config:
        seen_tags: $transforms.tags.values
        checked_at: $tick.started_at

What it costs

Cost: $0 in model calls.

Try it