> ## Documentation Index
> Fetch the complete documentation index at: https://new-docs.simplecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Signs

> Learn about SimpleCloud's signs plugin for server navigation and status display

## Overview

The Signs Plugin lets players click signs to connect to different servers in your network.

## Supported Software

| Server Type    | Plugin Support |
| -------------- | -------------- |
| Paper & Forks  | ✅ Yes          |
| Spigot & Forks | 🔄 Planned     |

## Quick Setup

1. Download the plugin from [GitHub](https://github.com/simplecloudapp/sign-plugin/releases)
2. Place it in your server template's plugins folder

## Configuration

The Signs Plugin offers extensive configuration options for dynamic and engaging server signs. Each configuration entry defines sign behavior based on server state.

Example configuration:

```yaml theme={null}
name: "starting" # Unique identifier
rule: "STARTING" # Server state this applies to
server-name: "%group%-%numerical-id%" # Dynamic name template
priority: 0 # Rule precedence (higher overrides lower)
frame-update-interval: 500 # Update interval in milliseconds
frames:
  - lines:
      - "starting."
      - "<group>-<numerical-id>"
  - lines:
      - "starting.."
      - "<group>-<numerical-id>"
  - lines:
      - "starting..."
      - "<group>-<numerical-id>"
```

## Sign Rules

| Rule          | Description      | State Condition                                        |
| ------------- | ---------------- | ------------------------------------------------------ |
| `STARTING`    | Starting servers | Server state is `STARTING`                             |
| `OFFLINE`     | Inactive servers | Server is `null`                                       |
| `MAINTENANCE` | Maintenance mode | Server is `AVAILABLE` with `maintenance=true`          |
| `FULL`        | Maximum capacity | Server is `AVAILABLE` with `playerCount == maxPlayers` |
| `EMPTY`       | No players       | Server is `AVAILABLE` with `playerCount == 0`          |
| `ONLINE`      | Active servers   | Server is `AVAILABLE`                                  |

## Placeholders

Available placeholders for sign configuration (all follow the MiniMessage `<placeholder>` syntax):

| Placeholder                   | Description                                   | Default   |
| ----------------------------- | --------------------------------------------- | --------- |
| `<group>`                     | Server group                                  | "unknown" |
| `<numerical-id>`              | Server ID                                     | "0"       |
| `<type>`                      | Server type                                   | "unknown" |
| `<host>`                      | Server host                                   | "unknown" |
| `<ip>`                        | Server IP                                     | "unknown" |
| `<port>`                      | Server port                                   | "0"       |
| `<min-memory>`                | Min memory                                    | "0"       |
| `<max-memory>`                | Max memory                                    | "0"       |
| `<max-players>`               | Max players                                   | "0"       |
| `<player-count>`              | Current players                               | "0"       |
| `<state>`                     | Server state                                  | "unknown" |
| `<player_name>`               | Player name (rules run for a player only)     | n/a       |
| `<player_sender>`             | Player's proxy/server name                    | n/a       |
| `<property:[name]:[default]>` | Custom property lookup with optional fallback | ""        |

For dynamic sign properties you can use the tag `<property:joinstate:'Maintenance'>`. The resolver looks up `joinstate` in the server's properties map and, if it isn't present, falls back to the optional `default` argument (empty string when omitted).

### Example Usage

```yaml theme={null}
name: "online"
rule: "ONLINE"
display-name: "<group>-<numerical-id>"
priority: 50
frame-update-interval: 500
frames:
  - lines:
      - "Server: <group>"
      - "ID: <numerical-id>"
      - "Players: <player-count>/<max-players>"
      - "State: <state>"
```

## Commands

| Command                | Description       |
| ---------------------- | ----------------- |
| `/sign add <group>`    | Register new sign |
| `/sign remove [group]` | Unregister sign   |

## Permissions

| Permission                   | Description          |
| ---------------------------- | -------------------- |
| `signs.command.*`            | All sign commands    |
| `signs.command.add`          | Register new signs   |
| `signs.command.remove`       | Unregister signs     |
| `signs.command.remove.group` | Remove by group name |
