Thanks for taking a look. A few notes before you open a PR.
This is a personal project that I share publicly so others can fork it, copy ideas out of it, or adapt it for their own setup. I'm happy to take contributions, but my maintenance time is limited and I will tend to prioritize:
- Fixes that affect me directly.
- Small, self-contained improvements (clear scope, low review cost).
- New sub-agents or transports that follow the existing patterns.
If you have a large idea, please open an issue first so we can talk about scope before you spend time on a PR. Otherwise it's likely to sit.
For anything that's specific to your personal setup — your contacts in
triggers.yaml, your sub-agent allowlist, your scheduled brief times —
fork and customize locally. Don't send a PR back; those choices are
personal by design.
For anything that's structural (a new sub-agent, a bug fix, a new transport, a docs improvement) — PRs welcome.
-
Make sure your branch is based on a recent
main. -
Run the linters and type checker — see
pyproject.tomlfor the exact versions:cd v1 ruff check . ruff format --check . mypy .
-
If you touched the installer or any setup flow, walk through
install.shon a clean checkout and confirm it still works end-to-end. -
If you touched a sub-agent, add or update its entry in
tools/install.pySUBAGENTS(that registry is the source of truth for everything that shows up in the web UI installer and the docs).
Please scrub anything personal before sending a PR. Things to check:
- No real email addresses, phone numbers, or contact names anywhere in code, configs, comments, or commit messages.
- No real API keys, OAuth client secrets, refresh tokens, or session tokens — even in test fixtures.
- No real iMessage chat IDs, Telegram user IDs, Discord/Slack IDs, or Eight Sleep device IDs.
config/triggers.yamland.envare gitignored — keep them that way. If your PR needs new fields, add them toconfig/triggers.yaml.exampleand.env.exampleinstead.
If you're not sure whether something counts as a secret, leave it out and I'll ask if I need it.
- Follow the existing code's shape — match the structure of nearby files rather than introducing new patterns.
- No drive-by refactors mixed with feature changes. One concern per PR.
- Comments explain why, not what. Most code shouldn't need any.
- Match the existing commit message style (short imperative subject; body only if context isn't obvious from the diff).
New sub-agents follow this shape:
mcp_servers/<name>_server.py— the MCP server, one tool per public capability.mcp_servers/<name>_auth.py— only if there's OAuth or token refresh. Cache tokens underdata/.- Entry in
tools/install.pySUBAGENTSwithname,env_vars,install_hint, and anyalways_on/ platform gating. - Registration in
agent_host.pybehind a_has_env(...)or platform check, so the sub-agent only loads when its credentials are present.
The existing sub-agents are the canonical reference.
By contributing, you agree that your contributions will be licensed under
the same MIT License that covers the rest of the project (see LICENSE).