<?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: Dedar Alam</title>
    <description>The latest articles on DEV Community by Dedar Alam (@devded).</description>
    <link>https://dev.to/devded</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%2F373692%2F58f6b3da-a1b9-4269-af03-b0b39c3e6c4d.jpeg</url>
      <title>DEV Community: Dedar Alam</title>
      <link>https://dev.to/devded</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devded"/>
    <language>en</language>
    <item>
      <title>Zero to Production: FastAPI on Fly.io and GitHub Actions</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Fri, 03 Jul 2026 14:47:07 +0000</pubDate>
      <link>https://dev.to/devded/zero-to-production-fastapi-on-flyio-and-github-actions-1ejo</link>
      <guid>https://dev.to/devded/zero-to-production-fastapi-on-flyio-and-github-actions-1ejo</guid>
      <description>&lt;h1&gt;
  
  
  Zero to Production: FastAPI on Fly.io with a YAML Config and GitHub Actions
&lt;/h1&gt;

&lt;p&gt;You push to &lt;code&gt;main&lt;/code&gt;, tests run, and a couple of minutes later your API is live. This post builds that pipeline end to end — one FastAPI app, one Docker image, one YAML config file, one GitHub Actions workflow. No database, no Redis, no extra services: just the app, deployed properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Picture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push → GitHub Actions → run tests → build image → deploy to Fly.io → live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three moving parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your FastAPI app&lt;/strong&gt;, packaged in a Docker image so it runs identically everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fly.io&lt;/strong&gt;, which takes that image and runs it on small VMs called Machines — handling TLS, routing, health checks, and restarts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt;, which watches the repo and runs the deploy automatically on every push to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The glue is a &lt;strong&gt;scoped deploy token&lt;/strong&gt;: a Fly API token stored as a GitHub secret so the CI runner can deploy on your behalf — and nothing else.&lt;/p&gt;

&lt;p&gt;A note on the config file before we start: Fly's docs default to &lt;code&gt;fly.toml&lt;/code&gt;, but &lt;code&gt;flyctl&lt;/code&gt; accepts &lt;strong&gt;TOML, YAML, or JSON&lt;/strong&gt; — the structure is identical. We'll use YAML (&lt;code&gt;fly.yaml&lt;/code&gt;) throughout. The only consequence is that since flyctl looks for &lt;code&gt;fly.toml&lt;/code&gt; by default, we pass &lt;code&gt;--config fly.yaml&lt;/code&gt; explicitly. That's a feature, not a chore: being explicit about which config you're deploying is exactly the habit that later scales into &lt;code&gt;fly.stg.yaml&lt;/code&gt; / &lt;code&gt;fly.prod.yaml&lt;/code&gt; multi-environment setups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A FastAPI project in a GitHub repo&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;flyctl&lt;/code&gt; CLI (&lt;code&gt;curl -L https://fly.io/install.sh | sh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A Fly.io account (&lt;code&gt;fly auth signup&lt;/code&gt; or &lt;code&gt;fly auth login&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Project layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myapi/
├── app/
│   ├── __init__.py
│   └── main.py
├── tests/
│   └── test_main.py
├── requirements.txt
├── Dockerfile
├── fly.yaml
└── .github/
    └── workflows/
        └── deploy.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a minimal app with a health endpoint (we'll need it later — it's not decoration):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/main.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;health&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 0.5: &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The Dockerfile in the next step installs from this file, so it needs to exist first. Minimal set for a FastAPI app served by uvicorn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi==0.115.6
uvicorn[standard]==0.34.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;uvicorn[standard]&lt;/code&gt; pulls in &lt;code&gt;uvloop&lt;/code&gt; and &lt;code&gt;httptools&lt;/code&gt;, which make it noticeably faster than the bare install — worth it even for a small API. If your app talks to a database or reads config from environment variables, you'd typically add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pydantic-settings==2.7.1
python-dotenv==1.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin versions (&lt;code&gt;==&lt;/code&gt;, not bare package names). Without pins, a random future &lt;code&gt;pip install&lt;/code&gt; in CI or in the Fly builder can pull a newer major version that breaks your app on deploy — exactly the kind of thing you want caught by &lt;code&gt;pytest&lt;/code&gt; locally, not discovered in production. Generate pins from a working local environment with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then trim it down to what your app actually imports — &lt;code&gt;pip freeze&lt;/code&gt; also captures transitive dependencies and anything else installed in that environment, which bloats the file and makes upgrades harder to reason about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Dockerize the App
&lt;/h2&gt;

&lt;p&gt;Fly deploys Docker images, so the Dockerfile &lt;em&gt;is&lt;/em&gt; the deployment definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;

&lt;span class="c"&gt;# Don't run as root&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;useradd &lt;span class="nt"&gt;--create-home&lt;/span&gt; appuser
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /home/appuser&lt;/span&gt;

&lt;span class="c"&gt;# Install deps first so this layer is cached between builds&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; app/ ./app/&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details that matter on Fly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bind to &lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/strong&gt;, not &lt;code&gt;127.0.0.1&lt;/code&gt;. Fly's proxy connects from outside the container; localhost-only binding is the #1 cause of "deployed but unreachable."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a port and stay consistent.&lt;/strong&gt; We use 8080 here, and the config below must point at the same number.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sanity-check locally before touching the cloud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myapi &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 myapi
curl localhost:8080/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Create the Fly App and Write &lt;code&gt;fly.yaml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;First register the app (this only creates the name — no machines yet):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fly apps create myapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then write the config by hand. This is the whole file:&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="c1"&gt;# fly.yaml&lt;/span&gt;
&lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapi&lt;/span&gt;
&lt;span class="na"&gt;primary_region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fra&lt;/span&gt;        &lt;span class="c1"&gt;# pick a region close to your users&lt;/span&gt;

&lt;span class="na"&gt;http_service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;internal_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;      &lt;span class="c1"&gt;# must match the port uvicorn binds to&lt;/span&gt;
  &lt;span class="na"&gt;force_https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;auto_start_machines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;auto_stop_machines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stop&lt;/span&gt; &lt;span class="c1"&gt;# scale to zero when idle&lt;/span&gt;
  &lt;span class="na"&gt;min_machines_running&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2s&lt;/span&gt;
      &lt;span class="na"&gt;grace_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/health&lt;/span&gt;

&lt;span class="na"&gt;vm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-cpu-1x&lt;/span&gt;    &lt;span class="c1"&gt;# shared CPU is fine for I/O-bound APIs&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512mb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walking through the blocks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;http_service&lt;/code&gt;&lt;/strong&gt; tells Fly's edge proxy to route public HTTPS traffic to port 8080 inside your machines. &lt;code&gt;force_https&lt;/code&gt; redirects any plain-HTTP request; TLS certificates are handled for you. The &lt;code&gt;auto_stop&lt;/code&gt; / &lt;code&gt;auto_start&lt;/code&gt; / &lt;code&gt;min_machines_running: 0&lt;/code&gt; trio means the app scales to zero when idle and wakes on the next request — essentially free while nobody's using it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;checks&lt;/code&gt;&lt;/strong&gt; is the health check, and it's the most important block in the file. Fly only routes traffic to a machine once &lt;code&gt;GET /health&lt;/code&gt; returns 200 — and during a deploy, it won't kill the old machine until the new one passes. That's zero-downtime deployment, given to you for the price of one endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;vm&lt;/code&gt;&lt;/strong&gt; is the machine sizing. Without it you get Fly's default; with it, the specs are version-controlled and enforced on every deploy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;size: shared-cpu-1x&lt;/code&gt; — shared CPUs are cheap and fine for I/O-bound APIs (which is what most FastAPI services are: the process waits on the network, it doesn't burn CPU). Move to &lt;code&gt;performance-*&lt;/code&gt; sizes only for genuinely CPU-heavy work.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memory: 512mb&lt;/code&gt; — a comfortable floor for Python + uvicorn. 256MB works for tiny apps but leaves little headroom; RAM is usually the first limit you hit. Watch &lt;code&gt;fly logs&lt;/code&gt; for OOM kills once real traffic arrives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For quick experiments there's also an imperative route (&lt;code&gt;fly scale vm shared-cpu-1x --memory 1024&lt;/code&gt;, &lt;code&gt;fly scale count 2&lt;/code&gt;), but the config file wins: the next deploy resets machines to whatever &lt;code&gt;fly.yaml&lt;/code&gt; says. Treat &lt;code&gt;fly scale&lt;/code&gt; as a sandbox and the YAML as the source of truth.&lt;/p&gt;

&lt;p&gt;One YAML footgun to know about: env vars and some values must be strings, so if you ever add a numeric-looking value, quote it (&lt;code&gt;"8080"&lt;/code&gt;, &lt;code&gt;"0.0"&lt;/code&gt;). Unquoted, YAML parses it as a number and flyctl may reject it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: First Manual Deploy
&lt;/h2&gt;

&lt;p&gt;Automating a deploy you've never run by hand is debugging two systems at once. So first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fly deploy &lt;span class="nt"&gt;--config&lt;/span&gt; fly.yaml
fly status &lt;span class="nt"&gt;--config&lt;/span&gt; fly.yaml
curl https://myapi.fly.dev/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the &lt;code&gt;--config fly.yaml&lt;/code&gt; — without it, flyctl looks for &lt;code&gt;fly.toml&lt;/code&gt; and fails. Every fly command that touches the app takes the same flag (or &lt;code&gt;--app myapi&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;If your app needs credentials (API keys, a JWT secret), they never go in &lt;code&gt;fly.yaml&lt;/code&gt; — the file is committed to git. They go in Fly's encrypted secret store and arrive as environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fly secrets &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt; &lt;span class="nt"&gt;--app&lt;/span&gt; myapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rule of thumb: if leaking it would matter, it's a secret; otherwise it can live in the config.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Deploy Token
&lt;/h2&gt;

&lt;p&gt;The GitHub Actions runner needs permission to deploy — but never your personal credentials. Fly issues scoped tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fly tokens create deploy &lt;span class="nt"&gt;-a&lt;/span&gt; myapi &lt;span class="nt"&gt;-x&lt;/span&gt; 720h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-a myapi&lt;/code&gt; scopes the token to this one app — it cannot touch any other app in your org.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-x 720h&lt;/code&gt; sets an expiry (30 days). Tokens default to 20 years if you omit &lt;code&gt;-x&lt;/code&gt;, so always set a shorter one deliberately; a short-lived leak does far less damage than a permanent one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prints a token like &lt;code&gt;FlyV1 fm2_lJPECAAAAAAAA...&lt;/code&gt; — copy the whole string, including the &lt;code&gt;FlyV1&lt;/code&gt; prefix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't use &lt;code&gt;fly auth token&lt;/code&gt;&lt;/strong&gt; for this. That command returns your personal, all-powerful token — access to every app in your org — and it's deprecated for exactly this reason. Deploy tokens exist so a leaked CI secret has a blast radius of one app, not your whole account.&lt;/p&gt;

&lt;p&gt;Store it in GitHub as a &lt;strong&gt;repository secret&lt;/strong&gt;, not anywhere in the code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repo → &lt;strong&gt;Settings → Secrets and variables → Actions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New repository secret&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;FLY_API_TOKEN&lt;/code&gt; (must match the name used in &lt;code&gt;deploy.yml&lt;/code&gt; exactly)&lt;/li&gt;
&lt;li&gt;Value: the full token string&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add secret&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub encrypts it at rest and masks it in logs; &lt;code&gt;${{ secrets.FLY_API_TOKEN }}&lt;/code&gt; in the workflow pulls it in as an env var at deploy time only. To rotate it later: &lt;code&gt;fly tokens list -a myapi&lt;/code&gt; to find the ID, &lt;code&gt;fly tokens revoke &amp;lt;id&amp;gt;&lt;/code&gt; to kill it, then repeat the steps above with a fresh token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: The GitHub Actions Workflow
&lt;/h2&gt;

&lt;p&gt;The heart of the pipeline — &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; (this one really is YAML by requirement; GitHub Actions speaks nothing else):&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI/CD&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.12"&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip&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;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;pip install -r requirements.txt&lt;/span&gt;
          &lt;span class="s"&gt;pip install pytest httpx ruff&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;Lint&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ruff check app/&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;Run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pytest -v&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;                              &lt;span class="c1"&gt;# no green tests, no deploy&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;      &lt;span class="c1"&gt;# deploy from main only, never PRs&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy-group&lt;/span&gt;                &lt;span class="c1"&gt;# never two deploys at once&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;superfly/flyctl-actions/setup-flyctl@master&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;Deploy to Fly.io&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flyctl deploy --remote-only --config fly.yaml&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;FLY_API_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.FLY_API_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading it top to bottom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Triggers.&lt;/strong&gt; Every push to &lt;code&gt;main&lt;/code&gt; and every PR targeting &lt;code&gt;main&lt;/code&gt; runs the workflow. PRs get tests only; merges to &lt;code&gt;main&lt;/code&gt; get tests &lt;em&gt;and&lt;/em&gt; deploy. So every change is verified before merge, and every merge ships automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;needs: test&lt;/code&gt;&lt;/strong&gt; makes deployment conditional on green tests — the whole point of CI/CD. A broken build physically cannot reach production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;if: github.ref == 'refs/heads/main'&lt;/code&gt;&lt;/strong&gt; double-guards the deploy job so PR runs never deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;concurrency: deploy-group&lt;/code&gt;&lt;/strong&gt; queues a second push behind an in-flight deploy instead of racing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--remote-only&lt;/code&gt;&lt;/strong&gt; builds the Docker image on Fly's builders rather than inside the Actions runner — faster, and no Docker setup needed in CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--config fly.yaml&lt;/code&gt;&lt;/strong&gt; — same flag as your manual deploy. The pipeline runs exactly the command you already trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A matching test so the gate has something real to check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# tests/test_main.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.testclient&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.main&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TestClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_health&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Push and Watch It Go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add CI/CD pipeline"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the repo's &lt;strong&gt;Actions&lt;/strong&gt; tab: checkout → lint → tests → deploy. When the last step goes green, &lt;code&gt;https://myapi.fly.dev/health&lt;/code&gt; is serving the new code. From now on, your entire release process is: merge to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day-2 Operations
&lt;/h2&gt;

&lt;p&gt;Commands you'll actually use once this runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fly logs &lt;span class="nt"&gt;--app&lt;/span&gt; myapi                    &lt;span class="c"&gt;# live application logs&lt;/span&gt;
fly status &lt;span class="nt"&gt;--app&lt;/span&gt; myapi                  &lt;span class="c"&gt;# machine states, deployed version&lt;/span&gt;
fly releases &lt;span class="nt"&gt;--app&lt;/span&gt; myapi                &lt;span class="c"&gt;# deployment history&lt;/span&gt;
fly deploy &lt;span class="nt"&gt;--image&lt;/span&gt; &amp;lt;ref&amp;gt; &lt;span class="nt"&gt;--config&lt;/span&gt; fly.yaml   &lt;span class="c"&gt;# roll back to a previous image&lt;/span&gt;
fly ssh console &lt;span class="nt"&gt;--app&lt;/span&gt; myapi             &lt;span class="c"&gt;# shell into a running machine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a deploy goes bad, the health check usually saves you: the new machine never passes &lt;code&gt;/health&lt;/code&gt;, traffic stays on the old one, and the failure shows up loudly in the Actions log instead of silently in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Grows Next
&lt;/h2&gt;

&lt;p&gt;The YAML habit pays off as soon as the app stops being alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Staging + production&lt;/strong&gt;: duplicate the file as &lt;code&gt;fly.stg.yaml&lt;/code&gt; and &lt;code&gt;fly.prod.yaml&lt;/code&gt;, point each at its own Fly app with its own deploy token, and add a second deploy job gated on a &lt;code&gt;develop&lt;/code&gt; branch. Same skeleton, one &lt;code&gt;--config&lt;/code&gt; flag apart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background workers&lt;/strong&gt;: a &lt;code&gt;processes:&lt;/code&gt; block lets one image run both &lt;code&gt;uvicorn&lt;/code&gt; and a task worker on separately sized machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt;: attach Postgres or Redis as separate Fly apps on the private network, unreachable from the internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardening the pipeline&lt;/strong&gt;: add &lt;code&gt;pip-audit&lt;/code&gt; or &lt;code&gt;trivy&lt;/code&gt; to the test job, and a coverage threshold to &lt;code&gt;pytest&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the skeleton never changes: a Dockerfile, a &lt;code&gt;fly.yaml&lt;/code&gt;, a &lt;code&gt;deploy.yml&lt;/code&gt;, and one scoped token. That's the entire distance between "runs on my laptop" and "ships on every merge."&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>fastapi</category>
      <category>fly</category>
    </item>
    <item>
      <title>Introducing HTTP Tracker Plus: Request Capture form Browser</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Thu, 08 Jan 2026 12:50:25 +0000</pubDate>
      <link>https://dev.to/devded/introducing-http-tracker-plus-request-capture-form-browser-4lob</link>
      <guid>https://dev.to/devded/introducing-http-tracker-plus-request-capture-form-browser-4lob</guid>
      <description>&lt;p&gt;API inspectors and debuggers are essential tools for web application development. Being able to inspect API requests and responses makes debugging much easier and more effective.&lt;/p&gt;

&lt;p&gt;I often use Chrome DevTools to check request and response data. I have also been using HTTP Tracker, but one important feature was missing: capturing the response body.Since HTTP Tracker is open source, I spent a long time exploring the codebase and trying to implement this feature, but I was not successful at first.&lt;/p&gt;

&lt;p&gt;I finally found a solution by using Chrome Debugger Mode, which makes it possible to capture the response body. While working on this, I also improved the UI to make it clearer and easier to use.&lt;/p&gt;

&lt;p&gt;The update includes:&lt;br&gt;
Response body capture for selected requests only&lt;br&gt;
UI improvements for better readability and usage&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%2Fah01698oumarave6mpnk.gif" 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%2Fah01698oumarave6mpnk.gif" alt="Demo GIF" width="560" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I plan to publish this version to the Chrome Store and also submit a PR to the original project so others can benefit from it.&lt;br&gt;
I have added a short GIF demo to show how it works.&lt;br&gt;
GitHub repository (check the new branch): &lt;a href="https://github.com/devded/http-tracker-plus" rel="noopener noreferrer"&gt;https://github.com/devded/http-tracker-plus&lt;/a&gt;&lt;br&gt;
Feedback and suggestions are welcome.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to Host Images with Dropbox</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Sat, 17 May 2025 09:18:41 +0000</pubDate>
      <link>https://dev.to/devded/how-to-host-images-with-dropbox-43hi</link>
      <guid>https://dev.to/devded/how-to-host-images-with-dropbox-43hi</guid>
      <description>&lt;p&gt;If you’ve ever needed a quick and reliable way to host an image online—for use in HTML, Markdown files, or just sharing directly—Dropbox can help! In this guide, I’ll walk you through how to turn a Dropbox image link into a &lt;strong&gt;direct image URL&lt;/strong&gt; that can be used anywhere online.&lt;/p&gt;

&lt;h3&gt;
  
  
  📌 Step-by-Step: Hosting Images on Dropbox
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Upload Your Image&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;First, go to your &lt;a href="https://www.dropbox.com/" rel="noopener noreferrer"&gt;Dropbox&lt;/a&gt; account and upload the image you want to host. You can drag and drop it into your Dropbox folder or use the upload button.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Create a Shareable Link&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Hover over the image.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;“Share”&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Then, in the popup, click &lt;strong&gt;“Create link”&lt;/strong&gt; and &lt;strong&gt;“Copy link.”&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will give you a link like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.dropbox.com/s/abcd1234/your-image.jpg?dl=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. &lt;strong&gt;Modify the Link for Direct Access&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;To make the image load directly (instead of going to a Dropbox preview page), you need to &lt;strong&gt;change the end of the URL&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;?dl=0&lt;/code&gt; to &lt;code&gt;?raw=1&lt;/code&gt;
&lt;strong&gt;OR&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;www.dropbox.com&lt;/code&gt; with &lt;code&gt;dl.dropboxusercontent.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the final direct link might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://dl.dropboxusercontent.com/s/abcd1234/your-image.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Use This Link Anywhere!
&lt;/h3&gt;

&lt;p&gt;You can now use this link as the image source in HTML like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://dl.dropboxusercontent.com/s/abcd1234/your-image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"My Image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔧 Bonus: Use a Tool to Convert It Automatically
&lt;/h3&gt;

&lt;p&gt;Not a fan of editing URLs manually? No worries. Try this simple tool:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://dropboxlink.vercel.app" rel="noopener noreferrer"&gt;dropboxlink.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just paste your Dropbox share link, and it will instantly give you the &lt;strong&gt;direct image URL&lt;/strong&gt;!&lt;/p&gt;




&lt;p&gt;That’s it! With Dropbox and a tiny tweak, you’ve got yourself a reliable image host. Great for blogging, portfolio sites, or sharing graphics with friends.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>SS7 Attacks: Is Your Phone Really Safe?</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Mon, 30 Sep 2024 16:16:44 +0000</pubDate>
      <link>https://dev.to/devded/ss7-attacks-is-your-phone-really-safe-2jk1</link>
      <guid>https://dev.to/devded/ss7-attacks-is-your-phone-really-safe-2jk1</guid>
      <description>&lt;p&gt;Did you know your phone calls and text messages might be intercepted without your knowledge? The SS7 Attack is a significant cybersecurity threat that takes advantage of vulnerabilities in the global telecom infrastructure.&lt;/p&gt;

&lt;p&gt;SS7 (Signaling System No. 7) is the protocol used by mobile networks to route calls and messages across carriers worldwide. It was designed decades ago, long before modern cyber threats, leaving it exposed to hackers and cybercriminals.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 How Does the SS7 Attack Work?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unauthorized Access:&lt;/strong&gt; Hackers gain entry into the SS7 network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interception:&lt;/strong&gt; They can intercept your phone calls, SMS messages, and even sensitive two-factor authentication (2FA) codes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Tracking:&lt;/strong&gt; With just your phone number, hackers can track your location in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call Redirection:&lt;/strong&gt; They can redirect or block calls without you realizing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💼 Why Is This Important?
&lt;/h3&gt;

&lt;p&gt;Imagine someone thousands of miles away listening to your private calls, reading your messages, or accessing your financial information by intercepting your 2FA codes. SS7 attacks have been used for everything from espionage to financial fraud.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛡 How to Protect Yourself
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid SMS-based 2FA:&lt;/strong&gt; Switch to app-based authentication like Google Authenticator or Authy for added security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Encrypted Messaging Apps:&lt;/strong&gt; For secure communication, use apps with end-to-end encryption like Signal or WhatsApp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhance Privacy Settings:&lt;/strong&gt; Regularly review and update your phone's privacy settings to minimize exposure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While telecom companies are working on solutions, this is a reminder that our digital world is not always as secure as it seems. Stay informed, stay vigilant, and protect your data! 💡&lt;/p&gt;

&lt;h3&gt;
  
  
  🎬 Demo by Veritasium
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wVyu7NB7W6Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Exploring Language Models with Gitpod &amp; Ollama</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Mon, 11 Dec 2023 16:52:48 +0000</pubDate>
      <link>https://dev.to/devded/exploring-language-models-with-gitpod-and-ollama-1i1h</link>
      <guid>https://dev.to/devded/exploring-language-models-with-gitpod-and-ollama-1i1h</guid>
      <description>&lt;p&gt;Ever fantasized about embarking on an adventurous journey with your very own chat-GPT-style model? Open-source Large Language Models (LLMs) are at your disposal for exploration. In this guide, I'll guide you through setting up a playground using Gitpod and Ollama, turning your coding dreams into an exciting reality!&lt;/p&gt;

&lt;p&gt;Setting Things Up:&lt;/p&gt;

&lt;p&gt;Create a GitHub Playground:&lt;br&gt;
Start your coding adventure by creating a new repository on GitHub. Consider it your coding playground where you can freely experiment with a variety of cool stuff.&lt;/p&gt;

&lt;p&gt;Unlock Gitpod's Magic:&lt;br&gt;
Open this repository in Gitpod by adding gitpod.io# to the beginning of your GitHub repository link. Witness as Gitpod works its magic, setting up a ready-to-use coding space just for your explorations.&lt;/p&gt;

&lt;p&gt;Embarking on the Exploration:&lt;/p&gt;

&lt;p&gt;Install Ollama:&lt;br&gt;
With Gitpod ready, infuse your coding space with the magic of Ollama by entering this command in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
curl https://ollama.ai/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the Ollama Stage:&lt;br&gt;
Make your model accessible by typing the following commands in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama

ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choosing Your Adventure Companion:&lt;/p&gt;

&lt;p&gt;Navigate to Ollama's library (&lt;a href="https://github.com/jmorganca/ollama#model-library"&gt;https://github.com/jmorganca/ollama#model-library&lt;/a&gt;) and choose a model. These models are like adventurous chat buddies, capable of understanding and generating language. For this exploration, let's go with the starling-lm model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama run starling-lm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Witness the magic unfold as your new language companion eagerly joins in on the exploration! Feel free to experiment with different prompts, ask intriguing questions, or weave captivating tales. The possibilities are as vast as your imagination.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Simplifying Web Application Middleware with Flowcharts</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Sat, 17 Jun 2023 15:28:56 +0000</pubDate>
      <link>https://dev.to/devded/simplifying-web-application-middleware-with-flowcharts-65d</link>
      <guid>https://dev.to/devded/simplifying-web-application-middleware-with-flowcharts-65d</guid>
      <description>&lt;p&gt;Web application middleware plays a crucial role in enhancing security and enabling various functionalities. Two commonly used middleware components are authentication and Cross-Origin Resource Sharing (CORS) middleware. In this blog post, we will explore how to visualize the flow of these middleware components using flowcharts, providing a clear understanding of the process. We will use the popular Mermaid syntax to create the flowcharts.&lt;/p&gt;

&lt;p&gt;Understanding the Flowchart Components:&lt;/p&gt;

&lt;p&gt;Start: The starting point of the flowchart.&lt;/p&gt;

&lt;p&gt;Nodes: Represent specific steps or actions in the middleware process.&lt;/p&gt;

&lt;p&gt;Arrows: Indicate the flow of the process from one step to another.&lt;br&gt;
Decision Points: Represent conditional branches in the flow.&lt;/p&gt;

&lt;p&gt;End: The final point of the flowchart.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n4hKe-Ii--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9fzr117mubzj7wabgday.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n4hKe-Ii--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9fzr117mubzj7wabgday.png" alt="Middleware Flowchart" width="800" height="896"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Receiving the Request:&lt;br&gt;
At the start of the flowchart, the web server receives a request from the client.&lt;br&gt;
This step serves as the entry point for the middleware process.&lt;/p&gt;

&lt;p&gt;Step 2: Applying Authentication Middleware:&lt;/p&gt;

&lt;p&gt;The received request is passed through the authentication middleware.&lt;br&gt;
The authentication middleware validates the user's credentials and determines if the request is authenticated.&lt;br&gt;
If the request is authenticated, the flow continues to the next step. Otherwise, an error response may be sent back to the client.&lt;br&gt;
Step 3: Applying CORS Middleware:&lt;/p&gt;

&lt;p&gt;After authentication, the request proceeds to the CORS middleware component.&lt;br&gt;
The CORS middleware checks the request headers for CORS-related information.&lt;br&gt;
Based on the CORS headers, the middleware determines whether the request is valid or not.&lt;/p&gt;

&lt;p&gt;Step 4: Checking CORS Headers:&lt;/p&gt;

&lt;p&gt;If the CORS headers are valid, the flow proceeds to respond with the requested resource.&lt;br&gt;
However, if the CORS headers are invalid, an error response indicating a CORS issue is sent back to the client.&lt;/p&gt;

&lt;p&gt;Step 5: Handling Error (Optional):&lt;/p&gt;

&lt;p&gt;If an error occurs during the middleware process, such as a CORS error, an error-handling step is triggered.&lt;br&gt;
The error-handling step determines whether to report the error or handle it internally.&lt;br&gt;
If the error is reported, the client can send an error report to the server.&lt;br&gt;
The server responds with an error handling response, which may provide additional information or guidance.&lt;/p&gt;

&lt;p&gt;Step 6: Finalizing the Process:&lt;/p&gt;

&lt;p&gt;After error handling or responding with the requested resource, the flow reaches its end.&lt;br&gt;
The middleware process is completed, and the server can proceed with further actions, if necessary.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How ChatGPT Work</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Sun, 26 Feb 2023 17:16:59 +0000</pubDate>
      <link>https://dev.to/devded/how-chatgpt-work-4kg8</link>
      <guid>https://dev.to/devded/how-chatgpt-work-4kg8</guid>
      <description>&lt;p&gt;As an AI language model, ChatGPT work by processing and analyzing vast amounts of text data using machine learning algorithms to understand natural language and generate responses to user inputs.&lt;/p&gt;

&lt;p&gt;Here's a brief overview of how it work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training Data:&lt;/strong&gt; It was trained on a large corpus of text data, such as books, articles, and web pages. The training data was pre-processed to remove noise, such as HTML tags, punctuation, and stopwords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language Model Architecture:&lt;/strong&gt; It based on a transformer architecture, which is a type of deep neural network designed for natural language processing. The transformer architecture uses a sequence-to-sequence approach that is particularly effective for tasks such as machine translation and text generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tokenization:&lt;/strong&gt; When you send a message, it first tokenize it into a sequence of tokens or subwords. This process breaks down the text into smaller units that are easier for the model to process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encoding:&lt;/strong&gt; The tokenized input is then passed through an encoder, which generates a sequence of contextualized embeddings that capture the meaning and context of each token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decoding:&lt;/strong&gt; The contextualized embeddings are then passed through a decoder, which generates a response based on the input and the knowledge stored in the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Post-Processing:&lt;/strong&gt; The generated response is then post-processed to remove any noise or redundant information, such as repeating phrases or meaningless filler words.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response Delivery:&lt;/strong&gt; The final response is delivered to the user in natural language form.&lt;/p&gt;

&lt;p&gt;It's important to note that ChatGPT responses are only as good as the data it was trained on, so there may be instances where it don't understand or correctly respond to your input. Nonetheless, it'll do it best to provide helpful and informative responses to your questions!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog is written with the help of ChatGPT&lt;/em&gt; 🫰&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>discuss</category>
      <category>contentwriting</category>
    </item>
    <item>
      <title>Git Cherry Pick</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Mon, 30 Jan 2023 18:53:17 +0000</pubDate>
      <link>https://dev.to/devded/git-cherry-pick-51of</link>
      <guid>https://dev.to/devded/git-cherry-pick-51of</guid>
      <description>&lt;p&gt;&lt;code&gt;git cherry-pick&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check out the branch you want to apply the changes to: git checkout &lt;/li&gt;
&lt;li&gt;Use git log to find the commit hash of the change you want to apply&lt;/li&gt;
&lt;li&gt;Run git cherry-pick  to apply the change to your current branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git checkout my-feature-branch
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: John Doe &amp;lt;johndoe@example.com&amp;gt;
Date:   Mon Mar 5 15:14:15 2021 -0800
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add new feature X&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git cherry-pick ca82a6dff817ec66f44342007202690a93763949
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will apply the changes from the specified commit to the current branch. If there are any conflicts, Git will prompt you to resolve them before committing the cherry-picked changes.&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>offers</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>How to revert git commit easily</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Fri, 16 Sep 2022 19:48:03 +0000</pubDate>
      <link>https://dev.to/devded/how-to-revert-git-commit-easily-4jbl</link>
      <guid>https://dev.to/devded/how-to-revert-git-commit-easily-4jbl</guid>
      <description>&lt;p&gt;First check the git log by running the command &lt;code&gt;git log --oneline&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hg7IHqJ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjjdbnb2qtpb7udfwweq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hg7IHqJ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjjdbnb2qtpb7udfwweq.png" alt="git log screen shot " width="880" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can see last six commit of this git repository.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;add hello file&lt;/code&gt; this commit for add the hello file&lt;br&gt;
and after this commit last five commit i add five line&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now i want to revent the &lt;code&gt;line 5&lt;/code&gt; commit.&lt;br&gt;
I add this line on &lt;code&gt;1009bb3 add line 5&lt;/code&gt; commit.&lt;br&gt;
here &lt;br&gt;
&lt;code&gt;1009bb3&lt;/code&gt; - commit hash&lt;br&gt;
&lt;code&gt;add line 5&lt;/code&gt; - commit message&lt;/p&gt;

&lt;p&gt;so next step is run revert command &lt;code&gt;git revert --no-commit &amp;lt;commit hash&amp;gt;&lt;/code&gt;&lt;br&gt;
here our revert command is &lt;code&gt;git revert --no-commit 1009bb3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p37jRC6f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ufs23s2gflkcgtivmay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p37jRC6f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ufs23s2gflkcgtivmay.png" alt="revert commit run screen shot" width="880" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After run the revert commit, line 6 is gone. now i have to commit the revert commit changes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FpdE2x0W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jbhrcvf7zkki09rmjzoz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FpdE2x0W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jbhrcvf7zkki09rmjzoz.png" alt="commit all the revert commit changes screen shot" width="684" height="990"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;here commit all the changes after run revert commit&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UKi7pCuz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0e86hn030flnldd9gnf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UKi7pCuz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0e86hn030flnldd9gnf6.png" alt="after revert commit git log screen shot" width="880" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now time to check git log. now here one new commit add &lt;code&gt;Revert "add line 5"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/4114095/how-do-i-revert-a-git-repository-to-a-previous-commit"&gt;&lt;br&gt;
Reference Source&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Commit case-sensitive only filename changes in Git</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Thu, 28 Oct 2021 16:53:54 +0000</pubDate>
      <link>https://dev.to/devded/commit-case-sensitive-only-filename-changes-in-git-2n0i</link>
      <guid>https://dev.to/devded/commit-case-sensitive-only-filename-changes-in-git-2n0i</guid>
      <description>&lt;p&gt;Suppose you have a folder name &lt;code&gt;Dashboard&lt;/code&gt; you changed it to &lt;code&gt;dashboard&lt;/code&gt; default configuration git doesn't recognize that change. Same things happens to files.&lt;/p&gt;

&lt;p&gt;For that need to clean the cache, after struggle few hours I found a simple workable solution.&lt;/p&gt;

&lt;p&gt;Here it is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/17683458/how-do-i-commit-case-sensitive-only-filename-changes-in-git"&gt;source Issue&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Set up .env in react project tips</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Sun, 24 Oct 2021 18:54:47 +0000</pubDate>
      <link>https://dev.to/devded/set-up-env-in-react-project-tips-3i4g</link>
      <guid>https://dev.to/devded/set-up-env-in-react-project-tips-3i4g</guid>
      <description>&lt;p&gt;Found this tips while i'm fetching issue set up .env variable in react project &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The .env file should be in the root for you application folder. That is one level above your src folder, the same place where you have your package.json&lt;/li&gt;
&lt;li&gt;The variable should be prefixed with &lt;code&gt;REACT_APP_&lt;/code&gt;
You need to restart the server to reflect the changes in your code.&lt;/li&gt;
&lt;li&gt;You should access the variable in your code like this
&lt;code&gt;process.env.REACT_APP_SOME_VARIABLE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No need to wrap your variable value in single or double quotes.&lt;/li&gt;
&lt;li&gt;Do not put semicolon &lt;code&gt;;&lt;/code&gt; or comma &lt;code&gt;,&lt;/code&gt; at the end of each line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://kiranvj.com/blog/blog/react-environment-variables-not-working/0"&gt;Source One&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/53237293/react-evironment-variables-env-return-undefined"&gt;Source Two&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Commit case-sensitive only filename changes in Git</title>
      <dc:creator>Dedar Alam</dc:creator>
      <pubDate>Tue, 12 Oct 2021 19:44:24 +0000</pubDate>
      <link>https://dev.to/devded/commit-case-sensitive-only-filename-changes-in-git-1ja3</link>
      <guid>https://dev.to/devded/commit-case-sensitive-only-filename-changes-in-git-1ja3</guid>
      <description>&lt;p&gt;Suppose you have a folder name &lt;code&gt;Dashboard&lt;/code&gt; you changed it to &lt;code&gt;dashboard&lt;/code&gt; default configuration git doesn't recognize that change. Same things happens to files.&lt;/p&gt;

&lt;p&gt;For that need to clean the cache, after struggle few hours I found a simple workable solution.&lt;/p&gt;

&lt;p&gt;Here it is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/17683458/how-do-i-commit-case-sensitive-only-filename-changes-in-git"&gt;source&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
