gh-pulse: know what moved across every repo your agents touch
If you build with AI agents, you ship differently. A normal week is not one repository and a tidy commit log. It is thirty repositories, a few hundred pull requests opened and merged by sessions running in parallel, releases cut by a workflow at three in the morning, and a directory of side projects that are each one good day away from being someone else's favourite tool.
GitHub shows you a traffic graph for each of those repositories, fourteen days deep, and then forgets it. Nobody with three hundred repositories opens three hundred graphs. So the questions that matter to an indie developer stay unanswered: which project did strangers actually look at yesterday, which one got starred, which one did a stranger clone, where did they come from, and is any of that a trend or a blip.
gh-pulse answers those questions once a day, and on demand for any range from the last hour to all time. It is a command in cli-tools, free and MIT.
What it does
One scan covers every repository the gh token can see, your own account plus every org you belong to, forks left out. For each one it measures what moved: stars, forks, commits, pull requests opened, merged and closed, issues opened and closed, releases, and the traffic GitHub reports, which is views, unique visitors, clones, unique cloners, referrers and popular content.
Repositories with movement are ranked. A star is five points, a fork four, a release five, a merged pull request three, an opened pull request or issue two, a commit one, a unique visitor one, a unique cloner one. One clone or one visitor in a day is treated as the background noise it is across a long tail of repositories; two unique visitors or two unique cloners are enough to put a quiet repository on the list.
The result reaches you four ways, so you read it wherever you already are.
The email arrives every morning with a chart of views and clones across the whole portfolio, the ranking with score bars, and for the top repositories a fourteen day chart, referrers, popular content, who starred, what merged and what shipped. New and lost followers are named.
gh-pulse show is the same report in the terminal, built on hqtui, which means it works over SSH on the box where your agents run. The ranked table is on the left; click a row and the repository's traffic histograms and detail appear on the right. A History tab charts stars, followers, views and clones across every run. In the moshcode pit it is /pulse.
gh-pulse open puts the HTML in a browser, and gh-pulse text and gh-pulse json print it for pipes, cron and other agents.
Any range, and filters you click
gh-pulse --range week answers "what moved this week". So do hour, day, month, quarter, year and all, or --since 2026-09-01 for any start date. In the TUI the ranges are a row of buttons and the filters are toggles: which kinds of movement count (stars, forks, commits, PRs, issues, releases, traffic), which owners, and whether private repositories show. A repository stays in the list while at least one enabled kind moved for it, and it keeps its rank, so turning traffic off does not reshuffle the board, it just narrows it.
Turn everything off except stars and you have a leaderboard of what people liked this month. Turn everything off except traffic and you have the pages strangers actually read. Turn one org off and the noise from your own agents' pull requests disappears and the outside world is what is left.
Why the window is not a clock
This is the part that makes the long ranges honest, and it is worth knowing if you build anything on GitHub traffic.
GitHub publishes traffic in UTC day buckets, one to two days late. At three in the morning the newest bucket with anything in it is usually the day before yesterday, and some repositories carry empty buckets padded up to today. Read "the last 24 hours" off the clock and almost everything is zero.
What can be measured exactly is the growth of each bucket since the previous run. So the daily window is exactly "since the last email", and a skipped day widens it instead of losing data. Every run also writes a compressed snapshot of the raw counts and buckets, and the snapshots laid end to end are a ledger that only grows. That ledger is where the long ranges get their traffic: GitHub keeps fourteen days, so year and all see as far back as the daily run has been going, and every report says exactly which days it covers. Events, on the other hand, are queried live for the whole range, however long, because GitHub keeps those forever.
For agentic teams this is the useful bit: the one place where a year of "who looked at what we shipped" exists is the ledger you started keeping today. Start it now and next year's report is a year deep.
Install
curl -fsSL https://raw.githubusercontent.com/profullstack/cli-tools/master/install.sh | sh
gh-pulse --dry-run # scan, write the report, send nothing
gh-pulse show # read it in the terminal
gh-pulse --range month # what moved in the last 30 days
Mail goes through Resend with a sender on a verified domain; the README has the cron line. The whole cli-tools set installs and updates through one command, and moshcode picks it up through moshcode install cli-tools.
Top comments (0)