Overview
Carl is a multipurpose moderation and community bot built specifically for Yapper. It brings moderation tools, welcome messages, logging, leveling, custom commands and reaction roles into one bot.
Sections about the bot describe the intended setup. Anything not yet confirmed against the bot's source is labelled as unverified.
Invite Carl
Add Carl to your server with the official invite link.
Check permissions
Grant only what the enabled features need.
Configure modules
Set up welcome, logging, moderation and more.
Invite Carl
Use the button below to add Carl to your Yapper server.
No official invite URL has been set for this site, and a guessed link would be worse than none. Site owners: add your real URL to js/config.js.
window.CARL_CONFIG = {
inviteUrl: "https://your-real-invite-url",
siteUrl: "https://carl-yapin.best"
};Once inviteUrl is set, every “Add Carl” button on the site opens it automatically.
Permissions
Give Carl only the permissions needed for the features you enable. As a rule of thumb:
- Moderation tools need the matching moderation permissions.
- Welcome messages and logs need permission to send messages in the chosen channels.
- Reaction roles need permission to manage the roles they assign.
The exact permission names depend on Yapper, so check them in your server's role settings.
Configure modules
Welcome & goodbye
Customize join and leave messages with the server and member details Carl supports.
Moderation & logging
Enable moderation tools and choose which events are logged and in which channel.
Leveling
Reward participation with activity levels and optional level-up announcements.
Custom commands & reaction roles
Create repeatable responses and let members pick their own roles.
The dashboard preview uses {user}, {server} and {level} as sample placeholders. Confirm the real variable names against the bot before relying on them.
Using commands
Browse everything in the command directory. The prefix shown there (c!) and the example commands are unverified until the real list is added to js/commands-data.js.
// one entry per real command
{ name: "ping", category: "general",
description: "…", usage: "c!ping", verified: true }Dashboard
The dashboard is currently a front-end preview. It is not connected to Yapper sign-in or to Carl's configuration store, so it cannot change a live server. You can write drafts, which are stored only in your own browser.
Dashboard login
The dashboard requires signing in with Yapper using a standard OAuth 2 authorization-code flow (with state and PKCE) handled by Pages Functions. The browser never sees your client secret or access token; it only receives a signed, HttpOnly session cookie.
Nothing here is guessed. Register an application with Yapper, then copy its real endpoints and credentials into the values below.
- YAPPER_CLIENT_ID
- Your app's client ID.
- YAPPER_CLIENT_SECRET
- Your app's client secret (store as a secret).
- YAPPER_AUTH_URL
- Yapper's authorization endpoint.
- YAPPER_TOKEN_URL
- Yapper's token endpoint.
- YAPPER_USER_URL
- Endpoint returning the signed-in user's profile as JSON.
- YAPPER_SCOPES
- Optional. Space-separated scopes.
- YAPPER_SERVERS_URL
- Optional. Endpoint listing the user's servers, for the server picker.
- SESSION_SECRET
- Long random string used to sign sessions.
Register this redirect URI with Yapper: https://carl-yapin.best/api/auth/callback
openssl rand -base64 48If Yapper's profile or server JSON uses different field names, adjust normalizeUser and normalizeServers in api/auth/callback.js.
Deploy the website
For site owners. This site is deployed on Vercel from GitHub. The login, status and admin features run as Vercel Functions, and homepage uploads use Vercel Blob.
- Push the project to GitHub and import it in Vercel (framework: Other, no build command).
- In Vercel, Storage → create a Blob store and connect it to the project.
- Add the environment variables below (mark secrets as Sensitive).
- Add your domain under Settings → Domains.
git push # Vercel deploys automatically on every push- BLOB_READ_WRITE_TOKEN
- Added automatically when you connect a Blob store.
- SITE_URL
- Optional.
https://carl-yapin.best - ADMIN_PASSWORD
- Protects the admin page and uploads.
- BOT_STATUS_URL
- Optional HTTPS endpoint. Optional JSON:
online,servers,users.
Never put your bot token in front-end files. For production, add Vercel password protection or an IP allow-list for /admin.html, and use a long unique ADMIN_PASSWORD.
Troubleshooting
- Admin says 503
ADMIN_PASSWORDis not set in Vercel.- Admin API unreachable
- Functions only run on the deployed site (or
vercel dev), not a plain static preview. - Upload rejected
- Only GIF, PNG, JPG and WebP up to 4 MB are accepted (a Vercel request limit).
- Hero shows the bundled GIF
- No custom image is stored, or no Blob store is connected.
- Status says “not connected”
BOT_STATUS_URLis not set, so no bot status can be reported.