<?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: Evgenii Zinner</title>
    <description>The latest articles on DEV Community by Evgenii Zinner (@evgenii_zinner).</description>
    <link>https://dev.to/evgenii_zinner</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%2F1903224%2F3c77445f-e972-493c-a96a-e4962b3c7bb2.jpg</url>
      <title>DEV Community: Evgenii Zinner</title>
      <link>https://dev.to/evgenii_zinner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evgenii_zinner"/>
    <language>en</language>
    <item>
      <title>Technical Architecture of EZ EDGE CMS</title>
      <dc:creator>Evgenii Zinner</dc:creator>
      <pubDate>Tue, 17 Mar 2026 20:58:02 +0000</pubDate>
      <link>https://dev.to/evgenii_zinner/technical-architecture-of-ez-edge-cms-1hj0</link>
      <guid>https://dev.to/evgenii_zinner/technical-architecture-of-ez-edge-cms-1hj0</guid>
      <description>&lt;p&gt;I developed &lt;a href="https://ez-edge-cms.ezinner.com/" rel="noopener noreferrer"&gt;EZ EDGE CMS&lt;/a&gt; with a specific goal: to create a content management system that runs entirely on Cloudflare Workers without the bloat of traditional frameworks. By moving styling, image processing, and SEO logic to the edge, I’ve eliminated the need for origin servers and complex build pipelines.&lt;/p&gt;

&lt;p&gt;Here is the technical breakdown of the engine and the trade-offs I made to keep it fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Zero-CSS Middleware (with Theme Constraints)
&lt;/h2&gt;

&lt;p&gt;EZ EDGE CMS has no static CSS files. I integrated a Just-In-Time (JIT) &lt;a href="https://unocss.dev/" rel="noopener noreferrer"&gt;UnoCSS&lt;/a&gt; middleware that runs at the edge. When a request is made:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The middleware scans the HTML content.&lt;/li&gt;
&lt;li&gt;It generates the minimal utility classes required for that specific page.&lt;/li&gt;
&lt;li&gt;It injects the CSS directly into the .
The Restriction: To maintain this performance, you cannot upload custom CSS files. You are limited to built-in themes where you can only customize colors and fonts. This ensures the JIT engine stays lightweight and prevents slowing down the edge isolate.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Edge-Native Image Processing
&lt;/h2&gt;

&lt;p&gt;Instead of relying on external S3 buckets or heavy image transformation services, I handle assets directly within the Worker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebP Conversion &amp;amp; Resizing: When you upload an image, the CMS automatically resizes it and converts it to WebP format. This ensures maximum compression and faster loading times for end-users.&lt;/li&gt;
&lt;li&gt;KV Binary Storage: Images are stored as Uint8Array binaries in Cloudflare KV. They are served from the same edge location as your content.&lt;/li&gt;
&lt;li&gt;Garbage Collection: When you save a page, I've implemented logic that identifies "orphaned" images (assets no longer used in your content) and deletes them from KV to keep your storage costs at zero or near-zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Automated SEO &amp;amp; JSON-LD Graphs
&lt;/h2&gt;

&lt;p&gt;I dont like to manually manage metadata, so I automated the SEO layer using Schema.org JSON-LD graphs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated SEO Layer: Replaced manual metadata management with a dynamic system built on Schema.org JSON-LD graphs to provide search engines with a high-accuracy site map.&lt;/li&gt;
&lt;li&gt;Persona Integration: Automatically injects identity data (Organization/Owner) directly into the page structure.&lt;/li&gt;
&lt;li&gt;Dynamic Breadcrumbs: Generates a real-time BreadcrumbList hierarchy that maps the page’s exact position.&lt;/li&gt;
&lt;li&gt;Automated Asset Delivery: Serves optimized Open Graph (OG) images and tailored meta tags without manual updates.&lt;/li&gt;
&lt;li&gt;Structured Metadata: Pulls standard SEO values from the CMS editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Script Injection for Interactivity
&lt;/h2&gt;

&lt;p&gt;Since the themes are constrained, I added the ability to inject Global and Page-Related Scripts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global Scripts: Useful for adding analytics (like Google Analytics or Plausible) or sitewide chat widgets.&lt;/li&gt;
&lt;li&gt;Page Scripts: Allows you to add specific functionality to a single page without bloating the rest of the site.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Block-Based Editor
&lt;/h2&gt;

&lt;p&gt;To ensure the edge engine receives clean, predictable data, I integrated &lt;a href="https://editorjs.io/" rel="noopener noreferrer"&gt;Editor.js&lt;/a&gt;. Unlike traditional WYSIWYG editors we store and parse a clean JSON structure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured Data: The CMS stores content as JSON blocks, which are then parsed at the edge into semantic HTML.&lt;/li&gt;
&lt;li&gt;Clean Output: This ensures that the JIT CSS engine (mentioned below) only scans valid, structured content, reducing processing overhead.&lt;/li&gt;
&lt;li&gt;Extensibility: I’ve plan to customize editor to handle specific blocks that sync perfectly with the edge-native theme.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Current Technical Restrictions
&lt;/h2&gt;

&lt;p&gt;Being honest about the limitations is part of the "Edge-Native" philosophy. If you use EZ EDGE CMS, you need to be aware of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design Limits: You cannot build a "from-scratch" custom layout. You must work within the parameters of my optimized built-in themes (Colors/Fonts only).&lt;/li&gt;
&lt;li&gt;25MB Value Limit: Cloudflare KV has a hard limit of 25MB per entry. This applies to individual pages and images.&lt;/li&gt;
&lt;li&gt;Propagation Delay: While the updateQueue prevents write errors, it can still take up to 60 seconds for a new post to appear in every single Cloudflare data center globally due to KV's native consistency model.&lt;/li&gt;
&lt;li&gt;Limitation for distributed teams: Currently recommended for solo work; without Durable Objects for atomic locking, simultaneous editing by multiple users is not possible to avoid data loss due to "last write wins" conflicts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is in a POC stage now, I need some time to work with it to shape a finalized vision and fix bugs, but i welcome everyone who willing to try or contribute&lt;br&gt;
See it in action: &lt;a href="https://ez-edge-cms.ezinner.com/" rel="noopener noreferrer"&gt;First website made on EZ EDGE CMS&lt;/a&gt;&lt;br&gt;
Explore the Code: &lt;a href="https://github.com/Evgenii-Zinner/ez-edge-cms" rel="noopener noreferrer"&gt;Source code&lt;/a&gt;&lt;br&gt;
Try it yourself: &lt;a href="https://deploy.workers.cloudflare.com/?url=https://github.com/Evgenii-Zinner/ez-edge-cms" rel="noopener noreferrer"&gt;Deploy to Cloudflare Workers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cloudnative</category>
      <category>cms</category>
    </item>
    <item>
      <title>ez_commit: A Rust CLI for AI-Powered Conventional Commits</title>
      <dc:creator>Evgenii Zinner</dc:creator>
      <pubDate>Thu, 05 Feb 2026 18:44:20 +0000</pubDate>
      <link>https://dev.to/evgenii_zinner/ezcommit-a-rust-cli-for-ai-powered-conventional-commits-44on</link>
      <guid>https://dev.to/evgenii_zinner/ezcommit-a-rust-cli-for-ai-powered-conventional-commits-44on</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;ez_commit&lt;/code&gt; is an interactive Rust-based CLI designed to take the friction out of writing &lt;strong&gt;Conventional Commits&lt;/strong&gt;. It combines a compact Terminal User Interface (TUI) for selecting and staging files with an AI-assisted generation engine.&lt;/p&gt;

&lt;p&gt;The tool enforces a &lt;strong&gt;human-in-the-loop&lt;/strong&gt; model: Copilot suggests a commit draft based on your staged changes, and you review or edit it before it ever touches your git history. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built this:&lt;/strong&gt; Maintaining a clean, consistent commit history is vital for changelogs and team collaboration, but it’s often the first thing to slide when developers are in a rush. &lt;code&gt;ez_commit&lt;/code&gt; makes doing the "right thing" the fastest path.&lt;/p&gt;

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

&lt;p&gt;You can find the full source code and installation instructions here:&lt;/p&gt;

&lt;p&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/Evgenii-Zinner" rel="noopener noreferrer"&gt;
        Evgenii-Zinner
      &lt;/a&gt; / &lt;a href="https://github.com/Evgenii-Zinner/ez_commit" rel="noopener noreferrer"&gt;
        ez_commit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      CLI tool for fast commiting using GitHub copilot
    &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;ez_commit&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Interactive CLI tool for generating conventional commit messages with AI assistance.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A simple, fast, and human-in-the-loop commit workflow. Select files, let AI analyze your changes, review the message, and commit—all from the terminal.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;✨ &lt;strong&gt;Interactive file selection&lt;/strong&gt; - TUI-based multi-select of changed files&lt;br&gt;
🤖 &lt;strong&gt;AI-powered messages&lt;/strong&gt; - GitHub Copilot integration for smart commit messages&lt;br&gt;
📝 &lt;strong&gt;Conventional Commits&lt;/strong&gt; - Automatically formats to &lt;code&gt;type(scope): description&lt;/code&gt;&lt;br&gt;
✏️ &lt;strong&gt;Manual review&lt;/strong&gt; - Edit the generated message before committing&lt;br&gt;
⚡ &lt;strong&gt;Fallback analyzer&lt;/strong&gt; - Works without Copilot with built-in smart analysis&lt;br&gt;
🔍 &lt;strong&gt;Verbose mode&lt;/strong&gt; - Debug details with &lt;code&gt;-v&lt;/code&gt; flag&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Build&lt;/span&gt;
cargo build --release

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Run&lt;/span&gt;
./target/release/ez_commit

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; With verbose output&lt;/span&gt;
./target/release/ez_commit -v&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Select files&lt;/strong&gt; - Arrow keys to navigate, Space to toggle, Enter to confirm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review message&lt;/strong&gt; - AI generates a commit message with summary + bullet points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit (optional)&lt;/strong&gt; - Your editor opens for final tweaks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit&lt;/strong&gt; - Changes…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Evgenii-Zinner/ez_commit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&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%2Fvfi3v1kg17zpco5m35e1.png" 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%2Fvfi3v1kg17zpco5m35e1.png" alt="*The interactive TUI for staging files.*"&gt;&lt;/a&gt;&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%2Fbkjefqg8vj5v8ccfyw8t.png" 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%2Fbkjefqg8vj5v8ccfyw8t.png" alt="*The AI-assisted commit generation in action.*"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;I developed this project using an &lt;strong&gt;agentic loop&lt;/strong&gt;, where GitHub Copilot CLI handled much of the heavy lifting. My workflow looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Initial Design:&lt;/strong&gt; I started with a &lt;code&gt;README.md&lt;/code&gt; acting as a design doc. I described the problem, the required features, and my choice of Rust.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Agentic Cycle:&lt;/strong&gt; I used Copilot CLI to generate boilerplate and logic from prompts. It was a cycle of: &lt;em&gt;Generate → Build → Copilot read Errors → Fix.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Fast Prototyping:&lt;/strong&gt; Copilot produced a working prototype remarkably fast. I spent roughly &lt;strong&gt;three hours total&lt;/strong&gt; on this project—including thinking, waiting for builds, and reviewing results.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The "Premium" Wall:&lt;/strong&gt; I wasn't read docs too thoroughly, so didn't notice that any usage of Copilot CLI count as premium calls, so i spent prompt budget really fast. &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Granularity of Feedback:&lt;/strong&gt; While Copilot is working on a file, it often reports the number of lines it is changing. However, it would be much more helpful to see the actual code diff directly in the dialogue rather than just numbers. Since it processes one file at a time, seeing the specific logic changes live would allow for much faster verification &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Overall Impression:&lt;/strong&gt; The speed of iteration is the killer feature here. Moving from a blank folder to a Rust CLI with TUI and AI integration in one afternoon felt like having a senior pair-programmer who never gets tired. And I used this tool after first iteration to create commit messages (so some errors are logged in history), it was fun experience.&lt;/p&gt;




&lt;h3&gt;
  
  
  How to Use
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;To get started with &lt;code&gt;ez_commit&lt;/code&gt; locally:&lt;/em&gt;&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;# Build the project&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--release&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Run the binary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\target\release\ez_commit.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-v, --verbose&lt;/code&gt;: See exactly what's being sent to the AI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-s, --skip-copilot&lt;/code&gt;: Use the local fallback analyzer if you're offline or out of credits.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d, --diff-limit&lt;/code&gt;: Control how much code context is sent to the model.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Custom Domain Emails for free</title>
      <dc:creator>Evgenii Zinner</dc:creator>
      <pubDate>Wed, 03 Dec 2025 22:49:13 +0000</pubDate>
      <link>https://dev.to/evgenii_zinner/custom-domain-emails-for-free-6o5</link>
      <guid>https://dev.to/evgenii_zinner/custom-domain-emails-for-free-6o5</guid>
      <description>&lt;p&gt;Can’t pay for a full Google Workspace account just to send and receive professional emails from your custom domain? You don't have to. We can use Cloudflare for inbound routing and Gmail's SMTP for outbound sending. This guide provides the complete, two-step stack to get your custom address, &lt;a href="mailto:info@example.com"&gt;info@example.com&lt;/a&gt;, working flawlessly within your personal Gmail inbox.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Part 1: Setting Up the Receiving Funnel (Cloudflare Email Routing)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Before you can send mail from your custom address, you must configure your domain to correctly receive the verification email Google will send.&lt;/p&gt;

&lt;p&gt;Goal: Forward all mail sent to &lt;a href="mailto:info@example.com"&gt;info@example.com&lt;/a&gt; to your personal &lt;a href="mailto:your-name@gmail.com"&gt;your-name@gmail.com&lt;/a&gt; inbox.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://dash.cloudflare.com/email/routing/overview" rel="noopener noreferrer"&gt;Access Email Routing&lt;/a&gt;: Log in to your Cloudflare dashboard, select your domain, and navigate to Email &amp;gt; Email Routing.
&lt;/li&gt;
&lt;li&gt;Enable Email Routing: If this is your first time, select Enable Email Routing. Confirm to automatically add the necessary MX and TXT DNS records to your zone. These records tell the internet that Cloudflare handles your domain's incoming mail.
&lt;/li&gt;
&lt;li&gt;Create Custom Address: Go to the Routes tab and click Create address.
&lt;/li&gt;
&lt;li&gt;Define the Rule:

&lt;ul&gt;
&lt;li&gt;In the Custom address field, enter the prefix of your professional address (e.g., info or ez).
&lt;/li&gt;
&lt;li&gt;For the Action, ensure Send to an email is selected.
&lt;/li&gt;
&lt;li&gt;In the Destination field, enter your full personal email address (e.g., &lt;a href="mailto:your-name@gmail.com"&gt;your-name@gmail.com&lt;/a&gt;).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save and Verify: Select Save. Cloudflare will immediately send a verification email to the destination address you provided. You must open this email and click the verification link to activate the forwarding rule.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Part 2: Configuring the Sending Mask (Gmail SMTP via App Password)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;With receiving mail handled, we now configure the sending side using a security measure required by Google: a dedicated App Password.&lt;/p&gt;

&lt;p&gt;Prerequisites: The Security KeyYou must have 2-Step Verification (2FA) enabled for your Google Account to create the unique App Password.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Generate an App Password&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to your &lt;a href="https://myaccount.google.com/security" rel="noopener noreferrer"&gt;Google Account's Security&lt;/a&gt; settings.
&lt;/li&gt;
&lt;li&gt;In the Search Google Account field type "&lt;em&gt;App passwords&lt;/em&gt;"
&lt;/li&gt;
&lt;li&gt;Create a new one, name it something clear, like "Cloudflare SMTP."
&lt;/li&gt;
&lt;li&gt;Click Create.
&lt;/li&gt;
&lt;li&gt;Crucially, copy the 16-character password immediately. You will only see it once.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Gmail Configuration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Add the Address to Gmail's "Send mail as" settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Gmail. Click the Settings gear icon (⚙️) and select See all settings.
&lt;/li&gt;
&lt;li&gt;Go to the &lt;a href="https://mail.google.com/mail/u/0/#settings/accounts" rel="noopener noreferrer"&gt;Accounts and Import&lt;/a&gt; tab.
&lt;/li&gt;
&lt;li&gt;In the "Send mail as" section, click Add another email address. Popup window will appear.
&lt;/li&gt;
&lt;li&gt;Enter your desired sending name and your custom address (e.g., &lt;a href="mailto:info@example.com"&gt;info@example.com&lt;/a&gt;).
&lt;/li&gt;
&lt;li&gt;Configure SMTP Settings: Point the connection back to Google's server using the App Password for authorization.

&lt;ul&gt;
&lt;li&gt;SMTP Server: smtp.gmail.com
&lt;/li&gt;
&lt;li&gt;Port: 587
&lt;/li&gt;
&lt;li&gt;Username: Your full Gmail address (&lt;a href="mailto:your-name@gmail.com"&gt;your-name@gmail.com&lt;/a&gt;)
&lt;/li&gt;
&lt;li&gt;Password: The 16-character App Password from Step 1.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Ensure Secured connection using TLS is selected. Click Add Account.
&lt;/li&gt;

&lt;li&gt;Google will send a confirmation email to your custom address (&lt;a href="mailto:info@example.com"&gt;&lt;/a&gt;&lt;a href="mailto:info@example.com"&gt;info@example.com&lt;/a&gt;). This email will arrive in your Gmail inbox because of the Cloudflare setup in Part 1.
&lt;/li&gt;

&lt;li&gt;Open the email and click the confirmation link.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Finalizing Your Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reply Default: In Gmail's Settings &amp;gt; &lt;a href="https://mail.google.com/mail/u/0/#settings/accounts" rel="noopener noreferrer"&gt;Accounts and Import&lt;/a&gt;, select "Reply from the same address the message was sent to." You can pick a new one as default in the same section.
&lt;/li&gt;
&lt;li&gt;Update SPF Record: To ensure your emails don't end up in spam, update your domain's SPF record in &lt;a href="https://dash.cloudflare.com/dns/records" rel="noopener noreferrer"&gt;Cloudflare DNS&lt;/a&gt; to include Google's mail servers.
&lt;/li&gt;
&lt;li&gt;The TXT record content should be:
&lt;/li&gt;
&lt;li&gt;v=spf1 include:_spf.mx.cloudflare.net include:_spf.google.com ~all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once set up, you will be able to select your custom address from the "From" dropdown menu when composing any new email.&lt;/p&gt;

&lt;p&gt;Congratulations, now you have a professional-looking email with the cost of only a domain name!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built an app and got tired of manual avatar struggles:
Inconsistent colors for the same user.
Two different users getting the same color.
The fix? Use a hash of the name to generate a color. 

https://pub.dev/packages/ez_circle_avatar</title>
      <dc:creator>Evgenii Zinner</dc:creator>
      <pubDate>Sat, 22 Nov 2025 02:31:52 +0000</pubDate>
      <link>https://dev.to/evgenii_zinner/i-built-an-app-and-got-tired-of-manual-avatar-struggles-inconsistent-colors-for-the-same-user-two-49mo</link>
      <guid>https://dev.to/evgenii_zinner/i-built-an-app-and-got-tired-of-manual-avatar-struggles-inconsistent-colors-for-the-same-user-two-49mo</guid>
      <description>&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__cover"&gt;
          &lt;a href="https://pub.dev/packages/ez_circle_avatar" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpub.dev%2Fstatic%2Fhash-19reohe7%2Fimg%2Fpub-dev-icon-cover-image.png" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://pub.dev/packages/ez_circle_avatar" rel="noopener noreferrer" class="c-link"&gt;
            ez_circle_avatar | Flutter package
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A defensive, customizable avatar widget that automatically generates initials and colors from names.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpub.dev%2Fstatic%2Fhash-19reohe7%2Fimg%2Fflutter-logo-32x32.png" width="32" height="32"&gt;
          pub.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
