SignalScope is a config-driven competitive intelligence backend and reviewer-facing dashboard for tracking public signals across organizations, products, networks, initiatives, and open-source projects.
The default demo dataset is based on Blockstream and related competitors/comparables, but the architecture stays generic: another team should be able to replace the tracked entity set through configuration rather than application rewrites.
SignalScope already delivers a working prototype across the three assignment layers:
- Data ingestion
- modular fetchers for GitHub, query-based news RSS, and changelog sources
- Storage and processing
- SQLite persistence, repeated-run history, deterministic one-shot scheduling, alert materialization, and candidate suggestion persistence
- Reviewer-facing delivery
- a local dashboard for scanning the watchlist, reviewing surfaced changes, comparing entities quickly, checking recent signal evidence, and running refresh actions without reading SQLite directly
Important honesty note:
- the current dashboard is a reviewer MVP, not a fully expanded multi-page product
- drill-down pages, richer compare workflows, and a public read-only API remain future work
- the current scheduler is deterministic one-shot execution, not a long-running daemon
Blockstream operates across multiple verticals:
- hardware wallet
- software wallet
- sidechain / L2 infrastructure
- custody
- research
- satellite distribution
- open-source developer tooling
Tracking the competitive landscape across those areas manually is fragmented and time-consuming. SignalScope provides one persisted workspace for:
- who matters right now
- what changed recently
- where to focus next
- how trustworthy the current source coverage is
The current main branch implements a backend-processing baseline plus a reviewer dashboard MVP.
- typed JSON config-pack loading with strict unknown-field rejection
- cross-file validation for entities, sources, bindings, alerts, and schedules
fetchruntime by source kind, with optional binding narrowing- source fetchers for:
- GitHub
- query-based news RSS
- changelog RSS and GitHub releases
- optional
GITHUB_TOKENsupport for GitHub-backed requests - deterministic fixture-based and end-to-end tests without live-network CI dependencies
- SQLite bootstrap with embedded migrations
- catalog/config persistence for:
datasetsentitiesrelationshipssourcesbindingsalert_rulesschedule_jobs
- observation persistence for:
fetch_runsmetric_snapshotscontent_items
- processing persistence for:
schedule_runsalert_eventscandidate_suggestions
- repeated same-DB history preservation across fetch runs
- deterministic one-shot scheduler execution for due jobs
- persisted
schedule_runs - alert evaluation over stored history
- persisted
alert_events - candidate discovery from repeated news co-mentions
- persisted
candidate_suggestions
- local
servemode - overview-first reviewer workspace
- market radar table with search, sorting, filtering, and quick compare
- review queue for alerts and candidate suggestions
- recent signals feed with clickable source links
- source health panel
- action center for:
- scheduled refresh + alert processing
- manual GitHub sync
- manual news sync
- manual changelog sync
The following areas remain out of scope for the current prototype:
- app-store fetchers
- social fetchers
- owner-scoped
github.contributorsaggregation - long-running scheduler daemon/process manager behavior
- multi-page dashboard navigation and richer drill-down flows
- dedicated entity detail pages
- dedicated compare page with arbitrary URL-based selection
- a public read-only HTTP API surface beyond the internal dashboard action endpoint
- advanced NLP/entity resolution beyond deterministic heuristics
- Config-driven by default Tracked entities, bindings, schedules, and alert rules come from external configuration.
- Generic model The system supports organizations, products, networks, initiatives, benchmark groups, and open-source projects.
- Persist before present UI and later API work read SQLite state rather than live upstream responses.
- Single-binary deployment No separate frontend build step is required for the current reviewer dashboard.
- Honest scope reporting The repository should describe what is shipped now, not future intent.
- Reviewer usability over backend opacity The dashboard should help a non-technical reviewer understand what changed without opening the database manually.
- Go toolchain matching
go.mod - Python 3 for repository hygiene scripts
- optional
sqlite3CLI for direct table inspection - optional
GITHUB_TOKENfor better GitHub API rate-limit headroom
GitHub-backed requests work without authentication, but anonymous rate limits are easy to hit during manual review.
export GITHUB_TOKEN=<optional-token>For evaluation purposes, this repository includes a pre-populated SQLite database (data.db). This allows reviewers to immediately see the dashboard populated with historical data and candidates, without needing to run the ingestion fetchers manually.
To launch the dashboard using this pre-populated database, simply run:
go run ./cmd/signalscope serve --config configs/demo/blockstream --db data.dbgo run ./cmd/signalscope check-config --config configs/demo/blockstreamgo run ./cmd/signalscope seed-demo --config configs/demo/blockstream --db /tmp/signalscope-demo.dbgo run ./cmd/signalscope fetch --config configs/demo/blockstream --db /tmp/signalscope-demo.db --source github
go run ./cmd/signalscope fetch --config configs/demo/blockstream --db /tmp/signalscope-demo.db --source news_rss
go run ./cmd/signalscope fetch --config configs/demo/blockstream --db /tmp/signalscope-demo.db --source changeloggo run ./cmd/signalscope schedule --config configs/demo/blockstream --db /tmp/signalscope-demo.dbThis will:
- execute due schedule jobs
- persist
schedule_runs - evaluate alerts from stored evidence
- persist
alert_events - update
candidate_suggestions
go run ./cmd/signalscope serve --config configs/demo/blockstream --db /tmp/signalscope-demo.dbOpen:
http://localhost:8080
For the strongest end-to-end walkthrough, use one database path and keep accumulating history in it.
go run ./cmd/signalscope check-config --config configs/demo/blockstream
go run ./cmd/signalscope seed-demo --config configs/demo/blockstream --db /tmp/signalscope-review.db
go run ./cmd/signalscope fetch --config configs/demo/blockstream --db /tmp/signalscope-review.db --source news_rss
go run ./cmd/signalscope fetch --config configs/demo/blockstream --db /tmp/signalscope-review.db --source changelog
go run ./cmd/signalscope fetch --config configs/demo/blockstream --db /tmp/signalscope-review.db --source github
go run ./cmd/signalscope schedule --config configs/demo/blockstream --db /tmp/signalscope-review.db
go run ./cmd/signalscope serve --config configs/demo/blockstream --db /tmp/signalscope-review.dbInside the dashboard:
- start with the Review queue
- scan the Market radar
- pin two names in Quick compare
- inspect Recent signals
- confirm Source health
- optionally use Action center to refresh data live
The review queue is the shortest path to user value.
It surfaces:
- alerts meaningful changes detected from stored history
- candidates names that appear repeatedly near tracked entities in news and may deserve manual watchlist review
The market radar is the main scan surface. It supports:
- search by name, kind, or vertical
- type filters
- sorting by:
- smart priority
- latest activity
- signal coverage
- recent engineering
- GitHub stars
- name
- quick left/right compare selection
The recent signals panel shows the latest stored content items, including:
- source family
- content type
- entity
- timestamp
- direct external link when available
Source health should be checked before trusting flat or missing metrics.
States are interpreted as:
- Healthy recent runs look stable
- Watch some runs failed or the source has not been exercised yet
- Degraded recent fetches failed consistently
- Planned source family is reserved but not enabled in the current demo
The dashboard exposes an internal action endpoint for reviewer convenience.
Recommended first action:
- Refresh due sources + update review queue
Advanced manual actions:
- GitHub only
- News only
- Changelog only
Important note:
- this internal
/api/actionendpoint exists only for the local reviewer dashboard - it is not the public API surface planned for later milestones
| Command | Purpose | Status |
|---|---|---|
check-config |
load and validate a config pack | implemented |
seed-demo |
create a clean SQLite baseline from the selected pack | implemented |
fetch |
run ingestion for one source kind | implemented |
schedule |
run deterministic one-shot scheduler execution and processing | implemented |
serve |
run the reviewer dashboard on localhost:8080 |
implemented |
fetch --sourceselects by canonical source kind, not config source ID- repeated
fetchruns against the same SQLite path preserve prior observation history seed-demois the explicit reset/bootstrap path when a clean dataset is desiredfetchreturns a non-zero exit code when any selected binding failsschedulereturns a non-zero exit code on partial or failed scheduled execution- the current scheduler is deterministic one-shot execution for reproducible review and CI
serveautomatically bootstraps the database and synchronizes the selected config pack before starting
Implemented coverage includes:
- repository-scoped metrics
- owner-scoped aggregation
- optional token auth
- persisted snapshots for:
- stars
- forks
- open issues
- contributors (repo-scoped)
- commits in the last 30 days
- commits in the last 90 days
- latest release date
- public repo count (owner-scoped)
Implemented coverage includes:
- query-based RSS search
- deduplicated content persistence
news.article_count- candidate discovery from repeated co-mentions
Current documented provider:
- Google News RSS search
Implemented coverage includes:
- GitHub releases
- RSS changelog feeds
Normalized content types include:
releasechangelog_entry
The SQLite write side currently includes:
datasetsentitiesrelationshipssourcesbindingsalert_rulesschedule_jobs
fetch_runsmetric_snapshotscontent_items
schedule_runsalert_eventscandidate_suggestions
The current reviewer workflow is intentionally inspectable.
sqlite3 /tmp/signalscope-review.db "SELECT id, source_id, binding_id, status, started_at, finished_at, records_written, metrics_written, content_items_written FROM fetch_runs ORDER BY id DESC LIMIT 20;"
sqlite3 /tmp/signalscope-review.db "SELECT binding_id, metric_key, metric_value_num, metric_value_text, scope_key, captured_at FROM metric_snapshots ORDER BY id DESC LIMIT 20;"
sqlite3 /tmp/signalscope-review.db "SELECT binding_id, item_type, title, url, published_at, discovered_at FROM content_items ORDER BY id DESC LIMIT 20;"sqlite3 /tmp/signalscope-review.db "SELECT id, schedule_job_id, source_id, status, fetch_runs_started, fetch_runs_succeeded, fetch_runs_failed, started_at, finished_at FROM schedule_runs ORDER BY id DESC LIMIT 20;"
sqlite3 /tmp/signalscope-review.db "SELECT id, alert_rule_id, entity_id, source_id, severity, status, observed_at, triggered_at, resolved_at FROM alert_events ORDER BY id DESC LIMIT 20;"
sqlite3 /tmp/signalscope-review.db "SELECT id, alert_rule_id, candidate_key, display_name, discovered_from_entity_id, source_id, mention_count, first_seen_at, last_seen_at, status FROM candidate_suggestions ORDER BY id DESC LIMIT 20;"Run the full validation suite with:
make ciOr run the steps manually:
python3 ./scripts/trim-whitespace.py --check
go vet ./...
go test ./...Important paths:
cmd/signalscope/ # CLI entrypoint
internal/config/ # config loading and validation
internal/fetch/ # source fetchers and fetch runtime
internal/schedule/ # deterministic one-shot scheduler runtime
internal/alerts/ # alert and candidate processing
internal/storage/ # SQLite bootstrap, persistence, sync, and processing state
configs/demo/blockstream/ # default reviewer dataset
docs/ # architecture, data model, configuration, and roadmap
migrations/ # embedded SQLite migrations
Primary documents:
docs/architecture.mddocs/configuration.mddocs/data-model.mddocs/reference-dataset.mddocs/roadmap.mdSPEC.md
Release history currently documented in:
CHANGELOG.mddocs/releases/v0.3.0.mddocs/releases/v0.2.1.mddocs/releases/v0.2.0.mddocs/releases/v0.1.0.md
If you are reviewing this project as a user rather than a backend specialist, the most valuable parts today are:
- the review queue
- the market radar
- the ability to refresh due sources and update alerts in one click
- the source health context
- the fact that all visible conclusions come from persisted SQLite state, not ad-hoc live request handling inside the UI
Competitive Intelligence Dashboard, Plan B Network 2026, initiated by Aron Clementi. Contributor: Cristian Garcia (@CrisSTEM).
SignalScope uses public APIs and public web feeds. Data can be incomplete, delayed, sparse, or noisy. This tool is for informational and reviewer purposes only and comes with no warranty.
MIT. See LICENSE.