<?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>Forem: Mariam Reba Alexander</title>
    <description>The latest articles on Forem by Mariam Reba Alexander (@mariamreba).</description>
    <link>https://forem.com/mariamreba</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F663759%2F4d6b0bd1-c91a-4a82-8f9b-6f4d8822670d.jpg</url>
      <title>Forem: Mariam Reba Alexander</title>
      <link>https://forem.com/mariamreba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mariamreba"/>
    <language>en</language>
    <item>
      <title>Not able to keep up with tech?</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Sun, 05 Apr 2026 19:22:12 +0000</pubDate>
      <link>https://forem.com/updateddev/too-busy-to-keep-up-with-tech-12g9</link>
      <guid>https://forem.com/updateddev/too-busy-to-keep-up-with-tech-12g9</guid>
      <description>&lt;p&gt;Not able to keep up with tech?&lt;/p&gt;

&lt;p&gt;Most developers are.&lt;/p&gt;

&lt;p&gt;Between work, deadlines, and life commitments, staying updated on web dev, AI, and security often takes a back seat.&lt;/p&gt;

&lt;p&gt;It usually looks like:&lt;br&gt;
• Dozens of tabs open&lt;br&gt;
• Articles saved “for later.”&lt;br&gt;
• Important updates missed&lt;/p&gt;

&lt;p&gt;Not because developers don’t care...&lt;br&gt;
But because there simply isn’t enough time.&lt;/p&gt;

&lt;p&gt;That’s exactly why &lt;strong&gt;Updated Dev&lt;/strong&gt; exists.&lt;/p&gt;

&lt;p&gt;A curated newsletter designed for busy developers who want to stay ahead—even as tech evolves fast.&lt;/p&gt;

&lt;p&gt;No overwhelm. Just the updates that actually matter.&lt;/p&gt;

&lt;p&gt;Subscribe to receive weekly newsletter&lt;br&gt;
👉 &lt;a href="https://www.updateddev.com" rel="noopener noreferrer"&gt;https://www.updateddev.com&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.amazonaws.com%2Fuploads%2Farticles%2Fb3a0ind7g3nev70ypr0d.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.amazonaws.com%2Fuploads%2Farticles%2Fb3a0ind7g3nev70ypr0d.png" alt="Updated Dev" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>news</category>
      <category>security</category>
    </item>
    <item>
      <title>Join Updated Dev: High signal feed for busy developers</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Sat, 04 Apr 2026 13:07:52 +0000</pubDate>
      <link>https://forem.com/mariamreba/join-updated-dev-high-signal-feed-for-busy-developers-2kam</link>
      <guid>https://forem.com/mariamreba/join-updated-dev-high-signal-feed-for-busy-developers-2kam</guid>
      <description>&lt;p&gt;Join &lt;a href="https://www.updateddev.com" rel="noopener noreferrer"&gt;Updated Dev&lt;/a&gt;, the newsletter for busy developers who need to cut through the noise and stay sharp. &lt;/p&gt;

&lt;p&gt;Get the essential signal on Web Dev, AI, and AppSec delivered straight to your inbox, minus the FOMO.&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.amazonaws.com%2Fuploads%2Farticles%2F3wk8aofffrvg8fmz200y.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.amazonaws.com%2Fuploads%2Farticles%2F3wk8aofffrvg8fmz200y.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week, we dive into critical security challenges and groundbreaking developments that every developer should know about.&lt;/p&gt;

&lt;p&gt;🚨Security Roundup:&lt;br&gt;
Widespread supply chain attacks by TeamPCP&lt;br&gt;
Blueprint for Disaster: Claude Code Source Leak Triggers Critical RCE Flaw&lt;br&gt;
Axios Under Siege&lt;br&gt;
Critical Command Injection vulnerability in OpenAI Codex&lt;/p&gt;

&lt;p&gt;🧑‍💻Web Development:&lt;br&gt;
The Axios Supply Chain Crisis&lt;br&gt;
TypeScript 6.0 and the Go-Powered Future &lt;br&gt;
The Industry Debate: AI in Node.js Core&lt;/p&gt;

&lt;p&gt;🛠️Browser &amp;amp; Tooling Updates:&lt;br&gt;
Temporal API update&lt;br&gt;
Eleventy brand rename&lt;br&gt;
Vite 8.0 release&lt;/p&gt;

&lt;p&gt;✨AI roundup:&lt;br&gt;
The Claude Code Leak and Subcommand Bypass&lt;br&gt;
The Release of Gemma 4 and On-Device Agents&lt;br&gt;
Enterprise Expansion for Gemini 1.5 Pro&lt;/p&gt;

&lt;p&gt;💡Tips: &lt;br&gt;
Secure from supply chain attacks&lt;/p&gt;

&lt;p&gt;Catch up on these stories and more in our latest edition of &lt;a href="https://www.updateddev.com/p/updated-dev-s-weekly-roundup-a-week-of-breakthroughs-and-breaches" rel="noopener noreferrer"&gt;Updated Dev's Weekly Roundup&lt;/a&gt;. Your high-signal feed for staying informed and prepared in the ever-evolving tech landscape.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>news</category>
    </item>
    <item>
      <title>Reviewing code as human</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Sat, 07 Mar 2026 11:07:22 +0000</pubDate>
      <link>https://forem.com/mariamreba/reviewing-code-as-human-2jg1</link>
      <guid>https://forem.com/mariamreba/reviewing-code-as-human-2jg1</guid>
      <description>&lt;p&gt;Recently, during a conversation, I was asked what I look for in a pull request when reviewing code as an experienced software engineer. I mentioned a few criteria, but not all of them came to mind at that moment. It made me think, and I decided to document them, since one of my strengths is spotting issues in others’ code 😜.&lt;/p&gt;

&lt;p&gt;Some might wonder whether this is still relevant today, given AI tools like Copilot that review code. While AI does a good job at code review, in my experience it still misses certain nuances and isn’t perfect. Our judgment, based on our knowledge of the product or feature, allows us to determine what to dismiss and what to accept. We assess whether the review is too detailed or too high-level, what is acceptable and what isn’t. We identify what is important versus what is not. Finding the right balance is something AI can’t fully replicate, and this is where our human judgment is invaluable. Additionally, we can give AI instructions to address its gaps.&lt;/p&gt;

&lt;p&gt;Here are the key points I look out for during a code review as a frontend developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reusability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Are there repeated pieces of logic in the code?
&lt;/h3&gt;

&lt;p&gt;Could they be extracted to create a reusable component or function? Once extracted, are they properly tested, so they can be reused wherever applicable without having to rewrite or retest them extensively? When there is a future change in logic, you only need to update it in one place, and it will be automatically reflected everywhere. This also helps minimize bugs caused by inconsistent logic when one place is updated and another is not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are there any hard-coded, repeated values?
&lt;/h3&gt;

&lt;p&gt;As with logic, these can be stored as constants in a common file and reused wherever applicable. This helps reduce typos when repeatedly using hard-coded strings in multiple places, which can cause unexpected behavior and bugs. Instead, use constants. Today’s IDEs help with accurately autocompleting imported constants, which further reduces typos. Moreover, any future change in the value can be made in one place, avoiding the need to painstakingly update hard-coded strings everywhere and risk missing a few.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Did previously passing tests or assertions start failing or have to be changed?
&lt;/h3&gt;

&lt;p&gt;If previously passing tests are now failing or require changes, it indicates that the implementation logic has changed. Make sure the change is not caused by an unintended modification, typo, or side effect elsewhere. Instead of fixing the test first, verify that your implementation is correct. Review the git diff carefully to see whether there’s a mistake somewhere, it could be as simple as missing braces, a typo, or a small change you thought was harmless but that breaks tested code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Readability and Understandability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Naming of components, files, variables, and functions:
&lt;/h3&gt;

&lt;p&gt;Are they named according to what they actually do? For example, if something returns a boolean indicating whether to show or hide a button, you might name it &lt;code&gt;isButtonVisible&lt;/code&gt;. This name clearly states what it does and removes the need for additional comments. This is helpful for humans reviewing and reading the code, and it also helps AI agents understand the context. It’s a win–win.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complex logic:
&lt;/h3&gt;

&lt;p&gt;Are there too many &lt;code&gt;if&lt;/code&gt; and &lt;code&gt;else&lt;/code&gt; statements? Can it be simplified with a &lt;code&gt;switch&lt;/code&gt; statement or refactored into smaller functions? This will make the code more readable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function arguments:
&lt;/h3&gt;

&lt;p&gt;Are there too many arguments being passed to a function? Can they be passed as a single object with multiple key–value pairs instead? Arguments must be passed in the correct order, and when there are many, we are bound to make mistakes. Optional arguments make this even more complicated. To avoid this confusion, you can pass multiple values in an object. From the keys in the object parameter, one can easily see what is what and not worry about the order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comments and business logic:
&lt;/h3&gt;

&lt;p&gt;If it’s difficult to understand what is going on when reading the code, that’s an indication it may need some comments explaining the underlying business logic. This will help you and your team understand why it was done in a certain way later on. Important logic should also be covered by unit tests and end-to-end tests.&lt;/p&gt;

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

&lt;p&gt;Is the code written securely? Nowadays, static code analysis catches most insecure patterns, but it still doesn’t cover everything.&lt;/p&gt;

&lt;p&gt;Things to look out for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never trust user input. Are all raw user inputs sanitized for unsafe scripts and characters before sending them to the server or rendering them in the browser? This avoids most XSS attacks.&lt;/li&gt;
&lt;li&gt;Are all PII (Personally Identifiable Information) fields masked or encrypted before sending them to third-party analytics or monitoring tools?&lt;/li&gt;
&lt;li&gt;Are there any exposed API tokens or secrets, or &lt;code&gt;.env&lt;/code&gt; files accidentally committed? If anything is exposed, rotate and update the tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Error handling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Are all error scenarios handled carefully?
&lt;/h3&gt;

&lt;p&gt;Are &lt;code&gt;try/catch&lt;/code&gt; blocks used where errors are expected, such as around fetch or network requests?&lt;/p&gt;

&lt;h3&gt;
  
  
  Are we mutating values unintentionally?
&lt;/h3&gt;

&lt;p&gt;For example, suppose you want to display a future date in date-only format in one component and date time format in another. You might accidentally modify the original date object when formatting it for one of these cases. To avoid mutating original values, try to clone or copy them and then modify them as needed. Or use a getter that only reads and returns the original value without modifying it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do the error messages shown to users reveal too much information, such as stack traces or server details?
&lt;/h3&gt;

&lt;p&gt;Overly detailed error messages can help attackers gain information about the type of server in use or expose vulnerabilities in your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type safety
&lt;/h2&gt;

&lt;p&gt;Is your code properly typed, especially when you’re manipulating API responses for the UI? If interfaces or types are well defined, there’s less chance of mistakes. For example, you might check whether a key has a particular name before converting its value to uppercase. If you type in the wrong key name, the code will not work as expected. Another issue is when a field is optional; if you don’t know it’s optional, you might skip checking whether it’s defined, causing runtime errors when it’s missing. Having interfaces defined allows your IDE to help you identify the exact key names and avoid mistakes caused by wrong assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization
&lt;/h2&gt;

&lt;p&gt;I also look for places where lines of code can be optimized. Fewer lines of code often mean fewer opportunities for bugs.&lt;/p&gt;

&lt;p&gt;In some cases, you can check if there’s already a utility function with similar logic that can be reused. Look for ways to adapt or slightly extend that utility function so it can support the new implementation.&lt;/p&gt;

&lt;p&gt;Do you really need to assign intermediate variables where you could use object mapping or chaining directly? Extra variables can use more memory, often negligible on their own, but small changes like this can add up and improve performance over time.&lt;/p&gt;

&lt;p&gt;I am sure there are more things I look for in a PR, but these are the top ones I can think of right now. What's important is that you care about the product, your application's users, yourself, and your teammates. If you care enough, you'll notice most mistakes in the code and try to fix them. That’s what makes us special as human reviewers. &lt;/p&gt;

</description>
      <category>coding</category>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Why faking real browser events doesn't work</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:23:21 +0000</pubDate>
      <link>https://forem.com/mariamreba/why-faking-real-browser-events-doesnt-work-4pp1</link>
      <guid>https://forem.com/mariamreba/why-faking-real-browser-events-doesnt-work-4pp1</guid>
      <description>&lt;p&gt;Some time ago, I tried to programmatically trigger a typeahead dropdown with JavaScript for a task I was working on, and I hit a complete brick wall.&lt;/p&gt;

&lt;p&gt;I wrote the code to dispatch the input events and saw the value appear in the input box, but nothing else happened. The UI just sat there. It didn't trigger the input event that actually updates the state, and it definitely didn't trigger the dropdown.&lt;/p&gt;

&lt;p&gt;It turns out I was fighting a core security feature: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted" rel="noopener noreferrer"&gt;the &lt;code&gt;isTrusted&lt;/code&gt; read-only property.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Reality Check:
&lt;/h3&gt;

&lt;p&gt;In the Event interface, &lt;code&gt;isTrusted&lt;/code&gt; is the browser’s way of knowing if an event is "real."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;isTrusted: true&lt;/code&gt; – Generated by the User Agent (real human clicks or physical key presses).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;isTrusted: false&lt;/code&gt; – Dispatched via &lt;code&gt;EventTarget.dispatchEvent()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because I couldn't manually set isTrusted to true, the dropdown's security logic ignored my "fake" events.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Workaround: Working with the Framework, not the DOM
&lt;/h3&gt;

&lt;p&gt;I eventually solved this by leaning into  Vue's reactive system instead of trying to force the browser to believe a lie. Since I couldn't "fake" the event, I updated the data model directly. Then I updated the typeahead option programmatically. It wasn't about the event anymore; it was about the state.&lt;/p&gt;

&lt;h3&gt;
  
  
  How professional tools handle this:
&lt;/h3&gt;

&lt;p&gt;When you need to scale this for testing, you have to step outside the standard sandbox:&lt;br&gt;
Automation tools like Playwright and Cypress make use of the &lt;strong&gt;&lt;a href="https://chromedevtools.github.io/devtools-protocol/tot/Input/#:~:text=The%20%60dispatchMouseEvent%60%20method%20dispatches%20a%20mouse%20event,be:%20*%20%60none%60%20*%20%60left%60%20*%20%60right%60" rel="noopener noreferrer"&gt;Chrome DevTools Protocol (CDP)&lt;/a&gt;&lt;/strong&gt; to inject events into the browser's hardware pipeline, making &lt;code&gt;isTrusted&lt;/code&gt; true&lt;/p&gt;

&lt;h3&gt;
  
  
  The Lesson:
&lt;/h3&gt;

&lt;p&gt;If you can’t fake user authority, stop trying to force the DOM. Use a tool like &lt;em&gt;Playwright&lt;/em&gt; or &lt;em&gt;Cypress&lt;/em&gt; for automation, or work directly with your framework’s native bindings and lifecycle to get the job done.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
      <category>javascript</category>
    </item>
    <item>
      <title>To those who are left behind in the AI rush</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Sat, 31 Jan 2026 21:16:32 +0000</pubDate>
      <link>https://forem.com/mariamreba/to-those-who-are-left-behind-in-the-ai-rush-45f5</link>
      <guid>https://forem.com/mariamreba/to-those-who-are-left-behind-in-the-ai-rush-45f5</guid>
      <description>&lt;p&gt;Ever feel overwhelmed by AI posts on every social media and professional platform? And don't understand the AI jargon, buzzwords, and concepts being discussed? Here is a cheat sheet summarizing the key points to help you get up to speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Concepts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NLP (Natural Language Processing)&lt;/strong&gt;: The broad field of AI that teaches computers to understand, interpret, and generate human language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM (Large Language Model)&lt;/strong&gt;: A type of AI trained on massive amounts of text to predict the next word in a sequence, allowing it to chat, write, and summarize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LMM (Large Multimodal Model)&lt;/strong&gt;: An advanced version of an LLM that can understand more than just text, such as images, audio, and video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foundational Model&lt;/strong&gt;: A massive, "general purpose" AI model (like GPT-4) trained on huge data that serves as a base to be adapted for many different specific tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal&lt;/strong&gt;: The ability of an AI to process and "connect" different types of data (modes) at once, like seeing an image and describing it in text. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Techniques
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: The art of crafting specific instructions or "prompts" to get the best possible answer from an AI model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finetune&lt;/strong&gt;: Taking a pre-trained model and giving it extra training on a smaller, specific dataset to make it an expert in a particular subject or style.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt;: Connecting an AI to a trusted external database (like your company’s files) so it can look up real-time facts before answering, reducing "hallucinations".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedding Model&lt;/strong&gt;: A tool that converts text or images into a list of numbers (vectors) that represent their meaning, allowing computers to compare how "similar" two ideas are. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced AI &amp;amp; Engineering
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Engineering&lt;/strong&gt;: The practice of building complete applications using ready-made AI models (like foundation models). Instead of training a model from scratch, an AI engineer focuses on integrating these models into software, ensuring they are secure, cost-effective, and useful for the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ML Engineering (Machine Learning Engineering)&lt;/strong&gt;: A specialized role focused on creating and improving the models themselves. This involves training algorithms from scratch, cleaning data, and optimizing mathematical performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic AI&lt;/strong&gt;: AI that doesn't just talk but can act. It can break a big goal into steps, use tools (like searching the web or booking a flight), and complete tasks autonomously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MLOps (Machine Learning Operations)&lt;/strong&gt;: The "factory" side of AI; it’s a set of practices to ensure AI models are updated, monitored, and running reliably in the real world.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the Roles Work Together
&lt;/h2&gt;

&lt;p&gt;In a real-world project (like building a customer support agent), the roles collaborate in a "pipeline": &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ML Engineer&lt;/strong&gt;: Designs and trains the "brain." They might build a custom embedding model from scratch so the company’s specific technical jargon is understood perfectly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Engineer&lt;/strong&gt;: Connects the brain to the world. They take a foundational model (like GPT-4), set up RAG so it can read private manuals, and use prompt engineering to ensure it stays polite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MLOps Engineer&lt;/strong&gt;: Builds the "factory." they ensure that if 10,000 customers use the app at once, the servers don't crash, and they monitor the model to make sure it doesn't start giving wrong answers over time. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Essential AI Engineering Tools
&lt;/h2&gt;

&lt;p&gt;AI Engineers today rely on a specific stack to move fast without building everything from scratch: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration (Linking things together)&lt;/strong&gt;: LangChain and LlamaIndex are the "glue" used to build complex workflows and Agentic AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector Databases (For RAG)&lt;/strong&gt;: Pinecone, Weaviate, and Chroma store the embeddings that allow an AI to "search" through your documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Builders &amp;amp; UI&lt;/strong&gt;: Streamlit and Gradio are used to quickly create chat interfaces or dashboards for the AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation &amp;amp; Observability&lt;/strong&gt;: LangSmith and Arize Phoenix help engineers "see" into the AI's thoughts to debug why it might be hallucinating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Development&lt;/strong&gt;: Ollama and LM Studio allow engineers to run powerful LLMs directly on their own laptops for private testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Catching up on the tools and models in the industry
&lt;/h2&gt;

&lt;p&gt;To help you catch up on the rapid evolution of AI, here is a breakdown of the leading tools and models currently dominating the industry.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Foundational Models&lt;/strong&gt;:
These are general-purpose engines used as the basis for other applications. 

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text &amp;amp; General Reasoning&lt;/strong&gt;: OpenAI's GPT-4o, Anthropic’s Claude 3.5 Sonnet, Google’s Gemini 1.5 Pro, and Meta’s Llama 3 are examples of text and general reasoning models. Llama 3 is a leader in open-source models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Generation&lt;/strong&gt;: Stable Diffusion and Midjourney are examples of image generation models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video Generation&lt;/strong&gt;: Synthesia (for talking heads) and Google Veo (for cinematic clips) are used for video generation. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Applications &amp;amp; Assistants&lt;/strong&gt;:
These are ready-to-use products designed to improve productivity. 

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coding Assistants&lt;/strong&gt;: GitHub Copilot is a standard tool for real-time coding assistance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meeting Automation&lt;/strong&gt;: Fireflies.ai records, transcribes, and summarizes meetings automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search &amp;amp; Research&lt;/strong&gt;: Perplexity AI is a conversational search engine that cites sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Assistants&lt;/strong&gt;: Lindy can execute multi-step business workflows across different apps. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG Tools&lt;/strong&gt;:
These tools help AI interact with private data. 

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frameworks&lt;/strong&gt;: LlamaIndex specializes in indexing and retrieving data. LangChain is popular for building application logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector Databases&lt;/strong&gt;: Pinecone (managed cloud), Weaviate (open-source), and Chroma store the "mathematical meaning" of documents for search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation&lt;/strong&gt;: LangSmith and Arize Phoenix help with debugging AI responses. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic AI&lt;/strong&gt;:
These frameworks enable AI to perform autonomous tasks. 

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Agent Teams&lt;/strong&gt;: CrewAI and Microsoft’s AutoGen allow the creation of AI agent teams with specific roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Workflows&lt;/strong&gt;: LangGraph provides control over how an agent performs a task, including human-approval steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous Coding&lt;/strong&gt;: Goose and Claude Code can edit files and run tests. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other Important Engineering Tools&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local AI Runners&lt;/strong&gt;: Ollama is a tool for running open-source models like Llama 3 on a personal computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Optimization&lt;/strong&gt;: DSPy optimizes prompts automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Sandboxing AI agents for security</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Fri, 23 Jan 2026 07:43:53 +0000</pubDate>
      <link>https://forem.com/mariamreba/sandboxing-ai-agents-for-security-2egh</link>
      <guid>https://forem.com/mariamreba/sandboxing-ai-agents-for-security-2egh</guid>
      <description>&lt;p&gt;Allowing an AI agent "write access" to your local machine is like giving your car keys to a stranger. 👇Sharing here some sandboxing options for developers to isolate AI agents from exposing sensitive data on your system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;VS Code Dev Containers - &lt;a href="https://lnkd.in/e-hs3E_m" rel="noopener noreferrer"&gt;https://lnkd.in/e-hs3E_m&lt;/a&gt;&lt;br&gt;
A ready-to-use sandbox for local development that works with Docker or in GitHub Codespaces.&lt;br&gt;
Prerequisites: Docker Desktop or Docker Engine, Visual Studio Code with the "Dev Containers" extension (ms-vscode-remote.remote-containers), or use GitHub Codespaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Daytona.io - &lt;a href="https://www.daytona.io/" rel="noopener noreferrer"&gt;https://www.daytona.io/&lt;/a&gt;&lt;br&gt;
open-source, elastic infrastructure for running AI-generated code, providing isolated sandbox environments that you can manage using the Daytona SDK to run and control code execution.&lt;br&gt;
The Daytona SDK supports Python and TypeScript interfaces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;E2B (Firecracker MicroVMs) - &lt;a href="https://lnkd.in/e-vCVQUr" rel="noopener noreferrer"&gt;https://lnkd.in/e-vCVQUr&lt;/a&gt;&lt;br&gt;
Ideal for advanced agent workflows where the AI installs third-party libraries or analyzes untrusted files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code sandbox - &lt;a href="https://codesandbox.io/" rel="noopener noreferrer"&gt;https://codesandbox.io/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker sandbox - &lt;a href="https://lnkd.in/eRdc_h9c" rel="noopener noreferrer"&gt;https://lnkd.in/eRdc_h9c&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Together code sandbox - &lt;a href="https://lnkd.in/eyFiFvvq" rel="noopener noreferrer"&gt;https://lnkd.in/eyFiFvvq&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Anthropic Sandbox runtime (srt) - &lt;a href="https://lnkd.in/e4X8W2vs" rel="noopener noreferrer"&gt;https://lnkd.in/e4X8W2vs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What sandboxing options did you find for coding?&lt;/p&gt;

&lt;p&gt;Note: Always review them before using.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>containers</category>
    </item>
    <item>
      <title>What will the future look like with AI?</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Thu, 22 Jan 2026 08:03:14 +0000</pubDate>
      <link>https://forem.com/mariamreba/what-will-the-future-look-like-with-ai-16ne</link>
      <guid>https://forem.com/mariamreba/what-will-the-future-look-like-with-ai-16ne</guid>
      <description>&lt;p&gt;With the current rate of technological advancement, especially in Artificial Intelligence, I can’t help but imagine what the future world will be like for upcoming generations.&lt;/p&gt;

&lt;p&gt;In my creative imagination, these are some events I predict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teaching programming languages will become rare. Few, if any, new programming languages will be created, as the need for them will decrease. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open source contributions and sponsorships will decrease significantly, and the APIs and libraries in use may start to charge for each request to sustain the projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After years of AI-generated code, written by people with little real programming experience and no use of Stack Overflow or Reddit for solving edge cases, language models may begin communicating directly with systems in assembly language. There will be no need for intermediate programming languages or frameworks if AI can instruct the computer system directly, and no experienced programmer will be there to thoroughly review the output for mistakes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There will be a future where AI systems are no longer supervised. They will be blindly trusted and valued more than human opinions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI will become so advanced across all fields that people will struggle to compete technically and skill-wise. As a result, there may be an option to implant personalized AI systems into human brains so individuals can contribute and control things using only their thoughts, expressing not just their own ideas, but also what the AI suggests, in both writing and speech.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running data servers and managing IT infrastructure will be in high demand to keep these systems running and “alive.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As many people lose their jobs, the economic situation will become challenging. Unable to afford luxury items, people will turn to greater self-sustainability in food, shelter, and small-scale animal farming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manual hand skills like electric wiring, plumbing, and masonry work will be in high demand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Children’s curricula will change, and they will be taught the foundations of AI from a very early age. The schools may include virtual classes taught by AI teaching agents, with a curriculum customised for each student based on their aptitude. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are some of the things I imagined would happen.&lt;/p&gt;

&lt;p&gt;What do you think will happen?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>futurechallenge</category>
    </item>
    <item>
      <title>New era of software engineering</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Tue, 20 Jan 2026 10:36:12 +0000</pubDate>
      <link>https://forem.com/mariamreba/end-of-the-era-of-writing-code-as-we-know-it-f2l</link>
      <guid>https://forem.com/mariamreba/end-of-the-era-of-writing-code-as-we-know-it-f2l</guid>
      <description>&lt;p&gt;Software engineers, including me are now slowly coming in terms of the fact that the era of writing code as we know it is ending, that doesn’t mean you are replaceable. This is the best time to increase your humics i.e your human skills, critical thinking, your unique creativity, orchestration, architectural and system design skills. &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.amazonaws.com%2Fuploads%2Farticles%2Fc1awquj0ko0xz0v8og20.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.amazonaws.com%2Fuploads%2Farticles%2Fc1awquj0ko0xz0v8og20.png" alt="linked in screenshot" width="800" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine you were a factory worker doing all the manual work, and suddenly you are promoted to manager or supervisor of an entire unit. You now have to perceive it from a different angle, acquire different skills for that job, but your previous job skills will still be relevant in order for you to oversee the process or give a solution when a problem arises. &lt;/p&gt;

&lt;p&gt;This is what is now happening to software engineers with the AI shift, you have now been taken many levels up, you have more power with AI. You can oversee coding agents do their job while you review their output. We can fix problems when they occur because of our previous experience. We are at such an advantage over a complete beginner. We can scale, we can steer it, and create super-powerful systems from our imagination and mastery.&lt;/p&gt;

&lt;p&gt;I remember this story: A large factory’s vital engine fails, and none of the current staff can fix it. They call in an expert with 40 years of experience. The expert inspects the engine briefly, reaches into his bag, and pulls out a small hammer. He gently taps a specific part of the engine, and it immediately roars back to life. A week later, the factory owner receives a bill for $10,000. Outraged at the high cost for such a simple act, the owner demands an itemized invoice. The expert responds with the following breakdown:&lt;br&gt;
Tapping with a hammer: $2.00&lt;br&gt;
Knowing where to tap: $9,998.00&lt;/p&gt;

&lt;p&gt;The lesson of the story is the value of expertise and experience. It shows that you don’t pay a professional for the few minutes they spend doing a task, but for the years of study and practice that enable them to do it so efficiently. This principle applies to software engineers; AI is a tool in your expert hands, and you can choose when, what, and how to use it. That makes you valuable. Enhance that value. Don’t chase every new fancy tool out there; that’s an endless race and impossible task. As technology evolves so rapidly, you’ll be chasing shadows. Instead, focus on improving your ability to adapt and change with whatever tools come your way, build your fundamentals, master techniques, and think about the bigger picture. &lt;/p&gt;

&lt;p&gt;This LinkedIn course by &lt;a href="https://irreplaceable.ai" rel="noopener noreferrer"&gt;Pascal Bornet&lt;/a&gt; sums it up on how to be irreplaceable &lt;a href="https://lnkd.in/eDPknKbN" rel="noopener noreferrer"&gt;https://lnkd.in/eDPknKbN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some of the key notes from the course that stood out&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set Concrete Goals&lt;/strong&gt;: Implement three AI tools that will save you five hours weekly. Prioritize efficiency over effort to create more value with less volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identify Automation Candidates&lt;/strong&gt;: Use the 20% rule to find tasks that consume 80% of your time but deliver minimal value. Research AI tools to automate these repetitive tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Digital Life&lt;/strong&gt;: Turn off non-essential notifications and schedule specific times for checking email and social media to minimize distractions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop Humics&lt;/strong&gt;: Dedicate 30 minutes daily to developing uniquely human abilities such as genuine creativity, critical thinking, or social authenticity. Set specific daily exercises like creative writing or practicing active listening.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build AI Literacy&lt;/strong&gt;: Allocate 15% of your workday to learning about AI. Listen to AI podcasts, subscribe to AI newsletters, and experiment with one new AI tool weekly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-Value Activities&lt;/strong&gt;: Identify the 20% of activities that generate 80% of your impact and explore how AI can elevate these activities. Test an AI tool on one task and measure the improvement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Digital Footprint&lt;/strong&gt;: Review and update your digital accounts' privacy settings and create a schedule to regularly clean your digital footprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extend Practices to Teams and Family&lt;/strong&gt;: Implement irreplaceable practices within your teams and family. Create technology-free zones at home and teach children to use AI as a learning tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Engagement&lt;/strong&gt;: Join or create a community to share irreplaceable practices. Schedule learning sessions with colleagues to exchange AI discoveries and human skill development techniques.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Change can be difficult, but it can bring out a whole new, enriched version of you.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Stepping into agentic coding</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Tue, 20 Jan 2026 09:56:24 +0000</pubDate>
      <link>https://forem.com/mariamreba/stepping-into-agentic-coding-58ip</link>
      <guid>https://forem.com/mariamreba/stepping-into-agentic-coding-58ip</guid>
      <description>&lt;p&gt;So far, I have mainly used GitHub Copilot for inline edits and PR reviews, letting my brain do most of the thinking, but I decided to dip my toes into giving full control to an AI agent. I redesigned (through code refactor) my colorful and cheeky portfolio website to a modern one using Copilot agent, and was very impressed with the results. &lt;a href="https://mariamreba.com/" rel="noopener noreferrer"&gt;https://mariamreba.com/&lt;/a&gt;. Let me know which design appeals to you more 🙂&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F5e3pyk8i590sq5vc7btb.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.amazonaws.com%2Fuploads%2Farticles%2F5e3pyk8i590sq5vc7btb.png" alt="My old website design" width="800" height="601"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F3cljfwmbcnumb2fdyxw9.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.amazonaws.com%2Fuploads%2Farticles%2F3cljfwmbcnumb2fdyxw9.png" alt="AI generated website design" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Claude Haiku 4.5, the agent closely followed the framework's syntax and my coding style, ensuring my core component structure and code design remained intact. It only made a few minor syntax errors, such as poorly closed tags, which I could easily fix. I should admit that generated code gave better results with full context of the code rather than inline edits or PR edits for review comments. &lt;/p&gt;

&lt;p&gt;As a guardrail, I limited the agent's ability to execute terminal commands and instructed it to check for security vulnerabilities in the codebase, which it detected and fixed a couple of them, which was nice. What I specially liked is that it gave a neatly structured documentation of what it did for every iteration. &lt;/p&gt;

&lt;p&gt;Next time, I would look into using a sandboxed environment for local development to provide extra safety and prevent an agent from running code directly on my local machine.&lt;/p&gt;

&lt;p&gt;For Non-Technical Users, I would recommend &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never grant an agent "Auto-Merge" rights to your production system, always require manual review and approval before deploying changes&lt;/li&gt;
&lt;li&gt;Be cautious with the information you share in prompts. Avoid sharing customer lists, passwords, or private API keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the AI coding pandora's box is now unleashed across the dev world, I plan to study agent security more in depth and share my learnings on the way.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>What action should one take to prevent and mitigate the recent npm supply chain attack</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Sun, 21 Sep 2025 12:25:06 +0000</pubDate>
      <link>https://forem.com/mariamreba/what-action-should-one-take-to-prevent-and-mitigate-the-recent-npm-supply-chain-attack-3hka</link>
      <guid>https://forem.com/mariamreba/what-action-should-one-take-to-prevent-and-mitigate-the-recent-npm-supply-chain-attack-3hka</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dev.to/mariamreba/your-response-to-the-shai-hulud-supply-chain-attack-4n5j" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpl36yyeudf6jcpzeqwf6.png" height="350" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dev.to/mariamreba/your-response-to-the-shai-hulud-supply-chain-attack-4n5j" rel="noopener noreferrer" class="c-link"&gt;
            Your response to the Shai-Hulud supply chain attack - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            I am sure you have heard about the recent supply chain attack on npm packages. Many news outlets and...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="300" height="299"&gt;
          dev.to
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>shaihulud</category>
      <category>cybersecurity</category>
      <category>npm</category>
      <category>supplychainattack</category>
    </item>
    <item>
      <title>Your response to the Shai-Hulud supply chain attack</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Sun, 21 Sep 2025 12:24:06 +0000</pubDate>
      <link>https://forem.com/mariamreba/your-response-to-the-shai-hulud-supply-chain-attack-4n5j</link>
      <guid>https://forem.com/mariamreba/your-response-to-the-shai-hulud-supply-chain-attack-4n5j</guid>
      <description>&lt;p&gt;I am sure you have heard about the recent supply chain attack on npm packages. Many news outlets and blogs are explaining the attack and the immediate and intermediate actions you can take to mitigate and prevent falling victim to this attack. If you are already affected, there are some recommendations you should follow.&lt;/p&gt;

&lt;p&gt;For those who don’t know about this attack, the malicious packages contain a worm that activates after npm installation, scanning the environment for sensitive credentials such as .npmrc files, environment variables, and config files targeting GitHub PATs and cloud API keys (AWS, GCP, Azure). These credentials are exfiltrated to an attacker-controlled endpoint. The malware creates a public GitHub repository named "Shai-Hulud" under the victim's account to host stolen secrets. It also uses the compromised npm token to access the npm registry, infect other packages maintained by the developer, and publish malicious updates, enabling rapid, autonomous spread.&lt;/p&gt;

&lt;p&gt;The basic steps to prevent this include following cautious procedures before npm installation, such as verifying all dependencies in your package and package-lock files, whether in your local development environment or your CI/CD pipelines, and enforcing MFA on your GitHub and npm accounts. If compromised, check your GitHub repositories for the presence of the Shai-Hulud repository and exposed public tokens.&lt;/p&gt;

&lt;h1&gt;
  
  
  Npm safe check
&lt;/h1&gt;

&lt;p&gt;While there are general recommendations, if you are affected by the malware, you may need some detailed steps and guidance. During my internet search, I found several good detailed guidelines like the blog from &lt;a href="https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages" rel="noopener noreferrer"&gt;Socket&lt;/a&gt; and &lt;a href="https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised#immediate-actions-required" rel="noopener noreferrer"&gt;StepSecurity&lt;/a&gt; and tried to consolidate all those points. I also looked for a database of all the identified vulnerabilities and didn’t find a ready-to-use format, so I created a &lt;a href="https://gist.githubusercontent.com/M-S/7cbfd290c446e228b0c0f1f301fe678b/raw/85a1a25aae2ce228eefd0b0fc85c62bc6b07a1a3/npmMalwareChecklist.json" rel="noopener noreferrer"&gt;json file here&lt;/a&gt;. Additionally, I developed a ready-to-use script in a repository that you can run locally or in your CI/CD pipelines to check the installed packages against the list of vulnerable ones. It can also be run before the next install to verify whether the packages you're about to install are safe. While the list may grow in the future, npm installations should be performed with caution. For example, follow &lt;code&gt;npm ci&lt;/code&gt; with the &lt;code&gt;--ignore-scripts&lt;/code&gt; flag to prevent any post-installation script execution from unknown vulnerable packages. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/M-S/npmSafeCheck" rel="noopener noreferrer"&gt;npmSafeCheck repository&lt;/a&gt; provides a script to check for known malicious npm packages (eg: related to the &lt;strong&gt;Shai-Hulud&lt;/strong&gt; supply chain attack) before installing or upgrading dependencies. It also detects if any compromised packages are already installed in your project. It helps mitigate the risk of supply chain attacks by verifying package versions against a list of compromised packages identified as of 20th Sept 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Clone this repository or download the &lt;code&gt;npmSafeCheck.sh&lt;/code&gt; script and &lt;code&gt;npmMalwareChecklist.json&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Place the script and JSON file in your project root directory.&lt;/li&gt;
&lt;li&gt;Run the script BEFORE executing &lt;code&gt;npm install&lt;/code&gt; or &lt;code&gt;npm update&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   sh npmSafeCheck.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or you can run it as a npm script by adding the following to your &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"safe-check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sh npmSafeCheck.sh"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If the script detects any known malicious packages, it will flag and provide guidance on mitigation steps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can also refer to a database of known compromised packages instead of the local JSON file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An example of how to integrate this script into a CI/CD pipeline is provided in the &lt;code&gt;.github/workflows/ci.yml&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Immediate actions guidance
&lt;/h1&gt;

&lt;p&gt;If you have already installed or upgraded packages and suspect that your project may be affected by the Shai-Hulud attack, take the following immediate actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete &lt;code&gt;node_modules&lt;/code&gt; and lockfiles having malicious versions
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; node_modules package-lock.json yarn.lock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Clean npm cache
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm cache clean &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;do a dry-run to check what packages will be installed , this will not run any install scripts but will show what packages will be installed
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;reinstall safe packages only using npm install with &lt;code&gt;--ignore-scripts&lt;/code&gt; flag
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt; &amp;lt;safe-package&amp;gt;@&amp;lt;safe-version&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Avoid commands like &lt;code&gt;npm audit fix&lt;/code&gt;and &lt;code&gt;npm upgrade&lt;/code&gt; as they also install packages under the hood&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pin to known-good versions using package-lock.json&lt;br&gt;
and use &lt;code&gt;npm ci&lt;/code&gt; for future installs&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search for repos or worklows or branches with name &lt;strong&gt;Shai-Hulud&lt;/strong&gt; in your public GitHub repositories and &lt;a href="https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised#github-search-queries-for-detection" rel="noopener noreferrer"&gt;indicators of compromise&lt;/a&gt;, like bundle.js hash, suspicious network calls, function calls or process executions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clean infected repositories('shai-hulud' branches and workflows). Referenced from: &lt;a href="https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised#immediate-actions-required" rel="noopener noreferrer"&gt;https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised#immediate-actions-required&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check for and remove the backdoor workflow&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; .github/workflows/shai-hulud-workflow.yml

&lt;span class="c"&gt;# Look for suspicious 'shai-hulud' branches in all repositories&lt;/span&gt;
git ls-remote &lt;span class="nt"&gt;--heads&lt;/span&gt; origin | &lt;span class="nb"&gt;grep &lt;/span&gt;shai-hulud

&lt;span class="c"&gt;# Delete any malicious branches found&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--delete&lt;/span&gt; shai-hulud

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Audit environments (CI/CD agents, developer laptops) that installed the affected versions for unauthorized publishes or credential theft.&lt;/li&gt;
&lt;li&gt;Rotate npm tokens and other exposed secrets if these packages were present on machines with publishing credentials.&lt;/li&gt;
&lt;li&gt;Turn on multifactor authentication on GitHub and npm.&lt;/li&gt;
&lt;li&gt;Audit Cloud Infrastructure for Compromise&lt;/li&gt;
&lt;li&gt;Monitor network logs for active exploitation.&lt;/li&gt;
&lt;li&gt;Monitor logs for unusual npm publish or package modification events.&lt;/li&gt;
&lt;li&gt;Verify Package provenance &lt;a href="https://docs.npmjs.com/viewing-package-provenance" rel="noopener noreferrer"&gt;https://docs.npmjs.com/viewing-package-provenance&lt;/a&gt;, &lt;a href="https://github.blog/security/supply-chain-security/introducing-npm-package-provenance/" rel="noopener noreferrer"&gt;https://github.blog/security/supply-chain-security/introducing-npm-package-provenance/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Further guidance's and references: &lt;a href="https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised#immediate-actions-required" rel="noopener noreferrer"&gt;https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised#immediate-actions-required&lt;/a&gt;&lt;br&gt;
&lt;a href="https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages" rel="noopener noreferrer"&gt;https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.aikido.dev/blog/s1ngularity-nx-attackers-strike-again" rel="noopener noreferrer"&gt;https://www.aikido.dev/blog/s1ngularity-nx-attackers-strike-again&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other preventive solutions I found are &lt;a href="https://www.npmjs.com/package/@aikidosec/safe-chain" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@aikidosec/safe-chain&lt;/a&gt; and &lt;a href="https://github.com/danielroe/provenance-action" rel="noopener noreferrer"&gt;https://github.com/danielroe/provenance-action&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am curious to know what more the developer community is doing to mitigate and prevent this, and how they are doing it.&lt;/p&gt;

</description>
      <category>shaihulud</category>
      <category>cybersecurity</category>
      <category>npm</category>
      <category>supplychainattack</category>
    </item>
    <item>
      <title>Linux: Search, Filter and Output</title>
      <dc:creator>Mariam Reba Alexander</dc:creator>
      <pubDate>Mon, 28 Apr 2025 18:43:59 +0000</pubDate>
      <link>https://forem.com/mariamreba/linux-search-filter-and-output-305d</link>
      <guid>https://forem.com/mariamreba/linux-search-filter-and-output-305d</guid>
      <description>&lt;p&gt;On some occasions, one may need to filter through the contents of large files. For this, Linux has several commands to read the files and filter their contents simultaneously. Let's go through some examples. &lt;/p&gt;

&lt;h2&gt;
  
  
  Reading through a file in the command line
&lt;/h2&gt;

&lt;p&gt;When reading through a file using the &lt;code&gt;cat&lt;/code&gt; command, you usually see the last line of the file displayed before the next command prompt, requiring you to scroll backward to view the previous content.&lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;more&lt;/code&gt; and &lt;code&gt;less&lt;/code&gt; commands, the content fits on the screen, and you can scroll down to see the rest of it. &lt;/p&gt;

&lt;p&gt;Try the following to see the difference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat /etc/passwd
cat /etc/passwd | more
cat /etc/passwd | less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes you may only want to read the beginning or end of a large file. For that, you can use the &lt;code&gt;head&lt;/code&gt; or &lt;code&gt;tail&lt;/code&gt; command, which will display the first 10 lines and the last 10 lines, respectively. Of course, you can specify a different number of lines with their options.&lt;/p&gt;

&lt;p&gt;Use the &lt;code&gt;man&lt;/code&gt; command to see the rest of the options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Searching and filtering contents in a file
&lt;/h2&gt;

&lt;p&gt;Using the &lt;code&gt;grep&lt;/code&gt; command, one can search for matching strings or patterns in the contents of a file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# displays matching lines containing the string "bin" in the file
cat /etc/passwd | grep "bin"
# displays matching lines that don't contain the string "false"
cat /etc/passwd | grep -v "false"
# Show all lines that match the regex pattern
cat /etc/ssh/sshd_config | grep -E "^[^#]"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Outputting the results of a file
&lt;/h2&gt;

&lt;p&gt;Linux manages input and output operations using references or identifiers called file descriptors. The file descriptors for the input data stream are 0, for output, 1, and for error, 2.&lt;/p&gt;

&lt;p&gt;Suppose you want to store the output in a file. (By default, the standard output (STDOUT - FD1) is redirected to the file, even if you don't specify the file descriptor 1.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find /etc/ -name *.conf 1&amp;gt;results.txt
find /etc/ -name *.conf &amp;gt; results.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file will be created if it doesn't exist.&lt;/p&gt;

&lt;p&gt;Suppose you want to discard all the errors into a null device before storing or displaying the results.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find /etc/ -name shadow 2&amp;gt;/dev/null &amp;gt; results.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here you specify the file descriptor 2 for the standard error (STDERR  - FD2)&lt;/p&gt;

&lt;p&gt;You can also log the error to a file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find /etc/ -name shadow 2&amp;gt; stderr.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to append to the already existing file, use &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; instead of &lt;code&gt;&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find /etc/ -name shadow 2&amp;gt;&amp;gt; stderr.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>linux</category>
      <category>htb</category>
    </item>
  </channel>
</rss>
