Background intelligence that evolves with you.
Autonomous agent on GitHub Actions, powered by Claude Code. 51 skills across research, dev tooling, crypto monitoring, and productivity — all off by default, enable what you need.
OpenClaw is great if you need real-time responses and have infra to run it on. Aeon is for everything else:
- Cheaper — runs on GitHub Actions, free for public repos, ~$2/mo otherwise. No server.
- Built for background tasks — digests, monitoring, research, writing. You don't need sub-second latency for any of that.
- Doesn't break — no daemon to crash, no process to restart. If GitHub Actions is up, Aeon is up. Failed skill? Next cron tick retries it.
- 5-minute setup — fork, add secrets, flip skills on. No Docker, no self-hosting, no config files beyond one YAML.
git clone https://github.com/aaronjmars/aeon
cd aeon && ./aeonClick on http://localhost:5555 to open the dashboard in your browser. From there:
- Authenticate — add your Claude API key or OAuth token
- Add a channel — set up Telegram, Discord, or Slack so Aeon can talk to you (and you can talk back)
- Pick skills — toggle on what you want, set a schedule, and optionally set a
varto focus each skill - Push — one click commits and pushes your config to GitHub, Actions takes it from there
You can also schedule and trigger skills by messaging Aeon directly on Telegram — just tell it what you want.
Set one of these — not both:
| Secret | What it is | Billing |
|---|---|---|
CLAUDE_CODE_OAUTH_TOKEN |
OAuth token from your Claude Pro/Max subscription | Included in plan |
ANTHROPIC_API_KEY |
API key from console.anthropic.com | Pay per token |
Getting an OAuth token:
claude setup-token # opens browser → prints sk-ant-oat01-... (valid 1 year)| Skill | Description |
|---|---|
article |
Research trending topics and write a publication-ready article |
digest |
Generate and send a daily digest on a configurable topic |
rss-digest |
Fetch, summarize, and deliver RSS feed highlights |
hacker-news-digest |
Top HN stories filtered by keywords relevant to your interests |
hn-digest |
Top Hacker News stories filtered by interests |
paper-digest |
Find and summarize new papers matching tracked research interests |
paper-pick |
Find the one paper you should read today from Semantic Scholar and arXiv |
tweet-digest |
Aggregate and summarize tweets from tracked accounts |
list-digest |
Top tweets from tracked X lists in the past 24 hours |
research-brief |
Deep dive on a topic combining web search, papers, and synthesis |
fetch-tweets |
Search X/Twitter for tweets by keyword, username, or both |
search-papers |
Search for recent academic papers on topics of interest |
reddit-digest |
Fetch and summarize top Reddit posts from tracked subreddits |
security-digest |
Monitor recent security advisories from GitHub Advisory DB |
| Skill | Description |
|---|---|
pr-review |
Auto-review open PRs on watched repos and post summary comments |
github-monitor |
Watch repos for stale PRs, new issues, and new releases |
github-issues |
Check all your repos for new open issues in the last 24 hours |
issue-triage |
Label and prioritize new GitHub issues on watched repos |
changelog |
Generate a changelog from recent commits across watched repos |
code-health |
Weekly report on TODOs, dead code, and test coverage gaps |
feature |
Build new features from GitHub issues or improve the agent |
build-skill |
Design and build a new reusable skill |
search-skill |
Search the open agent skills ecosystem for useful skills to install |
| Skill | Description |
|---|---|
token-alert |
Notify on price or volume anomalies for tracked tokens |
token-movers |
Top 10 token winners and losers by 24h price change from CoinGecko |
trending-coins |
Top trending and most searched coins on CoinGecko |
wallet-digest |
Summarize recent wallet activity across tracked addresses |
on-chain-monitor |
Monitor blockchain addresses and contracts for notable activity |
defi-monitor |
Check pool health, positions, and yield rates for tracked protocols |
defi-overview |
Daily overview of DeFi activity from DeFiLlama — TVL, top chains, top protocols |
polymarket |
Trending and top markets on Polymarket — volume, new markets, biggest movers |
polymarket-comments |
Top trending Polymarket markets and most interesting comments |
| Skill | Description |
|---|---|
write-tweet |
Generate 10 tweet drafts across 5 size tiers on a topic from today's outputs |
reply-maker |
Generate two reply options for 5 tweets from tracked accounts or topics |
refresh-x |
Fetch a tracked X/Twitter account's latest tweets and save the gist to memory |
| Skill | Description |
|---|---|
morning-brief |
Aggregated daily briefing — digests, priorities, and what's ahead |
daily-routine |
Morning briefing combining token movers, tweet roundup, paper pick, GitHub issues, and HN digest |
weekly-review |
Synthesize the week's logs into a structured retrospective |
goal-tracker |
Compare current progress against goals stored in MEMORY.md |
idea-capture |
Quick note capture triggered via Telegram — stores to memory |
action-converter |
5 concrete real-life actions for today based on recent signals and memory |
startup-idea |
2 startup ideas tailored to your skills, interests, and context |
| Skill | Description |
|---|---|
heartbeat |
Proactive ambient check — surface anything worth attention |
memory-flush |
Promote important recent log entries into MEMORY.md |
reflect |
Review recent activity, consolidate memory, and prune stale entries |
skill-health |
Check which scheduled skills haven't run recently |
self-review |
Weekly audit of what Aeon did, what failed, and what to improve |
rss-feed |
Generate an Atom XML feed from articles in the repo |
update-gallery |
Sync articles to the GitHub Pages gallery with Jekyll frontmatter |
Aeon publishes articles to a browsable gallery via GitHub Pages. After merging, enable it in Settings → Pages → source Deploy from a branch, branch main, folder /docs.
The gallery will be live at https://<username>.github.io/aeon.
The update-gallery skill syncs articles/*.md → docs/_posts/ with proper Jekyll frontmatter on a weekly schedule. Enable it in aeon.yml to keep the gallery up to date automatically.
Subscribe to Aeon's article output via Atom feed:
https://raw.githubusercontent.com/<owner>/<repo>/main/articles/feed.xml
Add this URL to any RSS reader (Feedly, Miniflux, NetNewsWire, etc.) to get new articles as they're published. The feed is regenerated daily or after each content-generating skill runs.
The only skill enabled by default. Runs every 3 hours as a fallback catch-all.
Every run: reads recent memory and logs, checks for stalled PRs (>24h), flagged memory items, urgent issues, and skills that haven't run on schedule. Deduplicates against the last 48h of logs — it won't re-notify you about something it already flagged.
Nothing to report → logs HEARTBEAT_OK, exits, no commit. Something needs attention → sends a concise notification.
Heartbeat is listed last in aeon.yml so it only runs when no other skill claims the slot.
All scheduling lives in aeon.yml:
skills:
article:
enabled: true # flip to activate
schedule: "0 8 * * *" # daily at 8am UTC
digest:
enabled: true
schedule: "0 14 * * *"
var: "solana" # topic for this skillStandard cron format. All times UTC. Supports *, */N, exact values, comma lists.
Order matters — the scheduler picks the first matching skill. Put day-specific skills (e.g. Monday-only) before daily ones. Heartbeat goes last.
Every skill accepts a single var — a universal input that each skill interprets in its own way:
| Skill type | What var does |
Example |
|---|---|---|
| Research & content | Sets the topic | var: "rust" → digest about Rust |
| Dev & code | Narrows to a repo | var: "owner/repo" → only review that repo's PRs |
| Crypto | Focuses on a token/wallet | var: "solana" → only check SOL price |
| Productivity | Sets the focus area | var: "shipping v2" → morning brief emphasizes v2 |
If var is empty, each skill falls back to its default behavior (scan everything, auto-pick topics, etc.). Set it from the dashboard or pass it when triggering manually.
The default model for all skills is set in aeon.yml:
model: claude-opus-4-6You can change it from the dashboard header dropdown. Options: claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5-20251001. Per-run overrides are also available via workflow dispatch.
Edit .github/workflows/messages.yml:
schedule:
- cron: '*/5 * * * *' # every 5 min (default)
- cron: '*/15 * * * *' # every 15 min (saves Actions minutes)
- cron: '0 * * * *' # hourly (most conservative)Claude only installs and runs when a skill actually matches.
| Scenario | Cost |
|---|---|
| No skill matched (most ticks) | ~10s — checkout + bash + exit |
| Skill runs | 2–10 min depending on complexity |
| Heartbeat (nothing found) | ~2 min |
| Public repo | Unlimited free minutes |
To reduce usage: switch to */15 or hourly cron, disable unused skills, keep the repo public.
| Plan | Free minutes/mo | Overage |
|---|---|---|
| Free | 2,000 | N/A (private only) |
| Pro / Team | 3,000 | $0.008/min |
Set the secret → channel activates. No code changes needed.
| Channel | Outbound | Inbound |
|---|---|---|
| Telegram | TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID |
Same |
| Discord | DISCORD_WEBHOOK_URL |
DISCORD_BOT_TOKEN + DISCORD_CHANNEL_ID |
| Slack | SLACK_WEBHOOK_URL |
SLACK_BOT_TOKEN + SLACK_CHANNEL_ID |
Telegram: Create a bot with @BotFather → get token + chat ID.
Discord: Outbound: Channel → Integrations → Webhooks → Create. Inbound: discord.com/developers → bot → add channels:history scope → copy token + channel ID.
Slack: api.slack.com → Create App → Incoming Webhooks → install → copy URL. Inbound: add channels:history, reactions:write scopes → copy bot token + channel ID.
Default polling has up to 5-min delay. Deploy this ~20-line Cloudflare Worker for ~1s response:
export default {
async fetch(request, env) {
const { message } = await request.json();
if (!message?.text || String(message.chat.id) !== env.TELEGRAM_CHAT_ID)
return new Response("ignored");
// Advance offset so polling doesn't reprocess
await fetch(`https://api.telegram.org/bot${env.TELEGRAM_BOT_TOKEN}/getUpdates?offset=${message.update_id + 1}`);
// Trigger GitHub Actions immediately
await fetch(`https://api.github.com/repos/${env.GITHUB_REPO}/dispatches`, {
method: "POST",
headers: { Authorization: `token ${env.GITHUB_TOKEN}`, Accept: "application/vnd.github.v3+json" },
body: JSON.stringify({ event_type: "telegram-message", client_payload: { message: message.text } }),
});
return new Response("ok");
},
};Set env vars (TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, GITHUB_REPO, GITHUB_TOKEN) in Cloudflare dashboard, then point your bot's webhook at the worker URL.
The built-in GITHUB_TOKEN is scoped to this repo only. For github-monitor, pr-review, issue-triage, and feature to work on your other repos, add a GH_GLOBAL personal access token.
GITHUB_TOKEN |
GH_GLOBAL |
|
|---|---|---|
| Scope | This repo | Any repo you grant |
| Created by | GitHub (automatic) | You (manual) |
| Lifetime | Job duration | Up to 1 year |
Setup: github.com/settings/tokens → Fine-grained → set repo access → grant Contents, Pull requests, Issues (all read/write) → add as GH_GLOBAL secret.
Skills use GH_GLOBAL when available, fall back to GITHUB_TOKEN automatically.
./add-skill BankrBot/skills --list # browse a repo's skills
./add-skill BankrBot/skills bankr hydrex # install specific skills
./add-skill BankrBot/skills --all # install everythingOr discover programmatically:
npx skills find "crypto trading"Installed skills land in skills/ and are added to aeon.yml disabled. Flip enabled: true to activate.
Every skill in this repo is independently installable. Browse the full catalog in skills.json or use the CLI:
# Install a single skill
./add-skill aaronjmars/aeon token-alert
# Install multiple skills
./add-skill aaronjmars/aeon token-alert polymarket hn-digest
# Install everything
./add-skill aaronjmars/aeon --all
# Browse available skills
./add-skill aaronjmars/aeon --listPackage any skill as a standalone directory (with a generated README) for sharing:
./export-skill token-alert # exports to ./exports/token-alert/
./export-skill token-alert --tar # also creates a .tar.gz archive
./export-skill --list # list all exportable skillsLabel any GitHub issue ai-build → workflow fires → Claude reads the issue, implements it, opens a PR.
Don't need the full agent? Grab individual workflow templates and drop them into any repo. These work with GitHub Agentic Workflows — plain Markdown files in .github/workflows/ that run with any supported agent engine.
| Template | What it does | Trigger |
|---|---|---|
| issue-triage.md | Auto-label and prioritize new issues | On issue opened |
| pr-review.md | Review PRs for bugs, security, and quality | On PR opened/updated |
| changelog.md | Categorized changelog from recent commits | Weekly |
| security-digest.md | Monitor advisories for your dependencies | Daily |
| code-health.md | Audit TODOs, dead code, test gaps | Weekly |
# Copy a template into your repo
curl -O https://raw.githubusercontent.com/aaronjmars/aeon/main/workflows/pr-review.md
mv pr-review.md .github/workflows/
git add .github/workflows/pr-review.md && git commit -m "Add PR review workflow"Each template is self-contained Markdown — edit the trigger, criteria, or format to fit your project. See workflows/README.md for details.
By default Aeon has no personality. To make it write and respond like you, add a soul:
- Fork soul.md and fill in your files:
SOUL.md— identity, worldview, opinions, interestsSTYLE.md— voice, sentence patterns, vocabulary, toneexamples/good-outputs.md— 10–20 calibration samples
- Copy into your Aeon repo under
soul/ - Add to the top of
CLAUDE.md:
## Identity
Read and internalize before every task:
- `soul/SOUL.md` — identity and worldview
- `soul/STYLE.md` — voice and communication patterns
- `soul/examples.md` — calibration examples
Embody this identity in all output. Never hedge with "as an AI."Every skill reads CLAUDE.md, so identity propagates automatically.
Quality check: soul files work when they're specific enough to be wrong. "I think most AI safety discourse is galaxy-brained cope" is useful. "I have nuanced views on AI safety" is not.
CLAUDE.md ← agent identity (auto-loaded by Claude Code)
aeon.yml ← skill schedules + enabled flags
skills.json ← machine-readable skill catalog (51 skills)
./notify ← multi-channel notifications
./add-skill ← import skills from GitHub repos
./export-skill ← package skills for standalone distribution
./generate-skills-json ← regenerate skills.json from SKILL.md files
docs/ ← GitHub Pages gallery (Jekyll)
soul/ ← optional identity files
skills/ ← each skill is SKILL.md (Agent Skills format)
article/
digest/
heartbeat/
... ← 51 skills total
workflows/ ← GitHub Agentic Workflow templates (.md)
memory/
MEMORY.md ← goals, active topics, pointers
topics/ ← detailed notes by topic
logs/ ← daily activity logs (YYYY-MM-DD.md)
dashboard/ ← local web UI
.github/workflows/
aeon.yml ← skill runner (workflow_dispatch, issues)
messages.yml ← message polling + scheduler (cron)
This repo is a public template. Run your own instance as a private fork so memory, articles, and API keys stay private.
# Pull template updates into your private fork
git remote add upstream https://github.com/aaronjmars/aeon.git
git fetch upstream
git merge upstream/main --no-editYour memory/, articles/, and personal config won't conflict — they're in files that don't exist in the template.
Messages not being picked up?
GitHub has two requirements for scheduled workflows:
- The workflow file must be on the default branch — crons on feature branches don't fire.
- The repo must have recent activity — GitHub disables crons on repos with no commits in 60 days. New template forks need one manual trigger to activate.
Fix: Actions → Messages → Run workflow (manual trigger). After that, the cron activates automatically.
Support the project : 0xbf8e8f0e8866a7052f948c16508644347c57aba3