<?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: Ilja (ilya) Nevolin</title>
    <description>The latest articles on DEV Community by Ilja (ilya) Nevolin (@codr).</description>
    <link>https://dev.to/codr</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%2F375726%2Fafc6910d-df6c-476b-9ac8-95057fbace0a.jpg</url>
      <title>DEV Community: Ilja (ilya) Nevolin</title>
      <link>https://dev.to/codr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codr"/>
    <language>en</language>
    <item>
      <title>Unlocking Swarm Intelligence with Big Agentic Brain and Claude Code</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Wed, 21 Oct 2026 22:12:44 +0000</pubDate>
      <link>https://dev.to/codr/unlocking-swarm-intelligence-with-big-agentic-brain-and-claude-code-4668</link>
      <guid>https://dev.to/codr/unlocking-swarm-intelligence-with-big-agentic-brain-and-claude-code-4668</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://nevolin.be/blog/unlocking-swarm-intelligence-big-agentic-brain-claude-code" rel="noopener noreferrer"&gt;nevolin.be&lt;/a&gt;. Disclosure: I'm involved in building Big Agentic Brain, the open-source system tested here.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AI coding agents start every session from zero. When the fix is in the code, that's fine. When it depends on something a teammate's agent already learned, like a vendor quirk, a runbook convention or a spec that lives in another repo, the agent can read every file and still never find it.&lt;/p&gt;

&lt;p&gt;Big Agentic Brain (BAB) is a distributed, self-evolving memory for a whole organization's agents. It is self-hosted, runs as one container on one SQLite file and speaks MCP. Agents search it first, record what they learned at the end, and react to each other's entries so the useful ones rise.&lt;/p&gt;

&lt;p&gt;We measured what that changes on bugs that need team knowledge. Sonnet went from 12% to 79% with BAB, and to 100% (24/24) with a one-line search-first nudge. Opus went from 12% to 88% (92% with the nudge), and Haiku from 0% to 75%. With each agent in its own isolated sandbox, a fix one agent found reached a teammate on another machine in 96 to 100% of cases, against 13 to 67% with local notes only. And for Haiku, the team's cost per verified fix roughly halved, from $0.00672 to $0.00333.&lt;/p&gt;

&lt;p&gt;That's from 1,104 graded runs for about $29, plus 378 distributed-team sessions. Below is the short version of the study, including where it falls short. The full 21-page report is &lt;a href="https://nevolin.be/assets/blog/coding-agents-shared-team-memory/report.pdf" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and the code is on &lt;a href="https://github.com/enhesa/big-agentic-brain" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BAB is
&lt;/h2&gt;

&lt;p&gt;BAB is an open-source, self-hosted memory for AI agents. It runs as one container on one SQLite file and speaks &lt;strong&gt;MCP&lt;/strong&gt;, so Claude Code and any other MCP-capable agent can connect to it. Each agent follows a simple loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; before starting, to find what other agents already learned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn&lt;/strong&gt; when finished, recording the fix, the vendor quirk or the team convention as a structured entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; to other agents' entries. Votes and reactions change what ranks first, so the memory gets better with use without anyone curating it by hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because it is one server, it isn't tied to one laptop. Everyone in an organization who uses Claude Code, or any mix of agents, can point at the same BAB and join &lt;strong&gt;one swarm&lt;/strong&gt;. Every fix one agent makes becomes something every other agent can find.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fits together:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent A, Agent B, Agent C:&lt;/strong&gt; can run on different machines.&lt;/li&gt;
&lt;li&gt;Each one connects over &lt;strong&gt;MCP&lt;/strong&gt; to &lt;strong&gt;one shared memory (BAB)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Through that memory they &lt;strong&gt;search&lt;/strong&gt; first, &lt;strong&gt;learn&lt;/strong&gt; at the end, and &lt;strong&gt;react&lt;/strong&gt; to each other's entries, which changes what ranks first over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why it matters for teams
&lt;/h2&gt;

&lt;p&gt;Here's one of the bugs from our benchmark. A service sends order webhooks to Shipfast, a carrier aggregator. Since this month, every request comes back &lt;code&gt;401 "signature verification failed"&lt;/code&gt;. The unit tests pass. The code looks reasonable:&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="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Shipfast-Signature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sha256=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The root cause isn't in this repository. Shipfast retired that header on 1 September and now expects &lt;code&gt;Shipfast-Signature: t=&amp;lt;unix seconds&amp;gt;,v1=&amp;lt;hmac&amp;gt;&lt;/code&gt;, signed over &lt;code&gt;"&amp;lt;timestamp&amp;gt;." + body&lt;/code&gt;. The only copy of that spec lives in a &lt;em&gt;different&lt;/em&gt; repo, where a teammate's agent already hit the same 401 and fixed it.&lt;/p&gt;

&lt;p&gt;An agent working on the webhook repo can read every file and rerun the tests all day and still never see the new format. That's &lt;strong&gt;team knowledge&lt;/strong&gt;: vendor quirks, runbook conventions, a partner's ID check digit. It lives in someone's head or someone else's repo, and &lt;strong&gt;AI coding agents&lt;/strong&gt; start every session from zero. BAB is how one agent's lesson reaches the next.&lt;/p&gt;

&lt;h2&gt;
  
  
  From 12% to 100% on bugs that need team knowledge
&lt;/h2&gt;

&lt;p&gt;We built 8 bug families like Shipfast, where the missing fact exists only in what a colleague's agent had learned. Without shared memory, the agents were stuck: Sonnet fixed 12%, Haiku 0% and Opus 12%. With BAB they fixed &lt;strong&gt;79%&lt;/strong&gt;, &lt;strong&gt;75%&lt;/strong&gt; and &lt;strong&gt;88%&lt;/strong&gt;, and a one-line nudge to search first took Sonnet to &lt;strong&gt;100%&lt;/strong&gt;. On the Shipfast family itself, Sonnet went from 0 of 3 to 3 of 3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team-knowledge bugs fixed&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;No shared memory&lt;/th&gt;
&lt;th&gt;With BAB&lt;/th&gt;
&lt;th&gt;BAB + search-first nudge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5.5&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;79%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 5.5&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Share of team-knowledge bugs fixed, 24 runs per cell (8 bug families, 3 trials each), graded by hidden tests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A bigger model is no substitute: Opus, the largest of the three, fixed the same 12% as Sonnet without memory. For Sonnet, the gain from default BAB was +67 points (95% CI +33 to +92).&lt;/p&gt;

&lt;h2&gt;
  
  
  A fix on one machine reaches the whole team
&lt;/h2&gt;

&lt;p&gt;Real teams don't share one laptop. So in a third round we gave each agent its own isolated sandbox and workspace, standing in for its own machine, with no shared files. Each agent first fixed one bug where the answer was documented. Then memory was frozen, and a related bug in &lt;em&gt;another&lt;/em&gt; repo went to a teammate. We compared no memory, each agent's own local notes, and local notes plus a shared BAB for the team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teammate fix rate on a related bug&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Teams&lt;/th&gt;
&lt;th&gt;No memory&lt;/th&gt;
&lt;th&gt;Local notes only&lt;/th&gt;
&lt;th&gt;Local + shared BAB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 5.5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;96%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5&lt;/td&gt;
&lt;td&gt;2 (exploratory)&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;How often a teammate fixed a related bug in another repo, after a different agent had solved the first one on its own machine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Local notes are great for the agent that wrote them: on a repeat of its own problem, Sonnet went from 58% to 100%. But they stay on one machine. With shared BAB, teammates fixed the bug &lt;strong&gt;96 to 100%&lt;/strong&gt; of the time, against 13 to 67% with local notes only. Haiku, the smallest model, fixed its teammate's bug 96% of the time with BAB, more reliably than Sonnet with no memory at all (67%).&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheaper per delivered fix
&lt;/h2&gt;

&lt;p&gt;Reading and writing memory costs tokens, so a single session with BAB is not cheaper. What a team pays for is fixes that land. Counting every session, including the first solvers and the cost of writing what they learned into memory, shared BAB gave the lowest cost per verified fix for Sonnet and Haiku. For Haiku it was about half the no-memory cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team cost per delivered fix (USD)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;No memory&lt;/th&gt;
&lt;th&gt;Local notes only&lt;/th&gt;
&lt;th&gt;Local + shared BAB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5.5&lt;/td&gt;
&lt;td&gt;$0.0427&lt;/td&gt;
&lt;td&gt;$0.0408&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0363&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 5.5&lt;/td&gt;
&lt;td&gt;$0.00672&lt;/td&gt;
&lt;td&gt;$0.00414&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.00333&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5&lt;/td&gt;
&lt;td&gt;$0.1285&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0908&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.0950&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;API cost per verified fix, counting every session a team ran: the first solvers, the cost of writing what they learned into memory, and the teammates. Lowest per model in bold.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lean by design
&lt;/h2&gt;

&lt;p&gt;Tool definitions are sent with every request, used or not. BAB's full toolset added &lt;strong&gt;8,598 tokens&lt;/strong&gt; to each one. A lean setup with only &lt;code&gt;bab_search&lt;/code&gt;, &lt;code&gt;bab_learn&lt;/code&gt; and &lt;code&gt;bab_react&lt;/code&gt; adds &lt;strong&gt;648&lt;/strong&gt;, and on team-knowledge tasks it kept most of the benefit (75% for Sonnet) at 1.18× the no-memory cost per run, against 1.51× for the full toolset.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Toolset&lt;/th&gt;
&lt;th&gt;Tokens added per request&lt;/th&gt;
&lt;th&gt;Cost per run vs no memory (Sonnet, team-knowledge tasks)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full tool surface&lt;/td&gt;
&lt;td&gt;8,598&lt;/td&gt;
&lt;td&gt;1.51×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lean (3 tools)&lt;/td&gt;
&lt;td&gt;648&lt;/td&gt;
&lt;td&gt;1.18×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The study turned straight into changes for BAB:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a lean default toolset;&lt;/li&gt;
&lt;li&gt;auto-retrieval of the top memories before the first turn, which also reached 100% for Sonnet, at 1.34× baseline cost;&lt;/li&gt;
&lt;li&gt;a search-first hint;&lt;/li&gt;
&lt;li&gt;corrected search instructions, after we found that BAB's own advice to filter by kind returned nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we tested
&lt;/h2&gt;

&lt;p&gt;Agents fixed seeded bugs in small benchmark repos and were graded by hidden tests. We ran Claude Sonnet 5.5, Haiku 5.5 and Opus 5.5: 1,104 graded runs on 19 October 2026 for about $29 in API spend, plus 378 graded sessions in the distributed-team round on 21 October for $17.41. Memories were recorded by agents that had solved the source tasks, not written by hand, and the tasks and hypotheses for the later rounds were frozen before any paid run. Agents ran in a minimal MCP agent loop rather than Claude Code itself. An audit of the distributed-team round's transcripts found no access to hidden tests and no way around the memory freeze.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Built for the case BAB targets.&lt;/strong&gt; The team-knowledge tasks were designed so the missing fact exists in a colleague's memory. They show the memory channel works when the knowledge is there, not how often real work looks like this. Samples are small, and the tasks were written by an AI agent before any runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale memory hurts.&lt;/strong&gt; With only outdated entries, success fell back to the no-memory baseline, and agents flagged the stale entry in only 4% of runs. Visible age, verify-before-acting prompts and down-weighting old entries matter as much as ranking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval at scale.&lt;/strong&gt; Recall@5 was 0.93 with 20 distractor memories and 0.81 with 1,000. On a harder test with look-alike distractors, the right memory was ranked first 56% of the time (13% for blind-written queries) and made the top five 85% of the time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per session, memory costs more.&lt;/strong&gt; The saving is per delivered fix. For Opus, with two teams, local notes alone edged out shared BAB at team level ($0.0908 vs $0.0950 per fix).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulated machines.&lt;/strong&gt; In the distributed-team round, the separate machines were isolated sandboxes on one host. A real org-wide deployment is the next thing to measure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Footnote:&lt;/em&gt; on 12 easy bugs that the code already explains, every setup fixed every task (108/108 Sonnet runs, 180/180 Haiku runs), so memory had nothing to add there and cost 1.50× per run on Sonnet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📄 &lt;strong&gt;&lt;a href="https://nevolin.be/assets/blog/coding-agents-shared-team-memory/report.pdf" rel="noopener noreferrer"&gt;The full report (PDF, 21 pages)&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Methodology, every condition and model, the statistics, retrieval tests and deviations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BAB is open source&lt;/strong&gt; and runs as one container on one SQLite file, so a single server can serve every agent in your organization: &lt;a href="https://github.com/enhesa/big-agentic-brain" rel="noopener noreferrer"&gt;Big Agentic Brain on GitHub&lt;/a&gt;. If it's useful to you, a star helps others find it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The eval suite&lt;/strong&gt; is being contributed to the repo (&lt;a href="https://github.com/enhesa/big-agentic-brain/pull/26" rel="noopener noreferrer"&gt;pull request #26&lt;/a&gt;), so you can rerun every condition or point it at your own tasks and agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your results look different from ours, I'd like to hear about it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>claude</category>
    </item>
    <item>
      <title>Kubernetes Resource Management Best Practices</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Wed, 19 Aug 2026 21:24:48 +0000</pubDate>
      <link>https://dev.to/codr/kubernetes-resource-management-best-practices-2ki6</link>
      <guid>https://dev.to/codr/kubernetes-resource-management-best-practices-2ki6</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;br&gt;
set &lt;code&gt;requests.cpu&lt;/code&gt;, &lt;code&gt;requests.memory&lt;/code&gt;, and &lt;code&gt;limits.memory&lt;/code&gt;, but remove &lt;code&gt;limits.cpu&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Always set memory limit == request. Never set CPU limit"&lt;br&gt;
~ Tim Hockin, Kubernetes co-founder (&lt;a href="https://x.com/thockin/status/1134193838841401345" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Google's GKE docs say the same thing: for the CPU request, "specify the minimum CPU needed... according to your own SLOs," then "set an unbounded CPU limit" (&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/vertical-pod-autoscaling" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: this post is a short version of the full analysis I posted on &lt;a href="https://github.com/inevolin/k8s-cpu-limits-analyzed" rel="noopener noreferrer"&gt;GitHub here&lt;/a&gt;. Some of the images below should be animated (but SVGs are blocked on DEV.to), so I highly recommend reading it there as well.&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%2Fm0ssbm57310lztbm55aq.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%2Fm0ssbm57310lztbm55aq.png" alt="K8s resource config best pratices" width="720" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most teams still set a CPU limit anyway, then spend their time fighting the throttling that follows. This analysis explains why the advice is right, and why so many people still get it wrong. Most charts set two CPU numbers, a request and a limit, and people treat them like the same setting with a bit of headroom.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The request is how much CPU is reserved for your pod if it needs it.&lt;/li&gt;
&lt;li&gt;The limit is a hard cap: hit it and the kernel throttles the pod, even when the node still has spare CPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are exceptional use cases for using CPU limits (they exist for a reason), but your situation is unlikely one of them, meaning you probably should NOT set CPU limits (&lt;a href="https://github.com/inevolin/k8s-cpu-limits-analyzed#conclusion-drop-cpu-limits-keep-requests" rel="noopener noreferrer"&gt;see conclusion&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CPU requests are enough
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Linux already shares a node's CPU fairly among pods. That sharing is called CFS (Completely Fair Scheduler).&lt;/strong&gt; A request is a weight in the cgroup, not a pinned core. If the node is busy, CFS splits time in proportion to those weights: a 16 CPU request gets about sixteen times the CPU of a 1 CPU request. If the other pods are idle, a pod can use the leftover; when they need CPU again, those cores go back. None of this requires a CPU limit.&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%2F58sjnm4x5lt5275xvfup.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%2F58sjnm4x5lt5275xvfup.png" alt="K8s pods borrowing CPU" width="720" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A limit is a separate cap, also enforced by CFS. Every 100 ms the kernel gives your pod a budget of CPU time, and every thread in the pod shares that budget. When it is gone, the pod is throttled until the next 100 ms. The node can be idle and the pod still waits. A 1 CPU limit on a 32-core node can still run on all 32 cores for a few milliseconds, then sit out the rest of the window. Four threads working at once burn a 500m budget in about 12 milliseconds. It is an average, not a reserved core.&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%2Fj1818tpvodvazck2fgr4.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%2Fj1818tpvodvazck2fgr4.png" alt="CPU limits animated" width="720" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Grafana shows the CPU is fine! No, your metrics are lying.
&lt;/h1&gt;

&lt;p&gt;The CPU graph on your Kubernetes dashboard usually averages a minute. CPU throttling lasts a tenth of a second. So the graph can look fine while the app is being throttled all the time. Watch &lt;code&gt;container_cpu_cfs_throttled_periods_total&lt;/code&gt;, not average CPU.&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%2F9rphd2vkxiolzikxxtep.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%2F9rphd2vkxiolzikxxtep.png" alt="CPU Utilization vs Throttling periods" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two views of the same 30 seconds: an average CPU graph that looks flat and fine, next to a CPU throttling graph on the same window showing the pod repeatedly hitting its limit&lt;/p&gt;

&lt;p&gt;People put a limit on because they are afraid some other app will starve their pod. That is what the request is for. The app you care about is protected by its own request. A runaway next door can use leftover CPU, but it cannot take the share you reserved. If leftover on the node is huge, the requests are too small. If teams can deploy with no request at all, give them a default request instead of putting a CPU limit on whoever looks greedy.&lt;/p&gt;

&lt;p&gt;The same blindness poisons right-sizing. Usage recorded under a CPU limit can never go above the limit: the cap clips every burst, so the history shows what the kernel allowed, not what the app wanted. Size a request from that history and you copy the cap's distortion into the request. Drop the limit first, let the app run for a while, then measure and set requests from numbers that were free to move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof: the same app with and without a CPU limit
&lt;/h2&gt;

&lt;p&gt;In a controlled burst test, adding a CPU limit took typical latency from 23 ms to roughly 87 ms (about 4x slower), with the limited pod throttled in half of all CFS windows, while the average CPU graph looked fine the whole time.&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%2Fcmylfv71th6sqgr1uf8a.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%2Fcmylfv71th6sqgr1uf8a.png" alt="Demo benchmarks" width="720" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How CPU limits cause memory issues and OOMKills
&lt;/h2&gt;

&lt;p&gt;A service with any kind of in-memory queue: a consumer buffering messages from Kafka or RabbitMQ faster than it can process them, an unbounded channel between two components, a server holding request payloads while handlers run behind.&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%2F5mw7tw59ftu6y8wozpyw.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%2F5mw7tw59ftu6y8wozpyw.png" alt="OOMKilled due to CPU limits in k8s case 1" width="720" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any kind of application that has a garbage collector (GC) is a potential victim. In my experiment: every request builds a reference-dense graph of 10,000 small objects (~1.5 MiB) and holds it only while doing real work; once the request finishes, the graph is garbage. Nothing is retained anywhere, on purpose. What runs short here is the garbage collector's own CPU budget: on the capped pod (limits.cpu: 100m, the same value as the production incident this test is based on), in-flight requests pile up, the live object count grows with them, each GC cycle gets more expensive, and the collector fights the workload for the same shrinking quota.&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%2Fjc1s7hm6uxbk4ditqsdd.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%2Fjc1s7hm6uxbk4ditqsdd.png" alt="OOMKilled due to CPU limits in k8s case 2" width="720" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even a simple HTTP API server is not spared. As http requests come in, and each one is holding its memory. Nothing stops the pile-up: web frameworks (ASP.NET Core, Node, Go, and friends) do not cap how many requests may run at once, and the await hands the thread back but keeps the buffer, so the thread pool does not cap it either.&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%2Frtc0w34v1ak5f2kaob5n.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%2Frtc0w34v1ak5f2kaob5n.png" alt="OOMKilled due to CPU limits in k8s case 3" width="720" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All three shapes end the same way on a graph: memory climbing into the limit. It looks like a leak, the usual fix is a bigger memory limit, and the actual cause is the CPU limit. Check &lt;code&gt;container_cpu_cfs_throttled_periods_total&lt;/code&gt; before you blindly raise limits.memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion and FAQs
&lt;/h2&gt;

&lt;p&gt;Dropping limits.cpu moves a pod from Guaranteed to Burstable QoS. In practice this rarely matters: the kubelet evicts for memory pressure, not CPU, and it ranks pods by how far usage exceeds the request, not by QoS class alone. Keep requests.memory equal to limits.memory and eviction exposure barely moves. Full answer, with the eviction docs link, in the FAQ.&lt;/p&gt;

&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Should I set CPU limits in Kubernetes?&lt;/strong&gt; For most services, no. Keep requests.cpu so CFS reserves your share, keep limits.memory, and drop limits.cpu. The exceptions (benchmarks, pinned cores, per-customer billing) are listed in the conclusion (&lt;a href="https://github.com/inevolin/k8s-cpu-limits-analyzed#conclusion-drop-cpu-limits-keep-requests" rel="noopener noreferrer"&gt;read more&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't a limit stop a bad pod from eating the node?&lt;/strong&gt; Monopolizing a node is a myth. Spare CPU is borrowed, not taken: the moment another pod wants CPU, CFS pulls those cores back within milliseconds and splits time by request weights again. A limit on the busy pod only stops it using CPU that would otherwise sit idle. It does not give CPU to anyone else: the neighbor is protected by its request. If several pods burst at once, the leftover is not first come first served, CFS divides it in proportion to their requests. If leftover on the node is huge, the requests on that node are too small.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After I drop limits, can a burster hurt the node itself?&lt;/strong&gt; Not the other pods, but kubelet, containerd, the CNI, and log shippers often run with tiny or no CPU reservation. A pod bursting into all spare CPU can delay exec probes and flap readiness. The fix is system-reserved and kube-reserved in the kubelet config, which carves out CPU for the node's own daemons. A per-pod CPU limit is the wrong tool for this.&lt;/p&gt;

</description>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>containers</category>
      <category>performance</category>
    </item>
    <item>
      <title>A cli tool to be more organized and productive in 2026</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 01 Feb 2026 19:12:04 +0000</pubDate>
      <link>https://dev.to/codr/use-in-cli-to-stay-organized-12fe</link>
      <guid>https://dev.to/codr/use-in-cli-to-stay-organized-12fe</guid>
      <description>&lt;p&gt;We all "love" microservices, allegedly. But you know what isn't fun? Realizing you need to bump a dependency, run a build, git pull and create PRs across 15 different repositories at the same time.&lt;/p&gt;

&lt;p&gt;You usually have two options (if you don't want to use AI agents):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The "Tab Hoarder" Strategy Manually open 15 terminal tabs, cd into each one, run the command, and pray you didn't miss one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The "Unix Wizard" Strategy You try to construct a one-liner that iterates over directories. You start typing:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 1 &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-exec&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cd "{}" &amp;amp;&amp;amp; git pull'&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, but it's painfully slow because it runs serially (one at a time). So you switch to xargs to run it in parallel:&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;ls&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;/ | xargs &lt;span class="nt"&gt;-P&lt;/span&gt; 4 &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"cd {} &amp;amp;&amp;amp; pnpm update"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a problem. xargs (by default) breaks on directory names with spaces. To fix it, you need to add -print0 to find and -0 to xargs, and suddenly your "quick one-liner" is 80 characters long and unreadable.&lt;/p&gt;

&lt;p&gt;Enter in-cli 🚀 &lt;a href="https://github.com/inevolin/in-cli" rel="noopener noreferrer"&gt;https://github.com/inevolin/in-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usage:&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="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] &lt;span class="o"&gt;[&lt;/span&gt;DIRECTORIES...] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; COMMAND...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I got tired of typing those boilerplate loops. I wanted a tool that does one thing well: runs a command in every directory, fast. So I built in-cli. It’s a zero-dependency CLI (pure bash) that acts as a force multiplier for your shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually works
&lt;/h2&gt;

&lt;p&gt;Instead of wrestling with pipes and flags, you just tell it what to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: The Morning Routine&lt;/strong&gt; You get to work and need to update all 20 repos in your ~/work folder.&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="c"&gt;# Updates every repo in ~/work/ directory&lt;/span&gt;
&lt;span class="k"&gt;in&lt;/span&gt; ~/work/&lt;span class="k"&gt;*&lt;/span&gt; git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scenario 2: The "Critical Fix" Deployment&lt;/strong&gt; You need to trigger a build script across all your services right now.&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="c"&gt;# Run 'make build' in parallel across all subdirectories&lt;/span&gt;
&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; 8 ~/work/&lt;span class="k"&gt;*&lt;/span&gt; make build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scenario 3: Dependency Hell&lt;/strong&gt; Need to update lodash in every service because of a CVE?&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="k"&gt;in&lt;/span&gt; ~/work/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="s1"&gt;'pnpm update lodash &amp;amp;&amp;amp; git commit -am "updating lodash" &amp;amp;&amp;amp; git push'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll find +50 other real-world scenarios in the &lt;a href="https://github.com/inevolin/in-cli/blob/main/EXAMPLES.md" rel="noopener noreferrer"&gt;EXAMPLES.md&lt;/a&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use this?
&lt;/h2&gt;

&lt;p&gt;Stop wasting time on tooling boilerplate. If you're managing a monorepo or a folder full of microservices, stop writing throwaway scripts to manage them. Check it out on GitHub, and let me know if it saves you a few keystrokes (and your sanity).&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>linux</category>
    </item>
    <item>
      <title>Speech-to-Text Discord bot written in Go</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 27 Jan 2024 22:42:16 +0000</pubDate>
      <link>https://dev.to/codr/speech-to-text-discord-bot-written-in-go-eih</link>
      <guid>https://dev.to/codr/speech-to-text-discord-bot-written-in-go-eih</guid>
      <description>&lt;p&gt;As part of my personal journey to learn Go, I've decided to rewrite one of my open source projects in GoLang.&lt;/p&gt;

&lt;p&gt;The project is a standalone (offline) speech-to-text bot for Discord. Basically it transcribes everything you say in a voice channel. This is useful if you want to have custom voice commands (eg. while gaming), or enhance the communication experience for hearing impaired/deaf people.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/inevolin/DiscordEarsGo" rel="noopener noreferrer"&gt;https://github.com/inevolin/DiscordEarsGo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project makes use of the Vosk library, which does not work well on Mac OS (M1), so by default it is designed to only work on Linux x86 systems (since you would likely be hosting it on Linux). But the great thing is that Vosk works offline, open source and comes with a ton of models and languages (english, german, french, chinese, ...) for download &lt;a href="https://alphacephei.com/vosk/models" rel="noopener noreferrer"&gt;https://alphacephei.com/vosk/models&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the annoying things was also to decode Opus packets to PCM, it requires opus libraries to be installed. The same is true for the NodeJS version (which now requires ffmpeg to be installed). It would be nice if there was a tiny library/snippet that does this (not external library).&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>go</category>
      <category>discord</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Work on Open Source projects to stand out in 2024</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Tue, 02 Jan 2024 14:49:51 +0000</pubDate>
      <link>https://dev.to/codr/work-on-open-source-projects-to-stand-out-in-2024-3men</link>
      <guid>https://dev.to/codr/work-on-open-source-projects-to-stand-out-in-2024-3men</guid>
      <description>&lt;p&gt;Happy new year everyone!&lt;/p&gt;

&lt;p&gt;I thought of sharing something cool and fun with my fellow coders. A few years ago I created a speech-to-text bot for Discord,, initially designed to control my own music bot (at the time), but then people started using it to communicate better with their deaf gaming friends in real-time.&lt;/p&gt;

&lt;p&gt;This is the project: &lt;a href="https://github.com/inevolin/DiscordEarsBot" rel="noopener noreferrer"&gt;https://github.com/inevolin/DiscordEarsBot&lt;/a&gt; (the music bot is in another repo which needs a big update). The STT methods include offline and online APIs, so you get to choose the quality/performance you want. But with the rise in AI and ML jobs, this can serve as a great framework to build projects to stand out in your interviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use this technology in another tool (Slack, Zoom, phone, browser, ...)&lt;/li&gt;
&lt;li&gt;Use this technology to build voice-based games (maybe for handicapped kids)&lt;/li&gt;
&lt;li&gt;Improve the STT results by adding another ML model to correct the text&lt;/li&gt;
&lt;li&gt;Create a fun bot that "talks back" or tells jokes based on the conversation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to collaborate on a project, post in the comments below and match up with other people!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The dark truth behind Cryptocurrencies</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 20 Nov 2022 18:05:52 +0000</pubDate>
      <link>https://dev.to/codr/the-dark-truth-behind-cryptocurrencies-1ef7</link>
      <guid>https://dev.to/codr/the-dark-truth-behind-cryptocurrencies-1ef7</guid>
      <description>&lt;p&gt;&lt;strong&gt;The environmental impact of blockchains&lt;/strong&gt; and cryptocurrencies cannot be overlooked. In particular Proof-of-Work systems such as Bitcoin have a huge (understated) energy footprint. In conventional cryptocurrency systems, tokens are awarded to “miners” for successfully mining blocks on the blockchain. The core problem is that mining consumes incomprehensible amounts of electrical energy.&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.amazonaws.com%2Fuploads%2Farticles%2F7b4gdf25ip6lgv93pb6g.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.amazonaws.com%2Fuploads%2Farticles%2F7b4gdf25ip6lgv93pb6g.png" alt="Source: https://www.bbc.com/news/science-environment-56215787" width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How bad is it?&lt;/strong&gt;&lt;br&gt;
According to several studies (&lt;a href="https://www.statista.com/statistics/881541/bitcoin-energy-consumption-transaction-comparison-visa/" rel="noopener noreferrer"&gt;link&lt;/a&gt;), a single Bitcoin transaction requires 2,180kWh, with this amount of energy you can execute over 1.4 million Visa transactions, or fully charge 29 Tesla cars (Model 3, 75kWh). Another research reveals Bitcoin system alone consumes half of the energy of the banking industry (&lt;a href="https://www.nasdaq.com/articles/research%3A-bitcoin-consumes-less-than-half-the-energy-of-the-banking-or-gold-industries" rel="noopener noreferrer"&gt;source&lt;/a&gt;). Pretty bad is an understatement...&lt;/p&gt;

&lt;p&gt;If you ask any expert, Bitcoins are a &lt;strong&gt;dramatic waste of natural resources&lt;/strong&gt;. Even if Bitcoin is fully run on renewable energy, its benefits will never outweigh the energy consumption (mind the natural resources, maintenance &amp;amp; production, material waste from solar panels, wind turbines, etc). You may also have seen articles trying to debunk Bitcoin fuds, but if you conduct some research, many of those authors are merely crypto influencers, acting as Hollywood scientists (&lt;a href="https://endthefud.org/" rel="noopener noreferrer"&gt;examples&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  How can we solve this?
&lt;/h2&gt;

&lt;p&gt;I’m building the Carbon3 cryptocurrency that does not use a blockchain (requires no mining). It has better security and privacy wallet aspects than existing cryptocurrencies, stimulates good capitalistic behavior and enforces eco-friendly consumerism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About me&lt;/strong&gt;&lt;br&gt;
I work in the web3.0 industry with a particular stake in the decentralized-identity space. Whether we like it or not, blockchain technologies (in particular PoW ~ Bitcoin) are wasting precious energy resources from our planet 🌎, but fail to universally solve the centralized monetary issues 💰. The big institutions still dominate the financial sector, and are dominating the crypto industry as well. And with enforced Travel Rule worldwide, crypto loses its face as an anonymous system. &lt;/p&gt;

&lt;p&gt;Get in touch to learn more &lt;a href="https://www.linkedin.com/in/iljanevolin/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/iljanevolin/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>bitcoin</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>My First Month of Running an API-first Startup</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Tue, 06 Apr 2021 21:51:17 +0000</pubDate>
      <link>https://dev.to/codr/my-first-month-of-running-an-api-first-startup-3oj7</link>
      <guid>https://dev.to/codr/my-first-month-of-running-an-api-first-startup-3oj7</guid>
      <description>&lt;p&gt;Early March I was hired to run and grow &lt;a href="https://www.spurwing.io/" rel="noopener noreferrer"&gt;Spurwing&lt;/a&gt;. I am in charge of the business development, sales and marketing aspects, and co-responsible for several engineering projects. In this post I'll share my personal insights, tips and tricks from my first month at an early-stage Startup company.&lt;/p&gt;

&lt;h2&gt;
  
  
  The company
&lt;/h2&gt;

&lt;p&gt;Our core product is the &lt;strong&gt;Appointment Scheduling API&lt;/strong&gt;. Our primary clients are engineering teams and managers. The API allows developers to innovate quicker, build cheaper and scale easier any kind of time sensitive process.&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.amazonaws.com%2Fuploads%2Farticles%2Fwb08zq3mm35baedfpf7f.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.amazonaws.com%2Fuploads%2Farticles%2Fwb08zq3mm35baedfpf7f.png" alt="appointment scheduling demo" width="773" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most common use cases we focus on are &lt;strong&gt;Time Management Solutions&lt;/strong&gt;. The most simple use cases are custom booking and scheduling widgets. The more complex solutions entail enterprise calendar management, remote team collaboration tools and supply chain management. Our products fit in any industry and can be used by most roles.&lt;/p&gt;

&lt;p&gt;We are not directly competing with products like Calendly. Our mission is providing engineering resources and tools to development teams to solve problems quicker, easier and cheaper. &lt;/p&gt;

&lt;p&gt;Spurwing is actually a spin-off product developed for &lt;a href="https://www.gethealthie.com/" rel="noopener noreferrer"&gt;Healthie Inc.&lt;/a&gt; where its technology is used to schedule and manage millions of annual bookings and events.&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.amazonaws.com%2Fuploads%2Farticles%2Far3f9u837ky2hcew6a4x.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.amazonaws.com%2Fuploads%2Farticles%2Far3f9u837ky2hcew6a4x.png" alt="calendar management dashboard" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First week
&lt;/h2&gt;

&lt;p&gt;I have been working in software engineering, product and business development for over 10 years. So it was a fairly easy and efficient on-boarding process for me. Some of you may relate, but most of the things we do at Spurwing, and the challenges we face, I already faced before. I have a pretty solid idea of how to tackle most challenges and what it takes to execute.&lt;/p&gt;

&lt;p&gt;This being said, the first week I spent a lot of time communicating with the directors on our vision and strategy for Spurwing. The goal we set is building a large, free and &lt;a href="https://github.com/Spurwing/" rel="noopener noreferrer"&gt;open-source Marketplace&lt;/a&gt;. This marketplace will contain a ton of resources and tools for engineering teams and developers. These include API libraries, widgets, chat bots, management dashboards and many integrations with 3rd party providers.&lt;/p&gt;

&lt;p&gt;Giving away all these resources for free provides us with great marketing opportunities and a big advantage over the competition as well.&lt;/p&gt;

&lt;p&gt;Once we had our goal clearly defined, it was time to execute. I started building the libraries for the API in several programming languages: Python, NodeJS, JavaScript/Ajax and we are working on Java, C++ and C# as well. Thanks to these libraries we can now easily and quickly build new tools and platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second week
&lt;/h2&gt;

&lt;p&gt;Research is an important activity I do on a daily basis. Specifically I research and note down all types of projects and solutions for us to work on. &lt;/p&gt;

&lt;p&gt;I started building the most crucial ones first: 1:1 appointment scheduling widgets for websites, calendar links and the like.&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.amazonaws.com%2Fuploads%2Farticles%2Fbgsiie758revo4rfijne.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.amazonaws.com%2Fuploads%2Farticles%2Fbgsiie758revo4rfijne.png" alt="appointment scheduling tool" width="579" height="688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Third week
&lt;/h2&gt;

&lt;p&gt;I spent that week mostly on research, prospecting and talking to potential clients. Most communication happens on LinkedIn or email. LinkedIn is great, but it's not easy to get people to talk to you. Most senior engineers and managers have no time to chat with randoms. It's all about finding the ones that are active and engage with them.&lt;/p&gt;

&lt;p&gt;A quite popular solution we built that week was a Facebook Messenger Chat Bot with booking / scheduling capabilities:&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.amazonaws.com%2Fuploads%2Farticles%2Fcjb8cpsnvbyc3lrm8c16.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fcjb8cpsnvbyc3lrm8c16.gif" alt="chat bot for scheduling demo" width="295" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are still in the process of improving this chat bot, enhancing the user experience and experimenting with new features. Aside from that we have several more chat bot integrations in the pipeline: Discord, Slack, WhatsApp, Skype, Intercom, Amazon Lex, Google Chat and more.&lt;/p&gt;

&lt;p&gt;We started building a CI/CD pipeline for all our libraries, widgets and tools on the marketplace. Over the years I became very proactive of Test Driven Development and the value that CI/CD pipelines provide to engineering &amp;amp; QA teams. These days I no longer build products without having some decent automated testing (and deployment) included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fourth week
&lt;/h2&gt;

&lt;p&gt;Mostly prospecting, building marketing content and researching product ideas. In addition to that we built a simple scheduling too for international teams across different time zones:&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.amazonaws.com%2Fuploads%2Farticles%2Fysw09vvo7u5h89e06ela.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.amazonaws.com%2Fuploads%2Farticles%2Fysw09vvo7u5h89e06ela.png" alt="appointment scheduling for teams" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tools like these allow us to save precious time and be more productive internally. Most of our employees and partners are located at different time zones, thus setting up meetings can sometimes be a hassle. This tool allows all participants to submit their availability for a certain date range. The organizer of the event can then view a strict overlap of all the submissions and choose a time slot that works for all. It's a quite simple and basic implementation but provides a huge value.&lt;/p&gt;

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

&lt;p&gt;You may wonder how the heck we get so much done in just under a month. It's all about great management mixed with experience &amp;amp; expertise.&lt;/p&gt;

&lt;p&gt;We use Slack / Discord to easily and quickly communicate with all our business and engineering teams. We spend very little time on email or phone communication. We only have one dedicated video chat call per week to catch up. As you can see, we try to minimize and reduce any unnecessary bottlenecks. This allows us to be extremely productive.&lt;/p&gt;

&lt;p&gt;If you have any specific questions, post them down below!&lt;/p&gt;

&lt;h3&gt;
  
  
  Useful links
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/spurwing"&gt;Spurwing blog on DEV&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Spurwing/" rel="noopener noreferrer"&gt;Open-Source Marketplace&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.slideshare.net/IljaNevolin/time-management-tools-appointment-scheduling-software-and-booking-solutions-for-business-teams" rel="noopener noreferrer"&gt;Brochure&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  About me
&lt;/h3&gt;

&lt;p&gt;I'm a modest Software engineer with +10yrs of experience in building software for web, desktop and some Android stuff. Multi-Startup founder and product developer. Feel free to connect: &lt;a href="https://www.linkedin.com/in/iljanevolin/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/iljanevolin/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ciao!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Do you even Refactor? 003</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 14 Feb 2021 22:34:19 +0000</pubDate>
      <link>https://dev.to/codr/do-you-even-refactor-003-3emc</link>
      <guid>https://dev.to/codr/do-you-even-refactor-003-3emc</guid>
      <description>&lt;p&gt;Code refactoring is crucial but often overlooked. It can improve the design and performance of existing code.&lt;/p&gt;

&lt;p&gt;The Python code below takes about 14 seconds to complete. Refactor the &lt;code&gt;getData&lt;/code&gt; function to make it run in less than 10 seconds. Post your answer in the comments.&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;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arr&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;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&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;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Tstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Tdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Tstart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tdt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seconds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;

&lt;span class="nd"&gt;@timed&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="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;len:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sum:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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;



</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>python</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Do you even Refactor? 002</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 13 Feb 2021 16:29:43 +0000</pubDate>
      <link>https://dev.to/codr/do-you-even-refactor-002-4i9h</link>
      <guid>https://dev.to/codr/do-you-even-refactor-002-4i9h</guid>
      <description>&lt;p&gt;Code refactoring is crucial but often overlooked. It can improve the design and performance of existing code.&lt;/p&gt;

&lt;p&gt;The Python code below takes about 17 seconds to complete. Refactor the &lt;code&gt;getData&lt;/code&gt; function to make it run in less than 5 seconds. Post your answer in the comments.&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;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&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;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Tstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Tdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Tstart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tdt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seconds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;

&lt;span class="nd"&gt;@timed&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="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;len:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sum:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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;



</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>python</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Do you even Refactor? 001</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 13 Feb 2021 12:16:51 +0000</pubDate>
      <link>https://dev.to/codr/do-you-even-refactor-001-2ed3</link>
      <guid>https://dev.to/codr/do-you-even-refactor-001-2ed3</guid>
      <description>&lt;p&gt;Code refactoring is crucial but often overlooked. It can improve the design and performance of existing code.&lt;/p&gt;

&lt;p&gt;The Python code below takes about 12 seconds to execute. Refactor the &lt;code&gt;getData&lt;/code&gt; function to make it run in less than 1 second. Post your answer in the comments.&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;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&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;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Tstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Tdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Tstart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tdt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seconds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;

&lt;span class="nd"&gt;@timed&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getData&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;



</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>python</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>MultiVariate Anomaly Detection</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 07 Feb 2021 16:21:37 +0000</pubDate>
      <link>https://dev.to/codr/multivariate-anomaly-detection-51pi</link>
      <guid>https://dev.to/codr/multivariate-anomaly-detection-51pi</guid>
      <description>&lt;p&gt;Discovering anomalies in complex multivariate and multidimensional data can be quite a challenge. Visualizing these anomalies can be even trickier, especially if you want to keep it simple without having to go over thousands of charts to filter out issues from false positives and noise. Using statistical methods we can aggregate complex data to be displayed on a single heatmap. By hovering over specific cells, we can quickly display the individual data on charts.&lt;/p&gt;

&lt;p&gt;Heatmap: &lt;a href="https://healzer.github.io/Industrial-Data-Analysis/hmap1.html?testdays=3&amp;amp;testlike=1" rel="noopener noreferrer"&gt;https://healzer.github.io/Industrial-Data-Analysis/hmap1.html?testdays=3&amp;amp;testlike=1&lt;/a&gt;&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.amazonaws.com%2Fi%2Fczvpw2dyy5dxk8itnt3r.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.amazonaws.com%2Fi%2Fczvpw2dyy5dxk8itnt3r.png" alt="Alt Text" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This system was first implemented for a high-tech enterprise's CI/CD pipeline. It is being used by R&amp;amp;D, Q&amp;amp;A and management to keep track of all processes and variables throughout the development lifecycle. Any anomalies can easily be identified and pinpointed as soon as they appear on the heatmap. Anomalous decreases (green) indicate performance improvements (time, memory and parameter reductions), while degradations (red) imply performance issues.&lt;/p&gt;

&lt;p&gt;Very subtle improvements or degradations are tricky to identify and detect, but overall the system has a very high accuracy. The best use of this system is for data that should remain static over time, it may not work very well if you have alternating/seasonal data. Separate charts can be built for mapping GitHub commits to each individual data point, allowing the team to instantly pinpoint which code change caused which performance change.&lt;/p&gt;

&lt;p&gt;The demo URL can contains three parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;testdays&lt;/code&gt;: how many days from the data should be used as test data (versus baseline data)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;testlike&lt;/code&gt;: filter data whose test value should contain a certain string (these are the Y-axis values)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;annotate&lt;/code&gt;: (0 or 1) primarily for debugging reasons, indicating whether to show Z-values on each cell (may slow down your browser!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This code may not be directly usable for your purposes, but the general idea of using statistical functions like MADe and Z-values to detect anomalies in datasets may be very useful in CI/CD pipelines but also many industrial processes.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/healzer/Industrial-Data-Analysis" rel="noopener noreferrer"&gt;https://github.com/healzer/Industrial-Data-Analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Multipurpose tables as CRM and to-do lists</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 06 Feb 2021 12:32:50 +0000</pubDate>
      <link>https://dev.to/codr/multipurpose-tables-as-crm-and-to-do-lists-gem</link>
      <guid>https://dev.to/codr/multipurpose-tables-as-crm-and-to-do-lists-gem</guid>
      <description>&lt;p&gt;Most of you know CRM by the many advanced tools out there such as Salesforce, Capterra and Hubspot. But millions of small companies still use Excel/Word/Files/Directories to manage their accounts, invoices and projects. I have met very few individual contractors who use productivity tools/apps, even simple things like notepad apps to record customer requests and issues. Even fewer apply basic CRM practices to stay in touch with their customers, such as keeping their contact details and/or sending out promotional emails.&lt;/p&gt;

&lt;p&gt;I understand that for many businesses it may seem like a lot of overhead with little or no immediate value. But some of these do wish to grow and expand their operations, thus seek low-cost solutions.&lt;/p&gt;

&lt;p&gt;Since I started the &lt;a href="https://github.com/healzer/PyCRM" rel="noopener noreferrer"&gt;PyCRM&lt;/a&gt; project I have been thinking of very simple yet effective ways of doing CRM. Since every business is different, everyone wants a slightly different interface, customization is key.&lt;/p&gt;

&lt;p&gt;I remembered that there are many Javascript libraries that provide customizable tables/forms. In addition many of these use very simple data structures which can easily be serialized as JSON and stored as a file without using a complex (No)SQL database.&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.amazonaws.com%2Fi%2F4u41lhro1l9tb341ccko.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.amazonaws.com%2Fi%2F4u41lhro1l9tb341ccko.png" alt="Alt Text" width="799" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the latest addition to our &lt;a href="https://github.com/healzer/PyCRM" rel="noopener noreferrer"&gt;PyCRM&lt;/a&gt; project, we can use the JS Tabulator library which provides this functionality. You can easily customize the columns, fields and hundreds of other features.&lt;/p&gt;

&lt;p&gt;Since it's a SaaS page, it works pretty well on mobile devices. You can use it anywhere as long as you have an internet connection. The save button saves any changes on the server. &lt;/p&gt;

&lt;p&gt;This is a very basic implementation, so be very careful when it is used by multiple people at once. When multiple people save then only ones' version will be stored, the other changes will be overridden and lost.&lt;/p&gt;

&lt;p&gt;An improved implementation would be to commit individual fields instead of the entire dataset. But also keep any changes automatically synced over all active users. Once again this isn't difficult to implement but depends on whether you need it or not.&lt;/p&gt;

&lt;p&gt;Apart from using this as a CRM, you can turn this into a simple project management tool, or a to-do list or a sales tracking tool, etc. Enjoy!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
