<?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: Evgeniy Uryadov</title>
    <description>The latest articles on DEV Community by Evgeniy Uryadov (@automatadotsale).</description>
    <link>https://dev.to/automatadotsale</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4145870%2F4536bcfb-e776-4b67-ad97-7a5501060277.jpg</url>
      <title>DEV Community: Evgeniy Uryadov</title>
      <link>https://dev.to/automatadotsale</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/automatadotsale"/>
    <language>en</language>
    <item>
      <title>I keep seeing the same video on repeat: "Claude runs your whole YouTube channel" or "this AI agent finds clients for you". Ever</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Tue, 03 Nov 2026 08:47:38 +0000</pubDate>
      <link>https://dev.to/automatadotsale/i-keep-seeing-the-same-video-on-repeat-claude-runs-your-whole-youtube-channel-or-this-ai-agent-31f8</link>
      <guid>https://dev.to/automatadotsale/i-keep-seeing-the-same-video-on-repeat-claude-runs-your-whole-youtube-channel-or-this-ai-agent-31f8</guid>
      <description>&lt;p&gt;So I read the source and put four of those tools into my own production pipeline. Two of them are now part of every post I publish, including this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a skill actually is
&lt;/h2&gt;

&lt;p&gt;A skill is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; instruction file and a few dependency-free Python scripts. The agent loads it as a working mode. No framework, no vector database, no API keys. My four live in a skills directory and run from any agent session.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hook formulas: 47 ways to open
&lt;/h2&gt;

&lt;p&gt;A hook is the first fifteen seconds, or the first line of a post. It has three jobs: confirm what the title promised, raise a question the reader cannot close, and prove the payoff exists. A hook that only does the third is a summary, and it leaks viewers.&lt;br&gt;
The bank is two files: 21 formulas from a YouTube pack, 26 from an Instagram pack with 19 unique ones (Cold Open Demo, The Flop Record, The Objection, Cost Confession).&lt;br&gt;
The scorer is the interesting part: the verdict is 60 percent the mean of five properties and 40 percent the weakest one, because averages hide the exact place a hook leaks. A real run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPECIFICITY   84
ADDRESS       26   &amp;lt;- say 'you' in the first six words
STAKES        62
CURIOSITY     41
BREVITY      100
VERDICT       48  WEAK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A hook with a strong number still scored WEAK, because it never addressed the viewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Viral radar: ideas are not view counts
&lt;/h2&gt;

&lt;p&gt;Raw views rank channel size. 400,000 views on a channel with a 2 million median is a normal Tuesday; 400,000 on a channel with a 30,000 median is the one to study. So every video is scored as a multiple of its own channel's median, and a channel needs at least four videos for the median to mean anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;--flat-playlist&lt;/span&gt; &lt;span class="nt"&gt;-J&lt;/span&gt; &lt;span class="s2"&gt;"https://www.youtube.com/@channel/videos"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ch1.json
python3 swipe.py collected.json &lt;span class="nt"&gt;--min&lt;/span&gt; 2.0
&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;5.88x   50,000 vs 8,500 median   "97% of developers quit a blog before post 30"
3.90x  410,000 vs 105,000 median "Why your first 30 seconds lose viewers"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Lead pipeline: stages talk to the database, not to each other
&lt;/h2&gt;

&lt;p&gt;This one is an adaptation of Harvey. Each stage asks the database "who have I not looked at, or not looked at recently", so any run survives a restart, and re-reading a site after 90 days turns the same signal into a time series (that is how you notice a client changed their platform).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 discover.py &lt;span class="s2"&gt;"Saratov"&lt;/span&gt; &lt;span class="nt"&gt;--cat&lt;/span&gt; furniture &lt;span class="nt"&gt;--limit&lt;/span&gt; 15   &lt;span class="c"&gt;# OpenStreetMap, free&lt;/span&gt;
python3 profile.py &lt;span class="nt"&gt;--limit&lt;/span&gt; 11                              &lt;span class="c"&gt;# CMS fingerprint&lt;/span&gt;
python3 enrich.py &lt;span class="nt"&gt;--limit&lt;/span&gt; 4                                &lt;span class="c"&gt;# people, email, MX&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One run: 11 furniture companies with websites in a Russian city, sorted by engine (two Bitrix stores, WordPress, Nuxt). The CMS fingerprint is the core: you do not just know who they are, you know what their site runs on, and the offer follows.&lt;br&gt;
Enrichment ranks contacts honestly: an email listed on the site beats a guessed pattern with a live MX record, and no MX means the address does not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Script doctor: anti-slop and timing
&lt;/h2&gt;

&lt;p&gt;The detector scores five properties: sentence-length variation, specificity (numbers, names, currency), slop density against an editable lexicon, the machine fingerprint (invisible characters, typographic tells) and voice. A typical AI-written post scored 11 out of 100; a real case study scored 55.&lt;br&gt;
The timing tool turns a script into timecodes at about 165 words per minute and flags a hook longer than three seconds, a beat longer than four, three lines in a row with nothing checkable, and an ending that does not echo the opening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Overpass accepts form-encoded bodies only, and public servers flake with 502: back off across mirrors.&lt;/li&gt;
&lt;li&gt;Tarpit servers accept the connection and never answer, so fetches run in a thread with a hard join and redirects disabled.&lt;/li&gt;
&lt;li&gt;The slop scorer is calibrated on English; treat non-English numbers as a hint.&lt;/li&gt;
&lt;li&gt;In Russian the em dash is normal punctuation, so the check is language-aware.
## Why publish it
The barrier was never secrecy, it was discipline. The same code sits in public repositories while funnels sell retellings of it. The difference between a retelling and a production line is the gates, the lexicon, and running your own drafts through the detector every morning.
Full manual: &lt;a href="https://automata.sale/en/blog/ai-automation/agent-skills-content-factory-manual/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/agent-skills-content-factory-manual/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Odysseus: a Self-Hosted AI Workspace With a Model Cookbook That Reads Your Hardware First</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Fri, 30 Oct 2026 14:29:20 +0000</pubDate>
      <link>https://dev.to/automatadotsale/odysseus-a-self-hosted-ai-workspace-with-a-model-cookbook-that-reads-your-hardware-first-4nnl</link>
      <guid>https://dev.to/automatadotsale/odysseus-a-self-hosted-ai-workspace-with-a-model-cookbook-that-reads-your-hardware-first-4nnl</guid>
      <description>&lt;p&gt;Self-hosted chat UIs are a solved problem. Self-hosted &lt;em&gt;workspaces&lt;/em&gt; aren't, and that's the gap Odysseus aims at. It's an open-source (AGPL-3.0), Docker-deployed AI workspace: chat, agents with tools and MCP, local model serving, deep research, documents, email, notes, tasks and calendar. No telemetry. Your models, your hardware, your data, as the tagline goes.&lt;br&gt;
I haven't deployed it in production, so treat this as an engineer's walkthrough of the project based on its docs and repository, with the caveats called out honestly at the end.&lt;/p&gt;
&lt;h2&gt;
  
  
  The deploy
&lt;/h2&gt;

&lt;p&gt;The boring-in-a-good-way part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/odysseus-dev/odysseus
&lt;span class="nb"&gt;cd &lt;/span&gt;odysseus
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;a href="http://localhost:7011" rel="noopener noreferrer"&gt;http://localhost:7011&lt;/a&gt;. A multi-arch image is published on ghcr.io if you'd rather pull a ready build than compile locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside
&lt;/h2&gt;

&lt;p&gt;The module list reads less like a chat app and more like a small operating system for knowledge work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chat &amp;amp; Agents&lt;/strong&gt;: local or API models, tools, MCP, file and shell access, skills, persistent memory across conversations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookbook&lt;/strong&gt;: hardware-aware model recommendations, downloads and serving. The project catalogs 270+ models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Research&lt;/strong&gt;: multi-step web research that reads sources and produces a report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare&lt;/strong&gt;: blind side-by-side model testing, so branding doesn't do the evaluation for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documents&lt;/strong&gt;: a writing-first editor with AI edits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: IMAP/SMTP inbox with triage, tags, summaries and reply drafts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes, Tasks &amp;amp; Calendar&lt;/strong&gt;: reminders, todos, scheduled agent tasks, CalDAV sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extras&lt;/strong&gt;: gallery and image editor, themes, uploads, web search, presets, sessions, 2FA.
## The Cookbook solves the problem that kills most local-LLM journeys
"Which model fits my machine?" That's where local-LLM attempts usually die: someone downloads a model their RAM can't hold, waits forever on swap, and quits. The Cookbook reverses the order. It looks at your CPU, RAM and GPU first, recommends what will actually run, then handles the download and serving. Cataloging 270+ models with hardware awareness is unglamorous infrastructure work, and it's the most valuable module in the project.
If your hardware isn't up to serving anything reasonable, an API key for hosted models is a perfectly honest route. Your conversation data still stays on your server either way.
## Agents that grow, and the guardrails they demand
The agent layer has real reach: tools, MCP, files, shell, and skills the assistant can write and refine itself. Memory persists across conversations, so the tool drifts from "answer machine" toward "colleague that learns your job". That's also the part to watch: self-modifying skills plus shell access is a powerful combination that deserves deliberate guardrails, not vibes.
Email and calendar make the reach concrete. An agent that triages your inbox and holds scheduled tasks is genuinely useful and genuinely attackable. Isolate the container, enable the built-in 2FA, and don't point an unreviewed agent at a production inbox on day one.
## License and maturity
AGPL-3.0: free to self-host, but if you modify it and offer it as a network service, you must share your modified source. Fine internally. A question for legal before you build a product on top.
The project grew out of a one-shot AI prompt and is driven by one developer. Fast solo projects ship innovation and churn in the same release: review releases, keep backups of the .env and volumes, and remember you're the ops team. That's exactly the trade self-hosting always is.
## Verdict
Odysseus is one of the more complete open-source AI workspaces you can put on your own hardware today. The Cookbook alone justifies a look, the workspace framing is the differentiator, and the honest answer to "is it production-ready" is: evaluate it like a self-hosted tool, not like a product with an SLA.
tags: aiagents, opensource, docker, llm
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/odysseus-self-hosted-ai-workspace/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/odysseus-self-hosted-ai-workspace/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>docker</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Pipeline That Keeps an AI Tutor From Inventing Math Problems</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Wed, 21 Oct 2026 11:12:28 +0000</pubDate>
      <link>https://dev.to/automatadotsale/the-pipeline-that-keeps-an-ai-tutor-from-inventing-math-problems-3fin</link>
      <guid>https://dev.to/automatadotsale/the-pipeline-that-keeps-an-ai-tutor-from-inventing-math-problems-3fin</guid>
      <description>&lt;p&gt;A week ago I wrote about Space Academy, the AI homework trainer I built for my second-grader on top of his actual school textbooks. Here's the update, and it's really about one thing: what it takes to keep generated content honest when the consumer of that content is a nine-year-old who will happily learn whatever you get wrong.&lt;br&gt;
The numbers first: the app now covers 41 pages of two textbooks (math, Moro grade 2, pp. 4-35, and Russian, Kanakina, pp. 37-58), 199 tasks, 214 check questions. Every one of them traces back to a scan of the printed book.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scan gate, in practice
&lt;/h2&gt;

&lt;p&gt;The rule is boring and absolute: no task enters the database without verification against the printed textbook. A vision model transcribes each task with a narrow prompt (one task at a time, not the whole page), then a second pass compares the transcription against the scan. On mismatch, the scan wins.&lt;br&gt;
The interesting decision is what happens where automatic verification can't be honest. Clock readings on a small dial, ruler measurements: the model can read the scan, but a wrong reading would poison a whole exercise chain. So those cards deliberately ship without a reference answer. The child enters their own result, the card is marked for an adult to check, and the expected format sits in the hint. It feels like a regression until you frame it right: an unverified answer in a solver is worse than no answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method lives in the deploy, not the prompt
&lt;/h2&gt;

&lt;p&gt;The learn method (probe, plan, teach) is enforced by a build gate: a page without a lesson plan (a small human-readable DAG from base facts to the lesson goal) and without a motivation line for every task fails the build. No prompt injection can route around it because the check runs in CI, not in the model.&lt;br&gt;
Two smaller things that came out of live use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Pick four correct inequalities out of six" is a set, not a sequence. Checking is element-wise; answer order is irrelevant.&lt;/li&gt;
&lt;li&gt;Wrong answers got personality. If a child drops an antonym from the wrong sense of the word into "shallow pond / shallow rain", the trainer answers "Rain is never deep, here 'shallow' is about drop size" instead of a generic "incorrect".
The kids' favorite is circular examples: eight shuffled cards with no visible answers, where each answer is the first number of the next card. Compute in your head, pick the card that starts with the current number, and when the last card loops back to the start, the circle closes and the task credits itself. The wrong card simply doesn't snap into the chain, so a mistake is visible without a check button.
## Tools beat gamification
Two additions worth stealing for any learning app:&lt;/li&gt;
&lt;li&gt;A real ruler. Every math page has a button that slides up a drawer with a 30 cm ruler, millimeter ticks, and scrolling like the physical tool. Two taps on the scale and the ruler draws the segment itself: "from 6 cm to 14 cm, length 8 cm = 80 mm".&lt;/li&gt;
&lt;li&gt;A photo report. One button photographs the finished page and opens the system share sheet, so "show me your homework" takes two seconds instead of a negotiation.
## SpaceLocker: the guard is native, the trust is not
The desktop piece is a single self-contained C# executable built from Linux with &lt;code&gt;dotnet publish -r win-x64 --self-contained&lt;/code&gt;. While the daily quota (set by a parent: "math, p. 36") is unfinished, a process monitor kills Steam and Roblox every 15 seconds, YouTube is blocked via the hosts file with marker lines, and launching a game brings up a fullscreen screen with quota progress. Alt+F4 does nothing. The screen closes on a finished quota or the parent PIN.
The guard asks the Space Academy API for homework status under the cadet's session, so the source of truth stays on the server where the work actually happens.
## What I would tell anyone building this
The stack is ordinary (React, TypeScript, Tailwind, Express, SQLite, .NET for the guard). The hard part isn't the stack. It's the discipline: a content pipeline that treats the textbook scan as ground truth, a method enforced in the build, and honest blanks where verification cannot be honest. That combination is rare, and it's what makes the tool trustworthy enough to put in front of a child every day.
It's a family project, not a SaaS. If you want a deeper breakdown of the verification agent or the deploy gate, ask in the comments.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/space-academy-weekly-update/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/space-academy-weekly-update/&lt;/a&gt;
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
tags: aiagents, edtech, automation, dotnet&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>education</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Every Endoscope App Is a Subscription Trap, So I Built My Own With an AI Agent</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:28:11 +0000</pubDate>
      <link>https://dev.to/automatadotsale/every-endoscope-app-is-a-subscription-trap-so-i-built-my-own-with-an-ai-agent-2b4d</link>
      <guid>https://dev.to/automatadotsale/every-endoscope-app-is-a-subscription-trap-so-i-built-my-own-with-an-ai-agent-2b4d</guid>
      <description>&lt;p&gt;USB endoscopes are wonderful hardware: a camera on a flexible probe for the price of a sandwich. The software situation around them is a scandal. Every app I tried on the stores was an ad network with a subscription attached: ads every ten seconds, a 30-second recording cap, a watermark, a paywall to save your own photos.&lt;br&gt;
So I did what I do for a living: wrote a one-paragraph spec, sat an AI coding agent next to me, and built the app the stores refuse to sell honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent shipped in one evening
&lt;/h2&gt;

&lt;p&gt;EndoscopeCam: plain Java, 1.5 MB, no frameworks, no ads, no analytics. It doesn't even hold the &lt;code&gt;INTERNET&lt;/code&gt; permission, so it physically cannot send anything anywhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full-screen live preview from any UVC-compliant USB camera;&lt;/li&gt;
&lt;li&gt;photos to &lt;code&gt;Pictures/Endoscope&lt;/code&gt;, MP4 video (H.264, MediaCodec + MediaMuxer) to &lt;code&gt;Movies/Endoscope&lt;/code&gt;, no time limits;&lt;/li&gt;
&lt;li&gt;resolution picker fed by the camera's own descriptors, with automatic YUYV/MJPEG selection (the reason cheap endoscopes work at all);&lt;/li&gt;
&lt;li&gt;auto-launch when the probe is plugged in.
The USB plumbing uses the maintained &lt;code&gt;org.uvccamera&lt;/code&gt; library (Apache 2.0, prebuilt natives on Maven Central), which saved us from writing any JNI.
## The part that took a week: a 23-millisecond silence
The first build died quietly on my Xiaomi (HyperOS 3, Android 16). The app ran, the camera was detected, and the permission dialog never showed up. No crash, no error, just a toast about denied access.
The chase went through every red herring MIUI offers: pop-up window permissions, "display over other apps", cold reboots. What finally cracked it was counting milliseconds in the app's own logs:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;15:42:52.858 requestPermission: sent, waiting for system dialog
15:42:52.866 permission broadcast: granted=false dtMs=23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twenty-three milliseconds is not a human rejecting a dialog. That is code answering before any UI could possibly appear. Reading the AOSP source settled it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the app doesn't have camera permission do not request permission to the USB device.&lt;br&gt;
Since Android 13, &lt;code&gt;UsbUserPermissionManager&lt;/code&gt; treats any USB device with &lt;code&gt;hasVideoCapture() == true&lt;/code&gt; as a camera. If the calling app does not hold the &lt;code&gt;CAMERA&lt;/code&gt; runtime permission, &lt;code&gt;requestPermission()&lt;/code&gt; answers denied immediately and silently. No dialog is ever shown.&lt;br&gt;
One line in the manifest (&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.CAMERA"/&amp;gt;&lt;/code&gt;) plus one runtime request, and the same code that failed for a week worked on the first try.&lt;br&gt;
The method that cracked it, for anyone debugging a silent Android denial:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;log every step of your own flow with timings (&lt;code&gt;adb logcat -s YourTag&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;an instant denial broadcast is a framework decision, not a user action;&lt;/li&gt;
&lt;li&gt;pull the system's own jar and grep the dex strings (&lt;code&gt;unzip services.jar&lt;/code&gt;, count class references) to see which code path exists on the device;&lt;/li&gt;
&lt;li&gt;read the AOSP source for the exact component before trusting any forum advice.
## Try it
The APK's free on my site, and a Play Store release is coming. Works on Android 7.0+ with any UVC endoscope over OTG.
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/endoscope-app-built-with-ai/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/endoscope-app-built-with-ai/&lt;/a&gt;
tags: android, aiagents, java, debugging&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>I Turned My Agency's Rituals into Agent Skills. Here's How They Work</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Wed, 14 Oct 2026 07:18:07 +0000</pubDate>
      <link>https://dev.to/automatadotsale/i-turned-my-agencys-rituals-into-agent-skills-heres-how-they-work-56oa</link>
      <guid>https://dev.to/automatadotsale/i-turned-my-agencys-rituals-into-agent-skills-heres-how-they-work-56oa</guid>
      <description>&lt;p&gt;Yesterday evening I installed ten new skills into my coding agent. They were written by Emil Kowalski, the developer behind the Sonner toast library, and they teach it design engineering: when not to animate at all, which easing curves to use, how to stress-test a UI with worst-case data. The whole install took about five minutes, most of it spent reading the security scan.&lt;br&gt;
Today the agent writes animations and mobile layouts noticeably better. Nobody rewrote the model. The difference is a folder with a markdown file.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a skill actually is
&lt;/h2&gt;

&lt;p&gt;A skill is a directory with a SKILL.md file and optional supporting files: templates, checklists, small scripts. The file is plain markdown. Here's a minimal real example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;seo-audit&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Audit&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;client&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;site&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;before&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;delivery.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;asked&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to"&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;site"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;audit"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="s"&gt;or before handing a project over.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;## Workflow&lt;/span&gt;
&lt;span class="s"&gt;1. Crawl the site, collect titles/descriptions/headings&lt;/span&gt;
&lt;span class="s"&gt;2. Check structured data and canonical tags&lt;/span&gt;
&lt;span class="na"&gt;3. Report as a table&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;severity, page, fix&lt;/span&gt;
&lt;span class="c1"&gt;## Hard rules&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Report only. Do not fix anything until asked.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontmatter carries the matching surface: &lt;code&gt;name&lt;/code&gt; becomes the &lt;code&gt;/seo-audit&lt;/code&gt; command in chat, and &lt;code&gt;description&lt;/code&gt; is what the agent reads to decide whether this skill fits the current task. The body is the procedure.&lt;br&gt;
The clever part? loading. At session start my agent holds only names and one-line descriptions for all 53 skills I keep, which costs a couple of kilobytes of context. The full text of a skill loads only when the task matches or I invoke it explicitly. That's why you can afford to keep dozens of skills around: unused ones are nearly free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to invoke
&lt;/h2&gt;

&lt;p&gt;Explicit, with a slash: &lt;code&gt;/seo-audit https://client-site.ru&lt;/code&gt;. The agent follows the procedure step by step, passing arguments through. I use this when the ritual itself matters.&lt;br&gt;
Implicit, by description: I write "check this site before handing it to the client" in plain language, and the agent compares the request against skill descriptions and pulls in the right one. This is why the description field deserves most of your writing effort. Good skill authors even add an explicit Triggers section listing the exact phrases that should activate the skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where skills live
&lt;/h2&gt;

&lt;p&gt;Three layers, in my setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~/.agents/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; for personal skills, available in every project. This is where my working style lives: publishing pipelines, audit procedures, security gates.&lt;/li&gt;
&lt;li&gt;A skills folder inside the repository for team skills, committed to git. A new hire gets executable procedures, not a wiki page nobody opens.&lt;/li&gt;
&lt;li&gt;Plugin caches for marketplace bundles. Fine for generic needs; anything specific to how my agency works belongs in the first two.
## A real pipeline: one command, six platforms
My heaviest skill is the one publishing this very article. I type &lt;code&gt;/smm-crosspost&lt;/code&gt; with a file, or just say "write an article for our blog", and the agent:&lt;/li&gt;
&lt;li&gt;writes the article in English, adapts it into Russian and Kazakh, and cross-links the three versions;&lt;/li&gt;
&lt;li&gt;generates a 1200x630 cover in the brand style;&lt;/li&gt;
&lt;li&gt;places everything into the site with full structured data (TechArticle, FAQPage, HowTo, hreflang);&lt;/li&gt;
&lt;li&gt;stops and shows me everything for approval;&lt;/li&gt;
&lt;li&gt;after my "ok": deploys, checks the article is live, runs an internal quality audit;&lt;/li&gt;
&lt;li&gt;writes platform adaptations for six networks, each with its own format, tone and length limits;&lt;/li&gt;
&lt;li&gt;runs the drafts through a human-lint pass and shows me every text with scores;&lt;/li&gt;
&lt;li&gt;waits for an explicit "ok" again. Only then it publishes.
Steps 4 and 8 are hard gates written into the skill. The agent can't publish anything without my confirmation because the markdown says so, and it obeys. That's the part people underrate: agent behavior rules live in the same plain text as the workflow, and they hold.
## The security gate
A skill is a set of instructions your agent will follow. Installing one you'ven't vetted is like running a script from a stranger's repository. "Ignore previous instructions" fits comfortably into a helpful-looking checklist.
My gate, which is itself a skill:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 https://github.com/author/some-skills /tmp/check
skillspector scan /tmp/check &lt;span class="nt"&gt;--no-llm&lt;/span&gt;   &lt;span class="c"&gt;# NVIDIA's scanner, fully local&lt;/span&gt;
&lt;span class="c"&gt;# then: read every flagged line by hand&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About those false positives, because this matters. This week the scanner returned CRITICAL on that harmless design-skills repository: 29 findings, top severity, "don't install". Manual review showed every single one was a false positive. It tripped on a defensive line telling the agent to ignore steering attempts from repository files (the phrase "ignore previous instructions" appears inside the quote), on zero-width characters the author used to nest code fences in markdown templates, and on a ZWJ emoji sitting in test data on purpose. Zero real threats.&lt;br&gt;
The lesson isn't "ignore the scanner". It is: the scanner filters, a human decides. Reading 29 flagged lines took me about ten minutes. Installing a poisoned skill would have cost considerably more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing your own
&lt;/h2&gt;

&lt;p&gt;Ready-made skills are someone else's experience. Your own rituals are worth more, and nobody's going to write them for you. Here's the recipe I give clients:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take a task you repeat weekly: publishing, a weekly report, a pre-delivery audit, a deploy.&lt;/li&gt;
&lt;li&gt;Write the steps exactly as you do them by hand, including where you double-check yourself.&lt;/li&gt;
&lt;li&gt;Add hard rules: what never to do, what requires human approval, where to stop.&lt;/li&gt;
&lt;li&gt;Write the description for the agent, not for yourself: what the skill does and which phrases should trigger it.
Start small. A hundred-line skill that saves an hour a week beats a thousand-line perfect one you'll never finish.
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/how-to-use-zcode-skills-and-commands/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/how-to-use-zcode-skills-and-commands/&lt;/a&gt;
tags: aiagents, automation, webdev, productivity&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>A Vault That Rewrites Itself: obsidian-second-brain and the Karpathy LLM Wiki Pattern</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Thu, 08 Oct 2026 06:51:48 +0000</pubDate>
      <link>https://dev.to/automatadotsale/a-vault-that-rewrites-itself-obsidian-second-brain-and-the-karpathy-llm-wiki-pattern-klh</link>
      <guid>https://dev.to/automatadotsale/a-vault-that-rewrites-itself-obsidian-second-brain-and-the-karpathy-llm-wiki-pattern-klh</guid>
      <description>&lt;p&gt;Two tools most of us own ignore each other completely. An Obsidian vault with hundreds of notes nobody rereads. An AI agent in the terminal whose every session starts from zero, as if the past never happened. The &lt;a href="https://github.com/eugeniughelbur/obsidian-second-brain" rel="noopener noreferrer"&gt;obsidian-second-brain&lt;/a&gt; repository glues them together: 4.7k stars, MIT, authored by Eugeniu Ghelbur. The README's own formula: &lt;strong&gt;an evolution of Karpathy's LLM Wiki pattern, a vault that rewrites itself&lt;/strong&gt;.&lt;br&gt;
Here's a review, plus why I read the whole thing with deja vu: my business CRM runs on the same pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern first
&lt;/h2&gt;

&lt;p&gt;Karpathy's LLM Wiki idea: a knowledge base in wiki form, maintained by an LLM. The model adds pages and links them, flags contradictions for manual resolution, surfaces patterns on request. The human owns the knowledge, the model maintains it.&lt;br&gt;
The weak spot: it's passive. The wiki grows when you ask, and contradictions sit until you resolve them. This repo pushes the pattern into active form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four layers, 47 commands
&lt;/h2&gt;

&lt;p&gt;The repo gives a CLI agent (Claude Code, Codex, Gemini CLI and four more) a command set that operates directly on your vault.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Operations (30).&lt;/strong&gt; Ingest URLs, PDFs, audio, screenshots into normalized notes. &lt;code&gt;/obsidian-reconcile&lt;/code&gt; resolves contradictions. &lt;code&gt;/obsidian-health&lt;/code&gt; lints the vault. &lt;code&gt;/obsidian-architect&lt;/code&gt; documents a codebase into notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinking tools (9).&lt;/strong&gt; The part I care about most. &lt;code&gt;/obsidian-challenge&lt;/code&gt; makes the vault argue with you from your own history. &lt;code&gt;/obsidian-emerge&lt;/code&gt; hunts unnamed patterns. &lt;code&gt;/obsidian-connect&lt;/code&gt; bridges knowledge domains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context (1).&lt;/strong&gt; &lt;code&gt;/obsidian-world&lt;/code&gt; loads identity and state with token budgets, from a light L0 to a full L3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research (7).&lt;/strong&gt; Vault-first: &lt;code&gt;/research-deep&lt;/code&gt; scans your notes first and researches only the gaps outside.
Plus four scheduled agents: morning, night, a Friday review, a Sunday health check. The vault lives without you. That's the design goal.
## The part that's actually engineering
Two rules separate this from "plug GPT into notes".
&lt;strong&gt;Open Knowledge Metabolism.&lt;/strong&gt; Every fact must be timeless, dated, or a pointer. Slow-changing knowledge lives in the note; fast-changing facts link to a live source with an "as of" date. There's a spec and a linter.
&lt;strong&gt;Bi-temporal facts.&lt;/strong&gt; The vault remembers when a fact was true and when it learned about it. It sounds academic until someone asks "when did this stop being true", and someone always asks.
Add the inversion I like most: an &lt;strong&gt;AI-first note format&lt;/strong&gt;, notes written for an agent to read, with frontmatter, recency markers and verbatim sources. For decades we adapted machines to documents. Here documents adapt to the machine.
And the restraint: bounded recall through a hook, at most four notes of roughly 900 characters per prompt, so memory doesn't eat the context window. 763 tests in CI, eight builds per platform. It's built like infrastructure, not like a prompt collection.
## The principle to steal
"Your vault outlives any CLI." Agents change every six months. Knowledge in markdown belongs to none of them. Switch the tool, keep the files. A rare case where the right architecture is also the cheapest one.
## The deja vu: our CRM runs on this pattern
I've been building business automation for 14 years, and my company's CRM is a production implementation of the same idea, on business entities instead of notes. What exists today, not on a roadmap:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The vault is the source of truth.&lt;/strong&gt; Clients, deals, tasks, invoices, infrastructure and correspondence: markdown with frontmatter in an Obsidian vault. A task tagged &lt;code&gt;urgent&lt;/code&gt; and &lt;code&gt;important&lt;/code&gt; lands in the right quadrant of an Eisenhower matrix on the dashboard, automatically, like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connect&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;payment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;webhook&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CRM"&lt;/span&gt;
&lt;span class="na"&gt;urgent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;important&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;hours&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents read and write directly.&lt;/strong&gt; A board of director roles works on the same files: a CEO holds the weekly plan, a CFO holds cash and price floors, a commercial director holds receivables. Decisions land in a shared journal, a human approves what matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panels read, the vault stays.&lt;/strong&gt; A promotion dashboard compiles semantics, content coverage, five social networks and traffic into one JSON file that both the agent and the owner read. The vault never becomes a database you can't open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data discipline.&lt;/strong&gt; Sensitive client fields are encrypted in a vault that locks itself, and the company is a registered personal-data operator.
## How a business version differs
The cost of an error. In a personal knowledge base a wrong note costs a reread. In business, an agent that records a payment wrong or leaks personal data costs money and reputation. So triple down on what the personal version treats as optional: human approval of critical actions, encrypted personal data, and a decision log that shows who did what and why.
In about two years the pattern has traveled from a tweet to systems with hundreds of tests, and to CRMs companies actually run on, If you've got an Obsidian vault full of knowledge, this repo is the shortest path to giving your agents persistent memory. If you're running a business, the same pattern works there too, just bring the discipline along.
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/obsidian-second-brain-obzor/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/obsidian-second-brain-obzor/&lt;/a&gt;
tags: aiagents, obsidian, knowledgebase, productivity&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Gave My Markdown CRM a Second Brain: obsidian-second-brain in Practice</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:53:19 +0000</pubDate>
      <link>https://dev.to/automatadotsale/i-gave-my-markdown-crm-a-second-brain-obsidian-second-brain-in-practice-3ml1</link>
      <guid>https://dev.to/automatadotsale/i-gave-my-markdown-crm-a-second-brain-obsidian-second-brain-in-practice-3ml1</guid>
      <description>&lt;p&gt;My CRM isn't an app. It's a folder of Markdown files in an Obsidian vault, and a set of CLI agents that read and write those files. Client chats land there, invoices are generated from it, monitoring alerts get routed through it. The engine is open source (MIT): &lt;a href="https://github.com/eudigitaldotru/crm.automata.sale" rel="noopener noreferrer"&gt;crm.automata.sale&lt;/a&gt;.&lt;br&gt;
It worked for a year. Then it didn't, twice, in ways that cost real money. This post is about the fix: I adopted the open-source &lt;a href="https://github.com/eugeniughelbur/obsidian-second-brain" rel="noopener noreferrer"&gt;obsidian-second-brain&lt;/a&gt; methodology in one day, and I'm including the command cheat sheet I now use daily.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two failures that forced the methodology
&lt;/h2&gt;

&lt;p&gt;Failure one: an agent ran a cleanup pass over the ticket folder and deleted live tickets. Money was attached to them. The rules that should have prevented it existed, but they lived in the agent's session memory. Which is to say: they didn't exist.&lt;br&gt;
Failure two: structural decisions (kill a project, move a client to on-demand monitoring, pick an e-document stack) lived in chat history. Six months later neither I nor the agent could answer "why did we choose X".&lt;br&gt;
Both failures share one root: the database had no discipline. obsidian-second-brain is that discipline, packaged as commands for CLI agents.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Folder Map trick: no restructuring required
&lt;/h2&gt;

&lt;p&gt;Migration risk was my main concern. The pipeline runs 30+ live automations on a 15-minute communication cycle. Moving to the repo's default layout (wiki folders, daily notes, kanban boards) would break everything.&lt;br&gt;
The methodology handles this natively: commands resolve folders not by hard-coded paths but through a Folder Map table in the vault-root instruction file, and when that map exists, it wins over the built-in defaults. Mine maps note types onto the folders I already had:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Note type          | Folder                  |
|--------------------|-------------------------|
| Client (company)   | 10_Clients/             |
| Lead / prospect    | 15_Leads/               |
| Task               | 30_Tasks/               |
| Invoice            | 30_Invoices/            |
| Decision (ADR)     | 30_Decisions/           |
| Project            | 50_Projects_Wiki/       |
| Raw sources        | 60_Documents/, Clippings/ (immutable) |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daily notes stayed out: the message feed replaces them. Kanban stayed out: the dashboard task matrix replaces it. I took the rules and the tools. The structure stayed mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four commands (the cheat sheet)
&lt;/h2&gt;

&lt;p&gt;Each command is a thin skill wrapping the repo's command spec, triggered by a spoken phrase:&lt;br&gt;
| You say | Command | What the agent does |&lt;br&gt;
|---|---|---|&lt;br&gt;
| "save to vault" | osb-save | Scans the session, files updates into client cards as body blocks, tasks through the CRM pipeline, facts with date stamps, plus an ops-log entry |&lt;br&gt;
| "log this decision" | osb-decide | A dated line in the project card, or a full ADR (context, options, rationale, consequences) with the --formal flag |&lt;br&gt;
| "check the vault" | osb-health | Runs a health scan, reports broken links, missing frontmatter, duplicates, stale stamps; edits wait for approval |&lt;br&gt;
| "where's the truth on X" | osb-reconcile | Sweeps contradictions across cards, tickets, and agent memory; clear winners update with history preserved, ties become conflict cards |&lt;br&gt;
The audit scanner is plain Python, no external keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 obsidian-second-brain/scripts/vault_health.py &lt;span class="nt"&gt;--path&lt;/span&gt; ~/crm-vault &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Noisy folders get excluded via a &lt;code&gt;.vault-config.json&lt;/code&gt; next to the vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the first audit found
&lt;/h2&gt;

&lt;p&gt;1,254 notes scanned, 596 after excluding chat dumps and archives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;158 wikilinks pointing to pages that don't exist&lt;/li&gt;
&lt;li&gt;76 notes without frontmatter&lt;/li&gt;
&lt;li&gt;4 title duplicates, 8 empty folders
None of this was surprising. What changed is that it now surfaces in a report instead of rotting silently.
## What I deliberately skipped
The repo ships a research toolkit (Perplexity, Grok, YouTube transcripts) that needs external API keys. I run this pipeline on my own infrastructure without external LLM services, so those stayed out. The core set (writing rules, ADRs, audits, reconciliation) depends on no keys.
## Takeaway
If your agent's operating rules live in "somewhere", they don't live anywhere. A Folder Map, a decision log, and four phrases are cheap insurance, and none of it required touching the 30+ automations already in production.
tags: aiagents, automation, markdown, productivity
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/automata-crm-second-brain/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/automata-crm-second-brain/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built an AI Tutor That Cannot Do the Homework</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Mon, 05 Oct 2026 13:43:32 +0000</pubDate>
      <link>https://dev.to/automatadotsale/i-built-an-ai-tutor-that-cannot-do-the-homework-51ed</link>
      <guid>https://dev.to/automatadotsale/i-built-an-ai-tutor-that-cannot-do-the-homework-51ed</guid>
      <description>&lt;p&gt;My son is nine, in second grade, and has ADHD. He can calculate, but store-bought trainer apps reward taps, not understanding, and he finishes each one in an evening by guessing. So I built our own tutor around his actual school textbook (the skin is a space school: missions follow the Apollo 11 route, 15 rockets in the collection), and the whole architecture serves a single ban: the LLM is not allowed to solve the task.&lt;br&gt;
This post is my engineering story: the constraint that shapes everything, the content pipeline, the pedagogy encoded in data, and the surprising part, the paper notebook.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ban that shapes the architecture
&lt;/h2&gt;

&lt;p&gt;Most AI homework helpers on the market do the homework. Mine can't, and not because of a polite system prompt. The design is structural, not polite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The mentor endpoint receives only the task text. The correct answers live in a table the LLM layer never reads, so there's nothing to leak and nowhere to jailbreak.&lt;/li&gt;
&lt;li&gt;The prompt must end every reply with one question that moves the child forward. No final answers, no "the answer is".&lt;/li&gt;
&lt;li&gt;The similar-example mode works through an analogous problem with different numbers. It may name that example's answer, never the original task's.
If you take one thing from my story: isolate the answer from the model, then design the prompt around a question-ending rule. Bans you can verify in code beat bans you can only write in prose. I trust the first kind.
## Content pipeline: the textbook is the source of truth
Homework comes from a specific textbook, so the dataset has to match it verbatim: our numbering, our wording, so the notebook can be shown to the teacher in the morning. I forbid generative paraphrase, and the pipeline enforces it:
page scan (PNG, 300 dpi)
-&amp;gt; vision model with a narrow prompt: "transcribe task N verbatim"
-&amp;gt; second pass on disputed fragments
-&amp;gt; verification against the scan; the scan always wins
-&amp;gt; a card in the dataset
Full-page transcription by vision models is unstable. Narrow one-task prompts are reliable, so my pipeline reads pages piece by piece.
Why am I so paranoid? Here's a real catch from the first weeks: an external agent prepared five tasks for a page, and verification against the scan flagged one. In an angle-counting task the agent had picked the wrong figure and "found" a right angle in a hexagon, while on the scan the right angle belongs to the pentagon. Without that check my son would've memorized a wrong fact and carried it to class.
Six weeks in: 22 pages across two textbooks, 117 exercises, zero wording invented by feel.
## Pedagogy encoded in data, not in pixels
The method I lean on comes from the open learn method (the amosblomqvist/learn repo): understanding is a connected dependency graph, not a pile of facts. Unconditional truths first, derived steps second, every node motivated before it's established, then linked to the previous one and fixed with a quiz.
In my app it lives in the task schema, roughly:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verbatim from the scan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Why this skill matters, one sentence"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Link to the node the child already owns"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"probes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Easy check of the supporting skill"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"quiz"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"correct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7 - 4 = 3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wrong"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Mutations of the correct line, same shape, real diagnostic mistakes"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three fields do the teaching. In practice, the hook motivates ("inverse problems are a time machine: reconstruct the question from the answer"). The probe questions come before the hard task: before the cucumber word problem, "what is 6 + 4?" My kid with ADHD gets an early win and enters the real task without fear. Distractors are mutations of the correct answer, same length, same shape, each a mistake a child actually makes. When my son picks wrong, he gets an explanation, not a red cross.&lt;/p&gt;

&lt;h2&gt;
  
  
  The notebook bridge
&lt;/h2&gt;

&lt;p&gt;The big discovery of my son's first grade: for half the class the problem isn't arithmetic, it's formatting. The teacher grades the notebook, not the app. So after each solved task the app renders a model entry on a squared sheet: a four-cell margin with a red line, the date on the 11th cell, columns three cells apart, wrapping to sheet width, a handwriting font in blue ink.&lt;br&gt;
My son solves in the app, where input is easy and feedback is instant, then transfers to paper following the model. Homework is still delivered the way school wants it, and that's non-negotiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deliberately boring tech
&lt;/h2&gt;

&lt;p&gt;React 18, TypeScript, Vite, Tailwind. Express with better-sqlite3, cookie sessions, pm2 and nginx. An LLM behind the mentor buttons (Explain, Hint, Similar example; GLM via the z.ai API), replies spoken aloud with speech synthesis. Content is prepared by an agent in the IDE following the pipeline above; a human approves publication. It's the same principle as my grown-up automations: the agent prepares, the human decides.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why systems like this are rare
&lt;/h2&gt;

&lt;p&gt;I count five conditions that must hold at once, and the combination is scarce:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A teaching method pushed down to data fields, not gamification painted over a PDF.&lt;/li&gt;
&lt;li&gt;An agent content pipeline with scan verification, because without it an LLM hallucinates a textbook within a week.&lt;/li&gt;
&lt;li&gt;LLM discipline: the mentor is designed around a ban, with answers isolated from the model.&lt;/li&gt;
&lt;li&gt;Respect for the school standard: the paper notebook still has to look right.&lt;/li&gt;
&lt;li&gt;An engineer-parent, that's me, watching every evening where the system fails.
The edtech market is huge, but it's mostly content platforms without an AI loop, in my view, or AI solvers that do the homework for the child. The middle, a machine that teaches how to learn from your own textbook, is nearly empty.
## What's next
A live mentor key, new pages as the school program moves on, and the main experiment: the same content model for a whole class, with teachers watching progress through public links.
If you're building something like this for your kids, I'd love to trade notes.
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/space-academy-ai-tutor-from-a-textbook/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/space-academy-ai-tutor-from-a-textbook/&lt;/a&gt;
tags: aiagents, edtech, llm, react&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>What Building Redis, Git and an LLM From Scratch Taught Us About Using Them</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Mon, 05 Oct 2026 13:43:30 +0000</pubDate>
      <link>https://dev.to/automatadotsale/what-building-redis-git-and-an-llm-from-scratch-taught-us-about-using-them-4fgb</link>
      <guid>https://dev.to/automatadotsale/what-building-redis-git-and-an-llm-from-scratch-taught-us-about-using-them-4fgb</guid>
      <description>&lt;p&gt;There is a GitHub repository with about 550,000 stars called &lt;a href="https://github.com/codecrafters-io/build-your-own-x" rel="noopener noreferrer"&gt;build-your-own-x&lt;/a&gt;. It is not a library. It is a curated catalog of step-by-step tutorials where people rebuild the technologies we all use daily: a SQLite clone in C, Redis in C++ or Python, a container in a hundred lines of Go, git from the inside, a vector search engine, even a small GPT. CC0 licensed, started by Daniel Stefanovic, maintained by CodeCrafters.&lt;br&gt;
The epigraph is Feynman: "What I cannot create, I do not understand." This post is about what happens to a team that takes that seriously.&lt;/p&gt;
&lt;h2&gt;
  
  
  The mechanic that changes how you work
&lt;/h2&gt;

&lt;p&gt;Take Redis. You use it for cache and queues. Then you spend an evening on a mini-Redis tutorial and the wire protocol stops being abstract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*2
$3
GET
$3
key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a GET command on the RESP protocol. Once you have parsed one with your own code, connection pool behavior, timeouts and persistence settings turn from copied flags into decisions. Same shift happens with B+trees after you build a storage engine page by page: &lt;code&gt;EXPLAIN&lt;/code&gt; output starts reading like a sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we actually use the catalog
&lt;/h2&gt;

&lt;p&gt;We do not read it cover to cover. We pull a tutorial when a task needs a fast prototype or a mental model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAG and agents.&lt;/strong&gt; &lt;a href="https://github.com/rasbt/LLMs-from-scratch" rel="noopener noreferrer"&gt;LLMs from scratch&lt;/a&gt; and Karpathy's &lt;a href="https://www.youtube.com/playlist?list=PLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ" rel="noopener noreferrer"&gt;Zero to Hero&lt;/a&gt; cover tokens, embeddings, attention. Chunking and retrieval choices stop being folklore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search and semantics.&lt;/strong&gt; The &lt;a href="https://boyter.org/2010/08/build-vector-space-search-engine-python/" rel="noopener noreferrer"&gt;vector space indexing engine&lt;/a&gt; and &lt;a href="https://stevenloria.com/tf-idf/" rel="noopener noreferrer"&gt;TF-IDF&lt;/a&gt; tutorials are the shortest path from TF-IDF to BM25 to embeddings, which is exactly the line search engines followed and the line LLMs read your site along today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow e-commerce queries.&lt;/strong&gt; &lt;a href="https://cstack.github.io/db_tutorial/" rel="noopener noreferrer"&gt;Let's Build a Simple Database&lt;/a&gt; teaches indexes and transactions from the inside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Front end.&lt;/strong&gt; &lt;a href="https://pomb.us/build-your-own-react/" rel="noopener noreferrer"&gt;Build your own React&lt;/a&gt; explains where render time actually goes, which matters in headless setups.
## The part that is not about code
Three effects we can put a business value on:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Juniors level up cheaper.&lt;/strong&gt; Assign a "build X" section matching your stack, and framework knowledge turns into platform understanding. You notice it in code review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contractor vetting.&lt;/strong&gt; Ask a candidate to explain what happens between a button press and data landing in the CRM. People who built a web server or a database answer in terms of HTTP, transactions and queues. People who only know a framework retell its marketing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build vs buy discipline.&lt;/strong&gt; Half of SaaS overspending is fear of simple internals. A team that built a mini version once estimates soberly what to buy and what is a week of work that stays yours.
## Honest limitations
Tutorial code is educational: no production error handling, security or load. We prototype with it and run proven systems in production. And each tutorial is hours, not an evening scroll. The return is compounding: everything you build once, you use correctly for the rest of your career.
## Where to start&lt;/li&gt;
&lt;li&gt;E-commerce owner: Database and Redis sections, mini-Redis in Python&lt;/li&gt;
&lt;li&gt;SEO or marketing: Search Engine section, TF-IDF first&lt;/li&gt;
&lt;li&gt;AI project: Neural Network and AI Model sections, Zero to Hero lectures&lt;/li&gt;
&lt;li&gt;Team lead: Docker and Git, containers in 500 lines
We keep a full breakdown with a role table on our blog: &lt;a href="https://automata.sale/en/blog/development/build-your-own-x-guide/" rel="noopener noreferrer"&gt;Build Your Own X: why this tutorial repo is good for business&lt;/a&gt;.
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/development/build-your-own-x-guide/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/development/build-your-own-x-guide/&lt;/a&gt;
tags: programming, ai, learning, webdev&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Replaced Three Marketing Reports With One Screen</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Mon, 28 Sep 2026 17:37:52 +0000</pubDate>
      <link>https://dev.to/automatadotsale/i-replaced-three-marketing-reports-with-one-screen-4cid</link>
      <guid>https://dev.to/automatadotsale/i-replaced-three-marketing-reports-with-one-screen-4cid</guid>
      <description>&lt;p&gt;For 14 years my promotion workflow looked like most small businesses: an SEO contractor sent a monthly ranking report, an SMM plan was written from inspiration, and traffic lived in an analytics account nobody opens daily. Three worlds, zero connections.&lt;br&gt;
This month I shipped an update to my own CRM that closes the loop. Here's the engineering story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop
&lt;/h2&gt;

&lt;p&gt;Semantic gap -&amp;gt; task -&amp;gt; article -&amp;gt; five networks -&amp;gt; traffic -&amp;gt; correction.&lt;br&gt;
Everything below exists to keep that loop visible on one screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A collector that speaks numbers
&lt;/h2&gt;

&lt;p&gt;I wrote a collector script that pulls four data flows into a single JSON file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traffic.&lt;/strong&gt; Visits by day, 30-day totals, month-over-month delta, organic share. It talks to a self-hosted analytics module through its REST API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantics.&lt;/strong&gt; My project's semantic core: 1,188 search phrases in 15 clusters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coverage.&lt;/strong&gt; The core matched against the live sitemap. Blog slugs are Cyrillic transliterated to Latin, with an exceptions map for words that already live in Latin (bitrix, crm), so I can match cluster phrases to URLs. Coverage comes out at 80%, and the gaps come out as a ranked list. That list is a computed content plan, not a guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMM.&lt;/strong&gt; Publication counts and statuses read straight from the pipeline's Postgres, plus drafts waiting in the queue.
The JSON feeds a REST endpoint, the endpoint feeds a CRM tab, and one Refresh button re-runs the collector. It's current again about a minute later.
## 2. A content pipeline with a taste test
I write each article once; an agent adapts it per platform. Telegram, VK and MAX for the Russian audience, Dev.to and LinkedIn in English. Limits and tone differ, and the pipeline validates length before anything ships.
The part I care most about is the linter. Before a human sees a draft, it runs five checks modeled on what public AI detectors measure: sentence-length variation, concreteness, stock vocabulary density, typographic fingerprint, and voice. Machine-written drafts fail, and they're rewritten until they pass. That gate is why this post doesn't read like a template.
## 3. A board that reads the numbers
My CRM runs an AI board of directors: a CEO role tracking a weekly plan, a CFO watching cash and price floors, a commercial director on receivables. With this update they get marketing KPIs too: visits delta, semantic coverage, posts shipped in 30 days, the top uncovered cluster. When a verdict lands in the shared journal, it's backed by the same numbers the screen shows.
## What changes in practice
If you run promotion for a small business, three things change:&lt;/li&gt;
&lt;li&gt;"What should I write next" becomes a computed answer. The system names the uncovered cluster; I write.&lt;/li&gt;
&lt;li&gt;"Did that post bring traffic" is one glance instead of three logins.&lt;/li&gt;
&lt;li&gt;Marketing spend defends itself with the dashboard your money people already read.
## What's next
Next stop is a Google Search Console adapter, so the loop closes on queries and clicks from search itself. The design leaves room for it: collectors are pluggable, and the screen doesn't care where a number came from.
---
This article was prepared with AI assistance (drafting and adaptation) and reviewed by the author before publishing.
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/automata-crm-pult-prodvizheniya/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/automata-crm-pult-prodvizheniya/&lt;/a&gt;
tags: aiagents, automation, marketing, indiehackers&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>analytics</category>
      <category>automation</category>
      <category>productivity</category>
      <category>software</category>
    </item>
    <item>
      <title>Shipping a MAX Messenger Bot and Channel in One Session — With an AI Agent Doing the Grunt Work</title>
      <dc:creator>Evgeniy Uryadov</dc:creator>
      <pubDate>Sun, 27 Sep 2026 18:58:46 +0000</pubDate>
      <link>https://dev.to/automatadotsale/shipping-a-max-messenger-bot-and-channel-in-one-session-with-an-ai-agent-doing-the-grunt-work-3pa7</link>
      <guid>https://dev.to/automatadotsale/shipping-a-max-messenger-bot-and-channel-in-one-session-with-an-ai-agent-doing-the-grunt-work-3pa7</guid>
      <description>&lt;p&gt;MAX is the messenger Russian business audiences are actively migrating to (2026). I needed a presence there: a bot, a public channel, and an auto-posting pipeline from my blog. The classical path is an evening with docs and a developer console. Instead, I gave the task to an AI coding agent (ZCode) in one sentence and supervised the execution.&lt;br&gt;
This post is the engineering debrief: what the agent built, and the three undocumented traps we hit — the parts you won't find in the official docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent shipped in one working session
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A bot registered on the MAX partner platform (verified sole-proprietor profile required; moderation passed within hours).&lt;/li&gt;
&lt;li&gt;A TypeScript publisher: API client, error classification (transient / auth / captcha / ToS / validation / UI-drift), a rate-limited scheduler, and per-platform text adaptation.&lt;/li&gt;
&lt;li&gt;A public channel with the bot as admin.&lt;/li&gt;
&lt;li&gt;The first automated post — this very text, in fact.
## Trap 1: The silently clipped token
The API token copied manually from the platform UI was rejected with &lt;code&gt;Invalid access_token&lt;/code&gt;. The reason was embarrassingly mundane: manual text selection clipped the end of the string. Copy with the icon, not with the mouse.
Lesson for anything that stores tokens: validate length or do a round-trip health check (&lt;code&gt;GET /me&lt;/code&gt;) before assuming the credential is wrong elsewhere.
## Trap 2: The base URL in the docs is dead
The official documentation names &lt;code&gt;platform-api2.max.ru&lt;/code&gt; as the API host. It did not respond — from Russia, and (we checked through a US relay) from abroad either. The working host turned out to be &lt;code&gt;botapi.max.ru&lt;/code&gt;, discovered by controlled probing.
Young-platform reality: docs drift. Build your client behind an interface so the base URL is a config value, not a constant.
## Trap 3: A fresh bot is invisible in channel admin search
The documented flow — "add the bot as a channel member, then make it an admin" — assumes you can find the bot in the admin picker. You can't: until published to the catalog, a bot doesn't show up in channel settings search at all.
The working sequence:&lt;/li&gt;
&lt;li&gt;Open a direct dialog with the bot by its exact link and press &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the channel: &lt;strong&gt;Subscribers → Add subscribers&lt;/strong&gt; — now the bot appears among your recent contacts.&lt;/li&gt;
&lt;li&gt;Add it, then promote it to admin with publish rights.
Bonus undocumented behavior: the channel's &lt;code&gt;chat_id&lt;/code&gt; is not discoverable statically. It arrives as a &lt;code&gt;bot_added&lt;/code&gt; event in the bot's update queue — you subscribe (&lt;code&gt;GET /updates&lt;/code&gt;) and read it from the event.
## How the pipeline works now
One phrase to the agent ("publish this article") from any project triggers:&lt;/li&gt;
&lt;li&gt;the article lands on the blog (Astro, three languages: ru/en/kk with hreflang);&lt;/li&gt;
&lt;li&gt;the agent writes a separate adaptation per platform — different hooks, lengths, and tones, not copies;&lt;/li&gt;
&lt;li&gt;every text waits for explicit human approval before anything goes out;&lt;/li&gt;
&lt;li&gt;posts land on Telegram, VK, MAX, and now DEV — with the original article's URL set as &lt;code&gt;canonical_url&lt;/code&gt; on platforms that support it.
## Cheat sheet&lt;/li&gt;
&lt;li&gt;Host: &lt;code&gt;botapi.max.ru&lt;/code&gt; (as of Sept 2026).&lt;/li&gt;
&lt;li&gt;Auth: &lt;code&gt;Authorization: &amp;lt;token&amp;gt;&lt;/code&gt; header — query parameters are deprecated and rejected.&lt;/li&gt;
&lt;li&gt;Token: copy via the UI icon; verify with &lt;code&gt;GET /me&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Channel: dialog with bot → Start → add via Subscribers → promote to admin.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat_id&lt;/code&gt;: from the &lt;code&gt;bot_added&lt;/code&gt; event in &lt;code&gt;GET /updates&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rate limits: comfortable for content posting (a handful of posts per day is nowhere near them).
Originally published at &lt;a href="https://automata.sale/en/blog/ai-automation/max-bot-i-kanal-cherez-zcode-agenta/" rel="noopener noreferrer"&gt;https://automata.sale/en/blog/ai-automation/max-bot-i-kanal-cherez-zcode-agenta/&lt;/a&gt;
---
This article was prepared with AI assistance (drafting and adaptation by a coding agent) and reviewed by the author before publishing.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
