<?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: Jean-Gaël</title>
    <description>The latest articles on DEV Community by Jean-Gaël (@alwil17).</description>
    <link>https://dev.to/alwil17</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%2F3000499%2F9559a701-d85a-4d15-ba40-68d2b868926d.jpeg</url>
      <title>DEV Community: Jean-Gaël</title>
      <link>https://dev.to/alwil17</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alwil17"/>
    <language>en</language>
    <item>
      <title>Building a Production-Ready FastAPI Boilerplate with Clean Architecture</title>
      <dc:creator>Jean-Gaël</dc:creator>
      <pubDate>Thu, 22 Jan 2026 11:38:33 +0000</pubDate>
      <link>https://dev.to/alwil17/building-a-production-ready-fastapi-boilerplate-with-clean-architecture-5757</link>
      <guid>https://dev.to/alwil17/building-a-production-ready-fastapi-boilerplate-with-clean-architecture-5757</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Production-Ready FastAPI Boilerplate (So You Don't Have To)
&lt;/h1&gt;

&lt;p&gt;Starting a new FastAPI project?  You know the drill:  configure linting, set up auth, write Docker files, configure tests...  &lt;strong&gt;Hours wasted before writing a single feature.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built a boilerplate that does all of this for you. &lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 What's Inside?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Clean Architecture (routes → services → repositories → models)&lt;/li&gt;
&lt;li&gt;✅ Repository Pattern&lt;/li&gt;
&lt;li&gt;✅ Dependency Injection&lt;/li&gt;
&lt;li&gt;✅ Type hints everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Complete JWT implementation&lt;/li&gt;
&lt;li&gt;✅ Refresh tokens (stored in database)&lt;/li&gt;
&lt;li&gt;✅ Password hashing (bcrypt)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ All tools pre-configured:  Black, Ruff, MyPy, Bandit&lt;/li&gt;
&lt;li&gt;✅ Pre-commit hooks&lt;/li&gt;
&lt;li&gt;✅ Makefile with useful commands&lt;/li&gt;
&lt;li&gt;✅ 1500+ lines of documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Testing &amp;amp; DevOps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Pytest with fixtures&lt;/li&gt;
&lt;li&gt;✅ Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;li&gt;✅ GitHub Actions CI/CD&lt;/li&gt;
&lt;li&gt;✅ PostgreSQL + SQLite support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Layer (FastAPI)
    ↓
Schemas (Pydantic DTOs)
    ↓
Services (Business Logic)
    ↓
Repositories (Data Access)
    ↓
Models (SQLAlchemy)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this structure?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each layer has one responsibility&lt;/li&gt;
&lt;li&gt;Easy to test (mock any layer)&lt;/li&gt;
&lt;li&gt;Easy to swap implementations&lt;/li&gt;
&lt;li&gt;Scales well&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📝 Quick Example:  User Registration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. API receives request
&lt;/span&gt;&lt;span class="nd"&gt;@router.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/register&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;UserResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UserCreateDTO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Service applies business logic
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&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;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UserCreateDTO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_by_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Email exists&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Repository talks to database
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&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;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UserCreateDTO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                   &lt;span class="n"&gt;hashed_password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;hash_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean, testable, maintainable. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Use as template (click button on GitHub)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Clone your repo&lt;/span&gt;
git clone your-new-repo

&lt;span class="c"&gt;# 3. Setup&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# 4. Configure&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env

&lt;span class="c"&gt;# 5. Run&lt;/span&gt;
make dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="http://localhost:8000/docs" rel="noopener noreferrer"&gt;http://localhost:8000/docs&lt;/a&gt; - you have a working API with auth!&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Developer Tools
&lt;/h2&gt;

&lt;p&gt;Everything is configured.  Just use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make format   &lt;span class="c"&gt;# Black + isort&lt;/span&gt;
make lint     &lt;span class="c"&gt;# Ruff + MyPy&lt;/span&gt;
make &lt;span class="nb"&gt;test&lt;/span&gt;     &lt;span class="c"&gt;# Pytest with coverage&lt;/span&gt;
make security &lt;span class="c"&gt;# Bandit + Safety&lt;/span&gt;
make docker-up &lt;span class="c"&gt;# Start everything&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔐 Security Built-In
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JWT tokens (short-lived access + refresh)&lt;/li&gt;
&lt;li&gt;Password hashing (bcrypt)&lt;/li&gt;
&lt;li&gt;Security scanning (Bandit, Safety)&lt;/li&gt;
&lt;li&gt;Pre-commit hooks prevent issues&lt;/li&gt;
&lt;li&gt;CORS configured&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Documentation
&lt;/h2&gt;

&lt;p&gt;Not just a README.  Actual guides: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usage Guide&lt;/strong&gt; (300+ lines) - How to develop, test, deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Doc&lt;/strong&gt; - Why decisions were made&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contributing Guide&lt;/strong&gt; - How to contribute&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎁 What You Get
&lt;/h2&gt;

&lt;p&gt;Skip all the boring setup: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ No more "how do I structure this?"&lt;/li&gt;
&lt;li&gt;❌ No more configuring linting tools&lt;/li&gt;
&lt;li&gt;❌ No more setting up auth from scratch&lt;/li&gt;
&lt;li&gt;❌ No more writing Docker files&lt;/li&gt;
&lt;li&gt;❌ No more CI/CD configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Just start building features. &lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Why Another Boilerplate?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Most boilerplates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flat structure (everything in one place)&lt;/li&gt;
&lt;li&gt;Minimal docs&lt;/li&gt;
&lt;li&gt;Basic auth (if any)&lt;/li&gt;
&lt;li&gt;No tests&lt;/li&gt;
&lt;li&gt;No dev tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This one:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean architecture&lt;/li&gt;
&lt;li&gt;Comprehensive docs&lt;/li&gt;
&lt;li&gt;Complete auth system&lt;/li&gt;
&lt;li&gt;Full test suite&lt;/li&gt;
&lt;li&gt;All dev tools configured&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Alwil17/fastapi-boilerplate" rel="noopener noreferrer"&gt;Alwil17/fastapi-boilerplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click "Use this template" → Start building in minutes. &lt;/p&gt;




&lt;p&gt;⭐ If you find it useful, give it a star on GitHub! &lt;/p&gt;

&lt;p&gt;Questions? Drop them below! 👇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt; FastAPI • SQLAlchemy • PostgreSQL • Docker • JWT • Pytest • GitHub Actions&lt;/p&gt;

&lt;h1&gt;
  
  
  Python #FastAPI #CleanArchitecture #Boilerplate
&lt;/h1&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Automate GitHub like a pro: Build your own bot with TypeScript and Serverless</title>
      <dc:creator>Jean-Gaël</dc:creator>
      <pubDate>Tue, 01 Jul 2025 19:48:07 +0000</pubDate>
      <link>https://dev.to/alwil17/automate-github-like-a-pro-build-your-own-bot-with-typescript-and-serverless-58fg</link>
      <guid>https://dev.to/alwil17/automate-github-like-a-pro-build-your-own-bot-with-typescript-and-serverless-58fg</guid>
      <description>&lt;p&gt;Maintaining a repo is more than just writing code.&lt;br&gt;&lt;br&gt;
You label issues, respond to PRs… and somehow keep track of all the &lt;code&gt;// TODO&lt;/code&gt; comments scattered across the codebase.&lt;/p&gt;

&lt;p&gt;I got tired of juggling all this manually. So I built a bot.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Meet &lt;em&gt;AutoMaintainer-bot&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;It’s a lightweight GitHub App built with &lt;a href="https://probot.github.io/" rel="noopener noreferrer"&gt;Probot&lt;/a&gt; and deployed serverlessly on &lt;a href="https://cloud.google.com/functions/" rel="noopener noreferrer"&gt;GCF&lt;/a&gt;. Here's what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏷️ Automatically labels issues based on their content
&lt;/li&gt;
&lt;li&gt;💬 Welcomes new contributors when they open their first issue
&lt;/li&gt;
&lt;li&gt;📌 Scans code for &lt;code&gt;// TODO:&lt;/code&gt; and creates issues for them
&lt;/li&gt;
&lt;li&gt;📦 Runs entirely serverless — zero infrastructure needed
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yes, it works across multiple repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Tech stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; for clean, typed logic
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Probot&lt;/strong&gt; to handle GitHub events with ease
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud run function&lt;/strong&gt; for instant serverless deployment
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub App&lt;/strong&gt; with custom permissions
&lt;/li&gt;
&lt;li&gt;Optional: &lt;strong&gt;YAML config&lt;/strong&gt; to tweak behavior per repo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Why this matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automating boring tasks = more time to build&lt;/li&gt;
&lt;li&gt;Improves contributor experience&lt;/li&gt;
&lt;li&gt;Encourages TODO discipline&lt;/li&gt;
&lt;li&gt;Serverless = no ops burden&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 Open-source project
&lt;/h3&gt;

&lt;p&gt;You can find the full bot code here:&lt;br&gt;
👉 &lt;a href="https://github.com/Alwil17/automaintainer-bot" rel="noopener noreferrer"&gt;https://github.com/Alwil17/automaintainer-bot&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>programming</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>SecurePasswordCrypt: Secure AES-GCM Encryption &amp; Password Hashing for .NET Projects</title>
      <dc:creator>Jean-Gaël</dc:creator>
      <pubDate>Sun, 06 Apr 2025 05:02:38 +0000</pubDate>
      <link>https://dev.to/alwil17/securepasswordcrypt-secure-aes-gcm-encryption-password-hashing-for-net-projects-kap</link>
      <guid>https://dev.to/alwil17/securepasswordcrypt-secure-aes-gcm-encryption-password-hashing-for-net-projects-kap</guid>
      <description>&lt;p&gt;Managing secrets—connection strings, API keys, user passwords—can quickly become a headache, especially when you need to ship background jobs, microservices or CI/CD pipelines. Plaintext secrets in code or configuration are a liability.&lt;/p&gt;

&lt;p&gt;Enter SecurePasswordCrypt, a lightweight, self-contained .NET library that brings together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 &lt;strong&gt;AES-GCM&lt;/strong&gt; encryption/decryption (authenticated encryption)&lt;/li&gt;
&lt;li&gt;🧂 &lt;strong&gt;PBKDF2 (Rfc2898)&lt;/strong&gt; key derivation with 100,000 iterations&lt;/li&gt;
&lt;li&gt;🔑 &lt;strong&gt;SHA-256-based&lt;/strong&gt; password hashing and constant-time verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This package helps you store, transport and verify secrets safely in any &lt;strong&gt;.NET&lt;/strong&gt; application—console, web, Azure Function, background worker… even within your CI/CD pipeline.&lt;/p&gt;

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

&lt;p&gt;Install directly from NuGet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package SecurePasswordCrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or browse the package page: &lt;a href="https://www.nuget.org/packages/SecurePasswordCrypt" rel="noopener noreferrer"&gt;Nuget.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grab the latest source or contribute on GitHub: &lt;a href="https://github.com/Alwil17/SecurePasswordCrypt" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Quick Start&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Encrypt / Decrypt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;SecurePasswordCrypt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"MySuperSecretValue"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;masterKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"UltraSecureMasterKey123"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Encrypt&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cipherText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CryptoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;masterKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Decrypt&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;plainText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CryptoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cipherText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;masterKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plainText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "MySuperSecretValue"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hash / Verify Passwords
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Hash user password for storage&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;userPwd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"UserPassword!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;storedHash&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CryptoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HashPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userPwd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Later, verify login&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isValid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CryptoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;VerifyPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"UserPassword!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;storedHash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PBKDF2&lt;/strong&gt; derives a strong 256-bit key from your password + random salt (16 bytes). 100,000 iterations slow down brute-force.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AES-GCM&lt;/strong&gt; uses that key to encrypt data with:

&lt;ul&gt;
&lt;li&gt;96-bit random nonce&lt;/li&gt;
&lt;li&gt;128-bit authentication tag (detects tampering)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The encrypted payload is packaged as Base64:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; salt | nonce | tag | ciphertext &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;For password hashing, the library generates a new salt and stores:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; salt + derivedKey &lt;span class="o"&gt;]&lt;/span&gt; as Base64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Constant-time comparison&lt;/strong&gt; prevents timing attacks when verifying.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Integration Tips&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class Library&lt;/strong&gt;: Reference the NuGet package or add as project reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt;: Keep your master key in a secure vault (Azure Key Vault, AWS Secrets Manager, HashiCorp Vault). Retrieve it at runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Strings&lt;/strong&gt;: Encrypt your DB password, store the cipher in config, decrypt on startup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt;: Combine with GitHub Actions or Azure Pipelines to encrypt secrets and publish packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Contribute &amp;amp; Feedback&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issues &amp;amp; PRs&lt;/strong&gt;: &lt;a href="https://github.com/Alwil17/SecurePasswordCrypt" rel="noopener noreferrer"&gt;https://github.com/Alwil17/SecurePasswordCrypt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature Requests&lt;/strong&gt;: Open an issue and describe your use case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stars &amp;amp; Follows&lt;/strong&gt;: Encouraged!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy coding, and may your secrets stay secret! 🔐&lt;/p&gt;

&lt;p&gt;Published on &lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt; by Alwil17&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introducing RatingAPI - Scalable, Secure &amp; Open Source!</title>
      <dc:creator>Jean-Gaël</dc:creator>
      <pubDate>Tue, 01 Apr 2025 04:51:56 +0000</pubDate>
      <link>https://dev.to/alwil17/introducing-ratingapi-scalable-secure-open-source-1l3j</link>
      <guid>https://dev.to/alwil17/introducing-ratingapi-scalable-secure-open-source-1l3j</guid>
      <description>&lt;p&gt;Hey Dev.to Community! 👋I'm excited to introduce my lightweight RatingAPI, a FastAPI-based backend designed for scalability, security, and high performance. Whether you're building a startup-grade application or just exploring new backend architectures, this project has everything you need! 🎯&lt;/p&gt;

&lt;p&gt;🔥 Key Features&lt;/p&gt;

&lt;p&gt;✅ FastAPI-powered - High performance &amp;amp; async-ready!&lt;br&gt;
✅ JWT Authentication - Secure user authentication &amp;amp; role management 🔐&lt;br&gt;
✅ Database Optimization - PostgreSQL with best practices 🚀&lt;br&gt;
✅ CI/CD Ready - Automated workflows using GitHub Actions 🤖&lt;br&gt;
✅ Monitoring &amp;amp; Logging - Integrated Prometheus, Grafana, and structured logging 📊&lt;br&gt;
✅ Scalability - Supports Docker &amp;amp; Kubernetes for containerized&lt;br&gt;
✅ Security &amp;amp; Compliance - Regular vulnerability scanning &amp;amp; best security practices 🛡️&lt;/p&gt;

&lt;p&gt;📌 How to Get Started&lt;/p&gt;

&lt;p&gt;Clone the repo and set up your environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/Alwil17/rating-api.git
cd rating-api
cp .env.example .env
pip install -r requirements.txt
uvicorn app.main:app --reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access the API Docs at: &lt;code&gt;http://localhost:8000/docs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🌍 Contribute &amp;amp; Join the Community&lt;/p&gt;

&lt;p&gt;We're looking for contributors! If you're into FastAPI, DevOps, or Security, check out the issues labeled "good first issue" and start contributing. 💡&lt;/p&gt;

&lt;p&gt;🔗 GitHub Repo: &lt;a href="https://github.com/Alwil17/rating-api" rel="noopener noreferrer"&gt;https://github.com/Alwil17/rating-api&lt;/a&gt;&lt;br&gt;
💬 Join the Discussion: &lt;a href="https://github.com/Alwil17/rating-api/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 Let's build something awesome together! Drop your thoughts, feedback, and questions in the comments. 👇&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>opensource</category>
      <category>github</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
