Aether Studio
Aether Studio License Manager

Admin Console

Sign in to manage licenses

Production License Control

Overview

Active Licenses 0 Currently valid and enabled
Suspended 0 Blocked from verification
Products 0 Managed software resources
Verifications (24h) 0 Live runtime validation checks

Recent Licenses

Newest generated keys and customer status.

Risk Signals

Verification anomalies and conflict alerts.

License Registry

Create, suspend, revoke, and reset customer activations.

License Product Buyer Status Activation Expires

Products

Resources sold on BuildByBit or used privately.

BuiltByBit Purchase Sync

Match each product to a marketplace resource ID, then import active purchases as licenses.

Verification Flow

How a buyer becomes a valid licensed user.

1. Product mapping Admin adds the BuiltByBit resource ID to the product.
2. Purchase lookup Worker calls BuiltByBit for purchases/licenses on that resource.
3. License issue Active purchase creates or updates a local license bound to the buyer/member ID.
4. Runtime verify The customer plugin calls your Worker, and the Worker verifies local status plus activation rules.

Leaked Build Watermark Scanner

Upload or drop a leaked .jar or .zip build to extract embedded buyer watermarks and identify who leaked it.

🔍 Click to select or drag and drop leaked .jar / .zip here

Scans binary byte-arrays for BuiltByBit user watermarks and license tokens

Leak Watch Signals

Track suspicious license sharing, impossible activations, and leaked builds.

Protection Rules

Controls that should become backend-enforced policies.

Verification Activity

Audit-friendly event stream for license checks and admin actions.

Studio Branding & White-Labeling

Customize the dashboard name, public customer portal, and self-service policies.

Verification Policy Defaults

Defaults for API responses and customer activation behavior.

Admin Profile & Password

Change your active administrator email address and login password.

Administrator Accounts

Add co-owners or staff members who can manage licenses and products.

How Aether License Manager Works

Enterprise-grade anti-piracy runtime built on high-speed edge compute and cryptographic signatures.

Core Security Principles: All license keys are stored as irreversible cryptographic SHA-256 hashes on the database. Raw keys are never stored on disk. When a client verifies, the server cryptographically issues an HMAC-SHA256 signature containing machine fingerprints, expiration, and status.
1. Client Machine Fingerprinting

Client computes a hardware fingerprint (CPU ID + Motherboard UUID + MAC/IP) and sends it with the buyer's license key.

2. Cryptographic Activation Binding

Server checks the license status, expiration, and binds the fingerprint. If the customer exceeds activation limits, verification is rejected.

3. Signed Response & Grace Cache

Server signs response with the product's private signing secret. Client caches verification for 12–24h so temporary network drops don't interrupt gameplay or usage.

Live API Endpoints for Integration

Endpoint Method Auth Purpose
/api/verify POST Public (Signed payload) Called by customer plugins/software on startup and hourly heartbeat
/api/portal/lookup POST Customer Key / Delivery Key Customer self-service portal to check status and active bindings
/api/portal/reset POST Customer Key / Delivery Key Self-service hardware reset when a customer moves to a new host/VPS
/api/admin/licenses POST Admin Bearer Token Automated license issuance via market webhooks or custom bots

How to License Products in a ZIP Release

Step-by-step instructions for distributing downloadable plugins, bots, scripts, or desktop software in ZIP archives.

Recommended Distribution Workflow: Never ship your secret keys in distributed files! You only distribute the License Key (to the buyer) and the Product Slug (embedded in your software). The Product Signing Secret stays private on your server.
  1. Step 1: Create your Product in the Dashboard
    Navigate to the Products tab, click Create Product. Enter your product name (e.g. Aether Factions), choose activation limit (e.g. 1 for single server), and save. Copy the generated Signing Secret and keep it safe.
  2. Step 2: Add the License Checker to your Source Code
    Add one of the drop-in client classes from the Code SDKs tab into your codebase. Set the verification URL to:
    Config Endpoint
    https://aether-license-manager.pages.dev/api/verify
  3. Step 3: Allow Buyer to Input their License Key
    In your distribution ZIP, include a configuration file (e.g. config.yml or license.json) where buyers paste their key:
    config.yml
    # ==========================================
    # License Configuration
    # ==========================================
    license:
      key: "LM-XXXX-XXXX-XXXX-XXXX"
      # Self-Service Hardware Reset Portal:
      # https://aether-license-manager.pages.dev/portal.html
  4. Step 4: Watermark the Build Before Zipping
    Before packaging the final ZIP for the buyer, inject a buyer watermark (their BuiltByBit member ID or license key prefix) into the file (e.g., inside build-info.json or an obfuscated class constant). If this file is ever leaked on forums or Discord, you can drop the leaked binary into the Security -> Leaked Binary Scanner to identify who leaked it!
  5. Step 5: Bundle and Deliver
    Zip your build:
    • YourProduct.jar (or .exe / .zip)
    • config.yml
    • README.txt with instructions & portal link

Selling on Any Marketplace

Seamlessly integrate with BuiltByBit, Polymart, Tebex, SpigotMC, Gumroad, CodeCanyon, or custom webshops.

Option A: BuiltByBit (BBB) Native Sync

BuiltByBit is natively supported. BuiltByBit purchases can be automatically fetched or synced into active licenses.

Setting up BuiltByBit Sync:
  1. Find your BuiltByBit Resource ID (from your resource URL e.g. builtbybit.com/resources/12345/ -> ID is 12345).
  2. In the Products tab, edit your product and set the BuiltByBit Resource ID.
  3. Under Marketplace, click Run Sync to import purchases or allow automatic verification via BuiltByBit Buyer ID tokens.

Option B: Webhook Integration for Polymart, Tebex, Gumroad & Custom Stores

When a customer purchases on any marketplace, configure their webhook to call your License Manager API to instantly generate a license key:

POST /api/admin/licenses (Webhook cURL Example)
curl -X POST https://aether-license-manager.pages.dev/api/admin/licenses \
  -H "Authorization: Bearer YOUR_ADMIN_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "prd_your_product_id",
    "buyerLabel": "customer@email.com",
    "plan": "lifetime",
    "activationLimit": 1
  }'

Response returned from Webhook:

JSON Response
{
  "ok": true,
  "message": "License generated successfully.",
  "license": {
    "id": "lic_99f4d1e28ba1",
    "key": "LM-883A-KD92-M82L-99AQ",
    "keyPrefix": "LM-883A-KD",
    "buyerLabel": "customer@email.com",
    "productName": "Aether Core",
    "activationLimit": 1,
    "plan": "lifetime"
  }
}

You can immediately display license.key on your checkout thank-you screen or include it in the automated confirmation email.

Manual Licensing & Customer Support

How to generate custom licenses, handle server migration requests, and revoke keys during disputes.

1. Issuing a Manual Key

Click the New License button in the top navigation. Select your product, type the customer's Discord username or email, choose a plan (Lifetime, Monthly, or Trial), and set the allowed server count.

Copy the generated LM-XXXX-XXXX-XXXX-XXXX key and send it to the buyer via Discord DM, ticket, or email.

2. Server Moves & Hardware Resets

When a buyer changes hosting providers, their server IP/fingerprint changes. They don't need to open a support ticket!

Direct them to the Customer Portal (/portal.html). They paste their license key and click Reset Activations. Alternatively, you can click the Reset button in the Licenses table.

3. Dispute / Refund / Chargeback Protection

If a buyer charges back or violates your terms of service:

Locate their key in the Licenses table and click Suspend. Their software will instantly stop working on its next hourly verification heartbeat!

Ready-to-Use Client SDKs

Drop-in implementations for Java (Minecraft Spigot / Paper / Velocity), Node.js, Python, PHP, and C#.

1. Java (Minecraft Plugins & Standalone Apps)

Asynchronously checks validity on server startup, calculates SHA-256 machine hash, and disables the plugin if invalid.

LicenseChecker.java
package com.aether.license;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class LicenseChecker {
    private static final String VERIFY_URL = "https://aether-license-manager.pages.dev/api/verify";

    public static boolean verify(String productSlug, String licenseKey) {
        try {
            String fingerprint = getMachineFingerprint();
            String payload = String.format(
                "{\"productSlug\":\"%s\",\"licenseKey\":\"%s\",\"fingerprint\":\"%s\"}",
                productSlug, licenseKey, fingerprint
            );

            HttpURLConnection conn = (HttpURLConnection) new URL(VERIFY_URL).openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("User-Agent", "Aether-LicenseGuard/2.0");
            conn.setDoOutput(true);
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);

            try (OutputStream os = conn.getOutputStream()) {
                os.write(payload.getBytes(StandardCharsets.UTF_8));
            }

            if (conn.getResponseCode() != 200) return false;

            StringBuilder response = new StringBuilder();
            try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
                String line;
                while ((line = br.readLine()) != null) response.append(line);
            }

            return response.toString().contains("\"valid\":true");
        } catch (Exception e) {
            return false; // Fail closed on connection error
        }
    }

    private static String getMachineFingerprint() {
        try {
            String raw = System.getProperty("os.name") + System.getProperty("user.name") + Runtime.getRuntime().availableProcessors();
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(raw.getBytes(StandardCharsets.UTF_8));
            StringBuilder hex = new StringBuilder();
            for (byte b : hash) hex.append(String.format("%02x", b));
            return hex.toString();
        } catch (Exception e) {
            return "hw_unknown";
        }
    }
}

2. Node.js / TypeScript / Electron

licenseClient.js
import os from 'node:os';
import crypto from 'node:crypto';

export async function verifyLicense(productSlug, licenseKey) {
  const fingerprint = crypto
    .createHash('sha256')
    .update(os.hostname() + ':' + os.platform() + ':' + os.cpus().length)
    .digest('hex');

  const res = await fetch('https://aether-license-manager.pages.dev/api/verify', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ productSlug, licenseKey, fingerprint }),
  });

  const data = await res.json().catch(() => ({}));
  return data.valid === true;
}

3. Python (CLI, Discord Bots & Web Apps)

license_client.py
import hashlib
import platform
import urllib.request
import json

def verify_license(product_slug: str, license_key: str) -> bool:
    fingerprint = hashlib.sha256(f"{platform.node()}:{platform.system()}".encode()).hexdigest()
    url = "https://aether-license-manager.pages.dev/api/verify"
    payload = json.dumps({
        "productSlug": product_slug,
        "licenseKey": license_key,
        "fingerprint": fingerprint
    }).encode('utf-8')

    req = urllib.request.Request(url, data=payload, headers={'Content-Type': 'application/json'})
    try:
        with urllib.request.urlopen(req, timeout=5) as response:
            result = json.loads(response.read().decode())
            return result.get("valid") is True
    except Exception:
        return False

Enterprise Anti-Leak Watermarking Guide

How to track buyer identities and catch anyone who leaks your software on the internet.

Why Watermarking Works: Pirates often decompile or redistribute files, but they rarely scrub custom embedded byte sequences or metadata. By watermarking every customer's download with their BuiltByBit ID or license prefix, you can irrefutably prove who uploaded the leak.

How to Catch a Leaker:

  1. 1. Discover Leaked File: When you see your software leaked on a forum, Discord, or leak site, download the leaked .jar, .zip, or .exe file.
  2. 2. Drop in Security Tab: Open the Security view in this dashboard and drag the leaked file into the Binary Watermark Scanner.
  3. 3. Instant Identification: The scanner scans the file binaries, extracts token patterns (BuiltByBit user IDs, delivery keys, and license prefixes), and matches them with your live database.
  4. 4. 1-Click Ban: The leaker's profile, purchase date, and buyer label are revealed. Click Suspend Leaker License to immediately kill their license worldwide and report them to BuiltByBit!

Recommended Obfuscators:

  • Java / Minecraft: ProGuard, Zelix KlassMaster (ZKM), Stringer, or Bento.
  • JavaScript / Node.js: JavaScript-Obfuscator, pkg, or bytecode packing via bytenode.
  • Python: PyArmor or Nuitka (compiles Python code to native C binaries).