🚂 🦀 The one-person framework for Rust for side-projects and startups
This report presents the forensic synthetic code analysis of loco-rs/loco, a Rust project with 9,103 GitHub stars. SynthScan v2.0 examined 82,467 lines of code across 509 source files, recording 451 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 7.4 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 451 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deny.toml | 1 | # cargo-deny — supply-chain policy for the dependency tree. | COMMENT |
| LOW | loco-new/tests/wizard/new.rs | 21 | COMMENT | |
| LOW | loco-new/tests/wizard/new.rs | 41 | // Serialized: every combo builds into one shared CARGO_TARGET_DIR (see | COMMENT |
| LOW | loco-new/tests/wizard/new.rs | 81 | true, | COMMENT |
| LOW | loco-new/tests/wizard/new.rs | 141 | env_map.insert("DB_IDLE_TIMEOUT".into(), "2000".into()); | COMMENT |
| LOW | loco-new/tests/wizard/new.rs | 421 | COMMENT | |
| LOW | loco-new/tests/wizard/new.rs | 561 | // .stderr_null() | COMMENT |
| LOW | loco-new/tests/templates/config.rs | 1 | //! Every generated config file must be usable by the app that receives it. | COMMENT |
| LOW | loco-new/base_template/src/models/users.rs | 281 | /// Sets the email verification information for the user and | COMMENT |
| LOW | loco-new/base_template/src/models/users.rs | 301 | /// database. | COMMENT |
| LOW | loco-new/base_template/src/models/users.rs | 321 | /// email. | COMMENT |
| LOW | loco-new/base_template/src/dtos/common.rs | 1 | use loco_rs::model::query::PageResponse; | COMMENT |
| LOW | loco-new/base_template/src/controllers/auth.rs | 161 | #[debug_handler] | COMMENT |
| LOW | loco-new/src/lib.rs | 21 | /// published 1.0.x, which renders the YAML-safe `<%= ... %>` config delimiters | COMMENT |
| LOW | loco-new/src/lib.rs | 61 | #[cfg_attr(unix, default)] | COMMENT |
| LOW | loco-new/src/wizard.rs | 81 | #[derive( | COMMENT |
| LOW | loco-new/src/generator/executer/mod.rs | 41 | /// | COMMENT |
| LOW | loco-new/src/generator/executer/mod.rs | 61 | COMMENT | |
| LOW | website/src/env.d.ts | 1 | /// <reference types="@astrojs/starlight/virtual" /> | COMMENT |
| LOW | tests/controller/middlewares.rs | 81 | handle.abort(); | COMMENT |
| LOW | examples/demo/config/test.yaml | 1 | # Loco configuration file documentation | COMMENT |
| LOW | examples/demo/config/test.yaml | 61 | # Initializers Configuration | COMMENT |
| LOW | examples/demo/config/production.yaml | 1 | # Loco configuration file documentation | COMMENT |
| LOW | examples/demo/config/production.yaml | 41 | COMMENT | |
| LOW | examples/demo/config/production.yaml | 61 | secure: true | COMMENT |
| LOW | examples/demo/config/development.yaml | 1 | # Loco configuration file documentation | COMMENT |
| LOW | examples/demo/config/development.yaml | 61 | # Override the SMTP hello name (default is the machine's hostname) | COMMENT |
| LOW | examples/demo/src/models/users.rs | 281 | /// generates a unique reset password token, and updates it in the | COMMENT |
| LOW | examples/demo/src/models/users.rs | 301 | /// This method sets the timestamp when the user successfully verifies their | COMMENT |
| LOW | examples/demo/src/controllers/auth.rs | 161 | #[debug_handler] | COMMENT |
| LOW | examples/reference_spa/config/test.yaml | 1 | # Loco configuration file documentation | COMMENT |
| LOW | examples/reference_spa/config/test.yaml | 61 | # password: | COMMENT |
| LOW | examples/reference_spa/config/production.yaml | 1 | # Loco configuration file documentation | COMMENT |
| LOW | examples/reference_spa/config/production.yaml | 61 | port: <%= get_env(name="MAILER_PORT", default="587") %> | COMMENT |
| LOW | examples/reference_spa/config/development.yaml | 1 | # Loco configuration file documentation | COMMENT |
| LOW | examples/reference_spa/config/development.yaml | 61 | # user: | COMMENT |
| LOW | examples/reference_spa/tests/models/posts.rs | 21 | // query your model, e.g.: | COMMENT |
| LOW | examples/reference_spa/src/models/users.rs | 281 | /// generates a unique reset password token, and updates it in the | COMMENT |
| LOW | examples/reference_spa/src/models/users.rs | 301 | /// This method sets the timestamp when the user successfully verifies their | COMMENT |
| LOW | examples/reference_spa/src/dtos/common.rs | 1 | use loco_rs::model::query::PageResponse; | COMMENT |
| LOW | examples/reference_spa/src/controllers/auth.rs | 161 | #[debug_handler] | COMMENT |
| LOW | .github/workflows/loco-rs-ci-sanity.yml | 1 | # To optimize CI runtime: | COMMENT |
| LOW | .github/workflows/docs.yml | 81 | # had 36 errors: `tsconfig.json` listed `.astro` in | COMMENT |
| LOW | xtask/src/docs_syntax.rs | 1 | //! Parse every fenced `rust` block in the docs tree and fail on the ones that | COMMENT |
| LOW | xtask/src/versions.rs | 21 | const CRATE_VERSION: (&str, &str) = ("Cargo.toml", r"(?m)^version.*$"); | COMMENT |
| LOW | loco-gen/tests/db.rs | 1 | use duct::cmd; | COMMENT |
| LOW | loco-gen/tests/templates/idempotency.rs | 1 | //! Running a generator twice must not corrupt the tree. | COMMENT |
| LOW | loco-gen/tests/templates/idempotency.rs | 41 | } | COMMENT |
| LOW | loco-gen/tests/templates/migration.rs | 241 | assert!( | COMMENT |
| LOW | loco-gen/tests/templates/scaffold.rs | 1 | use super::utils::{guess_file_by_time, APP_ROUTS, MIGRATION_SRC_LIB, ROUTES_TSX_FIXTURE}; | COMMENT |
| LOW | loco-gen/tests/templates/model.rs | 181 | .expect_err("Expected error when migration src doesn't exist"); | COMMENT |
| LOW | loco-gen/tests/templates/anchors.rs | 1 | //! Every app tree that ships in this repository must stay generatable into. | COMMENT |
| LOW | loco-gen/src/lib.rs | 281 | #[cfg(feature = "with-db")] | COMMENT |
| LOW | loco-gen/src/column.rs | 1 | //! A single, compiler-checked source of truth for column type information. | COMMENT |
| LOW | loco-gen/src/column.rs | 121 | /// Grammar (orthogonal: suffixes are flags, not combinatorial rows): | COMMENT |
| LOW | loco-gen/src/column.rs | 141 | /// value list, an unsupported `array` inner type, or a unique/nullable | COMMENT |
| LOW | loco-gen/src/column.rs | 161 | } else { | COMMENT |
| LOW | loco-gen/src/column.rs | 341 | /// `int` maps to a 64-bit `BigInteger`/i64 (same as `big_int`): `SQLite` has no | COMMENT |
| LOW | loco-gen/src/column.rs | 401 | big_int,float,double,bool" | COMMENT |
| LOW | loco-gen/src/scaffold.rs | 141 | "0".to_string() | COMMENT |
| 314 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | loco-new/tests/wizard/new.rs | 52 | // full-stack SPA: db + clientside — the flagship `generate scaffold` path | COMMENT |
| MEDIUM | loco-new/tests/templates/config.rs | 185 | // The development JWT secret is generated into the file at scaffold time. | COMMENT |
| MEDIUM | loco-new/base_template/frontend/src/routes.tsx | 6 | // scaffold:imports | COMMENT |
| MEDIUM | loco-new/base_template/frontend/src/routes.tsx | 18 | // scaffold:routes | COMMENT |
| MEDIUM | …/src/content/docs/docs/explanation/coming-from-axum.md | 19 | | A hand-rolled `ApiContext` struct + `AddExtensionLayer`/`State` | `AppContext` (8 fields: `environment`, `db`, `queue_ | CODE |
| MEDIUM | …ite/src/content/docs/docs/how-to/override-templates.md | 36 | # override every template under a folder (e.g. all the scaffold's frontend pages) | COMMENT |
| MEDIUM | …ite/src/content/docs/docs/how-to/override-templates.md | 61 | # edit .loco-templates/scaffold/api/controller.t | COMMENT |
| MEDIUM | website/src/content/docs/docs/how-to/paginate.md | 95 | ## 5. The scaffold's typed envelope | COMMENT |
| MEDIUM | website/src/content/docs/docs/how-to/build-a-spa.md | 98 | | `frontend/src/routes.tsx` | imports and routes, injected at the `// scaffold:imports` and `// scaffold:routes` anchors | CODE |
| MEDIUM | website/src/content/docs/docs/how-to/build-a-spa.md | 194 | [`examples/reference_spa`](https://github.com/loco-rs/loco/tree/master/examples/reference_spa) in the Loco repository is | CODE |
| MEDIUM | website/src/content/docs/docs/how-to/use-generators.md | 12 | `cargo loco generate` (alias `g`) is compiled only in debug builds — `#[cfg(debug_assertions)]` gates the whole subcomma | CODE |
| MEDIUM | website/src/content/docs/docs/tutorials/the-tour.md | 21 | ## Models and controllers: a scaffold, and a plain model with a relation | COMMENT |
| MEDIUM | website/src/content/docs/docs/reference/generators.md | 8 | `cargo loco generate <kind>` (alias `cargo loco g <kind>`) scaffolds application code from templates baked into the `loc | CODE |
| MEDIUM | website/src/content/docs/docs/reference/generators.md | 30 | ### Model, migration, scaffold | COMMENT |
| MEDIUM | website/src/content/docs/docs/reference/generators.md | 47 | # scaffold (model + DTOs + controller; adds React hooks/pages if the app has a frontend/) | COMMENT |
| MEDIUM | website/src/content/docs/docs/reference/cli.md | 172 | `enum ComponentArg`, `src/cli.rs:173-382` — only present in debug builds (`#[cfg(debug_assertions)]` on `Commands::Gener | CODE |
| MEDIUM | examples/reference_spa/frontend/src/routes.tsx | 6 | // scaffold:imports | COMMENT |
| MEDIUM | examples/reference_spa/frontend/src/routes.tsx | 22 | // scaffold:routes | COMMENT |
| MEDIUM | examples/reference_spa/tests/requests/posts.rs | 66 | /// scaffold's old hand-rolled arithmetic and the framework's `query::paginate` | COMMENT |
| MEDIUM | examples/reference_spa/tests/requests/posts.rs | 68 | /// `total_pages` -- which the scaffold's own envelope did not even carry -- | COMMENT |
| MEDIUM | loco-gen/tests/templates/controller.rs | 70 | /// the scaffold's `--no-auth`, and it has to reach both the handlers and the | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 7 | /// Loco 1.0 ships a single scaffold flavor: DTO + controller + React-SPA | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 13 | // A flat inventory of every artifact one scaffold emits. Splitting it into | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 147 | // no `tests/requests/<plural>.rs` is generated for the API scaffold: a | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 153 | /// Adaptive scaffold, headless path: with `frontend: false` (a non-clientside | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 213 | /// One scaffold could never catch this. Two can. | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 281 | /// `{target}_id` regardless produced a scaffold that referenced a column the | COMMENT |
| MEDIUM | loco-gen/tests/templates/scaffold.rs | 339 | /// The scaffold is authenticated by default: every handler takes an | COMMENT |
| MEDIUM⚡ | loco-gen/tests/templates/utils.rs | 49 | /// `// scaffold:imports` / `// scaffold:routes` anchor comments the Api | COMMENT |
| MEDIUM⚡ | loco-gen/tests/templates/utils.rs | 50 | /// scaffold's `frontend_list.t` injects into. The once-per-app base | COMMENT |
| MEDIUM⚡ | loco-gen/tests/templates/utils.rs | 57 | // scaffold:imports | COMMENT |
| MEDIUM | loco-gen/tests/templates/utils.rs | 69 | // scaffold:routes | COMMENT |
| MEDIUM⚡ | loco-gen/tests/templates/anchors.rs | 4 | //! `inject-above` in the migrator, `// scaffold:imports` and | COMMENT |
| MEDIUM⚡ | loco-gen/tests/templates/anchors.rs | 5 | //! `// scaffold:routes` in the SPA route table. An anchor that goes missing | COMMENT |
| MEDIUM⚡ | loco-gen/tests/templates/anchors.rs | 13 | //! lost both scaffold anchors, so `loco g scaffold` inside the repository's own | COMMENT |
| MEDIUM | loco-gen/tests/templates/anchors.rs | 60 | for anchor in ["// scaffold:imports", "// scaffold:routes"] { | CODE |
| MEDIUM | loco-gen/src/controller.rs | 12 | /// the body — so this is opt-in (`--auth`), the mirror of the scaffold's | COMMENT |
| MEDIUM | loco-gen/src/lib.rs | 106 | /// Whether to include timestamps (`created_at``updated_at`at columns) in the scaffold | COMMENT |
| MEDIUM | loco-gen/src/lib.rs | 130 | /// Unlike the scaffold, a bare controller is public by default — it has | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 11 | //! migration/model/scaffold generators. | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 76 | /// (HTML/HTMX) scaffold. | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 303 | // JSON column. SQLite would accept all three, but the scaffold keeps one | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 345 | /// `SQLite` fails to compile. 64-bit keeps the scaffold portable across | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 407 | /// scaffold input: these are automatically generated by Loco (`created_at` / | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 414 | /// Parse raw `(field_name, spec)` scaffold fields into `Column`s, skipping | COMMENT |
| MEDIUM | loco-gen/src/column.rs | 1038 | // portable scaffold must not emit a 32-bit `int`. | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 13 | /// Loco 1.0 ships a single scaffold flavor built straight from | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 37 | // - scaffold is never a link table | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 157 | /// `frontend_*.t` templates (`loco-gen/src/templates/scaffold/api/`). | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 164 | // Deriving `{target}_id` unconditionally made the scaffold reference a | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 249 | /// Builds the full Tera context for the API scaffold's `dto.t`/`controller.t` | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 320 | // `// scaffold:imports` / `// scaffold:routes` anchor comments (a 2c | COMMENT |
| MEDIUM | loco-gen/src/scaffold.rs | 325 | // them bare meant the second `generate scaffold` in an app injected a | COMMENT |
| MEDIUM | loco-gen/src/model.rs | 200 | // entity sea-orm generates → a non-compiling scaffold), so `int` was | COMMENT |
| MEDIUM | src/cli.rs | 272 | /// Generates a CRUD scaffold, model and controller | COMMENT |
| MEDIUM | src/cli.rs | 283 | /// Generate scaffold without timestamps (`created_at`, `updated_at` columns) | COMMENT |
| MEDIUM | src/cli.rs | 325 | /// controller is public by default — the mirror of scaffold's | COMMENT |
| MEDIUM | src/cli.rs | 397 | /// Handle the scaffold/controller "kind" flags that 1.0's adaptive generators | COMMENT |
| MEDIUM | src/cli.rs | 1242 | // Regression for #1790: the 1.0 adaptive rebuild removed the scaffold/ | COMMENT |
| MEDIUM | src/cli.rs | 1242 | // Regression for #1790: the 1.0 adaptive rebuild removed the scaffold/ | COMMENT |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/cli.rs | 803 | .unwrap_or_else(|| boot_result.app_context.config.server.binding.clone()), | CODE |
| CRITICAL | src/cli.rs | 979 | .unwrap_or_else(|| boot_result.app_context.config.server.binding.clone()), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/demo/config/test.yaml | 11 | # Define the logging format. options: compact, pretty or json | COMMENT |
| MEDIUM | examples/demo/config/production.yaml | 16 | # Define the logging format. options: compact, pretty or json | COMMENT |
| MEDIUM | examples/demo/config/development.yaml | 11 | # Define the logging format. options: compact, pretty or json | COMMENT |
| MEDIUM | examples/reference_spa/config/test.yaml | 11 | # Define the logging format. options: compact, pretty or json | COMMENT |
| MEDIUM | examples/reference_spa/config/production.yaml | 16 | # Define the logging format. options: compact, pretty or json | COMMENT |
| MEDIUM | examples/reference_spa/config/development.yaml | 11 | # Define the logging format. options: compact, pretty or json | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | loco-new/base_template/src/controllers/auth.rs | 180 | /// This flow enhances security by avoiding traditional passwords and providing a seamless login experience. | COMMENT |
| MEDIUM | examples/demo/src/controllers/auth.rs | 180 | /// This flow enhances security by avoiding traditional passwords and providing a seamless login experience. | COMMENT |
| MEDIUM | examples/reference_spa/src/controllers/auth.rs | 180 | /// This flow enhances security by avoiding traditional passwords and providing a seamless login experience. | COMMENT |
| MEDIUM | .github/workflows/loco-rs-ci-sanity.yml | 6 | # we run comprehensive tests to validate every generator command | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/errors.rs | 53 | // ─────────────────────────── Client-facing / API errors ─────────────────────────── | COMMENT |
| MEDIUM | src/errors.rs | 88 | // ─────────────────────────── Internal / infrastructure errors ───────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | website/src/content/docs/docs/how-to/write-task.md | 102 | cargo loco task user:create email:user@example.com name:"John Doe" password:secret | CODE |
| LOW | src/bgworker/redis.rs | 1249 | let args = serde_json::json!({"email": "user@example.com"}); | CODE |