Scan timing: clone 2.58s · analysis 1.41s · 5.3 MB · GitHub API rate-limit (preflight)
https://github.com/Thysrael/Horizon
· scanned 2026-05-24 01:19 UTC (1 week, 5 days ago)
· 10 languages
246 findings (106 legacy + 140 scanner) 98th percentile · Python · small (2-20K LoC) Scanner says 85 (higher by 7)
Last scanned 1 week, 5 days ago · v5 · 137 findings from 2 sources. Findings combine the legacy security pipeline AND the multi-layer engine (atlas, wiring, flows, ranked) AND verified AI agent contributions.
| Component | Sub-score | Weight | Contribution |
|---|---|---|---|
structure_score |
100.0 | 0.15 | 15.00 |
security_score |
98.8 | 0.25 | 24.70 |
testing_score |
100.0 | 0.20 | 20.00 |
documentation_score |
99.0 | 0.15 | 14.85 |
practices_score |
77.0 | 0.15 | 11.55 |
code_quality |
57.6 | 0.10 | 5.76 |
| Overall | 1.00 | 91.9 |
All 731 nodes from the latest scan, grouped by kind. Each node is a unit the engine identified (file, function, endpoint, table…). Most users won't need this view — it's primarily for debugging the engine's graph extraction or for AI agents that want to enumerate the project structure.
| Label | Layer | Status | Path |
|---|---|---|---|
test_load_config_missing_file |
software | healthy | tests/test_storage.py:6 |
test_load_config_invalid_json |
software | healthy | tests/test_storage.py:11 |
test_load_config_validation_failure |
software | healthy | tests/test_storage.py:21 |
test_load_config_success |
software | healthy | tests/test_storage.py:32 |
test_expands_simple_reference |
software | healthy | tests/test_storage.py:60 |
test_expands_multiple_references_in_one_string |
software | healthy | tests/test_storage.py:64 |
test_leaves_unset_var_as_placeholder |
software | healthy | tests/test_storage.py:69 |
test_ignores_non_matching_patterns |
software | healthy | tests/test_storage.py:73 |
test_recurses_into_dict |
software | healthy | tests/test_storage.py:78 |
test_recurses_into_list |
software | healthy | tests/test_storage.py:83 |
test_preserves_non_string_leaves |
software | healthy | tests/test_storage.py:87 |
test_deeply_nested |
software | healthy | tests/test_storage.py:93 |
test_load_config_expands_env_vars_in_ai_base_url |
software | healthy | tests/test_storage.py:106 |
test_simple_replacement |
software | healthy | tests/test_webhook.py:35 |
test_no_matching_vars |
software | healthy | tests/test_webhook.py:100 |
test_empty_template |
software | healthy | tests/test_webhook.py:45 |
test_empty_vars |
software | healthy | tests/test_webhook.py:48 |
test_numeric_values |
software | healthy | tests/test_webhook.py:51 |
test_summary_with_multiline_content |
software | healthy | tests/test_webhook.py:56 |
test_simple_dict |
software | healthy | tests/test_webhook.py:65 |
test_nested_dict |
software | healthy | tests/test_webhook.py:71 |
test_list |
software | healthy | tests/test_webhook.py:85 |
test_non_string_values_preserved |
software | healthy | tests/test_webhook.py:91 |
test_summary_with_quotes_safely_replaced |
software | healthy | tests/test_webhook.py:105 |
test_short_value_not_truncated |
software | healthy | tests/test_webhook.py:117 |
test_truncate_by_segments |
software | healthy | tests/test_webhook.py:122 |
test_single_segment_exceeds_limit_still_kept |
software | healthy | tests/test_webhook.py:129 |
test_no_split_delimiter_in_value |
software | healthy | tests/test_webhook.py:136 |
test_empty_value |
software | healthy | tests/test_webhook.py:143 |
test_exact_limit_with_join |
software | healthy | tests/test_webhook.py:147 |
test_one_char_over_limit |
software | healthy | tests/test_webhook.py:154 |
test_plain_key_without_params |
software | healthy | tests/test_webhook.py:162 |
test_key_with_limit_and_split |
software | healthy | tests/test_webhook.py:168 |
test_key_with_limit_no_truncation_needed |
software | healthy | tests/test_webhook.py:176 |
test_missing_variable_with_params |
software | healthy | tests/test_webhook.py:183 |
test_param_in_dict_body |
software | healthy | tests/test_webhook.py:189 |
test_mix_of_plain_and_parameterized |
software | healthy | tests/test_webhook.py:197 |
test_details_references_are_flattened_for_webhook |
software | healthy | tests/test_webhook.py:206 |
test_prepare_variables_changes_summary_for_any_post_body |
software | healthy | tests/test_webhook.py:227 |
test_prepare_variables_keeps_summary_unchanged_without_body |
software | healthy | tests/test_webhook.py:238 |
test_build_preview_uses_same_summary_formatting_as_send_path |
software | healthy | tests/test_webhook.py:249 |
test_build_preview_uses_request_body_override |
software | healthy | tests/test_webhook.py:276 |
test_object |
software | healthy | tests/test_webhook.py:305 |
test_array |
software | healthy | tests/test_webhook.py:308 |
test_whitespace_before_brace |
software | healthy | tests/test_webhook.py:311 |
test_plain_string |
software | healthy | tests/test_webhook.py:314 |
test_form_data |
software | healthy | tests/test_webhook.py:317 |
test_empty |
software | healthy | tests/test_webhook.py:320 |
test_single_header |
software | healthy | tests/test_webhook.py:328 |
test_multiple_headers |
software | healthy | tests/test_webhook.py:333 |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
TestExpandEnvVars |
software | healthy | tests/test_storage.py:57 |
TestRender |
software | healthy | tests/test_webhook.py:34 |
TestRenderDictAndList |
software | healthy | tests/test_webhook.py:64 |
TestTruncate |
software | healthy | tests/test_webhook.py:116 |
TestRenderParameterized |
software | healthy | tests/test_webhook.py:161 |
TestWebhookMarkdownFormatting |
software | healthy | tests/test_webhook.py:205 |
TestWebhookPreview |
software | healthy | tests/test_webhook.py:248 |
TestIsJson |
software | healthy | tests/test_webhook.py:304 |
TestExtractHeaders |
software | healthy | tests/test_webhook.py:327 |
TestWebhookRedaction |
software | healthy | tests/test_webhook.py:352 |
TestWebhookNotifier |
software | healthy | tests/test_webhook.py:374 |
TestWebhookConfigModel |
software | healthy | tests/test_webhook.py:716 |
TestSendDailySummary |
software | healthy | tests/test_webhook.py:774 |
TestSendFailureNotification |
software | healthy | tests/test_webhook.py:1118 |
TestURLValidation |
software | healthy | tests/test_webhook.py:1174 |
TestHTTPStatusHandling |
software | healthy | tests/test_webhook.py:1257 |
TestExceptionClassification |
software | healthy | tests/test_webhook.py:1461 |
TestWebhookConfigFieldValidation |
software | healthy | tests/test_webhook.py:1548 |
TestSkipConsoleOutput |
software | healthy | tests/test_webhook.py:1593 |
TestOpenAIClientInit |
software | healthy | tests/test_minimax_client.py:27 |
TestOpenAIClientComplete |
software | healthy | tests/test_minimax_client.py:59 |
TestTemperatureFallback |
software | healthy | tests/test_minimax_client.py:124 |
TestFactoryFunction |
software | healthy | tests/test_minimax_client.py:239 |
FakeSMTP |
software | healthy | tests/test_email.py:7 |
FakeIMAP |
software | healthy | tests/test_email.py:30 |
TestAzureOpenAIClientInit |
software | healthy | tests/test_azure_client.py:36 |
TestAzureOpenAIClientComplete |
software | healthy | tests/test_azure_client.py:61 |
TestFactoryFunction |
software | healthy | tests/test_azure_client.py:101 |
TestFetchGuards |
software | healthy | tests/test_openbb_scraper.py:76 |
TestMapping |
software | healthy | tests/test_openbb_scraper.py:116 |
TestFiltering |
software | healthy | tests/test_openbb_scraper.py:174 |
TestResilience |
software | healthy | tests/test_openbb_scraper.py:214 |
TestStatic |
software | healthy | tests/test_openbb_scraper.py:266 |
FakeOrchestrator |
software | healthy | tests/test_mcp_service_smoke.py:131 |
HorizonOrchestrator |
software | healthy | src/orchestrator.py:30 |
SourceType |
software | healthy | src/models.py:9 |
ContentItem |
software | healthy | src/models.py:22 |
AIProvider |
software | healthy | src/models.py:42 |
AIConfig |
software | healthy | src/models.py:56 |
GitHubSourceConfig |
software | healthy | src/models.py:74 |
HackerNewsConfig |
software | healthy | src/models.py:84 |
RSSSourceConfig |
software | healthy | src/models.py:92 |
RedditSubredditConfig |
software | healthy | src/models.py:101 |
RedditUserConfig |
software | healthy | src/models.py:114 |
RedditConfig |
software | healthy | src/models.py:123 |
TelegramChannelConfig |
software | healthy | src/models.py:132 |
TelegramConfig |
software | healthy | src/models.py:140 |
TwitterConfig |
software | healthy | src/models.py:147 |
OpenBBWatchlist |
software | healthy | src/models.py:161 |
OpenBBConfig |
software | healthy | src/models.py:176 |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
README_zh.md |
software | healthy | README_zh.md |
README.md |
software | healthy | README.md |
CONTRIBUTING.md |
software | healthy | CONTRIBUTING.md |
Dockerfile |
software | healthy | Dockerfile |
.env.example |
software | healthy | .env.example |
pyproject.toml |
software | healthy | pyproject.toml |
CODE_OF_CONDUCT.md |
software | healthy | CODE_OF_CONDUCT.md |
SECURITY.md |
software | healthy | SECURITY.md |
docker-compose.yml |
software | healthy | docker-compose.yml |
test_storage.py |
software | healthy | tests/test_storage.py |
conftest.py |
software | warning | tests/conftest.py |
test_webhook.py |
software | healthy | tests/test_webhook.py |
test_analyzer.py |
software | healthy | tests/test_analyzer.py |
test_mcp_adapter.py |
software | healthy | tests/test_mcp_adapter.py |
test_minimax_client.py |
software | healthy | tests/test_minimax_client.py |
test_email.py |
software | healthy | tests/test_email.py |
test_summarizer.py |
software | healthy | tests/test_summarizer.py |
test_mcp_errors.py |
software | healthy | tests/test_mcp_errors.py |
test_mcp_run_store.py |
software | healthy | tests/test_mcp_run_store.py |
test_azure_client.py |
software | healthy | tests/test_azure_client.py |
test_openbb_scraper.py |
software | healthy | tests/test_openbb_scraper.py |
test_rss.py |
software | healthy | tests/test_rss.py |
test_reddit.py |
software | healthy | tests/test_reddit.py |
test_twitter.py |
software | healthy | tests/test_twitter.py |
test_mcp_service_smoke.py |
software | healthy | tests/test_mcp_service_smoke.py |
scrapers.md |
software | healthy | docs/scrapers.md |
scoring.md |
software | healthy | docs/scoring.md |
index.md |
software | healthy | docs/index.md |
configuration.md |
software | healthy | docs/configuration.md |
horizon-hub-design.md |
software | healthy | docs/horizon-hub-design.md |
_config.yml |
software | healthy | docs/_config.yml |
horizon.js |
software | healthy | docs/assets/js/horizon.js |
horizon.css |
software | healthy | docs/assets/css/horizon.css |
head-custom.html |
software | healthy | docs/_includes/head-custom.html |
check_mcp.py |
software | healthy | scripts/check_mcp.py |
daily-run.sh |
software | healthy | scripts/daily-run.sh |
pull_request_template.md |
software | healthy | .github/pull_request_template.md |
feature_request.md |
software | healthy | .github/ISSUE_TEMPLATE/feature_request.md |
daily-summary.yml |
software | healthy | .github/workflows/daily-summary.yml |
deploy-docs.yml |
software | healthy | .github/workflows/deploy-docs.yml |
__init__.py |
software | healthy | src/__init__.py |
orchestrator.py |
software | healthy | src/orchestrator.py |
models.py |
software | healthy | src/models.py |
search.py |
software | healthy | src/search.py |
main.py |
software | healthy | src/main.py |
client.py |
software | healthy | src/ai/client.py |
__init__.py |
software | healthy | src/ai/__init__.py |
prompts.py |
software | warning | src/ai/prompts.py |
enricher.py |
software | healthy | src/ai/enricher.py |
summarizer.py |
software | healthy | src/ai/summarizer.py |
Showing first 50 of this kind. Full payload available via the JSON button at the top of the page.
| Label | Layer | Status | Path |
|---|---|---|---|
tests |
software | healthy | tests |
docs |
software | healthy | docs |
assets |
software | healthy | docs/assets |
js |
software | healthy | docs/assets/js |
css |
software | healthy | docs/assets/css |
_includes |
software | healthy | docs/_includes |
scripts |
software | healthy | scripts |
.github |
software | healthy | .github |
ISSUE_TEMPLATE |
software | healthy | .github/ISSUE_TEMPLATE |
workflows |
software | healthy | .github/workflows |
src |
software | healthy | src |
ai |
software | healthy | src/ai |
scrapers |
software | healthy | src/scrapers |
mcp |
software | healthy | src/mcp |
services |
software | healthy | src/services |
setup |
software | healthy | src/setup |
storage |
software | healthy | src/storage |
| Label | Layer | Status | Path |
|---|---|---|---|
elasticsearch |
data | healthy | src/setup/tag_aliases.py |
mongodb |
data | healthy | src/setup/tag_aliases.py |
mysql |
data | healthy | src/setup/tag_aliases.py |
postgres |
data | healthy | src/setup/tag_aliases.py |
postgresql |
data | healthy | src/setup/tag_aliases.py |
redis |
data | healthy | src/setup/tag_aliases.py |
| Label | Layer | Status | Path |
|---|---|---|---|
DATE |
cicd | healthy | — |
GITHUB_TOKEN |
cicd | healthy | — |
LWN_KEY |
cicd | healthy | — |
ANTHROPIC_API_KEY |
cicd | healthy | — |
OPENAI_API_KEY |
cicd | healthy | — |
GOOGLE_API_KEY |
cicd | healthy | — |
| Label | Layer | Status | Path |
|---|---|---|---|
vps::azure |
hardware | healthy | .env.example |
vps::aws |
hardware | healthy | src/setup/tag_aliases.py |
vps::gcp |
hardware | healthy | src/setup/tag_aliases.py |
| Label | Layer | Status | Path |
|---|---|---|---|
image::Dockerfile |
hardware | healthy | Dockerfile |
horizon |
hardware | healthy | docker-compose.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
gha::daily-summary |
cicd | healthy | .github/workflows/daily-summary.yml |
gha::deploy-docs |
cicd | healthy | .github/workflows/deploy-docs.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
daily-summary |
cicd | healthy | .github/workflows/daily-summary.yml |
deploy |
cicd | healthy | .github/workflows/deploy-docs.yml |
| Label | Layer | Status | Path |
|---|---|---|---|
repobility-clone-79loi5a5 |
software | healthy | /tmp/repobility-clone-79loi5a5 |
| Label | Layer | Status | Path |
|---|---|---|---|
135.0.0.0 |
network | healthy | src/scrapers/reddit.py |
| Label | Layer | Status | Path |
|---|---|---|---|
gpu (detected) |
hardware | healthy | src/ai/prompts.py |
This page is publicly accessible at:
https://repobility.com/scan/232cd5aa-f1f3-48cd-a1c5-3b1fd6cfbaab/
To check status programmatically (no auth required):
curl -s https://repobility.com/api/v1/public/scan/232cd5aa-f1f3-48cd-a1c5-3b1fd6cfbaab/
Important — please don't re-submit the same URL repeatedly. The submission endpoint is idempotent: re-submitting the same git URL returns this same scan_token, not a new one. To re-scan this repo, sign up free and use the dashboard.