Activity Tracker
0
First released October 5, 2021 · Last updated October 14, 2026
Downloads from this site
99 total
1 latest (v1.6.1)
Tracks the activity of players.
Usage
Last reported in use 9 days ago
2 server starts in the last 30 days
Server starts per day
Versions in use, by share of server starts
1.5.0
50% · 1 start
2.0.0-SNAPSHOT-8-8-2026
50% · 1 start
Usage reported by trace — how it works. CI and test servers are excluded.
Verified before release
Version 1.6.1 was started on real servers running Minecraft 1.19.4, 1.21.11, 26.2 and 26.3 before it was published. The jar you download is the exact one that passed. How releases work
Versions
All releases on GitHubAutomated build of main at 799657104b2eda33a3252d8e12cb8d276539b326.
This is not a release. It is unreleased, unreviewed code that has not been through any release check, and a broken build can stop a server from starting. Do not run it on a server you care about without a backup.
Install it with Dan's Plugin Manager:
/dpm get activitytracker --experimentalReturn to published releases with /dpm get activitytracker --stable.
1.6.1
For a server running v1.6.0, this release changes nothing at runtime. Commands, permissions, configuration and stored activity data all work exactly as before. This release adds automated test coverage that locks in the current behaviour of several commands, which helps protect against regressions in future updates.
Changes
- Stability: Added tests that pin down how
/at stats,/at infoand/at averagebehave today. This covers the usage messages, the handling of players without a record, and the rejection of day values that are not numbers, are zero or are negative (#129).
Version
v1.6.0 → 1.6.1 — PATCH. Mechanical floor from comparing the two jars: PATCH.
Judgment: The only changes since v1.6.0 are new unit tests for the StatsCommand, InfoCommand and AverageCommand classes (#129), a CHANGELOG update (#128) and a version bump to a SNAPSHOT. No runtime code, commands, config, permissions or stored data changed. The mechanical floor of patch is correct, and nothing here would justify raising it.
- no interface or storage difference observed between the jars
Verification
Verified on a real Spigot server before publication; this release carries the exact jar that was verified.
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.3 (11 assertions passed).
- save-compatibility gate run: data written by
v1.6.0was loaded by this release across two restarts with nothing lost (16 assertions passed).
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
1.6.0
For a server running v1.5.0, this is a drop-in upgrade that adds support for Minecraft 26.3. While usage reporting is on, each report now also includes a random server ID. This lets the author count how many servers use the plugin instead of counting raw events. The ID is a random UUID. It is stored as a server-id: line added to plugins/trace/config.yml on first start and does not identify any person, account or IP address. Nothing about players is sent. If reporting is turned off (in this plugin's config.yml, in plugins/trace/config.yml, or with TRACE_USAGE_REPORTING=off / DO_NOT_TRACK=1), no ID is created, read or sent.
Changes
Compatibility
- Added support for Minecraft 26.3 (#122).
Usage reporting
- Each usage report now includes a random server ID as the
installtag. The ID is created on first start and saved as theserver-id:line inplugins/trace/config.yml, with a comment explaining what it is. All plugins that report to trace on the server share this one ID. Delete the line to get a new one (#120). - Your existing text in
plugins/trace/config.ymlis never changed: the ID is added as a block at the end of the file. If the file cannot be read or written, a temporary ID is used until the server restarts, and nothing is written (#120). - The startup message and the comments in
config.ymlnow mention the random server ID (#121). - The usage-reporting details link now points to https://danielstephenson.dev/usage-reporting (#124).
Version
v1.5.0 → 1.6.0 — MINOR. Mechanical floor from comparing the two jars: PATCH.
Judgment: The vendored trace-client update (#120) adds new behaviour that the mechanical check only partly sees. Every usage event now carries a new install tag holding a random server ID. On first start, an enabled client also writes that ID as a new server-id: line in plugins/trace/config.yml. Support for Minecraft 26.3 (#122) is also new. Nothing breaks for an existing server: config keys, commands, permissions and stored data are unchanged, and the existing opt-outs still stop all of it, including the file write, so major is not justified.
- no interface or storage difference observed between the jars
<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>
- dansplugins.activitytracker.trace.TraceClient: added public java.lang.String installId();
- dansplugins.activitytracker.trace.TraceClient: added public static java.lang.String installIdFromFile(java.io.File);
- dansplugins.activitytracker.trace.TraceClient$Builder: added public dansplugins.activitytracker.trace.TraceClient$Builder installId(java.lang.String);
- dansplugins.activitytracker.trace.TraceClient$Builder: added public dansplugins.activitytracker.trace.TraceClient$Builder installIdFile(java.io.File);
</details>
Verification
Verified on a real Spigot server before publication; this release carries the exact jar that was verified.
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.3 (11 assertions passed).
- save-compatibility gate run: data written by
v1.5.0was loaded by this release across two restarts with nothing lost (16 assertions passed).
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
1.5.0
For a server running v1.4.0, this is a drop-in upgrade. Player activity data, commands, permissions and the plugin's own config are unchanged. The only runtime changes are in optional anonymous usage reporting. Every usage event now includes the plugin version. The shared plugins/trace/config.yml also accepts an optional tags: block, which adds labels to the events the plugin reports. For example, a test or CI server can mark its events so they are kept out of real-installation figures. Reporting still turns off the same ways as before.
Changes
Usage reporting
- The server-wide file
plugins/trace/config.ymlcan now hold atags:block, such asci: "true", that is added to every event the plugin reports. If the plugin's event already has a tag with the same name, the plugin's value is kept. Entries that are malformed or too long are dropped quietly, and the file can never stop reporting or stop the plugin. Settingenabled: falsein this file still turns reporting off for every plugin that uses it (#111, #112) - When the plugin creates
plugins/trace/config.ymlfor the first time, the file now includes a commented-out example of thetags:block. An existing file is never rewritten (#111) - Every usage event now carries the plugin version, not just the startup event (#112)
Version
v1.4.0 → 1.5.0 — MINOR. Mechanical floor from comparing the two jars: PATCH.
Judgment: The vendored usage-reporting client went from trace-client 0.2.0 to 0.4.0, which adds operator-visible behaviour the mechanical check only saw as an internal builder signature change. The shared plugins/trace/config.yml can now hold a tags: block that is added to every event this plugin reports, newly created copies of that file include a commented-out example, and every usage event now carries the plugin version (before, only the startup event did). These add new behaviour and new data sent, so the floor rises to minor. The builder change is inside a vendored copy that other plugins do not use, the existing reporting switches work as before, and the pom cleanup, tests, CI and OpenAPI metadata changes do not change runtime behaviour, so this is not major.
- no interface or storage difference observed between the jars
<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>
- dansplugins.activitytracker.trace.TraceClient: removed/changed public static dansplugins.activitytracker.trace.TraceClient$Builder builder(java.lang.String, java.lang.String);
- dansplugins.activitytracker.trace.TraceClient: added public static dansplugins.activitytracker.trace.TraceClient$Builder builder(java.lang.String, java.lang.String, java.lang.String);
- dansplugins.activitytracker.trace.TraceClient: added public static final java.lang.String VERSION;
</details>
Verification
Verified on a real Spigot server before publication; this release carries the exact jar that was verified.
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
- boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).
- save-compatibility gate run: data written by
v1.4.0was loaded by this release across two restarts with nothing lost (16 assertions passed).
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
1.4.0
This release is a drop-in upgrade for a server running 1.3.0: the activity data on disk is unchanged and every existing command keeps working. Two things are new on startup that you should know about. Usage reporting is on by default — the plugin sends its name, version and the names of commands used (nothing about players or the server) to the author's trace server, and it says so in the console on every start; turn it off with usage-reporting.enabled: false in the plugin's config.yml or for every trace-reporting plugin at once in the new plugins/trace/config.yml. Optional Discord join/quit notifications, a /at average command, an admin /at list command, a /at top player count, and a matching REST endpoint round out the release.
Changes
Usage reporting
- The plugin reports one event on startup and one per command to the author's trace server, off the main thread, never blocking a tick, and dropped silently if the server is unreachable; a bounded queue keeps an unreachable server from costing memory. (#99)
- A console line on every startup states whether reporting is on, what is sent, and how to turn it off. Opt out per plugin with
usage-reporting.enabled: false, server-wide withenabled: falseinplugins/trace/config.yml(created on first start, never turned back on by a plugin), or process-wide with theTRACE_USAGE_REPORTING=offorDO_NOT_TRACK=1environment variables. (#99, #101)
Discord notifications
- Player join and quit events can be posted to a Discord webhook. Off by default; enable with
discordWebhookEnabled: trueanddiscordWebhookUrl. Messages are templated viadiscordWebhookJoinMessageanddiscordWebhookQuitMessage({player}is replaced with the player's name), anddiscordWebhookStaffOnly: truelimits notifications to players holding the newat.staffpermission. Sending happens asynchronously. (#77)
Commands
- New
/at average [player] [days]shows a player's total and average hours per day over the last N days (default 7), with permissionat.average(default: everyone). (#69) - New
/at listshows the 10 most recent sessions across all players, with permissionat.list(default: op). (#59) /at topaccepts an optional number of players to show, from 1 to 100 (default 10). (#83)/at infonow shows the player's activity ranking against all tracked players. (#76)- All command output uses a consistent boxed format with colour and progress bars;
/at helpand/at configlist the new commands and keys. (#76) - The bare
/atcommand now checks theat.defaultpermission, which is declared with defaulttrue. (#96) - The
/atversion header no longer shows a doubledvprefix. (#98)
REST API
- New
GET /api/average-daily-activity/{uuid}?days=Nreturns average and total hours for a player over the period, documented inopenapi.yaml. (#69)
Upgrade notes
- Decide whether you want usage reporting. It is on unless you turn it off: set
usage-reporting.enabled: falseinplugins/ActivityTracker/config.yml, or setenabled: falseinplugins/trace/config.ymlto switch it off for every plugin that reports to trace. The console notice on startup confirms the current state. plugins/trace/config.ymlis created on first start if it does not exist. This is expected.- New config keys are written to config.yml on first start:
usage-reporting.enabled,usage-reporting.endpoint,usage-reporting.key,discordWebhookEnabled,discordWebhookUrl,discordWebhookStaffOnly,discordWebhookJoinMessage,discordWebhookQuitMessage. Existing keys and values are preserved. - New permissions:
at.default(default true) gates the bare/atcommand;at.average(default true);at.list(default op);at.staff(default op) marks staff for staff-only Discord notifications. If your permissions plugin denies permissions that are not explicitly granted, grantat.defaultandat.averageto players who should keep using/at. - If you run the REST API, the new endpoint is exposed on the same port and needs no configuration.
Version
1.3.0 → 1.4.0 — MINOR. Mechanical floor from comparing the two jars: MINOR.
Judgment: Nothing in the diff meets the major criteria: the on-disk activity data format is untouched (PersistentData only gains a read-only getPlayerRank), no existing command changes its arguments or behaviour incompatibly (/at top gains an optional argument, /at info gains a line), no existing config key changes meaning, and the newly declared at.default permission defaults to true so the /at check it now enforces does not lock out anyone who could run it before. The notable changes are additive: usage reporting to the author's trace server (on by default with an opt-out and a new plugins/trace/config.yml written on first start), Discord join/quit webhooks (off by default), /at average, /at list, a new REST endpoint, and new permissions and config keys. The changed JoinHandler/QuitHandler constructors and sendInfoToSender signature are internal plugin classes rather than an API other plugins consume, and the mechanical check already rated them INFO, so the floor of minor is kept.
- minor: permission added: at.average
- minor: permission added: at.default
- minor: permission added: at.list
- minor: permission added: at.staff
- minor: default config key added: usage-reporting.enabled
- minor: default config key added: usage-reporting.endpoint
- minor: default config key added: usage-reporting.key
- minor: storage path changed: src/main/java/dansplugins/activitytracker/api/RestApiService.java
- minor: storage path changed: src/main/java/dansplugins/activitytracker/data/PersistentData.java
- minor: storage path changed: src/main/java/dansplugins/activitytracker/objects/ActivityRecord.java
- minor: storage path changed: src/main/java/dansplugins/activitytracker/services/ActivityRecordService.java
<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>
- public class added: dansplugins.activitytracker.api.AverageDailyActivityResponse
- public class added: dansplugins.activitytracker.commands.AverageCommand
- public class added: dansplugins.activitytracker.commands.ListCommand
- public class added: dansplugins.activitytracker.services.DiscordWebhookService
- public class added: dansplugins.activitytracker.trace.TraceClient
- public class added: dansplugins.activitytracker.trace.TraceClient$Builder
- dansplugins.activitytracker.data.PersistentData: added public int getPlayerRank(java.util.UUID);
- dansplugins.activitytracker.eventhandlers.JoinHandler: removed/changed public dansplugins.activitytracker.eventhandlers.JoinHandler(dansplugins.activitytracker.services.ActivityRecordService, dansplugins.activitytracker.data.PersistentData, dansplugins.activitytracker.factories.SessionFactory);
- dansplugins.activitytracker.eventhandlers.JoinHandler: added public dansplugins.activitytracker.eventhandlers.JoinHandler(dansplugins.activitytracker.services.ActivityRecordService, dansplugins.activitytracker.data.PersistentData, dansplugins.activitytracker.factories.SessionFactory, dansplugins.activitytracker.services.DiscordWebhookService, org.bukkit.plugin.java.JavaPlugin);
- dansplugins.activitytracker.eventhandlers.QuitHandler: removed/changed public dansplugins.activitytracker.eventhandlers.QuitHandler(dansplugins.activitytracker.data.PersistentData, dansplugins.activitytracker.utils.Logger);
- dansplugins.activitytracker.eventhandlers.QuitHandler: added public dansplugins.activitytracker.eventhandlers.QuitHandler(dansplugins.activitytracker.data.PersistentData, dansplugins.activitytracker.utils.Logger, dansplugins.activitytracker.services.DiscordWebhookService, org.bukkit.plugin.java.JavaPlugin);
- dansplugins.activitytracker.objects.ActivityRecord: removed/changed public void sendInfoToSender(org.bukkit.command.CommandSender);
- dansplugins.activitytracker.objects.ActivityRecord: added public void sendInfoToSender(org.bukkit.command.CommandSender, int, int);
- dansplugins.activitytracker.services.ActivityRecordService: added public double calculateAverageDailyActivity(dansplugins.activitytracker.objects.ActivityRecord, int);
- dansplugins.activitytracker.services.ActivityRecordService: added public double calculateTotalHoursInPeriod(dansplugins.activitytracker.objects.ActivityRecord, int);
- dansplugins.activitytracker.services.ActivityRecordService: added public java.util.ArrayList<dansplugins.activitytracker.objects.ActivityRecord> getTopRecords(int);
- dansplugins.activitytracker.services.ConfigService: added public boolean isUsageReportingEnabled();
- dansplugins.activitytracker.services.ConfigService: added public java.lang.String getUsageReportingEndpoint();
- dansplugins.activitytracker.services.ConfigService: added public java.lang.String getUsageReportingKey();
</details>
Verification
Booted twice on a real Spigot server before publication — boot gate run (10 assertions passed). This release carries the exact jar that was verified.
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson
Snapshot release marking Activity-Tracker's move to an AI-first development approach.
Day-to-day feature work, grooming, review and maintenance now run through AI agents working directly against this repository, with the maintainers setting direction and approving what lands. The version bump marks that change in how the project is built — it is not a compatibility break. Behaviour, configuration and stored data are unchanged, and existing installations can upgrade in place.
This is a dated snapshot, not a finished release. It follows the precedent set by Medieval
Factions' 6.0.0-SNAPSHOT-7-25-2026: the AI-first line has not yet been verified in live operation,
and the snapshot designation stays until it has.
Version changes
pom.xml:1.3.0→2.0.0-SNAPSHOT-8-8-2026
Opened as https://github.com/Dans-Plugins/Activity-Tracker/pull/88.
Drafted by Claude on behalf of Daniel Stephenson.
What's Changed
- Add REST API for exposing player activity data by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/62
- Fix session time loss on server restart by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/63
- Fix data loss from broken session references and null handling failures by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/67
- Optimize top algorithm from O(n²) to O(n log n) complexity with generic architecture, comprehensive unit tests and minimal CI validation - fixes #44 by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/58
New Contributors
- @Copilot made their first contribution in https://github.com/Dans-Plugins/Activity-Tracker/pull/62
Full Changelog: https://github.com/Dans-Plugins/Activity-Tracker/compare/1.2.0...1.3.0
What's Changed
- Add REST API for exposing player activity data by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/62
- Fix session time loss on server restart by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/63
- Fix data loss from broken session references and null handling failures by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/67
- Optimize top algorithm from O(n²) to O(n log n) complexity with generic architecture, comprehensive unit tests and minimal CI validation - fixes #44 by @Copilot in https://github.com/Dans-Plugins/Activity-Tracker/pull/58
New Contributors
- @Copilot made their first contribution in https://github.com/Dans-Plugins/Activity-Tracker/pull/62
Full Changelog: https://github.com/Dans-Plugins/Activity-Tracker/compare/1.2.0...1.3.0-alpha-1
What's Changed
- Moving away from the Singleton pattern. by @dmccoystephenson in https://github.com/Dans-Plugins/Activity-Tracker/pull/51
- Most Recent Session Null Error Fix by @dmccoystephenson in https://github.com/Dans-Plugins/Activity-Tracker/pull/52
Full Changelog: https://github.com/Dans-Plugins/Activity-Tracker/compare/1.1...1.2.0
What's Changed
- Integrated Ponder with the plugin. by @dmccoystephenson in https://github.com/Dans-Plugins/Activity-Tracker/pull/48
- Ponder Update by @dmccoystephenson in https://github.com/Dans-Plugins/Activity-Tracker/pull/50
Full Changelog: https://github.com/Dans-Plugins/Activity-Tracker/compare/v1.0...1.1
Changes in Activity Tracker v1.0
- Added the top command, allowing players to view the top ten most active players.
- Added the config command.
- Allowed players to view their activity record by typing /at info with no arguments.
- Added first recorded login to the output of the info command.
- Added the stats command, allowing players to view activity stats for the server.
Changes in Activity Tracker v0.4
- Implemented an autosave feature.
- Created a bunch of interfaces.
- Added "current status" to the output of the info command.
- Integrated bStats with the plugin.
- Made doubles get printed with only two digits after the decimal point.
- When displaying a player's play time, the hours they've spent so far in their current session will now be accounted for.
- If a player is online, how long they've been online will now be displayed in the output of the info command.
- If a player is offline, how long they've been offline will now be displayed in the output of the info command.
- Fixed "most recent session" field not getting saved and loaded for activity records.
Changes in Activity Tracker v0.3
- Added the help command.
- Added the info command, allowing players to view the activity record of a player.
- Fixed the logoutDate field for a player remaining ll if the server was shut down,
Changes in Activity Tracker v0.2
- Assigned IDs to sessions.
- Created the Storage Manager class.
- Made sessions get saved and loaded.
- Made activity records get saved and loaded.
- When a player logs out, their session will now be updated and the time they spent online will be calculated.
- Created the Config Manager class.
- Added the "debugMode" config option.
Related plugins
Identifies accounts that have used the same IP address.
Provides miscellaneous commands.
Lets operators download the community's plugins in-game or from the server console.
Allows players to use signs to select a custom spawn in their world.
Something wrong, or something missing?
Bugs go to the plugin's issue tracker, where they can actually be fixed and tracked. Ideas for new behaviour go to the Dev Portal, where the community can upvote them.
