daily-hotspots:面向产品构建者的每日商机工作流
DaizeDong/daily-hotspots
daily-hotspots 是一个面向产品构建者的每日商机工作流,从 HackerNews、Product Hunt、X、arXiv、GitHub、reddit 等来源采集证据,仅保留至少 2 个独立来源佐证的信号并确定性打分,单源线索进入标注为“单源未验证”的社区脉搏板块。
A daily business-opportunity workflow for product builders. It collects source evidence, ranks corroborated opportunities, sends a headlines digest to Discord, and preserves the full record in a private archive.
⭐ Design Philosophy
The model proposes candidates and scores; deterministic Python gates check their structure, evidence and thresholds. Signals are merged before counting independent origins, so repeated coverage of one story cannot satisfy the two-origin requirement for a ranked card.
This requirement can exclude early opportunities. Single-origin leads therefore remain in a labeled, unverified community pulse. A quiet day may contain no qualifying opportunity. Durable source and delivery receipts support recovery without counting the same pull twice or resending an uncertain delivery. T1 to T9 tests cover deterministic mechanisms; live access, delivery and business value require separate evidence. See PHILOSOPHY.md.
What it is (and isn't)
daily-hotspots owns the daily cadence, watchlist, cross-day deduplication, scoring, delivery and
private archive. Deep research uses market-intel (scale=standard) or small-cap-deepdive.
The operator applies four routing gates and a daily budget of 3 to 5 deep dives; these delegation
gates are workflow obligations, not Python-enforced admission checks. See the
delegation reference.
How it works (three-tier funnel)
- Tier-0 discovery (cheap, no skill calls): parallel MCP fan-out (HackerNews, Product Hunt,
X/twitterapi, arXiv, GitHub, reddit; GDELT in a subagent), an X KOL roster loop
(
get_user_last_tweetsoverroster.jsonenabled tier-1 handles, low pre-viral faves floor), the niche-community lanes (linux.do / V2EX / CN feeds, RSS/JSON parsing with untrusted-input checks), and a demand lane that mines unmet pain outside tech. Every collected item is untrusted DATA. Normalize entities, merge cross-source, keep only clusters with ≥2 distinct origins; each evidence item carries anorigin_handle/origin_sourceattribution tag. - Score: the model proposes five dims (track_fit / timing / feasibility / competition /
executability) at temperature 0 with anchored samples;
scripts/score.pyaggregates deterministically. Supply and demand cards use different weight vectors, and the aggregation uses six factors; the exact formula lives inreference/scoring.md. - Cross-day dedup + evolution over the
schedule-reminderbase → NEW / SUPPRESS / RESURFACE. - Selective deep-dive (four gates) →
market-intel/small-cap-deepdive. - Verify gate → one daily headlines message → archive:
verify_gate.pyblocks malformed cards, then the day's qualifying cards go out as a single ranked two-column message (the cap applies per column) andarchive.pyappends a quality-gatedopportunities.jsonl. The per-runpulls-YYYY-MM.jsonlyield denominator is written byrun.py --sources, not byarchive.py. - Dual-track output: ≥2-origin scored signals stay opportunity cards; single-origin community
rumors render in a separate lightweight
## 社区脉搏community-pulse section (labeled 单源未验证, capped, no score, no deep-dive) that auto-upgrades to a card if a second origin corroborates the next day. - Daily digest via the Windows Task Scheduler (08:07) plus an idempotent base item. The digest write is atomic and refuses to overwrite a real digest with an empty-day one.
- Weekly signal-yield self-evolve:
run.py --yield --write-reviewreports proposals. Add--applyto prune; the scheduledyield-wrapper.ps1adds it unless-ReportOnlyis selected. Proposed additions still require review. Seereference/roster-evolution.md.
Install
/plugin install github:DaizeDong/daily-hotspots
Or clone manually:
git clone --recurse-submodules https://github.com/DaizeDong/daily-hotspots.git ~/.claude/plugins/daily-hotspotsCreate or clone a separate PRIVATE GitHub companion before running the initializer.
Set DAILY_HOTSPOTS_CONFIG to that clone. Initialization and the doctor require Git and
a fresh PRIVATE visibility receipt accepted by the pinned Guards API. The companion must
already have a committed HEAD. Public, unknown or unversioned destinations are rejected.
Local activation: link skills/daily-hotspots into the skill installation, initialize and
curate the PRIVATE companion, verify readiness, then register the Windows task if scheduled
operation is authorized. Read-only previews can use built-in defaults; runtime writes require
the initialized companion. No monitored accounts are installed by default.
Config
daily-hotspots is config-bearing (Mode B), it reads per-user tuning (watchlist.json) and
per-machine secrets from a separate, private companion repo (daily-hotspots-config). Full
contract: CONFIG.md.
- Mount:
DAILY_HOTSPOTS_CONFIG→DAILY_HOTSPOTS_CONFIG_DIR→ shared Guards discovery.DAILY_HOTSPOTS_DATA_DIRmust belong to the same companion. See CONFIG.md for the exact layout and fallback order. - First time:
python scripts/init_config.py # stamp a conformant skeleton (deterministic) export DAILY_HOTSPOTS_CONFIG=~/.daily-hotspots-config # or pass --out <dir> to init python scripts/verify_config.py # doctor: PASS/FAIL, names what is missing
- Switch configs (hot-swap): point the env var at another config dir, configs are
self-contained, clear or update the DATA override with it:
export DAILY_HOTSPOTS_CONFIG=~/configs/work↔~/configs/personal. - Secrets: the template defaults to Mode B with out-of-band backup. A selected Mode A
policy may version credentials in verified PRIVATE Git; restore from that private history.
Public source never contains credentials. Data-source keys reuse
companion-config; there is no net-new secret, because push egress is the shared Agent Center#hotspotsrelay stream (schedule-reminderrelay.py), not a dedicated bot.
Dependencies (install-and-use)
Install the sibling skills separately before the doctor: market-intel, self-evolve,
schedule-reminder, and small-cap-deepdive. This plugin only installs its own source and
guard/style submodules. Use each sibling repository's installation instructions, then link its
canonical skill directory under the configured skills root (default ~/.claude/skills).
Use the entrypoint directories below when creating links in your client's skill directory:
| Skill | Directory inside its source checkout |
|---|---|
| market-intel | skills/market-intel |
| schedule-reminder | skills/schedule-reminder |
| self-evolve | repository root |
| small-cap-deepdive | repository root |
For example, on Windows, after cloning the dependency, create its junction with
New-Item -ItemType Junction -Path "$HOME/.claude/skills/self-evolve" -Target "$HOME/CodesClaude/self-evolve".
Use your actual checkout location and the corresponding client skill directory.
The doctor checks those directories; it does not install dependencies. Per the source-coverage design (spec §4/§12):
| Skill | Role here |
|---|---|
| market-intel | (a) Tier-1 deep-dive delegate. (b) Source-definition home for the sources it already carries: the X access routes and the CN feeds live in its reference shards and this skill only references them. linux.do and V2EX are the deliberate exception, market-intel does not catalog either, so their definitions are self-contained in reference/collect.md §6. (c) Batch tool orchestration for the roster fan-out. Shares companion-config data-source keys. |
| self-evolve | Methodology frame for the weekly yield engine (methodology constant / signal adaptive / anti-self-deception verify gate). |
| schedule-reminder | Base ledger for cross-day dedup + the weekly yield / roster-review reminder item. |
| small-cap-deepdive | fintech-crypto track deep-dive branch. |
Install-and-use checklist: (1) sibling skills junctioned + reachable; (2) companion-config
data-source keys present (shared); (3) initialize, curate the roster, verify, then run.
The initializer creates an empty runtime roster; add the accounts you choose to monitor.
Quick start
# deterministic tail on prepared candidates (offline preview, no writes / no ledger): python skills/daily-hotspots/scripts/run.py --in candidates.json --dry-run --no-ledger # source-coverage self-evolve: write the pulls-log denominator, then the weekly yield pass: python skills/daily-hotspots/scripts/run.py --sources sources.json # origin-tag + pulls-log (§6) python skills/daily-hotspots/scripts/run.py --yield --write-review # weekly roster self-evolve (§8/§9) # run the acceptance suite: cd skills/daily-hotspots && python -m pytest tests/ -q
In Claude Code, just say "跑一下 daily-hotspots" / "今天有什么前沿商业机会" / "daily opportunity".
Example output
One ranked headlines message per day in a two-column layout: 🎯 需求机会 leads (the quality
column, non-consensus opportunities mined from demand sources, review complaints, job postings, niche
forums, each with a pain quote + evidence link + a crowdedness score), then a compact 📈 供给热点
tail (basic hotspots for breadth). The full digest (every field + all evidence) is committed to
archive/digests/YYYY/YYYY-MM-DD.md. Demand scoring de-emphasizes timing, rewards durable pain, and
penalizes crowdedness; a demand card clears a higher bar, so a thin demand day is honestly empty, no
filler. On a fully quiet day: "今日无合格机会".
Limitations
- Runtime rosters start empty. The generated planner sample has 49 synthetic accounts across six tracks, including six hardware accounts, and is used only for tests. Hardware coverage depends on reviewed accounts and sources; video and vertical hardware forums remain options.
- Source availability is recorded with dated evidence in the
collection reference. Its routes account for
disabled trend-pulse and
get_trends, degraded reddit access, quarantined Brightdata and the duckduckgo prohibition. Recheck current access before relying on historical probe results. - The yield engine remains report-only until it has 7 days of real history, and whenever the
archive numerator cannot be trusted.
run.py --banditorscoring.bandit.enabledenables the optional track bandit and reports its draws; it is off by default, preserving static weights. - Headline egress applies the bounded structured PII scrub described in
push and archive. Its shared Tier1/Tier2
core is kept byte-synchronized with
demand-mining; source content is not redacted at ingest. - Recovery is specific to each operation. Source-batch replay reuses durable pull receipts and advances its cursor once; a successful or uncertain delivery claim prevents another send for the same logical run. Inspect claims, receipts and lock ownership before retrying.
DATA.md defines write admission, the two supported archive layouts, retained replay files, workspace limits and compaction. Scheduling defines handoff and completion checks. A digest file alone does not prove delivery.
Languages
English (README.md, authoritative) · 中文 (README_CN.md)
Roadmap · Contributing · License
See ROADMAP.md · CONTRIBUTING.md · LICENSE (MIT).
来源:GitHub · github.com