Dashboard & Accounts
Dashboard & Accounts
The whole configuration happens on the Social page in the dashboard.
General
| Setting | Meaning |
|---|---|
| Enable Social | Master switch for the whole plugin |
| Check interval (min) | How often each account is checked for new posts |
| Max posts / check | Cap per account per check (avoids flooding) |
| Default embed colour | Hex without # (e.g. 2B2D31) or a colour name |
| Mention above embed | Role ping on its own line above the embed |
| Show statistics | Show likes/reposts/comments when available |
API Credentials
The Twitter/X Bearer Token goes here. Instagram tokens are set per account.
Custom Emojis
For each label (X logo, Instagram logo, verified badge, likes, reposts, comments, views, link) you pick the index of a custom emoji from your application. Only custom emojis are used.
Add an account
Click Add account and fill in:
| Field | Description |
|---|---|
| Platform | Twitter/X or Instagram |
| Username | Handle without @ |
| Channel | Target channel for new posts |
| Role to ping | Role that gets pinged (optional) |
Ping @everyone | Ping everyone instead of a role |
| Format | Embed (rich card) or Text (plain message; Discord renders the link preview) |
| RSS feed URL | Optional: crawl an RSS/Atom feed instead of the API (e.g. RSS.app) — no API keys needed |
| Message above the post | Optional text, placeholders %username% and %url% |
| Embed colour | Optional colour for this account only (only with Embed format) |
Source: if an RSS feed URL is set, the feed is crawled — otherwise the API is used. Twitter/X only (without RSS): include replies, include reposts. Instagram only (without RSS): Instagram account id and access token.
Example configuration
If you prefer editing the file directly: the saved configuration lives at
configuration/social-extension.json5 (defaults & comments in plugins/social-extension/data/configs/en-social-extension.json5).
It mirrors the dashboard fields exactly.
config: {
global: {
enabled: true,
poll_interval_minutes: 5, // check interval in minutes
max_posts_per_check: 3, // cap per account & check
mention_above_embed: true,
show_statistics: true,
embed_color: "2B2D31", // hex without # or a colour name
},
credentials: {
twitter_bearer_token: "YOUR_X_BEARER_TOKEN",
},
// index of a custom emoji from your application per label
emojis: { twitter: 0, instagram: 1, verified: 2, like: 3, repost: 4, comment: 5, view: 6, link: 7 },
// list (array) of accounts — each with a unique "id"
accounts: [
// Twitter / X — uses the global bearer token above
{
id: "discord_x",
enabled: true,
platform: "twitter",
username: "discord", // handle without @
channel_id: "123456789012345678", // target channel
mention_role_id: "234567890123456789", // role to ping ("" = off)
mention_everyone: false,
format: "embed", // "embed" or "text"
custom_message: "New post by %username%!", // %username%, %url%
embed_color: "1D9BF0",
include_replies: false,
include_retweets: true,
},
// Instagram via RSS — no API keys needed (e.g. an RSS.app feed)
{
id: "natgeo_ig",
enabled: true,
platform: "instagram",
username: "natgeo",
channel_id: "345678901234567890",
mention_role_id: "",
mention_everyone: false,
format: "text", // plain text + link preview
rss_url: "https://rss.app/feeds/your-instagram.xml", // set -> feed instead of API
custom_message: "",
embed_color: "E1306C",
// ig_user_id / access_token only needed when NOT using rss_url
},
],
}
twitter_bearer_token, access_token) are never shown again in the dashboard. When editing
through the dashboard, a blank field = the existing value is kept.Behaviour
- On the first check of a new account, existing posts are only memorised silently — the channel is not flooded with the back catalogue. Only posts published afterwards are announced.
- Already-sent posts are tracked in
configuration/social-state.json(per install, not in the repository).