π§² Quick navigation
Snapshot is a Spring Boot application for collecting and viewing Minecraft server debug information. It provides a REST API for log uploads and a simple web interface for searching and viewing logs.
Currently, Snapshot supports the following features:
- Modern Web UI for searching and viewing logs with a debug code
- REST API for uploading and retrieving server reports
- Configurable rate limiting to prevent API abuse per-server
- Automatic cleanup - Logs are automatically deleted after 24 hours
- Java 17 or higher
- Maven 3.6+ if you want to compile the project
- Download the latest pre-compiled binary file from the Releases page
- Run the application:
java -jar snapshot-server.jar
- You can access the web UI in
localhost:9090by default
- Clone the repository:
git clone https://github.com/myth-MC/snapshot.git cd snapshot - Build the project:
mvn clean package
- Run the application:
java -jar target/snapshot-server-0.1.0.jar
- You can access the web UI in
localhost:9090by default
Most options can be configured by editing application.properties:
- Server port: Change
server.portto your desired port - Rate limiting:
snapshot.rate-limiting.capacity: Maximum requests per windowsnapshot.rate-limiting.refill-amount: Requests restored per refillsnapshot.rate-limiting.refill-minutes: Time window for refill in minutes
- Web UI:
snapshot.web-ui.timestamp-format: Timestamp format
Tip
You can also pass these settings as system properties in the java command:
java -Dserver.port=80 -Dsnapshot.rate-limiting.capacity=10 -jar snapshot-server.jarYou can view logs by entering a debug code in the /search page:
- Navigate to
/search(e.g.,http://localhost:9090/search) - Enter a debug code (e.g.,
DBG-ABC123) to view the associated log - The result page displays:
- General information (UUID, timestamp, requester)
- Server environment (software, version, online mode)
- Plugin information (name, version)
- Additional data such as:
- YAML files
- Strings
- Integers
- Booleans
- Lists
The API exposes two endpoints to retrieve and upload data with JSON format.
Uploads a log entry.
| Name | Type | Description | Required? |
|---|---|---|---|
requester Β |
String | Name of the report requester | β |
pluginName |
String | Name of the targeted plugin | β |
pluginVersion |
String | Version of the targeted plugin | β |
serverPort |
Integer | Port of the server | β |
serverVersion |
String | Version of the server | β |
serverSoftware |
String | Software of the server | β |
serverOnlineMode |
Β Boolean | Whether the server runs in online mode | β |
extra |
JSON structure | Additional data | β |
Note
This is how a full valid request body would look like:
{
"requester": "PlayerName",
"pluginName": "MyPlugin",
"pluginVersion": "1.0.0",
"serverPort": 25565,
"serverVersion": "1.20.1",
"serverSoftware": "Paper",
"serverOnlineMode": true,
"extra": {
"serverPlugins": ["Plugin1", "Plugin2"],
"config.yml": "base64encodedcontent...",
"bukkit.yml": "base64encodedcontent..."
}
}Retrieves a log by its code.
| Name | Type | Description |
|---|---|---|
uuid Β |
String | UUID of the created log |
timestamp |
Β String | Creation timestamp of the log |
requester Β |
String | Name of the report requester |
pluginName |
String | Name of the targeted plugin |
pluginVersion |
String | Version of the targeted plugin |
serverVersion |
String | Version of the server |
serverSoftware |
String | Software of the server |
serverOnlineMode |
Β Boolean | Whether the server runs in online mode |
extra |
JSON structure | Additional data |
Note
This is how a full response could look like:
{
"uuid": "abc12345-6789-0123-4567-890123456789",
"timestamp": "2026-01-18T03:03:44.047833",
"requester": "PlayerName",
"pluginName": "MyPlugin",
"pluginVersion": "1.0.0",
"serverVersion": "1.20.1",
"serverSoftware": "Paper",
"serverOnlineMode": true,
"extra": {
"serverPlugins": ["Plugin1", "Plugin2"],
"config.yml": "base64encodedcontent...",
"bukkit.yml": "base64encodedcontent..."
}
}The extra field accepts any valid JSON structure and can be used to display additional data.
Most JSON objects (strings, integers, booleans, arrays...) in the extra field will be handled automatically.
{
"extra": {
"exampleString": "This is an example string!",
"exampleInteger": 25565,
"exampleBoolean": true
}
}Text files must be properly encoded into Base64.
{
"extra": {
"config.yml": "base64encoded...",
"server.properties": "base64encoded...",
"settings.json": "base64encoded..."
}
}You may extend the functionality of the application easily with some basic Java knowledge.
git clone https://github.com/myth-MC/snapshot.git
git checkout devmvn clean packagemvn spring-boot:runsrc/
βββ main/
β βββ java/ovh/mythmc/snapshot/server/
β β βββ controller/ # REST and web controllers
β β βββ entity/ # JPA entities
β β βββ repository/ # Data repositories
β β βββ converter/ # Custom converters
β β βββ scheduler/ # Scheduled tasks
β βββ resources/
β βββ templates/ # Thymeleaf templates
β βββ static/ # CSS, JS, images
β βββ application.properties
βββ pom.xml
- This application is built with Spring Boot
- H2 is used to provide database functionality
- Rate limiting is powered by Bucket4J
These are some of the projects we've used as inspiration for the application: