# The ORTEX mark

> What the mark is, when it shows, and how a white-label license removes it.

Section: Commercial. Source: https://ortexcharts.com/docs/branding

## What the Mark Is

Every chart drawn by ORTEX Charts carries a small mark on the first pane: the caption
"Charts provided by" above the ORTEX wordmark, in the theme text color at 60 percent
opacity, twelve pixels high, in the bottom-left corner by default. Clicking it opens
ortexcharts.com in a new tab, which is the page that answers the question somebody asks by
clicking a mark on a chart.

The mark is the visible half of the commercial enforcement in the code. The other half is
the gate: since 1.1.0 a chart with no valid key draws only on a development host, and paints
a licence notice instead of its content anywhere else. See [license keys](https://ortexcharts.com/docs/licensing).

_Live example: [branding](https://ortexcharts.com/examples/branding)_

## What the Mark Is Not

Stating this plainly matters more than describing the mark, because the assumption in this
category is usually the opposite.

- **The mark is not the enforcement; the gate is.** Since 1.1.0 a chart with no valid key
  draws only on a development host. On any other host it paints a licence notice instead
  of its content, in every state but `valid`: missing key, invalid key,
  expired key, wrong domain, revoked key. Keys carry a 14-day grace period past their
  term so a late renewal does not close the gate. See [license keys](https://ortexcharts.com/docs/licensing).
- **A licensed chart never nags.** With a key in place there is no overlay, no modal, no
  banner, no watermark across the plot, and no repeated warning. Nothing is written to the
  user's screen beyond the mark itself, and a paid key removes that too.
- **The mark does not say "Unlicensed".** On localhost, where an unlicensed chart still
  draws, the mark reads "Charts provided by ORTEX" and nothing more; a visitor cannot tell
  from the mark whether the page has paid. Off localhost the question does not arise,
  because the chart is not drawn.
- **The chart never phones home.** No request is made to any ORTEX host. The key is verified
  locally, by the library's own Ed25519 code. See [Questions we are asked](https://ortexcharts.com/docs/faq) for the complete telemetry
  answer.

## When the Mark Shows

There are three states, and only one of them removes the mark.

| State | Mark | Console |
|---|---|---|
| No key, or an invalid, expired or wrong-domain key, on localhost | Shown, with the caption | None, unless the chart asked to hide the mark: then one warning naming the reason |
| The same, on any other host | The chart is not drawn: a licence notice naming the reason takes its place | None |
| A valid key **without** the `whitelabel` feature | Shown, exactly the same mark | One warning if you asked to hide it |
| A valid key **with** the `whitelabel` feature | Hidden when `branding.visible` is `false` | Nothing |
| A valid key **with** the `brand` feature | Hidden, or replaced with your own logo, text, caption and link | Nothing |

Every paid plan, Pro and Business, grants `whitelabel`: the mark may be hidden. OEM
agreements grant `*`, which includes `brand`: the mark may be yours. There is no free plan;
without a key the mark shows on localhost and the chart does not draw anywhere else.

So the mark is a ladder with two rungs. Paid shows none, and only OEM shows the customer's
own. See [/pricing](https://ortexcharts.com/pricing) for the plans and the numbers.

## Removing It

```ts
import { setLicenseKey, createFinancialChart } from "@ortex-charts/financial";

await setLicenseKey(WHITELABEL_KEY);

const chart = createFinancialChart(el, {
  branding: { visible: false },
  data: bars,
});
```

`branding.visible = false` is a request, not a command. It is honored only when the current
license grants `whitelabel`. Setting it without that feature does exactly one thing beyond
being ignored: it writes one line to the console.

```text
[ORTEX Charts] This license does not include white-labeling; the ORTEX mark stays on.
```

With no key at all, the message is different and names the underlying problem:

```text
[ORTEX Charts] No license key set. The ORTEX mark stays on until a valid key is set with setLicenseKey().
```

Check what you have before assuming a key is the problem:

```ts
import { hasFeature, licenseStatus } from "@ortex-charts/financial";

licenseStatus();          // { state, payload, message, verified }
hasFeature("whitelabel"); // true only on a valid license that grants it
```

The signature is checked before `setLicenseKey` returns, by the library's own Ed25519
implementation, so a feature is granted from the moment the key is valid and never on an
unchecked payload.

## Replacing It With Your Own

A `brand` license, which is an OEM agreement, may keep a mark and make it yours, which is
what a product shipped under your name usually wants rather than a bare corner. A Pro or
Business key hides the mark; it does not replace it.

```ts
createFinancialChart(el, {
  branding: {
    visible: true,
    logo: "https://cdn.example.com/brand/mark.svg",   // a URL, a data URI, or "text"
    caption: "",                                      // empty removes the caption line
    position: "bottomRight",
    height: 14,
    opacity: 0.5,
    href: "https://example.com",
  },
});
```

Setting `logo: "text"` draws the `text` option in a bold face at `height` pixels instead of
an image, which avoids an extra request for a wordmark that is just letters.

Keeping the ORTEX mark on a licensed chart is also fine, and some customers do; the option
simply stays at its default.

## Every Branding Option

| Option | Type | Default | What it does |
|---|---|---|---|
| `visible` | `boolean` | `true` | Show the mark. Setting it to `false` requires the `whitelabel` feature. |
| `position` | `"bottomLeft" \| "bottomRight" \| "topLeft" \| "topRight"` | `"bottomLeft"` | Corner of the first pane. |
| `height` | `number` | `12` | Logo height in CSS pixels. |
| `opacity` | `number` | `0.6` | Opacity of the whole mark. |
| `logo` | `"ortex" \| "text" \| string` | `"ortex"` | The ORTEX wordmark, the `text` option, or an image URL or data URI. |
| `text` | `string` | `"ORTEX"` | Drawn when `logo` is `"text"`. |
| `caption` | `string` | `"Charts provided by"` | Small line above the mark; an empty string removes it. |
| `href` | `string` | `"https://ortexcharts.com"` | Opened in a new tab when the mark is clicked. |

`position`, `height` and `opacity` are honored regardless of the license, because they only
move the mark about. `logo`, `text`, `caption` and `href` are honored only when the key carries
the `brand` feature; without it the mark, when shown, is the ORTEX wordmark with its caption
and its link whatever the options say, so replacing the mark with yours is an OEM agreement
rather than an option. `whitelabel` alone (every paid plan) honors `visible: false` and nothing
else. As of 1.0.26; between 0.6.1 and 1.0.25, `whitelabel` covered both.

`BRANDING_DEFAULTS` is exported if you want to start from the defaults and change one field.

## Why It Works This Way

Anything that runs in a browser ships to the browser. Minified JavaScript is source code with
the comments removed, and a determined person can read it, copy it and patch out a check in
an afternoon. That is true of every library in this category and every one of them is a
functioning business, so the interesting question is not how to prevent copying but what
makes the legitimate path the easier one.

ORTEX's answer, in order:

- **A contract with terms a company can be held to.** The customers who can afford a chart
  library do not risk a breach-of-contract suit to save a subscription.
- **Updates and support**, which stop when the subscription does.
- **Distribution through a per-customer channel** — a hosted kit locked to your domains, or
  a registry token — rather than through public npm.
- **A signed, domain-bound key with one visible consequence**, so the unlicensed state is
  obvious in a screenshot but harmless to the end user.
- **No obfuscation**, because it costs performance and debuggability and buys about a day of
  a copier's time.

Removing the check by editing the bundle is possible. It is also a deliberate act, named as
a breach in the agreement, with the evidence sitting in the customer's own deployment, and
the key id in a leaked build identifies which customer it came from. That is the honest
description of the protection, and it is the same one every vendor in the category could
give.

## Related

- [License keys](https://ortexcharts.com/docs/licensing) — issuing, domains, expiry and the states.
- [Questions we are asked](https://ortexcharts.com/docs/faq) — telemetry, expiry, support.
- [/pricing](https://ortexcharts.com/pricing) — which plan grants `whitelabel`, and which grants `brand`.
