<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Adam Innes · Blog</title><description>Notes on web security, headless Shopify, AWS, data, and the shell.</description><link>https://www.adaminnes.dev/</link><item><title>The Agent Harness: What to Build Around the Model and What to Rip Out</title><link>https://www.adaminnes.dev/blog/agent-harness-design/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/agent-harness-design/</guid><description>The same model can look brilliant or broken depending on the code wrapped around it. Here&apos;s what an agent harness is, what the big labs put in theirs, and why the best move is often deleting a piece.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><category>AI Agents</category><category>LLM</category><category>Agent Harness</category><category>Security</category></item><item><title>Giving AI Agents a Shared Vocabulary with OWL and SHACL</title><link>https://www.adaminnes.dev/blog/ontologies-for-ai-agents/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/ontologies-for-ai-agents/</guid><description>A JSON schema tells an agent what shape its output should have, not what the words mean. Here&apos;s how W3C ontologies fill that gap, and why you want SHACL guarding the door.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><category>AI Agents</category><category>Ontologies</category><category>Knowledge Graphs</category><category>Security</category></item><item><title>What&apos;s Actually Inside an AI Agent</title><link>https://www.adaminnes.dev/blog/how-ai-agents-work-under-the-hood/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/how-ai-agents-work-under-the-hood/</guid><description>Strip away the branding and an AI agent is a model, some tools, a loop and a context window. Here&apos;s how each piece works, and where the security and cost problems hide.</description><pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate><category>AI Agents</category><category>LLM</category><category>MCP</category><category>Security</category></item><item><title>Hermes Agent: How a Self-Improving AI Agent Remembers What It Learns</title><link>https://www.adaminnes.dev/blog/hermes-agent-self-improving-ai-agent/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/hermes-agent-self-improving-ai-agent/</guid><description>A practical look at Nous Research&apos;s open-source Hermes Agent: its skills loop, deliberately small memory, messaging gateway, and the security controls worth setting before you let it run unattended.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>AI Agents</category><category>Hermes Agent</category><category>LLM</category><category>Automation</category><category>Security</category></item><item><title>Hermes Agent v0.2.0 Is Out. Here&apos;s What I&apos;d Actually Use It For</title><link>https://www.adaminnes.dev/blog/hermes-agent-first-look/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/hermes-agent-first-look/</guid><description>Nous Research just tagged the first real release of Hermes Agent. A casual first look at the practical jobs it&apos;s good for right now, and the safety switches worth flipping before you hand it a terminal.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><category>AI Agents</category><category>Hermes Agent</category><category>Automation</category><category>Security</category></item><item><title>A Python Machine Learning Setup You Can Safely Hand to an AI Agent</title><link>https://www.adaminnes.dev/blog/python-ml-setup-uv-pytorch/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/python-ml-setup-uv-pytorch/</guid><description>How I&apos;d set up a Python ML project in February 2026 with uv and PyTorch 2.10, so you get the right GPU build, a lockfile you can trust, and a coding agent that doesn&apos;t quietly wreck your environment.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><category>Python</category><category>Machine Learning</category><category>PyTorch</category><category>uv</category><category>AI Agents</category></item><item><title>Machine Learning for Lead Scoring: A Technical Deep Dive</title><link>https://www.adaminnes.dev/blog/machine-learning-lead-scoring-technical-deep-dive/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/machine-learning-lead-scoring-technical-deep-dive/</guid><description>Explore how machine learning transforms lead scoring from rule-based systems into dynamic, adaptive models that maximize conversion rates and ROI.</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><category>Machine Learning</category><category>ML</category><category>Model Training</category><category>Lead Scoring</category></item><item><title>MCP or Just Your API? What the Protocol Actually Adds</title><link>https://www.adaminnes.dev/blog/mcp-vs-api-what-the-protocol-adds/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/mcp-vs-api-what-the-protocol-adds/</guid><description>An MCP server doesn&apos;t replace your REST API, it describes it to AI apps that have never seen it. Here&apos;s what the protocol adds on top, and where the security work lands.</description><pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate><category>MCP</category><category>AI Agents</category><category>APIs</category><category>Security</category></item><item><title>Data Imputation Best Practices</title><link>https://www.adaminnes.dev/blog/data-imputation-best-practices/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/data-imputation-best-practices/</guid><description>Best practices when doing data imputation.</description><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate></item><item><title>Effective Debugging for Shopify Hydrogen/Oxygen</title><link>https://www.adaminnes.dev/blog/effective-debugging-for-shopify-hydrogen-oxygen/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/effective-debugging-for-shopify-hydrogen-oxygen/</guid><pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate><category>Shopify</category><category>Hydrogen</category><category>Remix</category><category>GraphQL</category></item><item><title>Navigating Bugs in Shopify&apos;s Hydrogen Runtime: Overcoming the Lack of a Node Environment</title><link>https://www.adaminnes.dev/blog/navigating-bugs-in-shopifys-hydrogen-runtime-overcoming-the-lack-of-a-node-environment/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/navigating-bugs-in-shopifys-hydrogen-runtime-overcoming-the-lack-of-a-node-environment/</guid><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><category>Shopify</category><category>Remix</category><category>Hydrogen</category><category>Oxygen</category></item><item><title>Headless Shopify: Updating custom metafields for a Company object</title><link>https://www.adaminnes.dev/blog/headless-shopify-updating-custom-metafields-for-a-company-object/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/headless-shopify-updating-custom-metafields-for-a-company-object/</guid><pubDate>Sun, 07 Jul 2024 00:00:00 GMT</pubDate><category>GraphQL</category><category>Remix</category><category>Headless Shopify</category><category>e-commerce</category></item><item><title>Shopify: Hydrogen Remix and Oxygen</title><link>https://www.adaminnes.dev/blog/shopify-hydrogen-remix-and-oxygen/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/shopify-hydrogen-remix-and-oxygen/</guid><pubDate>Tue, 02 Jan 2024 00:00:00 GMT</pubDate><category>Shopify</category><category>Hydrogen</category><category>Remix</category><category>Oxygen</category><category>E-commerce</category></item><item><title>Preventing DOM Clobbering Attacks: Defenses and Mitigations</title><link>https://www.adaminnes.dev/blog/preventing-dom-clobbering/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/preventing-dom-clobbering/</guid><description>DOM Clobbering refers to a specific form of injection attack that doesn’t require javascript to be added to implement. In a DOM Clobbering attack, the intention of the attacker is to confuse the client-side JavaScript code of web applications.</description><pubDate>Mon, 14 Aug 2023 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>comptia security+</category><category>dom clobbering</category></item><item><title>Defending Against Clickjacking Attacks</title><link>https://www.adaminnes.dev/blog/defending-against-clickjacking-attacks/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/defending-against-clickjacking-attacks/</guid><description>Best practices for defending against clickjacking in web applications.</description><pubDate>Sat, 15 Jul 2023 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>comptia security+</category><category>clickjacking</category><category>content security policies</category></item><item><title>Setting up multiple Gitlab accounts and SSH keys on Linux/MacOS</title><link>https://www.adaminnes.dev/blog/setting-up-multiple-gitlab-accounts-and-ssh-keys-on-linux-mac-os/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/setting-up-multiple-gitlab-accounts-and-ssh-keys-on-linux-mac-os/</guid><description>Setting up multiple Gitlab accounts and ssh keys on Linux/MacOS</description><pubDate>Wed, 14 Jun 2023 00:00:00 GMT</pubDate><category>gitlab</category><category>ssh configuration</category><category>keys</category></item><item><title>Using the split and awk commands to chunk and process a massive text file (~4.5G)</title><link>https://www.adaminnes.dev/blog/using-split-and-awk-commands-to-chunk-and-process-massive-text-file/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/using-split-and-awk-commands-to-chunk-and-process-massive-text-file/</guid><description>Split up and format each line of a massive ~4.5G text file with split and awk.</description><pubDate>Mon, 01 May 2023 00:00:00 GMT</pubDate><category>beowulf cluster</category><category>raspberry pi</category><category>data parsing</category></item><item><title>React hook to determine element width dynamically</title><link>https://www.adaminnes.dev/blog/react-hook-to-determine-element-width-dynamically/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/react-hook-to-determine-element-width-dynamically/</guid><description>One common requirement when working with dynamic layouts is the need to determine the width of an element dynamically. In this post, we will create a React hook that calculates the width of an element dynamically.</description><pubDate>Tue, 14 Feb 2023 00:00:00 GMT</pubDate><category>react</category><category>hooks</category><category>nextjs</category></item><item><title>Securing Passwords for Storage with Hashing</title><link>https://www.adaminnes.dev/blog/securing-passwords-for-storage-with-hashing/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/securing-passwords-for-storage-with-hashing/</guid><description>How and why to store password data securely.</description><pubDate>Wed, 14 Dec 2022 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>password hashing</category><category>comptia security+</category></item><item><title>Responsive Images with AWS Serverless Image Handler (S3) for VueJS/React</title><link>https://www.adaminnes.dev/blog/responsive-images-with-aws-serverless-image-handler-using-s3/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/responsive-images-with-aws-serverless-image-handler-using-s3/</guid><description>Cheap Responsive Images with Amazon&apos;s Serverless Image Handler (S3)</description><pubDate>Sun, 04 Sep 2022 00:00:00 GMT</pubDate><category>aws serverless image handler</category><category>responsive images</category><category>aws lambda</category></item><item><title>Securely using dangerouslySetInnerHTML in a React application</title><link>https://www.adaminnes.dev/blog/securely-using-dangerously-set-inner-html-in-a-react-application/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/securely-using-dangerously-set-inner-html-in-a-react-application/</guid><description>A tutorial on how to securely use dangerouslySetInnerHTML in a React application.</description><pubDate>Sun, 28 Aug 2022 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>comptia security+</category></item><item><title>Software Security Testing: Static Code Analysis for React</title><link>https://www.adaminnes.dev/blog/software-security-testing-static-code-analysis-for-react/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/software-security-testing-static-code-analysis-for-react/</guid><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>code analysis</category><category>comptia security+</category></item><item><title>Okay Google, fetch a pizza - Google Home Action with NightwatchJS and AWS Lambda</title><link>https://www.adaminnes.dev/blog/fetch-a-pizza-google-home-action-webhook-with-nightwatchjs-chromedriver-aws-lambda/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/fetch-a-pizza-google-home-action-webhook-with-nightwatchjs-chromedriver-aws-lambda/</guid><description>Creating a Google Home Action that triggers a webhook automatically placing an order for a pizza.</description><pubDate>Sat, 14 May 2022 00:00:00 GMT</pubDate><category>home automation</category><category>selenium</category><category>nightwatchjs</category><category>google home actions</category></item><item><title>AWS EventBridge as a Crontab for Lambda</title><link>https://www.adaminnes.dev/blog/aws-event-bridge-as-a-crontab-for-lambda/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/aws-event-bridge-as-a-crontab-for-lambda/</guid><description>This post explains how to configure a cron job for an AWS Lambda function using AWS EventBridge.</description><pubDate>Sun, 01 May 2022 00:00:00 GMT</pubDate><category>aws eventbridge</category><category>cronjob</category><category>cron expressions</category></item><item><title>Understanding and using Web Components</title><link>https://www.adaminnes.dev/blog/understanding-and-using-web-components/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/understanding-and-using-web-components/</guid><description>Overview of Web Components as a concept and technology, including a brief example of how to create one.</description><pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate><category>html</category><category>component-based design</category><category>web components</category></item><item><title>Setting up Drupal as a GraphQL Backend for Gridsome or Gatsby</title><link>https://www.adaminnes.dev/blog/setting-up-drupal-as-a-graphql-backend-for-gridsome-or-gatsby/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/setting-up-drupal-as-a-graphql-backend-for-gridsome-or-gatsby/</guid><description>Lock down Drupal to use it as a GraphQL data source for a Gridsome/React Project</description><pubDate>Tue, 23 Mar 2021 00:00:00 GMT</pubDate><category>drupal</category><category>graphql</category><category>gridsome</category><category>gatsby</category></item><item><title>Chicago CTA Bus Tracking Dashboard in React/Gatsby</title><link>https://www.adaminnes.dev/blog/chicago-cta-bus-tracking-dashboard-in-react-gatsby/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/chicago-cta-bus-tracking-dashboard-in-react-gatsby/</guid><description>Creating a Chicago Transit Authority Bus Tracking Dashboard in React/Gatsby.</description><pubDate>Fri, 08 Mar 2019 00:00:00 GMT</pubDate><category>home automation</category><category>control panel</category><category>aws lambda</category></item><item><title>Safeguarding Digital Assets: The Importance of Data Loss Prevention</title><link>https://www.adaminnes.dev/blog/safeguarding-digital-assets-the-importance-of-data-loss-prevention/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/safeguarding-digital-assets-the-importance-of-data-loss-prevention/</guid><pubDate>Thu, 16 Aug 2018 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>dlp</category><category>comptia security+</category></item><item><title>The CIA Triad is a foundation of Cybersecurity</title><link>https://www.adaminnes.dev/blog/the-cia-triad-is-a-foundation-of-cybersecurity/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/the-cia-triad-is-a-foundation-of-cybersecurity/</guid><description>The CIA Triad is a cybersecurity model that defines the three main goals of information security: Confidentiality, Integrity, and Availability.</description><pubDate>Mon, 05 Mar 2018 00:00:00 GMT</pubDate><category>cybersecurity</category><category>certification research</category><category>cia triad</category><category>comptia security+</category></item><item><title>Secure HTTP Headers - Hardening Security with Headers</title><link>https://www.adaminnes.dev/blog/secure-http-headers-hardening-security-with-headers/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/secure-http-headers-hardening-security-with-headers/</guid><description>Most websites today are taking advantage of the security benefits of SSL. The web is becoming progressively more encrypted and safer thanks to the adoption of HTTPS and the efforts of projects promoting it like the Electronic Frontier Foudation&apos;s Certbot initiative and the HTTPS Everywhere browser extension.</description><pubDate>Wed, 10 May 2017 00:00:00 GMT</pubDate><category>cybersecurity</category><category>http headers</category><category>aws amplify</category></item><item><title>Useful Git Commands and Configuration</title><link>https://www.adaminnes.dev/blog/useful-git-commands-and-configuration/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/useful-git-commands-and-configuration/</guid><description>Useful git commands and configuration to speed up interacting with a repository via the command line.</description><pubDate>Wed, 12 Oct 2016 00:00:00 GMT</pubDate><category>git</category></item><item><title>POODLE Is Your Cue to Turn Off SSLv3</title><link>https://www.adaminnes.dev/blog/poodle-sslv3-turn-it-off/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/poodle-sslv3-turn-it-off/</guid><description>POODLE needs a man in the middle, a browser pushed down to SSL 3.0, and a server willing to go along with it. That server part is yours, so here&apos;s how to turn SSL 3.0 off in nginx and Apache and check that it worked.</description><pubDate>Mon, 20 Oct 2014 00:00:00 GMT</pubDate><category>Security</category><category>TLS</category><category>nginx</category><category>Apache</category></item><item><title>Shellshock: What the Bash Bug Is and What to Patch</title><link>https://www.adaminnes.dev/blog/shellshock-bash-environment-variable-bug/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/shellshock-bash-environment-variable-bug/</guid><description>A plain explanation of the Shellshock bash bug, why a web request can reach it, how to check your own machines, and why one patch turned into a week of them.</description><pubDate>Tue, 30 Sep 2014 00:00:00 GMT</pubDate><category>Security</category><category>Bash</category><category>Linux</category><category>CGI</category></item><item><title>Docker 1.0 for Web Developers: What Changes and What to Ask</title><link>https://www.adaminnes.dev/blog/docker-1-0-for-web-developers/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/docker-1-0-for-web-developers/</guid><description>Docker hit 1.0 last week. Here&apos;s what images, containers and a Dockerfile change for local development and deploys, plus the security questions worth asking before you lean on it.</description><pubDate>Mon, 16 Jun 2014 00:00:00 GMT</pubDate><category>Docker</category><category>Containers</category><category>DevOps</category><category>Security</category></item><item><title>You Patched Heartbleed. Now Finish the Job</title><link>https://www.adaminnes.dev/blog/heartbleed-after-the-patch/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/heartbleed-after-the-patch/</guid><description>Upgrading to OpenSSL 1.0.1g closes the Heartbleed hole, but it doesn&apos;t undo whatever leaked before you patched. Here&apos;s what the bug exposes and the cleanup order that actually matters.</description><pubDate>Mon, 14 Apr 2014 00:00:00 GMT</pubDate><category>Security</category><category>OpenSSL</category><category>TLS</category><category>Linux</category></item><item><title>Gawk - Useful Programs and Things to Know</title><link>https://www.adaminnes.dev/blog/useful-gawk-programs-and-things-to-know/</link><guid isPermaLink="true">https://www.adaminnes.dev/blog/useful-gawk-programs-and-things-to-know/</guid><description>Useful gawk programs and things to know when getting starting using gawk or awk variants on the command line.</description><pubDate>Thu, 02 Jan 2014 00:00:00 GMT</pubDate><category>gawk</category><category>awk</category><category>mawk</category><category>tawk</category><category>sed</category></item></channel></rss>