Repossify is a Maven repository designed for the efficient management, storage, and distribution of Java artifacts. The backend is fully implemented in Java, ensuring robustness, scalability, and full compatibility with the standard Maven ecosystem.
- Hosts releases and snapshots with correct
maven-metadata.xml, checksums and timestamped snapshot builds - Mirrors upstream repositories, so a build can point at Repossify alone instead of listing Maven Central separately
- Per-repository visibility (public, hidden, private), redeployment policy, snapshot retention and storage quotas
- Access tokens scoped to path prefixes with read or write permission, managed from the dashboard, a REST API or the console
- Conditional requests and range support, so clients revalidate instead of re-downloading and large jars resume
- Artifact search, download statistics and a browsable web dashboard
Prerequisites: JDK 21.
Download the latest jar from releases and place it in the directory you want Repossify to use.
Create the directory layout, the SQLite database and the configuration files:
java -jar repossify-1.1.0.jar --initThen start it:
java -jar repossify-1.1.0.jarOn the first start with an empty database, a manager token named admin is generated and
printed once. Save it — it is stored hashed and cannot be recovered.
| Option | Description |
|---|---|
--init |
Create the working directory layout and exit |
--port, -p |
Override the port from configuration.json |
--hostname, -h |
Override the hostname |
--max-request-size, -mrs |
Maximum accepted request size, in bytes |
--working-directory, -wd |
Where Repossify keeps its data |
--version |
Print the version |
--help, -? |
List the options |
Flags win over configuration.json.
configuration.json holds the server settings: hostname, port, request size limit,
compression, CORS, HTTPS and reverse-proxy handling.
page.json holds the dashboard settings and the repository definitions. Both are editable
from the dashboard's configuration modal.
To serve HTTPS, place a PKCS#12 or JKS keystore in the working directory and set:
{
"ssl": {
"enabled": true,
"port": 8443,
"keyStore": "keystore.p12",
"keyStorePassword": "…",
"keepHttp": true,
"redirectToHttps": false
}
}Behind a reverse proxy, enable forwardedIp so requests are attributed to the real client
rather than the proxy.
<distributionManagement>
<repository>
<id>repossify</id>
<url>https://maven.example.dev/repo/releases</url>
</repository>
<snapshotRepository>
<id>repossify</id>
<url>https://maven.example.dev/repo/snapshots</url>
</snapshotRepository>
</distributionManagement>with the token in ~/.m2/settings.xml:
<server>
<id>repossify</id>
<username>ci-bot</username>
<password>the-token-secret</password>
</server>Give a repository one or more mirrors, then point Maven at it. Artifacts that are not held locally are fetched upstream and cached:
<mirror>
<id>repossify</id>
<url>https://maven.example.dev/repo/central</url>
<mirrorOf>*</mirrorOf>
</mirror>Repossify reads commands on stdin, and the dashboard exposes the same console to managers.
generate_token <name> [<permissions>] [--secret=<secret>] [--silent]
list_tokens
token_add_route <tokenName> <path> <r|w>
repositories
repair_metadata <repository|*> rebuild metadata after copying artifacts in by hand
prune_snapshots [<repository>]
statistics
performance
docker compose up -dData lives in the /data volume. Read the generated admin token from the container logs.
mvn packageThe dashboard lives in a separate repository. After changing it, rebuild and install it into the backend's resources:
./scripts/sync-client.ps1