<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Raji Sherifdeen ayinla</title>
    <description>The latest articles on DEV Community by Raji Sherifdeen ayinla (@raji_sherifdeenayinla_a3).</description>
    <link>https://dev.to/raji_sherifdeenayinla_a3</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%2F1561185%2F100acfb0-22d9-40a0-a514-a7e114291f06.jpg</url>
      <title>DEV Community: Raji Sherifdeen ayinla</title>
      <link>https://dev.to/raji_sherifdeenayinla_a3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raji_sherifdeenayinla_a3"/>
    <language>en</language>
    <item>
      <title>The Day "Standard Security" Wasn't Enough: A Deep Dive into HTTP Headers</title>
      <dc:creator>Raji Sherifdeen ayinla</dc:creator>
      <pubDate>Wed, 31 Dec 2025 14:16:44 +0000</pubDate>
      <link>https://dev.to/raji_sherifdeenayinla_a3/the-day-standard-security-wasnt-enough-a-deep-dive-into-http-headers-16ic</link>
      <guid>https://dev.to/raji_sherifdeenayinla_a3/the-day-standard-security-wasnt-enough-a-deep-dive-into-http-headers-16ic</guid>
      <description>&lt;p&gt;While I was working on a recent repository, I found that the code had a massive setup for &lt;code&gt;helmet.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Before I was onboarded on this project, I used to just call &lt;code&gt;app.use(helmet())&lt;/code&gt; and call it a day. I treated it like a "black box"—a magic spell that made my app secure. But this project used a deep configuration object that I didn't understand.&lt;/p&gt;

&lt;p&gt;My curiosity got the best of me. I realized that by using the default settings, I was only scratching the surface of web security. After hours of research and testing, I’ve broken down the advanced headers you &lt;em&gt;actually&lt;/em&gt; need to know.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The "Traffic Controller": Content Security Policy (CSP)
&lt;/h2&gt;

&lt;p&gt;The default Helmet CSP is a good start, but it often breaks modern front-ends (like those using inline styles or Google Fonts).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Concept:&lt;/strong&gt; CSP tells the browser exactly which sources of content (scripts, CSS, images) are trusted. If a hacker tries to inject a script from &lt;code&gt;malicious-site.com&lt;/code&gt;, the browser will simply refuse to run it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example:&lt;/strong&gt;&lt;br&gt;
If your app uses Google Fonts and a specific API, a "standard" setup won't cut it. You need a granular policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contentSecurityPolicy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;directives&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default-src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'self'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;script-src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'self'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;trusted-scripts.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;style-src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'self'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fonts.googleapis.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;img-src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'self'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;images.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;connect-src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'self'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;upgrade-insecure-requests&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. The "Strict Parent": HSTS (Strict Transport Security)
&lt;/h2&gt;

&lt;p&gt;You might think redirecting HTTP to HTTPS is enough. It’s not. There is a small window called a &lt;strong&gt;Man-in-the-Middle (MitM) attack&lt;/strong&gt; where a hacker can intercept the request before the redirect happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Concept:&lt;/strong&gt; HSTS tells the browser: "Don't even &lt;em&gt;try&lt;/em&gt; to use HTTP for the next year. Only talk to me via HTTPS."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hsts&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;maxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;31536000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 1 year in seconds&lt;/span&gt;
    &lt;span class="na"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Apply to all subdomains&lt;/span&gt;
    &lt;span class="na"&gt;preload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Request to be included in browser HSTS preload lists&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. The "Privacy Guard": Referrer-Policy
&lt;/h2&gt;

&lt;p&gt;When a user clicks a link on your site that leads to another website, your URL is often sent in the "Referer" header. If your URL contains sensitive data (like &lt;code&gt;/reset-password?token=123&lt;/code&gt;), that external site now has your token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Concept:&lt;/strong&gt; This header controls how much information is shared when a user leaves your site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Only sends the origin (domain) rather than the full URL when moving to another site&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;referrerPolicy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;strict-origin-when-cross-origin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. The "Feature Lockdown": Permissions-Policy
&lt;/h2&gt;

&lt;p&gt;This is one of the newer, more powerful headers. It’s formerly known as &lt;code&gt;Feature-Policy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Concept:&lt;/strong&gt; It allows you to disable browser features that your site doesn't need. If your site doesn't use the camera or microphone, why leave them accessible? If a malicious script ever runs on your site, this header ensures it can't turn on the user's webcam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Note: In newer versions of Helmet, this is often set manually&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Permissions-Policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;camera=(), microphone=(), geolocation=()&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. The "Anti-Sniffer": X-Content-Type-Options
&lt;/h2&gt;

&lt;p&gt;Browsers try to be "smart" by guessing the file type (MIME type) of a file. If a user uploads a text file containing JavaScript code, a browser might try to execute it as a script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Concept:&lt;/strong&gt; Setting this to &lt;code&gt;nosniff&lt;/code&gt; forces the browser to stick to the &lt;code&gt;Content-Type&lt;/code&gt; sent by the server. If the server says it's an image, the browser treats it as an image—period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is included in default helmet(), but vital to understand&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;noSniff&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary Table: What does what?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Real-world Analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controls where scripts/styles come from&lt;/td&gt;
&lt;td&gt;A guest list for a private party&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HSTS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Forces HTTPS&lt;/td&gt;
&lt;td&gt;Only opening the door for armored trucks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Referrer-Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hides your URL from other sites&lt;/td&gt;
&lt;td&gt;Using a shredder on sensitive documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permissions-Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Disables hardware (Camera/Mic)&lt;/td&gt;
&lt;td&gt;Disabling the mic on a laptop you don't use&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Switching from &lt;code&gt;app.use(helmet())&lt;/code&gt; to a custom configuration was a turning point in my career. It moved me from "coding things that work" to "engineering things that are secure."&lt;/p&gt;

&lt;p&gt;The next time you start a project, don't just copy-paste your security middleware. Take 10 minutes to define exactly what your app needs. Your users will thank you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you handle security headers in your apps? Do you use a library or set them manually? Let's chat in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>security</category>
      <category>javascript</category>
    </item>
    <item>
      <title>CI/CD Explained for Beginners (Using GitHub Actions Terms)</title>
      <dc:creator>Raji Sherifdeen ayinla</dc:creator>
      <pubDate>Tue, 30 Dec 2025 00:33:28 +0000</pubDate>
      <link>https://dev.to/raji_sherifdeenayinla_a3/cicd-explained-for-beginners-using-github-actions-terms-2dn0</link>
      <guid>https://dev.to/raji_sherifdeenayinla_a3/cicd-explained-for-beginners-using-github-actions-terms-2dn0</guid>
      <description>&lt;p&gt;When you’re new to development, CI/CD can sound like one of those “senior developer things” — important, but abstract and intimidating.&lt;/p&gt;

&lt;p&gt;In reality, CI/CD is just about &lt;strong&gt;automating the boring but critical parts of shipping code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s explain it through a simple story, using GitHub Actions concepts you may have already seen:&lt;br&gt;
&lt;strong&gt;workflow, event, jobs, steps, runner, and artifacts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No buzzwords. No magic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem CI/CD Solves
&lt;/h2&gt;

&lt;p&gt;Imagine this workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You write code&lt;/li&gt;
&lt;li&gt;You test it manually&lt;/li&gt;
&lt;li&gt;You build it manually&lt;/li&gt;
&lt;li&gt;You deploy it manually&lt;/li&gt;
&lt;li&gt;Something breaks anyway&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This process is slow, repetitive, and stressful — especially as a project grows or more people join.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD exists to automate this process.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CI (Continuous Integration)&lt;/strong&gt; checks your code automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CD (Continuous Delivery / Deployment)&lt;/strong&gt; prepares or ships it automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub Actions is one tool that helps you do this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Think of CI/CD as a Robot Assistant
&lt;/h2&gt;

&lt;p&gt;CI/CD is like a robot that watches your repository and says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Whenever something important happens, I’ll take care of the routine work.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That robot is controlled by something called a &lt;strong&gt;workflow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Workflow: The Plan
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;workflow&lt;/strong&gt; is a set of instructions written in a YAML file.&lt;/p&gt;

&lt;p&gt;It answers two questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;When should automation run?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What should it do?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“When code is pushed, run tests and build the app.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The workflow just sits there until something wakes it up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Event: What Triggers Everything
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;event&lt;/strong&gt; is what starts the workflow.&lt;/p&gt;

&lt;p&gt;Common events include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pushing code&lt;/li&gt;
&lt;li&gt;Opening a pull request&lt;/li&gt;
&lt;li&gt;Running on a schedule&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Story-wise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You push code → an &lt;strong&gt;event&lt;/strong&gt; happens → the workflow starts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No event, no automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Jobs: The Big Tasks
&lt;/h2&gt;

&lt;p&gt;Once the workflow starts, it creates one or more &lt;strong&gt;jobs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each job represents a big task, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running tests&lt;/li&gt;
&lt;li&gt;Building the application&lt;/li&gt;
&lt;li&gt;Deploying the app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jobs can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run in parallel&lt;/li&gt;
&lt;li&gt;Depend on other jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example logic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Only build the app if the tests pass.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Runner: The Machine Doing the Work
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;runner&lt;/strong&gt; is the machine that executes a job.&lt;/p&gt;

&lt;p&gt;It’s just a computer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux, Windows, or macOS&lt;/li&gt;
&lt;li&gt;Hosted by GitHub or by you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jobs don’t do work themselves.&lt;br&gt;
They ask a &lt;strong&gt;runner&lt;/strong&gt; to do it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Steps: The Small Instructions
&lt;/h2&gt;

&lt;p&gt;Each job is broken down into &lt;strong&gt;steps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Steps are the smallest units of work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check out the code&lt;/li&gt;
&lt;li&gt;Install dependencies&lt;/li&gt;
&lt;li&gt;Run tests&lt;/li&gt;
&lt;li&gt;Build files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Steps run &lt;strong&gt;one after another&lt;/strong&gt;, in order.&lt;/p&gt;

&lt;p&gt;If a step fails, the job stops — which is exactly what you want.&lt;/p&gt;




&lt;h2&gt;
  
  
  Artifacts: What You Keep After the Job
&lt;/h2&gt;

&lt;p&gt;Some jobs produce useful files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build outputs&lt;/li&gt;
&lt;li&gt;Test reports&lt;/li&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Artifacts&lt;/strong&gt; are files you choose to save after a workflow run. Those are the files you intend to upload to your production server&lt;/p&gt;

&lt;p&gt;They let you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download build results&lt;/li&gt;
&lt;li&gt;Share files between jobs&lt;/li&gt;
&lt;li&gt;Debug failures later&lt;/li&gt;
&lt;/ul&gt;

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

&lt;blockquote&gt;
&lt;p&gt;“We worked hard on this — don’t throw it away.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Full CI/CD Story
&lt;/h2&gt;

&lt;p&gt;Putting it all together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You push code (&lt;strong&gt;event&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;workflow&lt;/strong&gt; starts&lt;/li&gt;
&lt;li&gt;The workflow creates &lt;strong&gt;jobs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Jobs run on a &lt;strong&gt;runner&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Jobs execute &lt;strong&gt;steps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Steps produce &lt;strong&gt;artifacts&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Everything runs automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s CI/CD.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;CI/CD gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster feedback&lt;/li&gt;
&lt;li&gt;Fewer production bugs&lt;/li&gt;
&lt;li&gt;Less manual work&lt;/li&gt;
&lt;li&gt;More confidence when shipping code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Did I forget to run something?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You let the system handle it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;CI/CD isn’t about complexity — it’s about &lt;strong&gt;trusting automation to do the repeatable work better than humans&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you understand workflows, events, jobs, steps, runners, and artifacts, you already understand the foundation of modern CI/CD.&lt;/p&gt;

&lt;p&gt;The rest is just details.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>githubactions</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Building Definition Bot: Thinking Simple, Building Smart</title>
      <dc:creator>Raji Sherifdeen ayinla</dc:creator>
      <pubDate>Wed, 05 Nov 2025 02:23:13 +0000</pubDate>
      <link>https://dev.to/raji_sherifdeenayinla_a3/building-definition-bot-thinking-simple-building-smart-5bdb</link>
      <guid>https://dev.to/raji_sherifdeenayinla_a3/building-definition-bot-thinking-simple-building-smart-5bdb</guid>
      <description>&lt;p&gt;As part of the HNG Internship, The stage 3 task for backend was to build AI agents, So I decided to take on something small but meaningful — a project that would stretch my creativity, logic, and ability to ship something functional in a short time. That’s how Definition Bot was born.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Idea&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea behind Definition Bot is simple:&lt;/p&gt;

&lt;p&gt;Type a word, and the bot instantly gives you its definition.&lt;/p&gt;

&lt;p&gt;No distractions, no complex commands — just quick, helpful definitions.&lt;/p&gt;

&lt;p&gt;I’ve always believed that simplicity is powerful. You don’t have to reinvent the wheel to learn or build something impactful. The goal of this project was to keep things minimal yet purposeful — focusing more on clean logic and easy usability rather than heavy architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tech&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bot is built entirely with TypeScript, ensuring strong typing, better structure, and maintainable code.&lt;/p&gt;

&lt;p&gt;To power the AI side of the bot, I experimented with Mastra AI, which made handling definitions and language understanding smoother. It’s a lightweight integration that adds a layer of intelligence without complicating the setup.&lt;/p&gt;

&lt;p&gt;By combining simple logic with a touch of AI, Definition Bot can respond quickly and accurately to definition requests — all while being open, transparent, and easy to extend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why It Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project wasn’t just about building a bot — it was about learning how to think.&lt;/p&gt;

&lt;p&gt;As developers, we often chase complexity, but during the HNG internship, I’ve realized that thinking simple often leads to better solutions. It’s about focusing on the user’s need and removing unnecessary noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it Out&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can explore the code, contribute, or try it out&lt;br&gt;
&lt;a href="https://github.com/TryYourBestAndLeaveTheRest/definition_bot" rel="noopener noreferrer"&gt;Here&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Definition Bot may be a small project, but it represents a bigger mindset — start small, think clearly, and build with purpose.&lt;/p&gt;

&lt;p&gt;Every big step starts with a simple idea, and for me, this was one of those steps.&lt;br&gt;
Here’s to learning, building, and growing through HNG&lt;/p&gt;

</description>
      <category>agents</category>
      <category>backend</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
