Code Scans
Today we’re introducing Code Scans: a new way to turn broad engineering goals into concrete improvements across your codebase. Tell Devin what you want to achieve, and it helps you investigate what needs to change, evaluate the findings, and turn them into pull requests. Many engineering tasks start with a specific change. Others start with an outcome: Improve SEO Reduce maintenance overhead Make your application compile faster These goals often stay on the backlog because the first step alone is a substantial project: investigating the codebase to figure out where to start. Additionally, identifying the opportunities is only half the work — someone still has to implement the changes, and many of them. Code Scans helps with both. Powered by Agentic MapReduce, the architecture we built for Devin Security Swarm, Code Scans breaks large investigations into focused batches, distributes them across parallel agents, and synthesizes their findings into one report. Devin then turns its findings into PRs ready to review. Teams testing Code Scans ahead of launch are already seeing results: Code Scans had a significant impact on the things we care most about: software quality, bug fixes, stability, performance, and compliance, including security and privacy. With an estimated 96% PR merge rate across several repos, we estimate we've saved over 700 engineering hours in our short testing timeframe. Code Scans had a significant impact on the things we care most about: software quality, bug fixes, stability, performance, and compliance, including security and privacy. With an estimated 96% PR merge rate across several repos, we estimate we've saved over 700 engineering hours in our short testing timeframe. To get started, type /scan in the Devin webapp, or read the docs. Start with a goal You don’t need to know which files to look at before starting a scan. Instead, you define what you’re looking for, and Devin works with you to turn that goal into a concrete codebase investigation. For example: Find unused code in our web app. Exclude generated files and test fixtures, and check for indirect references before recommending a removal. Find unused code in our web app. Exclude generated files and test fixtures, and check for indirect references before recommending a removal. You can also bring your own criteria: a team’s coding standards, an accessibility checklist, or requirements for an upcoming migration. Devin helps establish what to inspect, what to skip, and what should count as a finding. Once you confirm the scope and settings, Devin runs the investigation and brings back a list of findings ordered by priority. From there, you can inspect the evidence, discuss the results with Devin, and ask it to open PRs for the issues you want to address. Improve Rust compilation time We asked Code Scans to speed up compilation in the Dioxus repository. Devin identified opportunities to streamline dependencies and build configuration, including making heavyweight CLI features opt-in rather than compiling them by default. After applying the changes locally, clean debug build time dropped from 58.6 seconds to 21.0 seconds—a 64% reduction across the 22 workspace crates tested. Default mounted feature forces web-sys/js-sys/wasm-bindgen (and serialize forces serde) onto every non-web renderer The default feature set enables mounted, which activates the heavyweight optional web-sys dependency (and transitively js-sys + wasm-bindgen) — yet those bindings are… Default mounted feature forces web-sys/js-sys/wasm-bindgen (and serialize forces serde) onto every non-web renderer The default feature set enables mounted, which activates the heavyweight optional web-sys dependency (and transitively js-sys + wasm-bindgen) — yet those bindings are… Oversized foundational crate: stable generated element/attribute tables bundled with volatile logic causes full re-expansion and downstream recompiles dioxus-html is a foundational crate that every renderer depends on, and it bundles its enormous, near-static generated element/attribute API (elements.rs, global_attributes.rs)… Oversized foundational crate: stable generated element/attribute tables bundled with volatile logic causes full re-expansion and downstream recompiles dioxus-html is a foundational crate that every renderer depends on, and it bundles its enormous, near-static generated element/attribute API (elements.rs, global_attributes.rs)… builder_constructors! element table is the html crate's dominant compile cost (~112 elements, ~112 per-element proc-macro invocations, duplicated hot-reload traversal) The single builder_constructors! invocation is the html crate's dominant compile-time cost. It expands 112 HTML/SVG elements, each into a unit struct, TAG_NAME/NAME_SPACE… builder_constructors! element table is the html crate's dominant compile cost (~112 elements, ~112 per-element proc-macro invocations, duplicated hot-reload traversal) The single builder_constructors! invocation is the html crate's dominant compile-time cost. It expands 112 HTML/SVG elements, each into a unit struct, TAG_NAME/NAME_SPACE… cargo-generate compiled unconditionally in dioxus-cli though used only by dx create cargo-generate is a non-optional dependency used only by the dx create/dx init scaffolding path, but it drags in git2/libgit2-sys (a native C library build), liquid templating… cargo-generate compiled unconditionally in dioxus-cli though used only by dx create cargo-generate is a non-optional dependency used only by the dx create/dx init scaffolding path, but it drags in git2/libgit2-sys (a native C library build), liquid templating… dioxus-ssr pulls tokio "full" (default-on) but only uses fs + io-util dioxus-ssr declares tokio = { version = "1.28", features = ["full"], optional = true }, but the crate uses tokio in exactly one module (incremental.rs) and only touches tokio::fs and… dioxus-ssr pulls tokio "full" (default-on) but only uses fs + io-util dioxus-ssr declares tokio = { version = "1.28", features = ["full"], optional = true }, but the crate uses tokio in exactly one module (incremental.rs) and only touches tokio::fs and… SEO Optimization We ran a scan for SEO issues across devin.ai and cognition.com. It surfaced 44 findings across the two repositories, and we shipped fixes over the following days. Comparing Ahrefs crawls before and after: Ahrefs health score increased from 87 to 92 on devin.ai. Slow pages decreased by 73% on devin.ai. Missing image alt text was eliminated on cognition.com. Customer case-study pages emit relative og:image / twitter:image / JSON-LD i… Every customer case-study page (/customers/
) sets its Open Graph image, Twitter image, and Article JSON-LD image to the raw frontmatter.ogimagePath value, which is a root-relative path with no domain and no leading slash. Open Graph / Twitter Card spec and schema.org require absolute URLs, so previews and the Article rich-result image break. devin-website Customer case-study pages emit relative og:image / twitter:image / JSON-LD i… Every customer case-study page (/customers/
) sets its Open Graph image, Twitter image, and Article JSON-LD image to the raw frontmatter.ogimagePath value, which is a root-relative path with no domain and no leading slash. Open Graph / Twitter Card spec and schema.org require absolute URLs, so previews and the Article rich-result image break. devin-website Redirect chain /resources/university → /university → external drops a hop on a… vercel.json defines /resources/university -> /university and, separately, /university -> https://learn.devinenterprise.com. Because the first redirect targets another redirect source, requests to /resources/university traverse a two-hop 301 chain instead of going straight to the final destination. Ahrefs confirms /resources/university has 157 live backlinks (22 referring domains). devin-website Redirect chain /resources/university → /university → external drops a hop on a… vercel.json defines /resources/university -> /university and, separately, /university -> https://learn.devinenterprise.com. Because the first redirect targets another redirect source, requests to /resources/university traverse a two-hop 301 chain instead of going straight to the final destination. Ahrefs confirms /resources/university has 157 live backlinks (22 referring domains). devin-website Homepage og:url resolves to non-canonical /index (mismatches canonical https:… The root layout sets openGraph.url: './' on every page. This holds for sub-routes but is false for the homepage: Next resolves ./ for the root route against pathname /index, so the served homepage emits og:url = https://cognition.com/index while its canonical link tag is https://cognition.com. cognition-marketing-website Homepage og:url resolves to non-canonical /index (mismatches canonical https:… The root layout sets openGraph.url: './' on every page. This holds for sub-routes but is false for the homepage: Next resolves ./ for the root route against pathname /index, so the served homepage emits og:url = https://cognition.com/index while its canonical link tag is https://cognition.com. cognition-marketing-website Terminal layout omits the JSON-LD structured data every base/desktop page emits The _terminalLayout head assembles title/description/canonical/OG/hreflang but emits no JSON-LD, unlike _baseLayout and _desktopLayout which both ship a default SoftwareApplication block. Its consumers /cli (the Devin CLI product page) and /auto-triage are both indexable central product surfaces. devin-website Terminal layout omits the JSON-LD structured data every base/desktop page emits The _terminalLayout head assembles title/description/canonical/OG/hreflang but emits no JSON-LD, unlike _baseLayout and _desktopLayout which both ship a default SoftwareApplication block. Its consumers /cli (the Devin CLI product page) and /auto-triage are both indexable central product surfaces. devin-website Ended event stays indexable with meta description advertising a live webinar The whats-new-in-devin-06-24-26 event page announces on-page that the event is over ('This event has ended', 'Event ended', 'Registration closed'), yet its metadata contains no robots: {index:false} and its meta/OG descriptions still advertise the webinar as live and upcoming. So an expired page remains indexable while its search snippet promotes a past event as though registration were open. cognition-marketing-website Ended event stays indexable with meta description advertising a live webinar The whats-new-in-devin-06-24-26 event page announces on-page that the event is over ('This event has ended', 'Event ended', 'Registration closed'), yet its metadata contains no robots: {index:false} and its meta/OG descriptions still advertise the webinar as live and upcoming. So an expired page remains indexable while its search snippet promotes a past event as though registration were open. cognition-marketing-website Agentic MapReduce Code Scans is built on top of Agentic MapReduce, the architecture we built for Devin Security Swarm, to make codebase-wide investigations practical. It works in 4 phases: Plan. Devin studies your repository and defines rules for identifying code relevant to your goal. Shard. Those rules run across the codebase, and the matching code is divided into focused batches. Map. Parallel Devin agents investigate each batch, reading surrounding code as needed and reporting their findings. Reduce. A final agent combines the findings, removes duplicates, and prioritizes the results into one report. 1Plan 2Shard 3Map 4Reduce 1. Plan Devin studies the repository and defines rules for the code relevant to your goal — here, symbols, modules, and dependencies that may no longer be used. This keeps each agent’s context focused and directs the reasoning budget toward relevant code rather than repeated searching. This architecture also ensures completeness: every selected batch must be processed. Code Scans brings that same approach beyond security to the engineering goals you define. What would you scan for? Code Scans can investigate a wide range of engineering questions, using your codebase’s conventions and the criteria you provide. Here are some examples: The most useful scan might come from a question your team has been putting off because answering it meant looking everywhere. Type /scan in your Devin session, specify what you want to investigate, build the scope together, and start optimizing your codebase today. Try Code Scans at devin.ai and learn more in the Code Scans docs.