<?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: Shaharia Azam</title>
    <description>The latest articles on DEV Community by Shaharia Azam (@shaharia).</description>
    <link>https://dev.to/shaharia</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%2F1180749%2Fdd964ba7-c30a-4b11-bedd-2d4e86a9986e.jpeg</url>
      <title>DEV Community: Shaharia Azam</title>
      <link>https://dev.to/shaharia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shaharia"/>
    <language>en</language>
    <item>
      <title>Let Your AI Agent Use Slack: One CLI, No Slack App Needed</title>
      <dc:creator>Shaharia Azam</dc:creator>
      <pubDate>Sun, 23 Aug 2026 14:44:36 +0000</pubDate>
      <link>https://dev.to/shaharia/let-your-ai-agent-use-slack-one-cli-no-slack-app-needed-1279</link>
      <guid>https://dev.to/shaharia/let-your-ai-agent-use-slack-one-cli-no-slack-app-needed-1279</guid>
      <description>&lt;p&gt;Your AI agent can read your repo, run your tests, and open a pull request. Then it hits a wall. The context it needs is in Slack: the incident thread, the decision nobody wrote down, the "we changed the deploy order last week" message.&lt;/p&gt;

&lt;p&gt;Getting an agent into Slack normally means building a Slack app, picking OAuth scopes, and waiting for an admin to approve it. That is a lot of work before the first useful message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/shaharia-lab/slackcli" rel="noopener noreferrer"&gt;SlackCLI&lt;/a&gt;&lt;/strong&gt; is a different path. It is a single open source binary that talks to Slack from your terminal, and every read command speaks JSON. If your agent can run a shell command, it can use Slack.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SlackCLI is an unofficial project. It is not affiliated with or supported by Slack Technologies.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Up and running in about a minute
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap shaharia-lab/tap
brew &lt;span class="nb"&gt;install &lt;/span&gt;slackcli

slackcli auth login-auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;login-auto&lt;/code&gt; opens a browser, you sign in to Slack the way you always do, and SlackCLI captures the session tokens for &lt;strong&gt;every workspace on that account&lt;/strong&gt;. Nothing leaves your machine. Credentials land in &lt;code&gt;~/.config/slackcli/workspaces.json&lt;/code&gt; with file mode &lt;code&gt;0600&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Prefer a real bot token for a server or a CI job? That works too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli auth login &lt;span class="nt"&gt;--token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xoxb-your-token &lt;span class="nt"&gt;--workspace-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"My Team"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now try something:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli conversations unread
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  See it in action
&lt;/h2&gt;

&lt;p&gt;Demo: &lt;a href="https://github.com/shaharia-lab/slackcli#-see-it-in-action" rel="noopener noreferrer"&gt;https://github.com/shaharia-lab/slackcli#-see-it-in-action&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sign in, browse conversations, search the workspace, read a thread from a permalink, reply, react, read a Canvas as Markdown, and pipe &lt;code&gt;--json&lt;/code&gt; into &lt;code&gt;jq&lt;/code&gt;. All from the terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a CLI is a good tool for an AI agent
&lt;/h2&gt;

&lt;p&gt;Most agent frameworks are happiest when a tool is a plain command with plain output. SlackCLI is built exactly that way.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON everywhere.&lt;/strong&gt; Every read command takes &lt;code&gt;--json&lt;/code&gt;, so the agent gets structured data instead of screen scraping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean streams.&lt;/strong&gt; JSON goes to stdout. Spinners, warnings, and update notices go to stderr. A pipe carries only data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple exit codes.&lt;/strong&gt; &lt;code&gt;0&lt;/code&gt; on success, &lt;code&gt;1&lt;/code&gt; on failure. An empty search result is still a success, so check the data, not the exit code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links work as input.&lt;/strong&gt; Anywhere the CLI wants a channel ID or a timestamp, you can paste a Slack permalink instead. A human drops a link in the prompt and the agent runs with it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One static binary.&lt;/strong&gt; No Python environment, no Node runtime, no server to keep alive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many workspaces at once.&lt;/strong&gt; Add &lt;code&gt;--workspace=automation-bot&lt;/code&gt; to any command to pick an identity on purpose.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Seven things an agent can do today
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Catch up on what you missed
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli conversations unread &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="s1"&gt;'[.unread_channels[] | {name, unread_count}]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feed that to a model and you have a morning digest.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Read a thread from a link
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli conversations &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;--permalink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LINK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.messages[].text'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON also carries a resolved &lt;code&gt;users&lt;/code&gt; array, so user IDs are not opaque.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Search the workspace history
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli search messages &lt;span class="s2"&gt;"deploy failed"&lt;/span&gt; &lt;span class="nt"&gt;--in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;engineering &lt;span class="nt"&gt;--limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of Slack's own search operators work: &lt;code&gt;in:&lt;/code&gt;, &lt;code&gt;from:&lt;/code&gt;, &lt;code&gt;before:&lt;/code&gt;, &lt;code&gt;after:&lt;/code&gt;, &lt;code&gt;has:&lt;/code&gt;, &lt;code&gt;is:&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Find a channel or a person
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli search channels incident &lt;span class="nt"&gt;--json&lt;/span&gt;
slackcli search people &lt;span class="s2"&gt;"ada@example.com"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Reply where the conversation is happening
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli messages send &lt;span class="nt"&gt;--permalink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LINK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Root cause found, fix is in #4821"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passing a permalink replies in that thread, so no ID juggling is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Post a report humans actually want to read
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli messages send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--recipient-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C1234567890 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Nightly build report"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--blocks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'[{"type":"markdown","text":"# Nightly build\n\n- [x] Build\n- [x] Tests\n- [ ] Deploy"}]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Native Block Kit &lt;code&gt;markdown&lt;/code&gt; and &lt;code&gt;table&lt;/code&gt; blocks mean headings, task lists, code fences, and real tables instead of a wall of text.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Read a Canvas as Markdown
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slackcli canvas &lt;span class="nb"&gt;read &lt;/span&gt;F1234567890 &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.markdown'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Team runbooks and specs often live in a Canvas. Now they are just Markdown your agent can read.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wiring it into an agent
&lt;/h2&gt;

&lt;p&gt;You do not need an SDK or an MCP server. Give the agent shell access and one short instruction block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You can use the `slackcli` command to work with Slack.

Read commands (always add --json):
  slackcli conversations unread --json
  slackcli conversations read &amp;lt;channel-id|--permalink=URL&amp;gt; --json
  slackcli search messages "&amp;lt;query&amp;gt;" --in=&amp;lt;channel&amp;gt; --json
  slackcli canvas read &amp;lt;file-id&amp;gt; --json

Write commands (ask me first):
  slackcli messages send --permalink=&amp;lt;url&amp;gt; --message="&amp;lt;text&amp;gt;"
  slackcli messages react --permalink=&amp;lt;url&amp;gt; --emoji=&amp;lt;name&amp;gt;

Run `slackcli &amp;lt;group&amp;gt; --help` if you need the exact options.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole integration. A useful first prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read the last 50 messages in #incidents, find any unresolved issue from today, and draft a summary for me. Do not post it yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because &lt;code&gt;slackcli &amp;lt;group&amp;gt; --help&lt;/code&gt; prints the authoritative options for the installed version, an agent can discover the rest on its own.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keep it safe
&lt;/h2&gt;

&lt;p&gt;Slack access is real access, so a few rules are worth setting up front.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Separate the identity.&lt;/strong&gt; Give automation its own bot token workspace profile instead of copying your personal browser session onto a server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a human on writes.&lt;/strong&gt; Reads are cheap and reversible. Posting is not. A simple "ask before sending" rule in the agent prompt goes a long way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat the config as a secret.&lt;/strong&gt; &lt;code&gt;~/.config/slackcli/workspaces.json&lt;/code&gt; and the browser profile hold live credentials. Do not commit them, sync them, or copy them around. &lt;code&gt;slackcli auth logout&lt;/code&gt; clears both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refresh tokens without a window.&lt;/strong&gt; Browser tokens expire with the session. &lt;code&gt;slackcli auth login-auto --headless&lt;/code&gt; renews them in an unattended job once the profile has signed in once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the rate limits.&lt;/strong&gt; Commands that resolve many users or channels make one API call per entity, which adds up on a large workspace.&lt;/li&gt;
&lt;/ol&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap shaharia-lab/tap
brew &lt;span class="nb"&gt;install &lt;/span&gt;slackcli
slackcli auth login-auto
slackcli conversations unread
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SlackCLI is MIT licensed, built with &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;, and ships prebuilt binaries for macOS, Linux, and Windows. It has over 400 tests and a full &lt;a href="https://github.com/shaharia-lab/slackcli/blob/main/docs/README.md" rel="noopener noreferrer"&gt;user guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/shaharia-lab/slackcli" rel="noopener noreferrer"&gt;⭐ Star it on GitHub&lt;/a&gt;&lt;/strong&gt; if it saves you a trip to the Slack tab, and tell me in the comments what you would want your agent to do in Slack. Feature requests start as &lt;a href="https://github.com/shaharia-lab/slackcli/issues" rel="noopener noreferrer"&gt;an issue&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>slack</category>
      <category>cli</category>
      <category>agentskill</category>
      <category>ai</category>
    </item>
    <item>
      <title>Agento, The Missing Dashboard for Claude Code</title>
      <dc:creator>Shaharia Azam</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:05:39 +0000</pubDate>
      <link>https://dev.to/shaharia/agento-the-missing-dashboard-for-claude-code-3fhf</link>
      <guid>https://dev.to/shaharia/agento-the-missing-dashboard-for-claude-code-3fhf</guid>
      <description>&lt;p&gt;Claude Code is the best terminal tool I have used in years, and it has a strange blind spot: it remembers everything and shows you nothing.&lt;/p&gt;

&lt;p&gt;Every session you run gets written to a JSONL transcript under &lt;code&gt;~/.claude&lt;/code&gt;. Every prompt, every response, every tool call, every token count, every model switch, every sub-agent it spawned. Months of it. And the only window the CLI gives you into that archive is &lt;code&gt;/cost&lt;/code&gt;, which tells you about the session you happen to be sitting in right now.&lt;/p&gt;

&lt;p&gt;So you end up with a monthly invoice and no way to connect it to anything you could actually change. Which model is that number? Which project? Was the eight hour autonomous run worth what it cost? Is that skill you installed last week making things better or quietly doubling your tool errors?&lt;/p&gt;

&lt;p&gt;The data to answer all of that is already on your disk. It is just unreadable. A week of serious use is hundreds of megabytes of nested JSON that nobody is going to open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/shaharia-lab/agento" rel="noopener noreferrer"&gt;Agento&lt;/a&gt; reads it for you. It is a single Go binary, MIT licensed, free, and it runs entirely on your own machine. No account, no API key, no server, nothing uploaded. It reads &lt;code&gt;~/.claude&lt;/code&gt;, caches what it finds in a local SQLite file, and gives you a dashboard.&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%2Fzx8wipy3rtj0t1q07ml8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzx8wipy3rtj0t1q07ml8.gif" alt="Claude Code Insights" width="759" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One note before the screenshots: everything shown here comes from a generated sample dataset, not from a real machine. Your numbers will look different anyway. What matters is which questions the dashboard can answer.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two commands
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install shaharia-lab/tap/agento
agento web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;On Linux or Windows, grab the binary for your platform from &lt;a href="https://github.com/shaharia-lab/agento/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;, put it on your &lt;code&gt;PATH&lt;/code&gt;, and run the same command. It starts on port 8990 and opens your browser.&lt;/p&gt;

&lt;p&gt;There is no configuration step. Agento authenticates through the Claude Code CLI you already have installed, so if &lt;code&gt;claude&lt;/code&gt; runs in your terminal, Agento works. The first scan takes a while on a large history, because it is reading every transcript you own, and it runs in the background while you use the app with a progress counter. After that it updates incrementally.&lt;/p&gt;

&lt;h2&gt;
  
  
  The chart that changes how you think
&lt;/h2&gt;

&lt;p&gt;Start with cost broken down by model, and put tokens broken down by model right next to it.&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%2Fiwhb5n38885jkzctxsw8.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%2Fiwhb5n38885jkzctxsw8.png" alt="Claude Code Dashboard" width="799" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They rank the models in different orders. Often in completely opposite orders.&lt;/p&gt;

&lt;p&gt;A cheap, high volume model can dominate every usage chart you look at and still be a rounding error on the bill. A premium model you reach for a handful of times a day can be most of what you actually pay. On the sample corpus I built for these screenshots, one backend accounted for the overwhelming majority of tokens and a small fraction of the cost.&lt;/p&gt;

&lt;p&gt;That gap exists because "tokens" is not one thing. Fresh input, output, cache reads and cache writes bill at wildly different rates. Any tool that shows one token number and multiplies it by one price is telling you something untrue.&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%2Fvs6urh05jc7tpp2xd2rz.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%2Fvs6urh05jc7tpp2xd2rz.png" alt="Claude Code usage behavior tracking" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agento splits the four apart and prices each one per assistant message, at the model that message used and the date it was sent. Not per session at the first model it saw. That distinction matters more than it sounds like it should, because a long session drifts across models and a rate can change mid month.&lt;/p&gt;

&lt;p&gt;The practical rule: read the cost chart, not the token chart. Almost everyone instinctively reads the token chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caching is most of the economics
&lt;/h2&gt;

&lt;p&gt;The insights page leads with what prompt caching saved over the period: what the same work would have cost if every cached token had been billed as fresh input. It is explicitly labelled an estimate, because it prices a counterfactual, but the order of magnitude is not subtle.&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%2Fwc5d7a6bbmxhd47digui.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%2Fwc5d7a6bbmxhd47digui.png" alt="Claude code caching tracking" width="799" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which means the habits that break caching are expensive habits, and they all look like good hygiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Killing a session and starting fresh because it feels cleaner&lt;/li&gt;
&lt;li&gt;Restarting after every small change&lt;/li&gt;
&lt;li&gt;Splitting one task across five short sessions instead of one long one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every restart re-pays for context you already bought. Nobody thinks "I'll start a fresh session" is a spending decision. It is one.&lt;/p&gt;

&lt;p&gt;There is a per model view of the same thing, which turns out to matter if you point Claude Code at a non-Anthropic backend. Some of them serve very little from cache, so context gets re-billed as fresh input on every turn. That is a model selection consideration with nothing to do with the model's headline price, and it is invisible until you see cache hit rate charted per model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is your delegation actually saving anything?
&lt;/h2&gt;

&lt;p&gt;If you lean on sub-agents, this is the one to check.&lt;/p&gt;

&lt;p&gt;Delegation is supposed to be a cost lever: the orchestrator runs on a strong model, the searching and reading and summarising goes somewhere cheap. But sub-agents inherit the parent's model unless you say otherwise, so it is entirely possible to believe you have routed the grunt work to a cheap model while every delegated run quietly uses the expensive one.&lt;/p&gt;

&lt;p&gt;You can only see this if the tool credits a sub-agent's tokens and cost to the model the &lt;strong&gt;sub-agent&lt;/strong&gt; ran on, rather than to the model that delegated. Agento does, and it was a deliberate fix rather than an accident of design. Crediting delegated spend to the delegating model made the one chart that should answer "is delegation routing work to cheaper models?" structurally incapable of answering it. On the reference corpus, 18.3% of delegated tokens were being charted under the wrong model before that was corrected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are you getting faster, or just busier?
&lt;/h2&gt;

&lt;p&gt;This is the part I find hardest to answer on instinct, and it is where the tool earns its keep.&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%2Ftxldww9lg23z3pmxu80k.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%2Ftxldww9lg23z3pmxu80k.png" alt="Claude code usage trends visualization" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The metrics worth watching, all shown against the equivalent preceding period so you read direction rather than magnitude:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turns per session.&lt;/strong&gt; How often you had to step in. Fewer turns for the same work means your prompts and agent definitions are carrying more weight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steps per turn and longest autonomous chain.&lt;/strong&gt; How far the agent gets before it needs you. This is the number that distinguishes supervising from babysitting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool calls per session and tool errors per 100 calls.&lt;/strong&gt; The error rate is an early warning signal, and when it jumps it is almost never the model. It is a skill, a stale instruction, or a badly configured MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active duration.&lt;/strong&gt; More on this below.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own response time&lt;/strong&gt;, charted next to how long you waited on Claude. That one is humbling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Underneath sit breakdowns by tool, by skill, by plugin, by MCP server, by MCP tool and by sub-agent. That is how you find out which of your skills is burning the most tool calls, which is a very direct route to rewriting one and deleting another.&lt;/p&gt;

&lt;p&gt;The insights page is marked experimental, and the app says so plainly, because several of the formulas are heuristics. The trends are informative even where the absolute numbers are arguable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things that were harder than they look
&lt;/h2&gt;

&lt;p&gt;Since this is dev.to, the implementation details are probably more interesting than the feature list. These are the four places where the obvious approach produces a number that is confidently wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duration has to mean active duration.&lt;/strong&gt; Claude Code sessions are resumable, so the span from first event to last event counts every idle day in between. One session picked up after 28 days carried 82% of the dashboard's average duration figure: 476 minutes shown against a 17 minute median. So Agento sums the gaps between events and ignores any gap longer than a threshold you configure (10 minutes by default, adjustable from 1 to 240 because the right answer depends on how you work). The raw span is still stored and still shown as secondary context, because "first seen to last touched" answers a different, real question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing has to be effective dated, and honest about what it doesn't know.&lt;/strong&gt; The catalog is editable from the Settings UI and ships with rates for several providers beyond Anthropic, because plenty of people point Claude Code at Kimi, GLM or Qwen. Cache creation is split by TTL, since the five minute and one hour tiers bill differently. Qwen tiers its pricing by context length, so a rate can carry bands. And a model with no published rate is reported as &lt;strong&gt;unknown&lt;/strong&gt; rather than being quietly priced as something similar, so a partial total is disclosed as a floor instead of presented as complete. A deliberate zero, like a synthetic or embedding model, is a separate flag from an unknown one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache hit rate needs exactly one definition.&lt;/strong&gt; There used to be two in the codebase: &lt;code&gt;cacheRead / (input + cacheRead)&lt;/code&gt;, which pins near 100% and tells you nothing, and &lt;code&gt;cacheRead / (cacheCreation + cacheRead)&lt;/code&gt;, which sits around 74%. The one that survived counts the read share of every input side token, fresh input plus cache writes plus cache reads, because it is the only version under which a backend with no prompt caching scores 0 rather than being excused from the chart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activity charts have to bucket across a span.&lt;/strong&gt; The heatmap counts a session in every hour between its start and its last activity, sharing its tokens out by overlap. The first version bucketed at the end timestamp, which quietly turned "activity by hour of day" into a map of when work &lt;em&gt;stopped&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficgwh7lof9dkn1su40e5.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%2Ficgwh7lof9dkn1su40e5.png" alt="Claude Code activity chart" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of these are exotic. They are just the difference between a dashboard you can act on and a dashboard that looks plausible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drilling into one session
&lt;/h2&gt;

&lt;p&gt;The dashboards tell you &lt;em&gt;that&lt;/em&gt; something changed. To find out &lt;em&gt;why&lt;/em&gt;, you open the session.&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%2F3syswdmf936m9mdtygk0.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%2F3syswdmf936m9mdtygk0.png" alt="Claude code session journey visualization" width="799" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The list is searchable and filterable by project, model, date and cost, paged in SQL rather than in the browser so it stays usable at thousands of sessions. Every row carries the branch, the permission mode, and any pull requests that session touched.&lt;/p&gt;

&lt;p&gt;Open one and you get the full transcript plus that session's own metrics, and a journey view: a step by step timeline of every message, tool call and result in order, with each sub-agent's steps nested underneath the &lt;code&gt;Task&lt;/code&gt; call that spawned it.&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%2F9y1pwywihqq5l5nf0xy4.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%2F9y1pwywihqq5l5nf0xy4.png" alt="Claude code UI" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That nesting is what makes a long autonomous run legible. When a four hour session costs three times what a similar one did, the journey view usually shows you which delegated branch went sideways in about a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy, since it's the obvious question
&lt;/h2&gt;

&lt;p&gt;Claude Code transcripts contain your source code and your prompts. Any usage analytics tool that uploads them is a non-starter for most people and every company.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agento&lt;/strong&gt; is a single binary that runs on your machine. It reads &lt;code&gt;~/.claude&lt;/code&gt;, writes a SQLite cache to &lt;code&gt;~/.agento/agento.db&lt;/code&gt;, binds to &lt;code&gt;127.0.0.1&lt;/code&gt; by default, and has no server component and no account. If there are projects you would rather keep out of the numbers entirely, you can hide them from all reporting in Settings, and hiding is not deleting, so unhiding is instant.&lt;/p&gt;

&lt;p&gt;It also indexes multiple Claude config directories, which matters if you keep a work account and a personal account separate. Analytics reads the union of them; a given run targets exactly one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of it
&lt;/h2&gt;

&lt;p&gt;The dashboards are the part I open every week, but Agento is a broader tool. It also does agent building with an explicit tool allowlist, persistent multi-chat conversations streamed over SSE, cron scheduled agent runs with job history, Telegram triggers, and in process MCP integrations for Google, GitHub, Slack, Jira and Confluence. All of it in the same binary. If that is more interesting to you than the analytics, the &lt;a href="https://github.com/shaharia-lab/agento" rel="noopener noreferrer"&gt;README&lt;/a&gt; covers it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your own last thirty days
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install shaharia-lab/tap/agento
agento web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You already have the data. It took me one evening of looking at mine to change five things about how I work, none of them dramatic, all of them compounding: keep sessions alive longer, compare models on cost rather than token volume, verify where delegated work actually goes, split long autonomous runs, and treat a rising tool error rate as a prompt bug rather than a model problem.&lt;/p&gt;

&lt;p&gt;The repo is at &lt;strong&gt;&lt;a href="https://github.com/shaharia-lab/agento" rel="noopener noreferrer"&gt;github.com/shaharia-lab/agento&lt;/a&gt;&lt;/strong&gt;. It is MIT licensed and free. If it turns out to be useful, a star genuinely helps other people find it.&lt;/p&gt;

&lt;p&gt;I would be curious what surprises you in your own numbers. The cost versus tokens gap is the one that gets everybody.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>analytics</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>Introducing Cora: A Powerful File Concatenation Tool for Developers</title>
      <dc:creator>Shaharia Azam</dc:creator>
      <pubDate>Wed, 10 Jul 2024 15:41:51 +0000</pubDate>
      <link>https://dev.to/shaharia/introducing-cora-a-powerful-file-concatenation-tool-for-developers-p9n</link>
      <guid>https://dev.to/shaharia/introducing-cora-a-powerful-file-concatenation-tool-for-developers-p9n</guid>
      <description>&lt;p&gt;In the world of software development, we often find ourselves dealing with multiple files that need to be combined for various reasons. Whether it's merging documentation, preparing training data for machine learning models, or consolidating code for review, the need to concatenate files is a common task. Enter Cora, a robust and flexible command-line tool designed to make file concatenation a breeze.&lt;/p&gt;

&lt;p&gt;Project link: &lt;a href="https://github.com/shaharia-lab/cora" rel="noopener noreferrer"&gt;https://github.com/shaharia-lab/cora&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Cora?
&lt;/h2&gt;

&lt;p&gt;Cora, which stands for &lt;strong&gt;CO&lt;/strong&gt;ncatenate and &lt;strong&gt;R&lt;/strong&gt;ead &lt;strong&gt;A&lt;/strong&gt;ll, is an open-source Go application that simplifies the process of combining multiple files into a single output file. With its intuitive command-line interface and powerful features, Cora is set to become an essential tool in every developer's toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;Cora comes packed with features that set it apart from simple concatenation tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recursive Directory Traversal&lt;/strong&gt;: Cora can walk through directories recursively, allowing you to process entire project structures with ease.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible File Selection&lt;/strong&gt;: Use include and exclude patterns to precisely control which files are concatenated. This feature uses glob patterns, giving you powerful file matching capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customizable Output&lt;/strong&gt;: Add separators between files and prefixes before each file path in the output, making the resulting file more readable and organized.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Large File Handling&lt;/strong&gt;: Cora is designed to handle large files efficiently, making it suitable for big data preprocessing tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging Mode&lt;/strong&gt;: Enable debug logging to get detailed information about the concatenation process, which is invaluable for troubleshooting.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Difference between &lt;code&gt;cat&lt;/code&gt; and &lt;code&gt;Cora&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;While the &lt;code&gt;cat&lt;/code&gt; command is indeed useful for simple file concatenation, Cora offers several advanced features that make it more powerful and flexible for complex scenarios.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;code&gt;cat&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;cora&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic file concatenation&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recursive directory traversal&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexible file selection (glob patterns)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exclude patterns&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom separators between files&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File path prefixes in output&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in debugging mode&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-platform consistency&lt;/td&gt;
&lt;td&gt;❌ (behavior may vary)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large file handling&lt;/td&gt;
&lt;td&gt;✅ (but may require additional tools)&lt;/td&gt;
&lt;td&gt;✅ (optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed for simple concatenations&lt;/td&gt;
&lt;td&gt;✅ (generally faster)&lt;/td&gt;
&lt;td&gt;✅ (may have slight overhead)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires external tools for complex tasks&lt;/td&gt;
&lt;td&gt;✅ (often used with find, xargs, etc.)&lt;/td&gt;
&lt;td&gt;❌ (all-in-one solution)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customizable output file&lt;/td&gt;
&lt;td&gt;❌ (requires output redirection)&lt;/td&gt;
&lt;td&gt;✅ (direct specification)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Part of standard Unix toolset&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (requires installation)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;p&gt;Cora's versatility makes it suitable for a wide range of scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLM Context Preparation&lt;/strong&gt;: When working with Large Language Models, Cora can help you prepare comprehensive context by concatenating relevant code files or documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Review&lt;/strong&gt;: Merge multiple source files into a single document for easier review, especially useful for pull request reviews or security audits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation Generation&lt;/strong&gt;: Combine multiple markdown files to create comprehensive project documentation or technical specifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Log Analysis&lt;/strong&gt;: Concatenate multiple log files for comprehensive analysis while using exclude patterns to filter out irrelevant files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Preprocessing&lt;/strong&gt;: Merge multiple data files into a single file for easier processing in data analysis pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started with Cora
&lt;/h2&gt;

&lt;p&gt;Installing Cora is straightforward. If you have Go installed, you can use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/shaharia-lab/cora@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, you can start using Cora with a simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cora &lt;span class="nt"&gt;-s&lt;/span&gt; /path/to/source &lt;span class="nt"&gt;-o&lt;/span&gt; output.txt &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"*.md"&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"*.tmp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will concatenate all Markdown files from the specified source directory, excluding any &lt;code&gt;.tmp&lt;/code&gt; files, and save the result to &lt;code&gt;output.txt&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of Open Source
&lt;/h2&gt;

&lt;p&gt;Cora is not just a tool; it's an open-source project that welcomes contributions from the developer community. Whether you're interested in adding new features, improving performance, or fixing bugs, your contributions are valuable and appreciated.&lt;/p&gt;

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

&lt;p&gt;In a world where data is increasingly distributed across multiple files and formats, tools like Cora become indispensable. Its combination of simplicity and power makes it suitable for both quick, one-off tasks and integration into complex data processing pipelines.&lt;/p&gt;

&lt;p&gt;We invite you to try Cora for your file concatenation needs and experience the difference it can make in your workflow. Visit our &lt;a href="https://github.com/shaharia-lab/cora" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; to get started, and don't hesitate to share your feedback or contribute to the project.&lt;/p&gt;

&lt;p&gt;Remember, in the world of development, small tools can make a big difference. Cora is here to simplify your file management tasks, allowing you to focus on what truly matters – building great software.&lt;/p&gt;

&lt;p&gt;Happy coding!**&lt;/p&gt;

</description>
      <category>filesystem</category>
      <category>concate</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
