PHPackages                             linkrobins/birdseye - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. linkrobins/birdseye

ActiveFlarum-extension

linkrobins/birdseye
===================

Forum analytics for Flarum — server-side, zero JavaScript, no cookies. Your stats live in your own database.

v1.0.0(today)00MITPHP ^8.3

Since Jul 23Compare

[ Source](https://github.com/linkrobins/birdseye)[ Packagist](https://packagist.org/packages/linkrobins/birdseye)[ RSS](/packages/linkrobins-birdseye/feed)WikiDiscussions Synced today

READMEChangelog (1)Dependencies (3)Versions (2)Used By (0)

Link Robins Birdseye
====================

[](#link-robins-birdseye)

Forum analytics for [Flarum](https://flarum.org) — captured server-side, with **zero JavaScript, no cookies, and no external tracker**. Your analytics history lives in **your own database** and stays there.

How it works
------------

[](#how-it-works)

The extension records events (page and discussion views, searches, posts, registrations) on the server as requests happen. Visitors are counted with a daily-rotating salted hash — no IP address is ever stored, no cookie is ever set, and nothing runs in your visitors' browsers.

Events sit in a short-lived local buffer (72 hours max). Once a day, the buffer is rolled up into small per-day aggregate rows in your database — that's the permanent history, a few kilobytes per month.

- **Without a license key**, rollups are computed locally and include basic daily counts: pageviews, visitors, posts, registrations. Nothing ever leaves your server.
- **With a [Birdseye subscription](https://linkrobins.com/birdseye)**, the daily batch is sent to our processor, which computes the full picture — bounce rate, session length, top pages and discussions, referrer sources, devices, countries (world map included) — and returns the results to be stored **in your database**. We keep nothing. Cancel anytime; every stat you've collected stays with you.

Beyond the numbers
------------------

[](#beyond-the-numbers)

- **Forum health, not just traffic** — new-member activation (who posts within their first week), discussions that get read but never answered, top tags, live search terms, and a "today so far" strip straight from the buffer.
- **Share the dashboard** — a `View forum analytics` permission lets any group you choose open the dashboard from their user menu, without admin access. Nobody holds it until you grant it.
- **Weekly digest** — every Monday, administrators get a plain-text email summary of last week vs the week before. One switch to turn off.

Installation
------------

[](#installation)

```
composer require linkrobins/birdseye
```

Enable it in the admin panel. That's it — stats begin collecting immediately.

Requirements
------------

[](#requirements)

- Flarum `^2.0`, PHP `^8.3`
- The [scheduler](https://docs.flarum.org/scheduler) must be running for daily rollups (`php flarum schedule:run` via cron).

Privacy notes
-------------

[](#privacy-notes)

- Visitor identity is `hash(secret + date + IP + user agent)`, truncated; the salt rotates daily so visitors cannot be tracked across days.
- Country detection uses your proxy's country header (e.g. Cloudflare) when available. Otherwise, an **anonymized IP prefix** (/24 for IPv4, /48 for IPv6 — never the full address) is kept in the 72-hour buffer solely for country lookup during processing, then discarded. This can be disabled in settings, and no full IP is written to disk either way.
- Bounce rate and visit duration are measured log-style (server-side), which runs slightly conservative compared to script-based trackers — the cost of shipping no JavaScript at all.

Links
-----

[](#links)

- [Birdseye subscriptions](https://linkrobins.com/birdseye)
- [Support forum](https://linkrobins.com/forum)
- [Source on GitHub](https://github.com/linkrobins/birdseye)

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/213107296?v=4)[Link Robins](/maintainers/linkrobins)[@linkrobins](https://github.com/linkrobins)

### Embed Badge

![Health badge](/badges/linkrobins-birdseye/health.svg)

```
[![Health](https://phpackages.com/badges/linkrobins-birdseye/health.svg)](https://phpackages.com/packages/linkrobins-birdseye)
```

###  Alternatives

[flarum-lang/russian

Russian language pack for Flarum.

12128.3k](/packages/flarum-lang-russian)[fof/upload

The file upload extension for the Flarum forum with insane intelligence.

191192.5k19](/packages/fof-upload)[flarum-lang/french

French language pack to localize the Flarum forum software plus its official and third-party extensions.

1938.7k](/packages/flarum-lang-french)[flarum-lang/german

German language pack for Flarum.

2153.3k](/packages/flarum-lang-german)[fof/byobu

Well integrated, advanced private discussions.

59120.6k14](/packages/fof-byobu)[fof/discussion-language

Specify the language a discussion is written in &amp; sort by language

1034.8k7](/packages/fof-discussion-language)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
