A powerful analytics plugin that tracks player activity through the Umami API, providing server administrators with valuable insights into player behavior and server usage patterns.
- Features
- Tracked Events
- Installation
- Configuration
- Commands
- Permissions
- Umami Dashboard Integration
- Privacy & Security
- Docker Support
- Error Handling
- Performance
- Technical Details
- Troubleshooting
- Contributing
- π Learn AI Powered Plugin Development
- License
- Comprehensive Player Tracking: Login/logout, chat, crafting, combat, block interactions
- Privacy Focused: Configurable anonymization of player data and locations
- Asynchronous Processing: Event queue system prevents server lag
- Robust API Client: Built-in retry logic and error handling
- Admin Commands: Easy management and monitoring tools
- Docker Support: Ready for containerized deployments
| Event Type | Description | Data Points |
|---|---|---|
| π Login/Logout | Player join/leave events | Player UUID, world, session duration |
| π¬ Chat Messages | Public messages | Message count/content, location, timestamp |
| π Item Pickup | Items collected by players | Item type, quantity, location |
| π¨ Crafting | Items crafted by players | Recipe type, quantity, location |
| βοΈ Combat Events | Player kills and deaths | Cause of death, weapon used, PvP vs PvE |
| π§± Block Interactions | Block placement and breaking | Block type, location, tool used |
- Server: Paper 26.1.2+
- Umami Instance: Self-hosted or cloud Umami analytics
- Download the latest JAR from releases
- Place in your server's
plugins/directory - Configure your Umami settings in
plugins/Umami/config.yml - Restart your server
- Verify data is flowing to your Umami dashboard
# Clone the repository
git clone https://github.com/carmelosantana/minecraft-umami
cd minecraft-umami
# Build the plugin
make build
# Install to test server
make installEdit plugins/Umami/config.yml:
# Umami Tracker Plugin Configuration
umami:
# Umami API Configuration
api:
endpoint: "https://your-umami-instance.com/api/send"
website_id: "your-website-id"
api_key: "your-api-key"
timeout: 5000 # Request timeout in milliseconds
retry_attempts: 3
retry_delay: 1000 # Delay between retries in milliseconds
# Event Tracking Configuration
tracking:
# Player Activity Events
player_login: true
player_logout: true
player_chat: true
item_pickup: true
crafting: true
combat_events: true
block_interactions: true
# Privacy Settings
privacy:
anonymize_players: false # Hash player UUIDs
anonymize_chat: true # Don't send chat content, only message length
anonymize_locations: true # Round coordinates to nearest 100 blocks
# Filtering
filters:
ignore_ops: false # Ignore operator activity
ignore_creative: false # Ignore creative mode players
min_session_time: 30 # Minimum session time to track (seconds)
# Debug Settings
debug:
enabled: false # Enable debug logging
log_api_calls: false # Log all API calls
log_events: false # Log all tracked events
# Enable debug logging (shows detailed operation information)
debug: false| Command | Description | Permission |
|---|---|---|
/umami help |
Show command help | umami.use |
/umami version |
Display plugin info | umami.use |
/umami online |
Show current users online | umami.use |
/umami reload |
Reload configuration | umami.admin |
/umami status |
Show plugin status and queue info | umami.admin |
/umami test |
Send a test event to Umami | umami.admin |
/umami status # Check plugin status
/umami test # Send test event
/umami online # List online players
/umami reload # Reload configumami.use- Basic command usage (default: true)umami.admin- Admin commands (default: op)
The plugin sends custom events to Umami with the following structure:
{
"type": "event",
"payload": {
"website": "your-website-id",
"name": "minecraft_player_login",
"data": {
"player": "player_12345",
"world": "world_nether",
"gamemode": "survival",
"location": "100,64,200"
}
}
}minecraft_player_*- Player activity eventsminecraft_server_*- Server performance events (future)minecraft_world_*- World-specific events (future)minecraft_plugin_*- Plugin-specific metrics
- Player Anonymization: Hash UUIDs instead of using names
- Location Anonymization: Round coordinates to nearest 100 blocks
- Chat Anonymization: Send message length only, not content
- Store API keys securely
- Use HTTPS endpoints only
- Regular security updates
- Monitor API access logs
Compatible with the Legendary Minecraft Geyser Docker container:
services:
minecraft:
image: 05jchambers/legendary-minecraft-geyser-floodgate:latest
ports:
- "25565:25565"
- "19132:19132"
volumes:
- ./umami-1.0.1.jar:/minecraft/plugins/umami.jar- Graceful API Failures: Plugin continues working even if Umami is down
- Automatic Retries: Configurable retry attempts with exponential backoff
- Queue Management: Prevents memory issues with queue size limits
- Configuration Validation: Validates settings on startup
- Asynchronous Processing: All API calls run on separate threads
- Event Queuing: Batched processing prevents server lag
- Memory Efficient: Automatic cleanup and queue size limits
- Minimal Overhead: Event-driven architecture with caching
- Event-driven: Minimal performance impact using Bukkit event system
- Asynchronous: All network operations run on separate threads
- Modular: Clean separation between tracking, queuing, and API communication
- Paper API: 26.1.2+ for server integration
- OkHttp: HTTP client for Umami API communication
- Gson: JSON processing for event data
- Paper: 26.1.2+ (recommended)
- Java: 21+
- Geyser/Floodgate: Compatible
Plugin not tracking events:
- Check if Umami configuration is correct
- Verify API endpoint is accessible
- Check server logs for error messages
- Use
/umami testto verify connectivity
High memory usage:
- Reduce event queue size in configuration
- Check for network connectivity issues causing queue backup
- Monitor queue statistics with
/umami status
Performance issues:
- Disable unnecessary event types
- Increase API timeout settings
- Check network latency to Umami instance
Enable debug logging in config.yml:
debug: true
umami:
debug:
enabled: true
log_api_calls: true
log_events: truePlease review Contributing Guidelines for developer documentation. Including;
- Development environment setup
- Code standards and testing procedures
- Pull request process
- Server management and Docker support
- Troubleshooting
# Set up development environment
make setup
# Quick development cycle
make dev
# Run tests
make test
# Test in Docker
make docker-testWant to build your own Minecraft plugins? I built our plugin collection using generative AI, and I can teach you how to do the same!
- AI Assisted Coding: How to effectively use AI tools like GitHub Copilot, ChatGPT, and Claude for plugin development
- Plugin Architecture: Best practices for structuring robust, maintainable Minecraft plugins
- Modern Development: Paper API, Maven build systems, Docker testing, and CI/CD workflows
- Problem Solving: How to break down complex features into manageable tasks
- Code Quality: Testing, debugging, and optimizing AI generated code
- Getting Started: Setting up your AI development environment
- Plugin Fundamentals: Events, commands, configuration, and permissions
- Advanced Features: Custom items, recipes, data persistence, and performance optimization
- Testing & Deployment: Docker containers, server management, and release workflows
- Real Projects: Build actual plugins from concept to completion
- Duration: 1-2 hour sessions
- Format: Screen share coding sessions via video call
- Family Friendly: Parents are welcome and encouraged to join sessions, especially for younger students and curious parents wanting to learn alongside their children.
- β Live coding demonstration
- β AI prompt engineering techniques
- β Complete project setup and tooling
- β Plugin publishing and distribution
- β Follow up support and code review
Ready to accelerate your development with AI?
- Schedule your call - Book a session today!
- Discord - Ask questions, see examples.
- Public SMP Server - Join us at
play.xpfarm.organd test our plugins live!
Turn your plugin ideas into reality in hours, not weeks!
This project is licensed under the GNU Affero General Public License v3.0 or later.