# Configuration Reference

This page documents every key in Verité's `config.yml`. Defaults shown are the values Verité ships with. Config keys, values, and code appear exactly as they are written in the file (ASCII), while prose uses the accented name Verité.

Verité's configuration is grouped into modules:

- `general`: plugin-wide settings.
- `chat.filter`: the chat filter, Veritédoux.
- `moderation`: the moderation system, Veritésauver.
- `invsee`: inventory viewing.
- `vanish`: the vanish system, Veritévoiler.

!!! note "Editing flags in game"
    Many of these keys can be read and changed from in game with `/verite config`, which patches the single key on disk and keeps every comment in the file. This command is gated behind the `veritedoux.flag` permission. Every true or false key and every numeric key in `config.yml` can be edited this way, using either its short name or its full dotted path. Free-text keys, the punishment tree lists, and `config.language` are not editable this way; change those in the file or from the web dashboard. Run `/verite config` with no arguments to list every editable key. Most edits apply live; the module gates (`chat.filter.enabled`, `moderation.enabled`, `vanish.enabled`) and the two auto-update flags require a restart to take effect.

## General

The `general` section holds plugin-wide settings.

```yaml
general:
  prefix: "<#808080>[<#B1C7F0>Verité<#808080>]<reset>"
  auto.update.config: true
  dashboard.url: "https://verite.gg"
```

| Key | Default | Controls |
| --- | --- | --- |
| `general.prefix` | `<#808080>[<#B1C7F0>Verité<#808080>]<reset>` | The public facing prefix on every Verité message, in the Verite tag format. |
| `general.auto.update.config` | `true` | Automatically appends new keys to the config when the plugin updates. Does not bypass tokenizer updates. Editable with `/verite config` as `auto.update.config`, but requires a restart to apply. |
| `general.dashboard.url` | `https://verite.gg` | Where `/verite dashboard` sends you. Only change this if you host the [Dashboard](page:web-dashboard) yourself. |
| `config.language` | `en` | The language the whole plugin runs in. One of `en`, `es`, `fr`, `it`, `pt`, or `de`. Changing it requires a full restart, not a reload. |

## Chat Filter (Veritédoux)

The `chat.filter` section configures message filtering.

```yaml
chat.filter:
  enabled: true
  auto.update.eve: false
  block.message: "@prefix Your message wasn't sent. Please keep chat friendly."
  repeat.message: "@prefix You've already sent that message. Please wait a moment before repeating yourself."
```

| Key | Default | Controls |
| --- | --- | --- |
| `chat.filter.enabled` | `true` | Enables the chat filter module. Editable with `/verite config` as `chat.filter.enabled`, but requires a restart to apply. |
| `chat.filter.auto.update.eve` | `false` | Automatically updates the `.eve` configuration files when new entries are added. When enabled, custom entries are overwritten or discarded when the `.eve` files are replaced with updated versions. Editable with `/verite config` as `auto.update.eve`, but requires a restart to apply. |
| `chat.filter.block.message` | `@prefix Your message wasn't sent. Please keep chat friendly.` | The notice shown when a message is blocked by the filter. Supports `&`-codes and `&#RRGGBB` hex. Use `@prefix` to insert your chosen prefix. |
| `chat.filter.repeat.message` | `@prefix You've already sent that message. Please wait a moment before repeating yourself.` | The notice shown when a message is blocked as a repeat. Supports `&`-codes and `&#RRGGBB` hex, and `@prefix`. |

!!! note "Self-harm message"
    The self-harm block message cannot be changed. This ensures users are always given the proper guidance and support when dealing with self-harm related content.

### Languages

The `chat.filter.general.lang` block chooses which languages are content-checked and which detection categories run for each. Profanity detection is disabled by default so that servers which permit casual swearing are unaffected. Adjust these to match your server's tolerance.

Each language block supports these keys:

| Key | Default | Controls |
| --- | --- | --- |
| `allowed` | `true` | Whether the language is permitted in chat. |
| `self.harm.detection` | `true` | Detects self-harm related content in this language. |
| `abuse.detection` | `true` | Detects abusive content in this language. |
| `slur.detection` | `true` | Detects slurs in this language. |

Profanity keys are per language. Each is `false` by default. Set one to `true` to flag profanity for that dialect or region.

| Language | Profanity keys (all default `false`) |
| --- | --- |
| `english` | `profanity.global` |
| `spanish` | `profanity.spain`, `profanity.argentinian`, `profanity.chilean`, `profanity.colombian`, `profanity.mexican`, `profanity.peruvian`, `profanity.venezuelan`, `profanity.uruguayan`, `profanity.cuban`, `profanity.dominican`, `profanity.panamanian`, `profanity.global` |
| `french` | `profanity.france`, `profanity.canadian` |
| `portuguese` | `profanity.european`, `profanity.brazilian` |
| `german` | `profanity.global` |
| `italian` | `profanity.global` |

Two additional entries cover text whose language could not be resolved:

| Key | Default | Controls |
| --- | --- | --- |
| `chat.filter.general.lang.unknown.lang.allowed` | `true` | Whether messages in a language Verité does not recognize are allowed. |
| `chat.filter.general.lang.undeterminable.allowed` | `true` | Whether messages whose language cannot be determined are allowed. |

An example language block:

```yaml
chat.filter:
  general.lang:
    english:
      allowed: true
      self.harm.detection: true
      abuse.detection: true
      slur.detection: true
      profanity.global: false
```

### Advanced

The `chat.filter.advanced` block holds tuning for readability, spam, and repeat detection.

```yaml
chat.filter:
  advanced:
    keep.chat.readable: false
    block.possible.spam: false
    block.repeat.messages: false
    block.repeat.exact: true
    block.repeat.near: true
    block.repeat.history.size: 5
    block.repeat.window.ms: 5000
    block.repeat.similarity.threshold: 0.85
    block.unsupported.languages: false
```

| Key | Default | Controls |
| --- | --- | --- |
| `keep.chat.readable` | `false` | Blocks messages that may make chat unreadable, such as fancy font substitutions, even when the message would otherwise pass the filter. Emojis are not blocked. Editable with `/verite config` as `keep.chat.readable`. |
| `block.possible.spam` | `false` | Uses Verité's tokenizer to detect and block possible spam and advertisements. Editable with `/verite config` as `block.possible.spam`. |
| `block.repeat.messages` | `false` | Enables repeat message detection. Every key below only applies when this is enabled. |
| `block.repeat.exact` | `true` | Blocks a message identical to a recent one from the same user. Comparison ignores case, accents, and repeated letters, so `HELLO`, `hello`, and `helllo` all count as the same. |
| `block.repeat.near` | `true` | Blocks a message that is similar (but not identical) to a recent one from the same user. How similar counts as a match is set by `block.repeat.similarity.threshold`. |
| `block.repeat.history.size` | `5` | How many of each user's most recent messages are remembered and checked for repeats. Set to `-1` to remember all messages, or `0` to disable repeat detection entirely. |
| `block.repeat.window.ms` | `5000` | How far back in time (milliseconds) a remembered message still counts as a repeat. Messages older than this are ignored. Set to `-1` to ignore time and remember messages indefinitely, or `0` to disable repeat detection entirely. |
| `block.repeat.similarity.threshold` | `0.85` | For near-repeat matching, how alike two messages must be to count as a repeat. A value between `0` and `1`, where `1` means identical. Higher is stricter (fewer blocks); lower is more aggressive. |
| `block.unsupported.languages` | `false` | Blocks languages Verité does not yet support. The supported languages are English, Spanish, French, Italian, Portuguese, and German. All other languages are blocked when this is enabled. Editable with `/verite config` as `block.unsupported.languages`. |

### Language Detection Weights

The `chat.filter.advanced.language` block tunes how Verité assigns a language to each word in a message.

```yaml
chat.filter:
  advanced:
    language:
      known.word.weight: 50
      unknown.word.weight: 0.1
```

| Key | Default | Controls |
| --- | --- | --- |
| `known.word.weight` | `50` | Weight for a word a language's dictionary knows but the rate table does not list. Higher means dictionary membership counts for more. |
| `unknown.word.weight` | `0.1` | Floor weight for a word no dictionary knows and the rate table omits. |

### Evasion Passes

The `chat.filter.advanced.evasion` block toggles the passes that undo attempts to slip content past the filter. Each is `true` by default. Disabling passes may reduce latency slightly.

```yaml
chat.filter:
  advanced:
    evasion:
      homoglyph: true
      entity: true
      deobfuscate: true
      segmentation: true
      fingerprint: true
```

| Key | Default | Controls |
| --- | --- | --- |
| `homoglyph` | `true` | Folds fullwidth, Cyrillic, and math-bold letter spoofs back to ASCII. Editable with `/verite config` as `evasion.homoglyph`. |
| `entity` | `true` | Strips HTML entities and similar encodings. Editable with `/verite config` as `evasion.entity`. |
| `deobfuscate` | `true` | Reverses character-inserted and spaced-out obfuscation. Editable with `/verite config` as `evasion.deobfuscate`. |
| `segmentation` | `true` | Splits run-together words back into separate words. Editable with `/verite config` as `evasion.segmentation`. |
| `fingerprint` | `true` | Catches transposed spellings. Editable with `/verite config` as `evasion.fingerprint`. |

### Profanity Confidence

The `chat.filter.advanced.use.profanity.confidence` block sets the minimum confidence before a message is treated as profane.

```yaml
chat.filter:
  advanced:
    use.profanity.confidence:
      enabled: true
      profanity.confidence.threshold: 0.30
```

| Key | Default | Controls |
| --- | --- | --- |
| `enabled` | `true` | Enables the profanity confidence threshold. Editable with `/verite config` as `use.profanity.confidence.enabled`. |
| `profanity.confidence.threshold` | `0.30` | The minimum confidence required to consider a message profane. Editable with `/verite config` as `use.profanity.confidence.profanity.confidence.threshold`. |

## Moderation (Veritésauver)

The `moderation` section configures the moderation system.

```yaml
moderation:
  enabled: true
  use.rank.weights: true
  auto.ban.alts: false
  expire.warns.after: 7d
  shared.ip.scan.limit: 20
```

| Key | Default | Controls |
| --- | --- | --- |
| `moderation.enabled` | `true` | Enables the moderation module. Editable with `/verite config` as `moderation.enabled`, but requires a restart to apply. |
| `moderation.use.rank.weights` | `true` | Compares LuckPerms group weight so staff cannot punish equal or higher ranks. Operators are always treated as the highest rank, regardless of LuckPerms weight. |
| `moderation.auto.ban.alts` | `false` | Automatically bans alts of a banned player, regardless of whether the player was IP-banned. Discouraged on servers that share IP addresses between distinct users. Editable with `/verite config` as `moderation.auto.ban.alts`. |
| `moderation.expire.warns.after` | `7d` | How long a warning counts as active before it lapses. |
| `moderation.shared.ip.scan.limit` | `20` | The maximum number of accounts shown in a duplicate IP-scan. Editable with `/verite config` as `moderation.shared.ip.scan.limit`. |

### Muted Command Blacklist

`moderation.muted.command.blacklist` lists commands a muted player may not use.

!!! note "Proxy injection"
    On a network with proxy injection, these commands may not be blocked by Verité, meaning a muted user could still use them.

The shipped list is:

```yaml
moderation:
  muted.command.blacklist:
    - "me"
    - "say"
    - "tell"
    - "whisper"
    - "reply"
    - "pm"
    - "message"
    - "msg"
    - "msgall"
    - "tellall"
    - "speak"
    - "emsg"
    - "epm"
    - "etell"
    - "ewhisper"
    - "w"
    - "m"
    - "t"
    - "r"
    - "mail"
```

### Exempt

The `moderation.exempt` block controls how rank weight comparisons treat equal-weight targets.

```yaml
moderation:
  exempt:
    use.group.weights: false
    permit.same.weight: true
```

| Key | Default | Controls |
| --- | --- | --- |
| `use.group.weights` | `false` | Allows acting on an equal-weight target when group weights are in use. Editable with `/verite config` as `moderation.exempt.use.group.weights`. |
| `permit.same.weight` | `true` | Permits acting on a target of the same weight. Editable with `/verite config` as `moderation.exempt.permit.same.weight`. |

### Punish Message Templates

`moderation.punish.message.templates` sets the text shown to punished players and to staff. Templates support `\n` (newline) and the quantifiers `@duration`, `@enforcer`, `@target`, `@reason`, `@punishment`, `@total.warns`, and `@remaining`. If no reason was set, `@reason` is replaced with `No reason provided.`

```yaml
moderation:
  punish.message.templates:
    ban.template.temporary: {You have been banned for @duration.\n@reason}
    ban.template.permanent: {You have been permanently banned.\n@reason}
    mute.template.temporary: {You have been muted by @enforcer for @duration.\n@reason}
    mute.template.permanent: {You have been muted by @enforcer.\n@reason}
    mute.notice: {You are muted. Time remaining: @remaining}
    mute.notice.permanent: {You are muted.}
    warn.template: {You have been warned by @enforcer. Active warnings: @total.warns\n@reason}
    kick.template: {You have been kicked by @enforcer.\n@reason}
    admin.receipt.template: {@target was @punishment by @enforcer.\n@reason}
```

| Key | Default |
| --- | --- |
| `ban.template.temporary` | `{You have been banned for @duration.\n@reason}` |
| `ban.template.permanent` | `{You have been permanently banned.\n@reason}` |
| `mute.template.temporary` | `{You have been muted by @enforcer for @duration.\n@reason}` |
| `mute.template.permanent` | `{You have been muted by @enforcer.\n@reason}` |
| `mute.notice` | `{You are muted. Time remaining: @remaining}` |
| `mute.notice.permanent` | `{You are muted.}` |
| `warn.template` | `{You have been warned by @enforcer. Active warnings: @total.warns\n@reason}` |
| `kick.template` | `{You have been kicked by @enforcer.\n@reason}` |
| `admin.receipt.template` | `{@target was @punishment by @enforcer.\n@reason}` |

### Punishment Tree

The `moderation.tree` block defines the punishment categories, the escalation steps within each category, and which staff groups may enact which categories. Each category applies its punishments in order. Supported punishment types are `warn`, `mute`, `kick`, and `ban`. A duration after a colon (for example `ban: 14d`) makes that step temporary; the same type with no duration is permanent. The final `minecraft:` entry in each category is the item shown for that category on the punishment GUI.

```yaml
moderation:
  tree:
    enabled: true
    use.fields: true
```

| Key | Default | Controls |
| --- | --- | --- |
| `moderation.tree.enabled` | `true` | Enables the punishment tree. |
| `moderation.use.fields` | `true` | Uses Minecraft 1.21.7+ Fields for punishment completion rather than chat. |

#### Permissions

`moderation.tree.permissions.luckperms` maps LuckPerms group names to the categories they may enact. Hierarchy is supported top-down: if your groups go `helper` then `mod` then `admin`, `admin` inherits the `mod` and `helper` categories, and `mod` inherits the `helper` categories. Replace the group names with your own.

```yaml
moderation:
  tree:
    permissions:
      luckperms:
        helper: {harassment, threats, spam, advertising, macroing, misinformation, inappropriate.content}
        mod: {exploiting, discrimination, impersonation}
        admin: {hacking, fraud, evading.punishment, inappropriate.username, inappropriate.skin, griefing}
```

| Group | Categories granted |
| --- | --- |
| `helper` | `harassment`, `threats`, `spam`, `advertising`, `macroing`, `misinformation`, `inappropriate.content` |
| `mod` | `exploiting`, `discrimination`, `impersonation` |
| `admin` | `hacking`, `fraud`, `evading.punishment`, `inappropriate.username`, `inappropriate.skin`, `griefing` |

#### Categories

`moderation.tree.categories` lists each category and its ordered escalation steps.

```yaml
moderation:
  tree:
    categories:
      harassment: {kick, ban: 14d, ban, minecraft:nether_star}
      threats: {mute: 5h, ban: 14d, ban, minecraft:tnt}
      spam: {warn, mute: 10m, mute: 1h, ban: 3d, ban, minecraft:cactus}
      advertising: {mute: 1d, ban: 3d, ban, minecraft:redstone_block}
      macroing: {warn, kick, ban: 7d, ban: 31d, ban, minecraft:redstone_torch}
      misinformation: {warn, mute: 20m, mute: 1h, ban: 3d, ban, minecraft:paper}
      inappropriate.content: {warn, mute: 1h, mute: 7h, ban: 7d, ban, minecraft:book}
      exploiting: {warn, warn, warn, ban: 2d, ban, minecraft:lever}
      discrimination: {ban: 31d, ban, minecraft:iron_sword}
      impersonation: {ban: 7d, ban, minecraft:player_head}
      hacking: {ban: 31d, ban, minecraft:diamond_sword}
      fraud: {ban: 31d, ban, minecraft:gold_ingot}
      evading.punishment: {ban: 31d, ban, minecraft:ender_pearl}
      inappropriate.username: {ban, minecraft:name_tag}
      inappropriate.skin: {ban, minecraft:leather_chestplate}
      griefing: {ban: 7d, ban, minecraft:stone_pickaxe}
      staff.disruption: {warn, kick, ban: 7d, minecraft:bottle_o_enchanting}
      chat.violation: {warn, mute: 1h, ban: 3d, minecraft:book_and_quill}
```

| Category | Escalation steps | GUI item |
| --- | --- | --- |
| `harassment` | `kick`, `ban: 14d`, `ban` | `minecraft:nether_star` |
| `threats` | `mute: 5h`, `ban: 14d`, `ban` | `minecraft:tnt` |
| `spam` | `warn`, `mute: 10m`, `mute: 1h`, `ban: 3d`, `ban` | `minecraft:cactus` |
| `advertising` | `mute: 1d`, `ban: 3d`, `ban` | `minecraft:redstone_block` |
| `macroing` | `warn`, `kick`, `ban: 7d`, `ban: 31d`, `ban` | `minecraft:redstone_torch` |
| `misinformation` | `warn`, `mute: 20m`, `mute: 1h`, `ban: 3d`, `ban` | `minecraft:paper` |
| `inappropriate.content` | `warn`, `mute: 1h`, `mute: 7h`, `ban: 7d`, `ban` | `minecraft:book` |
| `exploiting` | `warn`, `warn`, `warn`, `ban: 2d`, `ban` | `minecraft:lever` |
| `discrimination` | `ban: 31d`, `ban` | `minecraft:iron_sword` |
| `impersonation` | `ban: 7d`, `ban` | `minecraft:player_head` |
| `hacking` | `ban: 31d`, `ban` | `minecraft:diamond_sword` |
| `fraud` | `ban: 31d`, `ban` | `minecraft:gold_ingot` |
| `evading.punishment` | `ban: 31d`, `ban` | `minecraft:ender_pearl` |
| `inappropriate.username` | `ban` | `minecraft:name_tag` |
| `inappropriate.skin` | `ban` | `minecraft:leather_chestplate` |
| `griefing` | `ban: 7d`, `ban` | `minecraft:stone_pickaxe` |
| `staff.disruption` | `warn`, `kick`, `ban: 7d` | `minecraft:bottle_o_enchanting` |
| `chat.violation` | `warn`, `mute: 1h`, `ban: 3d` | `minecraft:book_and_quill` |

## Invsee

The `invsee` section controls inventory viewing.

```yaml
invsee:
  enable-offline-player-support: true
  enable-unknown-player-support: true
  tabcomplete-offline-players: true
```

| Key | Default | Controls |
| --- | --- | --- |
| `invsee.enable-offline-player-support` | `true` | Allows viewing the inventory of offline players. |
| `invsee.enable-unknown-player-support` | `true` | Allows viewing the inventory of players who have not been seen before. |
| `invsee.tabcomplete-offline-players` | `true` | Includes offline players in tab completion. |

## Vanish (Veritévoiler)

The `vanish` section configures the vanish system. The `vanish.features` block toggles individual behaviors, each `true` by default. Every feature key is editable with `/verite config` as `vanish.features.<name>`.

```yaml
vanish:
  enabled: true
  features:
    fake.message: true
    actionbar: true
    self.view: true
    fly: true
    invulnerability: true
    effects: true
    gamemode: true
    ride.entity: true
    silent.container: true
    inventory.inspect: true
    server.ping: true
    ghost: true
    prevent.chat: true
    prevent.pickup: true
    prevent.drop: true
    prevent.interact: true
    prevent.block.break: true
    prevent.block.place: true
    prevent.target: true
    prevent.damage: true
    prevent.food: true
    prevent.buckets: true
    prevent.advancement: true
    prevent.projectiles: true
    muffle.sounds: true
    muffle.particles: true
```

| Key | Default | Controls |
| --- | --- | --- |
| `vanish.enabled` | `true` | Enables the vanish module. Editable with `/verite config` as `vanish.enabled`, but requires a restart to apply. |
| `vanish.features.fake.message` | `true` | Shows a fake join or leave message when vanishing or unvanishing. |
| `vanish.features.actionbar` | `true` | Shows a persistent action bar reminder while vanished. |
| `vanish.features.self.view` | `true` | Lets the vanished player still see themselves. |
| `vanish.features.fly` | `true` | Grants flight while vanished. |
| `vanish.features.invulnerability` | `true` | Makes the vanished player invulnerable. |
| `vanish.features.effects` | `true` | Applies vanish related potion effects. |
| `vanish.features.gamemode` | `true` | Manages the player's game mode while vanished. |
| `vanish.features.ride.entity` | `true` | Allows the vanished player to ride entities. |
| `vanish.features.silent.container` | `true` | Opens containers silently while vanished. |
| `vanish.features.inventory.inspect` | `true` | Allows inspecting inventories while vanished. |
| `vanish.features.server.ping` | `true` | Adjusts the player's contribution to the server ping list while vanished. |
| `vanish.features.ghost` | `true` | Hides the vanished player as a ghost so they pass unseen. |
| `vanish.features.prevent.chat` | `true` | Prevents the vanished player from sending chat. |
| `vanish.features.prevent.pickup` | `true` | Prevents the vanished player from picking up items. |
| `vanish.features.prevent.drop` | `true` | Prevents the vanished player from dropping items. |
| `vanish.features.prevent.interact` | `true` | Prevents the vanished player from interacting with the world. |
| `vanish.features.prevent.block.break` | `true` | Prevents the vanished player from breaking blocks. |
| `vanish.features.prevent.block.place` | `true` | Prevents the vanished player from placing blocks. |
| `vanish.features.prevent.target` | `true` | Prevents mobs from targeting the vanished player. |
| `vanish.features.prevent.damage` | `true` | Prevents the vanished player from dealing or taking damage. |
| `vanish.features.prevent.food` | `true` | Prevents the vanished player's food level from changing. |
| `vanish.features.prevent.buckets` | `true` | Prevents the vanished player from using buckets. |
| `vanish.features.prevent.advancement` | `true` | Prevents the vanished player from gaining advancements. |
| `vanish.features.prevent.projectiles` | `true` | Prevents the vanished player from launching projectiles. |
| `vanish.features.muffle.sounds` | `true` | Muffles sounds the vanished player would otherwise produce. |
| `vanish.features.muffle.particles` | `true` | Muffles particles the vanished player would otherwise produce. |

## Fake join and leave

The `fake.connect` section configures the `/fakejoin` and `/fakeleave` commands, which broadcast a fake connection message without anyone actually joining or leaving.

```yaml
fake.connect:
  enabled: true
  join.message: "&#FFFF55%player% joined the game"
  leave.message: "&#FFFF55%player% left the game"
```

| Key | Default | Controls |
| --- | --- | --- |
| `fake.connect.enabled` | `true` | Turns the `/fakejoin` and `/fakeleave` commands on or off. When off, both commands politely refuse. |
| `fake.connect.join.message` | `&#FFFF55%player% joined the game` | The message broadcast by `/fakejoin`. Supports `&`-codes and `&#RRGGBB` hex. `%player%` is replaced with the chosen player's name. |
| `fake.connect.leave.message` | `&#FFFF55%player% left the game` | The message broadcast by `/fakeleave`. Supports `&`-codes and `&#RRGGBB` hex. `%player%` is replaced with the chosen player's name. |
