<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[JMo Security Blog - Security Automation & DevSecOps]]></title><description><![CDATA[Tutorials, case studies, and best practices for unified security scanning. SAST, DAST, SCA, secrets detection, compliance automation.]]></description><link>https://blog.jmotools.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1761191172576/accade6a-42fe-4b2c-a4f4-4ef0d517e0ba.png</url><title>JMo Security Blog - Security Automation &amp; DevSecOps</title><link>https://blog.jmotools.com</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 08:31:22 GMT</lastBuildDate><atom:link href="https://blog.jmotools.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Kubernetes-Style Scan Scheduling: Built Enterprise CI/CD Integration for JMo Security]]></title><description><![CDATA[Running security scans manually gets old fast. You start with good intentions — "I'll scan every Friday before release" — but then Friday becomes Saturday becomes "whenever I remember."
The solution? Automation. But here's the problem: most security ...]]></description><link>https://blog.jmotools.com/jmo-security-v080-gitlab-ci-slack-scheduling</link><guid isPermaLink="true">https://blog.jmotools.com/jmo-security-v080-gitlab-ci-slack-scheduling</guid><category><![CDATA[cybersecurity]]></category><category><![CDATA[Devops]]></category><category><![CDATA[GitLab]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[cronjob]]></category><dc:creator><![CDATA[James Moceri]]></dc:creator><pubDate>Thu, 30 Oct 2025 03:53:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761798524936/60ce2e82-59c6-4d6c-bf67-340594f8afa2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Running security scans manually gets old fast. You start with good intentions — "I'll scan every Friday before release" — but then Friday becomes Saturday becomes "whenever I remember."</p>
<p>The solution? Automation. But here's the problem: most security tools don't integrate cleanly with CI/CD platforms. You end up writing YAML by hand, copying configs between projects, and maintaining a dozen different cron schedules.</p>
<p>I built JMo Security to orchestrate 12+ security scanners (Trivy, Semgrep, TruffleHog, Checkov, ZAP, Nuclei, etc.) with a unified CLI. Version 0.8.0 adds the missing piece: <strong>enterprise-grade scheduling and CI/CD integration</strong>.</p>
<h2 id="heading-whats-new-in-v080">What's New in v0.8.0</h2>
<h3 id="heading-1-kubernetes-style-schedule-management">1. Kubernetes-Style Schedule Management</h3>
<p>If you've worked with Kubernetes CronJobs, this will feel instantly familiar:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Create a weekly security scan schedule</span>
jmo schedule create prod-security-audit \
  --cron <span class="hljs-string">"0 2 * * 1"</span> \
  --profile balanced \
  --repo ./myapp \
  --image myapp:latest \
  --url https://myapp.com \
  --backend gitlab-ci \
  --slack-webhook <span class="hljs-string">"https://hooks.slack.com/services/YOUR/WEBHOOK"</span>
</code></pre>
<p>This creates a schedule resource with Kubernetes-style metadata, spec, and status fields:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">prod-security-audit</span>
  <span class="hljs-attr">uid:</span> <span class="hljs-string">f47ac10b-58cc-4372-a567-0e02b2c3d479</span>
  <span class="hljs-attr">creationTimestamp:</span> <span class="hljs-string">"2025-10-28T14:30:00Z"</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">schedule:</span> <span class="hljs-string">"0 2 * * 1"</span>  <span class="hljs-comment"># Every Monday at 2 AM</span>
  <span class="hljs-attr">jobTemplate:</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">profile:</span> <span class="hljs-string">balanced</span>
      <span class="hljs-attr">targets:</span>
        <span class="hljs-attr">repo:</span> <span class="hljs-string">./myapp</span>
        <span class="hljs-attr">image:</span> <span class="hljs-string">myapp:latest</span>
        <span class="hljs-attr">url:</span> <span class="hljs-string">https://myapp.com</span>
      <span class="hljs-attr">notifications:</span>
        <span class="hljs-attr">channels:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">slack</span>
            <span class="hljs-attr">url:</span> <span class="hljs-string">"https://hooks.slack.com/..."</span>
  <span class="hljs-attr">backend:</span>
    <span class="hljs-attr">type:</span> <span class="hljs-string">gitlab-ci</span>
<span class="hljs-attr">status:</span>
  <span class="hljs-attr">lastScheduleTime:</span> <span class="hljs-literal">null</span>
  <span class="hljs-attr">nextScheduleTime:</span> <span class="hljs-string">"2025-11-04T02:00:00Z"</span>
</code></pre>
<p>Schedules are stored locally in <code>~/.jmo/schedules.json</code> with secure permissions (0o600). No cloud dependencies.</p>
<h3 id="heading-2-gitlab-cicd-workflow-generation">2. GitLab CI/CD Workflow Generation</h3>
<p>Once you've defined a schedule, export it to a ready-to-use GitLab CI pipeline:</p>
<pre><code class="lang-bash">jmo schedule <span class="hljs-built_in">export</span> prod-security-audit &gt; .gitlab-ci.yml
</code></pre>
<p>This generates a complete <code>.gitlab-ci.yml</code> with:</p>
<ul>
<li><p><strong>Profile-based jobs</strong> (fast/balanced/deep)</p>
</li>
<li><p><strong>Multi-target support</strong> (repos, containers, IaC, web apps, K8s clusters)</p>
</li>
<li><p><strong>Slack notifications</strong> on success/failure</p>
</li>
<li><p><strong>Artifact uploads</strong> (JSON findings, HTML dashboard, SARIF reports)</p>
</li>
<li><p><strong>Pipeline schedules</strong> matching your cron syntax</p>
</li>
</ul>
<p>Example generated pipeline:</p>
<pre><code class="lang-yaml"><span class="hljs-comment"># Generated by JMo Security Schedule Manager</span>
<span class="hljs-comment"># Schedule: prod-security-audit (0 2 * * 1)</span>

<span class="hljs-attr">variables:</span>
  <span class="hljs-attr">JMO_PROFILE:</span> <span class="hljs-string">"balanced"</span>
  <span class="hljs-attr">SLACK_WEBHOOK_URL:</span> <span class="hljs-string">"https://hooks.slack.com/services/YOUR/WEBHOOK"</span>

<span class="hljs-attr">stages:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">scan</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">notify</span>

<span class="hljs-attr">jmo-security-scan:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">scan</span>
  <span class="hljs-attr">image:</span> <span class="hljs-string">jmogaming/jmo-security:latest</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">jmo</span> <span class="hljs-string">scan</span> <span class="hljs-string">--profile</span> <span class="hljs-string">balanced</span> <span class="hljs-string">--repo</span> <span class="hljs-string">.</span> <span class="hljs-string">--image</span> <span class="hljs-string">myapp:latest</span> <span class="hljs-string">--url</span> <span class="hljs-string">https://myapp.com</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">jmo</span> <span class="hljs-string">report</span> <span class="hljs-string">./results</span> <span class="hljs-string">--profile</span>
  <span class="hljs-attr">artifacts:</span>
    <span class="hljs-attr">reports:</span>
      <span class="hljs-attr">sast:</span> <span class="hljs-string">results/summaries/findings.sarif</span>
    <span class="hljs-attr">paths:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">results/</span>
    <span class="hljs-attr">expire_in:</span> <span class="hljs-number">30</span> <span class="hljs-string">days</span>
  <span class="hljs-attr">only:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">schedules</span>

<span class="hljs-attr">notify-slack-success:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">notify</span>
  <span class="hljs-attr">image:</span> <span class="hljs-string">curlimages/curl:latest</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">|
      curl -X POST "$SLACK_WEBHOOK_URL" \
        -H 'Content-Type: application/json' \
        -d "{
          \"text\": \"✅ Security scan PASSED: $CI_PIPELINE_URL\",
          \"attachments\": [{
            \"color\": \"good\",
            \"fields\": [
              {\"title\": \"Commit\", \"value\": \"$CI_COMMIT_SHORT_SHA\", \"short\": true},
              {\"title\": \"Branch\", \"value\": \"$CI_COMMIT_BRANCH\", \"short\": true}
            ]
          }]
        }"
</span>  <span class="hljs-attr">only:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">schedules</span>
  <span class="hljs-attr">when:</span> <span class="hljs-string">on_success</span>

<span class="hljs-attr">notify-slack-failure:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">notify</span>
  <span class="hljs-attr">image:</span> <span class="hljs-string">curlimages/curl:latest</span>
  <span class="hljs-attr">script:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">|
      curl -X POST "$SLACK_WEBHOOK_URL" \
        -H 'Content-Type: application/json' \
        -d "{
          \"text\": \"❌ Security scan FAILED: $CI_PIPELINE_URL\",
          \"attachments\": [{
            \"color\": \"danger\",
            \"fields\": [
              {\"title\": \"Commit\", \"value\": \"$CI_COMMIT_SHORT_SHA\", \"short\": true},
              {\"title\": \"Branch\", \"value\": \"$CI_COMMIT_BRANCH\", \"short\": true}
            ]
          }]
        }"
</span>  <span class="hljs-attr">only:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">schedules</span>
  <span class="hljs-attr">when:</span> <span class="hljs-string">on_failure</span>
</code></pre>
<h3 id="heading-3-slack-notifications">3. Slack Notifications</h3>
<p>Slack integration is built-in. Configure webhooks in your schedule:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">notifications:</span>
  <span class="hljs-attr">channels:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">slack</span>
      <span class="hljs-attr">url:</span> <span class="hljs-string">"https://hooks.slack.com/services/YOUR/WEBHOOK"</span>
</code></pre>
<p>Notifications include:</p>
<ul>
<li><p>✅ Pipeline status (success/failure)</p>
</li>
<li><p>📊 Commit info (SHA, branch, author)</p>
</li>
<li><p>🔍 Findings count (when available)</p>
</li>
<li><p>🔗 Direct link to pipeline</p>
</li>
</ul>
<h2 id="heading-why-this-matters">Why This Matters</h2>
<p>Before v0.8.0, you had three options:</p>
<ol>
<li><p><strong>Manual scans</strong> — Inconsistent, easy to forget</p>
</li>
<li><p><strong>Hand-written CI/CD YAML</strong> — Error-prone, hard to maintain across projects</p>
</li>
<li><p><strong>Third-party services</strong> — Expensive, cloud dependencies, vendor lock-in</p>
</li>
</ol>
<p>Now you have a fourth option:</p>
<ul>
<li><p><strong>Declarative schedules</strong> stored locally</p>
</li>
<li><p><strong>Auto-generated CI/CD configs</strong> for GitLab (GitHub Actions coming soon)</p>
</li>
<li><p><strong>Zero cloud dependencies</strong> (except Slack webhooks, optional)</p>
</li>
<li><p><strong>100% open source</strong></p>
</li>
</ul>
<h2 id="heading-real-world-use-cases">Real-World Use Cases</h2>
<h3 id="heading-use-case-1-multi-environment-security-gates">Use Case 1: Multi-Environment Security Gates</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># Dev environment: Fast scans on every commit</span>
jmo schedule create dev-security \
  --cron <span class="hljs-string">"*/15 * * * *"</span> \
  --profile fast \
  --repo . \
  --backend gitlab-ci

<span class="hljs-comment"># Staging: Balanced scans nightly</span>
jmo schedule create staging-security \
  --cron <span class="hljs-string">"0 1 * * *"</span> \
  --profile balanced \
  --repo . \
  --image staging:latest \
  --url https://staging.example.com \
  --backend gitlab-ci \
  --slack-webhook <span class="hljs-string">"<span class="hljs-variable">$STAGING_SLACK_WEBHOOK</span>"</span>

<span class="hljs-comment"># Production: Deep scans weekly</span>
jmo schedule create prod-security \
  --cron <span class="hljs-string">"0 2 * * 0"</span> \
  --profile deep \
  --repo . \
  --image prod:latest \
  --url https://example.com \
  --k8s-context prod \
  --backend gitlab-ci \
  --slack-webhook <span class="hljs-string">"<span class="hljs-variable">$PROD_SLACK_WEBHOOK</span>"</span>
</code></pre>
<h3 id="heading-use-case-2-compliance-automation">Use Case 2: Compliance Automation</h3>
<p>JMo Security auto-enriches findings with 6 compliance frameworks (OWASP Top 10, CWE Top 25, NIST CSF 2.0, PCI DSS 4.0, CIS Controls v8.1, MITRE ATT&amp;CK). Schedule weekly compliance reports:</p>
<pre><code class="lang-bash">jmo schedule create compliance-weekly \
  --cron <span class="hljs-string">"0 9 * * 1"</span> \
  --profile balanced \
  --repo . \
  --image app:latest \
  --terraform-state infrastructure.tfstate \
  --backend gitlab-ci \
  --slack-webhook <span class="hljs-string">"<span class="hljs-variable">$COMPLIANCE_SLACK_WEBHOOK</span>"</span>
</code></pre>
<p>Pipeline artifacts include:</p>
<ul>
<li><p><code>COMPLIANCE_SUMMARY.md</code> — Cross-framework compliance status</p>
</li>
<li><p><code>PCI_DSS_COMPLIANCE.md</code> — PCI DSS 4.0 detailed report</p>
</li>
<li><p><code>attack-navigator.json</code> — MITRE ATT&amp;CK Navigator heatmap</p>
</li>
</ul>
<h3 id="heading-use-case-3-gitops-workflow">Use Case 3: GitOps Workflow</h3>
<p>Commit schedules to version control:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Create schedules</span>
jmo schedule create security-scan --cron <span class="hljs-string">"0 2 * * *"</span> --profile balanced --repo .

<span class="hljs-comment"># Export to GitLab CI</span>
jmo schedule <span class="hljs-built_in">export</span> security-scan &gt; .gitlab-ci.yml

<span class="hljs-comment"># Commit and push</span>
git add .gitlab-ci.yml
git commit -m <span class="hljs-string">"ci: add automated security scans"</span>
git push

<span class="hljs-comment"># GitLab automatically picks up the pipeline schedule</span>
</code></pre>
<h2 id="heading-architecture-deep-dive">Architecture Deep Dive</h2>
<h3 id="heading-storage">Storage</h3>
<p>Schedules are stored in <code>~/.jmo/schedules.json</code> with strict permissions:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"schedules"</span>: [
    {
      <span class="hljs-attr">"metadata"</span>: {
        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"prod-security-audit"</span>,
        <span class="hljs-attr">"uid"</span>: <span class="hljs-string">"f47ac10b-58cc-4372-a567-0e02b2c3d479"</span>,
        <span class="hljs-attr">"creationTimestamp"</span>: <span class="hljs-string">"2025-10-28T14:30:00Z"</span>
      },
      <span class="hljs-attr">"spec"</span>: {
        <span class="hljs-attr">"schedule"</span>: <span class="hljs-string">"0 2 * * 1"</span>,
        <span class="hljs-attr">"jobTemplate"</span>: { ... },
        <span class="hljs-attr">"backend"</span>: { <span class="hljs-attr">"type"</span>: <span class="hljs-string">"gitlab-ci"</span> }
      },
      <span class="hljs-attr">"status"</span>: {
        <span class="hljs-attr">"nextScheduleTime"</span>: <span class="hljs-string">"2025-11-04T02:00:00Z"</span>
      }
    }
  ]
}
</code></pre>
<h3 id="heading-cron-validation">Cron Validation</h3>
<p>Uses <code>croniter</code> library for full cron syntax support:</p>
<ul>
<li><p>Standard 5-field cron (<code>0 2 * * 1</code>)</p>
</li>
<li><p>Extended syntax (ranges, steps, lists)</p>
</li>
<li><p>Timezone support (UTC default)</p>
</li>
<li><p>Next run calculation</p>
</li>
</ul>
<h3 id="heading-backend-abstraction">Backend Abstraction</h3>
<p>Designed for extensibility:</p>
<ul>
<li><p><strong>gitlab-ci</strong> (v0.8.0)</p>
</li>
<li><p><strong>github-actions</strong> (planned v0.9.0)</p>
</li>
<li><p><strong>local-cron</strong> (planned v0.9.0)</p>
</li>
<li><p><strong>jenkins</strong> (community request)</p>
</li>
</ul>
<h2 id="heading-getting-started">Getting Started</h2>
<p><strong>Option 1: Docker (Zero Installation)</strong></p>
<pre><code class="lang-bash">docker pull jmogaming/jmo-security:0.8.0
docker run --rm -it \
  -v <span class="hljs-string">"<span class="hljs-subst">$(pwd)</span>:/scan"</span> \
  jmogaming/jmo-security:0.8.0 \
  schedule create my-scan --cron <span class="hljs-string">"0 2 * * *"</span> --profile balanced --repo .
</code></pre>
<p><strong>Option 2: PyPI</strong></p>
<pre><code class="lang-bash">pip install jmo-security==0.8.0
jmo schedule create my-scan --cron <span class="hljs-string">"0 2 * * *"</span> --profile balanced --repo .
</code></pre>
<p><strong>Option 3: GitHub Clone</strong></p>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/jimmy058910/jmo-security-repo.git
<span class="hljs-built_in">cd</span> jmo-security-repo
make dev-deps
jmo schedule create my-scan --cron <span class="hljs-string">"0 2 * * *"</span> --profile balanced --repo .
</code></pre>
<h2 id="heading-upgrade-notes">Upgrade Notes</h2>
<p><strong>Breaking Changes:</strong> None. v0.8.0 is fully backward-compatible.</p>
<p><strong>New Dependencies:</strong></p>
<ul>
<li><p><code>croniter&gt;=2.0</code> (cron parsing)</p>
</li>
<li><p><code>types-croniter</code> (type hints)</p>
</li>
</ul>
<p>Install with: <code>pip install --upgrade jmo-security[scheduling]</code></p>
<h2 id="heading-whats-next">What's Next</h2>
<p><strong>v0.9.0 Roadmap:</strong></p>
<ul>
<li><p>GitHub Actions workflow generation</p>
</li>
<li><p>Full local cron integration</p>
</li>
<li><p>Schedule templating (reusable schedule configs)</p>
</li>
<li><p>Multi-region scheduling (different timezones per schedule)</p>
</li>
<li><p>Schedule dependency chains ("run scan B after scan A succeeds")</p>
</li>
</ul>
<p><strong>See full roadmap:</strong> <a target="_blank" href="https://github.com/jimmy058910/jmo-security-repo/blob/main/ROADMAP.md">ROADMAP.md</a></p>
<h2 id="heading-contributing">Contributing</h2>
<p>JMo Security is 100% open source (MIT OR Apache-2.0 dual-licensed). Contributions welcome:</p>
<ul>
<li><p>🐛 Report bugs: <a target="_blank" href="https://github.com/jimmy058910/jmo-security-repo/issues">GitHub Issues</a></p>
</li>
<li><p>💡 Feature requests: <a target="_blank" href="https://github.com/jimmy058910/jmo-security-repo/discussions">GitHub Discussions</a></p>
</li>
<li><p>🔧 Pull requests: <a target="_blank" href="https://github.com/jimmy058910/jmo-security-repo/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a></p>
</li>
</ul>
<p><strong>Looking to hire?</strong> I'm a recent cybersecurity bootcamp graduate (Michigan Tech × Institute of Data, October 2025) actively seeking cybersecurity/DevSecOps roles. JMo Security started as my capstone project and evolved into a production-grade platform. <a target="_blank" href="https://linkedin.com/in/jimmy058910">Connect with me on LinkedIn</a>.</p>
<h2 id="heading-support-the-project">Support the Project</h2>
<ul>
<li><p>⭐ Star on GitHub: <a target="_blank" href="https://github.com/jimmy058910/jmo-security-repo">jimmy058910/jmo-security-repo</a></p>
</li>
<li><p>💚 Support on Ko-fi: <a target="_blank" href="https://ko-fi.com/jmogaming">ko-fi.com/jmogaming</a></p>
</li>
<li><p>💰 Sponsor on GitHub: <a target="_blank" href="https://github.com/sponsors/jimmy058910">github.com/sponsors/jimmy058910</a></p>
</li>
<li><p>📧 Subscribe to newsletter: <a target="_blank" href="https://jmotools.com/subscribe.html">jmotools.com/subscribe.html</a></p>
</li>
</ul>
<hr />
<p><strong>Links:</strong></p>
<ul>
<li><p>Documentation: <a target="_blank" href="https://docs.jmotools.com">docs.jmotools.com</a></p>
</li>
<li><p>Blog: <a target="_blank" href="https://blog.jmotools.com">blog.jmotools.com</a></p>
</li>
<li><p>GitHub: <a target="_blank" href="https://github.com/jimmy058910/jmo-security-repo">github.com/jimmy058910/jmo-security-repo</a></p>
</li>
<li><p>PyPI: <a target="_blank" href="https://pypi.org/project/jmo-security/">pypi.org/project/jmo-security/</a></p>
</li>
<li><p>Docker Hub: [hub.docker.com/r/jmogaming/jmo-security</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Why I Built a Free Security Scanner That Makes Sense]]></title><description><![CDATA[From bootcamp graduate to launching an open-source tool that catches what others miss

I just completed the Institute of Data / Michigan Tech Cybersecurity program, and for my capstone project, I scanned 22 random GitHub repositories with 4 secrets s...]]></description><link>https://blog.jmotools.com/why-i-built-jmo-security</link><guid isPermaLink="true">https://blog.jmotools.com/why-i-built-jmo-security</guid><category><![CDATA[cybersecurity]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[DevSecOps]]></category><category><![CDATA[Security]]></category><category><![CDATA[appsec]]></category><category><![CDATA[Python]]></category><category><![CDATA[Docker]]></category><category><![CDATA[tools]]></category><dc:creator><![CDATA[James Moceri]]></dc:creator><pubDate>Fri, 24 Oct 2025 01:40:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761269925177/d5df2b01-9119-4c5e-bf44-f0024b5d04c7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-from-bootcamp-graduate-to-launching-an-open-source-tool-that-catches-what-others-miss">From bootcamp graduate to launching an open-source tool that catches what others miss</h2>
<hr />
<p>I just completed the Institute of Data / Michigan Tech Cybersecurity program, and for my capstone project, I scanned 22 random GitHub repositories with 4 secrets scanning tools.</p>
<p>The results shocked me:</p>
<ul>
<li><p>🚨 <strong>1,562 security findings</strong> across 22 repos</p>
</li>
<li><p>🔴 <strong>5 CRITICAL verified secrets</strong> (live API keys, active tokens)</p>
</li>
<li><p>🟠 <strong>579 HIGH severity issues</strong> (hardcoded credentials, weak crypto, injection flaws)</p>
</li>
<li><p>📊 <strong>Only 3.5% false positive rate</strong></p>
</li>
</ul>
<p>But here's the real problem: <strong>I had to manually parse 4 different JSON formats, spend 3-4 hours aggregating results, and then map findings to compliance frameworks (OWASP, PCI DSS, NIST) by hand.</strong></p>
<p>Each one of those 5 critical secrets was a potential data breach waiting to happen. And most developers don't even know their secrets are exposed until it's far too late.</p>
<p>So, I built a solution.</p>
<h2 id="heading-the-problem-security-scanning-is-unnecessarily-complicated">The Problem: Security Scanning Is Unnecessarily Complicated</h2>
<p>During my bootcamp, I researched "Vibe Coding" platforms—tools like Replit, Lovable, and AI code generators that let anyone build apps without traditional coding. These platforms are amazing for accessibility, but they introduce serious vulnerabilities.</p>
<p>Here's what frustrated me: <strong>how are non-technical users supposed to catch security issues?</strong></p>
<p>Most security scanners assume you have:</p>
<ul>
<li><p>A dedicated security team</p>
</li>
<li><p>Deep knowledge of tool configurations</p>
</li>
<li><p>Time to learn 5+ different tools</p>
</li>
<li><p>$50,000/year for commercial platforms</p>
</li>
<li><p>A Linux/macOS environment (Windows users? Good luck.)</p>
</li>
</ul>
<p>For solo developers, small teams, and bootcamp graduates like me, this was a non-starter.</p>
<p><strong>I needed a tool that just worked.</strong></p>
<h2 id="heading-the-solution-jmo-security">The Solution: JMo Security</h2>
<p><strong>JMo Security</strong> is an open-source security audit toolkit that integrates 11+ industry-standard scanners into one unified platform.</p>
<p>Instead of juggling Trivy, Semgrep, TruffleHog, OWASP ZAP, and 7 other tools, you get one command and one dashboard.</p>
<h3 id="heading-what-makes-it-different">What Makes It Different</h3>
<h4 id="heading-1-multi-target-scanning-one-command-six-asset-types">1. Multi-Target Scanning (One Command, Six Asset Types)</h4>
<p>Most scanners only work on Git repositories. JMo scans:</p>
<ul>
<li><p>📦 <strong>Repositories</strong> (local Git repos)</p>
</li>
<li><p>🐳 <strong>Container images</strong> (Docker/OCI)</p>
</li>
<li><p>☁️ <strong>IaC files</strong> (Terraform, CloudFormation, Kubernetes manifests)</p>
</li>
<li><p>🌐 <strong>Live websites</strong> (DAST with OWASP ZAP)</p>
</li>
<li><p>🦊 <strong>GitLab repos</strong> (with TruffleHog verified secrets)</p>
</li>
<li><p>⎈ <strong>Kubernetes clusters</strong> (live cluster scanning)</p>
</li>
</ul>
<p>Example: Scan your app, its container, and your production website in one command:</p>
<pre><code class="lang-bash">jmo scan \
  --repo ./myapp \
  --image myapp:latest \
  --url https://myapp.com \
  --k8s-context prod
</code></pre>
<p><strong>Result:</strong> One unified dashboard with deduplicated findings across all targets.</p>
<h4 id="heading-2-compliance-automation-no-more-manual-mapping">2. Compliance Automation (No More Manual Mapping)</h4>
<p>Remember those 3-4 hours I spent manually mapping findings to compliance frameworks? JMo does it automatically.</p>
<p>Every finding is auto-tagged with <strong>six compliance frameworks</strong>:</p>
<ul>
<li><p><strong>OWASP Top 10 2021</strong> - Web application security risks</p>
</li>
<li><p><strong>CWE Top 25 2024</strong> - Most dangerous software weaknesses</p>
</li>
<li><p><strong>NIST Cybersecurity Framework 2.0</strong> - Federal compliance</p>
</li>
<li><p><strong>PCI DSS 4.0</strong> - Payment card industry standards</p>
</li>
<li><p><strong>CIS Controls v8.1</strong> - Critical security controls</p>
</li>
<li><p><strong>MITRE ATT&amp;CK</strong> - Adversary tactics and techniques</p>
</li>
</ul>
<p><strong>Real talk:</strong> This feature alone could have saved me many hours during my capstone. What used to take days now takes 5 minutes.</p>
<h4 id="heading-3-beginner-friendly-5-minute-first-scan">3. Beginner-Friendly (5-Minute First Scan)</h4>
<p>Interactive wizard guides first-time users:</p>
<pre><code class="lang-bash">jmotools wizard
</code></pre>
<p>The wizard:</p>
<ul>
<li><p>Detects your environment (Docker available? Use that!)</p>
</li>
<li><p>Recommends scan profiles (fast/balanced/deep)</p>
</li>
<li><p>Auto-discovers repositories and URLs</p>
</li>
<li><p>Shows command preview before running</p>
</li>
<li><p>Opens results when done</p>
</li>
</ul>
<p><strong>No security knowledge required.</strong></p>
<h4 id="heading-4-windows-support-docker-mode">4. Windows Support (Docker Mode)</h4>
<p>Most security tools don't work on Windows. JMo's Docker mode delivers <strong>100% tool coverage</strong> on Windows/WSL2:</p>
<pre><code class="lang-bash">docker run -v $(<span class="hljs-built_in">pwd</span>):/scan ghcr.io/jimmy058910/jmo-security:latest \
  scan --repo /scan/myapp
</code></pre>
<p>Zero installation. Full tool suite. Works everywhere.</p>
<h3 id="heading-how-it-works">How It Works</h3>
<p>JMo uses a two-phase architecture:</p>
<h4 id="heading-phase-1-scan">Phase 1: Scan</h4>
<ul>
<li><p>Runs 11 tools in parallel (configurable threads)</p>
</li>
<li><p>Writes raw JSON outputs to <code>results/</code></p>
</li>
<li><p>Supports timeouts and retries for flaky tools</p>
</li>
</ul>
<h4 id="heading-phase-2-report">Phase 2: Report</h4>
<ul>
<li><p>Normalizes all findings to a unified schema</p>
</li>
<li><p>Deduplicates by fingerprint ID</p>
</li>
<li><p>Enriches with compliance frameworks</p>
</li>
<li><p>Generates dashboard, SARIF, JSON, Markdown</p>
</li>
</ul>
<h4 id="heading-tools-orchestrated-v070">Tools Orchestrated (v0.7.0)</h4>
<ul>
<li><p><strong>Secrets:</strong> TruffleHog (verified secrets), Nosey Parker (deep scanning)</p>
</li>
<li><p><strong>SAST:</strong> Semgrep (multi-language), Bandit (Python-specific)</p>
</li>
<li><p><strong>SBOM + Vuln:</strong> Syft (SBOM), Trivy (CVE scanning)</p>
</li>
<li><p><strong>IaC:</strong> Checkov (policy-as-code)</p>
</li>
<li><p><strong>Dockerfile:</strong> Hadolint (best practices)</p>
</li>
<li><p><strong>DAST:</strong> OWASP ZAP (web security), Nuclei (API security)</p>
</li>
<li><p><strong>Runtime:</strong> Falco (container/K8s monitoring)</p>
</li>
<li><p><strong>Fuzzing:</strong> AFL++ (coverage-guided fuzzing)</p>
</li>
</ul>
<h3 id="heading-real-world-example">Real-World Example</h3>
<p><strong>Scenario:</strong> Audit a web app before production launch.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Scan repo + Docker image + live staging environment</span>
jmo scan \
  --repo ./webapp \
  --image webapp:staging \
  --url https://staging.myapp.com \
  --profile-name balanced \
  --results-dir ./audit

<span class="hljs-comment"># Generate compliance report</span>
jmo report ./audit --profile
</code></pre>
<p><strong>Output:</strong></p>
<ul>
<li><p><code>dashboard.html</code> — Interactive findings with suggested fixes</p>
</li>
<li><p><code>COMPLIANCE_</code><a target="_blank" href="http://SUMMARY.md"><code>SUMMARY.md</code></a> — Auto-mapped to OWASP/NIST/PCI DSS</p>
</li>
<li><p><code>findings.sarif</code> — Upload to GitHub Security tab</p>
</li>
<li><p><code>timings.json</code> — Performance profiling</p>
</li>
</ul>
<p><strong>Time:</strong> 15 minutes (vs. 8+ hours manually running tools)</p>
<h2 id="heading-why-open-source">Why Open Source?</h2>
<p>I'm building this in public for three reasons:</p>
<p><strong>1. Security tools should be accessible.</strong></p>
<p>Not everyone has $50,000/year for commercial scanners. Those 5 critical secrets I found? They were in open-source projects maintained by solo developers and small teams. They deserve enterprise-grade security without the enterprise price tag.</p>
<p><strong>2. I'm learning (and I want feedback).</strong></p>
<p>After 12+ years in operational management, I'm bringing that process-oriented mindset to cybersecurity. I want experienced engineers to tear this apart, suggest improvements, and help me build something truly useful for all.</p>
<p><strong>3. I believe in giving back.</strong></p>
<p>The bootcamp and open-source community helped me plenty of times over my lifetime. This is my way of contributing—and hopefully making security less painful for the next person.</p>
<h3 id="heading-current-status">Current Status</h3>
<ul>
<li><p>✅ <strong>272 tests passing</strong> (91% coverage)</p>
</li>
<li><p>✅ <strong>v0.7.1 released</strong> (multi-target wizard addition)</p>
</li>
<li><p>✅ <strong>PyPI package</strong> (<code>pip install jmo-security</code>)</p>
</li>
<li><p>✅ <strong>Docker images</strong> (3 variants: full/slim/alpine)</p>
</li>
<li><p>✅ <strong>CI/CD ready</strong> (GitHub Actions examples included)</p>
</li>
</ul>
<h3 id="heading-whats-next">What's Next</h3>
<p>I'm actively working on:</p>
<ul>
<li><p>Scheduled scans with cron support</p>
</li>
<li><p>Machine-readable diff reports (compare scans over time)</p>
</li>
<li><p>Plugin system for custom tools</p>
</li>
<li><p>Policy-as-Code integration (OPA)</p>
</li>
</ul>
<p>See the full roadmap: <a target="_blank" href="http://ROADMAP.md">ROADMAP.md</a></p>
<h3 id="heading-try-it-yourself">Try It Yourself</h3>
<p><strong>Quick Start (Docker - Zero Installation):</strong></p>
<pre><code class="lang-bash">docker run -v $(<span class="hljs-built_in">pwd</span>):/scan ghcr.io/jimmy058910/jmo-security:latest \
  scan --repo /scan/myrepo
</code></pre>
<p><strong>Quick Start (Local Install):</strong></p>
<pre><code class="lang-bash">pip install jmo-security
jmotools wizard
</code></pre>
<p><strong>Links:</strong></p>
<ul>
<li><p>📦 GitHub: <a target="_blank" href="http://github.com/jimmy058910/jmo-security-repo">github.com/jimmy058910/jmo-security-repo</a></p>
</li>
<li><p>📖 Documentation: <a target="_blank" href="http://docs.jmotools.com">docs.jmotools.com</a></p>
</li>
<li><p>💼 LinkedIn: <a target="_blank" href="https://www.linkedin.com/in/jimmy-moceri/">linkedin.com/in/jimmy-moceri/</a></p>
</li>
<li><p>💚 Support: <a target="_blank" href="http://ko-fi.com/jmogaming">ko-fi.com/jmogaming</a></p>
</li>
<li><p>💰 Sponsor: <a target="_blank" href="http://github.com/sponsors/jimmy058910">github.com/sponsors/jimmy058910</a></p>
</li>
</ul>
<h3 id="heading-get-updates">Get Updates</h3>
<p>I'm sharing:</p>
<ul>
<li><p>Real-world security case studies</p>
</li>
<li><p>New feature announcements</p>
</li>
<li><p>Behind-the-scenes development stories</p>
</li>
</ul>
<p><a target="_blank" href="https://jmotools.com/subscribe.html"><strong>Subscribe to Newsletter</strong></a> | <a target="_blank" href="https://github.com/jimmy058910"><strong>Follow on GitHub</strong></a></p>
<hr />
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>If you're juggling multiple security tools, paying for commercial scanners, or just starting in cybersecurity, <strong>I built this for you.</strong></p>
<p>Those 5 critical secrets I found during my capstone project? They're still out there. In production. Waiting to be exploited.</p>
<p>Security teams shouldn't spend hours juggling tools. They should spend that time fixing vulnerabilities.</p>
<p>JMo Security is 100% open-source, self-hosted, and free. No vendor lock-in. No data leaves your machine. No PhD in cybersecurity required.</p>
<p><strong>I'm currently seeking a Cybersecurity, DevSecOps, or Application Security roles</strong> where I can combine hands-on technical skills with a process-oriented mindset.</p>
<p>I'd love your feedback—issues, PRs, and stars are all welcome. Let's connect if you're building security teams that value both technical depth and operational excellence.</p>
<p>Let's make security accessible to everyone.</p>
<p>— James Moceri (JMo)  </p>
<hr />
<p><strong>Tags:</strong> <code>cybersecurity</code> <code>opensource</code> <code>devsecops</code> <code>security</code> <code>appsec</code> <code>python</code> <code>docker</code></p>
]]></content:encoded></item></channel></rss>