<?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: Umid Ismayilov</title>
    <description>The latest articles on DEV Community by Umid Ismayilov (@umidismayilov).</description>
    <link>https://dev.to/umidismayilov</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%2F3170348%2Fe4a1d796-8bf5-47a4-92b9-4dc8ea03f628.png</url>
      <title>DEV Community: Umid Ismayilov</title>
      <link>https://dev.to/umidismayilov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/umidismayilov"/>
    <language>en</language>
    <item>
      <title>I built an error tracker that opens the pull request for you (self-hosted, PHP/JS/Flutter)</title>
      <dc:creator>Umid Ismayilov</dc:creator>
      <pubDate>Wed, 02 Sep 2026 10:03:45 +0000</pubDate>
      <link>https://dev.to/umidismayilov/i-built-an-error-tracker-that-opens-the-pull-request-for-you-self-hosted-phpjsflutter-5208</link>
      <guid>https://dev.to/umidismayilov/i-built-an-error-tracker-that-opens-the-pull-request-for-you-self-hosted-phpjsflutter-5208</guid>
      <description>&lt;p&gt;Every error tracker I have used stops at the same place: here is the stack trace, here is how many times it happened, good luck. The next 40 minutes — open the file, read the code around the line, figure out the change — are always mine.&lt;/p&gt;

&lt;p&gt;I wanted that part to happen before I open the ticket. So I built &lt;a href="https://bugban.online" rel="noopener noreferrer"&gt;Bugban&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when an error arrives
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grouping.&lt;/strong&gt; A fingerprint (class, file, line, normalised message) keeps repeats together: first seen, last seen, count, status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context.&lt;/strong&gt; The request (method, URL, route template, &lt;code&gt;Controller@action&lt;/code&gt;), the signed-in user, the session, breadcrumbs, device, and — on browser projects — a DOM snapshot with every input masked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI analysis, in your language.&lt;/strong&gt; Root cause, explanation and a concrete fix, written in the language of your panel (English, Azerbaijani, Russian, Turkish).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A pull request.&lt;/strong&gt; A GitHub App reads only the files the stack trace points at, at their current state in your repo, and pushes a whole-file change to a &lt;code&gt;bugban/fix-&amp;lt;id&amp;gt;&lt;/code&gt; branch. Merging is yours; nothing touches &lt;code&gt;main&lt;/code&gt; by itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some guard-rails I found necessary in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only &lt;strong&gt;new&lt;/strong&gt; or &lt;strong&gt;reopened&lt;/strong&gt; errors trigger a fix — never every occurrence.&lt;/li&gt;
&lt;li&gt;One open PR per error, a daily limit per project.&lt;/li&gt;
&lt;li&gt;The model may answer "I'm not sure" and return no files. That is a normal, successful outcome.&lt;/li&gt;
&lt;li&gt;We ask for the &lt;strong&gt;whole file&lt;/strong&gt;, not a diff. Models get line numbers wrong in unified diffs; a whole file either parses or it doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;merged&lt;/code&gt; is not &lt;code&gt;deployed&lt;/code&gt;. The old code is still running after a merge, so Bugban does not auto-resolve the error; you mark it resolved after deploy, and only then can a second attempt happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Slow queries, with the plan
&lt;/h2&gt;

&lt;p&gt;Queries over your threshold arrive with their &lt;code&gt;EXPLAIN&lt;/code&gt;: full scan vs index, rows examined, key used. Two lessons from real customers ended up as product rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type=index&lt;/code&gt; in MySQL is a &lt;strong&gt;full index scan&lt;/strong&gt;, not "index used". The panel reads the plan detail instead of trusting the flag.&lt;/li&gt;
&lt;li&gt;A leading-wildcard &lt;code&gt;LIKE '%x%'&lt;/code&gt; cannot be helped by any B-tree index. The panel says so up front instead of letting an AI recommend one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a &lt;strong&gt;re-run&lt;/strong&gt; button. It measures a slow query again — executed by &lt;em&gt;your&lt;/em&gt; SDK on &lt;em&gt;your&lt;/em&gt; database, single read-only statement, forced &lt;code&gt;LIMIT&lt;/code&gt;, always rolled back, and only the duration and row count come back. Row contents never leave your server.&lt;/p&gt;

&lt;p&gt;Regression tracking measures &lt;strong&gt;frequency&lt;/strong&gt; (slow occurrences per hour), not average duration — because the SDK only reports queries above the threshold, so after a fix the average goes &lt;em&gt;up&lt;/em&gt; while the problem is actually gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile
&lt;/h2&gt;

&lt;p&gt;React Native, Expo and Flutter get a real PNG screenshot, with sensitive widgets painted over &lt;strong&gt;before&lt;/strong&gt; the shutter. There is an offline queue written to disk before sending, so an error in a lift or a fatal crash is replayed on next launch.&lt;/p&gt;

&lt;p&gt;Performance on mobile uses app start, screen load and jank — not Web Vitals, because LCP means nothing on a phone, and an AI prompt written for browsers would confidently discuss render-blocking CSS that doesn't exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerts that escalate
&lt;/h2&gt;

&lt;p&gt;In-app, email, Slack and Telegram on every new error. A separate high-load alert watches for a spike within a window and can place an &lt;strong&gt;actual Telegram phone call&lt;/strong&gt; to the person on duty.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDKs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PHP 7.0 → 8.4: &lt;code&gt;bugban/laravel&lt;/code&gt;, &lt;code&gt;bugban/symfony&lt;/code&gt;, &lt;code&gt;bugban/codeigniter&lt;/code&gt;, &lt;code&gt;bugban/yii2&lt;/code&gt;, plain &lt;code&gt;bugban/php-sdk&lt;/code&gt; (Composer or a manual autoload)&lt;/li&gt;
&lt;li&gt;JavaScript: &lt;code&gt;@bugban/node&lt;/code&gt;, &lt;code&gt;@bugban/express&lt;/code&gt;, &lt;code&gt;@bugban/nestjs&lt;/code&gt;, &lt;code&gt;@bugban/next&lt;/code&gt;, &lt;code&gt;@bugban/react&lt;/code&gt;, &lt;code&gt;@bugban/vue&lt;/code&gt;, &lt;code&gt;@bugban/react-native&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dart: &lt;code&gt;bugban_flutter&lt;/code&gt; on pub.dev
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require bugban/laravel
&lt;span class="c"&gt;# .env&lt;/span&gt;
&lt;span class="nv"&gt;BUGBAN_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;BUGBAN_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://your-bugban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per-stack guides: &lt;a href="https://bugban.online/integrations/laravel" rel="noopener noreferrer"&gt;Laravel&lt;/a&gt;, &lt;a href="https://bugban.online/integrations/node" rel="noopener noreferrer"&gt;Node&lt;/a&gt;, &lt;a href="https://bugban.online/integrations/flutter" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;, &lt;a href="https://bugban.online/integrations/react-native" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; and the rest at &lt;a href="https://bugban.online" rel="noopener noreferrer"&gt;bugban.online&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;By projects, not by events or seats. Every package includes everything, AI fixes included. 7-day trial, no card.&lt;/p&gt;

&lt;p&gt;I would genuinely like to hear what you would want from an error tracker that also writes the fix — and where you would &lt;em&gt;not&lt;/em&gt; trust it. Comments welcome.&lt;/p&gt;

</description>
      <category>php</category>
      <category>javascript</category>
      <category>flutter</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
