{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:40:42.573998Z","repo":{"ref":{"host":"github.com","owner":"TrilonIO","name":"aspnetcore-angular-universal"},"default_branch":"master","clone_url":"https://github.com/TrilonIO/aspnetcore-angular-universal.git","html_url":"https://github.com/TrilonIO/aspnetcore-angular-universal","description":"ASP.NET Core & Angular Universal advanced starter - PWA w/ server-side rendering for SEO, Bootstrap, i18n internationalization, TypeScript, unit testing, WebAPI REST setup, SignalR, Swagger docs, and more! By @TrilonIO","stars":1447,"forks":415,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":5757,"primary_language":"TypeScript","license_spdx":"MIT","created_at":"2016-09-20T15:25:10Z","pushed_at":"2019-05-26T23:49:08Z","security_policy_url":null,"distribution":{"owner_created_at":"2018-10-24T15:56:27Z","owner_type":"Organization","release_assets":[]}},"commit_sha":"837b134516631afb3034d40278e2bc9f170acdba","profile":{"lines_by_language":{"TypeScript":952,"JavaScript":604,"C#":466},"files_by_category":{"source":38,"other":24,"config":19,"binary":12,"test":4,"docs":2},"source_lines":1787,"test_lines":235},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.65,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":null},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":42.6,"confidence":0.9,"coverage":1.0,"label":"poor","breakdown":{"complexity":33.9,"duplication":61.0,"lint":43.2,"testing":29.8,"docs":65.0,"type_safety":40.0,"process":null},"summary":"Code quality is poor: test-to-source ratio 0.13, no CI test run detected; 36% of function code in complex or long functions; 8% duplicated lines. Weakest area: testing."},"security":{"score":56.1,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":96.7,"sast":33.4,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 1 high-severity SAST findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":71.0,"checked":71.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":387.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":644896.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2016-09":{"loc":1270,"attributed_loc":0},"2016-10":{"loc":115,"attributed_loc":0},"2016-11":{"loc":2668,"attributed_loc":0},"2016-12":{"loc":57,"attributed_loc":0},"2017-01":{"loc":1319,"attributed_loc":0},"2017-02":{"loc":359929,"attributed_loc":0},"2017-03":{"loc":183218,"attributed_loc":0},"2017-04":{"loc":93415,"attributed_loc":0},"2017-05":{"loc":70,"attributed_loc":0},"2017-06":{"loc":34,"attributed_loc":0},"2017-07":{"loc":5,"attributed_loc":0},"2017-08":{"loc":377,"attributed_loc":0},"2017-09":{"loc":251,"attributed_loc":0},"2017-10":{"loc":157,"attributed_loc":0},"2017-12":{"loc":0,"attributed_loc":0},"2018-01":{"loc":187,"attributed_loc":0},"2018-02":{"loc":73,"attributed_loc":0},"2018-03":{"loc":15,"attributed_loc":0},"2018-04":{"loc":0,"attributed_loc":0},"2018-05":{"loc":132,"attributed_loc":0},"2018-06":{"loc":405,"attributed_loc":0},"2018-08":{"loc":1048,"attributed_loc":0},"2018-09":{"loc":45,"attributed_loc":0},"2018-10":{"loc":0,"attributed_loc":0},"2018-11":{"loc":0,"attributed_loc":0},"2018-12":{"loc":0,"attributed_loc":0},"2019-02":{"loc":26,"attributed_loc":0},"2019-03":{"loc":0,"attributed_loc":0},"2019-04":{"loc":0,"attributed_loc":0},"2019-05":{"loc":80,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":136.0,"flagged_units":0.0,"pre_ai_era_bursts":1.0,"pre_ai_era_measured_loc":103958.0,"pre_ai_era_burst_loc":91770.0,"measured_loc":103958.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":22787.41895433853,"median_loc_per_hour":51.23448369935888,"pr_timed_units":58.0,"excluded_import_loc":540938.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["bf5c85921b78474e2e5ac9d7cd19e928a7a5d3a6","f5e975efbaba89f17dee33fb228b99b96852bf52"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":1787.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":1.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit e4bebd8411); removed from the current tree but still retrievable","path":"appsettings.json","line":11,"fingerprint":"e4bebd84112305d73dea9100635747e29d426742:appsettings.json:generic-api-key:11"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":17.0,"findings_high":1.0,"findings_medium":14.0,"findings_low":2.0,"weighted_findings":5.6,"scanned_lines":1787.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/dockerfile.security.missing-user-entrypoint","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"Dockerfile","line":26,"fingerprint":"dockerfile.security.missing-user-entrypoint:Dockerfile:26"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":32,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:32"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":33,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:33"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":34,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:34"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":35,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:35"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":40,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:40"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":44,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:44"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":56,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:56"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":70,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:70"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":71,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:71"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":75,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:75"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":76,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:76"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":82,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:82"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":90,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:90"},{"rule_id":"opengrep/csharp.lang.security.missing-hsts-header","severity":"medium","message":"The HSTS HTTP response security header is missing, allowing interaction and communication to be sent over the insecure HTTP protocol. [confidence low]","path":"Startup.cs","line":105,"fingerprint":"csharp.lang.security.missing-hsts-header:Startup.cs:105"},{"rule_id":"opengrep/csharp.dotnet.security.audit.missing-or-broken-authorization","severity":"low","message":"Anonymous access shouldn't be allowed unless explicit by design. Access control checks are missing and potentially can be bypassed. This finding violates the principle of least privilege or deny by default, where access should only be permitted for a specific set of roles or conforms to a custom pol [confidence medium]","path":"Server/Controllers/HomeController.cs","line":9,"fingerprint":"csharp.dotnet.security.audit.missing-or-broken-authorization:Server/Controllers/HomeController.cs:9"},{"rule_id":"opengrep/csharp.dotnet.security.audit.missing-or-broken-authorization","severity":"low","message":"Anonymous access shouldn't be allowed unless explicit by design. Access control checks are missing and potentially can be bypassed. This finding violates the principle of least privilege or deny by default, where access should only be permitted for a specific set of roles or conforms to a custom pol [confidence medium]","path":"Server/RestAPI/UsersController.cs","line":10,"fingerprint":"csharp.dotnet.security.audit.missing-or-broken-authorization:Server/RestAPI/UsersController.cs:10"}],"evidence":[],"data":{"rulesets":["typescript","javascript","csharp","dockerfile"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":0.0,"signed_commit_share":0.125,"unpinned_manifests":1.0},"findings":[],"evidence":[{"kind":"posture","description":"package.json has no lockfile alongside it (unpinned dependencies)","ref":"package.json","url":null,"weight":0.3}],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":88.0,"function_nloc":832.0,"mean_ccn":1.5,"p90_ccn":2.0,"complex_functions":0.0,"long_functions":2.0,"many_param_functions":0.0,"risky_nloc_share":0.3606},"findings":[],"evidence":[{"kind":"complex-function","description":"module.exports in webpack.config.js: complexity 12, 179 lines","ref":"webpack.config.js","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/webpack.config.js#L22","weight":0.2},{"kind":"complex-function","description":"module.exports in webpack.config.vendor.js: complexity 10, 121 lines","ref":"webpack.config.vendor.js","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/webpack.config.vendor.js#L31","weight":0.16666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":1081.0,"duplicated_lines":89.0,"duplicated_share":0.0823,"files":38.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: ClientApp/app/app.module.ts:162 and ClientApp/app/app.module.ts:187","ref":"ClientApp/app/app.module.ts","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/ClientApp/app/app.module.ts#L162","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: ClientApp/boot.server.PRODUCTION.ts:17 and ClientApp/boot.server.ts:19","ref":"ClientApp/boot.server.PRODUCTION.ts","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/ClientApp/boot.server.PRODUCTION.ts#L17","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: webpack.config.js:116 and webpack.config.js:192","ref":"webpack.config.js","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/webpack.config.js#L116","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: webpack.config.js:197 and webpack.config.vendor.js:98","ref":"webpack.config.js","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/webpack.config.js#L197","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: webpack.config.vendor.js:76 and webpack.config.vendor.js:127","ref":"webpack.config.vendor.js","url":"https://github.com/TrilonIO/aspnetcore-angular-universal/blob/837b134516631afb3034d40278e2bc9f170acdba/webpack.config.vendor.js#L76","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":2.0,"weighted_findings":6.0,"scanned_lines":1787.0,"category:correctness":2.0},"findings":[{"rule_id":"opengrep/typescript.lang.correctness.useless-ternary","severity":"high","message":"It looks like no matter how isDevBuild is evaluated, this expression returns []. This is probably a copy-paste error.","path":"webpack.config.vendor.js","line":93,"fingerprint":"typescript.lang.correctness.useless-ternary:webpack.config.vendor.js:93"},{"rule_id":"opengrep/typescript.lang.correctness.useless-ternary","severity":"high","message":"It looks like no matter how isDevBuild is evaluated, this expression returns []. This is probably a copy-paste error.","path":"webpack.config.vendor.js","line":141,"fingerprint":"typescript.lang.correctness.useless-ternary:webpack.config.vendor.js:141"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.263,"check:ci_present":0.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.3212,"test_lines":235.0,"source_lines":1787.0,"test_ratio":0.1315,"ci_files":0.0,"cochange_share":0.0803,"cochange_commits":137.0},"findings":[],"evidence":[],"data":{"test_commands":[],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":337.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":1.0,"escapes":1.0,"escapes_per_kloc":1.0},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}