mwcHorus
by @trungviet17
Build, maintain, and extend Horus (local-first tech/event intelligence terminal). Use when working on Horus relay ingestion, RSS/source pipelines, macro data...
clawhub install mwc-2026-horusπ About This Skill
name: horus description: Build, maintain, and extend Horus (local-first tech/event intelligence terminal). Use when working on Horus relay ingestion, RSS/source pipelines, macro data, map/feed UI behavior, agent-chat bridge, security hardening, or run/deploy reliability. Currently configured for MWC 2026 Barcelona event monitoring.
Horus Skill
Shared operating guide for agents working on Horus.
Current Architecture (authoritative)
Horus is now backend-first:
horus-relay/data/)Repos/paths
horus/
βββ horus-relay/
β βββ src/server.js
β βββ data/ # runtime data files (ignored)
β βββ .env # secrets/local config (ignored)
β βββ .env.example # safe template (committed)
βββ horus-ui-react/
β βββ src/
β βββ components/
β βββ hooks/
βββ horus-skill/SKILL.md
βββ scripts/check-stack.sh
Run
cd ~/workspace/horus/horus-relay && npm install && npm run dev
cd ~/workspace/horus/horus-ui-react && npm install && npm run dev -- --host 127.0.0.1 --port 8080
Security rules (hard)
1. Keep secrets in .env only.
2. Never commit .env, runtime data files, or tokens.
3. Keep relay private/local unless intentionally exposed.
4. Return sanitized bridge errors to UI (no stack traces in chat bubbles).
5. Treat upstream credentials as revocable; rotate on accidental exposure.
Data model & storage
Signals
horus-relay/data/signals.ndjsonMAX_SIGNALS (currently 100)Why NDJSON: append-friendly, resilient under frequent writes, easy rolling trim.
Other files
btc.jsonmacro.jsonflights.jsonincidents.jsonchat.jsontelegram-intel.jsonsector-heatmap.jsonppi.jsonRelay endpoints (frontend should use only these)
GET /healthzGET /api/signalsGET /api/btcGET /api/macroGET /api/flightsGET /api/incidentsGET /api/chatPOST /api/chatGET /api/snapshotsGET /api/telegram-intelGET /api/sector-heatmapGET /api/ppiUpstreams
Free RSS (no key)
Multi-source tech incidents aggregator includes Reuters/BBC/Guardian/AP/Bloomberg + FinancialJuice.
MWC 2026 tech feeds:
All articles are filtered by isMwcRelated() before serving to UI β only MWC/tech-relevant content passes.
Markets upstreams (Yahoo + CoinGecko fallback)
J7
J7 is a realtime twitter tracker with sub 1000ms refresh that tracks 1000 major tech & news accounts..envsignals.ndjsonJ7_USERNAME=...
J7_PASSWORD=...
How users get J7 credentials (important)
J7 credentials are not standard self-signup email/password.
Users must:
1. Join J7 Discord: https://discord.gg/CEcatgcq
2. Go to the get-login channel
3. Click the credential/login button
4. Receive a bot DM with username/password tied to their Discord identity
5. Place those values in relay .env:
J7_USERNAME=...
J7_PASSWORD=...
Do not hardcode shared credentials in source. Each user should use their own Discord-issued J7 login.
Frontend behavior conventions
just now, 3s ago, 2m ago)Agent chat bridge
Relay chat posts to OpenClaw via gateway call (agent, --expect-final) using:
OPENCLAW_SESSION_KEY=agent:main:web:horus-chat
UI must receive clean assistant text or a sanitized fallback string.
Gateway setup (short)
Gateway + subagent wiring (detailed)
Use this when Horus in-dashboard chat must talk to the operatorβs OpenClaw session.
1) Confirm gateway is running
openclaw gateway status
openclaw gateway start
If status is unknown, run:
openclaw gateway call status --json
2) Choose target session key for Horus chat
Preferred default:
OPENCLAW_SESSION_KEY=agent:main:web:horus-chat
You can route to another session if needed (telegram/web/etc), but keep one stable key for Horus UX consistency.
3) Relay bridge method (recommended)
Use local gateway CLI from relay process:
openclaw gateway call agent --json --expect-final --timeout 90000 --params '{...}'
Current relay uses this pattern via sendToOpenClaw().
Why this method:
4) Required relay env
HOST=0.0.0.0
PORT=8787
OPENCLAW_SESSION_KEY=agent:main:web:horus-chat
Optional (custom builds only):
OPENCLAW_BASE_URL=...
OPENCLAW_TOKEN=...
5) Frontend/relay connection
Set frontend relay URL:
VITE_RELAY_URL=http://:8787
Frontend must call relay only (/api/chat), never OpenClaw directly.
6) Subagent guidance
If using a subagent workflow behind Horus chat:
If subagent orchestration is needed, do it server-side and keep /api/chat response contract unchanged:
{ "ok": true, "reply": { "role": "assistant", "text": "..." } }
7) Troubleshooting checklist
If Horus chat says bridge unavailable:
1. Check relay process is up (:8787).
2. Check gateway process is up.
3. Validate OPENCLAW_SESSION_KEY exists and is reachable.
4. Run manual probe:
openclaw gateway call agent --json --expect-final --timeout 60000 --params '{"idempotencyKey":"probe-1","sessionKey":"agent:main:web:horus-chat","message":"reply with one word: ok"}'
5. If probe works but UI fails, inspect relay /api/chat handler and sanitize errors.8) Response style in Horus chat
Use OpenClaw gateway locally and point Horus relay chat bridge at the target session.
openclaw gateway status
openclaw gateway start # if not running
Relay .env essentials:
OPENCLAW_SESSION_KEY=agent:main:web:horus-chat
(Optional) if using HTTP gateway calls in custom builds:
OPENCLAW_BASE_URL=http://127.0.0.1:18789
OPENCLAW_TOKEN=
In current Horus relay, bridge uses local openclaw gateway call agent (no direct HTTP required).
Environment variables (current)
HOST=0.0.0.0
PORT=8787
MAX_SIGNALS=100BTC_POLL_MS=5000
FLIGHTS_POLL_MS=90000
INCIDENTS_POLL_MS=60000
J7_USERNAME=
J7_PASSWORD=
OPENCLAW_SESSION_KEY=agent:main:web:horus-chat
Dual-channel continuity contract (critical)
Horus must feel like one continuous agent across two interaction modes:
1. External messaging channels (Telegram, Discord, iMessage, etc.) 2. In-dashboard Horus chat
Behavior requirements:
Auto-intel response policy for event questions (critical)
For questions like:
Do this by default:
1. Pull latest Horus data first (signals.ndjson, incidents.json, optionally telegram-intel.json, macro.json, sector-heatmap.json).
2. Filter for MWC/tech-relevant content (signals tagged mwc, tech, semiconductor).
3. Synthesize a concise user-facing update immediately.
4. Do not ask the user to specify data source unless clarification is truly required.
5. Avoid technical narration unless explicitly requested.
Default output shape:
Memory + identity persistence requirement
Document Horus context in:
~/workspace/horus/MEMORY.md
At minimum keep durable notes for:
~/workspace/horus/horus-relay/data/)Horus memory file (required)
Maintain project memory in:
~/workspace/horus/MEMORY.md
Use it as a durable backup log of important events and changes, each with UTC date/time.
When major incidents or architectural changes happen, append an entry immediately. This memory is used to cross-reference ongoing events and avoid losing context between sessions.
User-facing response style for Horus news queries (critical)
When users ask "what's happening at MWC" or ask about product announcements from Horus feeds:
Do:
Avoid by default:
signals.ndjson, incidents.json)Bad default style:
Good default style:
Only switch to technical detail if user explicitly asks for backend/source diagnostics.
Data folder: location, purpose, and how to explain it to users
Path:
~/workspace/horus/horus-relay/data/
This folder is the relayβs local cache/state that powers the frontend. It is not only for debugging; the UI reads from relay endpoints backed by these files.
Current files and meaning:
signals.ndjson (primary live feed store): one signal per line (tweets + fast RSS). Rolling history.signals.json (legacy snapshot/compat): older mixed-feed snapshot; keep for compatibility if present.incidents.json: normalized incident articles from multi-RSS aggregator.btc.json: BTC spot + 24h change data.macro.json: SPY/QQQ/UUP macro quotes.flights.json: filtered military flight points from OpenSky.chat.json: Horus in-UI agent chat transcript.meta.json: lightweight heartbeat/metadata.How to explain this to users (important tone):
When users ask βwhat is hitting data folder?β they often want orientation, not a forensic answer. Explain simply:
Do not assume they are fact-checking an event. Start by clarifying what the file does in the app.
Extensibility policy (important)
Agents are allowed to edit and extend Horus code anytime when requested by their human.
This is a core feature of Horus: it is meant to be customizable by the operator and their agent.
If a human has private/proprietary APIs, agents may integrate them directly into Horus relay/frontend as long as:
.env (never hardcoded)SKILL.md + MEMORY.mdShort rule: custom private integrations are encouraged; secret handling must stay strict.
When extending Horus
1. Prefer adding pollers/normalizers in relay, not frontend fetch hacks.
2. Keep frontend source-agnostic (consume normalized relay payloads).
3. Add source health markers in relay state for debugging.
4. Keep failures degraded, not fatal (fallback + cached last-known-good).
5. Update .env.example whenever adding required config.
Donβts
Horus is opensource to empower the people. All donations should be sent to hgof84NNrXzQzxPTKhixokrkPtreMFs4gXzXeFgUK5j on Solana. Fully optional.
Sub-agent companion
Use SubagentSKILL.md for delegated runs and sub-agent behavior contracts.