AI Slop Code Risk Monitor

pixelfed/pixelfed

SlopCodeMonitor badge for pixelfed/pixelfed Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Photo Sharing. For Everyone.

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for pixelfed/pixelfed, a PHP project with 7,132 GitHub stars. SynthScan examined 429,179 lines of code across 2955 source files, recording 272 pattern matches distributed across 4 syntactic categories. The legacy adjusted pattern signal is 0.7 (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.

0.7
Adjusted Signal
0.7
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
7.1K
Stars
PHP
Language
429.2K
Lines of Code
3.0K
Files
272
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

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.

Cognitive Ownership Risk 2.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 234 finding(s).

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

Are imports declared and package/API names verified? 38 finding(s).

Agent Over-Engineering Ratio 2.1/100 · LOW

Are wrappers, guards, and repeated structures necessary? 176 finding(s).

PR Review Velocity Impact 3.2/100 · LOW

Which changes need focused human review? 272 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 0MEDIUM 6LOW 266

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 272 distinct pattern matches across 4 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.

Hyper-Verbose Identifiers176 hits · 185 pts
SeverityFileLineSnippetContext
LOWapp/Util/Lexer/Autolink.php212 public function setAutolinkActiveUsersOnly($active)CODE
LOWapp/Util/Lexer/Autolink.php544 public function autoLinkUsernamesAndLists($tweet = null)CODE
LOWapp/Util/Lexer/Extractor.php103 public function extractEntitiesWithIndices($tweet = null)CODE
LOWapp/Util/Lexer/Extractor.php174 public function extractMentionedScreennames($tweet = null): arrayCODE
LOWapp/Util/Lexer/Extractor.php205 public function extractMentionedUsernames($tweet)CODE
LOWapp/Util/Lexer/Extractor.php254 public function extractHashtagsWithIndices($tweet = null, $checkUrlOverlap = true): arrayCODE
LOWapp/Util/Lexer/Extractor.php316 public function extractCashtagsWithIndices($tweet = null): arrayCODE
LOWapp/Util/Lexer/Extractor.php413 public function extractMentionedScreennamesWithIndices($tweet = null)CODE
LOWapp/Util/Lexer/Extractor.php438 public function extractMentionedUsernamesWithIndices()CODE
LOWapp/Util/Lexer/Extractor.php449 public function extractMentionsOrListsWithIndices($tweet = null): arrayCODE
LOWapp/Util/Lexer/Extractor.php501 public function extractMentionedUsernamesOrListsWithIndices()CODE
LOWapp/Util/Lexer/Extractor.php511 public function extractURLWithoutProtocol($flag = null)CODE
LOWapp/Util/Lexer/Extractor.php527 public function removeOverlappingEntities($entities): arrayCODE
LOWapp/Util/Lexer/LooseAutolink.php58 public function autoLinkUsernamesAndLists($tweet = null)CODE
LOWapp/Util/Lexer/LooseAutolink.php176 public function addLinksToUsernamesAndLists()CODE
LOW⚡app/Util/RateLimit/User.php12 public function getMaxPostsPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php17 public function getMaxPostsPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php22 public function getMaxCommentsPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php27 public function getMaxCommentsPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php32 public function getMaxLikesPerHourAttribute(): intCODE
LOW⚡app/Util/RateLimit/User.php37 public function getMaxLikesPerDayAttribute(): intCODE
LOW⚡app/Util/RateLimit/User.php42 public function getMaxSharesPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php47 public function getMaxSharesPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php52 public function getMaxUserBansPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php57 public function getMaxInstanceBansPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php62 public function getMaxHashtagFollowsPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php67 public function getMaxHashtagFollowsPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php72 public function getMaxCollectionsPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php77 public function getMaxCollectionsPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php82 public function getMaxCollectionsPerMonthAttribute()CODE
LOW⚡app/Util/RateLimit/User.php87 public function getMaxComposeMediaUpdatesPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php92 public function getMaxComposeMediaUpdatesPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php97 public function getMaxComposeMediaUpdatesPerMonthAttribute()CODE
LOW⚡app/Util/RateLimit/User.php102 public function getMaxStoriesPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php107 public function getMaxStoriesPerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php112 public function getMaxStoryDeletePerDayAttribute()CODE
LOW⚡app/Util/RateLimit/User.php117 public function getMaxPostEditsPerHourAttribute()CODE
LOW⚡app/Util/RateLimit/User.php122 public function getMaxPostEditsPerDayAttribute()CODE
LOWapp/Util/ActivityPub/HttpSignature.php197 public static function instanceActorSignWithDigest(CODE
LOWapp/Util/ActivityPub/Helpers.php1737 public static function handleStatusPostProcessing(Status $status, int $profileId, string $url): voidCODE
LOWapp/Util/ActivityPub/Helpers.php2040 public static function setOptionalMediaAttributes(Media $media, array $data): voidCODE
LOWapp/Util/ActivityPub/Helpers.php2074 public static function validateAttachmentCollection(array $attachments, array $mediaTypes, array $mimeTypes): boolCODE
LOWapp/Util/ActivityPub/Helpers.php2110 public static function processMediaTypeAttachment(array $media, Status $status, int $order): ?MediaCODE
LOWapp/Util/ActivityPub/Helpers.php2222 public static function getOrFetchRemoteProfile(string $url): ?ProfileCODE
LOWapp/Util/ActivityPub/Helpers.php2412 public static function getOrCreateInstance(string $domain): InstanceCODE
LOWapp/Util/ActivityPub/Inbox/HandlesFeatureRequests.php13 public function handleFeatureRequestActivity(): voidCODE
LOWapp/Util/ActivityPub/Inbox/HandlesQuoteRequests.php20 public function handleQuoteRequestActivity(): voidCODE
LOWapp/Util/ActivityPub/Inbox/HandlesQuoteRequests.php125 protected function quoteRequestInstrumentUrl(Profile $actor): ?stringCODE
LOWapp/Util/ActivityPub/Inbox/HandlesQuoteRequests.php156 protected function quoteRequestInstrumentMatches(Profile $actor, Status $status): boolCODE
LOWapp/Util/ActivityPub/Inbox/InboxHelpers.php19 public function validateAndFetchActor(string $actorUrl): ?ProfileCODE
LOWapp/Util/ActivityPub/Inbox/HandlesStories.php87 public function handleStoryReactionActivity(): voidCODE
LOWapp/Auth/AppRegisterGrant.php34 public function respondToAccessTokenRequest(CODE
LOWapp/Providers/TelescopeServiceProvider.php41 protected function hideSensitiveRequestDetails()CODE
LOWapp/Models/User.php210 public function receivesBroadcastNotificationsOn(): stringCODE
LOWapp/Models/CustomFilter.php311 public static function getCachedFiltersForAccount($profileId)CODE
LOWapp/Passport/CachedPersonalAccessClientRepository.php60 private function discoverPersonalAccessClient(string $provider): ClientCODE
LOWapp/Http/Controllers/AdminController.php681 public function customEmojiShowDuplicates(Request $request, $id): ViewCODE
LOWapp/Http/Controllers/GroupController.php500 public function getMemberInteractionLimits(Request $request, $id): JsonResponseCODE
LOWapp/Http/Controllers/GroupController.php516 public function updateMemberInteractionLimits(Request $request, $id)CODE
LOWapp/Http/Controllers/AppRegisterController.php405 protected function normalizeRegistrationInput(Request $request): voidCODE
116 more matches not shown…
Over-Commented Block52 hits · 52 pts
SeverityFileLineSnippetContext
LOWapp/Util/Lexer/Autolink.php621 }COMMENT
LOWapp/Util/Lexer/Autolink.php641 // <span class='tco-ellipsis'> <!-- This stuff should get displayed but not copied -->COMMENT
LOWapp/Util/Lexer/Regex.php61 return;COMMENT
LOWapp/Util/Lexer/Regex.php81 // 0x3000 Zs # IDEOGRAPHIC SPACECOMMENT
LOWapp/Util/Lexer/Regex.php101 // 0x0256-0x0257COMMENT
LOWapp/Util/Lexer/Regex.php121 //COMMENT
LOWapp/Util/Lexer/Regex.php141 // 0xff5e FULLWIDTH TILDECOMMENT
LOWapp/Util/Lexer/Regex.php161 // $after in the following regular expression. Note that we only use aCOMMENT
LOWapp/Util/ActivityPub/Validator/Add.php21 // 'object.id' => 'required|url',COMMENT
LOWapp/Util/Media/Blurhash.php21 // The output is a 4x4-component DCT, so sampling the source at full resolutionCOMMENT
LOWapp/Models/CustomFilter.php361 // $statusFilters->groupBy('custom_filter_id')->each(function ($statuses, $filterId) use (&$filtersHash) {COMMENT
LOWapp/Http/Controllers/TimelineController.php41 'layout' => 'nullable|string|in:grid,feed',COMMENT
LOWapp/Http/Controllers/TimelineController.php61 // $page = $request->input('page');COMMENT
LOWapp/Http/Controllers/TimelineController.php81 // $dir = $min ? '>' : '<';COMMENT
LOWapp/Http/Controllers/TimelineController.php101 // )->where('id', $dir, $id)COMMENT
LOWapp/Http/Controllers/TimelineController.php121 // 'local',COMMENT
LOWapp/Http/Controllers/TimelineController.php141COMMENT
LOWapp/Http/Controllers/Groups/GroupsCommentController.php201 // $gp = new GroupPost;COMMENT
LOWapp/Http/Controllers/Groups/GroupsCommentController.php221 // todo: perform in jobCOMMENT
LOWapp/Http/Controllers/Groups/GroupsTopicController.php81 // ->select('status_hashtags.*', 'group_posts.*')COMMENT
LOWapp/Http/Controllers/Groups/GroupsFeedController.php121 $filtered = $user ? UserFilterService::filters($user->profile_id) : [];COMMENT
LOWapp/Http/Controllers/Groups/GroupsPostController.php61 $gp->visibility = 'draft';COMMENT
LOWapp/Http/Controllers/Groups/GroupsPostController.php201 $gp->idCOMMENT
LOWapp/Http/Controllers/Groups/GroupsPostController.php221 // 'caption' => $status->caption,COMMENT
LOWapp/Http/Controllers/Groups/GroupsPostController.php301 GroupLike::class,COMMENT
LOWapp/Http/Controllers/Api/ApiV1Controller.php3141 if ($res->isNotEmpty()) {COMMENT
LOWapp/Services/Status/ReplyCleanupService.php21 {COMMENT
LOWconfig/auth.php81COMMENT
LOWresources/assets/js/spa.js121// const AboutComponent = () => import(/* webpackChunkName: "about.bundle" */ "./../components/About.vue");COMMENT
LOWresources/assets/js/spa.js281 // component: HomeComponentCOMMENT
LOWresources/assets/js/spa.js321 // {COMMENT
LOWresources/assets/js/spa.js461 getProfileLayout: state => {COMMENT
LOWresources/assets/js/spa.js621} catch (e) {COMMENT
LOWresources/assets/js/status.js41// Vue.component(COMMENT
LOWresources/assets/js/lib/argon.js941 // $sliderId = $slider.attr('id'),COMMENT
LOWresources/assets/components/GroupPage.vue821 // let observer = new IntersectionObserver((entries, observer) => {COMMENT
LOWresources/assets/components/GroupFeed.vue81 document.querySelectorAll(".mobile-footer").forEach(e => e.parentNode.removeChild(e));COMMENT
LOWresources/assets/components/groups/GroupsHome.vue241 // if(u.has('ct')) {COMMENT
LOWresources/assets/components/groups/GroupFeed.vue601 // let video = document.querySelectorAll('video');COMMENT
LOW…nents/groups/partials/MemberLimitInteractionsModal.vue141COMMENT
LOW…ssets/components/groups/partials/SelfNotifications.vue141 // let ids = res.data.map(n => n.id);COMMENT
LOW…ssets/components/groups/partials/SelfNotifications.vue161 // if(n.type == 'share' && !n.status) {COMMENT
LOWresources/assets/components/partials/sidebar.vue361 // {COMMENT
LOWresources/assets/components/partials/sidebar.vue381 // {COMMENT
LOWtests/Feature/StoryIndexRebuildChunkSkipTest.php61 // The row we drop mid-scan sorts EARLY in the rebuild order (created_atCOMMENT
LOWtests/Feature/RemoteOidcTest.php41// 'email' => fake()->unique()->freeEmail,COMMENT
LOWtests/Feature/RemoteOidcTest.php61// $this->assertEquals($user->email, $oauthData['email']);COMMENT
LOWtests/Feature/RemoteOidcTest.php81// 'email' => $user->email,COMMENT
LOW.github/dependabot.yml21 # interval: "weekly"COMMENT
LOW.github/workflows/php-laravel-tests-db-matrix.yml1name: PHP - Laravel Tests (DB Matrix - experimental)COMMENT
LOW.github/workflows/php-laravel-tests-db-matrix.yml161 # Unique Redis key prefix per matrix entry so cache/queue keys neverCOMMENT
LOWroutes/api.php381 // Route::get('active/list', [LiveStreamController::class, 'getActiveStreams'])->middleware($middleware);COMMENT
Fake / Example Data38 hits · 39 pts
SeverityFileLineSnippetContext
LOWapp/Services/EmailService.php2176 'fake-email.pp.ua',CODE
LOWapp/Console/Commands/Dev/SeedDevUsers.php36 'email' => 'admin@example.com',CODE
LOWapp/Console/Commands/Dev/SeedDevUsers.php42 'email' => 'user@example.com',CODE
LOWresources/views/settings/invites/create.blade.php22 <input type="email" class="form-control" name="email" placeholder="friend@example.org" autocomplete="off">CODE
LOWresources/views/admin/discover/show.blade.php76 (function($){"use strict";var defaultOptions={tagClass:function(item){return'badge badge-info'},focusClass:'focus',itemCODE
LOWresources/assets/components/Notifications.vue211 "placeholder": Placeholder,CODE
LOWresources/assets/components/sections/Notifications.vue201 "placeholder": PlaceholderCODE
LOWresources/assets/components/admin/AdminDirectory.vue349 placeholder="info@example.org"CODE
LOW…assets/components/admin/partial/AdminSettingsInput.vue10 :placeholder="placeholder"CODE
LOWresources/assets/components/groups/CreateGroup.vue169 membership: "placeholder",CODE
LOWresources/assets/components/groups/GroupSettings.vue714 'user@example.org',CODE
LOW…ces/assets/components/groups/partials/GroupCompose.vue26 :placeholder="placeholder"CODE
LOW…ts/components/groups/partials/CreateForm/TextInput.vue12 :placeholder="placeholder"CODE
LOW…ts/components/groups/partials/CreateForm/TextInput.vue20 :placeholder="placeholder"CODE
LOW…omponents/groups/partials/CreateForm/TextAreaInput.vue13 :placeholder="placeholder"CODE
LOW…omponents/groups/partials/CreateForm/TextAreaInput.vue23 :placeholder="placeholder"CODE
LOWtests/Unit/CuratedOnboardingNotifyAdminTest.php128 $admin = User::factory()->admin()->create(['email' => 'admin@example.com']);CODE
LOWtests/Unit/CuratedOnboardingNotifyAdminTest.php135 return $mail->hasTo('admin@example.com');CODE
LOWtests/Unit/Lexer/UsernameTest.php239 $expectedAutolink = 'hello <a class="u-url list-slug" href="'.config('app.url').'/@märz@example.org" rel="externCODE
LOWtests/Feature/Framework/MiddlewarePipelineTest.php21 'email' => 'test@test.com',CODE
LOWtests/Feature/Compose/MediaUpdateBlocklistTest.php58 Storage::disk('local')->put($mediaPath, 'placeholder');CODE
LOWtests/Feature/Compose/MediaUpdateBlocklistTest.php84 Storage::disk('local')->put($mediaPath, 'placeholder');CODE
LOWtests/Feature/Compose/ComposeMediaCwEnforcementTest.php38 Storage::disk('local')->put($mediaPath, 'placeholder');CODE
LOW…s/Feature/Federation/StringObjectDeleteIngressTest.php138 str_replace('{username}', 'placeholder', $endpoint),CODE
LOW…s/Feature/Federation/StringObjectDeleteIngressTest.php157 str_replace('{username}', 'placeholder', $endpoint),CODE
LOW…s/Feature/Federation/StringObjectDeleteIngressTest.php176 str_replace('{username}', 'placeholder', $endpoint),CODE
LOW…s/Feature/Federation/StringObjectDeleteIngressTest.php209 str_replace('{username}', 'placeholder', $endpoint),CODE
LOWpublic/js/home.chunk.df507e687bcdafa0.js2"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[4951],{27836(t,e,s){s.r(e),s.d(e,{default:CODE
LOWpublic/js/spa.js2(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[7228],{93729(e,t,o){"use strict";o.r(t),o.d(t,{default:CODE
LOW⚡public/js/groups.js1(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[7610],{19933(t,e,s){"use strict";s.r(e),s.d(e,{default:CODE
LOW⚡public/js/groups.js1(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[7610],{19933(t,e,s){"use strict";s.r(e),s.d(e,{default:CODE
LOWpublic/js/profile~following.bundle.107cdd43840f4562.js1"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[1645],{94657(t,e,r){r.r(e),r.d(e,{default:CODE
LOWpublic/js/discover~hashtag.bundle.7d2ecd4b8dcf64a3.js1"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[2966],{86377(t,a,e){e.r(a),e.d(a,{default:CODE
LOWpublic/js/profile~followers.bundle.7ad5ad69f3e9fb0f.js1"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[8977],{80189(t,e,r){r.r(e),r.d(e,{default:CODE
LOWpublic/js/post.chunk.e603077eff2eefbc.js2"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[8408],{22151(t,e,s){s.r(e),s.d(e,{default:CODE
LOWpublic/js/profile.chunk.974a5385adcb4e42.js1"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[8087],{44182(t,e,s){s.r(e),s.d(e,{default:CODE
LOWpublic/js/admin.js2(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[9567],{95366(t,e,a){"use strict";a.r(e),a.d(e,{default:CODE
LOWpublic/js/notifications.chunk.d2559e00a1a30220.js1"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[7744],{14329(t,e,a){a.r(e),a.d(e,{default:CODE
Slop Phrases6 hits · 13 pts
SeverityFileLineSnippetContext
MEDIUMconfig/telescope.php85 | a request or task is executed. Feel free to customize this list.CODE
MEDIUMpublic/js/spa.js2(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[7228],{93729(e,t,o){"use strict";o.r(t),o.d(t,{default:CODE
MEDIUM⚡public/js/groups.js1(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[7610],{19933(t,e,s){"use strict";s.r(e),s.d(e,{default:CODE
MEDIUMpublic/js/compose.js2(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[5666],{28320(t,e,a){"use strict";a.r(e),a.d(e,{default:CODE
MEDIUMpublic/js/remote_auth.js1(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[9649],{68633(t,r,o){"use strict";o.r(r),o.d(r,{default:CODE
MEDIUMpublic/js/compose.chunk.0c6eb8ec0fec011e.js2"use strict";(self.webpackChunkpixelfed=self.webpackChunkpixelfed||[]).push([[9124],{66517(t,e,a){a.r(e),a.d(e,{default:CODE