RSS reader for macOS and iOS.
This report summarizes scanner evidence for Ranchero-Software/NetNewsWire, a Swift project with 10,492 GitHub stars. SynthScan examined 149,467 lines of code across 975 source files, recording 181 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 1.5 (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? 177 finding(s).
Are imports declared and package/API names verified? 3 finding(s).
Are wrappers, guards, and repeated structures necessary? 6 finding(s).
Which changes need focused human review? 181 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 181 distinct pattern matches across 11 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 | …WireTests/ArticleStringFormatterPerformanceTests.swift | 1 | // | COMMENT |
| LOW | …/NetNewsWireTests/SanitizedTitlePerformanceTests.swift | 1 | // | COMMENT |
| LOW | …WireTests/NSAttributedStringHTMLPerformanceTests.swift | 1 | // | COMMENT |
| LOW | …sts/NetNewsWireTests/ArticleStringFormatterTests.swift | 61 | // | COMMENT |
| LOW | Shared/AccountType+Helpers.swift | 1 | // | COMMENT |
| LOW | Shared/SmartFeeds/UnreadFeed.swift | 1 | // | COMMENT |
| LOW | Shared/Settings/AddCloudKitAccount.swift | 1 | // | COMMENT |
| LOW | …d/Article Rendering/ArticleRenderingSpecialCases.swift | 1 | // | COMMENT |
| LOW | Shared/Extensions/ArticleStringFormatter.swift | 161 | /// `<abbr title="…">` is recognized as `abbr`. | COMMENT |
| LOW | Shared/Extensions/NSAttributedString+Extensions.swift | 1 | // | COMMENT |
| LOW | Shared/Extensions/NSAttributedString+Extensions.swift | 61 | descriptor = descriptor.withSymbolicTraits(symbolicTraits)! | COMMENT |
| LOW | Shared/Extensions/IconImageView.swift | 1 | // | COMMENT |
| LOW | Shared/Extensions/RSImage+Extensions.swift | 1 | // | COMMENT |
| LOW | iOS/NetNewsWire-iOS-Bridging-Header.h | 1 | // | COMMENT |
| LOW | iOS/UIKit Extensions/SFSafariViewController+Extras.m | 1 | // | COMMENT |
| LOW | iOS/Article/WebViewFullscreenKeeper.swift | 1 | // | COMMENT |
| LOW | Mac/NetNewsWire-Bridging-Header.h | 1 | // | COMMENT |
| LOW | Mac/NSOpenPanel+Extras.m | 1 | // | COMMENT |
| LOW | Mac/Browser.swift | 1 | // | COMMENT |
| LOW | Mac/MainWindow/AddFeed/AddFeedController.swift | 1 | // | COMMENT |
| LOW | Mac/CrashReporter/CrashReporter.swift | 1 | // | COMMENT |
| LOW | Mac/SafariExtension/SafariExtensionHandler.swift | 1 | // | COMMENT |
| LOW | scripts/symbolicate_json_crash.sh | 1 | #!/bin/bash | COMMENT |
| LOW | buildscripts/VerifyNoBS.swift | 1 | #!/usr/bin/swift | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/URL+RSCoreTests.swift | 1 | // | COMMENT |
| LOW | …e/Tests/RSCoreTests/MultilineTextFieldSizerTests.swift | 1 | // | COMMENT |
| LOW | …/Tests/RSCoreTests/SingleLineTextFieldSizerTests.swift | 1 | // | COMMENT |
| LOW | …Core/Tests/RSCoreTests/CollapsingWhitespaceTests.swift | 1 | // | COMMENT |
| LOW | …RSCoreTests/CollapsingWhitespacePerformanceTests.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/StripHTMLTests.swift | 61 | @Test func emptyString() { | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/StripHTMLTests.swift | 81 | #expect(source.strippingHTML(maxCharacters: nil) == "hello world") | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/StripHTMLTests.swift | 121 | let expectedOutput = try String(contentsOf: txtURL, encoding: .utf8) | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/StripHTMLTests.swift | 141 | // print("cp /tmp/apple.txt Tests/RSCoreTests/Resources/") | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 21 | // | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 41 | // let utf16 = bigHTML.data(using: .utf16)! | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 61 | // XCTAssertFalse(noLT.isProbablyHTML) | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 81 | // } | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 101 | // } | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 121 | // | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 141 | // XCTAssertEqual(noHead.isProbablyHTML, (noHead as NSData).rs_dataIsProbablyHTML()) | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 161 | // | COMMENT |
| LOW | Modules/RSCore/Tests/RSCoreTests/Data+RSCoreTests.swift | 181 | // XCTAssertEqual(data.hexadecimalString!, (data as NSData).rs_hexadecimalString()) | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/Geometry.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/MacroProcessor.swift | 21 | var renderedText: String { | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/Logging.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/MainThreadOperation.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/Calendar+RSCore.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/FileManager+RSCore.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/Data+RSCore.swift | 21 | md5Hash.hexadecimalString | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/CoalescingQueue.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/Renamable.swift | 1 | // | COMMENT |
| LOW | …s/RSCore/Sources/RSCore/MainThreadOperationQueue.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/SendToCommand.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/SendToCommand.swift | 21 | /// See NetNewsWire. | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/SendToCommand.swift | 41 | /// Send an object to the target application. | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/StripHTML.swift | 1 | // | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/StripHTML.swift | 21 | // + inessential.html + scripting.html, | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/StripHTML.swift | 61 | // MARK: - Implementation | COMMENT |
| LOW | Modules/RSCore/Sources/RSCore/StripHTML.swift | 141 | return true | COMMENT |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 1114 | "content_html": "<p>I've been using OmniFocus ask my task manager for a good few years now, and I frequently | CODE |
| MEDIUM | …dules/RSParser/Tests/RSParserTests/Resources/3960.json | 233 | "content_html": "<blockquote><p>Dies ist meine Philosophie über Programmierung. Es gibt viele davon, aber diese hi | CODE |
| MEDIUM | …dules/RSParser/Tests/RSParserTests/Resources/3960.json | 462 | "content_html": "<p>Ein Tipp von den Wedeler Jungs: Gregory Travis erklärt aus seiner Erfahrung als Programmierer | CODE |
| MEDIUM | …dules/RSParser/Tests/RSParserTests/Resources/3960.json | 492 | "content_html": "<p>Meine persönlichen Grundsätze für Programmierung finden sich bestens in dem Artikel <a href=\" | CODE |
| MEDIUM | …dules/RSParser/Tests/RSParserTests/Resources/curt.json | 1 | {"icon":"http:\/\/curtclifton.net\/style\/feedicon.png","user_comment":"This feed allows you to read the posts from this | CODE |
| LOW | …dules/RSParser/Tests/RSParserTests/Resources/curt.json | 1 | {"icon":"http:\/\/curtclifton.net\/style\/feedicon.png","user_comment":"This feed allows you to read the posts from this | CODE |
| MEDIUM | …les/RSParser/Tests/RSParserTests/Resources/natasha.xml | 561 | <p>These small and invisible interactions with your app really change the concept of what an app is. An app is now somet | CODE |
| MEDIUM | …les/RSParser/Tests/RSParserTests/Resources/natasha.xml | 805 | <p>In the try! Swift Japan app, I hard-coded everything into arrays and dictionaries to load every time (after all, it w | CODE |
| MEDIUM | …rser/Tests/RSParserTests/Resources/DaringFireball.json | 191 | "content_html" : "\n<p>Kyle Orland, reporting for Ars Technica:</p>\n\n<blockquote>\n <p>Since the days of the | CODE |
| MEDIUM | …rser/Tests/RSParserTests/Resources/DaringFireball.json | 430 | "content_html" : "\n<p>Randy Nelson, writing for the Sensor Tower blog:</p>\n\n<blockquote>\n <p>According to | CODE |
| MEDIUM | …rser/Tests/RSParserTests/Resources/DaringFireball.json | 430 | "content_html" : "\n<p>Randy Nelson, writing for the Sensor Tower blog:</p>\n\n<blockquote>\n <p>According to | CODE |
| MEDIUM | …rser/Tests/RSParserTests/Resources/DaringFireball.json | 537 | "content_html" : "\n<p>Federico Viticci, MacStories, “<a href=\"https://www.macstories.net/stories/the-10 | CODE |
| MEDIUM | …ules/RSParser/Tests/RSParserTests/Resources/furbo.html | 162 | <p>What we’re seeing here is law enforcement’s complete lack of understanding of how digital devices store a | CODE |
| MEDIUM | …ules/RSParser/Tests/RSParserTests/Resources/pxlnv.json | 86 | "content_html": "<p>Zack Whittaker, <em>ZDNet</em>:</p>\n\n<blockquote>\n <p>Hackers stole more data from E | CODE |
| MEDIUM | …ules/RSParser/Tests/RSParserTests/Resources/pxlnv.json | 86 | "content_html": "<p>Zack Whittaker, <em>ZDNet</em>:</p>\n\n<blockquote>\n <p>Hackers stole more data from E | CODE |
| MEDIUM | …ules/RSParser/Tests/RSParserTests/Resources/pxlnv.json | 121 | "content_html": "<p>There is something unique about deliberately contrarian-for-the-sake-of-being-contrarian | CODE |
| MEDIUM | …RSParser/Tests/RSParserTests/Resources/dcrainmaker.xml | 500 | <p>Taking a quick detour to look at the sizes and weights of the watches, I’ve lined up the Apple Watch Series 3 LTE wit | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …dules/RSCore/Tests/RSCoreTests/Resources/scripting.txt | 1 | Scripting News SCRIPTING NEWS It's even worse than it appears.. Go Monday, October 20, 2025 Frontier's Simple Cross-Netw | CODE |
| HIGH | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 806 | "content_html": "<p><img title=\"OmniFocus 3 Temp Logo\" alt=\"OmniFocus 3 Temp Logo\" class=\"image-right\" | CODE |
| HIGH | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 807 | "content_text": "\nI'm fortunate enough to have been let into the very early OmniFocus 3 Beta. The app isn't | CODE |
| HIGH | …arser/Tests/RSParserTests/Resources/ScriptingNews.json | 891 | "description": "<p>Richard is one of the old school bloggers. He started <a href=\"https://web.archi | CODE |
| HIGH | …arser/Tests/RSParserTests/Resources/ScriptingNews.json | 906 | "text": "He has a <a href=\"http://altplatform.org/2017/06/20/building-a-blogroll-in-201 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 288 | "content_html": "<p><img title=\"Automators Artwork\" alt=\"Automators Artwork\" class=\"image-right\" src=\ | CODE |
| LOW | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 890 | "content_html": "<p>I recently bought a <a href=\"https:\/\/shop.pimoroni.com\/products\/mood-light-pi-zero- | CODE |
| LOW | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 891 | "content_text": "I recently bought a Raspberry Pi Zero W mood light kit on Pimoroni. I've been looking for a | CODE |
| LOW⚡ | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 1058 | "content_html": "<p>Today is the day, Apple fans are perhaps a little too excited but that's par for the cou | CODE |
| LOW⚡ | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 1058 | "content_html": "<p>Today is the day, Apple fans are perhaps a little too excited but that's par for the cou | CODE |
| LOW⚡ | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 1059 | "content_text": "Today is the day, Apple fans are perhaps a little too excited but that's par for the course | CODE |
| LOW⚡ | …dules/RSParser/Tests/RSParserTests/Resources/rose.json | 1059 | "content_text": "Today is the day, Apple fans are perhaps a little too excited but that's par for the course | CODE |
| MEDIUM | …les/RSParser/Tests/RSParserTests/Resources/natasha.xml | 66 | <description><![CDATA[I recently wrote about why I prefer not to use default implementations in Swift protocols. Here | CODE |
| MEDIUM | …RSParser/Tests/RSParserTests/Resources/dcrainmaker.xml | 1469 | <p><em>Update: You can now pre-order the <a href="http://www.clevertraining.com/garmin-descent-mk1-gps-dive-watch?acc=16 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/symbolicate_all_crashes.sh | 43 | # Check if symbolication scripts exist | COMMENT |
| LOW | scripts/symbolicate_all_crashes.sh | 113 | # Check if symbolicated file already exists | COMMENT |
| LOW | scripts/symbolicate_crash.sh | 34 | # Check if crash log file is provided | COMMENT |
| LOW | scripts/symbolicate_crash.sh | 177 | # Check if name/bundle ID matches | COMMENT |
| LOW | scripts/symbolicate_crash.sh | 309 | # Check if this is a stack frame line using grep (handles tabs/spaces better) | COMMENT |
| LOW | scripts/symbolicate_json_crash.sh | 37 | # Check if jq is available | COMMENT |
| LOW | scripts/symbolicate_json_crash.sh | 233 | # Check if we got a real symbol (not just address back) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …/RSCore/Tests/RSCoreTests/Resources/daringfireball.txt | 1 | Daring Fireball By John Gruber Archive The Talk Show Dithering Projects Contact Colophon Feeds / Social Sponsorship | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Shared/Article Rendering/main.js | 22 | function preserveAspectRatioOfFixedSizeFrame(element) { | CODE |
| LOW | Shared/Article Rendering/main.js | 55 | function constrainBodyRelativeIframes() { | CODE |
| LOW | Shared/Article Rendering/main.js | 216 | function removeInstapaperIgnoreElements() { | CODE |
| LOW | buildscripts/gyb.py | 135 | def tokenize_python_to_unmatched_close_curly(source_text, start, line_starts): | STRING |
| LOW | buildscripts/gyb.py | 364 | def code_starts_with_dedent_keyword(source_lines): | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buildscripts/gyb.py | 135 | CODE | |
| LOW | buildscripts/gyb.py | 416 | CODE | |
| LOW | buildscripts/gyb.py | 575 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …WireTests/ArticleStringFormatterPerformanceTests.swift | 94 | let loremParagraph = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut l | CODE |
| LOW | …WireTests/ArticleStringFormatterPerformanceTests.swift | 94 | let loremParagraph = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut l | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Modules/Account/Sources/Account/AccountManager.swift | 646 | print("Error reading Accounts folder: \(error)") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buildscripts/gyb.py | 5 | CODE |