<?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: Ted Kupolov</title>
    <description>The latest articles on DEV Community by Ted Kupolov (@tedk).</description>
    <link>https://dev.to/tedk</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%2F4015685%2Fbf82bf8c-8d02-497a-972b-5ab8796a6772.png</url>
      <title>DEV Community: Ted Kupolov</title>
      <link>https://dev.to/tedk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tedk"/>
    <language>en</language>
    <item>
      <title>Lightweight Spring Boot Monitoring Without Prometheus and Grafana</title>
      <dc:creator>Ted Kupolov</dc:creator>
      <pubDate>Tue, 21 Jul 2026 15:10:00 +0000</pubDate>
      <link>https://dev.to/tedk/lightweight-spring-boot-monitoring-without-prometheus-and-grafana-1e5h</link>
      <guid>https://dev.to/tedk/lightweight-spring-boot-monitoring-without-prometheus-and-grafana-1e5h</guid>
      <description>&lt;p&gt;Running one Spring Boot application, or a handful of them, on a VPS still requires basic visibility.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Is the application healthy?&lt;/li&gt;
&lt;li&gt;Are errors increasing?&lt;/li&gt;
&lt;li&gt;Are requests slowing down?&lt;/li&gt;
&lt;li&gt;Is memory usage growing?&lt;/li&gt;
&lt;li&gt;Did the application restart?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You may not need a complete monitoring platform to answer those questions.&lt;/p&gt;

&lt;p&gt;Spring Boot Actuator already exposes much of the necessary information. &lt;a href="https://github.com/pvrlabs/statlite" rel="noopener noreferrer"&gt;StatLite&lt;/a&gt; turns it into a focused dashboard for health, HTTP activity, latency, memory, uptime, and restarts.&lt;/p&gt;

&lt;p&gt;It runs as a single Go binary and stores its history in SQLite.&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%2Fjawsgf7emy4yfh730ffq.jpg" 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%2Fjawsgf7emy4yfh730ffq.jpg" alt="StatLite dashboard monitoring a Spring Boot application" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/pvrlabs/statlite" rel="noopener noreferrer"&gt;View StatLite on GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/pvrlabs/statlite/blob/main/docs/install.md" rel="noopener noreferrer"&gt;Installation instructions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use Actuator directly?
&lt;/h2&gt;

&lt;p&gt;Actuator exposes useful health and Micrometer metrics endpoints, but repeatedly opening JSON responses is not a convenient monitoring workflow.&lt;/p&gt;

&lt;p&gt;Prometheus and Grafana are excellent when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many services or hosts&lt;/li&gt;
&lt;li&gt;Flexible metric queries&lt;/li&gt;
&lt;li&gt;Long retention&lt;/li&gt;
&lt;li&gt;Alert routing&lt;/li&gt;
&lt;li&gt;Shared organizational dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spring Boot Admin provides broader application administration and monitoring features.&lt;/p&gt;

&lt;p&gt;For a few services on one VPS, however, a smaller dashboard may be enough. StatLite reads the Actuator endpoints you already have and presents the operational signals needed for routine checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;Best fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw Actuator endpoints&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Occasional manual checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot Admin&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Application administration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prometheus and Grafana&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Larger observability deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatLite&lt;/td&gt;
&lt;td&gt;Very low&lt;/td&gt;
&lt;td&gt;A few Spring Boot services on a VPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These approaches can coexist. Starting with StatLite does not prevent moving to Prometheus and Grafana later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up StatLite
&lt;/h2&gt;

&lt;p&gt;The following example uses the runnable &lt;a href="https://github.com/pvrlabs/statlite/tree/main/examples/spring-actuator-demo" rel="noopener noreferrer"&gt;Spring Actuator demo&lt;/a&gt; included in the StatLite repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Expose Actuator health and metrics
&lt;/h3&gt;

&lt;p&gt;Add the required endpoint exposure to your Spring Boot configuration:&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="na"&gt;management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exposure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;health,metrics&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;health&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;show-details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep Actuator restricted to trusted networks and add authentication when required.&lt;/p&gt;

&lt;p&gt;Start the demo application:&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;cd &lt;/span&gt;examples/spring-actuator-demo
mvn spring-boot:run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm that its endpoints respond:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:8080/actuator/health
curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:8080/actuator/metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Install StatLite
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/pvrlabs/statlite/blob/main/docs/install.md" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; covers the release installer and Homebrew.&lt;/p&gt;

&lt;p&gt;You can also build it from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/pvrlabs/statlite.git
&lt;span class="nb"&gt;cd &lt;/span&gt;statlite
go build &lt;span class="nt"&gt;-o&lt;/span&gt; statlite ./cmd/statlite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Configure a target
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;statlite.yaml&lt;/code&gt; beside the binary:&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="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:9090"&lt;/span&gt;

&lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sqlite_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./statlite.sqlite"&lt;/span&gt;

&lt;span class="na"&gt;polling&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10s"&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5s"&lt;/span&gt;

&lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spring-demo"&lt;/span&gt;
    &lt;span class="na"&gt;actuator_base_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:8080/actuator"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Keeps the dashboard bound to localhost&lt;/li&gt;
&lt;li&gt;Stores history in &lt;code&gt;statlite.sqlite&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Polls the application every ten seconds&lt;/li&gt;
&lt;li&gt;Reads metrics from the application’s Actuator base URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Basic Auth, multiple applications, retention, and production security, see the &lt;a href="https://github.com/pvrlabs/statlite/blob/main/docs/configuration.md" rel="noopener noreferrer"&gt;configuration documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The demo leaves Actuator unauthenticated because it binds to loopback for local testing. Do not expose the same configuration publicly without appropriate network and authentication controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Open the dashboard
&lt;/h3&gt;

&lt;p&gt;Start StatLite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./statlite &lt;span class="nt"&gt;--config&lt;/span&gt; ./statlite.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:9090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The demo includes a traffic generator for populating the request, latency, and error charts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./examples/spring-actuator-demo/generate-traffic.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It generates successful, slow, database, &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;404&lt;/code&gt;, and &lt;code&gt;500&lt;/code&gt; responses. StatLite updates after the next configured polling interval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why StatLite stays small
&lt;/h2&gt;

&lt;p&gt;StatLite intentionally uses a narrow architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One Go binary&lt;/li&gt;
&lt;li&gt;SQLite storage&lt;/li&gt;
&lt;li&gt;No monitoring agent&lt;/li&gt;
&lt;li&gt;No custom instrumentation beyond Actuator&lt;/li&gt;
&lt;li&gt;Multiple Spring Boot targets in one configuration&lt;/li&gt;
&lt;li&gt;Straightforward systemd deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is Actuator-first: your application exposes Actuator, and StatLite provides a focused view over that data.&lt;/p&gt;

&lt;h2&gt;
  
  
  When StatLite is not enough
&lt;/h2&gt;

&lt;p&gt;Use a broader observability platform when you need distributed tracing, centralized logs, advanced queries, alert routing, long-term retention, or dashboards spanning a large number of systems.&lt;/p&gt;

&lt;p&gt;StatLite is not intended to replace enterprise observability. It is for the smaller operational job: monitoring a few Spring Boot services without running a full Prometheus and Grafana stack.&lt;/p&gt;

&lt;p&gt;To try it, visit the &lt;a href="https://github.com/pvrlabs/statlite" rel="noopener noreferrer"&gt;StatLite repository&lt;/a&gt; and follow the &lt;a href="https://github.com/pvrlabs/statlite/blob/main/docs/install.md" rel="noopener noreferrer"&gt;installation instructions&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
      <category>monitoring</category>
      <category>vps</category>
    </item>
    <item>
      <title>Can AI Badger Reduce Local Coding Agent Token Usage?</title>
      <dc:creator>Ted Kupolov</dc:creator>
      <pubDate>Fri, 10 Jul 2026 22:10:16 +0000</pubDate>
      <link>https://dev.to/tedk/can-ai-badger-reduce-local-coding-agent-token-usage-jp1</link>
      <guid>https://dev.to/tedk/can-ai-badger-reduce-local-coding-agent-token-usage-jp1</guid>
      <description>&lt;p&gt;In this single dogfooding experiment, using a compact handoff produced by AI Badger's &lt;code&gt;/design&lt;/code&gt; mode plus an external compression step reduced OpenCode's active tokens by 32.1%, reasoning tokens by 85.6%, and runtime by 54.5% compared with sending the feature prompt directly.&lt;/p&gt;

&lt;p&gt;Including cache reads, total token movement dropped by 63.2%.&lt;/p&gt;

&lt;p&gt;Important caveat: this is directional evidence from one run per workflow. The implementations differed, and external-chat compression cost is not included.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this experiment measures
&lt;/h2&gt;

&lt;p&gt;AI Badger's &lt;code&gt;/design&lt;/code&gt; mode performed a local heuristic scan of the project; it made no LLM call. An external AI chat then compressed that context into a terse implementation handoff, which was passed to OpenCode.&lt;/p&gt;

&lt;p&gt;The measurements below cover only the OpenCode execution sessions. They do not include the external compression step. There was one run per workflow, and &lt;code&gt;/plan&lt;/code&gt; is a possible future direction rather than an existing Badger feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test app
&lt;/h2&gt;

&lt;p&gt;The fixture is a small note-taking app built with no framework, no build system, and no dependencies.&lt;/p&gt;

&lt;p&gt;I updated the underlying app so it better reflects the original requirements before running the comparison.&lt;/p&gt;

&lt;p&gt;It has the usual local-app pieces: note creation, editing, deletion, search, tag filtering, sort order, settings persistence, and localStorage persistence. That makes it small enough to inspect but still rich enough to expose context-selection and handoff quality.&lt;/p&gt;

&lt;p&gt;Both workflows produced working implementations of the requested settings feature and retained the core create, edit, delete, search, and filtering flows in manual review. The outputs differed in UI details and internal organization, and both had minor issues identified afterward. This experiment therefore compares execution efficiency, not equivalent final-code quality.&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%2F4sxdptydg02kev2esvi2.jpg" 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%2F4sxdptydg02kev2esvi2.jpg" alt="Base note-taking app before the settings feature" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screenshot is left unedited. The raw fixture snapshots remain the reproducible source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feature
&lt;/h2&gt;

&lt;p&gt;Both workflows were asked to add the same settings panel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a settings panel to this existing note-taking app.

Requirements:
- Add theme setting: light, dark, or system.
- Add sort order setting: newest updated, oldest updated, title A-Z.
- Persist settings in localStorage.
- Apply settings on page load.
- Preserve existing note create/edit/delete/search behavior.
- Keep the app plain HTML/CSS/JS with no dependencies.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original app requirements were broader, but the feature under test was intentionally narrow: add settings without disturbing the existing note workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two workflows
&lt;/h2&gt;

&lt;p&gt;Workflow A is direct OpenCode prompting with no Badger AI in the loop. Workflow B uses Badger Design plus a compact handoff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow A: direct OpenCode prompt
&lt;/h3&gt;

&lt;p&gt;OpenCode received the feature prompt directly.&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%2F7i2ps321s0w1s6munoje.jpg" 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%2F7i2ps321s0w1s6munoje.jpg" alt="Workflow A direct OpenCode result" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Workflow A: Direct OpenCode&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Session:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Captured session data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input:              38,995
output:              8,359
reasoning:           9,151
cache_read:      1,137,664
cache_write:             0
active_total:       56,505
cache_total:     1,137,664
total_with_cache: 1,194,169
duration_ms:       207,401
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Workflow B: Badger Design + compact handoff + OpenCode
&lt;/h3&gt;

&lt;p&gt;This workflow used Badger's existing &lt;code&gt;/design&lt;/code&gt; output first, then an external AI chat step compressed that context into a terse local-agent handoff, which was then pasted into OpenCode.&lt;/p&gt;

&lt;p&gt;The compression prompt was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Design the complete implementation, then produce a compact local-agent implementation plan with concrete changes only. Omit rationale, risks, open questions, acceptance criteria, and broad testing notes. Optimize the output for low token usage.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fqardvw96vhizx4tkpevk.jpg" 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%2Fqardvw96vhizx4tkpevk.jpg" alt="Workflow B Badger Design plus compact handoff result" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Workflow B: Badger Design + compact handoff&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Session:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Captured session data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input:              30,143
output:              6,896
reasoning:           1,317
cache_read:        401,664
cache_write:             0
active_total:       38,356
cache_total:       401,664
total_with_cache:  440,020
duration_ms:        94,394
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Measurement approach
&lt;/h2&gt;

&lt;p&gt;I compared the exported session data for the two OpenCode runs. That keeps the comparison tied to the exact local-agent sessions used in the experiment.&lt;/p&gt;

&lt;p&gt;Active-token usage provides the cleaner primary comparison because cache-read accounting and pricing vary across models and providers. The comparison below measures only OpenCode execution. The Badger &lt;code&gt;/design&lt;/code&gt; step is local and free of LLM cost. The external compression step is separate and typically much cheaper than local-agent reasoning tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Session-level results
&lt;/h2&gt;

&lt;p&gt;Summary: 32.1% fewer active tokens, 85.6% fewer reasoning tokens, 54.5% faster, and 63.2% less total token movement.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Direct OpenCode&lt;/th&gt;
&lt;th&gt;Badger Design + Handoff -&amp;gt; OpenCode&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Active total&lt;/td&gt;
&lt;td&gt;56,505&lt;/td&gt;
&lt;td&gt;38,356&lt;/td&gt;
&lt;td&gt;-32.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning&lt;/td&gt;
&lt;td&gt;9,151&lt;/td&gt;
&lt;td&gt;1,317&lt;/td&gt;
&lt;td&gt;-85.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duration&lt;/td&gt;
&lt;td&gt;207.4s&lt;/td&gt;
&lt;td&gt;94.4s&lt;/td&gt;
&lt;td&gt;-54.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total with cache&lt;/td&gt;
&lt;td&gt;1,194,169&lt;/td&gt;
&lt;td&gt;440,020&lt;/td&gt;
&lt;td&gt;-63.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;38,995&lt;/td&gt;
&lt;td&gt;30,143&lt;/td&gt;
&lt;td&gt;-22.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;8,359&lt;/td&gt;
&lt;td&gt;6,896&lt;/td&gt;
&lt;td&gt;-17.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache read&lt;/td&gt;
&lt;td&gt;1,137,664&lt;/td&gt;
&lt;td&gt;401,664&lt;/td&gt;
&lt;td&gt;-64.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Chart 1: total token movement
&lt;/h3&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%2Fkbawsh2yxz7ysysshpbv.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%2Fkbawsh2yxz7ysysshpbv.png" alt="Total token movement comparison showing a 63.2% reduction" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Chart 2: active token breakdown
&lt;/h3&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%2Fcd92dk3cktykcbd7dgz1.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%2Fcd92dk3cktykcbd7dgz1.png" alt="Active token breakdown comparing input, output, and reasoning reductions" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Chart 3: cache read comparison
&lt;/h3&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%2F1xtkkq27kvv8it7fjz62.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%2F1xtkkq27kvv8it7fjz62.png" alt="Cache read comparison showing a 64.7% reduction" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Chart 4: duration comparison
&lt;/h3&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%2Fdexbgd8lurhxx9319u6h.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%2Fdexbgd8lurhxx9319u6h.png" alt="Runtime comparison showing a 54.5% reduction" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The headline result in this experiment is simple: the Badger Design + compact handoff workflow reduced OpenCode token movement by about 63% and runtime by about 55%.&lt;/p&gt;

&lt;p&gt;On this run, Workflow B was the more token-efficient path.&lt;/p&gt;

&lt;p&gt;Reasoning tokens dropped by about 86%, which is consistent with reduced agent-side exploration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;The useful artifact was not a verbose implementation spec.&lt;/p&gt;

&lt;p&gt;The useful artifact was a compact local-agent handoff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;concrete file/function changes only&lt;/li&gt;
&lt;li&gt;no rationale&lt;/li&gt;
&lt;li&gt;no risks&lt;/li&gt;
&lt;li&gt;no open questions&lt;/li&gt;
&lt;li&gt;no acceptance criteria&lt;/li&gt;
&lt;li&gt;no broad testing notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the shape I want a future Badger focus mode to automate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is not the same as "chat writes the whole app"
&lt;/h2&gt;

&lt;p&gt;For a tiny app, AI chat can sometimes generate the entire implementation without using a local coding agent at all, which is not the comparison here. That workflow can work well for small changes, but it does not scale cleanly to larger repositories. The more scalable path is the one used here: Badger exposes the relevant project context, external chat compresses it, and the local coding agent still performs the edit inside the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product implication: automating the compact handoff
&lt;/h2&gt;

&lt;p&gt;This experiment used Badger's existing &lt;code&gt;/design&lt;/code&gt; workflow, not a dedicated plan mode.&lt;/p&gt;

&lt;p&gt;That suggests a future Badger focus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/design  -&amp;gt; local topology/context summary for design discussion
/review  -&amp;gt; inspect code or changes
/plan    -&amp;gt; produce compact implementation handoff for a local coding agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/plan&lt;/code&gt; is one possible name for a future mode that could automate this compact handoff. This article is a product-direction signal, not a claim that the feature already exists.&lt;/p&gt;

&lt;p&gt;A future &lt;code&gt;/plan&lt;/code&gt; mode could automate the compression step. But I do not want to rush it. The manual workflow has a safety valve: I can inspect the topology summary before asking for a compact handoff. An automated &lt;code&gt;/plan&lt;/code&gt; mode would need enough confidence that the right context was found before handing instructions to a local agent.&lt;/p&gt;

&lt;p&gt;The experiment therefore points to a sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ship the article.&lt;/li&gt;
&lt;li&gt;Gather feedback.&lt;/li&gt;
&lt;li&gt;See whether people want this workflow.&lt;/li&gt;
&lt;li&gt;Improve confidence in Badger's design/topology scan.&lt;/li&gt;
&lt;li&gt;Then consider implementing &lt;code&gt;/plan&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One app.&lt;/li&gt;
&lt;li&gt;One feature.&lt;/li&gt;
&lt;li&gt;One model.&lt;/li&gt;
&lt;li&gt;One local agent.&lt;/li&gt;
&lt;li&gt;No repeated runs yet.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;summary.files&lt;/code&gt; reported 0 in both exported sessions, so file-derived token metrics were ignored.&lt;/li&gt;
&lt;li&gt;Results may differ for trivial changes, very large changes, or tasks that require broad exploration.&lt;/li&gt;
&lt;li&gt;The compact handoff was produced in an external AI chat, not by Badger itself.&lt;/li&gt;
&lt;li&gt;Automating &lt;code&gt;/plan&lt;/code&gt; too early could be risky if the topology scan misses key files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main claim stays narrow: in this experiment, a compact Badger-assisted implementation handoff reduced OpenCode token movement and runtime compared with prompting OpenCode directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supporting materials
&lt;/h2&gt;

&lt;p&gt;The repository includes the experiment fixtures and the helper used to normalize the OpenCode session exports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/PVRLabs/aibadger/blob/main/docs/articles/can-ai-badger-reduce-local-coding-agent-token-usage/supporting-materials/prompts.md" rel="noopener noreferrer"&gt;experiment prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PVRLabs/aibadger/blob/main/docs/articles/can-ai-badger-reduce-local-coding-agent-token-usage/supporting-materials/raw/note-app-base/index.html" rel="noopener noreferrer"&gt;original base app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PVRLabs/aibadger/blob/main/docs/articles/can-ai-badger-reduce-local-coding-agent-token-usage/supporting-materials/raw/note-app-workflow-a/index.html" rel="noopener noreferrer"&gt;workflow A fixture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PVRLabs/aibadger/blob/main/docs/articles/can-ai-badger-reduce-local-coding-agent-token-usage/supporting-materials/raw/note-app-workflow-b/index.html" rel="noopener noreferrer"&gt;workflow B fixture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PVRLabs/aibadger/blob/main/docs/articles/can-ai-badger-reduce-local-coding-agent-token-usage/supporting-materials/opencode-session-usage.py" rel="noopener noreferrer"&gt;session usage helper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;raw/&lt;/code&gt; directories contain the exact fixture snapshots used for the measured OpenCode sessions. The screenshots are copied separately for article display. No &lt;code&gt;cleaned/&lt;/code&gt; copy is needed for this writeup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This experiment does not prove that Badger always saves tokens.&lt;/p&gt;

&lt;p&gt;It is consistent with something more useful:&lt;/p&gt;

&lt;p&gt;A compact implementation handoff can reduce local-agent exploration. Badger Design is useful as a local context-generation step, but the final artifact passed to a local coding agent should be terse, concrete, and execution-oriented.&lt;/p&gt;

&lt;p&gt;That is a reasonable reason to keep exploring a future &lt;code&gt;/plan&lt;/code&gt; focus, after there is more confidence in the topology and context-selection heuristics.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>llm</category>
    </item>
    <item>
      <title>Bypassing the Claude Code "Token Tax": Smart Code Reviews with Local Mapping</title>
      <dc:creator>Ted Kupolov</dc:creator>
      <pubDate>Tue, 07 Jul 2026 15:10:00 +0000</pubDate>
      <link>https://dev.to/tedk/bypassing-the-claude-code-token-tax-smart-code-reviews-with-local-mapping-1d7g</link>
      <guid>https://dev.to/tedk/bypassing-the-claude-code-token-tax-smart-code-reviews-with-local-mapping-1d7g</guid>
      <description>&lt;p&gt;Autonomous coding agents are powerful, but they often come with a steep &lt;strong&gt;token tax&lt;/strong&gt;. Tools like Claude Code can rapidly consume your usage limits during reviews by rescanning projects, pulling broad context, and running background operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Badger&lt;/strong&gt; offers a better way: map your codebase locally, extract only the precise snippets needed, and conduct thoughtful reviews inside your favorite web chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Ways You Save Tokens
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dramatically more efficient usage&lt;/strong&gt; - Badger eliminates noisy full-repo scans and recursive context loops. The AI receives clean, surgical context instead of everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage fixed-cost web chats&lt;/strong&gt; — Most web interfaces run on flat-rate monthly subscriptions (like ChatGPT Plus or Claude Pro) or offer generous free daily tiers. By offloading heavy discussions to the web chat, you leverage a fixed-cost window and avoid burning through your metered API balances or rolling agent limits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even on platforms where limits are shared, Badger helps you stay efficient and avoid the faster-burning autonomous modes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Code Reviews with &lt;code&gt;badger review&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;AI Badger shines in review mode. Here's a complete walkthrough using a simple React todo app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Launch Review Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-react-app
badger review

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Badger pre-loads your git diff with a default prompt. Edit it before submitting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review the following change for concrete bugs, edge cases, 
maintainability issues, and unintended behavior changes. 
Focus on issues I should fix before committing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Copy Prompt 1 (Compact Map)
&lt;/h3&gt;

&lt;p&gt;Badger outputs a lightweight project topology (structure, key files, your diff summary). Paste into &lt;strong&gt;Claude Web&lt;/strong&gt;, &lt;strong&gt;ChatGPT&lt;/strong&gt;, &lt;strong&gt;DeepSeek&lt;/strong&gt;, or any other chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Targeted Extraction
&lt;/h3&gt;

&lt;p&gt;The AI replies with precise selectors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FILE:src/App.tsx
NEAR:src/App.tsx#function handleSubmit
PREFIX:src/components/TodoItem.tsx#return

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste them back into Badger. It extracts &lt;strong&gt;only&lt;/strong&gt; the relevant code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Paste Focused Prompt 2
&lt;/h3&gt;

&lt;p&gt;Badger assembles clean context. Paste into your web chat — get high-quality review feedback without token waste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Apply Changes
&lt;/h3&gt;

&lt;p&gt;Paste the AI's suggestions back into Badger. Review the write plan and apply fixes with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trivial React Example
&lt;/h2&gt;

&lt;p&gt;Consider a small change in a todo app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Missing key + potential re-render issues&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TodoItem&lt;/span&gt; &lt;span class="na"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{todo}"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;)}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters (even for non-React devs):&lt;/strong&gt; When rendering lists in React, each item should have a unique &lt;code&gt;key&lt;/code&gt;. Without it, the UI can behave strangely when items are added or removed. A good code review also flags small performance and accessibility improvements.&lt;/p&gt;

&lt;p&gt;Badger + web chat quickly flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing &lt;code&gt;key&lt;/code&gt; prop&lt;/li&gt;
&lt;li&gt;Opportunities for &lt;code&gt;React.memo&lt;/code&gt; or &lt;code&gt;useCallback&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Accessibility improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All while using far fewer tokens than a full autonomous agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Workflow Wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Precision-first&lt;/strong&gt; — Only requested files/spans are sent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed-cost advantage&lt;/strong&gt; — Maximize value from subscriptions like ChatGPT Plus and Claude Pro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review-optimized&lt;/strong&gt; — Focuses the AI on risks and correctness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy &amp;amp; control&lt;/strong&gt; — Fully local until you copy; explicit consent for writes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal&lt;/strong&gt; — Works with React, Go, Java, Node.js, Python, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install and Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap pvrlabs/aibadger
brew &lt;span class="nb"&gt;install &lt;/span&gt;pvrlabs/aibadger/badger

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;https://raw.githubusercontent.com/PVRLabs/aibadger/main/install.sh]&lt;span class="o"&gt;(&lt;/span&gt;https://raw.githubusercontent.com/PVRLabs/aibadger/main/install.sh&lt;span class="o"&gt;)&lt;/span&gt; | sh

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;badger review&lt;/code&gt; in any repo with changes.&lt;/p&gt;

&lt;p&gt;Full documentation: &lt;a href="https://github.com/PVRLabs/aibadger/blob/main/docs/usage.md" rel="noopener noreferrer"&gt;docs/usage.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this workflow looks useful, consider giving &lt;a href="https://github.com/PVRLabs/aibadger" rel="noopener noreferrer"&gt;AI Badger&lt;/a&gt; a ⭐ on GitHub - it helps other developers discover the project.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
