# Welcome to Jellyn
> Jellyn runs your ER:LC community's staff team from Discord and the web. Shifts, punishment logs, leave, sessions and your live server, in one place your team shares.
Jellyn is two things that work as one: a **Discord bot** your staff use every day, and a **dashboard** at [jellyn.xyz](https://jellyn.xyz) where management sets everything up. Link your **ER:LC private server** and Jellyn reads it live: who is in game, what commands were run, who joined and left.
Add Jellyn to your Discord server and run your first shift in about five minutes.
Link your private server so Jellyn can read it and run commands in game.
Staff clock in, take breaks and clock out from one panel in Discord.
Record every kick, ban and warning, with evidence, and look players up.
## How Jellyn fits together
Slash commands for staff: `/shift`, `/punishment`, `/session`, `/loa` and more. It posts logs in your channels.
Your server's settings, members, roles, logs and activity, and the moderator panel for live moderation.
Players, commands, kills and joins, read through the ER:LC API, and commands sent back to the game.
Everything is recorded once and shown everywhere: a punishment logged in Discord is on the website a moment later, and a shift started from the moderator panel shows in `/shift`.
## What you can do
- **Run your team.** Shifts and breaks, activity counted in [waves](/team/activity), [leave of absence](/team/leave), [staff infractions and promotions](/team/infractions), and [roles](/team/roles) that decide who sees what.
- **Moderate.** [Punishment logs](/moderation/punishments) with evidence files, the [moderator panel](/moderation/moderator-panel) with keyboard shortcuts, and an [audit log](/moderation/audit-log) of every change.
- **Run your ER:LC server.** [Sessions](/erlc/sessions) with polls and boosts, [game features](/erlc/game-features) like logging from in game, and [automations](/erlc/automations) for safe zones and the area of play.
- **Build your community.** [Applications](/community/applications), [documents](/community/documents) for your handbook, and [Roblox verification](/community/verification).
New here? Start with the [Quickstart](/get-started/quickstart), then read [Key concepts](/get-started/concepts) to see how servers, staff and management fit together.
## For developers
Want to go further? [Jellyn Lab](/developers/lab/overview) builds your server's own slash commands and systems out of blocks, and the [Developers](/developers/overview) section covers webhooks, placeholders and using these docs with AI tools.
## Get help
Fixes for the most common problems: permissions, ER:LC commands and missing commands.
The status page shows the bot, the website and the ER:LC connection right now.
Source: https://docs.jellyn.xyz/
---
# Quickstart
> Add Jellyn to your Discord server, choose your staff roles and log channels, and run your first shift.
You need to be the owner of the Discord server, or have **Manage Server** there. The whole thing takes about five minutes.
Go to [jellyn.xyz](https://jellyn.xyz) and sign in with Discord. Your Jellyn account is made the first time you sign in, and Discord tells Jellyn who you are; Jellyn never sees your password.
On [your dashboard](https://jellyn.xyz/dashboard), press **New**, then **Add Jellyn to a server**. Discord asks which server and which permissions to give the bot. Keep the permissions it asks for: Jellyn needs them to post logs, give roles and read your channels.
In your server, run `/setup`. A form asks for:
| Field | What it is |
| --- | --- |
| Staff roles | Who can use staff commands, like shifts and punishment logs. Required. |
| Management roles | Who can issue infractions, void cases, approve leave and post announcements. Optional. |
| Audit log channel | Settings changes and staff infractions. Keep it private to management. |
| Shift log channel | Shift starts and ends are posted here. |
| Punishment log channel | Punishment records are posted here, with their evidence files. |
Jellyn checks it can post in each channel and tells you if it can't. You can change all of this later with `/settings` or on the dashboard.
Back on [your dashboard](https://jellyn.xyz/dashboard), your server now has a card. Press **Dashboard** on it. The sidebar lists everything the server has: General, Members, Roles, Discord, Moderation, Activity and more.
Anyone with one of your staff roles is on the team already: they sign in to Jellyn and see the server. To let in someone without a staff role, share the **join code** from the **General** page; they ask to join and you accept them under [Members](/team/members).
Optional, but it is where Jellyn shines. On the **ER:LC** page, press **Link a server** and paste your private server's API key. Then authorize Jellyn on ER:LC so it can run commands. See [Connect ER:LC](/erlc/connect).
In Discord, run `/shift` and press **Start shift**. The shift log channel gets a post, and the shift shows on the **Activity** page and in the moderator panel.
That's it: your server is set up. Run `/help` in Discord at any time to see every command, grouped by what it is for.
## Next steps
Owners, admins, management and staff, and what each can do.
Give people exactly the parts of the dashboard they need.
Log kicks, bans and warnings from Discord, the website or in game.
Polls, startups, boosts and shutdowns, posted for your players.
Source: https://docs.jellyn.xyz/get-started/quickstart
---
# Key concepts
> How Jellyn thinks about your community. Servers, the people in them and what each can do, waves, and plans.
## Servers
A **server** on Jellyn is one Discord server with the Jellyn bot in it. Everything belongs to a server: its staff, shifts, punishment logs, settings and linked ER:LC servers. One Jellyn account can be on the staff of many servers; your [dashboard](https://jellyn.xyz/dashboard) lists them all, in the order you last opened them.
## Who can do what
Jellyn works out what someone can do from their Discord roles and the [Jellyn roles](/team/roles) they hold.
| Level | Who | What they can do |
| --- | --- | --- |
| Owner | The Discord server's owner | Everything, including what only the owner can do, like linking roles to plans. |
| Admin | Discord **Administrator** or **Manage Server**, or a Jellyn role with **Administrator** | Everything except what only the owner can do. |
| Management | A management role from `/setup` | Every dashboard and moderator panel permission: infractions, voiding cases, approving leave, settings pages. |
| Staff | A staff role from `/setup`, or any Jellyn role | Shifts, punishment logs, the moderator panel, and the pages their Jellyn roles open. |
| Member | Let in with the join code | Open the server on Jellyn without a staff role. |
Every page and every request is checked on the server side. Hiding a page in the sidebar is only for tidiness: someone without the permission can't open it or its data.
## Jellyn roles
On top of the staff and management Discord roles, a server can make its own **Jellyn roles** on the Roles page. A role gives a set of permissions (like *Run in-game commands* or *Applications*) and can be linked to a Discord role, so whoever has that Discord role holds it. See [Roles and permissions](/team/roles).
## Waves
Activity is counted in **waves**: stretches of time, numbered from 1, one after the other. A wave lasts seven days by default. Shift time, the required time and the leaderboard all count the current wave unless you pick another one or all time. See [Activity and waves](/team/activity).
## The moderator panel
The **moderator panel** is the screen staff keep open while they moderate: who is in game, the punishment form, what is happening in the server and the player logs, with keyboard shortcuts for everything. See [Moderator panel](/moderation/moderator-panel).
## Logs and records
Jellyn keeps records, and posts them where your team will see them:
- **Punishment logs**: what a player was punished for, by whom, with evidence.
- **Shift logs**: when each staff member started and ended a shift.
- **Staff infractions and promotions**: your team's own record.
- **The audit log**: every change to the server's settings, roles and records, and who made it.
## Plans
Jellyn is free to use. **Jellyn+** is a plan for a server that adds more, like applications, staff infractions, your own wording for posts and up to 100 linked ER:LC servers. Pages and commands that need it say so. See [Plans and Jellyn+](/get-started/plans).
Source: https://docs.jellyn.xyz/get-started/concepts
---
# Plans and Jellyn+
> What Jellyn+ adds to a server, and how a plan gets to one.
Everything in these docs works without a plan unless it says Jellyn+. A plan belongs to one server at a time: the server gets what the plan adds, for everyone on its team.
Jellyn+ is not on sale yet. Where a page or command needs it, Jellyn tells you so, and settings you save for it wait until the server has it.
## What Jellyn+ adds
- [Applications](/community/applications): forms, ban appeals, quizzes and reviews.
- [Staff infractions](/team/infractions), and your own wording and colour for their posts.
- Your own message when staff ask for more staff to come on.
- More than 15 [Jellyn roles](/team/roles).
- Up to 100 linked ER:LC servers instead of 5.
- The [map editor](/erlc/automations#the-map-editor): areas of play and safe zones drawn on the map.
- Your own [session posts](/erlc/sessions#your-own-posts): startup, poll, boost and shutdown.
- Your own wording for game logs and for off-shift command alerts.
- Warning messages in game, status voice channels and proximity voice.
- Taking in-game ranks from staff who leave your server on Jellyn.
- [Command settings](/community/discord#commands): turn a command off, or keep it to staff, management or admins.
- More ways to set up and protect [verification](/community/verification).
- **Jella**, the server's assistant: `/jella` answers from what your server taught it, and acts in game when asked.
## How a plan gets to a server
A subscription is yours, and you choose the server it is on. On [Subscriptions](https://jellyn.xyz/subscriptions) you see your plans and the server each one is on. If one is on no server, your dashboard says so with a yellow note.
The Jellyn team can also give a plan to a server for a while (for testing, partners or events). That shows on the server the same way.
## Other plans
Jellyn has more products on their way, each with a plan of its own:
- **Warden**: law enforcement and 911 calls, with a CAD for dispatch, units and records.
- **Departments**: a Discord server for each department, linked to your main server.
They show as *Coming soon* on the website until they open.
Source: https://docs.jellyn.xyz/get-started/plans
---
# Members and join codes
> Who is on your server's team on Jellyn, how people join it, and how they leave.
The **Members** page of your server's dashboard has two parts: **Join requests** and **Members**.
## Who is on the team
There are two ways onto a server's team on Jellyn:
- **A staff role.** Anyone with one of the staff roles you picked in `/setup` is on the team. They sign in to Jellyn and the server is on their dashboard. Nothing to accept.
- **The join code.** Someone without a staff role asks to join with the server's join code. Once you accept them, they can open the server on Jellyn even without a staff role.
Holding any [Jellyn role](/team/roles) also makes someone staff on Jellyn, in Discord commands too.
## The join code
The join code is on the server's **General** page. Admins can see it, make a new one, and choose whether staff need it too.
Copy the join code from **General** and send it to the person.
On their dashboard they press **Join** and enter the code. Their request waits under **Join requests**, and shows on their dashboard as pending, where they can cancel it.
On **Members → Join requests**, accept or deny the request. Accepted, they can use the server on Jellyn straight away.
Make a new join code when an old one has been shared too widely: the old one stops working at once.
## The members list
**Members** lists everyone on the team, with a search. For each person:
| Column | What it shows |
| --- | --- |
| Status | Whether they are on shift, on a break or off |
| On shift, this wave | Their shift time in the current [wave](/team/activity) |
| Shifts | How many shifts they worked |
| Punishments logged | How many punishment logs they made |
| Joined by | How they got onto the team: a staff role, the join code, or an accepted application |
| Last seen | When they last used Jellyn |
From a person's row you can open their record, and management can act on them.
## Leaving a server
Someone let in with the join code can leave from the **⋮** menu on the server's card on their dashboard: **Leave server**. It waits a few seconds, so it can be undone.
Staff who are on the team through a staff role don't get **Leave**: Jellyn adds them back as long as they have the role. Take the role away in Discord instead.
Source: https://docs.jellyn.xyz/team/members
---
# Roles and permissions
> Make your server's own Jellyn roles, each opening exactly the parts of the dashboard and moderator panel a team needs.
Your staff and management Discord roles (from `/setup`) are a good start, but most teams need more in between: a moderator who can run in-game commands but not change settings, an applications team, an activity manager. That is what **Jellyn roles** are for.
## What a role is
A role is made on the **Roles** page of the dashboard. It has:
- a **name** and a **colour**,
- a **place in the order** (1 is the highest),
- the **permissions** it gives,
- and, if you like, the **Discord role** it is linked to.
A server can have up to 15 roles; with Jellyn+ there is no limit. Change the order with the arrows on a role, or hold it and slide it into place.
## Who holds a role
- **Given by hand**: in the role's window, by Discord ID.
- **Through Discord**: everyone with its linked Discord role holds it. This is decided from the Discord roles someone has right now, so it is immediate on the website, and Jellyn keeps its list of holders in step within a couple of minutes.
Holding any role makes someone staff on Jellyn, in Discord commands too.
## The permissions
| Permission | Lets them |
| --- | --- |
| Log bans | Log bans, not only lesser punishments |
| Void punishments | Void a punishment log |
| Run in-game commands | Use the command box and the player card's in-game actions |
| Bans and ranks in game | Run bans and other restricted commands in game, like raid rollback |
| Message players | Message players on Discord from their card |
Each opens one page or part of the dashboard: **Members**, **Infractions**, **Types and rules**, **Applications**, **Activity**, **Leave of absence**, **Documents** (the Resources permission), **Audit log**, **Discord**, **ER:LC overview**, **Session settings**, **Automations**, **Vehicles**, and **Reminders & actions**.
| Permission | Lets them |
| --- | --- |
| Roles | Make, change and give Jellyn roles (below their own) |
| Server settings | Change the server's settings and log channels |
| ER:LC connection | Link and change the ER:LC servers |
| Administrator | Everything, except what only the owner can do |
These sit on top of the Discord roles from `/setup`:
- A **management** Discord role has every permission of the first two groups.
- The **owner** and Discord **admins** (Administrator or Manage Server) have all of them.
- A **staff** Discord role alone has none: staff get shifts, punishment logs and the moderator panel.
## Who can manage roles
Whoever has the **Roles** permission; the owner and Discord admins always can. Someone who isn't the owner or a Discord admin works **below their own highest role**: they change, order, remove and give only roles under it, and only put permissions on a role that they hold themselves. A new role goes to the bottom of the order.
Discord slash commands that need management, like `/infraction` and `/promotion`, still go by the management Discord roles from `/setup`.
Every change to a role is in the [audit log](/moderation/audit-log).
Source: https://docs.jellyn.xyz/team/roles
---
# Shifts
> Staff clock in, take breaks and clock out from one panel. Shifts can also start and end by themselves when staff join and leave your ER:LC server.
## The shift panel
Run `/shift` in Discord to get your panel: your shift right now and this [wave's](/team/activity) numbers, with buttons to work it.
| Button | Does |
| --- | --- |
| **Start shift** | Starts your shift. With more than one [shift type](#shift-types), pick one from the list first. |
| **Take a break** / **Resume** | Pauses your shift, and picks it up again. Break time doesn't count. |
| **End shift** | Ends it, and posts it in the shift log channel. |
| **Who's on shift** | Lists everyone on shift right now, only for you. |
The panel is posted in the channel for everyone to see, but its buttons answer only you. Anyone else who presses them is told to run `/shift` for their own.
In the [moderator panel](/moderation/moderator-panel), Ctrl S starts a shift, Ctrl B takes a break or comes back, and Ctrl E ends it.
## Someone else's shift
Management can run `/shift member:@someone` to see another staff member's panel, privately, and end their shift from it with a reason.
## Shift types
**Shift types** are what staff start a shift as, like *Patrol* or *Dispatch*. Set them on the **Types and rules** page, next to the infraction and punishment types. Each shift keeps its type:
- the Discord shift panel gets a list to pick one (**Start shift** starts the first),
- the moderator panel has a picker beside **Start shift**,
- and the shift log post says the type.
## Shifts from ER:LC
With your [ER:LC server linked](/erlc/connect), shifts can start and end by themselves.
On **Game features**, turn on **Shifts for the whole team**. A shift starts when a staff member with a verified Roblox account joins the game (only on the teams you pick, if any, and as the shift type you pick) and ends when they leave, after the minutes you set.
Each staff member can turn it on for themselves in their account settings on Jellyn, even when it's off for the team.
Jellyn knows who a player is from their verified Roblox account. See [Roblox verification](/community/verification).
## Shift and leave roles
On the **Discord** page, management can have Jellyn give a role while someone is **on shift**, **on a break** or **on leave**, and put a prefix before their nickname, like `[On Shift] River`. Both are off until you turn them on.
- Jellyn applies them within 30 seconds, and at once after `/shift`.
- It takes back exactly what it gave: the role it added, and the nickname from before the prefix.
- A nickname the member changed while it had the prefix stays theirs.
Discord doesn't let bots change the server owner's nickname, and Jellyn can only give roles below its own. Put Jellyn's role above the shift roles in **Server Settings → Roles**.
## Where shifts show
- The **shift log channel** gets a post when a shift starts and ends.
- The **Activity** page lists every shift, by wave.
- `/activity` and `/leaderboard` count shift time. See [Activity and waves](/team/activity).
Source: https://docs.jellyn.xyz/team/shifts
---
# Activity and waves
> How Jellyn counts staff activity in waves, sets the time each wave requires, and ranks your team.
## Waves
Activity is counted in **waves**: stretches of time numbered from 1, one after the other. Shift time, the required time and the leaderboard count the **current wave** unless you pick another one, or all time. A shift belongs to the wave it started in.
- A wave lasts **7 days** by default. Set it to 0 and a wave lasts until management ends it.
- The first wave starts at midnight (UTC) on the day of your server's first shift.
- Nothing runs on a timer: a wave that is over moves on the next time anyone looks.
## The Activity page
The **Activity** page of the dashboard has four parts:
Each staff member's shift time, shifts and punishments logged, and who is behind the required time.
The wave settings, and every wave with its shifts, time and staff.
Every shift of one wave.
Time your staff spent in your ER:LC server, counted by their verified Roblox accounts.
### Wave settings
Under **Waves**, management (the **Activity** permission) sets:
- **Wave length**, in days.
- **Required time** each wave, and the flag for staff who fall short.
They can also **end the wave** going on (the next starts at once), set **when it ends** (or let it follow the wave length again), and **delete** waves that are over, with Undo. A deleted wave's shifts stay, and still count for all time.
## In Discord
```discord
/activity staff:@River wave:3
```
Shift time, shifts and punishments logged, for you or another staff member, in the current wave or the one you pick.
```discord
/leaderboard metric:Shift time wave:3
```
Ranks staff by shift time, shifts or punishments logged, 15 to a page. It splits who met the wave's required time from who didn't, and links to the waves on the website.
Source: https://docs.jellyn.xyz/team/activity
---
# Leave of absence
> Staff ask for time away, management approves or denies it, and Jellyn keeps track of who is on leave.
## Asking for leave
In Discord, run `/loa request`. A form asks for the **start date**, the **end date** and the **reason**.
The request is posted in the **LOA channel** with **Approve** and **Deny**. Denying asks for a reason.
Once approved, they are on leave for those dates. With a [leave role](/team/shifts#shift-and-leave-roles) set up, Jellyn gives it to them while they are away.
You can also ask for leave and see your own on the website: **Manage leave of absences** on your dashboard, or the **Leave of absence** page of a server.
## For management
| Where | What |
| --- | --- |
| The LOA channel | Every new request, with Approve and Deny |
| `/loa list` | Requests to review, and who is on leave now |
| `/loa status staff:@someone` | One staff member's leave |
| **Leave of absence** page | The same records on the website, for the **Leave of absence** permission |
Pick the LOA channel with `/settings` or on the **Discord** page. Without one, requests still work from `/loa list` and the website.
Source: https://docs.jellyn.xyz/team/leave
---
# Infractions and promotions
> Your team's own record. Staff infractions issued and revoked by management, and promotions announced to the team.
## Staff infractions Jellyn+
Infractions are disciplinary records for your **staff**, separate from punishments for players. Management issues and revokes them; every staff member can see their own record.
| Command | Who | Does |
| --- | --- | --- |
| `/infraction issue staff:@someone` | Management | Opens the form to issue one |
| `/infraction view` | Everyone on staff | Your own record; management can add `staff:` to see someone's |
| `/infraction revoke id:12` | Management | Revokes infraction #12 |
- **Infraction types**, like *Warning* or *Strike*, are set on the **Types and rules** page.
- Infractions are posted in the **audit log channel**.
- With Jellyn+, the posts can have your own wording and colour.
The **Infractions** page of the dashboard shows the same records, for the **Infractions** permission.
## Promotions
Management records promotions with `/promotion`, and Jellyn announces them in the **promotions channel**.
| Command | Does |
| --- | --- |
| `/promotion log staff:@someone` | Opens the form to log a promotion and announce it |
| `/promotion history` | Your promotions; management can add `staff:` to see someone's |
A promotion is a record and an announcement only: Jellyn never changes anyone's roles. Give the new role in Discord as you always do.
Source: https://docs.jellyn.xyz/team/infractions
---
# Punishment logs
> Record what players were punished for, with evidence, from Discord, the website or in game, and look anyone up.
A **punishment log** is a record of what a player did and what your staff did about it: a warning, a kick, a ban, a BOLO, or any type you add. Each one has a case number, and is posted in your **punishment log channel**.
## Logging a punishment
```discord
/punishment log username:Sam_RP
```
A form asks for the type, the reason and any **evidence files**, which Jellyn posts with the case in the log channel. Leave `username` out to type the player in the form.
On **Punishment logs**, or in the [moderator panel](/moderation/moderator-panel), fill in the player, the type and the reason. Drop evidence files on the form: each uploads as soon as it is picked.
Staff with a verified Roblox account type in ER:LC:
```erlc
:log warning Sam_RP Failure to roleplay
```
That is `:log type name reason`. It's on by default, and needs your [ER:LC server linked](/erlc/connect). Kicks and bans your staff run in game can be logged by themselves too. See [Game features](/erlc/game-features#logging-from-the-game).
## Evidence files
Up to **5 files** a punishment, **10 MB** each and **25 MB** together:
| Kind | Files |
| --- | --- |
| Pictures | PNG, JPEG, GIF, WebP |
| Videos | MP4, MOV, WebM |
| Text | `.txt`, `.log`, `.md`, `.csv` |
| Documents | PDF |
What a file is comes from what is in it, never from its name. Every file shows on the log as a tile; pictures, videos, PDFs and text open in the browser, and anyone on your staff can download them.
A file uploaded on the website but never logged is deleted after a day. Until the case is logged, only whoever uploaded it can open it.
## Looking players up
| Command | Does |
| --- | --- |
| `/punishment view case:42` | Shows case #42, with how many files it has and where to download them |
| `/punishment history username:Sam_RP` | A player's recent cases |
On the website, the **Punishment logs** page loads 25 at a time, with a search; the moderator panel's **Player logs** shows the newest. Clicking a player anywhere opens their **player card**: their logs, and actions for them.
## Types and rules
On **Types and rules**, management sets:
- **Punishment types**: what staff choose when logging a punishment, in your order (hold the grip and slide one to move it). Give a type an **in-game command** and staff can carry it out in ER:LC while logging it; `{player}` and `{reason}` are filled in.
- **Staff rules**: what staff can do, on the website and in Discord. Management can always log bans and run commands.
A type you remove stays on the logs that already use it.
## Voiding a punishment
A punishment logged by mistake can be **voided** by staff with the **Void punishments** permission. A voided log stays in the record, marked as voided, and the change is in the [audit log](/moderation/audit-log).
## BOLOs
A **BOLO** (be on the lookout) is a punishment waiting for the player to be caught. With **Complete BOLOs as bans** on (on **Game features**), staff who may run bans in game get **Complete as ban** on active BOLOs: Jellyn bans the player in game, logs the ban and marks the BOLO done. Jellyn can also ban players with an active BOLO as soon as they join; see [Automations](/erlc/automations).
Source: https://docs.jellyn.xyz/moderation/punishments
---
# Moderator panel
> The screen staff keep open while they moderate. Who is in game, the punishment form, what is happening, and a shortcut for everything.
Open it from your server's card on [your dashboard](https://jellyn.xyz/dashboard): **Moderator panel**.
## The layout
**You**: your shift. **Quick actions**. **In game now**: who is in your server; click someone for their card.
The **punishment form**, and **What's happening**: joins, kills, commands and calls, newest first.
**Player logs**: the newest punishments, with **Load more**.
What's happening shows the newest 15 entries, and its search looks through every one. Only **In game now** scrolls inside its card; the rest of the panel scrolls like a page.
## The player card
Click a player in **In game now**, in a log, or anywhere their name shows.
- **In game** (when they are in the server and you may run commands): **Refresh** (a fresh character where they stand), **Respawn**, **Kill**, **Kick** and a private message.
- **Actions**: log a punishment, ban them (management), and **Message on Discord**.
- **Their punishment log**, last.
**Message on Discord** shows when the player connected their Roblox account to Jellyn and your server knows them. Jellyn sends it as a card with your server's name, and a line saying who sent it. Each person can send ten every ten minutes; the audit log records who was messaged, not what was said.
There is no way to change someone's in-game rank from the website. Ranks are given in game.
## Requesting more staff
**Request staff** in **Quick actions** (or in the command palette) asks for more staff to come on. Give a reason, and Jellyn posts it in your channel with how many staff are on shift and, with ER:LC linked, how many players and staff are in game.
Management turns it on under **Staff requests** on the **Sessions** page: the channel, a cooldown (5 to 120 minutes), the roles to ping and who may send one. After a request, nobody can send another until the cooldown is over.
## Keyboard shortcuts
Press ? in the panel to see them all. On a Mac, ⌘ stands in for Ctrl.
| Shortcut | Does |
| --- | --- |
| / | The **command palette**: shift actions, quick actions, the punishment log and the players in game |
| Ctrl S | Start your shift |
| Ctrl B | Take a break, or come back |
| Ctrl E | End your shift |
| Ctrl I | Jump to the player field of the punishment form |
| Tab | Take the suggested player |
| Ctrl P | Pick the punishment |
| Ctrl Enter | Log it |
| Ctrl F | Search the log |
| Ctrl U | Open the card of the player you typed |
| Ctrl X | Close a player's card, or clear the form |
| Ctrl and click a name | Open that player's card |
| Ctrl G | Hide the game from What's happening, or show it again |
Shortcuts never take a key a field needs: Ctrl X with text selected still cuts, and / and ? only work outside fields.
Source: https://docs.jellyn.xyz/moderation/moderator-panel
---
# Audit log
> Every change to your server on Jellyn, who made it and when.
The **Audit log** page lists what your team changed: settings, roles, records, forms, sessions and more, each with who did it and when. Search it, or filter it by kind and by person.
## What is recorded
- Settings and log channels changing, from `/setup`, `/settings` or the dashboard.
- Jellyn roles made, changed, given or taken back.
- Punishment logs, voids, infractions, promotions and leave decisions.
- Management's actions on applications and forms.
- Who was messaged on Discord from the moderator panel, and whether it was delivered (never what was said).
What applicants do (sending, changing and withdrawing an application) is recorded but left off the page, so the log stays about your team.
In Discord, settings changes and staff infractions are also posted in the **audit log channel** you picked in `/setup`. Keep that channel private to management.
## Clearing older entries
The server owner and admins see **Clear older entries** under the log. Pick how many days to keep (1 to 30), and the older entries are deleted after a few seconds, with Undo. A new entry records the clear and how many went.
Entries newer than the days you pick can never be deleted: the log is append-only, so nobody can hide a recent change.
Source: https://docs.jellyn.xyz/moderation/audit-log
---
# Connect your ER:LC server
> Link your ER:LC private server so Jellyn can read it live and run commands in game.
Linking your private server lets Jellyn see who is in game, read the commands, kills and joins, and send commands back: messages, kicks, bans, refreshes and more. Jellyn talks to your server through the official ER:LC API.
## Link a server
In ER:LC, open your private server's settings and copy its **API key** (ER:LC calls it the server key). Keep it secret: it lets whoever has it run commands in your server.
On your server's **ER:LC** page, press **Link a server** and paste the key. The server owner or an admin can do this (or anyone with the **ER:LC connection** permission).
Press **Authorize Jellyn on ER:LC**. It opens ER:LC's own page: the private server's owner signs in with Roblox there and approves Jellyn.
Back on the ER:LC page, press **Check now**. Jellyn sends the hint `:h Jellyn is connected to this server.` in game. When ER:LC takes it, the authorize button goes away.
ER:LC only takes commands from apps the private server's owner has authorized. Until then, every command Jellyn sends fails with **error 4000**, *You are not authorized to perform this action on this server*: unbans, kicks, messages and rank changes alike. Reading the server works without it.
## More than one server
A server on Jellyn links up to **5** ER:LC servers, or **100** with Jellyn+. Each linked server keeps its own ER:LC settings: game features, the map's rules, team restrictions, AFK checks and the automations. Switching to another server brings back its settings, and keeps the ones you left.
## The ER:LC page
Once linked, the **ER:LC** page shows:
Players and the most it takes, the queue, staff in game, and **Join server**, which opens the private server from its join code.
Click someone for their card. Any player can be looked up by Roblox username, in game or not.
Run a command in game. Presets fill it in: message everyone, hint, private message, kick, kill, refresh, respawn, teleport, unban.
Joins, kills, commands and moderator calls, 20 at a time.
ER:LC takes one command every 5 seconds. Jellyn queues what it sends, so a burst of commands goes out one after the other.
## When something is wrong
| What the page says | What to do |
| --- | --- |
| **Key rejected: link a new one** | The key was changed or revoked in ER:LC. Copy the new key and link the server again. |
| **Offline: nobody is in the server** | Nothing is wrong: the private server is empty. |
| **Authorize Jellyn on ER:LC** | ER:LC refused a command (error 4000), or none has been sent yet. Authorize, then **Check now**. |
For more, see [Troubleshooting](/reference/troubleshooting#er-lc-commands-fail-with-error-4000).
Source: https://docs.jellyn.xyz/erlc/connect
---
# Sessions
> Polls, startups, boosts, planned sessions and shutdowns, posted for your players, with numbers for every session you ran.
A **session** is a stretch of roleplay on your ER:LC server. Jellyn posts each step of it in your Discord, pings the roles you pick, and counts how it went.
## Running a session
`/session poll` asks who will join. Players vote with a button; when enough have voted, start the session. `votes:` changes how many are needed this time.
`/session start` posts the startup and pings your session roles. Startup, boost and full-server posts have a **Join the server** button with the join code.
`/session boost` asks for more players while it runs, at most every 10 minutes.
`/session shutdown` ends it, or cancels the open poll. It can end everyone's shifts and shut the game down too, if you set it up that way.
`/session status` shows the current session, and `/session schedule in:2h note:Training night` plans one ahead: Jellyn posts when it will be, in each reader's own time zone.
The same buttons are on the **Sessions** page of the dashboard.
## The Sessions page
For all staff:
- **The session right now** (closed, poll open or live) with its numbers and buttons: open a poll, start now (with another area of play), boost, shut down (press twice).
- **Coming up**: sessions planned ahead, a form to plan one, and a way to cancel each. A planned session is a minute to 30 days ahead, 10 at a time.
- **Analytics**: tiles with a small line of each number over time.
- **Past sessions**: open one for its players, the most at once, the average, mod calls, commands, players over time, and what happened when.
For the **Session settings** permission, saved together:
- Where Jellyn posts, and who startups, polls and boosts ping (roles, and @here or @everyone).
- Pinging everyone who voted, and the votes needed.
- Posting once the server is full.
- Ending shifts at shutdown.
- **Ending the session once the server stays empty** (on by default: only after people played, once nobody was in game for 3 minutes).
- **Shutting the game down too**: a `:m` message, then `:kick all` 10 seconds later.
- Kicking players who aren't moderators while no session runs.
- The usual **area of play**, and what happens outside it (see [Automations](/erlc/automations#area-of-play)).
## Channel locks
Up to 5 text or forum channels can be **locked** while no session runs: hidden, or read-only, and opened again when a session starts. Jellyn keeps how each channel was and puts it back exactly.
Jellyn needs **Manage Roles** to lock channels. It only ever changes channels of your own server.
## Your own posts Jellyn+
Write your own startup, poll, planned session, full server, shutdown and boost posts: each a title, text, small print, colour and picture, with a preview. Messages when a channel locks or opens are Jellyn+ too.
Words in braces are filled in when Jellyn posts:
| Word | Becomes |
| --- | --- |
| `{user}` | Who ran it |
| `{players}`, `{maxplayers}`, `{queue}` | Players in game, the most it takes, the queue |
| `{servername}`, `{code}`, `{joinlink}` | The server's name, its join code, and a link to join |
| `{aop}` | The area of play |
| `{votes}`, `{votesrequired}` | Votes so far, and votes needed |
| `{time}` | Now, as a Discord timestamp |
| `{scheduledtime}` | When a planned session starts |
`{time}` and `{scheduledtime}` take a Discord timestamp style after them: `t`, `T`, `d`, `D`, `f`, `F` or `R` (relative, like *in 2 hours*). See all of Jellyn's words on [Placeholders](/developers/placeholders).
Source: https://docs.jellyn.xyz/erlc/sessions
---
# Game features
> What Jellyn does with what it reads from your ER:LC server. Logs in Discord, logging from in game, automatic shifts, voice channels, weather and more.
**Game features**, under ER:LC in the dashboard, is where you turn on what Jellyn does with your live server. You need your [ER:LC server linked](/erlc/connect).
## Getting events from ER:LC
Jellyn reads your server through the ER:LC API about once a minute. For things that should happen within seconds, connect ER:LC's events to Jellyn too:
- **ER:LC events webhook**: a secret address to paste in your private server's settings. It is what lets players type `;` commands to Jellyn, like `;refresh` and `;vc`.
- **ER:LC webhooks in Discord**: the channels where ER:LC's own Discord webhooks post command logs, kicks and bans. Jellyn reads new posts there as they arrive, so `:log` and command alerts happen within seconds.
The details are on [ER:LC webhooks](/developers/erlc-webhooks).
## Logs in Discord
Joins, leaves, kills, answered mod calls and 911 calls, each posted to a channel you pick. With Jellyn+, in your own words.
## Logging from the game
Staff with a verified Roblox account log punishments without leaving the game:
```erlc
:log kick Sam_RP Combat logging
:log vehicle Sam_RP
:log vehicle ABC1234
```
- `:log type name reason` logs a punishment (on by default).
- Kicks and bans staff run in game can be logged by themselves.
- `:log vehicle Name` or `:log vehicle PLATE` answers in game with whose vehicle it is.
## Shifts for the whole team
Shifts start when staff with a verified Roblox account join the game (only on the teams you pick, if any, and as the shift type you pick), and end when they leave, after the minutes you set. Each person can also turn it on just for themselves in their account settings. See [Shifts](/team/shifts#shifts-from-er-lc).
## Alerts for staff
- **Commands off shift**: staff running commands while not on shift are posted with pings, with a cooldown. You can leave out Discord and Jellyn roles you pick.
- **Commands on many players**, like `:ban all`, `:kick others` or several names at once, are posted the same way.
- With Jellyn+, these alerts can use your own words: `{staff}`, `{player}` and `{commands}`.
## Players and voice
Give voice channels short names, and players type `;vc name` in game to be moved there. A channel can be for staff only. More ways to use it:
```erlc
;vc s1
;vc nearby
;vc RobloxUsername
```
`;vc nearby` joins the nearest linked player in voice, and `;vc RobloxUsername` that player's channel. The player has to be in voice already, with their Roblox account linked to Jellyn. Jellyn needs **Move Members**, **View Channel** and **Connect**.
Players type `;refresh` (or `;rf`) in game, or run `/erlc refreshme` in Discord, for a fresh character where they stand. Set a cooldown; a Roblox account gets one refresh every 2 minutes across every server.
A private message in game for players who join.
Your server's weather and time follow a real city, checked every 10 minutes.
Jellyn+ Voice channels named after the players in game and in the queue, renamed at most every 5 minutes.
Jellyn+ A private message in game for a player when staff log a warning for them, with its reason.
## Raid rollback
When someone with too much power runs riot, **Raid rollback** finds a player's bans, unbans and rank changes in ER:LC's recent command logs, and runs the opposite of the ones you pick. It needs the **Bans and ranks in game** permission.
Commands run on everyone at once (like `:ban all`) can't be undone player by player.
## What Jellyn sent
At the bottom of the page, **What Jellyn sent in game** lists the last commands Jellyn sent, and whether ER:LC took them.
Source: https://docs.jellyn.xyz/erlc/game-features
---
# Automations and map rules
> Rules Jellyn keeps in your ER:LC server by itself. Safe zones, the area of play, team restrictions, AFK checks and more.
Automations watch your ER:LC server and act on what they see, so your staff don't have to. They are on the **Automations** page under ER:LC, and the map's rules are beside the map in the **Map** editor.
Jellyn checks the rules about once a minute. Commands it sends in game go out 5 seconds apart, as ER:LC asks. What happened is listed under each rule, kept for 30 days.
## Safe zones
A kill where the killer or the victim is inside a **safe zone**:
1. warns the player first (set how many warnings; 0 acts at once),
2. then kicks or bans them,
3. and logs a punishment, if you ask it to.
It works all the time, session or not. The warning says *Stop killing people within a safezone. Next violation will be a {next}.*; write your own (up to 170 characters) with `{next}`, `{area}`, `{player}`, `{warning}` and `{warnings}`.
## Area of play
Only while a [session](/erlc/sessions) runs: a player outside the **area of play** for longer than you allow gets a warning a minute, then is respawned, made wanted or kicked. Moderators can be left alone.
## Team restrictions
For each team in game, who may be on it:
- a Discord account in your server,
- with Jellyn+, the roles they need,
- a message before they are taken off the team,
- and the fewest players before the rule applies.
## AFK checks
Off until you turn it on. Staff on shift who haven't moved or run a command for a while get an alert, then an escalation. With a private message that has `{{token}}` in it, they answer `:log CODE` in game to show they are there.
## More automations
| Automation | Does |
| --- | --- |
| **Rejoined after a kick** | Punishes a player who comes back after being kicked. Staff who may void punishments can let one player back in. |
| **BOLO player joined** | Acts when a player with an active BOLO joins; set it to ban to catch them at the door. |
## The map editor Jellyn+
**Map**, under ER:LC, is where management draws on the ER:LC map:
- **Areas of play**: where roleplay happens in a session.
- **Safe zones**: where killing is not allowed.
Press **Create custom**: a new area with one rectangle. Give it a name and a colour.
Drag a boundary to move it, and its corners to reshape it. **Add rectangle** and **Add polygon** add more boundaries (a polygon has 3 to 32 points). Corners snap to other corners and the map's edges; hold Shift to place them freely.
Changes wait for the bar at the bottom: press **Save**.
- Up to 40 areas of each kind, 10 boundaries each.
- Near a polygon's edge a point appears: drag it to add a point. Ctrl and click a point removes it.
- **Open AOP image** gives the map with the area drawn on it and the rest darker, to download or share with players.
- The map is ER:LC's official one, for the season you pick (fall, snow, spring or summer), with postal codes when zoomed in.
Pick your usual area of play in the **Sessions** settings; staff can pick another when they start a session.
Source: https://docs.jellyn.xyz/erlc/automations
---
# Playtime, priority and /erlc
> Commands for everyone in your server. The live server, time in game with its rewards, and asking for a priority.
## /erlc
| Command | Who | Shows |
| --- | --- | --- |
| `/erlc info` | Everyone | Players and the most the server takes, the queue, staff in game and on shift, players per team, a **Join** button and **Refresh** |
| `/erlc players` | Staff | Who is in game, by team, with callsigns |
| `/erlc refreshme` | Everyone | Refreshes your own character in game (set up on [Game features](/erlc/game-features)) |
## Playtime
Jellyn counts each player's **time in game** in your server, by their verified Roblox account. Set **reward levels** on **Game features**: reaching one gives its role, and Jellyn says so in the channel you pick.
```discord
/playtime me
/playtime me member:@River
/playtime rewards
/playtime top
```
- `/playtime me`: your time in game, your place and your level, and how far the next one is (or someone else's, with `member:`).
- `/playtime rewards`: every level, its role and its perks.
- `/playtime top`: who played the most.
Time only counts for players who verified their Roblox account with Jellyn. See [Roblox verification](/community/verification).
## Priority
A **priority** is a big scene a player asks staff for first, like a heist or a pursuit. Only one runs at a time, with a wait before the next.
In game with `;priority`, or on the [Priority requests](https://jellyn.xyz/priority) page of the website.
The request is posted in the priority channel with **Approve** and **Deny**. The player gets a DM, and is told in game when they asked there.
Approving from Discord also starts the in-game timer, when the server has one.
`/priority` shows the board, as the board channel does: whether a priority runs now and until when, the wait before the next, the scenes approved today, how to ask, and the zones where no priority may happen.
Source: https://docs.jellyn.xyz/erlc/playtime-priority
---
# Applications
> Forms for staff applications and ER:LC ban appeals, with reviews, quizzes, staged decisions and file uploads.
Applications are part of Jellyn+. See [Plans and Jellyn+](/get-started/plans).
People apply on the Jellyn website. In Discord, `/apply` lists your server's open applications and links to them.
## Making a form
On the **Applications** page, press **New form**. A form is an **application** or an **ER:LC ban appeal** (pick it under Settings, or start from the *ER:LC ban appeal* template). Build it from questions:
Short and long answers, and a Roblox username or ID.
Multiple choice, dropdowns, checkboxes, scales, ratings, dates and times.
1 to 5 pictures or PDFs, 4 MB each.
### Who can apply
Besides the roles a form is for, you can ask for:
- a number of **days in the Discord server**,
- no **roles that block** applying,
- at most a number of **punishments logged** against their Roblox account,
- and membership of a **Roblox group** (checked with Roblox when they open the form).
### Quizzes
Multiple choice, dropdown, checkbox and short answer questions can have **correct answers and points**. The score is kept with the application, and shown to the applicant at once or once it is decided. Applicants never see the correct answers.
## Reviewing
New applications show on the form's **Responses** tab. Filter by Waiting, Staging, Accepted, Denied and Withdrawn.
- **Response presets**: up to 25 named notes. Typing a preset's name as the note or reason sends its text.
- **Editors and reviewers**: Discord roles a form lets edit it, or review and publish its applications, without the server's Applications permission. They see only those forms.
- **Hints of pasted or AI-written answers** (on by default): which written answers had text pasted in, how long the form was open, and phrases common in AI writing. They are hints, never a verdict, and applicants never see them.
### Staging decisions
With **Stage decisions** on, **Accept** and **Deny** put an application in **Staging**: nobody is told and no roles change until someone **publishes** it, one at a time or every staged one at once. **Back to review** takes a staged decision back.
### When a decision goes out
- Roles are **given and taken away**, on acceptance and on denial, as you set them.
- The decision is posted in the form's channel (or your server's applications channel).
- Accepted applicants can be added to your **team on Jellyn** (they show as *Joined by: Application*).
- For a **ban appeal**, accepting runs `:unban ` in your linked ER:LC server, and the DM and the decision card say whether it worked.
## Deleting
**Delete every response** (type `DELETE RESPONSES` to confirm) keeps the form. **Deleting a form** deletes its responses with it: every application sent with it and their files, everywhere. Both wait a few seconds with Undo.
What Discord already has stays: the card in the applications channel (it says who applied, never the answers), and a copy an applicant asked for in their DMs.
Source: https://docs.jellyn.xyz/community/applications
---
# Documents
> Write your handbook, rules and SOPs where your staff already are, and share each one with exactly who should see it.
**Documents** is where your server writes for its staff. Everyone on the team can open it; the **Resources** permission manages everything in it.
## Workspaces and folders
A server has up to **10 workspaces**, each with folders (up to 3 deep) and documents (up to 1,000 in all). Drag a document or folder onto a folder to put it inside, or above or below a row to reorder; **Move to…** does the same from the keyboard. Deleting a folder moves what was in it up a level.
## Sharing
Each workspace, folder and document can be shared with **people**, **Discord roles**, **Jellyn roles**, **everyone on the team** or **management**, each as a **reader** or an **editor**. A folder or document **follows its folder** by default, or has its own sharing.
**With the link**: anyone on your Jellyn team who has the link can read it, or edit it.
**With the link**: anyone in your Discord server who has the link can read it, signed in with Discord, while they are in the server. Good for public rules.
**Make a new link** stops the old one working. Whoever wrote a document can always edit and share it.
## Writing
The editor has menus (File, Edit, Insert, Help) and a ribbon for styles, fonts, colours, lists, alignment, links, pictures and tables. Type Markdown and it formats as you go:
| Type | Gets |
| --- | --- |
| `#`, `##` and a space | A heading |
| `-` and a space | A list |
| `1.` and a space | A numbered list |
| `>` and a space | A quote |
| Three backticks | A code block |
| `/` on an empty line | What can be inserted: pictures, tables, a Discord invite, an ER:LC server card, a hint box |
It saves by itself a second after each change. If someone else saved in between, nothing is overwritten, and it says so.
## Versions and history
- A **version** is kept when someone starts changing a document, and every 10 minutes while they do (the last 40). **Put this version back** keeps what was there as a version too.
- **Who opened and changed it** lists opens, edits, renames, moves and sharing changes.
## Bringing in a GitBook
Export a GitBook space as Markdown and pick its `.md` files (up to 50 at once): each becomes a document, its first heading the title. GitBook's hints become hint boxes, and its tabs headings.
Documents are made safe on the server: no scripts, styles or pictures from other sites get through. Pictures are uploaded into the document (PNG, JPEG, GIF or WebP, up to 3 MB) and only shown to whoever may read it.
Source: https://docs.jellyn.xyz/community/documents
---
# Roblox verification
> Members connect their Roblox account to Jellyn once. Jellyn then sets their nickname and gives the verified role in every server that turns verification on.
Verification ties a member's Discord account to their Roblox account. Jellyn uses it everywhere: to know which staff member is which player in game, to count playtime, to log from in game, and to fill in nicknames.
## For members
On Jellyn, open **Account settings** and connect your Roblox account. Roblox asks you to sign in and approve; Jellyn only reads your Roblox name and ID, and your Roblox password never leaves Roblox.
In a server that turned verification on, your nickname and the verified role are updated within a few seconds. Or press **Update me** in the server's verification channel, or run `/verify`.
`/verify` also shows where you stand, and links you to Roblox sign-in if you haven't connected yet. You verify once: every server on Jellyn sees the same Roblox account.
## Turning it on for your server
Verification is on the **Discord** page of the dashboard, under **Verification**.
| Setting | What it does |
| --- | --- |
| **Verify members** | Turns verification on. Nicknames and the role update within a few seconds of someone verifying, while the bot is online. |
| **Verify automatically** | Members who verify on Jellyn, or join already verified, get their nickname and role without pressing anything. Otherwise they press **Update me** or run `/verify`. |
| **Verification channel** | Where the verification message goes. Press **Post the verification message** to put it up. |
| **Nickname** | Their Roblox username, their Roblox display name, *Display name (@username)*, or leave nicknames alone. |
| **Verified role** | The role verified members get. |
Jellyn can only give roles below its own, and Discord doesn't let bots change the server owner's nickname. Put Jellyn's role above the verified role in **Server Settings → Roles**.
With Jellyn+, the verification message can be your own, and you get more ways to protect it.
Source: https://docs.jellyn.xyz/community/verification
---
# Discord settings
> The Discord page of your dashboard. Whether the bot has what it needs, where it posts, verification, shift roles and your commands.
The **Discord** page has five parts, in the sidebar under Discord: **Bot**, **Channels**, **Verification**, **Shift and leave roles** and **Commands**. It needs the **Discord** permission.
## Bot
Whether the Jellyn bot is in your Discord server, and whether it has what it needs. If something is missing, it says what.
## Channels
Every place Jellyn posts, the channel it posts in, and whether it **can** post there right now.
- Click the name under **Used for** to pick another channel, or **Not set** to stop posting there.
- A save changes only that one channel, and the table checks again after it.
- Log channels need the **Server settings** permission; the Sessions and Applications channels need their own section's permission.
| Channel | What goes there |
| --- | --- |
| Audit log | Settings changes and staff infractions. Keep it private to management. |
| Shift log | Shift starts and ends. |
| Punishment log | Punishment records, with their evidence files. |
| LOA | Leave requests, for management to approve or deny. |
| Announcements | Session announcements, when sessions have no channel of their own. |
| Promotions | Promotions logged with `/promotion`. |
"Can Jellyn post?" says no? Give Jellyn **View Channel**, **Send Messages**, **Embed Links** and **Attach Files** in that channel, in its permission settings in Discord.
You can also change the roles and log channels from Discord with `/settings` (management), which `/setup` started.
## Verification
Roblox verification for your server: see [Roblox verification](/community/verification).
## Shift and leave roles
A role while someone is on shift, on a break or on leave, and a nickname prefix: see [Shifts](/team/shifts#shift-and-leave-roles).
## Commands
Jellyn+ Every slash command is listed. Someone with the **Server settings** permission can turn a command **off**, or give it an access preset:
| Preset | Who can use it |
| --- | --- |
| Jellyn default | Whoever the command is for |
| Staff only | Staff and above |
| Management only | Management and above |
| Server admins only | The owner and Discord admins |
- A preset only adds a restriction: the command's own checks still apply.
- `/setup` and `/settings` can never be turned off or restricted.
- A command that is off says so when someone runs it, with where to turn it back on. Its records and settings stay.
Without Jellyn+, the page says what the plan adds, and choices you save wait until the server has it.
Source: https://docs.jellyn.xyz/community/discord
---
# Slash commands
> Every Jellyn command in Discord, what it does and who can use it.
Run `/help` in your server to see these grouped, with the ones you can use. Commands work in servers with Jellyn in them; most need `/setup` to have been run first.
With Jellyn+, management can turn any command off or keep it to staff, management or admins on the [Discord page](/community/discord#commands).
## General
| Command | Who | Does |
| --- | --- | --- |
| `/help` | Everyone | What Jellyn can do and how to start |
| `/ping` | Everyone | Checks Jellyn is online and responsive |
| `/verify` | Everyone | Verify your Roblox account and update your nickname. See [Roblox verification](/community/verification) |
| `/apply` | Everyone | This server's open applications, to apply. Jellyn+ |
| `/jella` | Everyone | Ask the server's assistant something, or ask it to act in game. Jellyn+ |
## Setup
| Command | Who | Does |
| --- | --- | --- |
| `/setup` | Manage Server | Choose Jellyn's staff roles and log channels |
| `/settings` | Management | View and change Jellyn's roles and log channels |
## Shifts and activity
| Command | Who | Does |
| --- | --- | --- |
| `/shift` | Staff | Your shift panel: start, take breaks and end your shift. Management add `member:` for someone else's |
| `/activity` | Staff | Shift time, shifts and punishments logged, for you or another staff member (`staff:`, `wave:`) |
| `/leaderboard` | Staff | Rank staff by shift time, shifts or punishments logged in a wave (`metric:`, `wave:`) |
## Sessions
| Command | Who | Does |
| --- | --- | --- |
| `/session poll` | Staff | Ask who will join before starting (`votes:` needed) |
| `/session start` | Staff | Start the session and ping the session roles |
| `/session boost` | Staff | Ask for more players while it runs |
| `/session schedule` | Staff | Plan a session: `in:2h`, with an optional `note:` |
| `/session shutdown` | Staff | Shut the session down, or cancel the open poll |
| `/session status` | Staff | The current session |
| `/priority` | Everyone | The priority board: what runs now, the wait, and how to ask |
## ER:LC
| Command | Who | Does |
| --- | --- | --- |
| `/erlc info` | Everyone | Players, queue, staff and the join code |
| `/erlc players` | Staff | Who is in game, by team |
| `/erlc refreshme` | Everyone | Refresh your own character in game |
| `/playtime me` | Everyone | Your time in game, your place and your level (`member:` for someone else's) |
| `/playtime rewards` | Everyone | Every playtime level, its role and its perks |
| `/playtime top` | Everyone | Who played the most |
## Moderation
| Command | Who | Does |
| --- | --- | --- |
| `/punishment log` | Staff | Record a punishment you gave in game (`username:` to fill in the player) |
| `/punishment view` | Staff | Show one case (`case:`) |
| `/punishment history` | Staff | A player's recent cases (`username:`) |
## Staff management
| Command | Who | Does |
| --- | --- | --- |
| `/loa request` | Staff | Ask management for leave of absence |
| `/loa status` | Staff | Your leave, or a staff member's (management, `staff:`) |
| `/loa list` | Management | Requests to review, and who is on leave |
| `/infraction issue` | Management | Issue an infraction to a staff member. Jellyn+ |
| `/infraction view` | Staff | Your own infractions, or a staff member's (management). Jellyn+ |
| `/infraction revoke` | Management | Revoke an infraction by its number (`id:`). Jellyn+ |
| `/promotion log` | Management | Log a promotion and announce it |
| `/promotion history` | Staff | Your promotions, or a member's (management) |
## Not released yet
These are listed in Discord, but work only where the product is out; anyone else is told it is coming.
| Command | Does |
| --- | --- |
| `/lab run` | Run a [Jellyn Lab](/developers/lab/overview) system by name |
| `/department` | Link a Discord server as a department of your main server |
Source: https://docs.jellyn.xyz/reference/commands
---
# Troubleshooting
> Fixes for the problems servers run into most. Permissions, ER:LC commands, missing commands and roles that won't change.
First, check the [status page](https://status.jellyn.xyz): if Jellyn or ER:LC is having a bad day, it says so there.
## Jellyn can't post in a channel
On the **Discord** page, the **Channels** table shows whether Jellyn can post in each channel. If it can't:
1. Open the channel's settings in Discord, then **Permissions**.
2. Give Jellyn's role (or Jellyn itself) **View Channel**, **Send Messages**, **Embed Links** and **Attach Files**.
3. Back on the **Discord** page, the table checks again.
For channels Jellyn makes or locks itself (like session channel locks), it also needs **Manage Roles**.
## ER:LC commands fail with error 4000
*You are not authorized to perform this action on this server* means ER:LC hasn't been told Jellyn may run commands there.
1. On the **ER:LC** page, press **Authorize Jellyn on ER:LC**.
2. The private server's **owner** signs in with Roblox on ER:LC's page and approves Jellyn.
3. Press **Check now**. When ER:LC takes the test message, it's fixed.
Reading the server (players, logs) works without this; only commands need it. See [Connect ER:LC](/erlc/connect).
## The ER:LC page says the key was rejected
Your private server's API key was changed or revoked in ER:LC. Copy the new key from ER:LC and link the server again with **Link a server**.
## A command doesn't show in Discord
- Check Jellyn is still in your server, with the **Use Application Commands** permission for the members.
- Discord can take a minute to show commands after Jellyn joins. Reload Discord with Ctrl R.
- With Jellyn+, someone may have turned the command off on the [Discord page](/community/discord#commands). It says so when run.
## A command says the server isn't set up
Someone with **Manage Server** needs to run `/setup` first. See the [Quickstart](/get-started/quickstart).
## Roles or nicknames don't change
Shift roles, leave roles, the verified role and nickname prefixes all need:
- **Manage Roles** and **Manage Nicknames** for Jellyn,
- Jellyn's own role **above** the roles it gives, in **Server Settings → Roles**.
Discord never lets a bot change the server owner's nickname, so the owner keeps theirs.
## Someone can't see a page
What someone can open comes from their roles: the staff and management Discord roles from `/setup`, and their [Jellyn roles](/team/roles). Give them a Jellyn role with the permission for that page. Pages of a plan the server doesn't have don't show at all.
## Shifts don't start when staff join the game
- **Shifts for the whole team** has to be on, on **Game features**, or the person turns it on for themselves in their account settings.
- They need a [verified Roblox account](/community/verification), and to be on one of the teams you picked, if you picked any.
- Your [ER:LC server](/erlc/connect) has to be linked, and someone has to be in it for Jellyn to see them.
## A feature says it needs Jellyn+
That feature is part of [Jellyn+](/get-started/plans). Settings you save for it are kept, and work once the server has the plan.
Source: https://docs.jellyn.xyz/reference/troubleshooting
---
# Build on Jellyn
> Make Jellyn do more for your server. Your own slash commands and systems, events from your ER:LC server, and words that fill themselves in.
You don't need to run any code to build on Jellyn. Everything here is set up on the website and runs on Jellyn's side.
Build your server's own slash commands, buttons and systems out of blocks on a canvas.
Send your private server's events to Jellyn the moment they happen.
Every `{word}` Jellyn fills in, in posts, warnings and Lab blocks.
These docs as Markdown and llms.txt, for ChatGPT, Claude and your own tools.
## How Jellyn runs your systems
```text title="How it fits together" nocopy
Your Discord server ──▶ Jellyn bot ──▶ Jellyn Lab systems ──▶ messages, roles, in-game commands
Your ER:LC server ──▶ events webhook / ER:LC API ──▶ automations, logs, Lab triggers
The dashboard ──▶ settings, rules and systems you save
```
- **Systems run on Jellyn.** Jellyn Lab systems, automations and game features run on Jellyn's servers, with your server's own limits. Nothing runs on your computer, and no system can reach another server.
- **One server only.** Every block acts in the system's own Discord server and its linked ER:LC servers. There is no way to point a system at another server, by design.
- **Safe by default.** Lab turns off mentions in everything it sends, never gives roles with Administrator or above its own, and never runs rank changes or commands on everyone at once in game.
## A public API
Jellyn doesn't have a public API or developer tokens yet. The website talks to its own API for its pages, signed in as you; that API isn't a stable contract and changes without notice. Build with Jellyn Lab and webhooks instead.
Source: https://docs.jellyn.xyz/developers/overview
---
# Use the docs with AI
> Every page of these docs as Markdown, an llms.txt of the whole site, and a menu to open a page in ChatGPT or Claude.
These docs are written to be read by people and by AI tools alike. Ask an assistant about Jellyn and give it the pages, so its answers come from the docs and not from guesses.
## On every page
The **Copy page** button at the top of each page copies it as Markdown. Its menu has more:
| Option | Does |
| --- | --- |
| **Copy page** | Copies the page as Markdown, ready to paste into a chat |
| **View as Markdown** | Opens the page as plain Markdown |
| **Open in ChatGPT** | Starts a ChatGPT chat that reads the page |
| **Open in Claude** | Starts a Claude chat that reads the page |
## Markdown for every page
Add `.md` to a page's address for it as Markdown:
```text
https://docs.jellyn.xyz/team/shifts.md
https://docs.jellyn.xyz/index.md
```
## llms.txt
Following the [llms.txt](https://llmstxt.org) convention, two files describe the whole site:
Every page with a line about it, grouped as the docs are, linking to each page's Markdown.
All of the docs in one file, for tools that read everything at once.
Building your own assistant for your staff team? Give it `llms-full.txt`, and tell it which of your server's settings differ from Jellyn's defaults.
Source: https://docs.jellyn.xyz/developers/ai-tools
---
# Jellyn Lab
> Build your server's own slash commands, buttons and systems out of blocks on a canvas, and Jellyn runs them in your Discord and your ER:LC server.
Jellyn Lab is in early access and not released yet. When your server is part of it, **Jellyn Lab** shows in your dashboard's sidebar. To hear when it opens up, turn on **Jellyn Lab Updates** under [Notifications](https://jellyn.xyz/notifications) on the website.
Jellyn Lab lets a server build two kinds of **systems**:
Slash commands only your server has, like `/welcome` or `/warn`, with their own options. Jellyn adds them to your Discord when you turn them on.
Systems that start by themselves: a shift, a punishment, a player joining ER:LC, an in-game command, a schedule, or a button Jellyn posts.
A system is a **trigger** (what starts it) and **blocks** joined on a canvas: **actions** that do something, and **conditions** that send the run one way or another.
## Your first system
In your server's dashboard, open **Jellyn Lab**, and choose **New command** or **New event**.
Pick blocks from the list, or drag them onto the canvas. Drag from a block's dot to the next block, or to empty space to pick a new one. Change each block in the panel on the right.
Saving turns a system off until you turn it on again from the list. A command shows up in your Discord within a few seconds. A button system needs **Post button**; a website system has **Run now**.
**Runs** shows how each run went, and why one stopped or failed.
## The builder
- **Block list**: tabs for **Options** (a command's options), **Actions** and **Conditions**, with search (press /), favourites and a compact mode.
- **Canvas**: the start block is raspberry, actions are blueberry, conditions are mint (with a red False output), and options are grape. `+` on a line inserts a block there; right-click to copy, duplicate, group or delete. Undo, redo, find, arrange, zoom and area select are in the toolbar.
- **Error paths**: an action block can have an **Error** output. When it fails, the run goes on there, with `{error}`, instead of stopping.
- **Custom data**: variables your systems remember between runs (text, number, collection, object), for the whole server or one per member or channel, written `{var.name}`.
- **Templates**: save picked blocks under a name and put them into any system of the same server.
- **Share codes**: a `JLAB_…` code copies a system to another server as a draft. Stored values, runs, channels and roles are never included.
## Limits
| | Early access | Labs+ |
| --- | --- | --- |
| Systems | 3 | 25 |
| Blocks a system | 8 | 30 |
| Runs an hour | 30 | 300 |
| Waiting in a run | 60 seconds | 300 seconds |
One run a server at a time. After a downgrade, only the oldest systems within the limit run.
## Safe by design
Lab turns off mentions in everything it sends, keeps channels and roles to your server, refuses managed and Administrator roles and roles above its own, and runs no code or web requests. A system started by an in-game command can't send another one, so systems can't set each other off forever.
Everything that can start a system, and what each gives the blocks.
Every action and condition.
Source: https://docs.jellyn.xyz/developers/lab/overview
---
# Triggers
> What can start a Jellyn Lab system, and the values each trigger gives its blocks.
Every system starts from one **trigger**. The trigger decides who the run is *for* (`{user}`) and which [values](/developers/lab/values) the blocks after it can use.
## People in Discord
| Trigger | Starts when | Gives |
| --- | --- | --- |
| **A slash command** | Someone uses your server's own command, with its options | `{user}`, `{user.access}`, `{channel}`, the options as `{option.name}` |
| **A button in Discord** | Someone presses the button Jellyn posted (**Post button**) | `{user}`, `{user.access}`, `{channel}` |
| **Picked in /lab run** | Someone picks the system by name in `/lab run` | `{user}`, `{user.access}`, `{channel}` |
| **Run from the website** | Someone presses **Run now** in Jellyn Lab | `{user}`, `{server}` |
**Who can use it**: a command, a button or `/lab run` can be for **everyone**, **staff** or **management**.
### Command options
A command takes up to 10 **options**: text, number, true / false, member, channel or role. Required options come first, as Discord needs. Use them as `{option.reason}`; a member, channel or role also gives `{option.member.id}` and `{option.member.name}`. An optional option left empty is an empty value.
A command name is 1 to 32 lowercase letters, digits, `-` or `_`. Jellyn's own command names are taken, and a server can't have two systems with the same command.
## Your team
| Trigger | Starts when | Gives |
| --- | --- | --- |
| **A shift starts** | A staff member starts a shift | `{user}` (the staff member) |
| **A shift ends** | A staff member ends a shift | `{user}`, `{shift.minutes}` |
| **A punishment is logged** | Someone logs a punishment | `{user}` (who logged it), `{player}`, `{case.number}`, `{case.action}`, `{case.reason}` |
| **A punishment log is voided** | Someone voids one | `{user}` (who voided it), and the case's values |
| **A staff infraction is issued** | Management issues one | `{user}` (who it is for), `{moderator}`, `{infraction.number}`, `{infraction.type}`, `{infraction.reason}` |
| **A staff infraction is revoked** | Management revokes one | the same as issued |
These start from the moment a system is turned on: what happened while it was off is not replayed.
## Your ER:LC server
| Trigger | Starts when | Gives |
| --- | --- | --- |
| **A player joins the ER:LC server** | Someone joins your private server | `{player}`, `{player.id}`, and `{user}` if they verified |
| **A player leaves the ER:LC server** | Someone leaves | the same |
| **Someone runs an in-game command** | A player types the command you choose, with `:` or `;` | `{player}`, `{command}`, `{user}`, `{user.access}`, and its arguments as `{arg.name}` |
In game, `{user}` is the Discord account the player verified on Jellyn, and empty when they haven't. In-game commands have more to them: see [In-game commands](/developers/lab/in-game-commands).
## On a schedule
| Trigger | Starts | Gives |
| --- | --- | --- |
| **On a schedule** | Every 10 to 1440 minutes | `{server}` |
## Every run
Whatever starts it, every run also has `{server}`, `{server.id}`, `{server.members}`, `{server.owner}`, `{time.now}`, `{time.date}`, `{time.unix}` and `{random}`. A run that is for someone also has `{user.avatar}`, `{user.tag}`, `{user.created}` and `{user.joined}`. See [Values](/developers/lab/values).
Source: https://docs.jellyn.xyz/developers/lab/triggers
---
# Blocks
> Every action and condition a Jellyn Lab system can use.
**Actions** do something. **Conditions** have a **True** and a **False** output, and send the run down one of them. Member blocks act on whoever the run is for, or on a member option of the command.
## Actions
| Block | Does |
| --- | --- |
| **Send a message** | Posts a message in a channel: a card, embeds or a layout, built in the Message Builder |
| **Reply** | Answers the person privately |
| **Send a DM** | Messages a member directly |
| **Open a form** | Asks up to five questions first; it must come straight after a command, a button or `/lab run` |
| **Send buttons or a menu** | Each choice runs its own blocks when someone picks it |
| **Send an image card** | A picture with their name and avatar, designed in Card Studio |
| Block | Does |
| --- | --- |
| **React to a message** | Adds an emoji to a message, or takes Jellyn's off |
| **Pin or unpin a message** | Pins a message to its channel, or unpins it |
| **Delete a message** | Deletes a message a block sent, or one by its ID |
| **Make a forum post** | Starts a post in a forum, with its tags |
| **Change a post's tags** | Adds, takes off or sets a forum post's tags |
| Block | Does |
| --- | --- |
| **Give a role** / **Take a role away** | Adds or removes a role, for a while if you like |
| **Change a nickname** | Sets a member's nickname |
| **Time out a member** | Mutes a member for a while. Needs Timeout Members |
| **Kick a member** | Removes them; they can join again with an invite |
| **Ban a member** | Removes them and stops them joining again, optionally deleting their recent messages |
| **Mute**, **Deafen** or **Move in voice** | Server mute or deafen a member in voice (or lift it), or move or disconnect them |
| Block | Does |
| --- | --- |
| **Purge messages** | Deletes a batch of recent messages in a channel, `{purged.count}` |
| **Create an invite** | Makes an invite link, `{invite.url}` |
| **Create a channel** | A new text or voice channel, `{created.channel}` |
| **Delete a channel** | Deletes a channel. It can't be undone |
| **Create a thread** | Starts a thread in a channel, `{thread}` |
| **Join** / **Leave a voice channel** | Jellyn sits in a voice channel, muted, or leaves it |
| Block | Does |
| --- | --- |
| **Log a punishment** | Adds an ER:LC punishment to your log, as the staff member who used it, with your server's rules |
| **Run an in-game command** | Sends any `:` command in your server, like `:h`, `:pm`, `:kick` or `:weather` |
| **Add a staff resource** | Saves a document for your staff |
| Block | Does |
| --- | --- |
| **Set a variable** | Changes a value Lab remembers |
| **Wait** | Pauses before the next block |
| **For each** | Repeats blocks for every player in game, player on a team, staff member on shift, or value of a collection |
| **Send an error log** | Stops here as failed, with your own words in the run history |
**Run an in-game command** never sends a rank change (`:admin`, `:mod`, `:helper` and their `:un` forms) or a command on everyone at once, like `:ban all`. That is checked when you save, and again once values are filled in, so a player typing `all` as a name can't make a `:kick all`.
## Conditions
| Block | Goes down True when |
| --- | --- |
| **If / Else** | A value compares as you set: equal to, less or greater than, contains, starts or ends with, a collection contains, and their opposites |
| **Chance** | By chance, 1 to 99% of the time, like a coin flip |
| **Has a role** | The member has a role |
| **In a channel** | It was used in one of 1 to 10 channels |
| **Staff level** | They are at least staff, management or admin in Jellyn |
## Every block
- **Error paths**: turn on an action's **Success and error paths** for an **Error** output. When the block fails, the run goes on there, with `{error}` and `{error.block}`.
- **Ignore errors**: the run goes on as if the block worked (handy for a DM to someone who doesn't take DMs).
- **Notes**: a line of helper text next to a block on the canvas.
Source: https://docs.jellyn.xyz/developers/lab/blocks
---
# Values
> The {words} a Jellyn Lab system fills in. Who used it, the server, the time, options, answers, custom data and what blocks made.
Write a value in braces in any block's words, like `Welcome, {user}!`, and Jellyn fills it in when the system runs. A value that a system can't have (one its trigger doesn't give) is refused when you save, so a typo never reaches Discord.
```text title="A message block"
Thanks for applying, {user.name}! You joined {server} on {user.joined}.
Reason given: {option.reason}
```
Values never ping anyone: mentions are turned off in everything Lab sends, so `{user}` shows as a mention without notifying them.
## The person and where
Who used it, or who the run is for.
Their Discord ID.
Their name in the server.
Their Jellyn access: `member`, `staff`, `management` or `admin`.
Their avatar.
Their Discord username.
When they made their Discord account.
When they joined the server.
The channel it was used in. Also `{channel.id}`.
## The server and the time
The server's name.
The server's ID.
How many members it has.
Its icon.
Its owner. Also `{server.owner.id}`.
Now, as Discord shows a time, in each reader's time zone.
Today's date.
Now, in seconds (a Unix time).
A random number from 1 to 100.
## From the trigger
| Value | Trigger | What it is |
| --- | --- | --- |
| `{option.name}` | A slash command | An option's value; members, channels and roles also have `.id` and `.name` |
| `{player}`, `{player.id}` | ER:LC joins, leaves, in-game commands, punishments | The Roblox player, and their Roblox ID |
| `{command}` | An in-game command | The whole command typed |
| `{arg.name}` | An in-game command | One of its arguments |
| `{shift.minutes}` | A shift ends | Minutes on shift |
| `{case.number}`, `{case.action}`, `{case.reason}` | Punishments | The case number, its type and its reason |
| `{moderator}`, `{moderator.id}` | Staff infractions | Who issued or revoked it |
| `{infraction.number}`, `{infraction.type}`, `{infraction.reason}` | Staff infractions | The infraction |
See [Triggers](/developers/lab/triggers) for which trigger gives what.
## From blocks
Some blocks make a value for the blocks after them:
| Value | Made by | What it is |
| --- | --- | --- |
| `{answer.id}` | Open a form | What they answered to the question with that ID; a member, role or channel picker also gives `.id` |
| `{component}`, `{component.id}`, `{component.label}` | Send buttons or a menu | The choice picked |
| `{item}`, `{item.name}`, `{item.id}`, `{item.team}`, `{item.index}` | For each | The one it is at, and which turn it is |
| `{message.id}`, `{message.channel.id}` | Any block that sends a message | The message it sent |
| `{purged.count}` | Purge messages | How many it deleted |
| `{invite.url}`, `{invite.code}` | Create an invite | The invite |
| `{created.channel}`, `{created.channel.id}` | Create a channel | The channel made |
| `{thread}`, `{thread.id}` | Create a thread | The thread made |
| `{post}`, `{post.id}` | Make a forum post | The post made |
| `{error}`, `{error.block}` | A block's Error path | What went wrong, and in which block |
## Custom data
Variables your systems remember between runs, made under **Custom data** in Jellyn Lab:
- **Kinds**: text, number, collection, object, and collection of objects.
- **Scope**: the whole **server**, or one for each **member**, **channel** or **player**.
- Written `{var.name}`. A member variable needs a run that is for someone; a channel one, a run in a channel.
Change one with the **Set a variable** block; check one with **If / Else**.
Source: https://docs.jellyn.xyz/developers/lab/values
---
# In-game commands
> Start a system when a player types your own command in ER:LC, with arguments, aliases, who may use it and a wait between uses.
ER:LC takes a command typed with `:` or `;` in front. A system started by **Someone runs an in-game command** can be written with either (`:duty` or `;duty`) and hears both.
```erlc
;report Sam_RP Random deathmatch at the bank
```
## Arguments
A command can take up to **5 arguments**: the words typed after it, in order, used in blocks as `{arg.name}`. The **last one takes the rest of the line**, so it can be a reason or a message.
| Typed | `{arg.player}` | `{arg.reason}` |
| --- | --- | --- |
| `;report Sam_RP Random deathmatch at the bank` | `Sam_RP` | `Random deathmatch at the bank` |
Required arguments come first. When one is missing the system doesn't run, and it can tell the player how to use it with a `:pm`:
```text Jellyn's words
Use it like this: :report
```
```text Your own words
Reports need a player and a reason. {usage}
```
`{usage}` is where how to use it goes in your own words.
## The other settings
Aliases, like `:r` for `:report`. `:` and `;` count as the same.
Everyone in game, players who verified their Roblox account on Jellyn, or staff (players whose verified Discord account is on your server's staff).
Each player waits this long before it runs for them again.
## Sending commands back
The **Run an in-game command** block sends any `:` command ER:LC runs (`:h`, `:m`, `:pm`, `:kick`, `:tp`, `:weather` and the rest): one line, with the command written out and values after it.
```erlc
:pm {player} Thanks, your report is in. Staff will look at it soon.
```
A system started by an in-game command can't send another in-game command. That stops two systems from setting each other off forever. And Lab never sends rank changes or commands on everyone at once.
Jellyn sends `:` commands only. `;` commands are what players type, and reach Jellyn through your server's [events webhook](/developers/erlc-webhooks).
Source: https://docs.jellyn.xyz/developers/lab/in-game-commands
---
# ER:LC webhooks
> Send your private server's events to Jellyn the moment they happen, and let Jellyn read ER:LC's own posts in Discord.
Jellyn reads your linked server through the ER:LC API about once a minute. Two kinds of webhooks make it react within seconds instead. Both are set up on **Game features**, with the **ER:LC connection** permission.
## The events webhook
ER:LC can send what happens in your private server to an address you give it. Jellyn gives each server a **secret address** for that.
On **Game features**, under **ER:LC events webhook**, copy the address. Treat it like a password.
In your private server's settings in ER:LC, paste it as the events webhook.
The ER:LC page says whether the events webhook is in use, with the last event Jellyn got.
What it makes possible:
| Typed in game | Does |
| --- | --- |
| `;refresh` or `;rf` | Refreshes the player's own character |
| `;vc name` | Moves them to a voice channel (see [Game features](/erlc/game-features#players-and-voice)) |
| `;priority` | Asks for a priority (see [Priority](/erlc/playtime-priority#priority)) |
| Your own `;` commands | Start [Jellyn Lab systems](/developers/lab/in-game-commands) |
ER:LC signs everything it sends (Ed25519, over the timestamp and the body). Jellyn checks the signature with ER:LC's public key and refuses anything unsigned, wrongly signed or too old. A retried event is only handled once.
## ER:LC's webhooks in Discord
ER:LC can also post its own logs in your Discord through Discord webhooks: command logs (with joins and leaves), and kicks and bans. Tell Jellyn which channels they post in, under **ER:LC webhooks in Discord**:
- When you save, Jellyn checks the channel's last 50 messages for ER:LC's posts.
- After that, it reads new posts as they arrive: `:log`, logged kicks and bans and command alerts happen within seconds.
- A command is handled once, whether it came from these posts or from the ER:LC API.
Jellyn needs **View Channel** and **Read Message History** in those channels. ER:LC doesn't document these posts, so Jellyn reads them loosely: Roblox profile links say who, and the text after *used the command* says what.
Source: https://docs.jellyn.xyz/developers/erlc-webhooks
---
# Placeholders
> Every {word} Jellyn fills in, feature by feature. Session posts, staff requests, warnings, alerts and punishment commands.
Wherever you write your own words for Jellyn, words in braces are filled in when it posts. Each feature has its own set: a word from another feature stays as you wrote it.
For Jellyn Lab systems, see [Values](/developers/lab/values): Lab has the most of all, and checks them when you save.
## Session posts Jellyn+
On the **Sessions** page, under your own posts.
| Word | Becomes |
| --- | --- |
| `{user}` | Who ran it |
| `{players}` | Players in game |
| `{maxplayers}` | The most the server takes |
| `{queue}` | Players waiting to join |
| `{servername}` | The ER:LC server's name |
| `{code}` | Its join code |
| `{joinlink}` | A link to join |
| `{aop}` | The area of play |
| `{votes}`, `{votesrequired}` | Votes so far, and votes needed |
| `{time}` | Now, as a Discord timestamp |
| `{scheduledtime}` | When a planned session starts |
Put a style after `{time}` or `{scheduledtime}`: `t` and `T` for the time, `d` and `D` for the date, `f` and `F` for both, `R` for relative (*in 2 hours*). Each reader sees it in their own time zone.
## Staff requests Jellyn+
On the **Sessions** page, under **Staff requests**.
| Word | Becomes |
| --- | --- |
| `{user}` | Who asked |
| `{reason}` | Their reason |
| `{staff}` | How many staff are on shift |
| `{players}` | Players in game |
| `{ingame}` | Staff in game |
## Safe zone warnings
On the **Map** editor, beside safe zones. Up to 170 characters.
| Word | Becomes |
| --- | --- |
| `{player}` | The player |
| `{area}` | The safe zone |
| `{next}` | What the next one brings: a warning, a kick or a ban |
| `{warning}`, `{warnings}` | Which warning this is, and how many there are: *Warning 2 of 3* |
## Command alerts Jellyn+
On **Game features**, for commands run off shift.
| Word | Becomes |
| --- | --- |
| `{staff}` | The staff member, as a Discord mention (or their Roblox name, when they haven't verified) |
| `{player}` | Their Roblox name |
| `{commands}` | The commands they ran |
## Punishment types
On **Types and rules**, a punishment type's in-game command.
| Word | Becomes |
| --- | --- |
| `{player}` | The player being punished |
| `{reason}` | The reason logged |
```erlc title="A punishment type's command"
:kick {player} {reason}
```
## AFK checks
On **Automations**, the private message for an AFK check. Put `{{token}}` in it, with two braces: it becomes the code staff answer with, `:log CODE`.
Source: https://docs.jellyn.xyz/developers/placeholders