<?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 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>
