<?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: DevGrid Staffing LLC</title>
    <description>The latest articles on DEV Community by DevGrid Staffing LLC (@devgridstaffing).</description>
    <link>https://dev.to/devgridstaffing</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4190613%2F09d7c45b-f3b3-47d6-8998-ac32dbb08fb3.png</url>
      <title>DEV Community: DevGrid Staffing LLC</title>
      <link>https://dev.to/devgridstaffing</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devgridstaffing"/>
    <language>en</language>
    <item>
      <title>What a CrashLoopBackOff Pod Is Trying to Tell You</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:24:54 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/what-a-crashloopbackoff-pod-is-trying-to-tell-you-11nc</link>
      <guid>https://dev.to/devgridstaffing/what-a-crashloopbackoff-pod-is-trying-to-tell-you-11nc</guid>
      <description>&lt;p&gt;You type &lt;code&gt;kubectl get pods&lt;/code&gt; just before lunch and one line says &lt;code&gt;CrashLoopBackOff&lt;/code&gt;, with a restart count that keeps going up every time you look. The app worked yesterday. Nothing in the word itself tells you why it stopped.&lt;/p&gt;

&lt;p&gt;Fact-checked against the official sources on 30 October 2026.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;pod&lt;/strong&gt; is the smallest thing Kubernetes runs: one or more containers that live together. &lt;strong&gt;CrashLoopBackOff&lt;/strong&gt; means a container in the pod keeps starting, crashing, and being restarted, and Kubernetes is now &lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/" rel="noopener noreferrer"&gt;waiting longer between each restart&lt;/a&gt;. By default the wait goes 10 seconds, 20, 40 and so on, up to 5 minutes. If the container then runs fine for 10 minutes, the timer resets.&lt;/p&gt;

&lt;p&gt;One detail saves confusion: CrashLoopBackOff is a status that &lt;code&gt;kubectl&lt;/code&gt; shows you, not one of the official pod phases. It's a symptom. Two commands get you to the cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the describe output first
&lt;/h2&gt;

&lt;p&gt;Run this, swapping in your own pod name for the made-up &lt;code&gt;tide-tables-api-4k2mp&lt;/code&gt; we'll use throughout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod tide-tables-api-4k2mp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scroll to the container section. The &lt;a href="https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/" rel="noopener noreferrer"&gt;Kubernetes debugging page&lt;/a&gt; shows these fields in its own crashing-container example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; what the container is doing now. In a crash loop this is usually &lt;code&gt;Waiting&lt;/code&gt; with reason &lt;code&gt;CrashLoopBackOff&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Last State:&lt;/strong&gt; what happened the last time it ran. Start here, and look at its &lt;strong&gt;Reason&lt;/strong&gt; and &lt;strong&gt;Exit Code&lt;/strong&gt; (the number a program returns when it stops; 0 means it ended normally, anything else means something went wrong).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restart Count:&lt;/strong&gt; how many times it has been restarted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events:&lt;/strong&gt; at the bottom. These are short notes from Kubernetes, like an image that couldn't be pulled or a health check that failed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Then read the logs from the crash
&lt;/h2&gt;

&lt;p&gt;Plain &lt;code&gt;kubectl logs&lt;/code&gt; shows the container that's running now, which may have just started and printed nothing. To see what the crashed one said before it died, add &lt;code&gt;--previous&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs tide-tables-api-4k2mp &lt;span class="nt"&gt;-c&lt;/span&gt; api &lt;span class="nt"&gt;--previous&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-c api&lt;/code&gt; part names the container (here, one called &lt;code&gt;api&lt;/code&gt;). You can leave it out when the pod has only one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walk through a small example
&lt;/h2&gt;

&lt;p&gt;Here's part of the describe output for that made-up "tide-tables" pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;State:          Waiting
  Reason:       CrashLoopBackOff
Last State:     Terminated
  Reason:       Error
  Exit Code:    1
Restart Count:  6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code 1 with reason &lt;code&gt;Error&lt;/code&gt; says the app itself quit. So you check the logs from the crash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs tide-tables-api-4k2mp &lt;span class="nt"&gt;--previous&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config error: TIDE_DATA_URL is not set
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you know. A recent change dropped an environment variable. Put it back, redeploy, and the restart count stops climbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match what you see to a likely cause
&lt;/h2&gt;

&lt;p&gt;The pod lifecycle page lists the usual suspects. Use what you found to pick one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The app crashes on start:&lt;/strong&gt; the logs show an error or stack trace. Fix the code or its input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config is wrong:&lt;/strong&gt; a missing environment variable or config file, like the example above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource limits:&lt;/strong&gt; it runs out of memory (Last State reason: &lt;code&gt;OOMKilled&lt;/code&gt;) or gets too little CPU to start before its probes give up. The two limits behave differently: going over the memory limit &lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/" rel="noopener noreferrer"&gt;can get the container killed&lt;/a&gt;, while a CPU limit only &lt;a href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" rel="noopener noreferrer"&gt;slows it down (throttling)&lt;/a&gt;. A slow start turns into a restart only when a probe runs out of patience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A health check fails:&lt;/strong&gt; when a startup or liveness probe keeps failing, the kubelet (the node's local Kubernetes agent) kills the container, then starts a fresh one. The Events section will show it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why production teams notice this
&lt;/h2&gt;

&lt;p&gt;Kubernetes is one of the tools in DevGrid Staffing LLC's &lt;a href="https://www.devgridstaffing.com/services" rel="noopener noreferrer"&gt;DevOps and cloud engineering work&lt;/a&gt;, next to our IT staffing. Reading &lt;code&gt;describe&lt;/code&gt; and &lt;code&gt;--previous&lt;/code&gt; calmly, before changing anything, is a habit production teams notice quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Pick any pod in a test cluster that has restarted at least once. Run &lt;code&gt;kubectl describe pod&lt;/code&gt; on it and find the Last State reason and exit code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;From the DevGrid Staffing LLC notebook · &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>One Noisy Alert, Tuned Without Hiding a Real Outage</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Thu, 29 Oct 2026 02:53:07 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/one-noisy-alert-tuned-without-hiding-a-real-outage-1mmj</link>
      <guid>https://dev.to/devgridstaffing/one-noisy-alert-tuned-without-hiding-a-real-outage-1mmj</guid>
      <description>&lt;p&gt;Your phone buzzes at 3:12 AM: "bus-times API down." By the time you open your laptop, it's back up. It happened twice last week too, and each time you went back to sleep. That's the dangerous part: one night it will be real, and you'll assume it isn't.&lt;/p&gt;

&lt;p&gt;Fact-checked against the official sources on 29 October 2026.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;alert&lt;/strong&gt; is a rule that sends a message (a &lt;strong&gt;page&lt;/strong&gt;) to whoever is on call when something looks wrong. A &lt;strong&gt;noisy&lt;/strong&gt; alert fires often for problems that fix themselves. The Prometheus team's advice is short: &lt;a href="https://prometheus.io/docs/practices/alerting/" rel="noopener noreferrer"&gt;avoid pages where there's nothing to do, and allow some slack for small blips&lt;/a&gt;. Here's how to do that for one alert without making it blind to a real outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick the noisiest alert
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Look at your pages from the last two to four weeks.&lt;/li&gt;
&lt;li&gt;Count which alert fired most often with nothing for you to do.&lt;/li&gt;
&lt;li&gt;Take just that one. Tuning everything at once makes it hard to tell which change helped.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Look at how long each blip lasted
&lt;/h2&gt;

&lt;p&gt;For each time it fired, note how long the problem lasted before it cleared by itself. In our made-up example, the bus-times API dropped out for under a minute each time, usually during a nightly restart.&lt;/p&gt;

&lt;p&gt;Then write down the shortest real outage you'd want to be woken for. Say it's anything over 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the rule as it is now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bus-times&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BusTimesApiDown&lt;/span&gt;
        &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;up{job="bus-times-api"} == &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;page&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://prometheus.io/docs/concepts/jobs_instances/" rel="noopener noreferrer"&gt;&lt;code&gt;up&lt;/code&gt;&lt;/a&gt; is a series Prometheus stores for every target it scrapes (collects metrics from): 1 if the target was reachable, 0 if the scrape failed. This rule has no &lt;code&gt;for:&lt;/code&gt; line. Per the &lt;a href="https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/" rel="noopener noreferrer"&gt;Prometheus alerting rules docs&lt;/a&gt;, a rule without &lt;code&gt;for&lt;/code&gt; becomes active on the very first check where the condition is true. One failed scrape is enough to page you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a wait with for:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BusTimesApiDown&lt;/span&gt;
        &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;up{job="bus-times-api"} == &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5m&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;page&lt;/span&gt;
        &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bus-times&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unreachable&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;minutes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;for: 5m&lt;/code&gt;, Prometheus checks that the condition is still true on every evaluation for 5 minutes before it fires. While it waits, the alert is &lt;strong&gt;pending&lt;/strong&gt;, not firing. A 40-second blip goes pending, then clears, and nobody gets woken. A real outage still pages you, 5 minutes in.&lt;/p&gt;

&lt;p&gt;Choose the &lt;code&gt;for&lt;/code&gt; value from your notes: longer than the blips, shorter than the outage you care about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop it flapping if it bounces
&lt;/h2&gt;

&lt;p&gt;Sometimes a service goes down, comes back for a moment, then goes down again. The alert fires, resolves, and fires again. That's called &lt;strong&gt;flapping&lt;/strong&gt;. For this, the docs describe &lt;code&gt;keep_firing_for&lt;/code&gt;. It holds the alert in the firing state for the length you choose, counted from the last moment the condition was true:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;        &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5m&lt;/span&gt;
        &lt;span class="na"&gt;keep_firing_for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You only need this if you actually see flapping. Leave it out otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check you can still catch a real outage
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Find a past real incident for this service and check it lasted longer than your new &lt;code&gt;for&lt;/code&gt; value. If it didn't, your wait is too long.&lt;/li&gt;
&lt;li&gt;If your team uses it, Prometheus has &lt;a href="https://prometheus.io/docs/prometheus/latest/configuration/unit_testing_rules/" rel="noopener noreferrer"&gt;unit testing for rules&lt;/a&gt; with &lt;code&gt;promtool&lt;/code&gt;, so you can test the rule against made-up data before it goes live.&lt;/li&gt;
&lt;li&gt;Write the change and the reason in the rule's annotations or your team channel, so the next person knows the 5 minutes was a choice.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where this fits at DevGrid Staffing LLC
&lt;/h2&gt;

&lt;p&gt;DevGrid Staffing LLC places engineers on teams that run production systems, and our handovers include runbook drills with the client's on-call people (&lt;a href="https://www.devgridstaffing.com/about" rel="noopener noreferrer"&gt;how we work&lt;/a&gt;). In software engineering, an engineer who quiets one bad alert carefully, and can show why it's still safe, saves a whole rotation a lot of sleep.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Find the alert that paged you most last month. Check whether it has a &lt;code&gt;for:&lt;/code&gt; line, and how long its blips usually last.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;From the DevGrid Staffing LLC notebook · &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>prometheus</category>
      <category>monitoring</category>
      <category>sre</category>
      <category>devops</category>
    </item>
    <item>
      <title>A First U.S. Pay Stub, Read One Line at a Time</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Mon, 26 Oct 2026 01:17:09 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/a-first-us-pay-stub-read-one-line-at-a-time-13a7</link>
      <guid>https://dev.to/devgridstaffing/a-first-us-pay-stub-read-one-line-at-a-time-13a7</guid>
      <description>&lt;p&gt;Your first payday at a new developer job arrives, and two things surprise you. The deposit is smaller than the offer letter seemed to promise, and the stub is a grid of short labels and numbers. For many F-1 students in new OPT jobs, it's the first U.S. pay stub they've ever held.&lt;/p&gt;

&lt;p&gt;Fact-checked against the official sources on 23 October 2026.&lt;/p&gt;

&lt;p&gt;Think of a stub like a log file for your pay. Every line answers one of three questions: what did you earn, what was taken out, and what reached your bank? Read it slowly once, and every later stub takes a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know whether a stub is required
&lt;/h2&gt;

&lt;p&gt;Federal law doesn't promise you one. The Department of Labor says the Fair Labor Standards Act (FLSA), the main federal pay law, makes employers "keep accurate records of hours worked and wages paid." But the FLSA &lt;a href="https://webapps.dol.gov/elaws/faq/esa/flsa/018.htm" rel="noopener noreferrer"&gt;"does not require an employer to provide employees pay stubs."&lt;/a&gt; The Department also notes that &lt;a href="https://webapps.dol.gov/elaws/whd/flsa/screen6.asp" rel="noopener noreferrer"&gt;some states have their own laws&lt;/a&gt; on matters the federal act leaves out. So check your state's labor department for pay statement rules where you work. In practice, most payroll systems still give you a stub, on paper or in an online portal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start at the top of the stub
&lt;/h2&gt;

&lt;p&gt;The top block says who paid whom, and for which days.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pay period:&lt;/strong&gt; the first and last day of the work this check covers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay date:&lt;/strong&gt; the day the money is paid. It usually comes after the pay period ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hours and rate:&lt;/strong&gt; shown if you're paid by the hour. A salaried stub shows a fixed amount per period instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gross pay:&lt;/strong&gt; everything you earned this period, before anything comes out.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the hours or the rate look wrong, raise that first. Every number below gross pay is built on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the federal income tax line
&lt;/h2&gt;

&lt;p&gt;This line may say "Federal income tax", "Fed W/H" or "FIT". Labels differ between payroll systems.&lt;/p&gt;

&lt;p&gt;The amount comes from the Form W-4 you gave payroll on your first day. The IRS says to &lt;a href="https://www.irs.gov/forms-pubs/about-form-w-4" rel="noopener noreferrer"&gt;complete Form W-4&lt;/a&gt; "so that your employer can withhold the correct federal income tax from your pay." It also suggests a new W-4 "each year and when your personal or financial situation changes."&lt;/p&gt;

&lt;p&gt;Payroll turns your W-4 into a dollar amount with the methods in &lt;a href="https://www.irs.gov/publications/p15t" rel="noopener noreferrer"&gt;IRS Publication 15-T&lt;/a&gt;. That publication tells payroll staff to send nonresident alien employees to Notice 1392, the extra W-4 instructions for them, before they fill in the form. "Nonresident alien" is a tax status, not a visa type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look for the two payroll tax lines
&lt;/h2&gt;

&lt;p&gt;Social Security and Medicare are the two. For a limited time, some F-1 students owe neither of these taxes. &lt;a href="https://www.irs.gov/individuals/international-taxpayers/aliens-employed-in-the-us-social-security-taxes" rel="noopener noreferrer"&gt;This IRS page&lt;/a&gt; lists the conditions.&lt;/p&gt;

&lt;p&gt;Where they apply, your share is 6.2% of wages toward Social Security, plus 1.45% toward Medicare. Two limits matter later in a career:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Social Security stops at a cap.&lt;/strong&gt; The IRS &lt;a href="https://www.irs.gov/taxtopics/tc751" rel="noopener noreferrer"&gt;tax topic on these taxes&lt;/a&gt; puts the 2026 wage base limit, the most pay the tax applies to, at $184,500. The Social Security Administration has already published &lt;a href="https://www.ssa.gov/oact/cola/cbb.html" rel="noopener noreferrer"&gt;$192,300 for 2027&lt;/a&gt;. Once your pay for the year passes the cap, that line drops to zero until January.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medicare has no cap, and one extra layer.&lt;/strong&gt; The same IRS page says employers withhold an Additional Medicare Tax of 0.9% on wages "in excess of $200,000 in a calendar year," starting in the pay period when pay passes that amount.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Check the running totals
&lt;/h2&gt;

&lt;p&gt;"Year to date" (YTD) is a running total since January 1. It should grow by exactly this period's amount each payday. A YTD figure that jumps or shrinks is worth a question.&lt;/p&gt;

&lt;p&gt;After the year ends, your employer sends you a Form W-2 with the year's totals. The &lt;a href="https://www.irs.gov/instructions/iw2w3" rel="noopener noreferrer"&gt;IRS instructions for Form W-2&lt;/a&gt; name the boxes: Box 2 is federal income tax withheld, Box 4 is Social Security tax withheld and Box 6 is Medicare tax withheld. Put your last stub of the year next to the W-2 and compare those three numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look at the other deductions
&lt;/h2&gt;

&lt;p&gt;Below the taxes, you may see lines for things you signed up for, such as a health plan. Each one should match a form you filled in or a choice you made. If you can't tell what a line is, ask payroll to name it. That's a normal question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check that net pay matches the deposit
&lt;/h2&gt;

&lt;p&gt;Net pay is gross pay minus every line above. It should equal what landed in your bank account, to the cent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work through a made-up stub
&lt;/h2&gt;

&lt;p&gt;These numbers are invented to show the arithmetic. They aren't real pay or a real tax amount.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gross pay                     2,500.00
Federal income tax             -210.00   (made up; depends on your W-4)
Social Security (6.2%)         -155.00
Medicare (1.45%)                -36.25
Health plan                     -40.00   (made up)
---------------------------------------
Net pay                       2,058.75
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're exempt from Social Security and Medicare tax, those two lines would read 0.00, and net pay would rise by $191.25.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we stand at DevGrid Staffing LLC
&lt;/h2&gt;

&lt;p&gt;At DevGrid Staffing LLC, we sponsor our own employees. We don't handle tax or immigration paperwork for people who don't work here.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A lawyer didn't write these steps, and they aren't legal advice from DevGrid Staffing LLC. For a real answer on your own case, talk to an immigration attorney, or to the Designated School Official (DSO) who keeps your student record.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For tax questions, use the IRS pages linked above or a tax professional.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Take your newest pay stub and a pen. Circle gross pay, each tax line and net pay. Then add up every deduction and check that gross pay minus that total equals net pay.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;From the DevGrid Staffing LLC notebook · &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>payroll</category>
      <category>taxes</category>
    </item>
    <item>
      <title>The On-Call Handoff Note That Fits in Five Lines</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Fri, 23 Oct 2026 01:35:03 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/the-on-call-handoff-note-that-fits-in-five-lines-17ef</link>
      <guid>https://dev.to/devgridstaffing/the-on-call-handoff-note-that-fits-in-five-lines-17ef</guid>
      <description>&lt;p&gt;Monday, 8:02 AM. Your on-call week starts, and the only message from the last shift says "all good, a few alerts, nothing major." Twenty minutes later the same alert fires again, and you have no idea what "nothing major" covered.&lt;/p&gt;

&lt;p&gt;Fact-checked against the official sources on 23 October 2026.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;handoff note&lt;/strong&gt; is the short message the person finishing an on-call shift leaves for the person starting the next one. &lt;strong&gt;On call&lt;/strong&gt; means you are the one who gets paged (alerted) when a service breaks. In one team's story in Google's SRE Workbook, the on-call rules covered both ends of a shift: &lt;a href="https://sre.google/workbook/on-call/" rel="noopener noreferrer"&gt;read the handoff from the previous shift at the start, and email a handoff to the next engineer at the end&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The note does not need to be long. Five lines cover most weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fill in the five lines
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Now:&lt;/strong&gt; anything still broken or still being worked on. Say "nothing open" if that's true, so the reader doesn't have to guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paged:&lt;/strong&gt; what woke you up, and what you did about it. One clause per page is enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Changed:&lt;/strong&gt; anything you changed during the shift. Think deploys (releases of new code), config edits, and silenced alerts. A &lt;strong&gt;silence&lt;/strong&gt; mutes an alert for a set time, so write when it ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch:&lt;/strong&gt; something that hasn't broken yet but might. A disk filling up, a slow job, a flaky test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask:&lt;/strong&gt; the one question you couldn't answer, and who might know.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Read a filled-in example
&lt;/h2&gt;

&lt;p&gt;Here's a note for a made-up "bus-times" app that shows when the next bus arrives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Now:     nothing open.
Paged:   02:14 "api latency high" x2. Cache node restarted, latency normal by 02:30.
Changed: muted "cache-node-down" until 12:00 today. Unmute or extend it.
Watch:   timetable import ran 40 min last night (usually 15). Disk at 81%.
Ask:     why the cache node keeps restarting. The team that owns the cache may know.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can read that in under a minute. You know what's calm, what's muted and when the mute ends, and which problem is worth a ticket today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it honest
&lt;/h2&gt;

&lt;p&gt;Two habits make the note worth trusting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't write "transient" and stop there.&lt;/strong&gt; The SRE Workbook warns that waving off a page as transient lets the same bug page the next person. If you didn't find the cause, write "cause unknown" on the Ask line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write it before you log off.&lt;/strong&gt; It takes two minutes while you still remember. The next morning it's guesswork.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where this fits at DevGrid Staffing LLC
&lt;/h2&gt;

&lt;p&gt;DevGrid Staffing LLC is an IT staffing company, and SRE and DevOps groups are among the teams it hires for. In that hiring, a short, clear handoff note is the kind of everyday habit that shows a person can be trusted with a pager.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Open your team's last handoff message. Rewrite it in the five lines above and see which line was missing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written at the DevGrid Staffing LLC workbench for people on SRE and pipeline teams · &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>oncall</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>While the Alert Is Still Firing, Keep an Incident Timeline Like This</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Tue, 20 Oct 2026 05:39:03 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/while-the-alert-is-still-firing-keep-an-incident-timeline-like-this-2kfb</link>
      <guid>https://dev.to/devgridstaffing/while-the-alert-is-still-firing-keep-an-incident-timeline-like-this-2kfb</guid>
      <description>&lt;p&gt;At 10:04 UTC the alert fires. By 10:40, five people are in the chat. Then someone new joins and asks two simple questions: "When did it start? What have we tried?" Nobody can answer without scrolling back through 200 messages.&lt;/p&gt;

&lt;p&gt;A timeline fixes that. It's one plain list of times and facts, written while the incident is still going. An &lt;strong&gt;incident&lt;/strong&gt; is any unplanned problem that hurts a service enough that people stop other work to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open one plain file first
&lt;/h2&gt;

&lt;p&gt;Before you run a single command, start the file. A text file, a shared doc or a chat thread pinned to the top all work. The Google SRE book calls this a &lt;a href="https://sre.google/sre-book/managing-incidents/" rel="noopener noreferrer"&gt;"living incident document"&lt;/a&gt;. It says the document can be messy, but it has to be useful, and it should be easy for several people to edit at once.&lt;/p&gt;

&lt;p&gt;Give it a name with the date, like &lt;code&gt;incident-2026-11-30.md&lt;/code&gt;. Put three lines at the top and keep them current:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; investigating, fixing, watching, or resolved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What users see:&lt;/strong&gt; one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who is doing what:&lt;/strong&gt; a name or role next to each task.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Add a line every time something happens
&lt;/h2&gt;

&lt;p&gt;Each line gets a time and one fact. If you work in a terminal, a tiny shell function saves typing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;note&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s  %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +%H:%MZ&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; incident-2026-11-30.md
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;note restarted worker-2&lt;/code&gt; adds a line like &lt;code&gt;10:22Z  restarted worker-2&lt;/code&gt; to the end of the file. Piece by piece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;date -u&lt;/code&gt; uses UTC, and &lt;code&gt;+%H:%M&lt;/code&gt; prints the hour and minute, per the &lt;a href="https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html" rel="noopener noreferrer"&gt;GNU coreutils manual&lt;/a&gt;. The &lt;code&gt;Z&lt;/code&gt; is a common way to mark a UTC time, and GNU &lt;code&gt;date&lt;/code&gt; &lt;a href="https://www.gnu.org/software/coreutils/manual/html_node/Time-zone-items.html" rel="noopener noreferrer"&gt;reads &lt;code&gt;Z&lt;/code&gt; as UTC too&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"$*"&lt;/code&gt; is everything you typed after &lt;code&gt;note&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; adds to the end of the file and never wipes what's already there.&lt;/li&gt;
&lt;li&gt;If a note has an apostrophe or a symbol like &lt;code&gt;&amp;gt;&lt;/code&gt; or &lt;code&gt;;&lt;/code&gt;, wrap it in double quotes, like &lt;code&gt;note "rolled back yesterday's deploy"&lt;/code&gt;. Otherwise the shell reads those characters itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write down four kinds of things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you saw.&lt;/strong&gt; "Error rate on the order page is at 8%."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each action you took.&lt;/strong&gt; "Rolled back to yesterday's version."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you decided, and why.&lt;/strong&gt; "Not restarting the database yet: other apps share it."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What changed afterwards.&lt;/strong&gt; "Errors dropped to 1% two minutes after the rollback."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Put every time in UTC
&lt;/h2&gt;

&lt;p&gt;People join from different cities. If one writes "3:15" and another writes "10:15", the timeline is useless an hour later. Pick UTC for everything, including times copied from dashboards and logs. If a tool shows local time, convert it before you paste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mark guesses as guesses
&lt;/h2&gt;

&lt;p&gt;During an incident you'll think things you can't prove yet. Write them, but label them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10:31Z  GUESS: the new image cache is filling memory on worker-2
10:36Z  CONFIRMED: worker-2 memory at 97%, other workers at 40%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later, nobody has to work out which lines were facts and which were hunches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's a short example
&lt;/h2&gt;

&lt;p&gt;This is a made-up incident on a toy parcel-tracking app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: resolved   Users saw: tracking pages slow or blank
10:04Z  ALERT: tracking page p95 latency above 3s
10:07Z  on-call lead takes point; second engineer reads logs
10:12Z  SAW: worker-2 log full of "out of memory" since 09:58Z
10:18Z  DID: took worker-2 out of the load balancer
10:21Z  SAW: latency back under 1s
10:26Z  DECIDED: roll back 09:50Z deploy (image cache change)
10:33Z  DID: rollback finished; worker-2 back in
10:48Z  WATCHING: 15 min clean, closing the incident
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"p95 latency" means 95% of requests took that long or less. A &lt;strong&gt;load balancer&lt;/strong&gt; spreads visitors across several servers, so taking one out stops it from getting traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn it into a short review the next day
&lt;/h2&gt;

&lt;p&gt;Once things are calm, the timeline becomes the backbone of a &lt;strong&gt;review&lt;/strong&gt; (Google calls it a postmortem): a short write-up of what happened and what to change.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Copy the timeline in as it is.&lt;/strong&gt; Fix typos, nothing more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the impact.&lt;/strong&gt; Who was affected, for how long. Here: about 23 minutes of slow or blank tracking pages, from the first out-of-memory line at 09:58Z to 10:21Z, when latency recovered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List what helped.&lt;/strong&gt; The log made the bad worker obvious within 8 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List what got in the way.&lt;/strong&gt; No one knew who had made the deploy at 09:50.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write two or three follow-ups.&lt;/strong&gt; Each one gets an owner and a date.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keep the review blameless
&lt;/h2&gt;

&lt;p&gt;The SRE book says a &lt;a href="https://sre.google/sre-book/postmortem-culture/" rel="noopener noreferrer"&gt;blameless postmortem&lt;/a&gt; looks for the causes of an incident without blaming any person or team. It assumes people acted in good faith with what they knew at the time.&lt;/p&gt;

&lt;p&gt;In practice, write "the deploy had no memory test" instead of "the person who deployed didn't test it". The first one leads to a fix. The second one teaches people to hide mistakes next time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits at DevGrid Staffing LLC
&lt;/h2&gt;

&lt;p&gt;DevGrid Staffing LLC works with SRE and DevOps teams, where on-call shifts are a normal part of software engineering. A tidy timeline is something anyone on the rota can keep, and it makes the review the next day much easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Paste the &lt;code&gt;note&lt;/code&gt; function into your shell, run &lt;code&gt;note testing my timeline&lt;/code&gt;, and check the file. Next time an alert fires, start the file before you start fixing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written at the DevGrid Staffing LLC workbench for people on SRE and pipeline teams · &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>incidentresponse</category>
      <category>oncall</category>
    </item>
    <item>
      <title>Could a New Teammate Follow Your Runbook Page Alone?</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Sun, 18 Oct 2026 22:47:08 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/could-a-new-teammate-follow-your-runbook-page-alone-14dg</link>
      <guid>https://dev.to/devgridstaffing/could-a-new-teammate-follow-your-runbook-page-alone-14dg</guid>
      <description>&lt;p&gt;Your teammate starts their first shadow shift on Monday. On Sunday night you open the runbook page for the disk alert, to check it's ready. It has one line: "Check the usual stuff and clean up." You know what "the usual stuff" means. They won't.&lt;/p&gt;

&lt;p&gt;A runbook is a short page that says what to do when one alert fires. Google's SRE book says that writing best practices down ahead of time, in what it calls a "playbook", gave &lt;a href="https://sre.google/sre-book/introduction/" rel="noopener noreferrer"&gt;roughly a 3x improvement&lt;/a&gt; in MTTR (mean time to repair, the average time to fix a problem) compared with improvising. That only works if someone new can follow the page alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one alert, not the whole server
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;An alert&lt;/strong&gt; is a message a monitoring tool sends when something crosses a line you set, like "disk more than 90% full". &lt;strong&gt;On call&lt;/strong&gt; means you're the person who answers those alerts during your shift.&lt;/p&gt;

&lt;p&gt;Pick one alert. One page covers one alert. If you try to write "everything about the photo server", the page gets long, and nobody reads it at 3 a.m.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the page in five parts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What the alert is telling you.&lt;/strong&gt; One or two sentences, in plain words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who notices.&lt;/strong&gt; Which users feel it, and how.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The first 3 checks.&lt;/strong&gt; Exact commands, ready to copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A safe fix.&lt;/strong&gt; Only a fix that can't make things worse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to escalate.&lt;/strong&gt; To &lt;strong&gt;escalate&lt;/strong&gt; is to call in someone with more context. Give clear numbers, not "if it looks bad".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add a "last tested" line at the bottom. You'll see why below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on a toy service
&lt;/h2&gt;

&lt;p&gt;Here is a page for a made-up service called &lt;code&gt;thumbs&lt;/code&gt;. It makes small preview images of uploaded photos. It keeps them in a cache folder (a store of copies it can rebuild) and writes logs to &lt;code&gt;/var/log/thumbs&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Alert: thumbs-disk-high&lt;/span&gt;

&lt;span class="gu"&gt;## What the alert is telling you&lt;/span&gt;
The /var disk on a thumbs server has been over 90% full for 10 minutes.
At 100%, thumbs can't save new previews, and new uploads fail.

&lt;span class="gu"&gt;## Who notices&lt;/span&gt;
People uploading photos. Old photos still show.

&lt;span class="gu"&gt;## First 3 checks&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; How full is it now?
   df -h /var
&lt;span class="p"&gt;2.&lt;/span&gt; Which folders are biggest?
   sudo du -xh --max-depth=1 /var | sort -h | tail -n 5
&lt;span class="p"&gt;3.&lt;/span&gt; Is it the cache or the logs?
   sudo du -sh /var/lib/thumbs/cache /var/log/thumbs

&lt;span class="gu"&gt;## Safe fix&lt;/span&gt;
If the cache is the biggest folder:
   sudo /opt/thumbs/bin/clean-cache --older-than 7d
The cache only holds copies. thumbs rebuilds a preview when someone asks for it.

&lt;span class="gu"&gt;## Escalate when&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; the disk is above 97%, or
&lt;span class="p"&gt;-&lt;/span&gt; the biggest folder is neither the cache nor the logs, or
&lt;span class="p"&gt;-&lt;/span&gt; the clean script fails, or frees less than 10%.
Escalate to: the thumbs owner on the team rota.

&lt;span class="gu"&gt;## Last tested&lt;/span&gt;
(date and name of the person who tried it cold)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what each check does, so you can explain it in your own page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;df -h /var&lt;/code&gt; shows how full the disk holding &lt;code&gt;/var&lt;/code&gt; is. The &lt;code&gt;-h&lt;/code&gt; flag prints sizes like &lt;code&gt;12G&lt;/code&gt; instead of long numbers, per the &lt;a href="https://www.gnu.org/software/coreutils/manual/html_node/df-invocation.html" rel="noopener noreferrer"&gt;GNU coreutils manual&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;du&lt;/code&gt; adds up how much space folders use. &lt;code&gt;-x&lt;/code&gt; &lt;a href="https://www.gnu.org/software/coreutils/manual/html_node/du-invocation.html" rel="noopener noreferrer"&gt;skips folders on other disks&lt;/a&gt;, and &lt;code&gt;--max-depth=1&lt;/code&gt; stops after one level, so you get a short list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sort -h&lt;/code&gt; &lt;a href="https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html" rel="noopener noreferrer"&gt;sorts sizes like 2G and 300M&lt;/a&gt; in the right order. &lt;code&gt;tail -n 5&lt;/code&gt; keeps the last five lines. The last one is the total for &lt;code&gt;/var&lt;/code&gt; itself, and the four above it are the biggest folders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;clean-cache&lt;/code&gt; script is part of the toy service. On a real system, only list a fix that your team has already agreed is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hand it to someone who hasn't seen it
&lt;/h2&gt;

&lt;p&gt;This is the real test. Ask a teammate who has never worked on &lt;code&gt;thumbs&lt;/code&gt; to follow the page on a test server.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fill a test disk on purpose.&lt;/strong&gt; Write a big dummy file into the cache folder, so the alert fires. Then run &lt;code&gt;touch -d '8 days ago'&lt;/code&gt; on that file, so the 7-day clean in the safe fix can remove it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give them only the page.&lt;/strong&gt; No hints, no chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sit on your hands and take notes.&lt;/strong&gt; Write down every place they stop, guess or ask a question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time it.&lt;/strong&gt; Note how long the first 3 checks take.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Fix what they tripped on
&lt;/h2&gt;

&lt;p&gt;Every stop in your notes is a gap in the page. Common ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A command needs &lt;code&gt;sudo&lt;/code&gt;&lt;/strong&gt; (run as admin) and the page didn't say so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A path is wrong&lt;/strong&gt; on the test server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Escalate to the owner"&lt;/strong&gt;, but the page doesn't say how to find the owner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix each one, then fill in the "last tested" line with the date and their name. When the service changes, the page needs another cold test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits at DevGrid Staffing LLC
&lt;/h2&gt;

&lt;p&gt;DevGrid Staffing LLC works in IT staffing for SRE, DevOps and CI/CD teams. People who join an on-call rota lean on runbook pages from their first shift, so we care about pages that work without the author in the room.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Open one runbook page your team owns. Read it as if you'd never seen the service, and circle every word or step a new teammate would have to ask about.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written at the DevGrid Staffing LLC workbench for people on SRE and pipeline teams · &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>oncall</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Your First Day as a Developer: Set Up Your Laptop the Safe Way</title>
      <dc:creator>DevGrid Staffing LLC</dc:creator>
      <pubDate>Sat, 17 Oct 2026 16:52:17 +0000</pubDate>
      <link>https://dev.to/devgridstaffing/your-first-day-as-a-developer-set-up-your-laptop-the-safe-way-47h</link>
      <guid>https://dev.to/devgridstaffing/your-first-day-as-a-developer-set-up-your-laptop-the-safe-way-47h</guid>
      <description>&lt;p&gt;It's your first morning. Your laptop is new, your team chat is busy, and someone says, "Get the project running today." Now what?&lt;/p&gt;

&lt;p&gt;If you are looking at junior software developer jobs in the USA, this first-week task comes up almost everywhere, so DevGrid Staffing LLC put this short notebook together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check this first
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open a terminal.&lt;/strong&gt; A terminal is a window where you type commands instead of clicking.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check that Git is installed.&lt;/strong&gt; Git is a tool that saves every version of your code, so you can go back if something breaks. Type:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;If you see a version number, you're ready. If not, ask your team how they install tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tell Git who you are.&lt;/strong&gt; This puts your name on your work:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"you@yourcompany.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Use your work email, not a personal one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Do this next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Copy the project to your laptop.&lt;/strong&gt; This is called "cloning." Your team will give you the link:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;project-link&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the README first.&lt;/strong&gt; The README is a file at the top of the project that explains what it is and how to set it up. Follow its setup steps in order, one at a time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run the tests before you change anything.&lt;/strong&gt; Tests are small checks that make sure the code works. The README usually says how to run them. If they already fail before you touch anything, tell your team. That's useful news, not your mistake.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ask where the contribution guide is.&lt;/strong&gt; Many teams keep a file, often called &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;, or a wiki page with their rules for making changes. Read it before your first change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When you're ready to change something, follow your team's pull request process.&lt;/strong&gt; In short, you make your own branch (&lt;code&gt;git checkout -b my-fix&lt;/code&gt;, or &lt;code&gt;git switch -c my-fix&lt;/code&gt; in newer Git), save your change, and send it for review the way your team asks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A small worked example
&lt;/h2&gt;

&lt;p&gt;Say the README tells you to install the tools and then run the tests. You do both, and one step fails because a tool version is different on your laptop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write down the exact error message.&lt;/li&gt;
&lt;li&gt;You check the README and the contribution guide for a fix.&lt;/li&gt;
&lt;li&gt;If you can't find one, you post the error in the team chat and say which step you were on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your project is not running yet, but you've done the right thing. You didn't guess, you didn't change code to "make it work," and your team can now help you fast. Often this small problem leads to your first real fix: updating the README so the next new person doesn't get stuck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safe habits for week one
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Change nothing until the project runs and you know which tests pass and which already fail.&lt;/li&gt;
&lt;li&gt;Keep notes of every setup step that confused you.&lt;/li&gt;
&lt;li&gt;Ask early. A question on day one saves hours on day three.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One thing to try today
&lt;/h2&gt;

&lt;p&gt;Open any project you have, find its README, and follow the setup steps exactly as written. Write down every step that was unclear. That list is your first gift to a new team.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DevGrid Staffing LLC helps new developers find their first tech roles. Visit &lt;a href="https://www.devgridstaffing.com/" rel="noopener noreferrer"&gt;devgridstaffing.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>career</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
