Serverless, free tier, no account

Every number your projects earn, in one place.

Count page views, pull install totals from six registries, log events, then do arithmetic across all of it and get a single number back as JSON or as a badge. One Cloudflare Worker and one D1 database. Nothing to run.

Checking this instance openapi.yaml llms.txt

Live on this instance

Read straight from the deployment you are looking at. A figure that cannot be fetched says so rather than showing a zero.

unavailable
Views counted
unavailable
Projects tracked

Try it

Pick any name. It is created the first time it is counted, so there is nothing to register.

Count and read

Compute one number

Arithmetic over views, installs and events. Variables are views.total, views.unique, installs.total, installs.SOURCE and events.CATEGORY. A missing input makes the whole metric unavailable, never a zero.

A + in a URL decodes to a space, so write it as %2B.

Three steps to wire it in

Tracking is fire and forget. Swallow the error and use a short timeout, so a counter that is down cannot break the page it is measuring.

Count the view

One POST. The project is created on first use.

curl -X POST "https://counter.vkrishna04.me/api/views/my-project"

Show the badge

Drop it in a README. &inc=true counts the view as the image loads.

![Views](https://counter.vkrishna04.me/api/views/my-project/badge?inc=true)

Read it back

JSON for one project, or up to 50 at once with ?names=a,b,c.

curl "https://counter.vkrishna04.me/api/views/my-project"

Names can be a hierarchy

A dot makes a name a path. acme.api.docs sits under acme.api, which sits under acme. Nothing about storage changes, so every flat name keeps working. Rollup is opt in on every route that offers it.

# one page curl -X POST "$BASE/api/views/acme.docs.getting-started" # the whole tree, with the per-project breakdown in members curl "$BASE/api/views/acme?rollup=1" # and the badge for that sum "$BASE/api/views/acme/badge?rollup=1&label=acme"

Built for agents to install

Every deployment serves its own contract. Point an agent at /llms.txt for the short version or /openapi.yaml for all of it, and it has what it needs with no plugin at all.

Where each agent harness reads its instructions
Harness File it reads
Claude Code /plugin marketplace add Life-Experimentalist/ViewFlare
Codex, Cursor, Windsurf, Antigravity AGENTS.md
GitHub Copilot .github/instructions/viewflare.instructions.md
Amazon Kiro .kiro/steering/viewflare.md
Anything else with a fetch tool /llms.txt

The repo ships all of these under integrations/agents/, each one a copy-in file that points at the same contract. Install instructions are in the README.

What it counts

Views

Total and unique per project, plus a daily series. Unique counting is opt in, so an instance can run with no visitor tracking at all.

Installs

VS Code Marketplace, Open VSX, PyPI, npm, crates.io and GitHub releases, aggregated with the per-source breakdown kept. A cumulative count added to a rolling window is labelled as mixed, not passed off as one figure.

Events

Anything that is not a page view: a build, a CLI run, a failure. Category and name, with free-form metadata.

Computed metrics

Add, divide, take a percentage or a max across any of the above, and get one number as JSON, an SVG badge or a shields.io endpoint.

Built for the free tier

Unauthenticated reads are cached at the edge, the schema runs once per isolate, and five write routes are rate limited per IP.

Yours to host

Apache 2.0, one Worker and one D1 database. Deploy it to your own Cloudflare account and the counts are yours.