<?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: S. Afsan</title>
    <description>The latest articles on DEV Community by S. Afsan (@writewithafsan).</description>
    <link>https://dev.to/writewithafsan</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%2F3928364%2F530bf0e3-929d-4036-8331-8f6a5417565b.jpg</url>
      <title>DEV Community: S. Afsan</title>
      <link>https://dev.to/writewithafsan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/writewithafsan"/>
    <language>en</language>
    <item>
      <title>How I Manage All My Claude Code Sessions from a Single Terminal</title>
      <dc:creator>S. Afsan</dc:creator>
      <pubDate>Wed, 03 Jun 2026 06:37:01 +0000</pubDate>
      <link>https://dev.to/writewithafsan/how-i-manage-all-my-claude-code-sessions-from-a-single-terminal-ea5</link>
      <guid>https://dev.to/writewithafsan/how-i-manage-all-my-claude-code-sessions-from-a-single-terminal-ea5</guid>
      <description>&lt;p&gt;I run multiple Claude Code sessions all day — one per feature, one per service, sometimes five at once.&lt;/p&gt;

&lt;p&gt;Every session was asking me for permission in its own terminal. I'd miss requests buried in a background tab. I'd switch windows mid-thought just to approve a &lt;code&gt;git status&lt;/code&gt;. I'd lose context constantly.&lt;/p&gt;

&lt;p&gt;And there was no single place to see what Claude was doing across all of them.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Gatekeeper&lt;/strong&gt; — a TUI daemon that intercepts every Claude Code tool call and routes it to one unified approval dashboard.&lt;/p&gt;

&lt;h2&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%2F2y01mwv79za0rfncfwen.gif" alt=" " width="720" height="372"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The dashboard
&lt;/h2&gt;

&lt;p&gt;Three panes, one terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Left&lt;/strong&gt; — all active Claude sessions, with status badges: &lt;code&gt;[auto]&lt;/code&gt; means auto-approve is on, &lt;code&gt;[linked]&lt;/code&gt; means it's wired to a terminal window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middle&lt;/strong&gt; — pending permission requests with an age timer so you know what's been waiting longest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right&lt;/strong&gt; — full request detail, danger warnings, and the numbered approval menu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every Claude Code tool call — &lt;code&gt;Bash&lt;/code&gt;, &lt;code&gt;Edit&lt;/code&gt;, &lt;code&gt;Write&lt;/code&gt;, &lt;code&gt;Agent&lt;/code&gt; — passes through a &lt;code&gt;PreToolUse&lt;/code&gt; hook before executing. The hook connects to Gatekeeper's Unix socket, sends the request, and blocks. Gatekeeper shows it in the UI. When you decide, the answer travels back and Claude proceeds or stops.&lt;/p&gt;




&lt;h2&gt;
  
  
  Approving requests
&lt;/h2&gt;

&lt;p&gt;The menu in the right pane mirrors Claude Code's own style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1  Allow once
2  Always allow
3  Deny
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;↑&lt;/code&gt;/&lt;code&gt;↓&lt;/code&gt; moves the cursor, &lt;code&gt;Enter&lt;/code&gt; confirms. Or just press &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt; directly. &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;D&lt;/code&gt; are quick shortcuts for allow/deny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2 — always allow&lt;/strong&gt; — is where it gets useful. Choosing it saves a persistent rule so the same request never surfaces again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Bash&lt;/code&gt; → saves the command pattern (e.g. &lt;code&gt;npm run *&lt;/code&gt;) to config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Edit&lt;/code&gt; / &lt;code&gt;Write&lt;/code&gt; → saves the directory to an allowlist&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Agent&lt;/code&gt; → enables auto-approve for that session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule is written both to Gatekeeper's own config &lt;em&gt;and&lt;/em&gt; to Claude Code's &lt;code&gt;settings.json&lt;/code&gt; allowlist — so Claude Code itself won't prompt for it either.&lt;/p&gt;




&lt;h2&gt;
  
  
  Auto-approve sessions
&lt;/h2&gt;

&lt;p&gt;Press &lt;code&gt;A&lt;/code&gt; in the Sessions pane to mark a session as trusted. It shows &lt;code&gt;[auto]&lt;/code&gt; — routine tool calls pass silently without appearing in the queue.&lt;/p&gt;

&lt;p&gt;But some things &lt;strong&gt;always&lt;/strong&gt; require manual approval, no matter what:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;What's blocked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File deletion&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;rmdir&lt;/code&gt;, &lt;code&gt;shred&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote access&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;scp&lt;/code&gt;, &lt;code&gt;rsync&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privilege escalation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;su&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destructive git&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;push --force&lt;/code&gt;, &lt;code&gt;reset --hard&lt;/code&gt;, &lt;code&gt;clean -f&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;terraform apply/destroy&lt;/code&gt;, &lt;code&gt;kubectl delete&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sensitive paths&lt;/td&gt;
&lt;td&gt;Writes to &lt;code&gt;/etc/&lt;/code&gt;, &lt;code&gt;~/.ssh/&lt;/code&gt;, &lt;code&gt;~/.aws/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read-only commands — &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;git status&lt;/code&gt;, &lt;code&gt;npm install&lt;/code&gt; — always pass through freely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Linking sessions to terminals
&lt;/h2&gt;

&lt;p&gt;This is the feature that unlocks everything else.&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;L&lt;/code&gt; on any session in the Sessions pane. An overlay appears — switch to the Claude terminal tab (alt+tab, click, whatever), and Gatekeeper detects the focus change and links that session to that window automatically. The session shows &lt;code&gt;[linked]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Links persist across restarts in &lt;code&gt;~/.claude/perm-window-map.json&lt;/code&gt;. You link once, it stays.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sending messages from Gatekeeper
&lt;/h2&gt;

&lt;p&gt;Once a session is linked, press &lt;code&gt;M&lt;/code&gt;, type your message, press &lt;code&gt;Enter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Gatekeeper injects the text into the linked Claude terminal using X11 XTEST — it appears &lt;strong&gt;and submits automatically&lt;/strong&gt;, exactly as if you typed it and pressed Enter there. You never leave the Gatekeeper terminal.&lt;/p&gt;

&lt;p&gt;This solves a problem I didn't know I had until I built it: Claude pauses mid-task and asks a clarifying question — &lt;code&gt;A / B / C?&lt;/code&gt;. Normally you'd switch to that terminal, answer, switch back. With Gatekeeper, you just press &lt;code&gt;M&lt;/code&gt; and type from wherever you are.&lt;/p&gt;

&lt;p&gt;Useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answering Claude's mid-task questions without switching windows&lt;/li&gt;
&lt;li&gt;Explaining why you denied a request&lt;/li&gt;
&lt;li&gt;Redirecting Claude to a different approach while it waits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat: injection works when each Claude session is in its own terminal &lt;strong&gt;window&lt;/strong&gt;. If multiple sessions share one window as tabs, they share the same X11 window ID — Gatekeeper can't target a specific tab. Run each session in a new window (&lt;code&gt;kitty&lt;/code&gt;, &lt;code&gt;gnome-terminal --window&lt;/code&gt;, etc.).&lt;/p&gt;




&lt;h2&gt;
  
  
  Settings
&lt;/h2&gt;

&lt;p&gt;Press &lt;code&gt;S&lt;/code&gt; to open the settings panel. From here you can configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool types&lt;/strong&gt; — which tools (Bash, Edit, Write, Agent) Gatekeeper intercepts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bash categories&lt;/strong&gt; — how commands are classified (read-only vs. destructive vs. network, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom patterns&lt;/strong&gt; — your own allow/deny rules beyond the defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No config file spelunking. Everything is editable from inside the dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stats
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gatekeeper stats        &lt;span class="c"&gt;# today&lt;/span&gt;
gatekeeper stats 7      &lt;span class="c"&gt;# last 7 days&lt;/span&gt;
gatekeeper stats all    &lt;span class="c"&gt;# all time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;====================================================
 GATEKEEPER STATS
====================================================
  Total decisions : 177
  Auto-approved   :  16  (  9%)
  Manual reviewed : 161  ( 90%)
    allowed       : 161
    denied        :   0

  Auto-approved by session:
    b73f7ccc    7 calls
    a8ed1d57    5 calls

  Auto-approved by tool:
    Bash          11
    Edit           5
====================================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every decision is logged to &lt;code&gt;~/.claude/perm-logs/YYYY-MM-DD.log&lt;/code&gt;, one file per day, kept indefinitely. Useful for auditing what Claude did across a long session or a whole project.&lt;/p&gt;




&lt;h2&gt;
  
  
  What happens when Gatekeeper isn't running
&lt;/h2&gt;

&lt;p&gt;The hook falls back to a &lt;code&gt;Y/n&lt;/code&gt; prompt in the Claude terminal with a 30-second auto-deny. Nothing hangs, nothing silently passes. You can also set &lt;code&gt;GATEKEEPER_TIMEOUT=0&lt;/code&gt; to always use the terminal prompt for a specific session.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it's wired up
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;install.sh&lt;/code&gt; does four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installs wrapper scripts in &lt;code&gt;~/.claude/bin/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Registers the &lt;code&gt;PreToolUse&lt;/code&gt; hook in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Adds blanket &lt;code&gt;permissions.allow&lt;/code&gt; rules so Claude Code doesn't double-prompt&lt;/li&gt;
&lt;li&gt;Sets &lt;code&gt;permissions.defaultMode = "bypassPermissions"&lt;/code&gt; — disables Claude Code's built-in dialogs entirely, making Gatekeeper the &lt;strong&gt;sole&lt;/strong&gt; approval gate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point matters: Claude Code's own hardcoded prompts for sensitive paths (&lt;code&gt;/proc/&lt;/code&gt;, &lt;code&gt;/sys/&lt;/code&gt;, &lt;code&gt;~/.bashrc&lt;/code&gt;) are suppressed in &lt;code&gt;bypassPermissions&lt;/code&gt; mode. Gatekeeper handles everything instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Btocode/gatekeeper
&lt;span class="nb"&gt;cd &lt;/span&gt;gatekeeper
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &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
bash install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open a dedicated terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gatekeeper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start your Claude Code sessions anywhere — other terminals, VS Code, JetBrains. Every tool call will appear in Gatekeeper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; Linux + X11 + Python 3.11+&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I was working on a project with five Claude sessions running in parallel — one per subsystem. Each one was capable. But I was the bottleneck: constantly switching windows to approve &lt;code&gt;npm run build&lt;/code&gt; for the fifth time that hour.&lt;/p&gt;

&lt;p&gt;Gatekeeper changed that. Trusted sessions handle routine calls without interrupting me. Anything new or risky surfaces in the dashboard. I answer Claude's questions without leaving my main terminal. And at the end of the day, &lt;code&gt;gatekeeper stats&lt;/code&gt; tells me exactly what happened.&lt;/p&gt;

&lt;p&gt;It's open source. MIT licensed.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Btocode/gatekeeper" rel="noopener noreferrer"&gt;github.com/Btocode/gatekeeper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run Claude Code with multiple sessions, give it a try. And if you build tools like this — follow me, more coming.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;claudecode&lt;/code&gt; &lt;code&gt;ai&lt;/code&gt; &lt;code&gt;devtools&lt;/code&gt; &lt;code&gt;opensource&lt;/code&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to set up DKIM for Zoho Mail</title>
      <dc:creator>S. Afsan</dc:creator>
      <pubDate>Wed, 13 May 2026 04:10:26 +0000</pubDate>
      <link>https://dev.to/writewithafsan/how-to-set-up-dkim-for-zoho-mail-3a8h</link>
      <guid>https://dev.to/writewithafsan/how-to-set-up-dkim-for-zoho-mail-3a8h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href="https://mailermonk.com/guides/dkim/zoho-mail" rel="noopener noreferrer"&gt;mailermonk.com&lt;/a&gt;. Cross-posted here for reach — the canonical version lives on MailerMonk.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  About this guide
&lt;/h2&gt;

&lt;p&gt;Zoho Mail is a budget-friendly business mail platform. The DKIM step is unusual — you generate the selector inside the Zoho admin console rather than using a fixed name.&lt;/p&gt;

&lt;p&gt;DKIM (DomainKeys Identified Mail, RFC 6376) is the cryptographic signature attached to outgoing email so receivers can verify the message wasn't tampered with and that it actually came from a server authorized by your domain. To turn it on for Zoho Mail, you publish one or more DNS records at &lt;code&gt;&amp;lt;selector&amp;gt;._domainkey.&amp;lt;your-domain&amp;gt;&lt;/code&gt; containing the public key matching the private key Zoho Mail uses to sign.&lt;/p&gt;

&lt;p&gt;Most ESPs (including Zoho Mail) ask you to publish CNAME records that point at hosted keys they manage. This is preferable to publishing the raw key text yourself — when the provider rotates keys, your DNS keeps pointing to the rotated key and nothing breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish these DNS records
&lt;/h2&gt;

&lt;p&gt;Add the following record(s) to your domain's DNS zone. Most registrars (Cloudflare, Route 53, Namecheap, GoDaddy) accept values exactly as shown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host:  &amp;lt;your-selector&amp;gt;._domainkey
Type:  TXT
Value: v=DKIM1; k=rsa; p=&amp;lt;KEY_FROM_ZOHO&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Zoho asks you to choose a selector when generating the key in the Mail Admin Console (&lt;a href="https://mailadmin.zoho.com" rel="noopener noreferrer"&gt;https://mailadmin.zoho.com&lt;/a&gt; → Domains → your domain → Email Configuration → DKIM). &lt;code&gt;zoho&lt;/code&gt; is the conventional choice; once chosen, the selector is fixed for that key.&lt;/li&gt;
&lt;li&gt;Zoho generates 2048-bit keys. The TXT value will exceed the 255-character single-string limit; most DNS providers (Cloudflare, Route 53, Namecheap, GoDaddy) split this automatically when pasting. If your provider does not, wrap the value as multiple quoted strings concatenated: &lt;code&gt;"v=DKIM1; k=rsa; p=MIIBIj..." "...rest"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;After the TXT record propagates, return to the Zoho admin console and click &lt;code&gt;Verify&lt;/code&gt;. Only after Zoho validates the record will the &lt;code&gt;Enable DKIM&lt;/code&gt; button appear — publishing DNS alone does not turn on signing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where in Zoho Mail
&lt;/h2&gt;

&lt;p&gt;The DKIM configuration lives in &lt;code&gt;Zoho Mail Admin → Domains → &amp;lt;your-domain&amp;gt; → Email Configuration → DKIM&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify the records
&lt;/h2&gt;

&lt;p&gt;After the records propagate, run the DKIM Checker against your domain with each selector to confirm the public key resolves and parses correctly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT &amp;lt;selector&amp;gt;._domainkey.your-domain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zoho's DKIM verification step takes 30–60 minutes to recognize a freshly published TXT record even when DNS has propagated globally. Hitting the Verify button repeatedly does not help — wait it out and try again after an hour.&lt;/li&gt;
&lt;li&gt;If you migrate from Google Workspace to Zoho, remove Google's &lt;code&gt;_domainkey&lt;/code&gt; records during cutover or you'll have multiple DKIM selectors active and may get flagged as spoofing.&lt;/li&gt;
&lt;li&gt;EU and US Zoho accounts use different DNS hosts. &lt;code&gt;include:zoho.com&lt;/code&gt; is for global/US; EU customers must use &lt;code&gt;include:zohomail.eu&lt;/code&gt;. The DKIM record is generated regardless, but the SPF mismatch will fail alignment for some receivers (especially Outlook.com and Yahoo EU).&lt;/li&gt;
&lt;li&gt;The Zoho admin console occasionally shows the TXT value truncated in the UI. Always copy from the &lt;code&gt;Copy&lt;/code&gt; button rather than selecting text manually — manual selection often misses the trailing characters of the public key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What selector should I use for Zoho Mail DKIM?
&lt;/h3&gt;

&lt;p&gt;Zoho lets you choose any selector name when generating the key, but &lt;code&gt;zoho&lt;/code&gt; is the de-facto standard and the one Zoho's own documentation uses in examples. Once you generate the key with a given selector, the selector is fixed for that key — to change it, generate a new key with the new selector and publish a second TXT record. You can run two selectors in parallel during a rotation without breaking anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where do I find the DKIM key value in Zoho?
&lt;/h3&gt;

&lt;p&gt;Sign in at &lt;code&gt;https://mailadmin.zoho.com&lt;/code&gt; as an admin or super-admin → Domains (left menu) → click the domain you're configuring → Email Configuration → DKIM. Click &lt;code&gt;Add Selector&lt;/code&gt;, choose a name (e.g. &lt;code&gt;zoho&lt;/code&gt;), and Zoho generates the public-key TXT value. Copy it with the &lt;code&gt;Copy&lt;/code&gt; button — do not select the text manually as the UI sometimes truncates trailing characters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does Zoho's Verify button say the DKIM record is missing when &lt;code&gt;dig&lt;/code&gt; shows it's published?
&lt;/h3&gt;

&lt;p&gt;Zoho's verification probes a non-authoritative resolver that lags 30–60 minutes behind public DNS propagation. If &lt;code&gt;dig +short TXT zoho._domainkey.your-domain.com&lt;/code&gt; from a public resolver (1.1.1.1, 8.8.8.8) returns the record, the record is live — just wait an hour and click Verify again. There's nothing wrong with your DNS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Zoho Mail's DKIM with another provider's SPF and DMARC?
&lt;/h3&gt;

&lt;p&gt;Yes — DKIM, SPF, and DMARC are independent. You can sign outbound Zoho mail with DKIM while your SPF record includes multiple senders (Zoho + your CRM + your marketing tool) and your single &lt;code&gt;_dmarc&lt;/code&gt; record covers them all. DKIM alignment only requires that the &lt;code&gt;d=&lt;/code&gt; tag in the DKIM signature matches the From: header domain, which Zoho handles when you authenticate your domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Zoho DKIM key is over 255 characters — how do I publish it?
&lt;/h3&gt;

&lt;p&gt;DNS TXT records have a 255-character per-string limit, but a single TXT record can contain multiple quoted strings concatenated. Modern DNS providers (Cloudflare, Route 53, Namecheap, GoDaddy, Google Domains) handle this automatically — paste the full key as one value and they split it. For older providers that don't auto-split, manually wrap it: &lt;code&gt;"v=DKIM1; k=rsa; p=MIIBIj...first-255-chars" "...rest-of-key"&lt;/code&gt;. Receivers reassemble the strings before parsing.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take for Zoho DKIM to start working?
&lt;/h3&gt;

&lt;p&gt;Once you publish the TXT record, allow up to an hour for DNS propagation to Zoho's verification probe. After Zoho's &lt;code&gt;Verify&lt;/code&gt; succeeds and you click &lt;code&gt;Enable DKIM&lt;/code&gt;, signing starts on the next outbound message — there is no further delay. Receivers cache DKIM keys briefly (typically 5–15 minutes), so the first message may not verify at every receiver immediately but should be clean within 30 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to enable DKIM in Zoho even after the DNS record is verified?
&lt;/h3&gt;

&lt;p&gt;Yes — verification only confirms the public key is reachable. You must explicitly click &lt;code&gt;Enable DKIM&lt;/code&gt; for that selector in the Zoho admin console for Zoho to start signing outbound mail with the matching private key. Until you flip the switch, the TXT record exists but no signatures are produced, and DMARC will fail DKIM alignment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want continuous monitoring instead of one-shot DNS checks? &lt;a href="https://mailermonk.com" rel="noopener noreferrer"&gt;MailerMonk&lt;/a&gt; watches your DKIM record, aggregate DMARC reports, and inbox placement — and pings you the moment something drifts. Free for the first domain.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>dkim</category>
      <category>zoho</category>
    </item>
  </channel>
</rss>
