<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Taminoturoko Briggs</title>
    <description>The latest articles on Forem by Taminoturoko Briggs (@tammibriggs).</description>
    <link>https://forem.com/tammibriggs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F696060%2Fd06b5c49-abcb-45ad-a7af-94dfa2c5f09a.jpg</url>
      <title>Forem: Taminoturoko Briggs</title>
      <link>https://forem.com/tammibriggs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tammibriggs"/>
    <language>en</language>
    <item>
      <title>Immersive 3D Archipelago Portfolio built with Antigravity</title>
      <dc:creator>Taminoturoko Briggs</dc:creator>
      <pubDate>Tue, 27 Jan 2026 13:22:55 +0000</pubDate>
      <link>https://forem.com/tammibriggs/immersive-3d-archipelago-portfolio-built-with-antigravity-14f0</link>
      <guid>https://forem.com/tammibriggs/immersive-3d-archipelago-portfolio-built-with-antigravity-14f0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;I am a software developer interested in building cool projects and solving real-world problems.&lt;/p&gt;

&lt;p&gt;Ever since I came across &lt;a href="https://bruno-simon.com/" rel="noopener noreferrer"&gt;Bruno Simon's 3D Portfolio&lt;/a&gt; in my early days as a developer, it has stuck with me. I have wanted to build something just as cool, but lacked the time and opportunity to do so. This challenge presented the perfect chance to finally dedicate myself to building my own 3D portfolio, and with the help of LLMs like Gemini, I was sure I could pull it off in a few days or weeks.&lt;/p&gt;

&lt;p&gt;The idea for this portfolio was to combine the creativity of the past with the agentic capabilities of the present, and to create a space with more meaningful ways to include AI.&lt;/p&gt;

&lt;p&gt;Personality-wise, it highlights my explorative nature and boldness to take on unfamiliar territories in order to build something cool or solve real-world problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://tammibriggs-portfolio-184232867796.us-central1.run.app/"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I used the Gemini website to generate the design for the portfolio's Islands, modeled them in Blender, and then iteratively implemented the entire portfolio with Antigravity. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Tech Stack&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Next.js (App Router)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS &amp;amp; Vanilla CSS&lt;/li&gt;
&lt;li&gt;3D Graphics &amp;amp; Rendering: @react-three/fiber,  @react-three/drei and @react-three/postprocessing. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animations&lt;/strong&gt;: GSAP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration:&lt;/strong&gt; Gemini 2.0 Flash&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;p&gt;I’m most proud of building my first 3D website and portfolio. It still looks cool every time I see it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>FluentDocs: Keep Docs Accurate as Code Evolves</title>
      <dc:creator>Taminoturoko Briggs</dc:creator>
      <pubDate>Mon, 05 Jan 2026 04:10:07 +0000</pubDate>
      <link>https://forem.com/tammibriggs/fluentdocs-keep-docs-accurate-as-code-evolves-12f6</link>
      <guid>https://forem.com/tammibriggs/fluentdocs-keep-docs-accurate-as-code-evolves-12f6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux-2025-12-03"&gt;DEV's Worldwide Show and Tell Challenge Presented by Mux&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;FluentDocs is a documentation maintenance system that keeps your docs accurate as your code changes.&lt;/p&gt;

&lt;p&gt;Its value is not in writing new documentation, but in eliminating the hidden cost of keeping documentation up to date. Instead of relying on memory, manual audits, or late CI warnings, FluentDocs continuously connects code changes to the documentation they affect.&lt;/p&gt;

&lt;p&gt;With every git push, FluentDocs identifies which parts of your docs are impacted, explains why they are affected, and proposes precise, section-level updates. Writers and developers stay in control by reviewing, editing, or rejecting suggestions in a WYSIWYG editor, then shipping the result as a standard pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Pitch Video
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://stream.mux.com/2MY766Rwop7mvt01UFDOnPTHjJ3aA42agXfhe8JYy01PE.m3u8" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;stream.mux.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://www.fluentdocs.dev/" rel="noopener noreferrer"&gt;https://www.fluentdocs.dev/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Story Behind It
&lt;/h2&gt;

&lt;p&gt;FluentDocs is actually an upgrade to an AI Agent I built called AutoDoc, which won me my first Dev.to challenge. Seeing its real-world value and potential, I decided to take it further and turn it into a fully fledged product.&lt;/p&gt;

&lt;p&gt;The goal was clear: help developers and technical writers keep documentation accurate as code evolves, without adding more manual work to their workflow.&lt;/p&gt;

&lt;p&gt;Building FluentDocs also reflects my broader ambition to move from building side projects to building businesses, and to explore entrepreneurship through solving real problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend &amp;amp; Backend&lt;/strong&gt;: Next.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor&lt;/strong&gt;: Tiptap (WYSIWYG) with a custom Markdown/Diff plugin.&lt;/li&gt;
&lt;li&gt;AI Agent: FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: NextAuth.js with GitHub provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database &amp;amp; Search&lt;/strong&gt;: MongoDB Atlas with Vector Search for semantic documentation mapping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure &amp;amp; Tooling&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub API&lt;/strong&gt;: Octokit for repository interaction and PR creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Updates&lt;/strong&gt;: Server-Sent Events (SSE).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;FluentDocs is unique because it shifts documentation from a reactive task to a proactive automated workflow. Key differentiators include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven Automation&lt;/strong&gt;: Unlike AI assistants that require manual prompts (e.g., Copilot), FluentDocs triggers automatically on every git push. It proactively identifies "documentation drift" before it becomes a technical debt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Context Mapping&lt;/strong&gt;: It uses vector embeddings and search to understand the relationship between code logic and documentation chunks, ensuring suggestions are contextually relevant rather than just keyword-based.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialized WYSIWYG Diffing&lt;/strong&gt;: The custom Tiptap-based editor provides a unique visual interface for reviewing AI suggestions. It allows users to see rich-text diffs and accept changes without manually editing raw Markdown files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Repository Intelligence&lt;/strong&gt;: It supports complex architectures where documentation lives in a separate repository from the source code, maintaining synchronization across distributed systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless PR Integration&lt;/strong&gt;: By orchestrating the full lifecycle—from webhook ingestion to automated Pull Request creation via Octokit—it fits directly into existing CI/CD pipelines without requiring developers to change their tools.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>Automate Doc Maintenance: Detect and Update Outdated Docs Using Algolia MCP Server, n8n, and LLM</title>
      <dc:creator>Taminoturoko Briggs</dc:creator>
      <pubDate>Thu, 24 Jul 2025 05:40:28 +0000</pubDate>
      <link>https://forem.com/tammibriggs/automate-doc-maintenance-detect-and-update-outdated-docs-using-algolia-mcp-server-n8n-and-llm-5bf7</link>
      <guid>https://forem.com/tammibriggs/automate-doc-maintenance-detect-and-update-outdated-docs-using-algolia-mcp-server-n8n-and-llm-5bf7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/algolia-2025-07-09"&gt;Algolia MCP Server Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;AutoDoc is an AI agent that analyzes recent code commits, detects affected documentation pages, and intelligently suggests updates—ensuring your documentation stays accurate and up-to-date with every push.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/xK_JAHghFKI?start=1"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Tammibriggs" rel="noopener noreferrer"&gt;
        Tammibriggs
      &lt;/a&gt; / &lt;a href="https://github.com/Tammibriggs/n8n-auto-doc" rel="noopener noreferrer"&gt;
        n8n-auto-doc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AutoDoc&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/algolia-2025-07-09" rel="nofollow"&gt;Algolia MCP Server Challenge&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What I Built&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;AutoDoc is an AI-powered agent that analyzes recent code commits, detects which documentation pages are affected, and intelligently suggests updates—ensuring your documentation stays accurate and up-to-date with every push.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup Instructions&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Clone Algolia MCP Server Repo&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Run the following command in your terminal to clone the &lt;a href="https://github.com/algolia/mcp-node" rel="noopener noreferrer"&gt;Algolia MCP Server&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/algolia/mcp-node&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Self-Host n8n&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Self-host n8n to use the &lt;code&gt;n8n-nodes-mcp&lt;/code&gt; community node, which enables integration with external MCP servers.
As the workflow uses webhooks, you’ll need a publicly accessible URL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start the n8n instance with the &lt;code&gt;--tunnel&lt;/code&gt; flag
&lt;strong&gt;or&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Preferably, create a dedicated ngrok tunnel using:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ngrok http 5678&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Ensure &lt;code&gt;ngrok&lt;/code&gt; is installed on your system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;3. Install MCP Client node&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Install the &lt;code&gt;n8n-nodes-mcp&lt;/code&gt; node to enable communication with the Algolia MCP server.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;4. Create a new workflow&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Create a new workflow in…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Tammibriggs/n8n-auto-doc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Utilized the Algolia MCP Server
&lt;/h2&gt;

&lt;p&gt;I used the Algolia MCP server to help the LLM discover documentation pages containing outdated code references. This reduces the amount of data passed to the model, keeping it within its context window and ensuring the LLM remains accurate, performant, and cost-effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Development Process
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I started by creating a dummy Next.js documentation site for an SDK and wrote a script to generate an Algolia index from it.&lt;/li&gt;
&lt;li&gt;Uploaded the generated index to Algolia.&lt;/li&gt;
&lt;li&gt;Chose to use &lt;strong&gt;n8n&lt;/strong&gt; for orchestrating my AI agent, with &lt;strong&gt;Google Gemini&lt;/strong&gt; as the model to analyze code changes and suggest documentation updates.&lt;/li&gt;
&lt;li&gt;Set up a webhook to listen for GitHub push events and trigger the workflow.&lt;/li&gt;
&lt;li&gt;Built a workflow in n8n to:

&lt;ul&gt;
&lt;li&gt;Fetch commit data from GitHub
&lt;/li&gt;
&lt;li&gt;Identify &lt;strong&gt;renamed&lt;/strong&gt;, &lt;strong&gt;replaced&lt;/strong&gt;, or &lt;strong&gt;modified&lt;/strong&gt; code, and search the Algolia index for documentation pages referencing them
&lt;/li&gt;
&lt;li&gt;Pass the resulting documentation pages one at a time to the model for update suggestions
&lt;/li&gt;
&lt;li&gt;Create a new GitHub branch for each suggested update
&lt;/li&gt;
&lt;li&gt;Open a GitHub issue summarizing all proposed changes
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tested the system by modifying lines of code.&lt;/li&gt;

&lt;li&gt;Iteratively improved the prompts, indexing strategy, and workflow based on the test results.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges Faced
&lt;/h3&gt;

&lt;p&gt;I encountered two major challenges while building my AI agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Webhook integration without paid hosting&lt;/strong&gt;
I struggled to get the webhook working without having to pay to host my n8n instance. Using &lt;strong&gt;ngrok&lt;/strong&gt; for local tunneling solved this issue and allowed me to test workflows reliably during development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetching outdated documentation data&lt;/strong&gt;
I had difficulty retrieving documentation pages that referenced outdated code. To resolve this, I added extra fields to each Algolia record:

&lt;ul&gt;
&lt;li&gt;An array of all unique code snippets&lt;/li&gt;
&lt;li&gt;A string containing all unique, searchable code-related terms
I then searched for code references in batches, which significantly improved matching accuracy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>algoliachallenge</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Two(2) ways to prevent padding from causing an overflow in CSS</title>
      <dc:creator>Taminoturoko Briggs</dc:creator>
      <pubDate>Sun, 28 Nov 2021 22:46:44 +0000</pubDate>
      <link>https://forem.com/tammibriggs/two2-ways-to-prevent-padding-from-causing-an-overflow-in-css-4ain</link>
      <guid>https://forem.com/tammibriggs/two2-ways-to-prevent-padding-from-causing-an-overflow-in-css-4ain</guid>
      <description>&lt;p&gt;When padding is added to an element with a width or a height of 100% it causes that element to overflow. It’s no surprise since padding creates extra space within an element.&lt;/p&gt;

&lt;p&gt;To fix this issue caused by padding, in this tutorial I am going to introduce two(2) ways of tackling this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;By default in CSS, an element's actual width and height is &lt;strong&gt;width&lt;/strong&gt; + &lt;strong&gt;padding&lt;/strong&gt; + &lt;strong&gt;border&lt;/strong&gt;. Meaning, when we give an element a width of maybe 10px, the actual width of that element becomes &lt;strong&gt;10px&lt;/strong&gt; + &lt;strong&gt;padding&lt;/strong&gt; + &lt;strong&gt;border&lt;/strong&gt;. This is why giving it padding or border when it is already at 100% will cause an overflow.&lt;br&gt;
This problem can be solved in the following ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using CSS Box-sizing property&lt;/li&gt;
&lt;li&gt;Using the CSS calc() function&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  1. Using CSS Box-sizing property
&lt;/h2&gt;

&lt;p&gt;Using &lt;strong&gt;box-sizing&lt;/strong&gt; is the best way of tackling the issue of an overflow caused by padding. &lt;br&gt;
The box-sizing property will allow us to define how the width and height of an element are calculated. The default value of the &lt;strong&gt;box-sizing&lt;/strong&gt; property is &lt;code&gt;content-box&lt;/code&gt;, but when we set it to &lt;code&gt;border-box&lt;/code&gt; this will make the element’s padding and border to also be included in its width and height. &lt;br&gt;
Meaning if we set the element as a &lt;strong&gt;width/height&lt;/strong&gt; of &lt;code&gt;10px&lt;/code&gt; and add padding or a border of &lt;code&gt;2px&lt;/code&gt;, the element’s actual &lt;strong&gt;width/height&lt;/strong&gt; will still be &lt;code&gt;10px&lt;/code&gt; except the padding + border is greater than &lt;code&gt;10px&lt;/code&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.div&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;
   &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Element's actual width = width + padding + border&lt;br&gt;
Element's actual width = 10px + 4px + 4px = 18px&lt;/p&gt;

&lt;p&gt;This is the same for the height.&lt;br&gt;
Element's actual height = 10px + 4px + 4px = 18px&lt;/p&gt;

&lt;p&gt;We used &lt;strong&gt;4px instead of 2px&lt;/strong&gt; for the border and padding because in our code we are adding 2px to both the left and right sides of the element.&lt;/p&gt;

&lt;p&gt;But with the box-sizing property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.div&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;padding-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;border-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Element's actual width = 10px + 2px + 2px = 10px&lt;br&gt;
Element's actual height = 10px + 2px + 2px = 10px&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Using the CSS calc() function
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;calc()&lt;/code&gt; function allows us to perform calculations when we want to specify a property value. The cool thing about the &lt;code&gt;calc()&lt;/code&gt; function is that even when the values are in a different unit, it can still be used to calculate the adding(+), subtraction(-), multiplication(*) and division of the values. &lt;br&gt;
For example, we can use the &lt;code&gt;calc()&lt;/code&gt; function to do something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.div&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the overflow issue of adding padding to a 100% width/height element Using the &lt;code&gt;calc()&lt;/code&gt; function is not the most efficient way of going about it but it will still suffice.&lt;/p&gt;

&lt;p&gt;Here is how we go about using the &lt;code&gt;calc()&lt;/code&gt; function to handle the overflow issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.div&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;
   &lt;span class="n"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;In this article, we have learned how to use the &lt;strong&gt;box-sizing&lt;/strong&gt; property and &lt;code&gt;calc()&lt;/code&gt; function in CSS to prevent padding from causing an overflow. If you know of any other ways of doing this, feel free to drop it in the commend section below.&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>Managing Secrets with Doppler in Django</title>
      <dc:creator>Taminoturoko Briggs</dc:creator>
      <pubDate>Sat, 02 Oct 2021 05:13:11 +0000</pubDate>
      <link>https://forem.com/tammibriggs/managing-secrets-with-doppler-in-django-585l</link>
      <guid>https://forem.com/tammibriggs/managing-secrets-with-doppler-in-django-585l</guid>
      <description>&lt;p&gt;Using &lt;code&gt;.env&lt;/code&gt; files to manage application config and secrets is a step forward from hard-coding secrets, but there are also security risks and issues relating to the synchronization and manual management of &lt;code&gt;.env&lt;/code&gt; files across different environments. This tutorial introduces &lt;a href="https://www.doppler.com/" rel="noopener noreferrer"&gt;Doppler&lt;/a&gt;, a solution to secret management and synchronization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In this article, we have a Django application that has its secrets defined in a &lt;code&gt;.env&lt;/code&gt; file. We will look at how we can move those secrets from the traditional &lt;code&gt;.env&lt;/code&gt; file to Doppler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doppler — a universal secrets manager
&lt;/h2&gt;

&lt;p&gt;Managing secrets and configs in Doppler keeps them in sync across different environments. You only have to define your secrets once and Doppler acts as a central source of truth for your secrets, saving you the stress of having to re-define them in every environment or share them to team members, probably over unsecured channels.&lt;/p&gt;

&lt;p&gt;Doppler has a CLI that provides easy access to secrets in every environment from local development to production and a single dashboard makes it easy for teams to centrally manage app configuration for any application, platform, and cloud provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Doppler?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Security of App configs and Secrets.&lt;/li&gt;
&lt;li&gt;Boosts Productivity by not having to manually manage &lt;code&gt;.env&lt;/code&gt; files across different environments and cloud providers.&lt;/li&gt;
&lt;li&gt;Keeps all secrets in sync across devices, environments, and team members.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are just some of the reasons why we should adopt the use of Doppler in our Projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Doppler in a Django app
&lt;/h2&gt;

&lt;p&gt;In this section we will demonstrate how we can use Doppler to manage secrets in Django. Here, we have a blog app that has its secrets defined in a &lt;code&gt;.env&lt;/code&gt; file, we will be moving those secrets over to Doppler.&lt;/p&gt;

&lt;h3&gt;
  
  
  App Structure
&lt;/h3&gt;

&lt;p&gt;Here is the file structure of the root folder of our Django app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+--blog
+--images
+--proj_blog
+--.env
+--.gitignore
+--manage.py
+--requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our main interest here is the &lt;code&gt;.env&lt;/code&gt; file which contains all the secrets of the app. The &lt;code&gt;.env&lt;/code&gt; file looks something 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;SECRET_KEY = ajdflkmdjoiejmoaidjfamlamlddga2353
SENDGRID_KEY = supersecretkey
DATABASE_NAME = postgresdatabase
DATABASE_USER = tammibriggs
DATABASE_PASS = supersecretpassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Getting started with Doppler
&lt;/h3&gt;

&lt;p&gt;To start using Doppler, the first step is to &lt;a href="https://dashboard.doppler.com/register" rel="noopener noreferrer"&gt;create an account&lt;/a&gt;. After doing that, we will be prompted to create a workplace. Give the workspace a preferred name and then click on the  &lt;strong&gt;Create Workplace button&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632768916650_Screenshot%2B102.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632768916650_Screenshot%2B102.png" alt="name your workplace"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a project
&lt;/h3&gt;

&lt;p&gt;A project in Doppler is where app configs and secrets are defined. Doppler comes with a default project called  &lt;strong&gt;example-project&lt;/strong&gt; but we can create another by clicking on the plus(+) button. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632775719855_Screenshot%2B103.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632775719855_Screenshot%2B103.png" alt="projects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the plus(+) button and create a new project. In my case, I named my project &lt;strong&gt;blog_project&lt;/strong&gt; but you can give yours any other name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632778946629_Screenshot%2B105.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632778946629_Screenshot%2B105.png" alt="create a project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we have created the project, Doppler will provide us with three environments which are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development&lt;/li&gt;
&lt;li&gt;Staging&lt;/li&gt;
&lt;li&gt;Production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can use these environments to manage our secrets for the three different stages of our app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632779453188_Screenshot%2B106.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632779453188_Screenshot%2B106.png" alt="environments"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Doppler CLI
&lt;/h3&gt;

&lt;p&gt;There are different commands used to install the CLI based on the operating system. I’m using windows but you can look at &lt;a href="https://docs.doppler.com/docs/cli" rel="noopener noreferrer"&gt;Doppler’s installation guide&lt;/a&gt; to help out with installation on other operating systems.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add Doppler's scoop repo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;doppler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://github.com/DopplerHQ/scoop-doppler.git&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Install latest doppler cli&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;doppler&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run into any problems, &lt;a href="https://dpkreativ.hashnode.dev/how-to-set-up-dopplers-cli-on-windows-10" rel="noopener noreferrer"&gt;this article&lt;/a&gt; will be of help.&lt;br&gt;
After running the command, we can check if the installation was successful by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;doppler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need a way for our local machine to authenticate with Doppler. We can do that with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;doppler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will be asked to open a browser window, where we will authenticate with our email, then an auth token to log in will appear in our terminal which we can use to authenticate Doppler.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632860268320_Screenshot%2B108.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632860268320_Screenshot%2B108.png" alt="command line authentication"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we will be asked to name our token. After doing that if we check our terminal, we can see we have received a welcome message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing secrets with Doppler
&lt;/h2&gt;

&lt;p&gt;It is time that we moved our secrets defined in the &lt;code&gt;.env&lt;/code&gt; over to Doppler.&lt;br&gt;
Head over to the &lt;strong&gt;blog_project&lt;/strong&gt; we created earlier on Doppler and click on &lt;strong&gt;dev&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632861596022_Screenshot%2B113.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632861596022_Screenshot%2B113.png" alt="dev environment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have been provided with two options on how we can add our secrets. We are going to use the second which is &lt;strong&gt;import Secrets&lt;/strong&gt; because when using it all we have to do is to copy and paste our secrets rather than manually writing our secrets if we use &lt;strong&gt;Add First Secret&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632862864865_Screenshot%2B116.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632862864865_Screenshot%2B116.png" alt="import secrets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we have copied and pasted our secrets, click on the &lt;strong&gt;Import Secrets&lt;/strong&gt; button, to import our secrets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632864098450_Screenshot%2B118.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_2AF5889E38548E08F15A95610CAB46E1BEC5A83ECFBDC383F7690245CC08981B_1632864098450_Screenshot%2B118.png" alt="dev environement"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;Save&lt;/strong&gt; button at the top right of the page to save the imported keys.&lt;br&gt;
Now, in our terminal let's run the setup command to configure Doppler&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;doppler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We choose the project we are working on which is &lt;strong&gt;blog_project&lt;/strong&gt; and select the environment, in this case, the &lt;strong&gt;dev&lt;/strong&gt; environment.&lt;br&gt;
We can now run our Django app, but instead of the regular way which is &lt;code&gt;python manage.py runserver&lt;/code&gt;, we will use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;doppler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;manage.py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;runserver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this command does is it fetches the latest secrets that we stored in Doppler and injects them as environmental variables. Now we can delete the &lt;code&gt;.env&lt;/code&gt; file from our project and everything will still work perfectly.&lt;/p&gt;

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

&lt;p&gt;Doppler is a better way of managing secrets than using &lt;code&gt;.env&lt;/code&gt; files. This article introduced us to the solution Doppler provides to secret synchronization and security. We have also demonstrated how we can start using Doppler in Django.&lt;br&gt;
The solution Doppler provides is amazing, it's high time we say Goodbye to &lt;code&gt;.env&lt;/code&gt; files.&lt;/p&gt;

</description>
      <category>security</category>
      <category>django</category>
    </item>
  </channel>
</rss>
