> For the complete documentation index, see [llms.txt](https://docs.ohalee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ohalee.com/products/obsidian-license/configuration.md).

# Configuration

There is nothing to configure on the platform side: products, licenses, seats, expiry, tiers, channels, trials, branding, webhooks and API keys all live in your dashboard at [license.ohalee.com](https://license.ohalee.com).

The only file you configure is the one your customers get. Which file that is depends on your mode.

## License check: your own `config.yml`

Your plugin owns its config, so the shape is up to you. Three values need to reach the client:

```yaml
license:
  # Base URL of the license server.
  serverUrl: "https://license.ohalee.com"

  # The key issued to this customer. The only value that changes per customer.
  key: "OBS-XXXX-XXXX-XXXX-XXXX"

  # Dashboard, Server key. Pinning it stops a redirected DNS entry or a proxy
  # from answering "valid" on the server's behalf.
  serverPublicKey: "PASTE_THE_KEY_FROM_YOUR_DASHBOARD"
```

Ship `serverUrl` and `serverPublicKey` pre-filled in your default config. Asking a customer to paste a public key is asking for a support ticket.

## Protected plugin, Paper: `plugins/ObsidianLoader/config.yml`

Download the loader from your dashboard and set four values. The loader fails closed if anything is missing or invalid, or if the server is unreachable.

```yaml
# ObsidianLoader configuration

# Base URL of the license server.
serverUrl: "https://license.ohalee.com"

# The license key issued to this customer from your dashboard.
licenseKey: "OBS-XXXX-XXXX-XXXX-XXXX"

# Which product this loader should fetch. Shown in your dashboard per product.
productId: "my-plugin"

# The server's Ed25519 public key, shown in your dashboard.
# Pinning this prevents a rogue server from substituting a malicious payload.
serverPublicKey: "PASTE_SERVER_PUBLIC_KEY_HERE"
```

Add `variant: "game"` only if the product ships [several jars](/products/obsidian-license/multiple-jars.md).

## Protected plugin, Velocity: `plugins/obsidianloader/config.properties`

The same four values, in Velocity's plugin data directory:

```properties
serverUrl=https://license.ohalee.com
licenseKey=OBS-XXXX-XXXX-XXXX-XXXX
productId=my-plugin
serverPublicKey=PASTE_SERVER_PUBLIC_KEY_HERE
# variant=lobby
```

## Protected module, plain Java

No config file: you pass the values to the loader yourself, so read them from wherever your application already reads configuration (environment, properties, Spring config).

```java
ObsidianLoader.builder()
        .serverUrl("https://license.ohalee.com")
        .productId("my-service")
        .licenseKey(System.getenv("LICENSE_KEY"))
        .serverPublicKey(System.getenv("LICENSE_PUBLIC_KEY"))
        .dataFolder(Path.of("data"))
        .build();
```

## Where each value comes from

| Value                | Where to find it                                           |
| -------------------- | ---------------------------------------------------------- |
| `serverUrl`          | Always `https://license.ohalee.com` for the hosted service |
| `licenseKey` / `key` | The key you issued, or the buyer redeemed. Licenses page   |
| `productId`          | Your product's id. Products page                           |
| `serverPublicKey`    | Dashboard, Server key. The same key for all your products  |

{% hint style="info" %}
When you distribute to a customer, the only value that changes per customer is the license key. Everything else is identical for everyone who buys that product.
{% endhint %}

## Self-hosting

If you run your own instance, the server is configured through environment variables: Postgres URL, `JWT_SECRET`, `MASTER_KEY`, SMTP, abuse thresholds, retention, and the `LEGAL_*` identity used on the customer-facing pages. `serverUrl` and `serverPublicKey` then come from your own deployment rather than the hosted values above. That operator setup is outside the scope of these customer-facing docs, contact support if you self-host.
