<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Robert Floyd Dugger — Automation Engineer, Contact Center Systems</title><link>https://rfditservices.com/</link><description>Recent content on Robert Floyd Dugger — Automation Engineer, Contact Center Systems</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 22 Sep 2026 23:38:02 -0400</lastBuildDate><atom:link href="https://rfditservices.com/index.xml" rel="self" type="application/rss+xml"/><item><title>DNC Compliance Automation</title><link>https://rfditservices.com/projects/dnc-compliance-tool/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/dnc-compliance-tool/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;The contact center I work in dials outbound on more than one platform at the same time. Every campaign has to be scrubbed against the Do Not Call registry and internal opt-outs before it dials.&lt;/p&gt;
&lt;h2 id="the-manual-problem"&gt;The manual problem&lt;/h2&gt;
&lt;p&gt;Under the Telephone Consumer Protection Act, a call to a number that should have been removed can cost up to $500 per violation. The manual process was: export the list, upload it to the scrubbing service, wait, download the result, re-import it to the dialer, then start the campaign — repeated for every campaign on every platform, several times a day. It was repetitive, easy to get wrong, and exactly the kind of work that shouldn&amp;rsquo;t depend on someone remembering a step.&lt;/p&gt;</description></item><item><title>Telesero Admin Suite</title><link>https://rfditservices.com/projects/telesero-admin-suite/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/telesero-admin-suite/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;The contact center I work in runs campaigns on Telesero, a web-based dialer. Keeping lists and dialer settings balanced through the day decides how many good conversations the floor gets.&lt;/p&gt;
&lt;h2 id="the-manual-problem"&gt;The manual problem&lt;/h2&gt;
&lt;p&gt;Someone watched the dialer&amp;rsquo;s performance screens and made configuration changes by hand, every day: checking list health, resetting or rotating lists, and adjusting settings as numbers moved. It was constant, easy to fall behind on during a busy shift, and dependent on one person noticing the right number at the right time.&lt;/p&gt;</description></item><item><title>Zoom Wallboard Inside the Dialer</title><link>https://rfditservices.com/projects/cb-zoom-wallboard/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/cb-zoom-wallboard/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;The contact center I work in runs two platforms at once: a predictive dialer for outbound calls and Zoom Contact Center for warm transfers.&lt;/p&gt;
&lt;h2 id="the-manual-problem"&gt;The manual problem&lt;/h2&gt;
&lt;p&gt;When an agent had a live prospect ready to transfer, they had to switch to Zoom, find someone available, switch back and attempt the transfer — seconds of friction in a handoff that&amp;rsquo;s already under time pressure. Showing Zoom availability inside the dialer couldn&amp;rsquo;t mean buying every dialer agent a second license.&lt;/p&gt;</description></item><item><title>A Work Queue Three AI Agents Share</title><link>https://rfditservices.com/projects/directive-queue-mcp/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/directive-queue-mcp/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Most &amp;ldquo;AI agent&amp;rdquo; demos show one agent doing one task. Running several agents against a real
codebase is a different problem: they have different strengths, different costs, and no
shared idea of what is already being worked on.&lt;/p&gt;
&lt;p&gt;The setup here is three agents with genuinely different economics. One is strong at
diagnosis and architecture but metered. One does self-contained build work at no marginal
cost. One is a local assistant on free models with a hard 8,000-token-per-minute ceiling.
Assigning work well means knowing what each can actually do — and knowing what is already
in flight.&lt;/p&gt;</description></item><item><title>AI That Reads Your Inbox Without Sending It Anywhere</title><link>https://rfditservices.com/projects/local-first-inbox-intelligence/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/local-first-inbox-intelligence/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Let AI sort your email&amp;rdquo; is an easy sell and a hard one to accept. For a law office, a
medical practice, a recruiter, or anyone whose inbox contains other people&amp;rsquo;s private
business, the answer to &lt;em&gt;&amp;ldquo;so where does my mail go?&amp;rdquo;&lt;/em&gt; decides whether the project happens
at all. If the honest answer is &amp;ldquo;to a third party&amp;rsquo;s servers,&amp;rdquo; a lot of businesses stop
listening — correctly.&lt;/p&gt;
&lt;p&gt;So the design constraint here was set first and treated as non-negotiable: &lt;strong&gt;the mail never
leaves the machine.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>One Connection to Your Spreadsheets for Every Automation</title><link>https://rfditservices.com/projects/sheets-mcp-service-layer/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/sheets-mcp-service-layer/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Every small business automation eventually touches a spreadsheet. It is where the lead
list lives, where the schedule lives, where the numbers someone actually looks at live.&lt;/p&gt;
&lt;p&gt;The usual result is that each script grows its own copy of the same 60 lines: a service
account file, a credentials path, a token refresh, a retry, and a slightly different way of
opening a worksheet. Five automations means five copies, five places a credential can leak,
and five things to fix when Google changes something.&lt;/p&gt;</description></item><item><title>Automation That Refuses to Speak When It's Out of Date</title><link>https://rfditservices.com/projects/coordination-with-unforgeable-authorship/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/coordination-with-unforgeable-authorship/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Several automated systems working on the same thing need somewhere to talk. The informal
version here was already working: tagged email threads, one note per update, a loose
house style of &lt;em&gt;what changed / what is blocked / what you need to know / next&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Informal works right up until it doesn&amp;rsquo;t. Two failure modes were waiting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Anyone can sign anything.&lt;/strong&gt; If the author is a string in the message, an automated
participant can put any name on it — by accident as easily as otherwise. An audit trail
where authorship is decorative is not an audit trail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anyone can act on a stale view.&lt;/strong&gt; A participant that read the thread ten minutes ago
and posts now will confidently contradict a decision it never saw. In a human thread
someone notices. Between automated participants, nobody does.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-approach"&gt;The approach&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Authorship is environment, not argument.&lt;/strong&gt; Each client declares who it is through its
environment configuration. There is no parameter, tool argument or CLI flag that can set
the author — the code reads the configured identity and nothing else. An unrecognised or
unset identity gets read-only access: it can follow the thread and cannot post to it.&lt;/p&gt;</description></item><item><title>One Game Format, Three Runtimes, 34 Games</title><link>https://rfditservices.com/projects/rfd-game-studio/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/rfd-game-studio/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Most game codebases grow one engine and then grow dependent on it. Porting means rewriting.
The premise here was the opposite: treat the &lt;em&gt;game&lt;/em&gt; as data and the &lt;em&gt;runtime&lt;/em&gt; as an
interchangeable contract, so the same logic runs unchanged in Python, TypeScript or Rust.&lt;/p&gt;
&lt;p&gt;That is a systems problem more than a games problem, and it is the same shape as any
integration work — the question is whether the boundary between &amp;ldquo;what the thing does&amp;rdquo; and
&amp;ldquo;what executes it&amp;rdquo; is real or aspirational.&lt;/p&gt;</description></item><item><title>One Person, Three Agents, One System</title><link>https://rfditservices.com/projects/agentflow/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/agentflow/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;The setup is one person with a full-time day job and three AI agents that are
genuinely different tools with different economics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude&lt;/strong&gt; does diagnosis, architecture and review — metered by a subscription
usage window, so its time is the budget that runs out first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devin&lt;/strong&gt; does self-contained build work from written directives. Its runs do
not consume Claude usage; each run gets its own git worktree and branch and
runs non-interactive under an explicit command allow-list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A local assistant&lt;/strong&gt; (Tobor, on OpenClaw with free models) relays on
Telegram. It is being narrowed to proven jobs only after it failed at breadth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it is two machines, not one: a personal laptop and a work desktop — &amp;ldquo;the
Tower&amp;rdquo; — coordinating through the same git remote. The work install also runs a
live call-center dialer, which is a protected repo no agent may touch.&lt;/p&gt;</description></item><item><title>A YouTube Pipeline in Eight Enforced Domains</title><link>https://rfditservices.com/projects/rfd-yt-engine/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/rfd-yt-engine/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;RFD_YT_Engine is the content-pipeline system behind the channel. It does not
treat &amp;ldquo;content&amp;rdquo; as a single layer — it splits the work into eight domains and
keeps their boundaries explicit, so that Streaming imports &lt;code&gt;infra.obs&lt;/code&gt;, not
&lt;code&gt;pipeline.capture&lt;/code&gt;, and nobody accidentally couples a schedule change to a
catalog sync. It replaced the earlier GameReviewAgent/content-engine, which was
retired and archived on 2026-09-13 (ADR-001).&lt;/p&gt;
&lt;h2 id="the-problem-it-solves"&gt;The problem it solves&lt;/h2&gt;
&lt;p&gt;Running a YouTube channel means keeping track of: what videos exist, which are
scheduled, what playlists they belong to, whether a live stream is set up,
whether the OBS scene will switch correctly, what the analytics trend looks
like, and whether the title/duration signals suggest the right content type.
These are not one big workflow. They are separate concerns that happen to share
a channel.&lt;/p&gt;</description></item><item><title>Convoso Insight Lens</title><link>https://rfditservices.com/projects/convoso-insight-lens/</link><pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/convoso-insight-lens/</guid><description>&lt;p&gt;Convoso Insight Lens adds the metrics Convoso&amp;rsquo;s own reports don&amp;rsquo;t calculate for you — directly into the report tables you&amp;rsquo;re already looking at.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Convoso&amp;rsquo;s reporting pages show raw counts: contacts, appointments, live transfers, calls. Figuring out conversion rates — what percentage of contacts actually became appointments, what percentage became live transfers — means pulling those numbers out and doing the math yourself, every time you look at a report.&lt;/p&gt;</description></item><item><title>Convoso Team Optimizer</title><link>https://rfditservices.com/projects/convoso-team-optimizer/</link><pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/convoso-team-optimizer/</guid><description>&lt;p&gt;Convoso Team Optimizer is a management overlay for Call Center Coaches and Managers — it reorganizes Convoso&amp;rsquo;s live agent monitor into clearly labeled, visually distinct team sections, without touching the underlying dashboard&amp;rsquo;s own behavior.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Convoso&amp;rsquo;s real-time agent monitor shows every agent in one flat view. For a manager running multiple teams inside a single campaign, there&amp;rsquo;s no native way to see &amp;ldquo;my team&amp;rdquo; at a glance — just a scrolling list of names, mixed together, updating constantly as agents change state.&lt;/p&gt;</description></item><item><title>Convoso Auto-Create Lead</title><link>https://rfditservices.com/projects/convoso-auto-create-lead/</link><pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/convoso-auto-create-lead/</guid><description>&lt;p&gt;Convoso Auto Create Lead removes one specific, repeated manual step from a Convoso agent&amp;rsquo;s workflow: clicking &amp;ldquo;Create Lead&amp;rdquo; after dispositioning a call.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;After an agent finishes a call and selects a disposition in Convoso, creating the follow-up lead record requires a manual click on the &amp;ldquo;Create Lead&amp;rdquo; button. It&amp;rsquo;s a small action, but it happens after every relevant disposition, every call, all day — a repeated interruption between finishing one call and moving to the next.&lt;/p&gt;</description></item><item><title>Telesero Auto-Pauser</title><link>https://rfditservices.com/projects/telesero-auto-pauser/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/telesero-auto-pauser/</guid><description>&lt;p&gt;Telesero Auto-Pauser is my first published Chrome extension — a small, focused tool that automatically checks the &amp;ldquo;PAUSE AGENT DIALING&amp;rdquo; checkbox on the Telesero Suite platform.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Between calls, Telesero agents manually check a &amp;ldquo;PAUSE AGENT DIALING&amp;rdquo; checkbox to stop new calls from routing to them, then uncheck it to resume. It&amp;rsquo;s a small, repeated manual action — easy to forget, easy to mistime.&lt;/p&gt;
&lt;h2 id="the-fix"&gt;The Fix&lt;/h2&gt;
&lt;p&gt;The extension detects the relevant workflow state on the Telesero dashboard and checks the pause checkbox automatically, removing the manual step without changing how the underlying platform works.&lt;/p&gt;</description></item><item><title>Chrome Auto-Refresh</title><link>https://rfditservices.com/projects/chrome-auto-refresh/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/chrome-auto-refresh/</guid><description>&lt;p&gt;Chrome Auto Refresh does one thing — reload tabs on a schedule — and the real engineering story is in how much iteration went into making that one thing reliable under Chrome&amp;rsquo;s Manifest V3 constraints.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Chrome can discard inactive tabs to save memory, and Manifest V3 service workers can be killed and restarted by the browser at any time. A naive auto-refresh extension built with a simple &lt;code&gt;setInterval()&lt;/code&gt; breaks under both conditions — the timer just disappears. Building something that actually keeps refreshing reliably, across tab suspension and service worker restarts, is a harder problem than it looks.&lt;/p&gt;</description></item><item><title>Data Bridge</title><link>https://rfditservices.com/projects/data-bridge/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/data-bridge/</guid><description>&lt;p&gt;Supervisors on my floor copied agent performance numbers out of Zoom and Convoso into fixed master spreadsheets by hand every day. Data Bridge does the extraction in the browser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pulls agent performance reports from Zoom and Convoso pages&lt;/li&gt;
&lt;li&gt;Sanitizes null values and normalizes durations to HH:MM:SS&lt;/li&gt;
&lt;li&gt;Alphabetizes agent lists so rows line up with the master sheet&lt;/li&gt;
&lt;li&gt;Copies clean, tab-separated rows to the clipboard, ready to paste&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything runs locally in the browser.&lt;/p&gt;</description></item><item><title>DialerListPulse</title><link>https://rfditservices.com/projects/dialerlistpulse/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/dialerlistpulse/</guid><description>&lt;p&gt;Operations managers decide which dialer lists to run from a spreadsheet that changes all day. DialerListPulse turns that live data into ranked, scored list-health views:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-factor performance ranking with time normalization&lt;/li&gt;
&lt;li&gt;Health-state classification and list-fatigue tracking&lt;/li&gt;
&lt;li&gt;Pluggable scoring algorithms behind a repository layer&lt;/li&gt;
&lt;li&gt;Google Sheets API integration with two-layer caching, plus an MCP server interface&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;170+ automated tests. Built for the contact center I work in; the code and data stay internal.&lt;/p&gt;</description></item><item><title>Lead Data Prep Tools</title><link>https://rfditservices.com/projects/ldla/</link><pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/ldla/</guid><description>&lt;p&gt;700,000 records. Under 8 minutes.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Data engineers and ops people watch Python scripts choke on 50,000 rows.&lt;/p&gt;
&lt;p&gt;Encoding mismatches, messy headers, mixed formats, duplicates, and memory constraints cause failures at scale. When you&amp;rsquo;re processing hundreds of thousands of records, naive implementations don&amp;rsquo;t just slow down — they crash.&lt;/p&gt;
&lt;h2 id="the-solution"&gt;The Solution&lt;/h2&gt;
&lt;p&gt;Lead Data Prep Tools processes 700,000+ records in under 8 minutes through vectorized processing and memory-efficient chunking.&lt;/p&gt;
&lt;h2 id="the-pipeline"&gt;The Pipeline&lt;/h2&gt;
&lt;p&gt;11 configurable steps:&lt;/p&gt;</description></item><item><title>OpenAgent</title><link>https://rfditservices.com/projects/openagent/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/openagent/</guid><description>&lt;p&gt;Every AI coding session starts by re-explaining the same context.&lt;/p&gt;
&lt;h2 id="the-solution"&gt;The Solution&lt;/h2&gt;
&lt;p&gt;OpenAgent reads your codebase, interviews you once via SOUL.md, and generates directives that sound like something you&amp;rsquo;d actually write.&lt;/p&gt;
&lt;h2 id="install"&gt;Install&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install openagent-directive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="quick-start"&gt;Quick Start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# First time setup - personalize your experience&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openagent init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Generate personalized strategic analysis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openagent analyze
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Check repository structure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openagent inventory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Personalize Your Experience&lt;/strong&gt;
Run &lt;code&gt;openagent init&lt;/code&gt; to create your SOUL.md profile. This interview captures your coding style, architectural preferences, and development philosophy.&lt;/p&gt;</description></item><item><title>rfd-blog-engine</title><link>https://rfditservices.com/projects/rfd-blog-engine/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/rfd-blog-engine/</guid><description>&lt;p&gt;rfd-blog-engine is the publishing backbone for the devlog. It treats WordPress and YAML as two stores that must stay in sync, and it refuses to pretend they are when they aren&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;A blog post has a life cycle: draft, schedule, publish, syndicate, update, reschedule. Each step touches WordPress, the local YAML inventory, and sometimes Dev.to. Do any step partially and you end up with a post rescheduled in WordPress but not in YAML, or syndicated to Dev.to without the correct canonical URL pointing back home.&lt;/p&gt;</description></item><item><title>rfd-logging</title><link>https://rfditservices.com/projects/rfd-logging/</link><pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/rfd-logging/</guid><description>&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Every Python service I build needs logging. Every time I set it up from scratch, I make the same decisions: structured JSON output, file rotation, stdout capture for NSSM, a request ID field for tracing requests across service calls. I&amp;rsquo;ve written that setup five times across five different services.&lt;/p&gt;
&lt;p&gt;The sixth time, I packaged it instead.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What It Does&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rfd-logging&lt;/code&gt; is a zero-dependency Python logging wrapper that gives you structured, production-ready logging in one import.&lt;/p&gt;</description></item><item><title>PrivyBot</title><link>https://rfditservices.com/projects/privybot/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/privybot/</guid><description>&lt;p&gt;My AI assistant sent me my email summary, YouTube stats, and task list before I made coffee this morning.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not a demo. That&amp;rsquo;s what actually happens.&lt;/p&gt;
&lt;h2 id="the-outcome"&gt;The Outcome&lt;/h2&gt;
&lt;p&gt;PrivyBot is my personal AI assistant running on a $300 tower at home. It costs $0.25/day to run (hard cap — I measured it). It has 70+ tools that integrate with my actual life:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Email:&lt;/strong&gt; Summarizes unread messages, checks for specific senders, searches by topic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Calendar:&lt;/strong&gt; Today&amp;rsquo;s schedule, upcoming events, availability checks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tasks:&lt;/strong&gt; Google Tasks integration, task creation, completion tracking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YouTube:&lt;/strong&gt; Channel stats, video analytics, audience demographics, traffic sources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web:&lt;/strong&gt; Search, Wikipedia lookup, news search, URL fetching&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Development:&lt;/strong&gt; GitHub commits, repo analysis, code quality metrics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utilities:&lt;/strong&gt; Weather, time, calculations, random facts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The hard part wasn&amp;rsquo;t the AI. The hard part was making the infrastructure actually reliable.&lt;/p&gt;</description></item><item><title>RFDInboxTriage</title><link>https://rfditservices.com/projects/rfdinboxtriage/</link><pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/rfdinboxtriage/</guid><description>&lt;p&gt;RFDInboxTriage is a local-first email triage system. It drains Gmail into a searchable SQLite store, then uses the user&amp;rsquo;s own labeling decisions to suggest bulk classifications — without sending mail content to a third party unless the user explicitly invokes the Analyst layer.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Gmail&amp;rsquo;s search is good for exact matches, bad for vague recollection. Labels are either too few or too many. Filters are one-by-one. And any local email tool that does not write back to Gmail leaves you with two inboxes that disagree about what is &amp;ldquo;done.&amp;rdquo;&lt;/p&gt;</description></item><item><title>WhisperUI</title><link>https://rfditservices.com/projects/whisperui/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/whisperui/</guid><description>&lt;p&gt;Local audio transcription. No API key. No cloud. No data leaving your machine.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;You have a sensitive meeting recording. A client interview. A personal voice memo.&lt;/p&gt;
&lt;p&gt;You need it transcribed.&lt;/p&gt;
&lt;p&gt;The options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud services:&lt;/strong&gt; Require API keys, cost money per minute, send your audio to someone else&amp;rsquo;s servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual transcription:&lt;/strong&gt; Takes hours, error-prone, tedious&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do nothing:&lt;/strong&gt; The recording sits there, unsearchable, unusable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For sensitive content, cloud services are unacceptable. Your data should stay on your machine.&lt;/p&gt;</description></item><item><title>PhantomArbiter</title><link>https://rfditservices.com/projects/phantomarbiter/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/phantomarbiter/</guid><description>&lt;p&gt;PhantomArbiter was a real-time trading system built for Solana&amp;rsquo;s blockchain at the millisecond scale required to compete with MEV bots. It is now semi-retired — the &lt;a href="https://rfditservices.com/archives/phantom-arbiter/"&gt;post-mortem&lt;/a&gt; explains why infrastructure cost, not code, ended it.&lt;/p&gt;
&lt;h2 id="the-problem-domain"&gt;The Problem Domain&lt;/h2&gt;
&lt;p&gt;On Solana, liquidity is fragmented across 4+ major decentralized exchanges. When prices diverge, arbitrage opportunities arise—buy low on one DEX, sell high on another. But MEV bots watch the mempool, see your transaction, insert their own before it, and steal the profit.&lt;/p&gt;</description></item><item><title>Real-Time Coaching Bridge (Concept)</title><link>https://rfditservices.com/projects/realtime-coaching-bridge/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/projects/realtime-coaching-bridge/</guid><description>&lt;p&gt;Not every project ships. This one didn&amp;rsquo;t — but the concept is worth documenting honestly rather than pretending it doesn&amp;rsquo;t exist.&lt;/p&gt;
&lt;h2 id="the-idea"&gt;The Idea&lt;/h2&gt;
&lt;p&gt;Contact center coaching is usually after-the-fact: a supervisor listens to a call recording later, or silently monitors a live call with no way to intervene short of pulling the agent off entirely. The concept behind this extension was different: let a coach tap into an agent&amp;rsquo;s live call audio and coach them in real time, based on what&amp;rsquo;s actually happening on the call — without any of that coaching activity ever touching the call itself.&lt;/p&gt;</description></item><item><title>ContentPipeline: From Beat Sheet to YouTube Short</title><link>https://rfditservices.com/archives/contentpipeline/</link><pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/archives/contentpipeline/</guid><description>&lt;h2 id="the-original-vision"&gt;The Original Vision&lt;/h2&gt;
&lt;p&gt;Manual video editing is friction. You see something interesting in a game and want to share it, but the editing step stops you. ContentPipeline removed that step: write a short YAML beat sheet — clip timestamps, one line of text per beat, a music track — point it at footage, and it produces a finished YouTube Short.&lt;/p&gt;
&lt;p&gt;It grew to cover the whole loop around that: controlling OBS recording over WebSocket (pausing when the game loses focus), and talking to the YouTube Data API for uploads, the channel library and analytics.&lt;/p&gt;</description></item><item><title>RFD_IT_Publishing: A Tool Built to Be Absorbed</title><link>https://rfditservices.com/archives/rfd-it-publishing/</link><pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/archives/rfd-it-publishing/</guid><description>&lt;h2 id="the-original-vision"&gt;The Original Vision&lt;/h2&gt;
&lt;p&gt;A small Python CLI that pushes game builds to itch.io through butler, itch.io&amp;rsquo;s upload tool, with a per-game YAML config describing where each build goes.&lt;/p&gt;
&lt;h2 id="what-changed"&gt;What Changed&lt;/h2&gt;
&lt;p&gt;All the games it published lived in RFDGameStudio, so keeping the publisher in its own repository only added coordination. On 13 September 2026 it moved into the studio.&lt;/p&gt;
&lt;h2 id="the-harvest"&gt;The Harvest&lt;/h2&gt;
&lt;p&gt;The move worked because of a design choice made early: the publisher never depended on the code calling it. That let it enter RFDGameStudio as a self-contained package (&lt;code&gt;packages/itch_publisher&lt;/code&gt;) with its full commit history intact. The studio talks to it through a single &amp;ldquo;published&amp;rdquo; hook, and one &lt;code&gt;git subtree split&lt;/code&gt; command can turn it back into its own repository.&lt;/p&gt;</description></item><item><title>rpgCore: One Engine, Many Games</title><link>https://rfditservices.com/archives/rpgcore/</link><pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/archives/rpgcore/</guid><description>&lt;h2 id="the-original-vision"&gt;The Original Vision&lt;/h2&gt;
&lt;p&gt;rpgCore applied the Valve Orange Box idea to solo development: one shared engine layer, several very different games on top of it, and no system built twice. It powered a turn-based faction strategy game (Slime Clan), a narrative dialogue piece (Last Appointment), a management simulation (TurboShells) and an Asteroids-style action roguelike, all launched from one manifest-driven entry point.&lt;/p&gt;
&lt;h2 id="what-changed"&gt;What Changed&lt;/h2&gt;
&lt;p&gt;The ideas outgrew the codebase. RFDGameStudio took over as the shared engine for the studio&amp;rsquo;s games, and OperatorGame carried the dispatch-simulation patterns into Rust. rpgCore was retired on 13 September 2026.&lt;/p&gt;</description></item><item><title>Technical Post-Mortem: The Solana Pulse Ignition</title><link>https://rfditservices.com/archives/solana-pulse/</link><pubDate>Sun, 08 Mar 2026 09:45:00 -0400</pubDate><guid>https://rfditservices.com/archives/solana-pulse/</guid><description>&lt;h1 id="technical-post-mortem-the-solana-pulse-ignition"&gt;Technical Post-Mortem: The Solana Pulse Ignition&lt;/h1&gt;
&lt;h2 id="the-challenge-architectural-drift--collision"&gt;The Challenge: Architectural Drift &amp;amp; Collision&lt;/h2&gt;
&lt;p&gt;The project initially faced &lt;strong&gt;routing ambiguity&lt;/strong&gt; where two separate Nginx configurations were attempting to claim the same root domain. This &amp;ldquo;manual patch&amp;rdquo; state caused the Solana Pulse ticker to be intermittently hidden from the live site. Additionally, the 1Hz data feed required a secure &lt;strong&gt;HTTPS tunnel&lt;/strong&gt; to satisfy modern browser security policies without exposing sensitive &lt;code&gt;.env&lt;/code&gt; API keys.&lt;/p&gt;</description></item><item><title>Solana Intelligence Command Center</title><link>https://rfditservices.com/archives/solana-intelligence/</link><pubDate>Sun, 08 Mar 2026 00:15:00 -0500</pubDate><guid>https://rfditservices.com/archives/solana-intelligence/</guid><description>&lt;h1 id="the-pulse-of-decentralized-liquidity"&gt;The Pulse of Decentralized Liquidity&lt;/h1&gt;
&lt;p&gt;This project demonstrates the &lt;strong&gt;PhantomArbiter&lt;/strong&gt; engine—a high-performance systems bridge that aggregates market data across multiple venues to identify arbitrage opportunities and institutional whale movements in real-time.&lt;/p&gt;
&lt;h2 id="technical-architecture"&gt;Technical Architecture&lt;/h2&gt;
&lt;p&gt;The system utilizes a &lt;strong&gt;Zero-Leak Proxy&lt;/strong&gt; architecture to bridge private Rust-based kernels with public-facing interfaces.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph TD
 subgraph Ingress [&amp;#34;1. Data Ingress (Rust Layer)&amp;#34;]
 WSS[Real-time WebSocket] --&amp;gt;|Raw Logs/Pool State| LP[Log Parser]
 LP --&amp;gt;|Parsed Events| FC[Flash Cache - Shared Memory]
 end

 subgraph Strategy [&amp;#34;2. Strategy Layer (Python Layer)&amp;#34;]
 FC --&amp;gt;|Market Snapshot| AD[Arb Detector]
 AD --&amp;gt;|Opportunity Detected| SD[Slippage Modeler]
 SD --&amp;gt;|Optimal Size| RM[Risk Management]
 RM --&amp;gt;|Approved Action| FB[The Forge - Tx Builder]
 end

 subgraph Execution [&amp;#34;3. Execution Engine (Rust Layer)&amp;#34;]
 FB --&amp;gt;|Instruction Payload| RB[Rust Bridge - PyO3]
 RB --&amp;gt;|Sign &amp;amp; Serialize| TS[Transaction Signer]
 TS --&amp;gt;|Atomic Bundle| JB[Jito-Bundle Integration]
 JB --&amp;gt;|MEV-Protected Submit| SOL[Solana Blockchain]
 end

 subgraph Monitoring [&amp;#34;4. Observability&amp;#34;]
 AD --&amp;gt;|PnL / Scan Logs| DB[TUI Dashboard]
 SOL --&amp;gt;|Confirmation| DB
 end

 style WSS fill:#f96,stroke:#333
 style SOL fill:#6f9,stroke:#333
 style RB fill:#f66,stroke:#333
 style AD fill:#66f,stroke:#333,color:#fff
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="architectural-specifications"&gt;Architectural Specifications&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kernel&lt;/strong&gt;: Rust 1.75+ (PyO3 Integration)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggregation Layer&lt;/strong&gt;: Python 3.12 (FastAPI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: Nginx + Hugo (Static CMS)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt;: &amp;lt;60ms Internal Processing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;: Closed-loop .env isolation&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
All data points are sanitized at the proxy layer before reaching the public interface, ensuring institutional-grade security for proprietary arbitrage logic.&lt;/p&gt;</description></item><item><title>PhantomArbiter: Orchestrating the Hybrid Engine</title><link>https://rfditservices.com/archives/phantom-arbiter/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/archives/phantom-arbiter/</guid><description>&lt;h2 id="the-original-vision"&gt;The Original Vision&lt;/h2&gt;
&lt;p&gt;PhantomArbiter was built to execute high-speed arbitrage opportunities on the Solana blockchain.&lt;/p&gt;
&lt;h2 id="what-went-wrong--the-pivot"&gt;What Went Wrong / The Pivot&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Biggest Win (Systemic Synergy):&lt;/strong&gt;
The Hybrid Bridge: Successfully building a Memory-Safe / High-Velocity Execution Engine in Rust that consumed a Dynamic / Hot-Swappable Strategy Layer in Python. This reduced execution latency by ~90% compared to a pure-Python implementation while maintaining the &amp;ldquo;KISS&amp;rdquo; principle for the trading logic. It proved the ability to orchestrate complex, multi-language systems under high-pressure (low-latency) constraints.&lt;/p&gt;</description></item><item><title>Stark PyRust Chain</title><link>https://rfditservices.com/archives/stark-pyrust-chain/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://rfditservices.com/archives/stark-pyrust-chain/</guid><description>&lt;h3 id="the-vision"&gt;The Vision&lt;/h3&gt;
&lt;p&gt;Exploring the intersection of immutable ledgers and high-performance cross-language execution.&lt;/p&gt;
&lt;h3 id="the-technical-challenge"&gt;The Technical Challenge&lt;/h3&gt;
&lt;p&gt;Proving mastery over Asymmetric Encryption and Rust-based memory safety. This R&amp;amp;D anchor demonstrates the ability to handle the deep cryptographic math required for modern security infrastructure.&lt;/p&gt;</description></item></channel></rss>