Build a grouped markdown digest of recent signals from the index, with optional HEAD-check link verification. Use on "/brief", "show me the digest", "what's new", "morning brief", "summarize recent signals".
Enrich unenriched scraped articles into structured metadata using parallel sub-agents. Use after scraping, or when the user says "enrich", "/enrich", or "add metadata to the new articles".
Scaffold a signal-loom config in the user's project — driven by a short conversation, then written via `python -m core.init`. Use on "/init", "set up signal-loom", "scaffold a signal-loom config", "first time using signal-loom here".
Run the full signal-loom ingestion loop interactively — scrape configured sources, enrich new articles, rebuild the index. Use on "/pipeline", "refresh sources", "check for new content", "run the pipeline".
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
This plugin requires configuration values that are prompted when the plugin is enabled. Sensitive values are stored in your system keychain.
config_pathAbsolute path to a signal-loom.yaml. Optional — leave empty to use cwd walk-up (signal-loom.yaml in your project root, or a parent).
${user_config.config_path}Turn the sources you already follow into a small, searchable research library and a brief you can read.
Signal Loom watches the feeds, channels, blogs, and listing pages you care about. It saves new items as plain Markdown, asks a model to add useful metadata, validates that metadata, builds a queryable index, and renders a topic-grouped brief.
The intent is simple: keep your information diet out of a black box. Sources, topics, aliases, generated notes, and briefs are all files you can inspect, edit, commit, sync, or point Obsidian/static-site tooling at.
Signal Loom is useful when you have a recurring set of sources and want to know:
It is domain-agnostic. Bring your own sources and your own topic vocabulary: AI, climate, finance, healthcare, policy, local news, research papers, or anything else that works as feeds, channels, pages, or articles.
flowchart LR
Sources["config/sources.yaml<br/>Feeds, channels, pages"] --> Fetch["Fetch + scrape<br/>RSS, YouTube, listings"]
Fetch --> Notes["Markdown notes<br/>content/"]
Notes --> Enrich{"Enrich?"}
Enrich -->|"Codex, Claude, or API"| Metadata["Validated metadata<br/>summary, topics, entities"]
Enrich -->|"--no-enrich"| Index["index.json<br/>Queryable catalog"]
Metadata --> Index
Index --> Brief["Brief<br/>Topic-grouped digest"]
The model is not trusted with the whole system. Python owns the mechanical parts: fetching, writing files, validating model output, normalizing entities, building the index, and rendering briefs. The model only fills bounded enrichment packets, and its response is parsed before anything is written.
content/,
with a JSON index beside it.--no-enrich to prove your
sources before spending on API enrichment.flowchart TB
Core["Python core<br/>scrape, validate, index, brief"]
Codex["Codex plugin<br/>$pipeline, $enrich, $brief"] --> Core
Claude["Claude Code plugin<br/>/pipeline, /enrich, /brief"] --> Core
Headless["Headless Python<br/>python -m core.pipeline"] --> Core
Codex --> CodexModel["Model work in active Codex session<br/>no API key required by Python"]
Claude --> ClaudeModel["Claude interactive path<br/>or Anthropic API for headless enrichment"]
Headless --> ApiModel["Scheduled runs<br/>API enrichment optional"]
| Path | Best for | Model/auth behavior |
|---|---|---|
| Codex plugin | Interactive use in Codex with $pipeline, $enrich, and $brief | Codex does model work through the active session. Python does not read Codex auth files or require API keys for Codex-native enrichment. |
| Claude Code plugin | Interactive use in Claude Code with /pipeline, /enrich, and /brief | Claude sub-agents handle interactive enrichment. |
| Headless Python | Cron, launchd, CI-like checks, or plain local runs | --no-enrich is free. API enrichment uses Anthropic and requires ANTHROPIC_API_KEY. |
The Codex path is the seat-auth path: Python emits bounded work packets,
validates model output, writes frontmatter, and builds the index. Codex itself
does the model work in your active Codex session. The plugin code does not read
~/.codex/auth.json and does not require OPENAI_API_KEY, CODEX_API_KEY, or
ANTHROPIC_API_KEY for Codex-native enrichment.
For local e2e verification from this checkout:
uv run python scripts/codex_plugin_e2e.py
For manual Codex runs, start Codex with API-key variables removed and isolate zsh startup so local shell profiles cannot re-export them:
ZDOTDIR="$(mktemp -d)" \
env -u OPENAI_API_KEY -u CODEX_API_KEY -u ANTHROPIC_API_KEY \
codex exec \
--enable plugins \
--enable hooks \
-c 'forced_login_method="chatgpt"' \
-c 'allow_login_shell=false' \
-c 'shell_environment_policy.experimental_use_profile=false' \
-c 'shell_environment_policy.exclude=["OPENAI_API_KEY","CODEX_API_KEY","ANTHROPIC_API_KEY"]' \
'$pipeline refresh my sources'
Current Codex CLI builds may not fire plugin SessionStart hooks. The runtime
commands still lazy-bootstrap config/*.yaml from examples before use; the e2e
harness records whether hook bootstrap was observed.
npx claudepluginhub dwroblewski/signal-loom --plugin signal-loomUltra-compressed communication mode. Cuts ~75% of tokens while keeping full technical accuracy by speaking like a caveman.
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Curate auto-memory, promote learnings to CLAUDE.md and rules, extract proven patterns into reusable skills.
Comprehensive UI/UX design plugin for mobile (iOS, Android, React Native) and web applications with design systems, accessibility, and modern patterns
Memory compression system for Claude Code - persist context across sessions