NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.
This report summarizes scanner evidence for samuelclay/NewsBlur, a HTML project with 7,676 GitHub stars. SynthScan examined 1,321,442 lines of code across 5807 source files, recording 4165 pattern matches distributed across 23 syntactic categories. The legacy adjusted pattern signal is 5.1 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 2944 finding(s).
Are imports declared and package/API names verified? 488 finding(s).
Are wrappers, guards, and repeated structures necessary? 2711 finding(s).
Which changes need focused human review? 4165 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 4165 distinct pattern matches across 23 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 12 | at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 13 | at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 14 | at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 27 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 28 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 29 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 30 | at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassP | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 31 | at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 34 | at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 35 | at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 36 | at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 40 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 41 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 42 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 43 | at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 44 | at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker. | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 45 | at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker. | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 46 | at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 47 | at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 58 | at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 59 | at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 60 | at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 73 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 74 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 75 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 76 | at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassP | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 77 | at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 80 | at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 81 | at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 82 | at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 86 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 87 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 88 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 89 | at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 90 | at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker. | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 91 | at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker. | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 92 | at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) | CODE |
| CRITICAL⚡ | …ontrols-recovery-2026-10-17/baseline-failing-tests.xml | 93 | at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 79 | at io.mockk.impl.recording.states.VerifyingState.failIfNotPassed(VerifyingState.kt:61) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 80 | at io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:40) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 81 | at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 82 | at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:63) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 83 | at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 91 | at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 92 | at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 93 | at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 106 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 107 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 108 | at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 109 | at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassP | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 110 | at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 113 | at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 114 | at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 115 | at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 119 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 120 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 121 | at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 122 | at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 123 | at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker. | CODE |
| CRITICAL⚡ | …-2026-10-17/drag-regression/baseline-failing-tests.xml | 124 | at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker. | CODE |
| 101 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/browser-extension/src/options/options.js | 505 | async function handleRemoveBlockedDomain(domain) { | CODE |
| LOW | clients/browser-extension/src/popup/popup.js | 139 | async function syncPendingArchivesFromPopup() { | CODE |
| LOW | clients/ios/static/mark.js | 644 | value: function callNoMatchOnInvalidRanges(range, last) { | CODE |
| LOW | clients/ios/static/mark.js | 744 | value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) { | CODE |
| LOW | clients/ios/static/mark.js | 808 | value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) { | CODE |
| LOW | clients/ios/static/storyDetailView.js | 334 | function applyClassifierHighlights(classifiers) { | CODE |
| LOW | clients/ios/static/storyDetailView.js | 455 | function newsblurListenIsContainer(element) { | CODE |
| LOW | clients/ios/static/storyDetailView.js | 527 | function newsblurListenClearHighlight() { | CODE |
| LOW | clients/ios/static/storyDetailView.js | 613 | function newsblurListenSetMiniPlayer(shown) { | CODE |
| LOW | clients/store/test_google_play.py | 13 | def test_listing_stage_preserves_video_extra_locale_and_reads_back(self): | CODE |
| LOW | clients/store/test_google_play.py | 42 | def test_missing_video_in_listing_readback_stops_staging(self): | CODE |
| LOW | clients/store/test_google_play.py | 52 | def test_product_patch_changes_only_listings_and_preserves_extra_locale(self): | CODE |
| LOW | clients/store/test_google_play.py | 87 | def test_configuration_change_in_product_readback_fails(self): | CODE |
| LOW | clients/store/test_google_play.py | 96 | def test_changed_product_baseline_blocks_all_patches(self): | CODE |
| LOW | clients/store/google_play.py | 194 | def unchanged_product_configuration(before, after): | CODE |
| LOW | clients/store/test_google_play_assets.py | 26 | def test_image_inventory_retries_transient_http_failure(self): | CODE |
| LOW | clients/store/test_google_play_assets.py | 43 | def test_image_inventory_does_not_retry_permission_failure(self): | CODE |
| LOW | clients/store/test_google_play_assets.py | 92 | def test_lost_upload_response_resumes_without_duplicate_or_second_clear(self): | CODE |
| LOW | clients/store/test_google_play_assets.py | 104 | def test_lost_delete_response_recovers_empty_set(self): | CODE |
| LOW⚡ | clients/store/test_google_play_assets.py | 117 | def test_unexpected_image_blocks_deletion(self): | CODE |
| LOW⚡ | clients/store/test_google_play_assets.py | 123 | def test_changed_resume_prefix_blocks_further_upload(self): | CODE |
| LOW⚡ | clients/store/test_google_play_assets.py | 132 | def test_unrelated_text_track_or_image_changes_fail_preservation(self): | CODE |
| LOW | clients/store/test_google_play_assets.py | 146 | def test_readback_rejects_reordered_images(self): | CODE |
| LOW | clients/store/test_google_play_assets.py | 154 | def test_foreign_change_in_later_group_blocks_all_mutations(self): | CODE |
| LOW | clients/store/test_google_play_assets.py | 174 | def test_video_update_preserves_all_other_listing_fields(self): | CODE |
| LOW | archive/jammit.py | 98 | def javascript_tag_compressed(self, asset_package, asset_type_ext): | CODE |
| LOW | archive/jammit.py | 107 | def stylesheet_tag_compressed(self, asset_package, asset_type_ext): | CODE |
| LOW⚡ | archive/fabfile.py | 150 | def assign_digitalocean_roledefs(split=False): | CODE |
| LOW | archive/fabfile.py | 534 | def setup_repo_local_settings(): | CODE |
| LOW | archive/fabfile.py | 788 | def switch_forked_mongoengine(): | CODE |
| LOW | archive/fabfile.py | 1676 | def setup_original_page_server(): | CODE |
| LOW | archive/fabfile.py | 1761 | def setup_feeds_fetched_monitor(): | CODE |
| LOW | archive/ansible/do_inventory.py | 509 | def load_droplet_variables_for_host(self): | CODE |
| LOW | archive/api/newsblur.py | 169 | def mark_story_hashes_as_read(self, story_hashes): | CODE |
| LOW | utils/prometheus_worker_slots.py | 46 | def discard_corrupt_slot_files(prom_dir, slot): | CODE |
| LOW | utils/feed_fetcher.py | 309 | def openrss_corrected_address(self, address): | CODE |
| LOW | utils/feed_fetcher.py | 1008 | def https_probe_looks_like_a_feed(response): | CODE |
| LOW | utils/feed_fetcher.py | 1364 | def migrate_openrss_feed_address(self): | CODE |
| LOW | utils/feed_fetcher.py | 1387 | def migrate_https_feed_address(self): | CODE |
| LOW | utils/feed_fetcher.py | 1837 | def compare_feed_attribute_changes(self): | CODE |
| LOW | utils/feed_fetcher.py | 1976 | def reset_database_connections(self): | CODE |
| LOW | utils/feed_fetcher.py | 2393 | def fetch_and_process_archive_pages(self, feed_id): | CODE |
| LOW | utils/feed_fetcher.py | 2583 | def count_unreads_for_subscribers(self, feed, new_story_count=0, new_story_hashes=None): | CODE |
| LOW | utils/feed_fetcher.py | 2690 | def calculate_feed_scores_with_stories(self, user_subs, stories, stories_cutoff=None): | CODE |
| LOW | utils/feed_fetcher.py | 2696 | def classify_stories_for_subscribers(self, feed, stories, new_story_count, new_story_hashes=None): | CODE |
| LOW | utils/feed_fetcher.py | 257 | def fetch_url_with_scrapingbee(url): | STRING |
| LOW | utils/feed_functions.py | 464 | def strip_underscore_from_feed_address(feed_address): | CODE |
| LOW | utils/feed_functions.py | 511 | def rewrite_openrss_to_feed_address(url): | CODE |
| LOW | utils/feed_functions.py | 548 | def _openrss_path_segment_is_hostname(segment): | CODE |
| LOW | utils/rtl_css.py | 681 | def _mirror_gradient_direction(argument, name): | CODE |
| LOW | utils/fields.py | 52 | def contribute_to_related_class(self, cls, related): | CODE |
| LOW | utils/url_safety.py | 147 | def _requests_response_from_httpx(httpx_response): | CODE |
| LOW | utils/user_functions.py | 123 | def invalidate_template_cache(fragment_name, *variables): | CODE |
| LOW | utils/ai_functions.py | 235 | def classify_stories_with_vision(prompt_classifier, stories, model=ANTHROPIC_MODEL, user_id=None): | CODE |
| LOW | utils/reddit_fetcher.py | 136 | def normalized_listing_segments(self): | CODE |
| LOW | utils/reddit_fetcher.py | 156 | def should_fetch_original_rss(self): | CODE |
| LOW | utils/reddit_fetcher.py | 190 | def extract_listing_path_and_sort(self): | CODE |
| LOW | utils/youtube_fetcher.py | 37 | def strip_xml_control_characters(value): | CODE |
| LOW | utils/youtube_fetcher.py | 193 | def _thumbnail_url_from_snippet(self, payload): | CODE |
| LOW | utils/story_functions.py | 46 | def _normalize_image_url_for_dedup(url): | CODE |
| 1878 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | utils/zgrep.py | 146 | except UnicodeDecodeError: | CODE |
| HIGH | utils/feed_fetcher.py | 1323 | except Exception: | CODE |
| HIGH | utils/feed_fetcher.py | 1887 | except ValueError: | CODE |
| HIGH | utils/url_safety.py | 175 | except ValueError: | CODE |
| HIGH | utils/feedfinder_pilgrim.py | 310 | except: | CODE |
| HIGH | utils/feedfinder_pilgrim.py | 106 | except: | CODE |
| HIGH | utils/feedfinder_pilgrim.py | 243 | except (AttributeError, UnicodeDecodeError): | CODE |
| HIGH | utils/user_functions.py | 110 | except User.DoesNotExist: | CODE |
| HIGH | utils/youtube_fetcher.py | 283 | except Exception: | CODE |
| HIGH | utils/story_functions.py | 621 | except UnicodeDecodeError: | CODE |
| HIGH | utils/story_functions.py | 236 | except (ValueError, TypeError, OverflowError): | CODE |
| HIGH | utils/story_functions.py | 335 | except UnicodeEncodeError: | CODE |
| HIGH | utils/ip_rate_tracker.py | 333 | except Exception: | CODE |
| HIGH | utils/ip_rate_tracker.py | 745 | except Exception: | CODE |
| HIGH | utils/webfeed_fetcher.py | 154 | except requests.RequestException: | CODE |
| HIGH | utils/webfeed_fetcher.py | 200 | except requests.RequestException: | CODE |
| HIGH | utils/llm_costs.py | 362 | except Exception: | CODE |
| HIGH | utils/llm_costs.py | 270 | except Exception: | CODE |
| HIGH | utils/backups/offsite_status.py | 115 | except Exception: | CODE |
| HIGH | utils/backups/offsite_status.py | 190 | except Exception: | CODE |
| HIGH | utils/backups/offsite_status.py | 247 | except Exception: | CODE |
| HIGH | utils/backups/offsite_status.py | 292 | except Exception: | CODE |
| HIGH | utils/backups/offsite_status.py | 313 | except Exception: | CODE |
| HIGH | utils/backups/offsite_status.py | 165 | except (IOError, json.JSONDecodeError): | CODE |
| HIGH | flask_monitor/flask_settings.py | 9 | except ImportError: | CODE |
| HIGH | newsblur_web/settings.py | 861 | except ModuleNotFoundError: | CODE |
| HIGH | newsblur_web/settings.py | 870 | except ModuleNotFoundError: | CODE |
| HIGH | newsblur_web/settings.py | 877 | except ModuleNotFoundError: | CODE |
| HIGH | newsblur_web/settings.py | 1301 | except KeyError: | CODE |
| HIGH | newsblur_web/test_settings.py | 39 | except Exception: | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/server.py | 119 | except Exception: | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/tools/feeds.py | 162 | except Exception: | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/cli/auth.py | 153 | except Exception: | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/cli/auth.py | 68 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/cli/auth.py | 80 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/cli/auth.py | 275 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/cli/auth.py | 293 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | newsblur_mcp/newsblur_mcp/cli/output.py | 331 | except (ValueError, AttributeError): | CODE |
| HIGH | apps/reader/models.py | 1427 | except LockError: | CODE |
| HIGH | apps/reader/views.py | 108 | except: | CODE |
| HIGH | apps/reader/views.py | 3539 | except (json.JSONDecodeError, AttributeError): | CODE |
| HIGH | apps/reader/views.py | 6237 | except UserSubscriptionFolders.DoesNotExist: | CODE |
| HIGH | apps/reader/views.py | 3244 | except (urllib.error.URLError, socket.timeout, UnicodeEncodeError, http.client.InvalidURL): | CODE |
| HIGH | apps/reader/views.py | 5142 | except Feed.DoesNotExist: | CODE |
| HIGH | apps/reader/views.py | 3537 | except (ValueError, TypeError): | CODE |
| HIGH | apps/reader/views.py | 5512 | except MStarredStoryCounts.DoesNotExist: | CODE |
| HIGH | apps/reader/views.py | 492 | except User.DoesNotExist: | CODE |
| HIGH | apps/reader/views.py | 3535 | except Exception: | CODE |
| HIGH | apps/statistics/rtrending.py | 374 | except (ValueError, TypeError): | CODE |
| HIGH | apps/statistics/rtrending.py | 400 | except (ValueError, TypeError): | CODE |
| HIGH | apps/statistics/rtrending.py | 437 | except (ValueError, TypeError): | CODE |
| HIGH | apps/statistics/rscrapingbee.py | 123 | except Exception: | CODE |
| HIGH | apps/statistics/rscrapingbee.py | 350 | except ValueError: | CODE |
| HIGH | apps/statistics/rtrending_subscriptions.py | 158 | except (ValueError, TypeError): | CODE |
| HIGH | apps/statistics/rtrending_subscriptions.py | 220 | except (ValueError, TypeError): | CODE |
| HIGH | apps/rss_feeds/models.py | 1111 | except MStory.DoesNotExist: | CODE |
| HIGH | apps/rss_feeds/models.py | 3247 | except Exception: | CODE |
| HIGH | apps/rss_feeds/models.py | 4357 | except Exception: | CODE |
| HIGH | apps/rss_feeds/models.py | 367 | except MFeedIcon.DoesNotExist: | CODE |
| HIGH | apps/rss_feeds/models.py | 1164 | except (KeyError, UnsafeUrlError): | CODE |
| 123 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | archive/fabfile.py | 140 | # ================ | COMMENT |
| MEDIUM⚡ | archive/fabfile.py | 142 | # ================ | COMMENT |
| MEDIUM⚡ | archive/fabfile.py | 1959 | # =============== | COMMENT |
| MEDIUM⚡ | archive/fabfile.py | 1961 | # =============== | COMMENT |
| MEDIUM | archive/fabfile.py | 47 | # ============ | COMMENT |
| MEDIUM | archive/fabfile.py | 49 | # ============ | COMMENT |
| MEDIUM | archive/fabfile.py | 227 | # ============= | COMMENT |
| MEDIUM | archive/fabfile.py | 229 | # ============= | COMMENT |
| MEDIUM | archive/fabfile.py | 385 | # ================== | COMMENT |
| MEDIUM | archive/fabfile.py | 387 | # ================== | COMMENT |
| MEDIUM | archive/fabfile.py | 406 | # ================== | COMMENT |
| MEDIUM | archive/fabfile.py | 408 | # ================== | COMMENT |
| MEDIUM | archive/fabfile.py | 882 | # =============== | COMMENT |
| MEDIUM | archive/fabfile.py | 884 | # =============== | COMMENT |
| MEDIUM | archive/fabfile.py | 1283 | # ============== | COMMENT |
| MEDIUM | archive/fabfile.py | 1285 | # ============== | COMMENT |
| MEDIUM | archive/fabfile.py | 1789 | # ================ | COMMENT |
| MEDIUM | archive/fabfile.py | 1791 | # ================ | COMMENT |
| MEDIUM | archive/fabfile.py | 1850 | # ========================= | COMMENT |
| MEDIUM | archive/fabfile.py | 1852 | # ========================= | COMMENT |
| MEDIUM | archive/fabfile.py | 1994 | # ========== | COMMENT |
| MEDIUM | archive/fabfile.py | 1996 | # ========== | COMMENT |
| MEDIUM | archive/fabfile.py | 2211 | # =========== | COMMENT |
| MEDIUM | archive/fabfile.py | 2213 | # =========== | COMMENT |
| MEDIUM | archive/fabfile.py | 2259 | # =============== | COMMENT |
| MEDIUM | archive/fabfile.py | 2261 | # =============== | COMMENT |
| MEDIUM | archive/fabfile.py | 2281 | # ============== | COMMENT |
| MEDIUM | archive/fabfile.py | 2283 | # ============== | COMMENT |
| MEDIUM | utils/check_health.sh | 59 | # ===================== | COMMENT |
| MEDIUM | utils/check_health.sh | 61 | # ===================== | COMMENT |
| MEDIUM | utils/check_health.sh | 145 | # ===================== | COMMENT |
| MEDIUM | utils/check_health.sh | 147 | # ===================== | COMMENT |
| MEDIUM | utils/check_health.sh | 364 | # ===================== | COMMENT |
| MEDIUM | utils/check_health.sh | 366 | # ===================== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 4 | # =================== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 6 | # =================== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 16 | # =================== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 18 | # =================== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 86 | # =============== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 88 | # =============== | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 96 | # ============= | COMMENT |
| MEDIUM⚡ | newsblur_web/docker_local_settings.py | 98 | # ============= | COMMENT |
| MEDIUM | newsblur_web/docker_local_settings.py | 159 | # =========== | COMMENT |
| MEDIUM | newsblur_web/docker_local_settings.py | 161 | # =========== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 416 | # ============== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 418 | # ============== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 427 | # =========== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 429 | # =========== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 434 | # =============== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 436 | # =============== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 781 | # ================= | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 783 | # ================= | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 789 | # ==================== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 791 | # ==================== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 1163 | # ================== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 1165 | # ================== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 1174 | # ========== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 1176 | # ========== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 1181 | # ========== | COMMENT |
| MEDIUM⚡ | newsblur_web/settings.py | 1183 | # ========== | COMMENT |
| 179 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ansible.cfg | 21 | # Retry establishing the SSH connection this many times before marking a host | COMMENT |
| LOW | clients/ios/Classes/OfflineCleanImages.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/HorizontalPageDelegate.swift | 1 | // | COMMENT |
| LOW | clients/ios/Classes/HorizontalPageDelegate.swift | 21 | // | COMMENT |
| LOW | clients/ios/Classes/HorizontalPageDelegate.swift | 41 | // let pageIndex = (currentViewController.pageIndex ?? -1) - 1 | COMMENT |
| LOW | clients/ios/Classes/HorizontalPageDelegate.swift | 61 | // | COMMENT |
| LOW | clients/ios/Classes/SmallActivityCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/DividerView.swift | 1 | // | COMMENT |
| LOW | clients/ios/Classes/SiteCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ActivitiesNavigationBar.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ActivitiesNavigationBar.m | 21 | // subViewFrame.size.height = 64; | COMMENT |
| LOW | clients/ios/Classes/FeedDetailTableCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FontSettingsViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/StoryPagesViewController.swift | 1 | // | COMMENT |
| LOW | clients/ios/Classes/MoveSiteViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ThemeManager.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/SmallInteractionCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/InteractionCell.m | 1 | #import "NewsBlur-Swift.h" | COMMENT |
| LOW | clients/ios/Classes/FriendsListViewController.m | 1 | #import "NewsBlur-Swift.h" | COMMENT |
| LOW | clients/ios/Classes/AddSiteViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FeedTableCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FeedChooserViewController.m | 1 | #import "NewsBlur-Swift.h" | COMMENT |
| LOW | clients/ios/Classes/StoryDetailObjCViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/StoryPagesObjCViewController.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/SplitViewController.swift | 401 | // print("canPerformAction: \(action) with \(sender ?? "nil")") | COMMENT |
| LOW | clients/ios/Classes/LoginViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/DashList.swift | 161 | } else if folderId == "trending:good_reads" { | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 1 | // NewsBlurAppDelegate.m | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 21 | #import "FontSettingsViewController.h" | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 41 | #import "FMDatabaseAdditions.h" | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 401 | - (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder { | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 421 | // NSInteger version = [coder decodeIntegerForKey:@"version"]; | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 2441 | storiesCollection.isSocialView = NO; | COMMENT |
| LOW | clients/ios/Classes/FirstTimeUserViewController.m | 1 | #import "NewsBlur-Swift.h" | COMMENT |
| LOW | clients/ios/Classes/ProfileBadge.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FeedDetailObjCViewController.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/AddSiteTableCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ShareViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ActivityCell.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FeedsObjCViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FeedsObjCViewController.m | 21 | #import "Utilities.h" | COMMENT |
| LOW | clients/ios/Classes/FeedsObjCViewController.m | 1021 | }]; | COMMENT |
| LOW | clients/ios/Classes/FeedsObjCViewController.m | 1521 | [userPreferences synchronize]; | COMMENT |
| LOW | clients/ios/Classes/FeedsObjCViewController.m | 1541 | // [settingsButton setImage:[[ThemeManager themeManager] themedImage:settingsImage] forState:UIControlStateNormal]; | COMMENT |
| LOW | clients/ios/Classes/StoriesCollection.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/SmallInteractionCell.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ThemeManager.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/NBCopyLinkActivity.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ActivitiesNavigationBar.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/SiteCell.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/Storyboards.swift | 1 | // | COMMENT |
| LOW | clients/ios/Classes/ActivityModule.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/OfflineCleanImages.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FontListViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/SmallActivityCell.h | 1 | // | COMMENT |
| LOW | …ts/ios/Classes/FirstTimeUserAddFriendsViewController.m | 1 | #import "NewsBlur-Swift.h" | COMMENT |
| LOW | clients/ios/Classes/UserTagsViewController.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/FeedTableCell.h | 1 | // | COMMENT |
| LOW | clients/ios/Classes/UnreadCountView.m | 1 | // | COMMENT |
| LOW | clients/ios/Classes/NewsBlurApplication.h | 1 | // | COMMENT |
| 338 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | clients/ios/run_ios.py | 543 | print("Error: No simulator UDID specified.\n") | CODE |
| MEDIUM | clients/ios/Classes/AuxSceneDelegate.swift | 31 | print("Error activating scene: \(error)") | CODE |
| MEDIUM | clients/ios/Classes/AuxSceneDelegate.swift | 35 | print("Error activating scene: \(error)") | CODE |
| MEDIUM | clients/ios/scripts/convert_icons_to_pdf.py | 23 | print("Error: cairosvg is required. Install with: pip install cairosvg") | CODE |
| LOW | clients/ios/scripts/convert_icons_to_pdf.py | 47 | except Exception as e: | CODE |
| MEDIUM | clients/android/run_android.py | 898 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | …NewsBlur Archive/NewsBlur Archive/ViewController.swift | 62 | print("Error opening Safari preferences: \(error)") | STRING |
| LOW | clients/store/google_play.py | 320 | except Exception: | CODE |
| LOW | archive/fabfile.py | 2190 | except Exception as e: | CODE |
| LOW | archive/munin/munin/__init__.py | 57 | except Exception as exc: | CODE |
| LOW | config/gunicorn_conf.py | 64 | except Exception as e: | CODE |
| LOW | .agents/skills/investigate-forum/screenshot.py | 164 | except Exception: | CODE |
| LOW | utils/analytics_degradation.py | 90 | except Exception as e: | CODE |
| LOW | utils/prometheus_worker_slots.py | 68 | except Exception as e: | CODE |
| LOW | utils/json_functions.py | 156 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 283 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 873 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 1000 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 1126 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 1215 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 1323 | except Exception: | CODE |
| LOW | utils/feed_fetcher.py | 1862 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 2154 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 2223 | except Exception as e: | CODE |
| LOW | utils/feed_fetcher.py | 2259 | except Exception as e: | CODE |
| LOW | utils/ai_functions.py | 178 | except Exception as e: | CODE |
| LOW | utils/ai_functions.py | 230 | except Exception as e: | CODE |
| LOW | utils/ai_functions.py | 430 | except Exception as e: | CODE |
| LOW | utils/reddit_fetcher.py | 515 | except Exception: | CODE |
| LOW | utils/youtube_fetcher.py | 230 | except Exception: | CODE |
| LOW | utils/youtube_fetcher.py | 244 | except Exception: | CODE |
| LOW | utils/youtube_fetcher.py | 283 | except Exception: | CODE |
| LOW | utils/tornado_escape.py | 38 | except Exception: | CODE |
| LOW | utils/story_functions.py | 52 | except Exception: | CODE |
| LOW | utils/story_functions.py | 111 | except Exception: | CODE |
| LOW | utils/story_functions.py | 282 | except Exception: | CODE |
| LOW | utils/ip_rate_tracker.py | 333 | except Exception: | CODE |
| LOW | utils/ip_rate_tracker.py | 658 | except Exception: | CODE |
| LOW | utils/ip_rate_tracker.py | 745 | except Exception: | CODE |
| LOW⚡ | utils/prometheus_middleware.py | 21 | except Exception as e: | CODE |
| LOW | utils/prometheus_middleware.py | 43 | except Exception as retry_error: | CODE |
| LOW | utils/prometheus_middleware.py | 56 | except Exception as e: | CODE |
| MEDIUM | utils/prometheus_middleware.py | 33 | def __call__(self, request): | CODE |
| LOW | utils/feedfinder_forman.py | 45 | except Exception as e: | CODE |
| MEDIUM | utils/feedfinder_forman.py | 40 | def get_feed(self, url, skip_user_agent=False): | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 220 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 227 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 237 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 247 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 255 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 269 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 279 | except Exception: | CODE |
| LOW⚡ | utils/webfeed_fetcher.py | 289 | except Exception: | CODE |
| LOW | utils/llm_costs.py | 270 | except Exception: | CODE |
| LOW | utils/llm_costs.py | 285 | except Exception as e: | CODE |
| LOW | utils/llm_costs.py | 316 | except Exception as e: | CODE |
| LOW | utils/llm_costs.py | 350 | except Exception as e: | CODE |
| LOW | utils/llm_costs.py | 362 | except Exception: | CODE |
| LOW | utils/monitor_task_fetches.py | 32 | except Exception as e: | CODE |
| LOW | utils/monitor_work_queue.py | 30 | except Exception as e: | CODE |
| 226 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/ios/run_ios.py | 440 | CODE | |
| LOW | clients/android/run_android.py | 623 | CODE | |
| LOW | clients/store/google_play_assets.py | 46 | CODE | |
| LOW | clients/store/test_google_play_assets.py | 132 | CODE | |
| LOW | archive/jammit.py | 34 | CODE | |
| LOW | archive/fabfile.py | 322 | CODE | |
| LOW | archive/fabfile.py | 577 | CODE | |
| LOW | archive/fabfile.py | 594 | CODE | |
| LOW | archive/fabfile.py | 1115 | CODE | |
| LOW | archive/fabfile.py | 1196 | CODE | |
| LOW | archive/fabfile.py | 2053 | CODE | |
| LOW | archive/fabfile.py | 2375 | CODE | |
| LOW | archive/munin/munin/cassandra.py | 26 | CODE | |
| LOW | archive/munin/munin/cassandra.py | 52 | CODE | |
| LOW | archive/munin/munin/__init__.py | 27 | CODE | |
| LOW | archive/munin/munin/__init__.py | 47 | CODE | |
| LOW | archive/munin/munin/mysql.py | 13 | CODE | |
| LOW | archive/ansible/do_inventory.py | 162 | CODE | |
| LOW | archive/ansible/do_inventory.py | 227 | CODE | |
| LOW | utils/zgrep.py | 117 | CODE | |
| LOW | utils/json_fetcher.py | 86 | CODE | |
| LOW | utils/json_functions.py | 43 | CODE | |
| LOW | utils/json_functions.py | 50 | CODE | |
| LOW | utils/feed_fetcher.py | 330 | CODE | |
| LOW | utils/feed_fetcher.py | 1431 | CODE | |
| LOW | utils/feed_fetcher.py | 1643 | CODE | |
| LOW | utils/feed_fetcher.py | 1717 | CODE | |
| LOW | utils/feed_fetcher.py | 1998 | CODE | |
| LOW | utils/feed_fetcher.py | 2393 | CODE | |
| LOW | utils/rtail.py | 17 | CODE | |
| LOW | utils/feed_functions.py | 174 | CODE | |
| LOW | utils/feed_functions.py | 196 | CODE | |
| LOW | utils/feed_functions.py | 330 | CODE | |
| LOW | utils/rtl_css.py | 173 | CODE | |
| LOW | utils/rtl_css.py | 423 | CODE | |
| LOW | utils/rtl_css.py | 454 | CODE | |
| LOW | utils/rtl_css.py | 571 | CODE | |
| LOW | utils/rtl_css.py | 694 | CODE | |
| LOW | utils/rtl_css.py | 713 | CODE | |
| LOW | utils/url_safety.py | 102 | CODE | |
| LOW | utils/log.py | 29 | CODE | |
| LOW | utils/redis_raw_log_middleware.py | 95 | CODE | |
| LOW | utils/redis_raw_log_middleware.py | 118 | CODE | |
| LOW | utils/feedfinder_pilgrim.py | 407 | CODE | |
| LOW | utils/tlnb.py | 34 | CODE | |
| LOW | utils/tlnb.py | 110 | CODE | |
| LOW | utils/tlnb.py | 160 | CODE | |
| LOW | utils/user_functions.py | 135 | CODE | |
| LOW | utils/ai_functions.py | 50 | CODE | |
| LOW | utils/ai_functions.py | 183 | CODE | |
| LOW | utils/ai_functions.py | 235 | CODE | |
| LOW | utils/reddit_fetcher.py | 206 | CODE | |
| LOW | utils/youtube_fetcher.py | 174 | CODE | |
| LOW | utils/youtube_fetcher.py | 287 | CODE | |
| LOW | utils/youtube_fetcher.py | 513 | CODE | |
| LOW | utils/tornado_escape.py | 212 | CODE | |
| LOW | utils/story_functions.py | 163 | CODE | |
| LOW | utils/story_functions.py | 291 | CODE | |
| LOW | utils/image_functions.py | 52 | CODE | |
| LOW | utils/ip_rate_tracker.py | 698 | CODE | |
| 315 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/ios/scripts/convert_icons_to_pdf.py | 16 | CODE | |
| LOW | clients/android/run_android.py | 56 | CODE | |
| LOW | archive/munin/munin/cassandra.py | 4 | CODE | |
| LOW | archive/munin/munin/riak.py | 9 | CODE | |
| LOW | archive/munin/munin/ddwrt.py | 4 | CODE | |
| LOW | archive/ansible/do_inventory.py | 124 | CODE | |
| LOW | archive/ansible/do_inventory.py | 124 | CODE | |
| LOW | archive/ansible/do_inventory.py | 124 | CODE | |
| LOW | archive/perf/locust.py | 1 | CODE | |
| LOW | archive/perf/locust.py | 2 | CODE | |
| LOW | archive/perf/locust.py | 4 | CODE | |
| LOW | .agents/skills/investigate-forum/screenshot.py | 35 | CODE | |
| LOW | utils/zgrep.py | 6 | CODE | |
| LOW | utils/zgrep.py | 11 | CODE | |
| LOW | utils/feed_fetcher.py | 66 | CODE | |
| LOW | utils/feed_fetcher.py | 68 | CODE | |
| LOW | utils/feed_fetcher.py | 70 | CODE | |
| LOW | utils/feed_fetcher.py | 88 | CODE | |
| LOW | utils/feed_functions.py | 9 | CODE | |
| LOW | utils/redis_raw_log_middleware.py | 1 | CODE | |
| LOW | utils/redis_raw_log_middleware.py | 5 | CODE | |
| LOW | utils/tlnb.py | 6 | CODE | |
| LOW | utils/ai_functions.py | 10 | CODE | |
| LOW | utils/ai_functions.py | 11 | CODE | |
| LOW | utils/youtube_fetcher.py | 15 | CODE | |
| LOW | utils/youtube_fetcher.py | 16 | CODE | |
| LOW | utils/story_functions.py | 14 | CODE | |
| LOW | utils/hostname_ssh.py | 7 | CODE | |
| LOW | utils/mongo_raw_log_middleware.py | 5 | CODE | |
| LOW | utils/mongo_raw_log_middleware.py | 6 | CODE | |
| LOW | utils/mongo_raw_log_middleware.py | 8 | CODE | |
| LOW | utils/mongo_raw_log_middleware.py | 13 | CODE | |
| LOW | utils/webfeed_fetcher.py | 10 | CODE | |
| LOW | utils/exception_middleware.py | 7 | CODE | |
| LOW | utils/exception_middleware.py | 10 | CODE | |
| LOW | utils/monitor_work_queue.py | 9 | CODE | |
| LOW | utils/S3.py | 15 | CODE | |
| LOW | utils/S3.py | 16 | CODE | |
| LOW | utils/templatetags/utils_tags.py | 4 | CODE | |
| LOW | utils/templatetags/utils_tags.py | 13 | CODE | |
| LOW | utils/templatetags/utils_tags.py | 15 | CODE | |
| LOW | utils/templatetags/utils_tags.py | 15 | CODE | |
| LOW | utils/archive/memcached_status.py | 2 | CODE | |
| LOW | ansible/utils/generate_hetzner_inventory.py | 3 | CODE | |
| LOW | ansible/utils/generate_hetzner_inventory.py | 4 | CODE | |
| LOW | ansible/utils/generate_hetzner_inventory.py | 5 | CODE | |
| LOW | ansible/utils/generate_hetzner_inventory.py | 6 | CODE | |
| LOW | ansible/utils/generate_hetzner_inventory.py | 12 | CODE | |
| LOW | flask_monitor/flask_settings.py | 8 | CODE | |
| LOW | flask_monitor/db_monitor.py | 1 | CODE | |
| LOW | newsblur_web/__init__.py | 1 | CODE | |
| LOW | newsblur_web/__init__.py | 1 | CODE | |
| LOW | newsblur_web/__init__.py | 5 | CODE | |
| LOW | newsblur_web/settings.py | 857 | CODE | |
| LOW | newsblur_web/settings.py | 860 | CODE | |
| LOW | newsblur_web/settings.py | 866 | CODE | |
| LOW | newsblur_web/settings.py | 873 | CODE | |
| LOW | newsblur_web/celeryapp.py | 1 | CODE | |
| LOW | newsblur_web/celeryapp.py | 1 | CODE | |
| LOW | newsblur_web/test_settings.py | 4 | CODE | |
| 199 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | worktree-dev.sh | 93 | # Check if setup has been run | COMMENT |
| LOW | worktree-dev.sh | 177 | # Check if we can copy from parent repo (handle both regular repo and worktree) | COMMENT |
| LOW | worktree-dev.sh | 206 | # Check if shared services are already running (using original container names) | COMMENT |
| LOW | worktree-dev.sh | 396 | # Check if this worktree already has chrome-devtools configured with --isolated | COMMENT |
| LOW | worktree-dev.sh | 413 | # Check if shared services are already running | COMMENT |
| LOW | worktree-dev.sh | 522 | # Check if any container is in Exited state (potential broken network) | COMMENT |
| LOW | clients/ios/scripts/fix_alpha_target.rb | 32 | # Check if already added to Alpha target | COMMENT |
| LOW | clients/ios/scripts/add_files_to_xcode.rb | 36 | # Check if files already exist in project | COMMENT |
| LOW | clients/ios/scripts/add_files_to_xcode.rb | 65 | # Check if Icons group/reference already exists | COMMENT |
| LOW | clients/safari-extension/build.sh | 20 | # Check if browser extension exists | COMMENT |
| LOW | archive/netdata_docker/vars/main.yml | 10 | # Set whether to run the Agent web server/dashboard/API, or disable them. | COMMENT |
| LOW | utils/test_haproxy_toggle.sh | 119 | # Display results | COMMENT |
| LOW⚡ | utils/feed_fetcher.py | 147 | # Check if any of the indicators are present | COMMENT |
| LOW | utils/feed_fetcher.py | 1484 | # Check if caller requested a specific max_stories limit (e.g. bootstrap_popular_feeds) | COMMENT |
| LOW | utils/feed_fetcher.py | 1489 | # Check if this is a high-volume feed that can handle more stories | COMMENT |
| LOW | utils/retry_unlinked_loop.sh | 33 | # Check if there are no more unlinked feeds | COMMENT |
| LOW | utils/story_functions.py | 417 | # Check if wrapper has height:0 and padding-bottom (responsive embed pattern) | COMMENT |
| LOW | utils/feedfinder_forman.py | 112 | # Check if it is already a feed. | COMMENT |
| LOW | utils/search_openrss_24h.py | 63 | # Check if within last 24 hours | COMMENT |
| LOW | utils/bootstrap_loop.sh | 65 | # Check if we've processed all entries | COMMENT |
| LOW | utils/load_test_deploy.sh | 113 | # Display results | COMMENT |
| LOW | utils/view_functions.py | 80 | # Check if in_progress cleared but no result (request failed) | COMMENT |
| LOW | utils/view_functions.py | 173 | # Check if parameter is included | COMMENT |
| LOW | utils/view_functions.py | 179 | # Check if parameter is correct type | COMMENT |
| LOW | utils/ssh_hz.sh | 33 | # Check if an alias is provided | COMMENT |
| LOW | utils/ssh_hz.sh | 57 | # Check if a host was found | COMMENT |
| LOW | ansible/roles/consul/tasks/get_consul_manager_ip.py | 34 | # Check if the group exists | COMMENT |
| LOW | newsblur_web/docker_local_settings.py | 66 | # Set this to the username that is shown on the homepage to unauthenticated users. | COMMENT |
| LOW | newsblur_web/settings.py | 906 | # Set traces_sample_rate to 1.0 to capture 100% | COMMENT |
| LOW | newsblur_mcp/newsblur_mcp/cli/auth.py | 338 | # Check if expired | COMMENT |
| LOW | flask_metrics/flask_metrics_postgres.py | 51 | # Check if this is a primary by looking for connected replicas | COMMENT |
| LOW | flask_metrics/flask_metrics_postgres.py | 182 | # Check if we're in recovery (i.e., a replica) | COMMENT |
| LOW | apps/reader/models.py | 1891 | # Check if user is archive and story is outside unread cutoff | COMMENT |
| LOW | apps/reader/models.py | 3758 | # Check if user already has a custom icon for the original feed | COMMENT |
| LOW | apps/reader/views.py | 1417 | # Check if user wants YouTube captions enabled | COMMENT |
| LOW | apps/reader/views.py | 2960 | # Check if user wants YouTube captions enabled | COMMENT |
| LOW | apps/reader/views.py | 3211 | # Check if path can be encoded as ASCII | COMMENT |
| LOW | apps/reader/views.py | 3992 | # Check if Twitter API is active for user | COMMENT |
| LOW | apps/reader/views.py | 6136 | # Check if user is archive tier (required for this feature) | COMMENT |
| LOW | apps/reader/views.py | 6201 | # Check if user is archive tier (required for this feature) | COMMENT |
| LOW | apps/rss_feeds/models.py | 5563 | # Check if new_tag (case-insensitive) is already present | COMMENT |
| LOW | apps/rss_feeds/text_importer.py | 298 | # Check if we should try UTF-8 first. | COMMENT |
| LOW | apps/rss_feeds/page_importer.py | 130 | # Check if the HTML declares UTF-8 charset and use that instead. | COMMENT |
| LOW | apps/rss_feeds/page_importer.py | 288 | # Check if the HTML declares UTF-8 charset and use that instead. | COMMENT |
| LOW | apps/rss_feeds/test_rss_feeds.py | 383 | # Check if we're getting the right format | COMMENT |
| LOW | apps/discover/views.py | 1501 | # Check if a Feed with this address already exists | COMMENT |
| LOW⚡ | …/management/commands/index_popular_feeds_for_search.py | 114 | # Check if already indexed (unless reindexing) | COMMENT |
| LOW | apps/oauth/views.py | 939 | # Check if this is a browser extension redirect | COMMENT |
| LOW | apps/newsletters/views.py | 149 | # Check if it looks like ImprovMX format | COMMENT |
| LOW | apps/ask_ai/views.py | 181 | # Read the file content from Django's InMemoryUploadedFile | COMMENT |
| LOW | apps/webfeed/views.py | 148 | # Check if feed already exists | COMMENT |
| LOW | apps/clustering/models.py | 791 | # Check if any member already belongs to an existing cluster | COMMENT |
| LOW | apps/search/models.py | 814 | # Check if index exists | COMMENT |
| LOW | apps/search/models.py | 940 | # Check if already indexed to avoid expensive vector generation | COMMENT |
| LOW | apps/search/models.py | 1158 | # Check if index exists | COMMENT |
| LOW | apps/search/models.py | 1699 | # Check if index exists | COMMENT |
| LOW | apps/profile/models.py | 2586 | # Check if there's already an active subscription. The AI classifier usage billing sub | COMMENT |
| LOW | apps/profile/middleware.py | 892 | # Check if rate limit would be exceeded | COMMENT |
| LOW | …ps/profile/management/commands/generate_dev_session.py | 28 | # Check if we're in development | COMMENT |
| LOW | …ps/profile/management/commands/generate_dev_session.py | 35 | # Check if session file exists and is not being forced to regenerate | COMMENT |
| 7 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/ios/CLAUDE.md | 174 | # Step 1: Find available simulators and their UDIDs | COMMENT |
| LOW | clients/ios/CLAUDE.md | 177 | # Step 2: Use --udid with any action | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 6047 | // Step 1: Remove classifier at old scope | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 6060 | // Step 2: Add classifier at new scope after remove succeeds | COMMENT |
| LOW | …ients/ios/Other Sources/OnePasswordExtension/README.md | 37 | ### Step 1: Download the Source Code and Sample Apps | COMMENT |
| LOW | …ients/ios/Other Sources/OnePasswordExtension/README.md | 47 | ### Step 2: Install the Latest versions of 1Password & Xcode | COMMENT |
| LOW | …ients/ios/Other Sources/OnePasswordExtension/README.md | 60 | ### Step 3: Run the Apps | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 52 | ## Step 0: Preflight | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 65 | ## Step 1: Fetch the queue | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 79 | ## Step 2: Investigate one topic | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 143 | ## Step 3: Fix PR flow (tier 1, or tier 2 after Sam approves the fix) | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 217 | ## Step 4: Reply-only flow | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 221 | ## Step 5: Tier 2 flow | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 236 | ## Step 6: Draft the forum reply | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 261 | ## Step 7: Record state | COMMENT |
| LOW | .agents/skills/investigate-forum/SKILL.md | 299 | ## Step 8: Report | COMMENT |
| LOW | .claude/commands/commit-all.md | 19 | ### Step 1: Analyze and group changes | COMMENT |
| LOW | .claude/commands/commit-all.md | 30 | ### Step 2: Commit each group | COMMENT |
| LOW | .claude/commands/commit-all.md | 42 | ### Step 3: Confirm | COMMENT |
| LOW⚡ | .claude/commands/commit.md | 19 | ### Step 1: Determine which files to stage | COMMENT |
| LOW⚡ | .claude/commands/commit.md | 29 | ### Step 2: Stage the relevant files | COMMENT |
| LOW⚡ | .claude/commands/commit.md | 35 | ### Step 3: Verify staged changes | COMMENT |
| LOW⚡ | .claude/commands/commit.md | 39 | ### Step 4: Commit | COMMENT |
| LOW | .claude/commands/commit.md | 57 | ### Step 5: Confirm | COMMENT |
| LOW⚡ | .claude/commands/commit-push.md | 10 | ### Step 1: Commit | COMMENT |
| LOW⚡ | .claude/commands/commit-push.md | 14 | ### Step 2: Push | COMMENT |
| LOW⚡ | .claude/commands/commit-push.md | 24 | ### Step 3: Confirm | COMMENT |
| LOW | .claude/commands/feature.md | 23 | ### Step 1: Find the matching blog post | COMMENT |
| LOW⚡ | .claude/commands/feature.md | 34 | ### Step 2: Study existing feature style | COMMENT |
| LOW⚡ | .claude/commands/feature.md | 43 | ### Step 3: Write 4-5 feature options | COMMENT |
| LOW⚡ | .claude/commands/feature.md | 52 | ### Step 4: Ask the user to choose a feature | COMMENT |
| LOW⚡ | .claude/commands/feature.md | 56 | ### Step 5: Post to production | COMMENT |
| LOW | .claude/commands/feature.md | 75 | ### Step 6: Confirm feature | COMMENT |
| LOW | .claude/commands/feature.md | 79 | ### Step 7: Write tweet sets | COMMENT |
| LOW⚡ | .claude/skills/find-skills/SKILL.md | 36 | ### Step 1: Understand What They Need | COMMENT |
| LOW⚡ | .claude/skills/find-skills/SKILL.md | 44 | ### Step 2: Check the Leaderboard First | COMMENT |
| LOW⚡ | .claude/skills/find-skills/SKILL.md | 52 | ### Step 3: Search for Skills | COMMENT |
| LOW | .claude/skills/find-skills/SKILL.md | 66 | ### Step 4: Verify Quality Before Recommending | COMMENT |
| LOW | .claude/skills/find-skills/SKILL.md | 74 | ### Step 5: Present Options to the User | COMMENT |
| LOW | .claude/skills/find-skills/SKILL.md | 96 | ### Step 6: Offer to Install | COMMENT |
| LOW⚡ | utils/feed_fetcher.py | 152 | # Step 1: HTML Unescaping - convert HTML entities to their literal characters | COMMENT |
| LOW⚡ | utils/feed_fetcher.py | 156 | # Step 2: Encoding Reinterpretation | COMMENT |
| LOW⚡ | apps/rss_feeds/models.py | 4844 | # Step 1: Fetch the Google News article page to get signature and timestamp. | COMMENT |
| LOW⚡ | apps/rss_feeds/models.py | 4866 | # Step 2: Call batchexecute API to decode the URL | COMMENT |
| LOW | …s/discover/management/commands/discover_newsletters.py | 1361 | # Step 1: Always fetch sitemap to get publication slugs (fast, idempotent) | COMMENT |
| LOW | …s/discover/management/commands/discover_newsletters.py | 1395 | # Step 2: Fetch each publication page for metadata | COMMENT |
| LOW | …r/management/commands/backfill_underpopulated_feeds.py | 149 | # Step 1: Load fixture and identify gaps | COMMENT |
| LOW | …r/management/commands/backfill_underpopulated_feeds.py | 206 | # Step 3: Categorize discovered feeds with Claude | COMMENT |
| LOW | …r/management/commands/backfill_underpopulated_feeds.py | 217 | # Step 4: Merge into fixture | COMMENT |
| LOW⚡ | apps/webfeed/tasks.py | 567 | # Step 4: Variants already carry preview stories and are ranked best-first. | COMMENT |
| LOW | apps/webfeed/tasks.py | 420 | # Step 1: Fetch page HTML | COMMENT |
| LOW | apps/webfeed/tasks.py | 446 | # Step 2: Call the configured LLM for XPath analysis. The model is non-deterministic | COMMENT |
| LOW | apps/webfeed/tasks.py | 513 | # Step 3: First analysis pass, plus a single retry when nothing matched. | COMMENT |
| LOW⚡ | apps/profile/models.py | 1850 | # Step 1: Get the order to retrieve purchaseToken | COMMENT |
| LOW⚡ | apps/profile/models.py | 1869 | # Step 2: Store GooglePlayIds for RTDN mapping | COMMENT |
| LOW⚡ | apps/profile/models.py | 1897 | # Step 4: Determine renewals from latestOrderId | COMMENT |
| LOW | apps/profile/models.py | 1882 | # Step 3: Get full subscription state via purchaseToken | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | archive/fabfile.py | 1950 | run("mkdir -p ~%s/.ssh && chmod 700 ~%s/.ssh" % (repo_user, repo_user)) | CODE |
| HIGH | archive/fabfile.py | 498 | run("mkdir -p ~/.ssh && chmod 700 ~/.ssh") | CODE |
| HIGH | archive/fabfile.py | 567 | run("./configure && make && sudo make install") | CODE |
| HIGH | archive/fabfile.py | 570 | run("./configure && make && sudo make install") | CODE |
| HIGH | .agents/skills/investigate-forum/screenshot.py | 163 | page.wait_for_function("window.NEWSBLUR && window.NEWSBLUR.reader", timeout=30000) | CODE |
| HIGH | utils/management_functions.py | 26 | os.dup2(null, i) | CODE |
| HIGH | utils/management_functions.py | 30 | os.close(null) | CODE |
| HIGH⚡ | apps/rss_feeds/models.py | 4869 | '["garturlreq",[["X","X",["X","X"],null,null,1,1,"US:en"' | CODE |
| HIGH⚡ | apps/rss_feeds/models.py | 4870 | ',null,1,null,null,null,null,null,0,1],"X","X",1,[1,1,1]' | CODE |
| HIGH⚡ | apps/rss_feeds/models.py | 4871 | f',1,1,null,0,0,null,0],"{base64_str}",{timestamp}' | CODE |
| HIGH | apps/rss_feeds/management/commands/calculate_scores.py | 79 | os.dup2(null, i) | CODE |
| HIGH | apps/rss_feeds/management/commands/calculate_scores.py | 83 | os.close(null) | CODE |
| HIGH | apps/oauth/views.py | 1175 | body: formData.toString() | CODE |
| HIGH | apps/notifications/models.py | 485 | apns.push(notification=notification, device_token=token) | CODE |
| HIGH | apps/archive_extension/views.py | 96 | matched_story_hash: str or null, | STRING |
| HIGH | localization/manage.py | 357 | "nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : " | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/discover/management/commands/discover_podcasts.py | 0 | use claude to categorize feeds that don't have categories. | STRING |
| HIGH | …s/discover/management/commands/discover_newsletters.py | 0 | use claude to categorize feeds that don't have categories. | STRING |
| HIGH | …ps/discover/management/commands/discover_subreddits.py | 0 | use claude to categorize feeds that don't have categories. | STRING |
| HIGH | …ps/discover/management/commands/discover_real_feeds.py | 0 | make a get request to feedly, optionally through scrapingbee proxy. | STRING |
| HIGH | …s/discover/management/commands/discover_newsletters.py | 0 | make a get request to feedly, optionally through scrapingbee proxy. | STRING |
| HIGH | …r/management/commands/backfill_underpopulated_feeds.py | 0 | make a get request to feedly, optionally through scrapingbee proxy. | STRING |
| HIGH | apps/recommendations/tests.py | 0 | this file demonstrates two different styles of tests (one doctest and one unittest). these will both pass when you run " | STRING |
| HIGH | apps/mobile/tests.py | 0 | this file demonstrates two different styles of tests (one doctest and one unittest). these will both pass when you run " | STRING |
| HIGH | apps/static/tests.py | 0 | this file demonstrates two different styles of tests (one doctest and one unittest). these will both pass when you run " | STRING |
| HIGH | apps/api/tests.py | 0 | this file demonstrates two different styles of tests (one doctest and one unittest). these will both pass when you run " | STRING |
| HIGH | apps/recommendations/tests.py | 0 | another way to test that 1 + 1 is equal to 2. >>> 1 + 1 == 2 true | STRING |
| HIGH | apps/mobile/tests.py | 0 | another way to test that 1 + 1 is equal to 2. >>> 1 + 1 == 2 true | STRING |
| HIGH | apps/static/tests.py | 0 | another way to test that 1 + 1 is equal to 2. >>> 1 + 1 == 2 true | STRING |
| HIGH | apps/api/tests.py | 0 | another way to test that 1 + 1 is equal to 2. >>> 1 + 1 == 2 true | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/ios/Widget Extension/WidgetStory.swift | 85 | content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur nec ornare dolor. Vivamus porta mi | CODE |
| LOW | clients/ios/Widget Extension/WidgetStory.swift | 85 | content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur nec ornare dolor. Vivamus porta mi | CODE |
| LOW | …er Sources/OnePasswordExtension/OnePasswordExtension.m | 596 | 'label-tag',m(a));e(c,'label-data',g(a,'data-label'));e(c,'label-aria',g(a,'aria-label'));e(c,'label-top',n(a));b=[];for | CODE |
| LOW | …roid/NewsBlur/app/src/test/resources/shortContent.json | 242 | "about": "Minim tempor commodo tempor enim duis voluptate pariatur consequat sit. Eiusmod eiusmod reprehenderit ipsu | CODE |
| LOW | node/tests/classifier_add_utils.test.js | 61 | value: 'Jane Doe', | CODE |
| LOW | node/tests/classifier_add_utils.test.js | 71 | like_author: 'Jane Doe' | CODE |
| LOW | node/tests/classifier_add_utils.test.js | 150 | const from_model = { feed_id: 42, type: 'author', value: 'Jane Doe', scope: 'feed', folder_name: '' }; | CODE |
| LOW | node/tests/classifier_add_utils.test.js | 151 | const from_dom = { feed_id: '42', type: 'author', value: 'Jane Doe', scope: undefined, folder_name: undefined }; | CODE |
| LOW | apps/reader/forms.py | 26 | attrs={"tabindex": 1, "class": "NB-input", "placeholder": _("Username or email")} | CODE |
| LOW | apps/reader/forms.py | 32 | widget=forms.PasswordInput(attrs={"tabindex": 2, "class": "NB-input", "placeholder": _("Password")}), | CODE |
| LOW⚡ | apps/reader/forms.py | 100 | widget=forms.TextInput(attrs={"class": "NB-input", "placeholder": _("Username")}), | CODE |
| LOW⚡ | apps/reader/forms.py | 109 | attrs={"maxlength": 75, "class": "NB-input", "placeholder": _("Email address")} | CODE |
| LOW⚡ | apps/reader/forms.py | 117 | attrs={"class": "NB-input", "placeholder": _("Password (optional)")}, | CODE |
| LOW | apps/reader/tests.py | 62 | self.user = User.objects.create_user(username="testuser", password="testpass", email="test@test.com") | CODE |
| LOW⚡ | apps/analyzer/tests.py | 91 | author="John Doe", | CODE |
| LOW⚡ | apps/analyzer/tests.py | 95 | self.assertEqual(classifier.author, "John Doe") | CODE |
| LOW⚡ | apps/analyzer/tests.py | 372 | author="John Doe", | CODE |
| LOW⚡ | apps/analyzer/tests.py | 377 | story = {"story_feed_id": self.feed.pk, "story_authors": "John Doe"} | CODE |
| LOW⚡ | apps/analyzer/tests.py | 1733 | author="John Doe", | CODE |
| LOW | apps/analyzer/tests.py | 44 | self.user = User.objects.create_user(username="testuser", password="testpass", email="test@test.com") | CODE |
| LOW | apps/analyzer/tests.py | 1702 | "story_authors": "John Doe", | CODE |
| LOW | apps/analyzer/tests.py | 1768 | author="John Doe", | CODE |
| LOW | apps/archive_extension/tests.py | 61 | email="test@test.com", | CODE |
| LOW | media/js/mobile/jquery.mobile-1.0b1.js | 4090 | if( !this.getAttribute('value') || text.length == 0 || $this.jqmData('placeholder') ){ | CODE |
| LOW | media/js/newsblur/reader/reader_add_feed.js | 507 | this.$('.NB-add-folder-input').attr('placeholder', interpolate(gettext("New folder under %(folder)s..."), {folde | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3508 | $input.attr('placeholder', interpolate(gettext('e.g., %(first)s or %(second)s'), {first: '\\bcat\\b' | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3510 | $input.attr('placeholder', interpolate(gettext('e.g., %(first)s or %(second)s'), {first: '\\bbreakin | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3512 | $input.attr('placeholder', interpolate(gettext('e.g., %(first)s or %(second)s'), {first: '/news/\\d+ | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3514 | $input.attr('placeholder', interpolate(gettext('e.g., %(first)s or %(second)s'), {first: '^Sam', sec | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3537 | $input.attr('placeholder', gettext('Enter text to match...')); | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3539 | $input.attr('placeholder', gettext('Enter URL pattern to match...')); | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3541 | $input.attr('placeholder', gettext('Enter author pattern...')); | CODE |
| LOW⚡ | media/js/newsblur/reader/reader_classifier.js | 3543 | $input.attr('placeholder', ''); | CODE |
| LOW⚡ | media/js/newsblur/views/story_ask_ai_view.js | 691 | $input.attr('placeholder', gettext('Recording...')); | CODE |
| LOW⚡ | media/js/newsblur/views/story_ask_ai_view.js | 701 | $input.attr('placeholder', gettext('Transcribing...')); | CODE |
| LOW⚡ | media/js/newsblur/views/story_ask_ai_view.js | 709 | $input.attr('placeholder', gettext('Follow up...')); | CODE |
| LOW | media/js/newsblur/views/story_ask_ai_view.js | 726 | $input.attr('placeholder', gettext('Follow up...')); | CODE |
| LOW | media/js/newsblur/views/story_ask_ai_view.js | 747 | $input.attr('placeholder', gettext('Quota exceeded')); | CODE |
| LOW | media/js/newsblur/views/story_ask_ai_view.js | 750 | $input.attr('placeholder', gettext('Follow up...')); | CODE |
| LOW⚡ | media/js/newsblur/views/story_detail_view.js | 2593 | $input.attr('placeholder', gettext('Recording...')); | CODE |
| LOW⚡ | media/js/newsblur/views/story_detail_view.js | 2599 | $input.attr('placeholder', gettext('Transcribing...')); | CODE |
| LOW⚡ | media/js/newsblur/views/story_detail_view.js | 2608 | $input.attr('placeholder', gettext('Ask a question...')); | CODE |
| LOW | media/js/newsblur/views/story_detail_view.js | 2629 | $input.attr('placeholder', gettext('Quota exceeded')); | CODE |
| LOW | media/js/newsblur/views/story_detail_view.js | 2636 | $input.attr('placeholder', error || gettext('Error - please try again')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1750 | $input.attr('placeholder', gettext('Recording...')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1757 | $input.attr('placeholder', gettext('Transcribing...')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1764 | $input.attr('placeholder', gettext('Ask about your browsing history...')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1773 | $input.attr('placeholder', gettext('Ask about your browsing history...')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1794 | $input.attr('placeholder', gettext('Ask about your browsing history...')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1799 | $input.attr('placeholder', gettext('Enable microphone in browser settings to use voice input')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1803 | $input.attr('placeholder', error || gettext('Voice recording failed. Please try again.')); | CODE |
| LOW⚡ | media/js/newsblur/views/archive_view.js | 1806 | $input.attr('placeholder', gettext('Ask about your browsing history...')); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/postgres/entrypoint.sh | 4 | # Create a user with the specified UID/GID | COMMENT |
| MEDIUM | utils/ai_functions.py | 87 | # Define the tool for classification | COMMENT |
| MEDIUM | utils/ratelimit.py | 18 | # This class is designed to be sub-classed | COMMENT |
| MEDIUM | blog/_plugins/paginated_feed.rb | 28 | # Create the feed page | COMMENT |
| MEDIUM | apps/reader/test_reader.py | 456 | # Create a folder-scoped classifier for "YouTube (no shorts)" (top-level path) | COMMENT |
| MEDIUM | apps/reader/test_reader.py | 543 | # Create a folder-scoped classifier with the full nested path | COMMENT |
| MEDIUM | apps/reader/tests.py | 149 | # Create a story with the new tag already | COMMENT |
| MEDIUM | apps/monitor/views/newsblur_llm_costs.py | 35 | # Define the dimensions we track (use centralized lists from RLLMCosts) | COMMENT |
| MEDIUM | apps/discover/views.py | 1511 | # Create a bare Feed record directly — no feed discovery, no HTTP requests | COMMENT |
| MEDIUM | apps/newsletters/models.py | 104 | # Create a new feed if it doesn't exist by stable newsletter identity. | COMMENT |
| MEDIUM | apps/search/models.py | 206 | # Create the finish callbacks | COMMENT |
| MEDIUM | apps/push/test_push.py | 3 | # This file is part of djpubsubhubbub. | COMMENT |
| MEDIUM | apps/push/test_push.py | 372 | # Create a feed first since PushSubscription requires it | STRING |
| MEDIUM | apps/profile/models.py | 498 | # Create the archived record | COMMENT |
| MEDIUM | apps/profile/views.py | 756 | # Create the instance. | COMMENT |
| MEDIUM | …ps/profile/management/commands/generate_dev_session.py | 56 | # Create a new session | COMMENT |
| MEDIUM | apps/analyzer/tests.py | 1526 | # Create a UserSubscriptionFolders entry so the endpoint can organize by folder | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | clients/ios/MarketingCooking/README.md | 5 | The five food photographs are real photography, downloaded from the source images and visually inspected. `photo-sources | CODE |
| HIGH | node/ask_ai.js | 1 | // Ask AI streaming handler -- relays AI-generated story summaries and Q&A | COMMENT |
| HIGH | node/briefing.js | 1 | // Briefing streaming handler -- relays AI-generated news briefing progress | COMMENT |
| HIGH | apps/briefing/views.py | 232 | # views.py: Add display names for AI-generated sections not in BRIEFING_SECTION_DEFINITIONS. | COMMENT |
| HIGH | apps/archive_extension/models.py | 49 | # AI-generated categorization | COMMENT |
| HIGH | media/js/newsblur/models/briefing_sections.js | 26 | // the section order from the AI-generated summary HTML. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | clients/ios/Classes/StoryPagesObjCViewController.m | 1381 | // Update content inset on all pages' web views so swiping between them is seamless | COMMENT |
| MEDIUM | clients/store/artwork/android/16.0/capture-tablet.rb | 2 | # capture-tablet.rb composes only real native panes, after the isolated harness has seeded its account. | COMMENT |
| MEDIUM | utils/feedfinder_pilgrim.py | 404 | ##### test harness ###### | COMMENT |
| MEDIUM | utils/scrubber/__init__.py | 281 | # TODO: This probably needs to be more robust | COMMENT |
| MEDIUM | ansible/roles/consul/files/consul.hcl | 47 | # This cannot be used in conjunction with the legacy -bootstrap flag. This flag requires | COMMENT |
| LOW | apps/rss_feeds/models.py | 2165 | # Don't mangle stories with code, just use new | COMMENT |
| MEDIUM | apps/ask_ai/prompts.py | 48 | full_prompt="""Please provide a comprehensive paragraph summary of the following article. | CODE |
| MEDIUM | apps/webfeed/prompts.py | 78 | # On retry, the first pass matched nothing; nudge hard toward robust selectors. | COMMENT |
| LOW | apps/clustering/models.py | 801 | # existing zCL: — just add new members and update sCL: pointers. | COMMENT |
| MEDIUM | apps/profile/views.py | 411 | # Log comprehensive debugging info to diagnose the encoding issue | COMMENT |
| LOW | apps/notifications/models.py | 430 | # - export "Apple Push Service: com.newsblur.NewsBlur" as aps.p12 (or just use aps.cer in #5) | COMMENT |
| MEDIUM | media/js/mobile/jquery.mobile-1.0b1.js | 1283 | // robust, there are a few unfortunate browser bugs surrounding expected | COMMENT |
| MEDIUM | media/js/newsblur/welcome/welcome.js | 33 | // Clone all cards and append them for seamless infinite loop. | COMMENT |
| MEDIUM | media/js/newsblur/welcome/welcome.js | 89 | // Never wrap — use the duplicate content for seamless transitions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 6047 | // Step 1: Remove classifier at old scope | COMMENT |
| LOW | clients/ios/Classes/NewsBlurAppDelegate.m | 6060 | // Step 2: Add classifier at new scope after remove succeeds | COMMENT |
| LOW⚡ | utils/feed_fetcher.py | 152 | # Step 1: HTML Unescaping - convert HTML entities to their literal characters | COMMENT |
| LOW⚡ | utils/feed_fetcher.py | 156 | # Step 2: Encoding Reinterpretation | COMMENT |
| LOW⚡ | apps/rss_feeds/models.py | 4844 | # Step 1: Fetch the Google News article page to get signature and timestamp. | COMMENT |
| LOW⚡ | apps/rss_feeds/models.py | 4866 | # Step 2: Call batchexecute API to decode the URL | COMMENT |
| LOW | …s/discover/management/commands/discover_newsletters.py | 1361 | # Step 1: Always fetch sitemap to get publication slugs (fast, idempotent) | COMMENT |
| LOW | …s/discover/management/commands/discover_newsletters.py | 1395 | # Step 2: Fetch each publication page for metadata | COMMENT |
| LOW | …r/management/commands/backfill_underpopulated_feeds.py | 149 | # Step 1: Load fixture and identify gaps | COMMENT |
| LOW | …r/management/commands/backfill_underpopulated_feeds.py | 206 | # Step 3: Categorize discovered feeds with Claude | COMMENT |
| LOW | …r/management/commands/backfill_underpopulated_feeds.py | 217 | # Step 4: Merge into fixture | COMMENT |
| LOW⚡ | apps/webfeed/tasks.py | 567 | # Step 4: Variants already carry preview stories and are ranked best-first. | COMMENT |
| LOW | apps/webfeed/tasks.py | 420 | # Step 1: Fetch page HTML | COMMENT |
| LOW | apps/webfeed/tasks.py | 446 | # Step 2: Call the configured LLM for XPath analysis. The model is non-deterministic | COMMENT |
| LOW | apps/webfeed/tasks.py | 513 | # Step 3: First analysis pass, plus a single retry when nothing matched. | COMMENT |
| LOW⚡ | apps/profile/models.py | 1850 | # Step 1: Get the order to retrieve purchaseToken | COMMENT |
| LOW⚡ | apps/profile/models.py | 1869 | # Step 2: Store GooglePlayIds for RTDN mapping | COMMENT |
| LOW⚡ | apps/profile/models.py | 1897 | # Step 4: Determine renewals from latestOrderId | COMMENT |
| LOW | apps/profile/models.py | 1882 | # Step 3: Get full subscription state via purchaseToken | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | archive/munin/munin/cassandra.py | 24 | CODE | |
| LOW | utils/mongo_raw_log_middleware.py | 93 | CODE | |
| LOW | utils/PyRSS2Gen.py | 314 | CODE | |
| LOW | utils/PyRSS2Gen.py | 433 | CODE | |
| LOW | utils/exception_middleware.py | 31 | CODE | |
| LOW | newsblur_mcp/newsblur_mcp/tools/stories.py | 9 | CODE | |
| LOW | newsblur_mcp/newsblur_mcp/tools/stories.py | 57 | CODE | |
| LOW | newsblur_mcp/newsblur_mcp/tools/stories.py | 154 | CODE | |
| LOW | newsblur_mcp/newsblur_mcp/tools/stories.py | 193 | CODE | |
| LOW | newsblur_mcp/newsblur_mcp/tools/classifiers.py | 7 | CODE | |
| LOW | newsblur_mcp/newsblur_mcp/tools/classifiers.py | 64 | CODE | |
| LOW | apps/reader/models.py | 189 | CODE | |
| LOW | apps/reader/models.py | 486 | CODE | |
| LOW | apps/reader/models.py | 752 | CODE | |
| LOW | apps/reader/models.py | 1798 | CODE | |
| LOW | apps/reader/models.py | 1914 | CODE | |
| LOW | apps/reader/views.py | 736 | CODE | |
| LOW | apps/reader/views.py | 912 | CODE | |
| LOW | apps/listen/voices.py | 219 | CODE | |
| LOW | apps/social/models.py | 1105 | CODE | |
| LOW | apps/social/models.py | 1210 | CODE | |
| LOW | apps/social/models.py | 1313 | CODE | |
| LOW | apps/social/models.py | 1425 | CODE | |
| LOW | apps/briefing/scoring.py | 36 | CODE | |
| LOW | apps/profile/models.py | 5592 | CODE | |
| LOW | apps/profile/views.py | 144 | CODE | |
| LOW | apps/profile/views.py | 166 | CODE | |
| LOW | apps/profile/views.py | 345 | CODE | |
| LOW | apps/profile/views.py | 377 | CODE | |
| LOW | apps/profile/views.py | 388 | CODE | |
| LOW | apps/profile/views.py | 403 | CODE | |
| LOW | apps/analyzer/models.py | 1245 | CODE | |
| LOW | apps/analyzer/models.py | 1435 | CODE | |
| LOW | apps/analyzer/views.py | 347 | CODE | |
| LOW | apps/analyzer/views.py | 574 | CODE | |
| LOW | apps/analyzer/views.py | 858 | CODE | |
| LOW | apps/archive_extension/models.py | 171 | CODE | |
| LOW | apps/archive_extension/search.py | 230 | CODE | |
| LOW | apps/archive_extension/search.py | 320 | CODE | |
| LOW | localization/manage.py | 118 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | clients/ios/Other Sources/fmdb/fmdb.m | 875 | // just mix things up a bit for demonstration purposes. | COMMENT |
| MEDIUM | clients/ios/Other Sources/fmdb/fmdb.m | 1262 | // just mix things up a bit for demonstration purposes. | COMMENT |
| MEDIUM | clients/ios/Other Sources/fmdb/fmdb.m | 1297 | // just mix things up a bit for demonstration purposes. | COMMENT |
| LOW | archive/fabfile.py | 1420 | # Don't forget to add 'setup_postgres_backups' to new | COMMENT |
| MEDIUM | config/pystartup.py | 3 | # bound to the Esc key by default (you can change it - see readline docs). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | utils/feed_fetcher.py | 2009 | # If fetching archive pages, come back once the archive scaffolding is built | COMMENT |
| MEDIUM | apps/webfeed/prompts.py | 70 | # Truncate HTML to ~100KB for LLM context window | COMMENT |
| MEDIUM | apps/clustering/models.py | 561 | # Two guardrails must pass: | COMMENT |
| MEDIUM | apps/clustering/models.py | 679 | # guardrails from find_semantic_clusters apply here for any remaining | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | utils/prometheus_worker_slots.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | utils/prometheus_middleware.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | utils/pipeline_utils.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | utils/scrubber/__init__.py | 12 | __all__ = ["Scrubber", "SelectiveScriptScrubber", "ScrubberWarning", "UnapprovedJavascript", "urlize"] | CODE |
| LOW | newsblur_web/__init__.py | 7 | __all__ = ["celery_app"] | CODE |
| LOW | newsblur_mcp/newsblur_mcp/auth.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | newsblur_mcp/newsblur_mcp/server.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | newsblur_mcp/newsblur_mcp/cli/auth.py | 73 | def set_server_url(server: str) -> None: | CODE |
| LOW | newsblur_mcp/newsblur_mcp/cli/auth.py | 280 | def set_readonly(enabled: bool) -> None: | CODE |
| LOW | apps/api/social_auth.py | 29 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | utils/retry_unlinked_loop.sh | 8 | # Usage: | COMMENT |
| LOW | utils/consul_ui.sh | 11 | # Usage: | COMMENT |
| LOW | utils/bootstrap_loop.sh | 8 | # Usage: | COMMENT |
| LOW | utils/check_health.sh | 5 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/ask_ai/test_tasks.py | 21 | CODE |