<?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: Alex Shcoder?</title>
    <description>The latest articles on DEV Community by Alex Shcoder? (@leshan).</description>
    <link>https://dev.to/leshan</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%2F2162533%2Fd2d72cd1-dc29-435a-9c36-4fa8071e3b78.jpeg</url>
      <title>DEV Community: Alex Shcoder?</title>
      <link>https://dev.to/leshan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leshan"/>
    <language>en</language>
    <item>
      <title>Deploying a Telegram Bot Should Not Require Becoming a DevOps Engineer</title>
      <dc:creator>Alex Shcoder?</dc:creator>
      <pubDate>Wed, 22 Jul 2026 22:53:58 +0000</pubDate>
      <link>https://dev.to/leshan/deploying-a-telegram-bot-should-not-require-becoming-a-devops-engineer-51eo</link>
      <guid>https://dev.to/leshan/deploying-a-telegram-bot-should-not-require-becoming-a-devops-engineer-51eo</guid>
      <description>&lt;p&gt;A Telegram bot can be surprisingly small.&lt;/p&gt;

&lt;p&gt;The first version may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one command handler;&lt;/li&gt;
&lt;li&gt;a few API calls;&lt;/li&gt;
&lt;li&gt;a database connection;&lt;/li&gt;
&lt;li&gt;several environment variables;&lt;/li&gt;
&lt;li&gt;a background loop or webhook;&lt;/li&gt;
&lt;li&gt;a couple hundred lines of Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building it can take an evening.&lt;/p&gt;

&lt;p&gt;Keeping it online is where the project suddenly turns into infrastructure work.&lt;/p&gt;

&lt;p&gt;You need a server, a process manager, logs, HTTPS, secrets, restarts, updates, and some way to understand why the bot stopped responding at 3 a.m.&lt;/p&gt;

&lt;p&gt;For a production platform, that work is reasonable.&lt;/p&gt;

&lt;p&gt;For a prototype, internal tool, weekend project, or first customer demo, it is often too much.&lt;/p&gt;

&lt;p&gt;That gap is why I started building &lt;a href="https://deployka.dev/en?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram_bot_without_devops" rel="noopener noreferrer"&gt;Deployka&lt;/a&gt;: a deployment service focused on Telegram bots, small MVPs, automation scripts, and AI projects.&lt;/p&gt;

&lt;p&gt;This article is not a guide to building another Kubernetes abstraction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31mrqks8rfy7mwn2gx3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31mrqks8rfy7mwn2gx3b.png" alt="Deployka dashboard showing Telegram bot deployment, uptime, logs, monitoring, and a no-DevOps workflow" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is about a simpler question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the minimum deployment experience a small bot actually needs?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The code is rarely the hard part
&lt;/h2&gt;

&lt;p&gt;Consider a simple Python bot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram.ext&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CommandHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ContextTypes&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContextTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_TYPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The bot is running.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CommandHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_polling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Locally, the workflow is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;
python bot.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bot works.&lt;/p&gt;

&lt;p&gt;But a local terminal is not a deployment environment.&lt;/p&gt;

&lt;p&gt;The moment the bot must run continuously, a new list of questions appears:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where should the process run?&lt;/li&gt;
&lt;li&gt;How does it restart after a crash?&lt;/li&gt;
&lt;li&gt;Where should the token be stored?&lt;/li&gt;
&lt;li&gt;How can I view logs?&lt;/li&gt;
&lt;li&gt;What happens after I update the code?&lt;/li&gt;
&lt;li&gt;How do I know whether the process is healthy?&lt;/li&gt;
&lt;li&gt;Do I need Docker?&lt;/li&gt;
&lt;li&gt;Do I need a reverse proxy?&lt;/li&gt;
&lt;li&gt;Do I need a domain and TLS certificate?&lt;/li&gt;
&lt;li&gt;How do I avoid breaking the currently running version?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these questions are unusual.&lt;/p&gt;

&lt;p&gt;The problem is that they arrive before the project has earned the complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Just rent a VPS” is only the beginning
&lt;/h2&gt;

&lt;p&gt;A virtual private server is flexible and inexpensive.&lt;/p&gt;

&lt;p&gt;It is also a blank machine.&lt;/p&gt;

&lt;p&gt;A typical manual deployment can involve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@server
apt update
apt &lt;span class="nb"&gt;install &lt;/span&gt;python3 python3-venv git
git clone ...
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the process needs to remain alive after the SSH session closes.&lt;/p&gt;

&lt;p&gt;That usually means adding &lt;code&gt;systemd&lt;/code&gt;, Supervisor, Docker Compose, or another process manager.&lt;/p&gt;

&lt;p&gt;A basic &lt;code&gt;systemd&lt;/code&gt; unit might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Telegram bot&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/opt/my-bot&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/opt/my-bot/.venv/bin/python bot.py&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;EnvironmentFile&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/opt/my-bot/.env&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not particularly difficult for an experienced infrastructure engineer.&lt;/p&gt;

&lt;p&gt;It is still operational surface area:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux package updates;&lt;/li&gt;
&lt;li&gt;SSH access;&lt;/li&gt;
&lt;li&gt;firewall configuration;&lt;/li&gt;
&lt;li&gt;service files;&lt;/li&gt;
&lt;li&gt;environment files;&lt;/li&gt;
&lt;li&gt;log rotation;&lt;/li&gt;
&lt;li&gt;disk usage;&lt;/li&gt;
&lt;li&gt;backups;&lt;/li&gt;
&lt;li&gt;runtime upgrades;&lt;/li&gt;
&lt;li&gt;incident recovery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A VPS gives you a machine.&lt;/p&gt;

&lt;p&gt;It does not give you a product deployment workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker helps, but it does not remove operations
&lt;/h2&gt;

&lt;p&gt;Docker improves reproducibility.&lt;/p&gt;

&lt;p&gt;A small bot can be packaged with a short &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "bot.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That solves an important problem: the application now has a predictable runtime.&lt;/p&gt;

&lt;p&gt;But the container still needs somewhere to run.&lt;/p&gt;

&lt;p&gt;Someone must still handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;image builds;&lt;/li&gt;
&lt;li&gt;container restarts;&lt;/li&gt;
&lt;li&gt;environment variables;&lt;/li&gt;
&lt;li&gt;logs;&lt;/li&gt;
&lt;li&gt;networking;&lt;/li&gt;
&lt;li&gt;persistent storage;&lt;/li&gt;
&lt;li&gt;deployments;&lt;/li&gt;
&lt;li&gt;rollbacks;&lt;/li&gt;
&lt;li&gt;health checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker is a packaging format, not a complete hosting experience.&lt;/p&gt;

&lt;p&gt;For many small projects, the ideal workflow is not “learn more infrastructure.”&lt;/p&gt;

&lt;p&gt;It is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code → configure secrets → deploy → view logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What a small bot actually needs
&lt;/h2&gt;

&lt;p&gt;A lightweight deployment platform does not need to solve every enterprise infrastructure problem.&lt;/p&gt;

&lt;p&gt;It needs to solve the first operational problems well.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A predictable runtime
&lt;/h3&gt;

&lt;p&gt;The platform should identify or accept the project runtime, install dependencies, and start the correct process.&lt;/p&gt;

&lt;p&gt;For a Python bot, this may mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detecting &lt;code&gt;requirements.txt&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;installing packages;&lt;/li&gt;
&lt;li&gt;starting the configured command;&lt;/li&gt;
&lt;li&gt;keeping the process alive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a web API, the start command may be different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn app:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; &lt;span class="nv"&gt;$PORT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The platform does not need to guess everything.&lt;/p&gt;

&lt;p&gt;It does need to make the required configuration obvious.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Environment variables
&lt;/h3&gt;

&lt;p&gt;Secrets should not live inside the repository.&lt;/p&gt;

&lt;p&gt;A deployment flow should provide a clear place for values such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN
OPENAI_API_KEY
DATABASE_URL
WEBHOOK_SECRET
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not only storing them.&lt;/p&gt;

&lt;p&gt;The interface should also make it easy to see which variables are required without displaying secret values unnecessarily.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Logs that are easy to find
&lt;/h3&gt;

&lt;p&gt;When a bot stops working, the first question is usually:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happened?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Logs should not require another monitoring product or an SSH session.&lt;/p&gt;

&lt;p&gt;For an early-stage project, a useful log view needs to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the build succeed?&lt;/li&gt;
&lt;li&gt;Did the process start?&lt;/li&gt;
&lt;li&gt;Which error caused it to exit?&lt;/li&gt;
&lt;li&gt;Is it restarting repeatedly?&lt;/li&gt;
&lt;li&gt;Did the application receive a request or update?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good logs reduce support work for both the developer and the hosting platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Restart without server access
&lt;/h3&gt;

&lt;p&gt;A failed process should restart automatically when appropriate.&lt;/p&gt;

&lt;p&gt;The developer should also be able to trigger a manual restart from the dashboard.&lt;/p&gt;

&lt;p&gt;This sounds like a tiny feature.&lt;/p&gt;

&lt;p&gt;It removes a large amount of friction for people who would otherwise need to connect to a server just to restart one process.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. HTTPS when the project needs a web endpoint
&lt;/h3&gt;

&lt;p&gt;Polling bots may not need a public HTTP endpoint.&lt;/p&gt;

&lt;p&gt;Webhooks, FastAPI services, Flask apps, and small MVPs often do.&lt;/p&gt;

&lt;p&gt;Automatic HTTPS removes an entire class of setup work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;certificates;&lt;/li&gt;
&lt;li&gt;renewal;&lt;/li&gt;
&lt;li&gt;reverse-proxy configuration;&lt;/li&gt;
&lt;li&gt;domain routing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user should be able to move from code to a working HTTPS endpoint without becoming an Nginx administrator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polling and webhooks are different deployment shapes
&lt;/h2&gt;

&lt;p&gt;Telegram bots commonly receive updates through long polling or webhooks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long polling
&lt;/h3&gt;

&lt;p&gt;The process continuously asks Telegram for new updates.&lt;/p&gt;

&lt;p&gt;This is operationally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no public endpoint is required;&lt;/li&gt;
&lt;li&gt;the process must stay alive;&lt;/li&gt;
&lt;li&gt;only one active polling instance should normally consume updates for the bot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deployment platform mainly needs to run a reliable background process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Webhooks
&lt;/h3&gt;

&lt;p&gt;Telegram sends updates to an HTTPS endpoint.&lt;/p&gt;

&lt;p&gt;This requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a public URL;&lt;/li&gt;
&lt;li&gt;TLS;&lt;/li&gt;
&lt;li&gt;request routing;&lt;/li&gt;
&lt;li&gt;a web server;&lt;/li&gt;
&lt;li&gt;webhook registration;&lt;/li&gt;
&lt;li&gt;a process listening on the platform-provided port.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A webhook bot looks more like a small web service.&lt;/p&gt;

&lt;p&gt;The important product decision is not to force every bot into the same deployment model.&lt;/p&gt;

&lt;p&gt;The platform should support the shape of the application instead of requiring the application to be redesigned around the hosting platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Templates are useful when they remain transparent
&lt;/h2&gt;

&lt;p&gt;A template can reduce the time from an idea to a running project.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Python Telegram bot;&lt;/li&gt;
&lt;li&gt;a FastAPI application;&lt;/li&gt;
&lt;li&gt;a scheduled Python script;&lt;/li&gt;
&lt;li&gt;a parser that runs on a schedule;&lt;/li&gt;
&lt;li&gt;an AI agent connected to Telegram;&lt;/li&gt;
&lt;li&gt;an automation service such as n8n.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployka publishes a growing set of &lt;a href="https://deployka.dev/en/templates?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram_bot_without_devops" rel="noopener noreferrer"&gt;deployment templates&lt;/a&gt; and &lt;a href="https://deployka.dev/en/docs?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram_bot_without_devops" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for these project types.&lt;/p&gt;

&lt;p&gt;But templates become dangerous when they hide too much.&lt;/p&gt;

&lt;p&gt;A useful template should make clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what code will run;&lt;/li&gt;
&lt;li&gt;which environment variables are required;&lt;/li&gt;
&lt;li&gt;which process starts;&lt;/li&gt;
&lt;li&gt;whether storage is persistent;&lt;/li&gt;
&lt;li&gt;whether the project exposes a web endpoint;&lt;/li&gt;
&lt;li&gt;which external services it contacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“One click” should remove repetitive setup.&lt;/p&gt;

&lt;p&gt;It should not remove the developer’s understanding of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI projects make deployment friction more visible
&lt;/h2&gt;

&lt;p&gt;A basic AI bot may depend on several services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Telegram
   ↓
Bot process
   ↓
Model API
   ↓
Database or vector store
   ↓
Logs and monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first prototype may only need two environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN
OPENAI_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later versions may add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a database;&lt;/li&gt;
&lt;li&gt;a queue;&lt;/li&gt;
&lt;li&gt;scheduled jobs;&lt;/li&gt;
&lt;li&gt;file processing;&lt;/li&gt;
&lt;li&gt;embeddings;&lt;/li&gt;
&lt;li&gt;browser automation;&lt;/li&gt;
&lt;li&gt;multiple workers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is easy to overbuild the infrastructure before users have validated the product.&lt;/p&gt;

&lt;p&gt;The first deployment system should make the simple version easy while leaving a path to a more advanced architecture later.&lt;/p&gt;

&lt;p&gt;A prototype hosting platform does not need to replace every cloud provider.&lt;/p&gt;

&lt;p&gt;It needs to help the developer reach the point where a more sophisticated setup is justified.&lt;/p&gt;

&lt;h2&gt;
  
  
  The goal is not “no DevOps forever”
&lt;/h2&gt;

&lt;p&gt;“No DevOps” is useful product language, but technically every hosted application has operations somewhere.&lt;/p&gt;

&lt;p&gt;Someone still manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compute;&lt;/li&gt;
&lt;li&gt;networking;&lt;/li&gt;
&lt;li&gt;builds;&lt;/li&gt;
&lt;li&gt;runtime isolation;&lt;/li&gt;
&lt;li&gt;restarts;&lt;/li&gt;
&lt;li&gt;security updates;&lt;/li&gt;
&lt;li&gt;capacity;&lt;/li&gt;
&lt;li&gt;failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real goal is different:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The application developer should not need to manage infrastructure that does not differentiate the product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A founder building a Telegram assistant should spend time on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the conversation flow;&lt;/li&gt;
&lt;li&gt;reliability of answers;&lt;/li&gt;
&lt;li&gt;onboarding;&lt;/li&gt;
&lt;li&gt;user feedback;&lt;/li&gt;
&lt;li&gt;pricing;&lt;/li&gt;
&lt;li&gt;retention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They should not spend the first weekend configuring log rotation.&lt;/p&gt;

&lt;p&gt;As the product grows, its infrastructure requirements may grow too.&lt;/p&gt;

&lt;p&gt;That is normal.&lt;/p&gt;

&lt;p&gt;The deployment experience should match the current stage of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a simple platform is the wrong choice
&lt;/h2&gt;

&lt;p&gt;A lightweight hosting service is not the best fit for every workload.&lt;/p&gt;

&lt;p&gt;You may need a more advanced platform when the project requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple tightly coordinated services;&lt;/li&gt;
&lt;li&gt;private networking;&lt;/li&gt;
&lt;li&gt;custom load balancing;&lt;/li&gt;
&lt;li&gt;dedicated GPUs;&lt;/li&gt;
&lt;li&gt;strict regional deployment;&lt;/li&gt;
&lt;li&gt;complex persistent storage;&lt;/li&gt;
&lt;li&gt;high availability across regions;&lt;/li&gt;
&lt;li&gt;advanced autoscaling;&lt;/li&gt;
&lt;li&gt;enterprise access controls;&lt;/li&gt;
&lt;li&gt;custom observability pipelines;&lt;/li&gt;
&lt;li&gt;regulated infrastructure requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, a larger PaaS, managed container platform, or cloud provider may be more appropriate.&lt;/p&gt;

&lt;p&gt;The useful question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which platform is the most powerful?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which platform removes the most work without hiding capabilities this project actually needs?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A practical deployment checklist
&lt;/h2&gt;

&lt;p&gt;Before deploying a Telegram bot or small AI service, write down:&lt;/p&gt;

&lt;h3&gt;
  
  
  Runtime
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;language and version;&lt;/li&gt;
&lt;li&gt;dependency file;&lt;/li&gt;
&lt;li&gt;start command;&lt;/li&gt;
&lt;li&gt;whether the process is a worker or web service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;required environment variables;&lt;/li&gt;
&lt;li&gt;secret rotation plan;&lt;/li&gt;
&lt;li&gt;external API dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;polling or webhook;&lt;/li&gt;
&lt;li&gt;required public endpoint;&lt;/li&gt;
&lt;li&gt;expected port;&lt;/li&gt;
&lt;li&gt;custom domain requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  State
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;whether files must persist;&lt;/li&gt;
&lt;li&gt;database requirements;&lt;/li&gt;
&lt;li&gt;backup expectations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;where logs appear;&lt;/li&gt;
&lt;li&gt;restart behaviour;&lt;/li&gt;
&lt;li&gt;health checks;&lt;/li&gt;
&lt;li&gt;deployment and rollback process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;expected traffic;&lt;/li&gt;
&lt;li&gt;memory requirements;&lt;/li&gt;
&lt;li&gt;CPU-intensive tasks;&lt;/li&gt;
&lt;li&gt;long-running jobs;&lt;/li&gt;
&lt;li&gt;API rate limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This checklist is intentionally small.&lt;/p&gt;

&lt;p&gt;Its purpose is to prevent surprises without turning a prototype into an infrastructure project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am building with Deployka
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://deployka.dev/en?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram_bot_without_devops" rel="noopener noreferrer"&gt;Deployka&lt;/a&gt; is focused on a narrow deployment experience:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Launch bots, MVPs, automation scripts, and AI projects without manually operating a server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The current product is built around a straightforward workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upload or connect code
        ↓
configure variables
        ↓
build and deploy
        ↓
receive HTTPS when needed
        ↓
view logs and restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dashboard is designed around the actions a small project needs most often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deploy;&lt;/li&gt;
&lt;li&gt;inspect logs;&lt;/li&gt;
&lt;li&gt;restart;&lt;/li&gt;
&lt;li&gt;update configuration;&lt;/li&gt;
&lt;li&gt;understand whether the project is running.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The platform also includes starter templates for common bot, automation, and AI workloads.&lt;/p&gt;

&lt;p&gt;The objective is not to become the most complex cloud platform.&lt;/p&gt;

&lt;p&gt;It is to make the first reliable deployment much less intimidating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The first version of a bot should be allowed to remain small.&lt;/p&gt;

&lt;p&gt;Its deployment process should not require a second project consisting of shell scripts, service files, reverse proxies, and server maintenance.&lt;/p&gt;

&lt;p&gt;Developers should still understand how their application runs.&lt;/p&gt;

&lt;p&gt;They should still know where data goes, how secrets are handled, and what happens when the process fails.&lt;/p&gt;

&lt;p&gt;But they should be able to learn those things through a clear product workflow rather than by assembling an operations stack from scratch.&lt;/p&gt;

&lt;p&gt;A Telegram bot may contain only a few hundred lines of code.&lt;/p&gt;

&lt;p&gt;Getting it online should feel proportional to the thing being deployed.&lt;/p&gt;




&lt;p&gt;You can explore the current platform, templates, and documentation at &lt;a href="https://deployka.dev/en?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram_bot_without_devops" rel="noopener noreferrer"&gt;Deployka&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I used an AI writing assistant to help structure and edit this article. The product decisions, technical examples, conclusions, and final review are my own.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>hosting</category>
      <category>telegram</category>
      <category>devops</category>
    </item>
    <item>
      <title>Before You Ask If Your AI Product Complies, Build an AI System Brief</title>
      <dc:creator>Alex Shcoder?</dc:creator>
      <pubDate>Wed, 22 Jul 2026 22:38:39 +0000</pubDate>
      <link>https://dev.to/leshan/before-you-ask-if-your-ai-product-complies-build-an-ai-system-brief-i5k</link>
      <guid>https://dev.to/leshan/before-you-ask-if-your-ai-product-complies-build-an-ai-system-brief-i5k</guid>
      <description>&lt;p&gt;Most AI teams begin compliance work with the wrong question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does our product comply with the EU AI Act?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounds reasonable. But a lawyer, compliance specialist, enterprise customer, or assessment tool cannot answer it responsibly without first understanding what the product actually does.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpvz8y3wdm0sbhiwl10an.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpvz8y3wdm0sbhiwl10an.png" alt="AI system brief template showing intended purpose, users, data, human oversight, evidence, and review history for EU AI Act readiness" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the AI system is intended to do;&lt;/li&gt;
&lt;li&gt;who uses it;&lt;/li&gt;
&lt;li&gt;who is affected by its outputs;&lt;/li&gt;
&lt;li&gt;what decisions it influences;&lt;/li&gt;
&lt;li&gt;which models and vendors are involved;&lt;/li&gt;
&lt;li&gt;what data it processes;&lt;/li&gt;
&lt;li&gt;where human review exists;&lt;/li&gt;
&lt;li&gt;what evidence the company can provide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without those facts, “Are we compliant?” is not yet a legal question.&lt;/p&gt;

&lt;p&gt;It is an incomplete product-discovery task.&lt;/p&gt;

&lt;p&gt;Before building a large compliance program, create a concise AI system brief.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This article is for general informational purposes and is not legal advice.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Compliance starts with product facts
&lt;/h2&gt;

&lt;p&gt;Companies often describe themselves as having “an AI product.”&lt;/p&gt;

&lt;p&gt;In practice, one SaaS application may contain several separate AI-enabled systems or features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a customer-facing chatbot;&lt;/li&gt;
&lt;li&gt;a summarisation tool;&lt;/li&gt;
&lt;li&gt;a recommendation engine;&lt;/li&gt;
&lt;li&gt;a fraud-risk score;&lt;/li&gt;
&lt;li&gt;a document classifier;&lt;/li&gt;
&lt;li&gt;a candidate-ranking feature;&lt;/li&gt;
&lt;li&gt;an internal support assistant;&lt;/li&gt;
&lt;li&gt;an agent that can update records or send messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features may have different purposes, users, risks, and technical dependencies.&lt;/p&gt;

&lt;p&gt;A chatbot that answers product questions is not necessarily analysed in the same way as a system that ranks applicants for employment.&lt;/p&gt;

&lt;p&gt;Even when both features use the same underlying model, their legal and operational context can be very different.&lt;/p&gt;

&lt;p&gt;The first useful step is therefore not assigning one compliance label to the entire company.&lt;/p&gt;

&lt;p&gt;It is identifying the individual AI systems inside the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with intended purpose
&lt;/h2&gt;

&lt;p&gt;The intended purpose is one of the most important fields in an AI system brief.&lt;/p&gt;

&lt;p&gt;Avoid vague descriptions such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We use AI to improve productivity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That does not explain what the system actually does.&lt;/p&gt;

&lt;p&gt;A better description would be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The system analyses incoming customer-support tickets, assigns a suggested category, and drafts a proposed response for review by a support agent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That statement reveals several important facts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the system analyses customer communications;&lt;/li&gt;
&lt;li&gt;it classifies tickets;&lt;/li&gt;
&lt;li&gt;it generates text;&lt;/li&gt;
&lt;li&gt;a human is expected to review the output;&lt;/li&gt;
&lt;li&gt;the result supports a business process rather than independently completing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare it with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The system analyses job applications, assigns each candidate a suitability score, and determines which candidates are shown to a recruiter first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both products may be described as “AI assistants.”&lt;/p&gt;

&lt;p&gt;But the second system influences an employment-related process involving natural persons.&lt;/p&gt;

&lt;p&gt;The label “AI assistant” tells us very little.&lt;/p&gt;

&lt;p&gt;The intended purpose tells us much more.&lt;/p&gt;

&lt;p&gt;The AI Act’s official &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-6" rel="noopener noreferrer"&gt;Article 6 classification rules&lt;/a&gt; focus on the system’s intended purpose, the use case, and whether the output materially influences decision-making.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identify the people involved
&lt;/h2&gt;

&lt;p&gt;An AI system brief should distinguish between at least three groups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Users
&lt;/h3&gt;

&lt;p&gt;The people who directly operate or interact with the system.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;support agents;&lt;/li&gt;
&lt;li&gt;recruiters;&lt;/li&gt;
&lt;li&gt;administrators;&lt;/li&gt;
&lt;li&gt;consumers;&lt;/li&gt;
&lt;li&gt;developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Affected people
&lt;/h3&gt;

&lt;p&gt;The people whose opportunities, access, treatment, or experience may be influenced by the output.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;job applicants;&lt;/li&gt;
&lt;li&gt;borrowers;&lt;/li&gt;
&lt;li&gt;students;&lt;/li&gt;
&lt;li&gt;patients;&lt;/li&gt;
&lt;li&gt;employees;&lt;/li&gt;
&lt;li&gt;customers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Responsible people
&lt;/h3&gt;

&lt;p&gt;The people expected to review outputs, handle incidents, approve changes, or respond to complaints.&lt;/p&gt;

&lt;p&gt;These groups are not always the same.&lt;/p&gt;

&lt;p&gt;A recruiter may use a ranking tool, job applicants may be affected by it, and an HR manager may be responsible for oversight.&lt;/p&gt;

&lt;p&gt;Documenting these relationships makes later risk and governance discussions much more concrete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Record what the output influences
&lt;/h2&gt;

&lt;p&gt;Do not stop at describing what the model produces.&lt;/p&gt;

&lt;p&gt;Document what happens next.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The system produces a score from 0 to 100.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is technically correct but incomplete.&lt;/p&gt;

&lt;p&gt;A more useful explanation is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The score determines the order in which applications are reviewed. Candidates below a threshold are not automatically rejected, but recruiters rarely review them under the current workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second version explains the practical influence of the system.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the output informational?&lt;/li&gt;
&lt;li&gt;Is it a recommendation?&lt;/li&gt;
&lt;li&gt;Does it rank or score people?&lt;/li&gt;
&lt;li&gt;Does it determine eligibility?&lt;/li&gt;
&lt;li&gt;Does it automatically trigger an action?&lt;/li&gt;
&lt;li&gt;Can a person override it?&lt;/li&gt;
&lt;li&gt;Does the reviewer realistically have enough time and context to evaluate it?&lt;/li&gt;
&lt;li&gt;What happens when the model is uncertain?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A system may be described as “advisory” while still having a major practical effect on decisions.&lt;/p&gt;

&lt;p&gt;The workflow matters as much as the interface label.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write down your role hypothesis
&lt;/h2&gt;

&lt;p&gt;The AI Act assigns responsibilities to different operators, including providers, deployers, importers, and distributors.&lt;/p&gt;

&lt;p&gt;The official definitions are available in &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-3" rel="noopener noreferrer"&gt;Article 3 of the AI Act&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A company that uses a third-party model is not automatically “only a deployer.” The analysis may depend on how the resulting system is developed, branded, placed on the market, and used.&lt;/p&gt;

&lt;p&gt;Your brief should therefore contain a role hypothesis rather than a confident label with no explanation.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Potential role:
Provider of the customer-facing AI system

Confidence:
Medium

Reason:
We define the intended purpose, integrate the model into our
application, and offer the resulting system under our own name.

Missing facts:
Whether the customer materially changes the system's intended purpose.

Legal confirmation required:
Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Documented uncertainty is more useful than an unexplained green checkmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Map the technical dependencies
&lt;/h2&gt;

&lt;p&gt;Most AI SaaS products depend on several external components.&lt;/p&gt;

&lt;p&gt;A system brief should identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model providers;&lt;/li&gt;
&lt;li&gt;hosting providers;&lt;/li&gt;
&lt;li&gt;vector databases;&lt;/li&gt;
&lt;li&gt;analytics tools;&lt;/li&gt;
&lt;li&gt;observability platforms;&lt;/li&gt;
&lt;li&gt;data-labelling services;&lt;/li&gt;
&lt;li&gt;document-processing services;&lt;/li&gt;
&lt;li&gt;speech or image APIs;&lt;/li&gt;
&lt;li&gt;open-source models and libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each dependency, record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it provides;&lt;/li&gt;
&lt;li&gt;what data is sent to it;&lt;/li&gt;
&lt;li&gt;where processing occurs;&lt;/li&gt;
&lt;li&gt;how long data is retained;&lt;/li&gt;
&lt;li&gt;whether customer data may be used for training;&lt;/li&gt;
&lt;li&gt;how model updates are communicated;&lt;/li&gt;
&lt;li&gt;what technical documentation is available;&lt;/li&gt;
&lt;li&gt;what happens if the vendor changes or retires a model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using a well-known model provider does not answer questions about your own product.&lt;/p&gt;

&lt;p&gt;Your application still has its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intended purpose;&lt;/li&gt;
&lt;li&gt;interface;&lt;/li&gt;
&lt;li&gt;integrations;&lt;/li&gt;
&lt;li&gt;users;&lt;/li&gt;
&lt;li&gt;data flows;&lt;/li&gt;
&lt;li&gt;safeguards;&lt;/li&gt;
&lt;li&gt;failure modes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete system is what customers and affected people experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capture the data flow
&lt;/h2&gt;

&lt;p&gt;A useful data-flow description does not need to begin as a complex architecture diagram.&lt;/p&gt;

&lt;p&gt;A simple table may be enough:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Retention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User input&lt;/td&gt;
&lt;td&gt;Support message&lt;/td&gt;
&lt;td&gt;Application server&lt;/td&gt;
&lt;td&gt;Create ticket&lt;/td&gt;
&lt;td&gt;12 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model request&lt;/td&gt;
&lt;td&gt;Ticket text&lt;/td&gt;
&lt;td&gt;Model API&lt;/td&gt;
&lt;td&gt;Draft response&lt;/td&gt;
&lt;td&gt;Provider-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logging&lt;/td&gt;
&lt;td&gt;Prompt and output&lt;/td&gt;
&lt;td&gt;Observability platform&lt;/td&gt;
&lt;td&gt;Debugging&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review&lt;/td&gt;
&lt;td&gt;Draft and edits&lt;/td&gt;
&lt;td&gt;Internal dashboard&lt;/td&gt;
&lt;td&gt;Human approval&lt;/td&gt;
&lt;td&gt;12 months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is to make hidden processing visible.&lt;/p&gt;

&lt;p&gt;This often reveals important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are personal details included in model requests?&lt;/li&gt;
&lt;li&gt;Are prompts stored by external providers?&lt;/li&gt;
&lt;li&gt;Can sensitive fields be removed?&lt;/li&gt;
&lt;li&gt;Are logs accessible to too many employees?&lt;/li&gt;
&lt;li&gt;Does deletion cover every vendor?&lt;/li&gt;
&lt;li&gt;Can the company reproduce which model produced an output?&lt;/li&gt;
&lt;li&gt;Can the company identify which system version was active during an incident?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions matter for privacy, security, procurement, debugging, and incident response even before a specific AI Act obligation is confirmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Document human oversight honestly
&lt;/h2&gt;

&lt;p&gt;Many product descriptions contain the phrase:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A human is always in the loop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That statement is often too vague to be useful.&lt;/p&gt;

&lt;p&gt;A system brief should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who is the responsible human?&lt;/li&gt;
&lt;li&gt;At which point do they review the output?&lt;/li&gt;
&lt;li&gt;What information do they see?&lt;/li&gt;
&lt;li&gt;Can they reject or modify the result?&lt;/li&gt;
&lt;li&gt;Are they trained to identify failures?&lt;/li&gt;
&lt;li&gt;Are overrides recorded?&lt;/li&gt;
&lt;li&gt;What happens under high workload?&lt;/li&gt;
&lt;li&gt;Can an affected person request human review?&lt;/li&gt;
&lt;li&gt;Who handles escalations?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A confirmation button does not automatically create meaningful oversight.&lt;/p&gt;

&lt;p&gt;If employees approve hundreds of outputs per hour without enough context to evaluate them, the formal presence of a human may not reflect the real workflow.&lt;/p&gt;

&lt;p&gt;Describe what happens in practice, not only what the interface allows in theory.&lt;/p&gt;

&lt;p&gt;For high-risk AI systems, human-oversight requirements are addressed specifically in &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-14" rel="noopener noreferrer"&gt;Article 14&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a lightweight evidence pack
&lt;/h2&gt;

&lt;p&gt;Compliance is not only about saying that controls exist.&lt;/p&gt;

&lt;p&gt;It is about being able to show them.&lt;/p&gt;

&lt;p&gt;A lightweight evidence pack may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the AI-system inventory;&lt;/li&gt;
&lt;li&gt;a one-page brief for each system;&lt;/li&gt;
&lt;li&gt;model and vendor inventory;&lt;/li&gt;
&lt;li&gt;intended-purpose description;&lt;/li&gt;
&lt;li&gt;data-flow description;&lt;/li&gt;
&lt;li&gt;user disclosures;&lt;/li&gt;
&lt;li&gt;human-oversight procedure;&lt;/li&gt;
&lt;li&gt;risk and limitation notes;&lt;/li&gt;
&lt;li&gt;testing records;&lt;/li&gt;
&lt;li&gt;logging approach;&lt;/li&gt;
&lt;li&gt;incident and escalation process;&lt;/li&gt;
&lt;li&gt;unresolved questions for legal counsel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every item is a universal legal requirement for every AI system.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;The AI Act sets specific requirements for high-risk systems, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-9" rel="noopener noreferrer"&gt;risk management&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-11" rel="noopener noreferrer"&gt;technical documentation&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-12" rel="noopener noreferrer"&gt;record-keeping&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-14" rel="noopener noreferrer"&gt;human oversight&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-15" rel="noopener noreferrer"&gt;accuracy, robustness, and cybersecurity&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lower-risk product may still maintain similar materials because they help with enterprise procurement, security, customer trust, debugging, or future readiness.&lt;/p&gt;

&lt;p&gt;Label each item in the evidence pack as one of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Confirmed legal requirement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recommended readiness practice&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer or procurement requirement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requires legal confirmation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents a readiness document from pretending to be a legal opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare for transparency at the product level
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-50" rel="noopener noreferrer"&gt;Article 50&lt;/a&gt; contains transparency obligations for certain AI systems, including some systems that interact directly with people and some systems that generate or manipulate content.&lt;/p&gt;

&lt;p&gt;According to the Commission’s official &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/timeline/timeline-implementation-eu-ai-act" rel="noopener noreferrer"&gt;AI Act implementation timeline&lt;/a&gt;, these transparency obligations apply from &lt;strong&gt;2 August 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a product team, preparation may involve questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the user know they are interacting with AI?&lt;/li&gt;
&lt;li&gt;Is the disclosure shown before or during the first interaction?&lt;/li&gt;
&lt;li&gt;Is it clear on mobile?&lt;/li&gt;
&lt;li&gt;Is generated content labelled where required?&lt;/li&gt;
&lt;li&gt;Does the interface overstate human involvement?&lt;/li&gt;
&lt;li&gt;Does the disclosure remain accurate when the workflow changes?&lt;/li&gt;
&lt;li&gt;Is the information accessible and understandable?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not only a policy-document task.&lt;/p&gt;

&lt;p&gt;It is a product-design task.&lt;/p&gt;

&lt;p&gt;A disclosure hidden in a long terms-of-service page may not reflect what the user actually experiences during the interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Include known uncertainty
&lt;/h2&gt;

&lt;p&gt;An AI system brief should not pretend that every classification question has already been resolved.&lt;/p&gt;

&lt;p&gt;A useful section might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Potential classification:
Possible Annex III high-risk use case

Confidence:
Low

Reason:
The system is used in an employment workflow, but it may perform
only a preparatory task and does not automatically reject candidates.

Missing facts:
How recruiters use the ranking in practice and whether the output
materially influences who advances.

Legal confirmation required:
Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives a lawyer or specialist something concrete to examine.&lt;/p&gt;

&lt;p&gt;It also prevents internal assumptions from slowly turning into “facts” merely because they appeared in an old spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  A one-page AI system brief template
&lt;/h2&gt;

&lt;p&gt;A lightweight brief can contain the following sections.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. System identity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;system or feature name;&lt;/li&gt;
&lt;li&gt;owner;&lt;/li&gt;
&lt;li&gt;version;&lt;/li&gt;
&lt;li&gt;current status;&lt;/li&gt;
&lt;li&gt;last review date.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Intended purpose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;what the system does;&lt;/li&gt;
&lt;li&gt;what it is not intended to do;&lt;/li&gt;
&lt;li&gt;prohibited or unsupported uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Users and affected people
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;direct users;&lt;/li&gt;
&lt;li&gt;affected groups;&lt;/li&gt;
&lt;li&gt;responsible reviewers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Output and influence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;type of output;&lt;/li&gt;
&lt;li&gt;downstream decisions;&lt;/li&gt;
&lt;li&gt;automation level;&lt;/li&gt;
&lt;li&gt;override process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Models and vendors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;external providers;&lt;/li&gt;
&lt;li&gt;model versions;&lt;/li&gt;
&lt;li&gt;infrastructure dependencies;&lt;/li&gt;
&lt;li&gt;known update process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;input data;&lt;/li&gt;
&lt;li&gt;personal or sensitive data;&lt;/li&gt;
&lt;li&gt;storage and retention;&lt;/li&gt;
&lt;li&gt;processing locations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Oversight
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;responsible human;&lt;/li&gt;
&lt;li&gt;review points;&lt;/li&gt;
&lt;li&gt;escalation process;&lt;/li&gt;
&lt;li&gt;appeal or correction process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Evidence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;testing records;&lt;/li&gt;
&lt;li&gt;logs;&lt;/li&gt;
&lt;li&gt;policies;&lt;/li&gt;
&lt;li&gt;system documentation;&lt;/li&gt;
&lt;li&gt;incident history.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. Preliminary hypotheses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;likely operator role;&lt;/li&gt;
&lt;li&gt;possible risk category;&lt;/li&gt;
&lt;li&gt;possible transparency obligations;&lt;/li&gt;
&lt;li&gt;unresolved questions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. Review history
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;reviewer;&lt;/li&gt;
&lt;li&gt;date;&lt;/li&gt;
&lt;li&gt;product changes since the previous review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This document does not prove compliance.&lt;/p&gt;

&lt;p&gt;It creates the factual foundation needed for a serious assessment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automated tools can help without inventing certainty
&lt;/h2&gt;

&lt;p&gt;An automated checker can help a team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;organise product facts;&lt;/li&gt;
&lt;li&gt;identify missing information;&lt;/li&gt;
&lt;li&gt;surface potentially relevant provisions;&lt;/li&gt;
&lt;li&gt;prepare questions for counsel;&lt;/li&gt;
&lt;li&gt;create a preliminary readiness checklist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should not claim to provide a definitive legal classification from a few form fields.&lt;/p&gt;

&lt;p&gt;The European Commission provides an official beta &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/eu-ai-act-compliance-checker" rel="noopener noreferrer"&gt;EU AI Act Compliance Checker&lt;/a&gt;. Its disclaimer states that the results are informational, are not legal advice, and do not represent the Commission’s assessment of a company’s situation or obligations.&lt;/p&gt;

&lt;p&gt;That is the right model for responsible tooling.&lt;/p&gt;

&lt;p&gt;A useful system should expose assumptions, uncertainty, and missing facts rather than hide them behind a confident score.&lt;/p&gt;

&lt;h2&gt;
  
  
  The best legal handoff begins before the legal call
&lt;/h2&gt;

&lt;p&gt;Compare these two messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message A
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;We use AI. Can you tell us whether we comply with the AI Act?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Message B
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;We provide a candidate-ranking feature used by EU employers. The ranking determines which applications recruiters review first, but it does not automatically reject candidates. We use a third-party model, store outputs for 30 days, and require recruiter confirmation. Here is our intended purpose, data flow, oversight process, vendor list, and the five classification questions we have not resolved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second message does not replace legal advice.&lt;/p&gt;

&lt;p&gt;It makes legal advice more efficient.&lt;/p&gt;

&lt;p&gt;The lawyer can focus on questions that require legal interpretation instead of spending the first part of the engagement reconstructing the product from screenshots, Slack messages, sales copy, and incomplete technical explanations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;AI compliance does not begin with a checkbox.&lt;/p&gt;

&lt;p&gt;It begins with a clear description of the system.&lt;/p&gt;

&lt;p&gt;Before asking whether an AI product complies, document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it does;&lt;/li&gt;
&lt;li&gt;who it affects;&lt;/li&gt;
&lt;li&gt;what decisions it influences;&lt;/li&gt;
&lt;li&gt;which vendors and models it relies on;&lt;/li&gt;
&lt;li&gt;how people review its outputs;&lt;/li&gt;
&lt;li&gt;what evidence exists;&lt;/li&gt;
&lt;li&gt;what remains uncertain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That brief remains useful even when the final legal conclusion changes.&lt;/p&gt;

&lt;p&gt;It can support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;legal review;&lt;/li&gt;
&lt;li&gt;enterprise procurement;&lt;/li&gt;
&lt;li&gt;investor diligence;&lt;/li&gt;
&lt;li&gt;security assessments;&lt;/li&gt;
&lt;li&gt;product governance;&lt;/li&gt;
&lt;li&gt;incident response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace a lawyer.&lt;/p&gt;

&lt;p&gt;The goal is to give the lawyer — and your own team — something concrete to review.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the project
&lt;/h2&gt;

&lt;p&gt;I am building &lt;a href="https://actbrief.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai_system_brief" rel="noopener noreferrer"&gt;ActBrief&lt;/a&gt;, a project that helps AI teams organise product facts, documentation gaps, effective dates, and questions for qualified counsel.&lt;/p&gt;

&lt;p&gt;ActBrief produces preliminary readiness material. It does not provide legal advice or a definitive compliance determination.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I used an AI writing assistant to help structure and edit this article. The product observations, source review, conclusions, and final editorial decisions are my own.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>product</category>
      <category>security</category>
    </item>
    <item>
      <title>Why One AI Answer Is Not a Ranking</title>
      <dc:creator>Alex Shcoder?</dc:creator>
      <pubDate>Wed, 22 Jul 2026 22:06:02 +0000</pubDate>
      <link>https://dev.to/leshan/why-one-ai-answer-is-not-a-ranking-1onn</link>
      <guid>https://dev.to/leshan/why-one-ai-answer-is-not-a-ranking-1onn</guid>
      <description>&lt;p&gt;When I ran the first AI visibility test for an established software brand, the result looked almost perfect.&lt;/p&gt;

&lt;p&gt;The brand appeared in every unbranded buyer prompt.&lt;/p&gt;

&lt;p&gt;At first glance, the conclusion seemed obvious:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The brand had 100% AI visibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the result looked too clean.&lt;/p&gt;

&lt;p&gt;So I repeated the same prompts.&lt;/p&gt;

&lt;p&gt;The numbers changed.&lt;/p&gt;

&lt;p&gt;Across repeated runs, the average mention rate fell to 65%, the recommendation rate fell to 59%, and the brand was consistently recommended in only 11 of 18 unbranded buyer prompts.&lt;/p&gt;

&lt;p&gt;The more honest result was not 100%.&lt;/p&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;61% stable recommendation coverage.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That experiment changed how I think AI visibility should be measured.&lt;/p&gt;

&lt;p&gt;A single AI answer can be useful.&lt;/p&gt;

&lt;p&gt;It is not a ranking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI answers are unstable
&lt;/h2&gt;

&lt;p&gt;Traditional search gives marketers a relatively familiar object to measure.&lt;/p&gt;

&lt;p&gt;A page has a position. That position may change, but there is still a search-results page that can be checked repeatedly.&lt;/p&gt;

&lt;p&gt;AI answers are different.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6d0y076cxwtwzs6cwlk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6d0y076cxwtwzs6cwlk.png" alt="Illustration showing how the same buyer prompt can produce different AI recommendations across repeated runs" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The response may depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the wording of the question;&lt;/li&gt;
&lt;li&gt;the model or assistant being used;&lt;/li&gt;
&lt;li&gt;whether web search is available;&lt;/li&gt;
&lt;li&gt;the sources retrieved during that request;&lt;/li&gt;
&lt;li&gt;the date and location;&lt;/li&gt;
&lt;li&gt;previous conversation context;&lt;/li&gt;
&lt;li&gt;normal model variation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask the same question twice and you may get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a different order of products;&lt;/li&gt;
&lt;li&gt;a different top recommendation;&lt;/li&gt;
&lt;li&gt;new competitors;&lt;/li&gt;
&lt;li&gt;fewer products;&lt;/li&gt;
&lt;li&gt;different sources;&lt;/li&gt;
&lt;li&gt;or no citations at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not make AI visibility impossible to measure.&lt;/p&gt;

&lt;p&gt;It means the unit of measurement cannot be a single screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buyer prompts are not keywords
&lt;/h2&gt;

&lt;p&gt;Another mistake is treating every question about a category as equivalent.&lt;/p&gt;

&lt;p&gt;A buyer looking for code-review software might ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are the best AI code review tools?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But they might also ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can we catch bugs before merging a pull request?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is an affordable PR review tool for a small engineering team?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are the alternatives to CodeRabbit?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These prompts represent different stages of awareness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category prompts
&lt;/h3&gt;

&lt;p&gt;The buyer already understands the product category.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem prompts
&lt;/h3&gt;

&lt;p&gt;The buyer has a problem but may not know which type of product solves it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Segment prompts
&lt;/h3&gt;

&lt;p&gt;The buyer adds constraints such as company size, budget, workflow, or technical stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparison prompts
&lt;/h3&gt;

&lt;p&gt;The buyer is already evaluating known products.&lt;/p&gt;

&lt;p&gt;A brand can perform well in category prompts while remaining invisible in problem-oriented discovery.&lt;/p&gt;

&lt;p&gt;That distinction matters more than a single overall score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branded and unbranded visibility are different
&lt;/h2&gt;

&lt;p&gt;Consider these two prompts:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Best AI code review tools&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is CodeRabbit worth it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second question already contains the brand.&lt;/p&gt;

&lt;p&gt;A mention is expected.&lt;/p&gt;

&lt;p&gt;That result tells us how an AI system describes a company when the buyer already knows it.&lt;/p&gt;

&lt;p&gt;It does not tell us whether the company will be discovered by a buyer who has never heard of it.&lt;/p&gt;

&lt;p&gt;This is why branded and unbranded prompts should be reported separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Branded visibility&lt;/strong&gt; helps reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reputation;&lt;/li&gt;
&lt;li&gt;objections;&lt;/li&gt;
&lt;li&gt;comparisons;&lt;/li&gt;
&lt;li&gt;perceived strengths;&lt;/li&gt;
&lt;li&gt;perceived weaknesses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Unbranded visibility&lt;/strong&gt; helps reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;category discovery;&lt;/li&gt;
&lt;li&gt;problem discovery;&lt;/li&gt;
&lt;li&gt;new customer acquisition;&lt;/li&gt;
&lt;li&gt;whether a brand enters the consideration set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most growth teams, unbranded visibility is the more valuable test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mentioned does not mean recommended
&lt;/h2&gt;

&lt;p&gt;AI visibility tools often combine several outcomes into one number.&lt;/p&gt;

&lt;p&gt;But there is a major difference between these statements:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CodeRabbit is one of several available tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CodeRabbit is the best option for a small team that wants fast pull-request feedback.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first is a mention.&lt;/p&gt;

&lt;p&gt;The second is a recommendation.&lt;/p&gt;

&lt;p&gt;There is another distinction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Greptile may be a better option for teams that need deeper repository context.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this answer, CodeRabbit may still be discussed, but another brand wins the recommendation.&lt;/p&gt;

&lt;p&gt;A useful AI visibility analysis should therefore separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing;&lt;/li&gt;
&lt;li&gt;mentioned;&lt;/li&gt;
&lt;li&gt;recommended;&lt;/li&gt;
&lt;li&gt;top recommendation;&lt;/li&gt;
&lt;li&gt;branded discovery;&lt;/li&gt;
&lt;li&gt;unbranded discovery;&lt;/li&gt;
&lt;li&gt;stable and unstable results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without these distinctions, a brand may appear highly visible while consistently losing the actual buyer recommendation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What repeated runs revealed
&lt;/h2&gt;

&lt;p&gt;For the pilot, I tested 24 buyer prompts related to AI code-review products.&lt;/p&gt;

&lt;p&gt;The prompts covered four groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;category discovery;&lt;/li&gt;
&lt;li&gt;segment and constraint;&lt;/li&gt;
&lt;li&gt;problem-oriented discovery;&lt;/li&gt;
&lt;li&gt;comparison and alternatives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each prompt was repeated three times under the same documented conditions.&lt;/p&gt;

&lt;p&gt;The first single-run result suggested near-perfect visibility.&lt;/p&gt;

&lt;p&gt;The repeated result was more nuanced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;average unbranded mention share: &lt;strong&gt;65%&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;average unbranded recommendation share: &lt;strong&gt;59%&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;consistently recommended in at least two of three runs: &lt;strong&gt;11 of 18 unbranded prompts&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;stable recommendation coverage: &lt;strong&gt;61%&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The brand was clearly visible.&lt;/p&gt;

&lt;p&gt;But its visibility was not universal or perfectly stable.&lt;/p&gt;

&lt;p&gt;That is a much more useful conclusion than “100% visibility.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Stable coverage is more useful than a screenshot
&lt;/h2&gt;

&lt;p&gt;Imagine two brands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brand A
&lt;/h3&gt;

&lt;p&gt;It appears in 15 of 20 prompts during one run.&lt;/p&gt;

&lt;p&gt;When the prompts are repeated, only six recommendations remain consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brand B
&lt;/h3&gt;

&lt;p&gt;It appears in 11 of 20 prompts during one run.&lt;/p&gt;

&lt;p&gt;Ten of those recommendations remain consistent across repeated runs.&lt;/p&gt;

&lt;p&gt;A single-run report would favour Brand A.&lt;/p&gt;

&lt;p&gt;A consistency-first report would favour Brand B.&lt;/p&gt;

&lt;p&gt;For a founder or marketer, Brand B probably has the stronger position.&lt;/p&gt;

&lt;p&gt;This is why the metric I now care about most is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Stable recommendation coverage: the percentage of buyer prompts where a brand is recommended consistently across repeated runs.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not remove uncertainty.&lt;/p&gt;

&lt;p&gt;It makes the uncertainty visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different AI engines represent different discovery environments
&lt;/h2&gt;

&lt;p&gt;There is no single universal AI search result.&lt;/p&gt;

&lt;p&gt;Different AI assistants can return different answers to the same buyer prompt.&lt;/p&gt;

&lt;p&gt;They may rely on different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;models;&lt;/li&gt;
&lt;li&gt;search systems;&lt;/li&gt;
&lt;li&gt;sources;&lt;/li&gt;
&lt;li&gt;ranking signals;&lt;/li&gt;
&lt;li&gt;answer formats;&lt;/li&gt;
&lt;li&gt;citation behaviour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A company might be strongly recommended by one engine and rarely mentioned by another.&lt;/p&gt;

&lt;p&gt;This gives AI visibility at least three dimensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt coverage
&lt;/h3&gt;

&lt;p&gt;In how many buyer situations does the brand appear?&lt;/p&gt;

&lt;h3&gt;
  
  
  Repeatability
&lt;/h3&gt;

&lt;p&gt;Does the same engine produce a similar result across repeated runs?&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-engine agreement
&lt;/h3&gt;

&lt;p&gt;Do different AI systems recommend the same company?&lt;/p&gt;

&lt;p&gt;These dimensions should not be hidden inside one unexplained score.&lt;/p&gt;

&lt;p&gt;A better report shows where the systems agree, where they disagree, and where a result is volatile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Citations reveal why competitors may be winning
&lt;/h2&gt;

&lt;p&gt;Brand mentions show what appeared in an answer.&lt;/p&gt;

&lt;p&gt;Citations can reveal which sources influenced the answer.&lt;/p&gt;

&lt;p&gt;A competitor may be repeatedly supported by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documentation;&lt;/li&gt;
&lt;li&gt;independent comparison pages;&lt;/li&gt;
&lt;li&gt;review platforms;&lt;/li&gt;
&lt;li&gt;GitHub repositories;&lt;/li&gt;
&lt;li&gt;industry publications;&lt;/li&gt;
&lt;li&gt;Reddit discussions;&lt;/li&gt;
&lt;li&gt;customer stories;&lt;/li&gt;
&lt;li&gt;category roundups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can expose a source gap.&lt;/p&gt;

&lt;p&gt;The problem may not be that an AI model dislikes a product.&lt;/p&gt;

&lt;p&gt;The product may simply be missing from the sources repeatedly used to explain the category.&lt;/p&gt;

&lt;p&gt;That leads to a more practical question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where does AI find convincing information about competitors, and where is our brand absent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer can suggest concrete work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a clearer use-case page;&lt;/li&gt;
&lt;li&gt;publish a comparison page;&lt;/li&gt;
&lt;li&gt;improve documentation;&lt;/li&gt;
&lt;li&gt;add customer evidence;&lt;/li&gt;
&lt;li&gt;answer problem-oriented buyer questions;&lt;/li&gt;
&lt;li&gt;earn inclusion in relevant third-party sources;&lt;/li&gt;
&lt;li&gt;repeat the test after the changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI visibility should be treated as an experiment
&lt;/h2&gt;

&lt;p&gt;The wrong workflow is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run one prompt → get a score → celebrate or panic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A better workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define a representative set of buyer prompts.&lt;/li&gt;
&lt;li&gt;Separate branded and unbranded discovery.&lt;/li&gt;
&lt;li&gt;Record a baseline.&lt;/li&gt;
&lt;li&gt;Repeat prompts to identify unstable results.&lt;/li&gt;
&lt;li&gt;Compare multiple AI engines.&lt;/li&gt;
&lt;li&gt;Find consistently lost buyer intents.&lt;/li&gt;
&lt;li&gt;Review which sources support competitor recommendations.&lt;/li&gt;
&lt;li&gt;Make one specific change.&lt;/li&gt;
&lt;li&gt;Repeat the same test.&lt;/li&gt;
&lt;li&gt;Measure directional movement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is closer to experimentation than traditional rank tracking.&lt;/p&gt;

&lt;p&gt;There is no guarantee that a brand will hold a fixed position inside an AI-generated answer.&lt;/p&gt;

&lt;p&gt;But it is still possible to observe whether visibility becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broader;&lt;/li&gt;
&lt;li&gt;more consistent;&lt;/li&gt;
&lt;li&gt;stronger across engines;&lt;/li&gt;
&lt;li&gt;better supported by relevant sources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The most valuable result is often a lost prompt
&lt;/h2&gt;

&lt;p&gt;A company may already appear for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Best AI code review tools&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But remain absent for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can a growing engineering team reduce manual review workload?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second prompt may represent a larger opportunity.&lt;/p&gt;

&lt;p&gt;The buyer has a problem but has not yet chosen a category or vendor.&lt;/p&gt;

&lt;p&gt;When a brand repeatedly disappears from these prompts, the result can lead to a useful action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;publish content around the problem;&lt;/li&gt;
&lt;li&gt;explain the workflow before introducing the product;&lt;/li&gt;
&lt;li&gt;create material for a specific team size;&lt;/li&gt;
&lt;li&gt;clarify how the product differs from alternatives;&lt;/li&gt;
&lt;li&gt;improve external evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is more actionable than being told that an “AI visibility score” increased from 42 to 47.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams should measure
&lt;/h2&gt;

&lt;p&gt;A useful AI visibility report should answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where are we mentioned without the buyer naming us?&lt;/li&gt;
&lt;li&gt;Where are we genuinely recommended?&lt;/li&gt;
&lt;li&gt;Where are we the first recommendation?&lt;/li&gt;
&lt;li&gt;Which results remain stable across repeated runs?&lt;/li&gt;
&lt;li&gt;Which engines favour our competitors?&lt;/li&gt;
&lt;li&gt;Which buyer intents do we consistently lose?&lt;/li&gt;
&lt;li&gt;Which sources are repeatedly cited?&lt;/li&gt;
&lt;li&gt;What change should we test next?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to manufacture a permanent AI ranking.&lt;/p&gt;

&lt;p&gt;The goal is to replace random screenshots with repeatable evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this approach still cannot prove
&lt;/h2&gt;

&lt;p&gt;Repeated testing makes the result more defensible, but it does not eliminate uncertainty.&lt;/p&gt;

&lt;p&gt;A visibility snapshot cannot prove that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every user will receive the same answer;&lt;/li&gt;
&lt;li&gt;an AI assistant will keep recommending the same brand;&lt;/li&gt;
&lt;li&gt;citations directly caused a recommendation;&lt;/li&gt;
&lt;li&gt;higher visibility will automatically produce revenue;&lt;/li&gt;
&lt;li&gt;a content change will improve every engine equally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is still a sampled observation.&lt;/p&gt;

&lt;p&gt;The purpose of repetition is not to create false certainty.&lt;/p&gt;

&lt;p&gt;It is to identify which results appear stable enough to investigate and which ones may have been one-off variations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;For years, marketers asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where do we rank in Google?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The equivalent AI-search question should not be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is our ChatGPT rank?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A more useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Across the buyer questions that matter, how consistently do AI systems recommend us—and where do competitors win instead?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One AI answer cannot answer that.&lt;/p&gt;

&lt;p&gt;A representative prompt set, repeated observations, multiple engines, and prompt-level evidence can get much closer.&lt;/p&gt;




&lt;p&gt;The public research snapshot and future updates are available at &lt;a href="https://buyerprompt.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=one_answer_is_not_a_ranking" rel="noopener noreferrer"&gt;BuyerPrompt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I used an AI writing assistant to help structure and edit this article. The experiment, results, interpretations, and final review are my own.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>marketing</category>
      <category>search</category>
    </item>
  </channel>
</rss>
