SYNDRA
A management bot and web dashboard for Discord servers. Moderation, support tickets, announcements, tiered permissions and analytics, all run from a single panel.
SYNDRA pairs a Discord bot with a web dashboard. Server owners and staff sign in with their Discord account and handle moderation, support tickets, announcements, permissions and analytics from one interface instead of working through Discord’s menus. The dashboard and landing page are available in Turkish and English; the system is live at syndra.yakupbilgin.com.
Architecture
- Monorepo: a pnpm workspace with three packages: the Discord bot (Node.js, discord.js 14), the web dashboard (Next.js 15, React) and a Prisma schema shared by both.
- Database as the message bus: there is no direct HTTP API between the bot and the dashboard; both use the same PostgreSQL database. A change in the dashboard fires a database trigger that emits a PostgreSQL notification (LISTEN/NOTIFY), which the bot picks up immediately; polling is only a fallback. In measurements, a message sent from the dashboard reaches Discord in under 0.6 seconds (5–10 seconds with the earlier polling design).
- Identity and access: sign-in uses Discord OAuth2, and every server action and API route is authorised on the server side.
- Live UI: dashboard pages update without a reload; level cards are rendered on the server.
- Hosting: the dashboard is exposed over HTTPS through Cloudflare Tunnel.
Highlights
- Server setup: recognises existing channels and roles by name and suggests mappings for verification, logging, welcome and temporary voice systems. Nothing changes on the server until the setup is saved.
- Server structure: channels, roles and members on one screen; per-channel role and member permissions, role editing, member actions and a live view of channels.
- Announcements and messages: join, leave and ban announcements; a layered image editor (avatar, text, shapes, emoji, images); template variables such as {user.mention}; scheduled messages and templates via the Message Builder.
- Actions: flows built from steps such as add/remove role, message, DM and wait; they can be attached to buttons, commands, giveaways and member events.
- Support system: tickets are listed live in the dashboard, and replies written there are delivered to the ticket channel. Confirmed closing, reopening and transcripts to a log channel.
- Community: a levelling system with separate XP for chat and voice, level cards and a leaderboard; verification, role selection, giveaways, polls and temporary voice channels.
- Moderation, logs and analytics: punishment records that can be reverted from the dashboard; message, member, voice, role, channel and moderation events written to chosen channels and to the dashboard; charts for member flow, messages and voice activity.
- Tiered access: server owner, four moderator levels and guest. Permissions can be time-limited, narrowed or widened per person, and bound to a Discord role so that whoever holds the role also gets dashboard access. Actions taken in the dashboard are written to an audit log.
- SYNDRA AI (in development): not yet available. In the planned flow, a request is written in plain language in the dashboard or to @SYNDRA on Discord; SYNDRA presents the changes as a step-by-step plan, applies them once a staff member approves, logs them and keeps them reversible. The preview on the site only replays sample scenarios and performs no real actions.
Technology
The project is written in TypeScript end to end. The bot runs on Node.js with discord.js 14; the dashboard uses Next.js 15, React and Tailwind CSS, with Auth.js for Discord sign-in. The data layer is PostgreSQL with Prisma. Quality is covered by type checking, unit tests, integration tests against a separate test database, and end-to-end tests with Playwright.
Note: dashboard screenshots come from the interactive demo on the landing page; the server name, people and numbers are sample data.
If you are considering a custom bot or management dashboard for your community or team, you can reach me through the contact form.