Skip to main content

Overview

Fluxer allows communities to create custom emojis and stickers, enabling unique and personalized expression. These custom assets can be used in messages, reactions, and across the platform.

Custom Emojis

Animated and static emojis unique to your community

Custom Stickers

Larger expressive images for rich communication

Global Usage

Premium feature to use expressions across all communities

Bulk Import

Import multiple expressions at once

Custom Emojis

Custom emojis are community-specific reaction images that can be static (PNG) or animated (GIF).

Creating Emojis

import {EmojiService} from '@fluxer/api/src/guild/services/content/EmojiService';

const emoji = await emojiService.createEmoji({
  user,
  guildId,
  name: 'partyblob',
  image: 'data:image/png;base64,iVBORw0KGg...' // Base64-encoded image
}, 'Added custom emoji for celebrations');

// Response:
// {
//   id: "123456789",
//   name: "partyblob",
//   animated: false,
//   available: true
// }

Emoji Limits

Emoji slots are based on guild features:
  • 50 static emojis
  • 50 animated emojis
  • Total: 100 emoji slots
// Check current usage
const emojis = await guildRepository.listEmojis(guildId);
const staticCount = emojis.filter(e => !e.isAnimated).length;
const animatedCount = emojis.filter(e => e.isAnimated).length;

console.log(`Using ${staticCount}/50 static, ${animatedCount}/50 animated`);

Image Requirements

Format
string
required
PNG (static) or GIF (animated)
Size
string
required
Maximum 256 KB per emoji
Dimensions
string
Recommended: 128x128 pixels (square)
Animation
boolean
Automatically detected from file format (GIF = animated)

Using Custom Emojis

// Use in message content with :name: syntax
const message = await messageSendService.sendMessage({
  user,
  channelId,
  data: {
    content: 'Check out this emoji :partyblob:'
  },
  requestCache
});

Managing Emojis

// Rename an emoji
const updated = await emojiService.updateEmoji({
  userId,
  guildId,
  emojiId,
  name: 'superpartyblob'
}, 'Renamed emoji');

Custom Stickers

Stickers are larger expressive images that can be sent as standalone messages.

Creating Stickers

import {StickerService} from '@fluxer/api/src/guild/services/content/StickerService';

const sticker = await stickerService.createSticker({
  user,
  guildId,
  name: 'Happy Face',
  description: 'A very happy face!',
  tags: ['happy', 'smile', 'joy'],
  image: 'data:image/png;base64,iVBORw0KGg...'
}, 'Added happy sticker');

Sticker Limits

5 stickers per guild
const stickers = await guildRepository.listStickers(guildId);
if (stickers.length >= 5) {
  throw new MaxGuildStickersStaticError(5);
}

Sticker Requirements

Format
string
required
PNG (static) or APNG/Lottie (animated)
Size
string
required
Maximum 512 KB per sticker
Dimensions
string
Recommended: 320x320 pixels
Name
string
required
2-30 characters, descriptive name
Description
string
Optional description up to 100 characters
Tags
array
required
1-5 searchable tags for discovery

Using Stickers

// Send a message with a sticker
const message = await messageSendService.sendMessage({
  user,
  channelId,
  data: {
    sticker_ids: [stickerId],
    content: 'Optional message with sticker'
  },
  requestCache
});

// Stickers are rendered as large images in the message

Managing Stickers

// Update sticker metadata
const updated = await stickerService.updateSticker({
  userId,
  guildId,
  stickerId,
  name: 'Super Happy Face',
  description: 'An extremely happy face!',
  tags: ['happy', 'smile', 'joy', 'ecstatic']
}, 'Updated sticker details');

Permissions

Expression management requires specific permissions:
CREATE_EXPRESSIONS
Permission
required
Required to create custom emojis and stickers
MANAGE_EXPRESSIONS
Permission
required
Required to edit or delete emojis/stickers
USE_EXTERNAL_EMOJIS
Permission
Required to use custom emojis from other guilds in this guild

Permission Checks

// Check if user can create expressions
await contentHelpers.checkCreateExpressionsPermission({
  userId,
  guildId
});

// Check if user can modify (requires permission OR be the creator)
await contentHelpers.checkModifyExpressionPermission({
  userId,
  guildId,
  creatorId: emoji.creatorId
});

Audit Logging

All expression operations are logged for moderation:
Logged when custom emoji is created
{
  action: AuditLogActionType.EMOJI_CREATE,
  target_id: emojiId,
  user_id: creatorId,
  changes: [{
    key: 'name',
    new_value: 'partyblob'
  }]
}
Logged when emoji is renamed
Logged when emoji is removed
Similar logging for sticker operations

Gateway Events

Expression changes are synchronized in real-time:
// GUILD_EMOJIS_UPDATE event
{
  "t": "GUILD_EMOJIS_UPDATE",
  "d": {
    "guild_id": "123456789",
    "emojis": [
      {
        "id": "987654321",
        "name": "partyblob",
        "animated": false,
        "available": true
      }
    ]
  }
}

// GUILD_STICKERS_UPDATE event
{
  "t": "GUILD_STICKERS_UPDATE",
  "d": {
    "guild_id": "123456789",
    "stickers": [...]
  }
}

Best Practices

1

Optimize Image Sizes

Compress images before uploading to stay under size limits. Use tools like ImageOptim or TinyPNG.
2

Use Descriptive Names

Name emojis clearly so members can easily find and use them: :partyblob: not :pb1:
3

Organize with Categories

For guilds with many emojis, create a consistent naming scheme: :cat_happy:, :cat_sad:, :dog_happy:
4

Tag Stickers Effectively

Use relevant, searchable tags so members can find the right sticker quickly
5

Monitor Usage

Track which expressions are popular and remove unused ones to free up slots
6

Respect Copyright

Only upload original content or images you have permission to use

Expression Asset Storage

Expressions are stored on Fluxer’s CDN:
// Emoji CDN URLs
const emojiUrl = `https://cdn.fluxer.com/emojis/${emojiId}.${animated ? 'gif' : 'png'}`;

// Sticker CDN URLs  
const stickerUrl = `https://cdn.fluxer.com/stickers/${stickerId}.png`;

// Assets are automatically uploaded when created
await avatarService.uploadEmoji({
  prefix: 'emojis',
  emojiId,
  imageBuffer,
  contentType: 'image/png'
});
Expression assets are cached globally on the CDN for fast delivery. Purging (purge: true) removes them immediately but requires special guild features.

Troubleshooting

  • Check file size (256 KB for emojis, 512 KB for stickers)
  • Verify image format (PNG or GIF)
  • Ensure image is valid and not corrupted
  • Check that you haven’t reached your emoji/sticker limit
  • Verify you have USE_EXTERNAL_EMOJIS permission in the target guild
  • Check if you have global expressions enabled (premium feature)
  • Ensure the emoji still exists in its source guild
  • Clear client cache and reload
  • Verify the expression wasn’t deleted
  • Check that available is true
  • Ensure you’re looking in the correct guild

Communities

Learn about guild features and limits

Messaging

Use expressions in messages and reactions

Media & Embeds

Understand media handling

API Reference

Complete API documentation

Build docs developers (and LLMs) love