The RSS feed for websites missing it
This report summarizes scanner evidence for RSS-Bridge/rss-bridge, a PHP project with 9,325 GitHub stars. SynthScan examined 101,174 lines of code across 748 source files, recording 117 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low 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? 100 finding(s).
Are imports declared and package/API names verified? 17 finding(s).
Are wrappers, guards, and repeated structures necessary? 41 finding(s).
Which changes need focused human review? 117 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 117 distinct pattern matches across 6 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 |
|---|---|---|---|---|
| LOW | tests/UberEngineeringBridgeTest.php | 9 | public function testExtractArticleFeedFromHtml(): void | CODE |
| LOW | tests/UberEngineeringBridgeTest.php | 39 | public function testExtractArticleFeedFromHtmlThrowsWhenFeedScriptIsMissing(): void | CODE |
| LOW | tests/UtilsTest.php | 59 | public function testSanitizePathNameInErrorMessage() | CODE |
| LOW | tests/YoutubeTest.php | 39 | public function testHandleYoutubeNotIframe() | CODE |
| LOW | tests/ConfigurationTest.php | 12 | public function testValueFromDefaultConfig() | CODE |
| LOW | tests/ConfigurationTest.php | 22 | public function testValueFromCustomConfig() | CODE |
| LOW | docs/06_Helper_functions/index.md | 206 | function stripRecursiveHTMLSection(string $string, string $tag_name, string $tag_start) : string | CODE |
| LOW | bridges/GitlabIssueBridge.php | 193 | private function parseMergeRequestDescription() | CODE |
| LOW | bridges/WikipediaBridge.php | 142 | private function addTodaysFeaturedArticleGeneric( | CODE |
| LOW | bridges/BookMyShowBridge.php | 1189 | private function generateEventDetailsTable($event, $headers = self::TABLE_HEADERS) | CODE |
| LOW | bridges/BookMyShowBridge.php | 1236 | private function generateInnerMovieDetails($data) | CODE |
| LOW | bridges/ShanaprojectBridge.php | 144 | private function extractAnimeEpisodeInformation($anime) | CODE |
| LOW | bridges/ShanaprojectBridge.php | 156 | private function extractAnimeBackgroundImage($anime) | CODE |
| LOW | bridges/UberEngineeringBridge.php | 50 | public static function extractArticleFeedFromHtml(string $html, string $path): array | CODE |
| LOW | bridges/RadioFranceBridge.php | 177 | private function convertJsonChildrenToHTML($children) | CODE |
| LOW | bridges/XPathBridge.php | 206 | protected function getSettingUseRawItemContent(): bool | CODE |
| LOW⚡ | bridges/XPathBridge.php | 233 | protected function getExpressionItemTimestamp(): string | CODE |
| LOW⚡ | bridges/XPathBridge.php | 243 | protected function getExpressionItemEnclosures(): string | CODE |
| LOW⚡ | bridges/XPathBridge.php | 252 | protected function getExpressionItemCategories(): string | CODE |
| LOW | bridges/BlueskyBridge.php | 672 | private function getStarterPackDescription(array $record): string | CODE |
| LOW | bridges/NextInkBridge.php | 89 | protected function collectArticlesFromHtmlListing($url, $limit) | CODE |
| LOW | bridges/JustETFBridge.php | 239 | private function extractFullArticleContent($article) | CODE |
| LOW | bridges/YoutubeBridge.php | 314 | private function ytBridgeGetVideoDescriptionEnhancements( | CODE |
| LOW | bridges/YoutubeBridge.php | 498 | private function fetchItemsFromFromJsonData($jsonData) | CODE |
| LOW | bridges/KununuBridge.php | 133 | private function extractArticleDescription($json) | CODE |
| LOW | bridges/GiteaBridge.php | 259 | protected function collectSingleIssueOrPrData($html) | CODE |
| LOW | bridges/NintendoBridge.php | 396 | protected function getExpressionItemTimestamp() | CODE |
| LOW | bridges/NintendoBridge.php | 411 | protected function getExpressionItemCategories() | CODE |
| LOW | bridges/Vk2Bridge.php | 186 | protected function getImageURLWithLargestWidth($items) | CODE |
| LOW | bridges/CssSelectorComplexBridge.php | 356 | protected function fetchArticleElementFromPage($entry_url, $content_selector) | CODE |
| LOW | bridges/FacebookBridge.php | 313 | private function extractGroupPostEnclosures($post) | CODE |
| LOW | actions/DisplayAction.php | 146 | private function createFeedItemFromException($e, BridgeAbstract $bridge): array | CODE |
| LOW | lib/TwitterClient.php | 81 | private function extractTweetAndUsersFromGraphQL($timeline) | CODE |
| LOW | lib/TwitterClient.php | 282 | private function fetchUserInfoByScreenName(string $screenName) | CODE |
| LOW | lib/html.php | 337 | function parseSrcsetLargestImageUrl(string $srcset) | CODE |
| LOW | lib/html.php | 482 | function stripRecursiveHTMLSection($string, $tag_name, $tag_start) | CODE |
| LOW⚡ | lib/XPathAbstract.php | 270 | protected function getExpressionItemTimestamp() | CODE |
| LOW⚡ | lib/XPathAbstract.php | 280 | protected function getExpressionItemEnclosures() | CODE |
| LOW⚡ | lib/XPathAbstract.php | 289 | protected function getExpressionItemCategories() | CODE |
| LOW | lib/XPathAbstract.php | 307 | protected function getSettingUseRawItemContent(): bool | CODE |
| LOW | lib/parsedown/Parsedown.php | 1618 | protected function filterUnsafeUrlInAttribute(array $Element, $attribute) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bridges/AppleAppStoreBridge.php | 21 | // 'iPad' => 'ipad', | COMMENT |
| LOW | bridges/PatreonBridge.php | 61 | //'like_count', | COMMENT |
| LOW | bridges/CollegeDeFranceBridge.php | 41 | foreach ($html->find('a[data-target]') as $element) { | COMMENT |
| LOW | bridges/DeveloppezDotComBridge.php | 241 | */ | COMMENT |
| LOW | bridges/DeveloppezDotComBridge.php | 261 | // with only one encoding. We have to check every paragraph and | COMMENT |
| LOW | bridges/NextgovBridge.php | 41 | // $media = $newsItem->children($namespaces['media']); | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 81 | <<<QUOTES | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 101 | //It is now, and in this world, that we must live. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 121 | //Its amazing how much good you can do if you dont care who gets the credit. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 141 | //Stay true to those who would do the same for you. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 161 | //You will make many changes before settling down happily. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 181 | //Good health will be yours for a long time. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 201 | //Good news from afar may bring you a welcome visitor. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 221 | //You will have unexpected great good luck. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 241 | //You will soon witness a miracle. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 261 | //When you expect your opponent to yield, you also should avoid hurting him. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 281 | //Punctuality is the politeness of kings and the duty of gentle people | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 301 | //An admirer is concealing his/her affection for you. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 321 | //Put your unhappiness aside. Life is beautiful, be happy. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 341 | //To effect the quality of the day is no small achievement. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 361 | //A dream you have will come true | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 381 | better. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 401 | //Things are never quite the way they seem. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 421 | //A single kind work will keep one warm for years. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 441 | //Isn't there something else you should be working on right now? | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 461 | from still loving them again even after all that pain. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 481 | to you. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 501 | //Hope brings about a better future | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 521 | //Rarely do great beauty and great virtue dwell together as they do in you. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 541 | //It is much easier to look for the bad, than it is to find the good | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 561 | //Someone stole your fortune and replaced it with this one. Your luck sucks. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 581 | //Rest has a peaceful effect on your physical and emotional health. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 601 | //Be prepared for extra energy. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 621 | //Help, I'm prisoner in a Chinese bakery!!! | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 641 | //When you can't naturally feel upbeat it can sometimes help you to act as if | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 661 | //The best things in life aren't things. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 681 | //All troubles you have can pass away very quickly. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 701 | //You know where you are going and how to get there. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 721 | //The joyful energy of the day will have a positive affect on you. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 741 | //A small lucky package is on its way to you soon. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 761 | //A new friend helps you break out of an old routine. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 781 | //Your succeess will astonish everyone. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 801 | //You will be successful in your work | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 821 | //The gambler is like the fisherman both have beginners luck. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 841 | //The eyes believe themselves; the ears believe other people. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 861 | //Don't just spend time, invest it. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 881 | //Excuses are easy to manufacture, and hard to sell. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 901 | //today you should be a passenger. Stay close to a driver for a day. | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 921 | //Be a generous friend and a fair enemy | COMMENT |
| LOW | bridges/OneFortuneADayBridge.php | 941 | //Being happy is not always being perfect. | COMMENT |
| LOW | lib/TwitterClient.php | 201 | 'user_info' => [], | COMMENT |
| LOW | lib/simplehtmldom/simple_html_dom.php | 1161 | COMMENT | |
| LOW | lib/parsedown/Parsedown.php | 1 | <?php | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/BridgeCardTest.php | 62 | $this->assertSame('<input type="text" id="id" name="name" value="val" placeholder="placeholder" pattern="\d\d" c | CODE |
| LOW | tests/BridgeCardTest.php | 67 | 'placeholder' => 'placeholder', | CODE |
| LOW | docs/06_Helper_functions/index.md | 173 | // 'John Doe' | COMMENT |
| LOW⚡ | docs/06_Helper_functions/index.md | 282 | truncate('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a neque nunc. Nam nibh sem.', 20 , '...'); | CODE |
| LOW⚡ | docs/06_Helper_functions/index.md | 282 | truncate('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a neque nunc. Nam nibh sem.', 20 , '...'); | CODE |
| LOW⚡ | docs/06_Helper_functions/index.md | 292 | <body><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p> | CODE |
| LOW⚡ | docs/06_Helper_functions/index.md | 292 | <body><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p> | CODE |
| LOW | static/rss-bridge.js | 44 | inputElement.value = inputElement.getAttribute("placeholder"); | CODE |
| LOW | .github/prtester.py | 88 | if parameter.get('placeholder') == '': | STRING |
| LOW | .github/prtester.py | 94 | context_parameters[parameter_name] = parameter.get('placeholder') | STRING |
| LOW | actions/FrontpageAction.php | 255 | 'placeholder' => $parameter['exampleValue'], | CODE |
| LOW | actions/FrontpageAction.php | 273 | 'placeholder' => $parameter['exampleValue'], | CODE |
| LOW | lib/seotags.php | 193 | // At this point, $field = ['author', 'name'] and $json_root = {"author": {"name": " | COMMENT |
| LOW | lib/seotags.php | 200 | $json_root = $json_root[0]; // Unwrap list of single item e.g. {"author" | CODE |
| LOW | lib/seotags.php | 212 | // At this point, $field = "name" and $json_root = {"name": "John Doe"} | COMMENT |
| LOW | lib/seotags.php | 225 | break; // Stop on first match, e.g. {"author":{"name":"John Doe"}} has prior | CODE |
| LOW | lib/html.php | 108 | 'placeholder', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | bridges/PixivBridge.php | 213 | //exclude AI generated works if unchecked. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/05_Bridge_API/02_BridgeAbstract.md | 38 | ## Step 1 - Create a new file | COMMENT |
| LOW | docs/05_Bridge_API/02_BridgeAbstract.md | 42 | ## Step 2 - Add a class, extending `BridgeAbstract` | COMMENT |
| LOW | docs/05_Bridge_API/02_BridgeAbstract.md | 61 | ## Step 3 - Add general constants to the class | COMMENT |
| LOW | docs/05_Bridge_API/02_BridgeAbstract.md | 93 | ## Step 4 - Implement a function to collect feed data | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/WebDriverAbstract.php | 134 | * Don't forget to call cleanUp() at the end. | COMMENT |