<?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: Siekwie</title>
    <description>The latest articles on DEV Community by Siekwie (@siekwiedev).</description>
    <link>https://dev.to/siekwiedev</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%2F4160792%2Fe01251aa-8575-4f06-b15d-dafb39c82fc6.png</url>
      <title>DEV Community: Siekwie</title>
      <link>https://dev.to/siekwiedev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siekwiedev"/>
    <language>en</language>
    <item>
      <title>GitHub only keeps 14 days of repo traffic. I built an open-source tool that keeps all of it</title>
      <dc:creator>Siekwie</dc:creator>
      <pubDate>Sun, 04 Oct 2026 18:01:56 +0000</pubDate>
      <link>https://dev.to/siekwiedev/github-only-keeps-14-days-of-repo-traffic-i-built-an-open-source-tool-that-keeps-all-of-it-4jik</link>
      <guid>https://dev.to/siekwiedev/github-only-keeps-14-days-of-repo-traffic-i-built-an-open-source-tool-that-keeps-all-of-it-4jik</guid>
      <description>&lt;p&gt;Open &lt;strong&gt;Insights → Traffic&lt;/strong&gt; on any repository you own and GitHub shows you views, unique visitors, clones and referring sites. For the last 14 days. Day 15 is gone, and there is no setting, plan or export that brings it back.&lt;/p&gt;

&lt;p&gt;That makes some simple questions impossible to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the launch post in March bring more people than the one in June?&lt;/li&gt;
&lt;li&gt;Is the project growing, or was last week just a good week?&lt;/li&gt;
&lt;li&gt;Which site has sent the most visitors over the whole life of the repo?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;RepoEasy&lt;/strong&gt;. It signs in with GitHub, reads the traffic of your repositories every day and keeps it. The code is MIT-licensed, and there is a hosted version with a demo you can open without an account: &lt;a href="https://repoeasy.wiest-lab.eu/?ref=dev.to"&gt;repoeasy.wiest-lab.eu&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zap8r8dx7ya2l68yqvj.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%2F8zap8r8dx7ya2l68yqvj.png" alt="RepoEasy overview: lifetime and recent traffic across all repositories" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it keeps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Views, unique visitors, clones and unique cloners per day, private repositories included&lt;/li&gt;
&lt;li&gt;Referring sites and popular pages&lt;/li&gt;
&lt;li&gt;Stars, forks, open issues, pull requests and release downloads, one snapshot per day&lt;/li&gt;
&lt;li&gt;Star history from before you signed up, backfilled from the timestamp GitHub keeps for every star&lt;/li&gt;
&lt;li&gt;The same star, fork and release numbers for any public repository you choose to follow: a dependency, a competitor, a project you are curious about&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the data is there, the rest follows: CSV and JSON export, an activity feed with traffic spikes and star milestones, webhook alerts for Discord or Slack, and an opt-in public stats page with README badges.&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%2F2plkd5vat43idbhpu2xj.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%2F2plkd5vat43idbhpu2xj.png" alt="A repository page in RepoEasy: stars, forks, releases, views and clones" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How the archive is built
&lt;/h2&gt;

&lt;p&gt;Reading the numbers is the easy part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh api repos/OWNER/REPO/traffic/views
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That returns up to 14 daily entries, each with &lt;code&gt;count&lt;/code&gt; and &lt;code&gt;uniques&lt;/code&gt;. The interesting part is merging overlapping 14-day windows, day after day, without getting the numbers wrong. Three things stood out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Today is always incomplete
&lt;/h3&gt;

&lt;p&gt;The newest entry is a partial day and keeps growing until midnight UTC. So a day that is already stored is never overwritten with a lower number, only raised:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;traffic_daily&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uniques&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;CONFLICT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt;
  &lt;span class="n"&gt;views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;excluded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;uniques&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uniques&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;excluded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uniques&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every sync reads all 14 days again, so a partial value is corrected by the next run, and a missed sync costs nothing as long as one succeeds within two weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Unique visitors do not add up
&lt;/h3&gt;

&lt;p&gt;GitHub reports unique visitors per day. Nothing tells you that Monday's visitor and Thursday's visitor are the same person. So "unique visitors over 90 days" in RepoEasy is the sum of the daily uniques, and the UI says so wherever that number appears. I would rather show a number with an honest label than a nicer-looking one I cannot back up.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Referrers only exist as 14-day totals
&lt;/h3&gt;

&lt;p&gt;For referring sites and popular pages there is no per-day breakdown, only "the last 14 days". Adding up a snapshot from every day would count each visit up to 14 times. RepoEasy stores a snapshot every day and, for lifetime numbers, adds up snapshots taken 14 days apart. That tiles the timeline without overlap. It is an estimate and labelled as one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;One Node process and one SQLite file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hono.dev" rel="noopener noreferrer"&gt;Hono&lt;/a&gt; for HTTP, &lt;code&gt;better-sqlite3&lt;/code&gt; for storage&lt;/li&gt;
&lt;li&gt;A React single-page app with hand-drawn SVG charts, no chart library and no UI framework&lt;/li&gt;
&lt;li&gt;GitHub tokens encrypted at rest with AES-256-GCM&lt;/li&gt;
&lt;li&gt;A small VPS behind Caddy for the hosted version, &lt;code&gt;docker compose up -d&lt;/code&gt; for your own&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A sync costs about one GraphQL call per 15 repositories plus four to six REST calls per tracked repository, all against the user's own rate limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the permission it asks for
&lt;/h2&gt;

&lt;p&gt;GitHub has no read-only permission that includes traffic, so signing in asks for the &lt;code&gt;repo&lt;/code&gt; scope. That is a lot to hand to a service you met five minutes ago. RepoEasy only reads, with one exception: a form that lets you edit a repository's description, homepage and topics, and only when you use it.&lt;/p&gt;

&lt;p&gt;If you would rather not grant that to a hosted service, run it yourself. In single-user mode it works with a fine-grained token limited to &lt;em&gt;Administration: read&lt;/em&gt; and &lt;em&gt;Metadata: read&lt;/em&gt;, and every feature is unlocked.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosted, with a demo:&lt;/strong&gt; &lt;a href="https://repoeasy.wiest-lab.eu/?ref=dev.to"&gt;repoeasy.wiest-lab.eu&lt;/a&gt;. Free for 3 tracked repositories and 10 followed ones, with the full history kept. Pro is €1.50 a month for unlimited repositories, sync every 6 hours, API tokens, webhooks and share pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/Siekwie/RepoEasy" rel="noopener noreferrer"&gt;github.com/Siekwie/RepoEasy&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing to know before you decide: the archive starts on the day you connect. GitHub cannot give back days it has already dropped, so the best time to start is before your next launch, not after it.&lt;/p&gt;

&lt;p&gt;What would you want to learn from long-term traffic data that 14 days cannot tell you? I am collecting ideas for what to build next.&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built a small kanban board that my coding agents update with curl</title>
      <dc:creator>Siekwie</dc:creator>
      <pubDate>Sun, 04 Oct 2026 03:54:45 +0000</pubDate>
      <link>https://dev.to/siekwiedev/i-built-a-small-kanban-board-that-my-coding-agents-update-with-curl-1kf</link>
      <guid>https://dev.to/siekwiedev/i-built-a-small-kanban-board-that-my-coding-agents-update-with-curl-1kf</guid>
      <description>&lt;p&gt;When I work with coding agents I usually have a few things going at once, and after a couple of sessions I no longer know what's finished, what's half done and what's waiting on me. I tried a &lt;code&gt;TODO.md&lt;/code&gt;, but I never looked at it. Jira or Linear felt silly for a one-person project.&lt;/p&gt;

&lt;p&gt;So I wrote KanbanEasy. It's a small desktop kanban board that I keep docked next to my editor. The part I actually wanted is that the agent can move its own cards.&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%2F13fgoicq720f8b72m3rr.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%2F13fgoicq720f8b72m3rr.png" alt="KanbanEasy board with five columns of cards" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is on GitHub under the MIT license: &lt;a href="https://github.com/Siekwie/KanbanEasy" rel="noopener noreferrer"&gt;https://github.com/Siekwie/KanbanEasy&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent side
&lt;/h2&gt;

&lt;p&gt;While the app is open it serves a JSON API on &lt;code&gt;127.0.0.1:7420&lt;/code&gt;. I didn't want to set up an MCP server for this. Every agent I use can already run a shell command, so curl is enough:&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;# take the next free todo&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;assignee&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;claude localhost:7420/claim

&lt;span class="c"&gt;# leave a comment on a card&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'X-Actor: claude'&lt;/span&gt; &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Tests pass'&lt;/span&gt; localhost:7420/issues/KE-7/comments

&lt;span class="c"&gt;# hand it back to me for review&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;review localhost:7420/issues/KE-7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you'd rather not type curl there is a small bash wrapper called &lt;code&gt;kb&lt;/code&gt;, so the same things become &lt;code&gt;kb claim claude&lt;/code&gt; or &lt;code&gt;kb mv KE-7 review&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To tell an agent about the board, right-click the API line in the sidebar and pick "Copy agent instructions". That gives you a short text block to paste into &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Columns can have rules
&lt;/h2&gt;

&lt;p&gt;This is the feature I use most. A column can say who gets the cards that land in it, and it can carry instructions for the agent. My Review column, for example, assigns cards to me. You can also do it the other way around: you write your decision in a comment, drop the card into a column that belongs to the agent, and the column's instructions tell it what to do next.&lt;/p&gt;

&lt;p&gt;Every card keeps a log of who moved it or changed it, me or the agent. When the agent touches a card, it glows on the board for a moment. I added that as a gimmick and it turned out to be useful, because I notice progress without switching windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The human side
&lt;/h2&gt;

&lt;p&gt;I wanted adding a card to cost almost nothing. Press &lt;code&gt;N&lt;/code&gt;, type something like &lt;code&gt;Fix flaky test #ci @agent !high&lt;/code&gt; and press Enter. The label, the assignee and the priority are read from the title, and the input stays open for the next card.&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%2F5eods2ifzu67xfhgmdjx.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%2F5eods2ifzu67xfhgmdjx.png" alt="A card opened in the detail panel" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the window is narrow, the board turns into a stacked list, so it fits in a strip beside the editor. It only redraws when something changes, so it uses almost no CPU while it sits there.&lt;/p&gt;

&lt;p&gt;The whole board is one readable JSON file in a &lt;code&gt;KanbanEasy&lt;/code&gt; folder in your home directory. There are no accounts and nothing is sent anywhere. The app keeps a backup per weekday, and if you edit the file by hand it reloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is an open local port a problem?
&lt;/h2&gt;

&lt;p&gt;I asked myself the same thing. The server listens on localhost only. It also refuses any request that carries browser headers like &lt;code&gt;Origin&lt;/code&gt;, or a &lt;code&gt;Host&lt;/code&gt; that isn't local, so a website you have open can't reach it. Other programs running under your user can. That is on purpose, because that's how the agent gets in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's built with
&lt;/h2&gt;

&lt;p&gt;It's written in Lua on &lt;a href="https://love2d.org" rel="noopener noreferrer"&gt;LÖVE&lt;/a&gt;, which is really a game framework. That sounds like an odd choice for a kanban board, but it starts instantly, and I genuinely think it is just an underrated piece of technology.&lt;/p&gt;

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

&lt;p&gt;Builds for Windows, macOS and Linux are on the &lt;a href="https://github.com/Siekwie/KanbanEasy/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;. The macOS build isn't signed, so you have to right-click and choose Open the first time.&lt;/p&gt;

&lt;p&gt;It's still young and I'm sure there are rough edges. If you run agents on your own projects, I'd like to know what you would want from a board like this, and whether the API makes sense to you.&lt;/p&gt;

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