<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Developer Open</title>
    <description>The latest articles on DEV Community by Developer Open (@developer_open).</description>
    <link>https://dev.to/developer_open</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4139653%2F76bc5a1d-8cbf-4b34-8f71-608a9a8a1e7c.png</url>
      <title>DEV Community: Developer Open</title>
      <link>https://dev.to/developer_open</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/developer_open"/>
    <language>en</language>
    <item>
      <title>What Is Aqiron Security Missing? I Want You to Find Out.</title>
      <dc:creator>Developer Open</dc:creator>
      <pubDate>Tue, 29 Sep 2026 15:29:45 +0000</pubDate>
      <link>https://dev.to/aqiron-security/what-is-aqiron-security-missing-i-want-you-to-find-out-1mpl</link>
      <guid>https://dev.to/aqiron-security/what-is-aqiron-security-missing-i-want-you-to-find-out-1mpl</guid>
      <description>&lt;p&gt;A security tool that only finds the vulnerabilities its author expected is not very interesting.&lt;/p&gt;

&lt;p&gt;So I'm trying something different with Aqiron Security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I want other developers to find things that I missed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because Aqiron is finished.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;It is still early enough that someone who spends an hour trying to break its assumptions could genuinely change the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's the challenge
&lt;/h2&gt;

&lt;p&gt;Take a project you know.&lt;/p&gt;

&lt;p&gt;Run Aqiron Security against it.&lt;/p&gt;

&lt;p&gt;Then ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What should this have detected that it didn't?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the kind of issue I'm looking for.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The UI looks nice."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Cool project."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Something concrete.&lt;/p&gt;

&lt;p&gt;A vulnerability pattern.&lt;/p&gt;

&lt;p&gt;A false positive.&lt;/p&gt;

&lt;p&gt;A missing rule.&lt;/p&gt;

&lt;p&gt;A scanner result that gets lost during normalization.&lt;/p&gt;

&lt;p&gt;A finding whose evidence isn't preserved the way you expected.&lt;/p&gt;

&lt;p&gt;A workflow that makes security investigation harder than it should be.&lt;/p&gt;

&lt;p&gt;Those are much more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm asking outsiders
&lt;/h2&gt;

&lt;p&gt;I built most of Aqiron around assumptions.&lt;/p&gt;

&lt;p&gt;Some of those assumptions are probably wrong.&lt;/p&gt;

&lt;p&gt;That's unavoidable when the same person designs the scanner workflow, the finding model, the UI, the report structure, and the developer experience.&lt;/p&gt;

&lt;p&gt;The dangerous part is that everything can look consistent internally while still being wrong externally.&lt;/p&gt;

&lt;p&gt;A different developer brings a different codebase, different framework patterns, different expectations, and a completely different way of investigating a finding.&lt;/p&gt;

&lt;p&gt;That's exactly what Aqiron needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Aqiron is trying to do
&lt;/h2&gt;

&lt;p&gt;The current system brings several security workflows into one developer-oriented interface.&lt;/p&gt;

&lt;p&gt;The architecture currently looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VS Code Extension
       ↓
Core Client / Process Manager
       ↓
stdin/stdout IPC
       ↓
Aqiron Core
       ↓
Scanners
       ↓
Findings
       ↓
Correlation / AI / RAG
       ↓
Reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea is to separate the security runtime from the UI while still giving developers a fast workflow inside VS Code.&lt;/p&gt;

&lt;p&gt;The scanning layer currently includes integrations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trivy&lt;/li&gt;
&lt;li&gt;Betterleaks&lt;/li&gt;
&lt;li&gt;OSV-Scanner&lt;/li&gt;
&lt;li&gt;Semgrep&lt;/li&gt;
&lt;li&gt;MobSF&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;alongside Aqiron's own rules and Flutter/Dart-oriented analysis.&lt;/p&gt;

&lt;p&gt;There are also optional AI workflows through Ollama and OpenRouter.&lt;/p&gt;

&lt;p&gt;The important word there is &lt;strong&gt;optional&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aqiron is intended to remain useful without requiring an AI provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  But normalization creates an interesting problem
&lt;/h2&gt;

&lt;p&gt;This came up in a recent discussion on my previous article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you preserve scanner-specific evidence after normalizing everything into one finding model?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a much harder question than it initially sounds.&lt;/p&gt;

&lt;p&gt;A common finding model is useful because different scanners can then be searched, displayed, correlated, and reported consistently.&lt;/p&gt;

&lt;p&gt;But security scanners don't naturally produce identical information.&lt;/p&gt;

&lt;p&gt;One tool may give you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rule
severity
file
line
column
message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another might provide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rule
cwe
owasp
code snippet
metadata
confidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another may expose completely different evidence.&lt;/p&gt;

&lt;p&gt;So there is a balancing act:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          Too little normalization
                   ↓
       Every scanner stays unique
                   ↓
           Hard to correlate


          Too much normalization
                   ↓
        Scanner context gets lost
                   ↓
      Harder to investigate findings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's one of the areas where I think contributors can have much more impact than simply adding another button to the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  I want someone to challenge the model
&lt;/h2&gt;

&lt;p&gt;Suppose you find a scanner result that Aqiron cannot represent cleanly.&lt;/p&gt;

&lt;p&gt;That's interesting.&lt;/p&gt;

&lt;p&gt;Open an issue.&lt;/p&gt;

&lt;p&gt;Show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scanner
↓
Original result
↓
What Aqiron currently produces
↓
What information was lost
↓
What you think the model should preserve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't even need to implement the fix.&lt;/p&gt;

&lt;p&gt;A good reproduction is already valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  There are other ways to attack the project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Find a missed vulnerability
&lt;/h3&gt;

&lt;p&gt;Create a tiny reproducible vulnerable example.&lt;/p&gt;

&lt;p&gt;Tell me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected detection
Actual detection
Why it matters
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can become a regression test or a new security rule.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find a false positive
&lt;/h3&gt;

&lt;p&gt;This is equally valuable.&lt;/p&gt;

&lt;p&gt;If Aqiron reports something that shouldn't be reported, show the smallest example that reproduces it.&lt;/p&gt;

&lt;p&gt;Security tools need precision, not just more findings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Break the scanner integration
&lt;/h3&gt;

&lt;p&gt;Try unusual inputs.&lt;/p&gt;

&lt;p&gt;Malformed output.&lt;/p&gt;

&lt;p&gt;Unexpected paths.&lt;/p&gt;

&lt;p&gt;Large files.&lt;/p&gt;

&lt;p&gt;Multiple findings at the same location.&lt;/p&gt;

&lt;p&gt;Scanner failures.&lt;/p&gt;

&lt;p&gt;Anything that exposes a hidden assumption is useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Break the developer workflow
&lt;/h3&gt;

&lt;p&gt;Try the extension as if you had never seen the code.&lt;/p&gt;

&lt;p&gt;Can you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create workspace
      ↓
configure
      ↓
scan
      ↓
investigate
      ↓
understand evidence
      ↓
export report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without having to stop and figure out how the application works?&lt;/p&gt;

&lt;p&gt;If not, tell me where the friction is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improve the rules
&lt;/h3&gt;

&lt;p&gt;You don't need to understand the entire codebase to add value.&lt;/p&gt;

&lt;p&gt;A focused security rule, regression test, scanner improvement, or documentation PR is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing I don't want
&lt;/h2&gt;

&lt;p&gt;I don't want contributors making changes just to make the repository look busy.&lt;/p&gt;

&lt;p&gt;Aqiron doesn't need:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;50 meaningless commits&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It needs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;one contributor who finds something I didn't see.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a much better outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the project is right now
&lt;/h2&gt;

&lt;p&gt;Aqiron is still early.&lt;/p&gt;

&lt;p&gt;The current primary client is the VS Code extension, backed by a TypeScript/Node security core.&lt;/p&gt;

&lt;p&gt;The UI now has dedicated workflows for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scan
Findings
Reports
Agent
Settings
Workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reporting layer can produce PDF, JSON, and SARIF output.&lt;/p&gt;

&lt;p&gt;The project also has scan history, finding triage, correlation, and optional AI/RAG functionality.&lt;/p&gt;

&lt;p&gt;But none of that means the system is finished.&lt;/p&gt;

&lt;p&gt;I'd rather be very clear about that.&lt;/p&gt;

&lt;h2&gt;
  
  
  So here's my invitation
&lt;/h2&gt;

&lt;p&gt;Don't come to Aqiron because I said it's good.&lt;/p&gt;

&lt;p&gt;Come because you're curious whether it actually holds up.&lt;/p&gt;

&lt;p&gt;Run it.&lt;/p&gt;

&lt;p&gt;Read the code.&lt;/p&gt;

&lt;p&gt;Try a weird project.&lt;/p&gt;

&lt;p&gt;Try an unusual vulnerability.&lt;/p&gt;

&lt;p&gt;Question the finding model.&lt;/p&gt;

&lt;p&gt;Question the scanner architecture.&lt;/p&gt;

&lt;p&gt;Question the UI.&lt;/p&gt;

&lt;p&gt;And when something doesn't make sense, &lt;strong&gt;open an issue and show me why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of contribution that can shape an early security project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aqiron Security
&lt;/h3&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Aqiron-Security/aqiron-security" rel="noopener noreferrer"&gt;https://github.com/Aqiron-Security/aqiron-security&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most useful comment you could leave is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Looks great."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I found something you missed."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm hoping someone does.&lt;/p&gt;

</description>
      <category>contributorswanted</category>
      <category>security</category>
      <category>typescript</category>
      <category>vs</category>
    </item>
    <item>
      <title>I Built a Security Workbench for Flutter. Now I Want Developers to Break It.</title>
      <dc:creator>Developer Open</dc:creator>
      <pubDate>Mon, 28 Sep 2026 13:27:55 +0000</pubDate>
      <link>https://dev.to/aqiron-security/i-built-a-security-workbench-for-flutter-now-i-want-developers-to-break-it-nim</link>
      <guid>https://dev.to/aqiron-security/i-built-a-security-workbench-for-flutter-now-i-want-developers-to-break-it-nim</guid>
      <description>&lt;p&gt;I have spent a lot of time building Aqiron Security.&lt;/p&gt;

&lt;p&gt;Then I realized something uncomfortable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I know how it behaves on my machine. I don't know how it behaves in the hands of developers I have never met.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the part I want to change.&lt;/p&gt;

&lt;p&gt;Aqiron Security is an open-source, local-first application security tool that currently runs as a VS Code extension, with an initial focus on Flutter workspaces.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;Instead of making a developer jump between several security tools, output formats, terminals, and dashboards, Aqiron tries to bring the workflow into one place.&lt;/p&gt;

&lt;p&gt;But the project is still early.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scan
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvmywj44gvtet87v8y9gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvmywj44gvtet87v8y9gw.png" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzmga9pay5hv1vo5pwjgm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzmga9pay5hv1vo5pwjgm.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Generated pdf
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F020xgvun2sc86r7x8lfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F020xgvun2sc86r7x8lfo.png" alt=" " width="732" height="949"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkmgjl6l76gt3d42a2bl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkmgjl6l76gt3d42a2bl8.png" alt=" " width="724" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpoq1ny4s1wnpwgwd61dc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpoq1ny4s1wnpwgwd61dc.png" alt=" " width="732" height="934"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh97942vgqd6fgs76v940.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh97942vgqd6fgs76v940.png" alt=" " width="733" height="940"&gt;&lt;/a&gt;&lt;br&gt;
and there goes.. the remaining images of the pdfs generated(sample) are one aqiron security repo README.md&lt;/p&gt;

&lt;p&gt;And that's exactly why I'm writing this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The security workflow I wanted
&lt;/h2&gt;

&lt;p&gt;A typical project can involve completely different tools for:&lt;/p&gt;

&lt;p&gt;static analysis&lt;br&gt;
dependency vulnerabilities&lt;br&gt;
leaked secrets&lt;br&gt;
mobile security testing&lt;br&gt;
custom security rules&lt;br&gt;
AI-assisted analysis&lt;br&gt;
reports&lt;/p&gt;

&lt;p&gt;The problem isn't that these tools don't exist.&lt;/p&gt;

&lt;p&gt;The problem is what happens &lt;strong&gt;between&lt;/strong&gt; them.&lt;/p&gt;

&lt;p&gt;Different output formats.&lt;/p&gt;

&lt;p&gt;Different severity models.&lt;/p&gt;

&lt;p&gt;Different workflows.&lt;/p&gt;

&lt;p&gt;Different places to investigate a finding.&lt;/p&gt;

&lt;p&gt;Aqiron's current architecture is built around a TypeScript core that the VS Code extension communicates with through a separate Node.js process:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VS Code Extension&lt;br&gt;
       ↓&lt;br&gt;
Core Client / Process Manager&lt;br&gt;
       ↓&lt;br&gt;
stdin/stdout IPC&lt;br&gt;
       ↓&lt;br&gt;
Aqiron Core&lt;br&gt;
       ↓&lt;br&gt;
Scanners → Findings → Correlation → AI/RAG → Reports&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The goal is to keep the security runtime independent from the UI while giving developers a fast workflow inside VS Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What exists today
&lt;/h2&gt;

&lt;p&gt;Aqiron can currently scan supported Flutter workspaces or individual files and expose findings through VS Code and the Aqiron interface.&lt;/p&gt;

&lt;p&gt;The implementation includes native security rules plus optional integrations such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Betterleaks&lt;br&gt;
OSV-Scanner&lt;br&gt;
Semgrep OSS&lt;br&gt;
Trivy&lt;br&gt;
MobSF&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It can normalize and correlate findings, build a relationship graph, maintain workspace intelligence through RAG, and generate JSON, SARIF, and PDF report artifacts.&lt;/p&gt;

&lt;p&gt;There are also optional AI workflows through Ollama or OpenRouter.&lt;/p&gt;

&lt;p&gt;The project is local-first, and those external scanners and AI providers remain optional.&lt;/p&gt;

&lt;p&gt;I'm deliberately saying &lt;strong&gt;current&lt;/strong&gt; because some ideas are still future work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I rebuilt the interface
&lt;/h2&gt;

&lt;p&gt;Recently I stopped adding features for a moment and asked a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would I actually want to use this every day?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer was not initially good enough.&lt;/p&gt;

&lt;p&gt;So I redesigned the major workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scan
&lt;/h2&gt;

&lt;p&gt;The Scan workflow now follows a simpler progression:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Workspace&lt;br&gt;
   ↓&lt;br&gt;
Target&lt;br&gt;
   ↓&lt;br&gt;
Scan mode&lt;br&gt;
   ↓&lt;br&gt;
Start scan&lt;br&gt;
   ↓&lt;br&gt;
Execution&lt;br&gt;
   ↓&lt;br&gt;
Results&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;The findings screen became a triage workspace instead of a basic list.&lt;/p&gt;

&lt;p&gt;Search, severity, source, status, file/line context, evidence, remediation information, and finding actions are surfaced around the actual security result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reports
&lt;/h2&gt;

&lt;p&gt;The reporting workflow now exposes PDF, JSON, and SARIF outputs alongside the assessment context and report history.&lt;/p&gt;

&lt;p&gt;The PDF itself is intended to look like an actual security assessment rather than a raw export of scanner output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent
&lt;/h2&gt;

&lt;p&gt;The AI interface was redesigned as part of the same workspace instead of feeling like a completely separate feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workspace and Settings
&lt;/h2&gt;

&lt;p&gt;I also rebuilt the workspace-entry and Settings experience so configuring the project and security tooling feels like part of the same application.&lt;/p&gt;

&lt;h2&gt;
  
  
  But here's the problem
&lt;/h2&gt;

&lt;p&gt;All of that is still mostly being developed by one person.&lt;/p&gt;

&lt;p&gt;And that's dangerous for a security project.&lt;/p&gt;

&lt;p&gt;A security tool can look polished while still having:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;missing detection rules&lt;br&gt;
false positives&lt;br&gt;
false negatives&lt;br&gt;
awkward developer workflows&lt;br&gt;
scanner integration problems&lt;br&gt;
weak tests&lt;br&gt;
poor documentation&lt;br&gt;
platform-specific bugs&lt;br&gt;
assumptions that only make sense on the maintainer's machine&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I can keep adding features.&lt;/p&gt;

&lt;p&gt;That's not necessarily what Aqiron needs next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It needs other developers trying to use it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I don't want you to just star the repository
&lt;/h2&gt;

&lt;p&gt;Honestly, a star would be nice.&lt;/p&gt;

&lt;p&gt;But it isn't the thing I'm looking for.&lt;/p&gt;

&lt;p&gt;I'd rather have someone open an issue and say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This workflow doesn't make sense."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This scanner should catch this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I tried this on my Flutter project and found a bug."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or even:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why did you design the architecture this way?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those conversations are much more valuable than a silent star.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where contributors could actually help
&lt;/h2&gt;

&lt;p&gt;You don't need to understand the entire codebase before contributing.&lt;/p&gt;

&lt;p&gt;There are several directions that would be useful:&lt;/p&gt;

&lt;h2&gt;
  
  
  Security rules
&lt;/h2&gt;

&lt;p&gt;Find a vulnerability pattern Aqiron currently misses and propose or implement a rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scanner integrations
&lt;/h2&gt;

&lt;p&gt;Improve an existing scanner integration or help make another security tool fit into Aqiron's normalized finding model.&lt;/p&gt;

&lt;h2&gt;
  
  
  False positives
&lt;/h2&gt;

&lt;p&gt;Take a finding that shouldn't have been reported and help make the detection more precise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tests
&lt;/h2&gt;

&lt;p&gt;Add regression tests around scanners, finding normalization, workspace behavior, IPC, or UI workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI/UX
&lt;/h2&gt;

&lt;p&gt;Try the extension like a real developer and point out where the workflow feels confusing, slow, or unnecessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;Improve setup instructions, scanner configuration, examples, or contributor onboarding.&lt;/p&gt;

&lt;p&gt;You don't have to start by rewriting the core.&lt;/p&gt;

&lt;p&gt;I'd actually prefer a small, focused pull request that teaches us something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I'm curious about
&lt;/h2&gt;

&lt;p&gt;The project started with Flutter because that's where I wanted to solve the problem first.&lt;/p&gt;

&lt;p&gt;But I'm increasingly interested in a bigger question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a developer-focused security workflow have one common security runtime while supporting multiple clients?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today the main client is VS Code.&lt;/p&gt;

&lt;p&gt;The architecture is intentionally moving toward a model where the security core can eventually serve other clients without making the core itself depend on VS Code.&lt;/p&gt;

&lt;p&gt;That could eventually mean:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           `  Aqiron Security Core
            /     |      \
      VS Code    CLI    Desktop`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;But that's future architecture, not the current repository structure.&lt;/p&gt;

&lt;p&gt;Right now, I want to make the existing system good enough that other developers actually want to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I'm opening the door
&lt;/h2&gt;

&lt;p&gt;Aqiron Security is early.&lt;/p&gt;

&lt;p&gt;That means there are plenty of things that can be improved.&lt;/p&gt;

&lt;p&gt;It also means a contributor can have a real impact on the direction of the project instead of becoming one tiny commit in a repository with thousands of contributors.&lt;/p&gt;

&lt;p&gt;I'm looking for developers interested in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;security + TypeScript + VS Code + Flutter + developer tooling + AI-assisted security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can inspect the code, run it, criticize it, open an issue, improve documentation, add a test, add a rule, improve an integration, or send a pull request.&lt;/p&gt;

&lt;p&gt;I want the project to become better because other developers used it and challenged the assumptions behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aqiron Security
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Aqiron-Security/aqiron-security" rel="noopener noreferrer"&gt;https://github.com/Aqiron-Security/aqiron-security&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are interested, don't just tell me that the idea is cool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try to break something.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's probably the most useful contribution you can make right now.&lt;/p&gt;

</description>
      <category>contributorswanted</category>
      <category>security</category>
      <category>typescript</category>
      <category>vscode</category>
    </item>
    <item>
      <title>I'm interested in hearing how others approach the boundary between a VS Code extension and a separate Node.js/TypeScript runtime.</title>
      <dc:creator>Developer Open</dc:creator>
      <pubDate>Wed, 23 Sep 2026 14:54:04 +0000</pubDate>
      <link>https://dev.to/developer_open/im-interested-in-hearing-how-others-approach-the-boundary-between-a-vs-code-extension-and-a-fbc</link>
      <guid>https://dev.to/developer_open/im-interested-in-hearing-how-others-approach-the-boundary-between-a-vs-code-extension-and-a-fbc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5" class="crayons-story__hidden-navigation-link"&gt;Separating a VS Code Extension from a TypeScript Core: Architecture Lessons from Aqiron Security&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aqiron-security"&gt;
            &lt;img alt="Aqiron Security logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14893%2F0428b2d0-36a7-450e-a419-b394189a3ab8.png" class="crayons-logo__image" width="456" height="547"&gt;
          &lt;/a&gt;

          &lt;a href="/developer_open" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4139653%2F76bc5a1d-8cbf-4b34-8f71-608a9a8a1e7c.png" alt="developer_open profile" class="crayons-avatar__image" width="456" height="547"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/developer_open" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Developer Open
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Developer Open
                
                
              
              &lt;div id="story-author-preview-content-4726016" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/developer_open" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4139653%2F76bc5a1d-8cbf-4b34-8f71-608a9a8a1e7c.png" class="crayons-avatar__image" alt="" width="456" height="547"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Developer Open&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aqiron-security" class="crayons-story__secondary fw-medium"&gt;Aqiron Security&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5" id="article-link-4726016"&gt;
          Separating a VS Code Extension from a TypeScript Core: Architecture Lessons from Aqiron Security
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vscode"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vscode&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/node"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;node&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              3&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>architecture</category>
      <category>node</category>
      <category>typescript</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Separating a VS Code Extension from a TypeScript Core: Architecture Lessons from Aqiron Security</title>
      <dc:creator>Developer Open</dc:creator>
      <pubDate>Wed, 23 Sep 2026 14:51:53 +0000</pubDate>
      <link>https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5</link>
      <guid>https://dev.to/aqiron-security/separating-a-vs-code-extension-from-a-typescript-core-architecture-lessons-from-aqiron-security-4mc5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcru3p1k6m1pjmd5gwts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcru3p1k6m1pjmd5gwts.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
When I started building Aqiron Security, the natural approach was to keep the security logic inside the VS Code extension.&lt;br&gt;
That works.&lt;br&gt;
At least initially.&lt;br&gt;
But as the project started accumulating scanner orchestration, finding normalization, correlation, project intelligence, RAG, reporting, and AI operations, I started running into a deeper architectural question:&lt;/p&gt;

&lt;p&gt;Should the VS Code extension actually own the application's core runtime?&lt;/p&gt;

&lt;p&gt;I decided the answer should be no.&lt;/p&gt;

&lt;p&gt;Aqiron Security is an open-source application security project. The current product is a VS Code extension, but I wanted the security/runtime layer to have a much cleaner boundary from the client.&lt;/p&gt;

&lt;p&gt;The result is a design where the extension acts as the client and starts a separate Node.js process containing the TypeScript core.&lt;br&gt;
This article explains why I made that separation, how the current architecture works, and some of the trade-offs I have encountered.&lt;/p&gt;

&lt;p&gt;The original problem&lt;/p&gt;

&lt;p&gt;A VS Code extension has a lot of responsibilities already.&lt;/p&gt;

&lt;p&gt;It deals with things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;extension activation&lt;br&gt;
commands&lt;br&gt;
diagnostics&lt;br&gt;
the VS Code API&lt;br&gt;
webview communication&lt;br&gt;
editor state&lt;br&gt;
user settings&lt;br&gt;
UI lifecycle&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Security scanning introduces another class of responsibilities:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;starting external tools&lt;br&gt;
parsing scanner output&lt;br&gt;
normalizing findings&lt;br&gt;
correlating duplicate results&lt;br&gt;
generating reports&lt;br&gt;
managing long-running operations&lt;br&gt;
cancellation&lt;br&gt;
AI operations&lt;br&gt;
workspace analysis&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Putting all of that into one runtime makes the boundary blurry.&lt;br&gt;
The code may still work, but over time the architecture starts answering questions like:&lt;/p&gt;

&lt;p&gt;"Does this security service need VS Code?"&lt;/p&gt;

&lt;p&gt;That is a dangerous dependency to create if the answer does not actually need to be yes.&lt;/p&gt;
&lt;h2&gt;
  
  
  The separation
&lt;/h2&gt;

&lt;p&gt;The current Aqiron architecture looks roughly like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;┌──────────────────────────────────────────────┐&lt;br&gt;
│              VS Code Extension                │&lt;br&gt;
│                                              │&lt;br&gt;
│ activation / commands / diagnostics          │&lt;br&gt;
│ React webview / settings / workspace UI      │&lt;br&gt;
│ ScanController / client-side services        │&lt;br&gt;
└──────────────────────┬───────────────────────┘&lt;br&gt;
                       │&lt;br&gt;
                       │ CoreClient&lt;br&gt;
                       │ CoreProcessManager&lt;br&gt;
                       │&lt;br&gt;
                       │ newline-delimited JSON&lt;br&gt;
                       ▼&lt;br&gt;
┌──────────────────────────────────────────────┐&lt;br&gt;
│            Aqiron Core Runtime               │&lt;br&gt;
│            Node.js + TypeScript              │&lt;br&gt;
│                                              │&lt;br&gt;
│ protocol / cancellation / adapters           │&lt;br&gt;
│ scanning / analysis / correlation            │&lt;br&gt;
│ reports / RAG / AI operations                │&lt;br&gt;
└──────────────────────┬───────────────────────┘&lt;br&gt;
                       │&lt;br&gt;
          ┌────────────┴────────────┐&lt;br&gt;
          ▼                         ▼&lt;br&gt;
   Native Aqiron rules       External scanners&lt;br&gt;
                             Trivy / Semgrep&lt;br&gt;
                             OSV-Scanner /&lt;br&gt;
                             Betterleaks / MobSF&lt;br&gt;
          │                         │&lt;br&gt;
          └────────────┬────────────┘&lt;br&gt;
                       ▼&lt;br&gt;
                Unified findings&lt;br&gt;
                       ▼&lt;br&gt;
             correlation + graph&lt;br&gt;
                       ▼&lt;br&gt;
                  reports&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is not a cloud architecture.&lt;/p&gt;

&lt;p&gt;The current project is local-first. The extension starts the core process locally and communicates with it over standard input/output. The repository currently keeps &lt;code&gt;packages/core&lt;/code&gt; private and bundles it into the extension rather than publishing it as a separate npm package.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;The boundary exists today, but the eventual product packaging can evolve later.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a separate process?
&lt;/h2&gt;

&lt;p&gt;There were several reasons.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Keep the core independent from VS Code
&lt;/h2&gt;

&lt;p&gt;The first reason is architectural independence.&lt;br&gt;
The core should not need to know that VS Code exists.&lt;br&gt;
Ideally, security logic should be able to operate on concepts like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;workspace&lt;br&gt;
scan&lt;br&gt;
finding&lt;br&gt;
project&lt;br&gt;
report&lt;br&gt;
AI request&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;rather than:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vscode.workspace&lt;br&gt;
vscode.window&lt;br&gt;
WebviewPanel&lt;br&gt;
TextDocument&lt;br&gt;
DiagnosticCollection&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The extension is responsible for translating between the developer environment and the core.&lt;/p&gt;

&lt;p&gt;That gives me a much cleaner dependency direction:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VS Code client&lt;br&gt;
      ↓&lt;br&gt;
    Core&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;rather than:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VS Code ↔ Security logic ↔ VS Code&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Process isolation gives us a real boundary
&lt;/h2&gt;

&lt;p&gt;Using a separate process also creates a runtime boundary.&lt;/p&gt;

&lt;p&gt;The extension host and the security core no longer execute as one giant logical process.&lt;/p&gt;

&lt;p&gt;That matters for long-running operations.&lt;/p&gt;

&lt;p&gt;A scan might involve:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;discover files&lt;br&gt;
      ↓&lt;br&gt;
run multiple tools&lt;br&gt;
      ↓&lt;br&gt;
parse results&lt;br&gt;
      ↓&lt;br&gt;
normalize findings&lt;br&gt;
      ↓&lt;br&gt;
correlate findings&lt;br&gt;
      ↓&lt;br&gt;
build relationships&lt;br&gt;
      ↓&lt;br&gt;
generate reports&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's a very different workload from handling an editor command or updating a sidebar.&lt;/p&gt;

&lt;p&gt;With a separate core process, the extension can treat the security engine more like a service.&lt;/p&gt;

&lt;p&gt;That makes lifecycle handling, restart behavior, and failure boundaries easier to reason about.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. IPC forces us to define a contract
&lt;/h2&gt;

&lt;p&gt;This was probably the most valuable part of the architecture.&lt;/p&gt;

&lt;p&gt;Once the extension and core became separate processes, they couldn't casually call each other's internal functions anymore.&lt;/p&gt;

&lt;p&gt;They needed a protocol.&lt;/p&gt;

&lt;p&gt;The current protocol is intentionally simple:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;stdin/stdout&lt;br&gt;
+&lt;br&gt;
newline-delimited JSON&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A request looks conceptually like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CoreRequestMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CoreResponseMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;CoreProtocolError&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are also event messages for asynchronous pipeline updates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CoreEventMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;event&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual protocol also has a versioned handshake.&lt;/p&gt;

&lt;p&gt;For example, the current runtime exposes a protocol version and core version and can report compatibility states such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;compatible&lt;br&gt;
protocol-mismatch&lt;br&gt;
extension-too-old&lt;br&gt;
core-too-old&lt;br&gt;
unsupported&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That gives us an explicit compatibility boundary instead of relying on both sides silently assuming they agree.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why newline-delimited JSON?
&lt;/h2&gt;

&lt;p&gt;I deliberately didn't start with something complicated.&lt;/p&gt;

&lt;p&gt;The current transport is essentially:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;message 1\n&lt;br&gt;
message 2\n&lt;br&gt;
message 3\n&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;where each line contains one JSON message.&lt;/p&gt;

&lt;p&gt;That gives us a few useful properties:&lt;/p&gt;
&lt;h2&gt;
  
  
  Easy to inspect
&lt;/h2&gt;

&lt;p&gt;You can literally look at the communication stream.&lt;/p&gt;
&lt;h2&gt;
  
  
  Easy to debug
&lt;/h2&gt;

&lt;p&gt;Malformed input can be identified and rejected.&lt;/p&gt;
&lt;h2&gt;
  
  
  No additional server required
&lt;/h2&gt;

&lt;p&gt;The extension starts the process locally and communicates through stdio.&lt;/p&gt;
&lt;h2&gt;
  
  
  Language-neutral at the protocol level
&lt;/h2&gt;

&lt;p&gt;The wire format is JSON rather than TypeScript-specific objects.&lt;/p&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;The implementation is TypeScript, but the protocol doesn't fundamentally need to be.&lt;/p&gt;
&lt;h2&gt;
  
  
  Correlation IDs become important
&lt;/h2&gt;

&lt;p&gt;Once requests and responses cross a process boundary, we need a way to know which response belongs to which request.&lt;/p&gt;

&lt;p&gt;That's why requests carry an ID.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;request id: abc123&lt;br&gt;
method: scan.start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The response can return:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;id: abc123&lt;br&gt;
success: true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Without this, concurrent operations become painful to reason about.&lt;/p&gt;

&lt;p&gt;The ID becomes the connection between:&lt;/p&gt;

&lt;p&gt;request&lt;br&gt;
   ↓&lt;br&gt;
core operation&lt;br&gt;
   ↓&lt;br&gt;
response&lt;/p&gt;

&lt;p&gt;and also gives us something useful for cancellation and pipeline events.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cancellation is part of the architecture
&lt;/h2&gt;

&lt;p&gt;Security operations shouldn't be treated as unstoppable functions.&lt;/p&gt;

&lt;p&gt;Imagine starting a deep scan and then closing the workspace.&lt;/p&gt;

&lt;p&gt;Or starting an AI analysis and then deciding you don't need it anymore.&lt;/p&gt;

&lt;p&gt;The architecture therefore includes explicit cancellation operations.&lt;/p&gt;

&lt;p&gt;The current core protocol exposes operations such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;core.cancel&lt;br&gt;
scan.cancel&lt;br&gt;
ai.cancel&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and the runtime propagates cancellation through the relevant cancellation sources and scanner context.&lt;/p&gt;

&lt;p&gt;This is one of those details that seems unnecessary until you have a real long-running operation.&lt;/p&gt;

&lt;p&gt;Then it becomes essential.&lt;/p&gt;
&lt;h2&gt;
  
  
  The extension should not know how scanning works
&lt;/h2&gt;

&lt;p&gt;One of the goals of the boundary is to let the client ask for a scan without knowing the implementation details.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;coreClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startScan&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;workspaceRoot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deep&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;trusted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extension doesn't need to know:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;which scanners are installed&lt;br&gt;
how scanner output is parsed&lt;br&gt;
how findings are normalized&lt;br&gt;
how correlation works&lt;br&gt;
how reports are generated&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those concerns belong to the core pipeline.&lt;/p&gt;

&lt;p&gt;The current core pipeline can combine native Aqiron rules with optional external scanners, normalize results into &lt;code&gt;UnifiedFinding[]&lt;/code&gt;, then pass them through correlation/graph processing and report generation.&lt;/p&gt;

&lt;p&gt;That separation is the main reason I like this architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding model becomes the shared language
&lt;/h2&gt;

&lt;p&gt;A scanner may produce one format.&lt;/p&gt;

&lt;p&gt;Another scanner produces something completely different.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Scanner A&lt;br&gt;
severity = HIGH&lt;br&gt;
file = foo.dart&lt;br&gt;
line = 41&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;while another might report:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Scanner B&lt;br&gt;
level = error&lt;br&gt;
path = foo.dart&lt;br&gt;
startLine = 41&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The core shouldn't force the rest of the system to understand every scanner's native format.&lt;/p&gt;

&lt;p&gt;Instead, scanner-specific parsers convert the output into a common model.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;external scanner&lt;br&gt;
       ↓&lt;br&gt;
scanner-specific parser&lt;br&gt;
       ↓&lt;br&gt;
UnifiedFinding&lt;br&gt;
       ↓&lt;br&gt;
correlation&lt;br&gt;
       ↓&lt;br&gt;
report&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is one of the biggest advantages of having an application-level core rather than scattering scanner logic throughout the VS Code extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture isn't completely finished
&lt;/h2&gt;

&lt;p&gt;This is important because architecture diagrams can easily make an early project look more mature than it actually is.&lt;/p&gt;

&lt;p&gt;Aqiron is currently version 0.0.1 and under active development.&lt;/p&gt;

&lt;p&gt;There are still intentional limitations.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;workspace operations currently require a Flutter workspace&lt;br&gt;
external scanners are optional&lt;br&gt;
the core is still bundled into the extension&lt;br&gt;
quick file scans use a separate direct extension path&lt;br&gt;
the project does not yet have independently published Core, CLI, or Desktop packages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the current architecture is not:&lt;/p&gt;

&lt;p&gt;`Aqiron Core npm package&lt;br&gt;
        ↓&lt;br&gt;
VS Code&lt;br&gt;
CLI&lt;br&gt;
Desktop&lt;/p&gt;

&lt;p&gt;Not yet.&lt;/p&gt;

&lt;p&gt;It's closer to:&lt;/p&gt;

&lt;p&gt;VS Code&lt;br&gt;
   ↓&lt;br&gt;
internal Core process&lt;br&gt;
   ↓&lt;br&gt;
bundled runtime`&lt;/p&gt;

&lt;p&gt;That is an important distinction.&lt;/p&gt;

&lt;p&gt;The architecture is being prepared for broader reuse without prematurely creating a bunch of packages that don't yet need to exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I didn't immediately split everything into repositories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was another deliberate decision.&lt;/p&gt;

&lt;p&gt;It would be easy to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;aqiron-core&lt;br&gt;
aqiron-security-vscode&lt;br&gt;
aqiron-security-cli&lt;br&gt;
aqiron-security-desktop&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and create four repositories immediately.&lt;/p&gt;

&lt;p&gt;But that would add operational complexity before the products existed.&lt;/p&gt;

&lt;p&gt;You would now have to manage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;package publishing&lt;br&gt;
version coordination&lt;br&gt;
cross-repository changes&lt;br&gt;
release synchronization&lt;br&gt;
dependency management&lt;br&gt;
contributor workflow across multiple repositories&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The current repository gives me a cleaner intermediate step:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/&lt;br&gt;
packages/core/&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;with an explicit runtime boundary.&lt;/p&gt;

&lt;p&gt;When multiple clients become real products, the repository structure can change.&lt;/p&gt;

&lt;p&gt;Until then, the architecture can evolve without forcing the project to pay the cost of premature distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I like about this architecture
&lt;/h2&gt;

&lt;p&gt;The biggest win isn't actually "using IPC."&lt;/p&gt;

&lt;p&gt;The bigger win is making &lt;strong&gt;the boundary explicit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The VS Code extension owns the developer environment.&lt;/p&gt;

&lt;p&gt;The core owns security operations.&lt;/p&gt;

&lt;p&gt;The protocol connects them.&lt;/p&gt;

&lt;p&gt;That gives us a mental model like:&lt;/p&gt;

&lt;p&gt;`Client responsibilities&lt;br&gt;
    ↓&lt;br&gt;
UI&lt;br&gt;
VS Code&lt;br&gt;
commands&lt;br&gt;
diagnostics&lt;br&gt;
workspace interaction&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      │
      │ protocol
      ▼
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Core responsibilities&lt;br&gt;
    ↓&lt;br&gt;
scanning&lt;br&gt;
normalization&lt;br&gt;
correlation&lt;br&gt;
RAG&lt;br&gt;
AI operations&lt;br&gt;
reports&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;That's much easier to reason about than a single giant extension runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I still need to watch
&lt;/h2&gt;

&lt;p&gt;The architecture also introduces new problems.&lt;/p&gt;

&lt;p&gt;A process boundary is not free.&lt;/p&gt;

&lt;p&gt;Now we have to care about:&lt;/p&gt;

&lt;p&gt;process startup time&lt;/p&gt;

&lt;p&gt;restart behavior&lt;/p&gt;

&lt;p&gt;malformed messages&lt;/p&gt;

&lt;p&gt;protocol compatibility&lt;/p&gt;

&lt;p&gt;stderr/stdout handling&lt;/p&gt;

&lt;p&gt;partial failures&lt;/p&gt;

&lt;p&gt;cancellation&lt;/p&gt;

&lt;p&gt;shutdown&lt;/p&gt;

&lt;p&gt;concurrent requests&lt;/p&gt;

&lt;p&gt;serialization overhead&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We traded code coupling for process-boundary complexity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think that's a reasonable trade for Aqiron, but it isn't automatically the right choice for every VS Code extension.&lt;/p&gt;

&lt;p&gt;If your project is a small command-based extension with a few hundred lines of logic, this architecture would probably be overkill.&lt;/p&gt;

&lt;p&gt;For a growing security platform with multiple subsystems and long-running operations, the boundary becomes much more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger goal
&lt;/h2&gt;

&lt;p&gt;The long-term idea is not "make a complicated VS Code extension."&lt;/p&gt;

&lt;p&gt;It's to make the security core reusable.&lt;/p&gt;

&lt;p&gt;The future might eventually look like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Aqiron Core
               /     |      \
              /      |       \
             ↓       ↓        ↓

         VS Code    CLI     Desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;But I don't need to build all three clients today.&lt;/p&gt;

&lt;p&gt;Right now, I'm using the VS Code extension as the first real client and using the Core boundary to keep the architecture ready for future evolution.&lt;/p&gt;

&lt;p&gt;That's the part I'm most interested in getting right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The biggest lesson I've taken from this project is that architecture isn't about drawing the biggest possible diagram.&lt;/p&gt;

&lt;p&gt;It's about deciding where responsibilities should stop.&lt;/p&gt;

&lt;p&gt;For Aqiron, the important boundary became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;VS Code is the client.&lt;br&gt;
The TypeScript runtime is the security engine.&lt;br&gt;
IPC is the contract between them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That doesn't mean the architecture is finished.&lt;/p&gt;

&lt;p&gt;It means there is now a clear place to evolve it.&lt;/p&gt;

&lt;p&gt;I'm still working through the trade-offs, so I'd be interested in hearing from people who have built:&lt;/p&gt;

&lt;p&gt;VS Code extensions with external processes&lt;/p&gt;

&lt;p&gt;TypeScript/Node developer tools&lt;/p&gt;

&lt;p&gt;language-server-style architectures&lt;/p&gt;

&lt;p&gt;security scanners&lt;/p&gt;

&lt;p&gt;CLI + GUI products sharing a common runtime&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How would you design this boundary differently?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Aqiron Security is open source and currently under active development.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>vscode</category>
      <category>opensource</category>
      <category>node</category>
    </item>
  </channel>
</rss>
