Enhance the bot's architecture by introducing sharding capabilities, allowing for better scalability and performance. Update environment files to include sharding options, and modify the bot's core logic to handle shard connections and latencies. Implement shard-specific logging and API synchronization, ensuring that only the primary shard performs certain tasks. Update API schemas and routes to reflect shard information, improving the overall status reporting and monitoring of the bot's performance across multiple shards.
+-+-+-+-+-+
|A|x|i|o|m|
+-+-+-+-+-+
by HexaHost
A feature-rich Discord bot paired with a sleek Next.js dashboard
✦ Overview
Axiom is a fully-featured Discord bot by HexaHost with a modern web dashboard for managing everything from antinuke to music. Built on discord.py v2, FastAPI, and Next.js 14 with Tailwind CSS.
Axiom-CV2-With-Dashboard/
├── 🤖 bot/ Python Discord bot + FastAPI backend
│ ├── api/ Dashboard REST API (FastAPI)
│ ├── cogs/ All bot features (commands, events, antinuke, automod…)
│ ├── core/ Bot client, context, cog base
│ ├── utils/ Shared utilities (emoji, tools, sync, cloudflare tunnel…)
│ ├── games/ Standalone game modules
│ ├── assets/ Fonts, backgrounds, GIFs
│ └── Axiom.py Entry point
│
└── 🌐 dashboard/ Next.js frontend
├── app/ App Router pages & API routes
├── components/ Reusable UI components
├── hooks/ Custom React hooks
├── lib/ API helpers & utilities
└── types/ TypeScript type definitions
✦ Features
|
🛡️ Security
|
🎵 Music
|
|
⚙️ Management
|
🌐 Dashboard
|
|
🎉 Engagement
|
🔧 Developer
|
✦ Prerequisites
| Requirement | Version / Notes |
|---|---|
| Python | 3.10 or higher |
| Node.js | 18 or higher |
| Lavalink node | v4 |
| Discord bot token | — |
| Discord OAuth app | for dashboard login |
| Cloudflare account (free) | for HTTPS tunnel |
✦ Bot Setup
1 — Clone the repo
git clone https://github.com/theoneandonlymace/Axiom-CV2-With-Dashboard
cd Axiom-CV2-With-Dashboard/bot
2 — Install dependencies
python -m venv .venv
# Windows
.venv\Scripts\activate
# Linux / macOS
source .venv/bin/activate
pip install -r requirements.txt
3 — Configure the environment
Copy .env.example to .env and fill in the values:
# ── Core ──────────────────────────────────────────────────────────
TOKEN = your_discord_bot_token
brand_name = 'Axiom'
# ── Owner IDs (REQUIRED — your Discord user ID) ───────────────────
OWNER_IDS = YOUR_DISCORD_USER_ID_HERE
# ── Lavalink ──────────────────────────────────────────────────────
LAVALINK_HOST = "your-lavalink-host"
LAVALINK_PASSWORD = "your_password"
LAVALINK_SECURE = "true"
LAVALINK_PORT = ""
# ── Emoji Sync ────────────────────────────────────────────────────
EMOJI_SYNC = "false"
# ── API / Dashboard Backend ───────────────────────────────────────
API_ENABLED = "false"
API_HOST = "127.0.0.1"
API_PORT = "8000"
DASHBOARD_API_KEY = "change_this_to_a_strong_secret"
DASHBOARD_ADMIN_IDS = YOUR_DISCORD_USER_ID_HERE
CORS_ORIGINS = ""
# ── Cloudflare Tunnel (optional) ──────────────────────────────────
TUNNEL_ENABLED = "false"
CF_TUNNEL_TOKEN = "your_tunnel_token"
CF_TUNNEL_URL = "https://api.yourdomain.com"
# ── Webhooks (optional — leave unset to disable) ──────────────────
# CMD_WEBHOOK_URL = "https://discord.com/api/webhooks/ID/TOKEN"
4 — Run the bot
python Axiom.py
✦ Dashboard Setup
1 — Install dependencies
cd dashboard
npm install
2 — Configure the environment
Copy .env.example to .env.local:
DASHBOARD_API_URL = http://127.0.0.1:8000/api/v1
DASHBOARD_API_KEY = same_secret_as_bot_DASHBOARD_API_KEY
NEXTAUTH_URL = http://localhost:3000
NEXTAUTH_SECRET = a_long_random_string
DISCORD_CLIENT_ID = your_discord_oauth_client_id
DISCORD_CLIENT_SECRET = your_discord_oauth_client_secret
ADMIN_IDS = your_discord_user_id
NEXT_PUBLIC_ADMIN_IDS = your_discord_user_id
NEXT_PUBLIC_BRAND_NAME = "Axiom"
NEXT_PUBLIC_BRAND_NAME_WORD = "ZX"
3 — Run locally
npm run dev
✦ Environment Reference
Bot — bot/.env
| Variable | Default | Description |
|---|---|---|
TOKEN |
— | Discord bot token |
OWNER_IDS |
(required) | Comma-separated owner Discord user IDs — must be your own ID |
LAVALINK_HOST |
— | Lavalink server hostname (no protocol) |
LAVALINK_PASSWORD |
— | Lavalink password |
LAVALINK_SECURE |
true |
true = HTTPS, false = HTTP |
LAVALINK_PORT |
(empty) | Port — only needed when LAVALINK_SECURE=false |
EMOJI_SYNC |
false |
Run application emoji sync on startup |
JISHAKU_ENABLED |
false |
Enable owner debug REPL (disable in production) |
API_ENABLED |
false |
Start the FastAPI dashboard backend |
API_HOST |
127.0.0.1 |
Bind address — use 127.0.0.1 unless behind a reverse proxy |
API_PORT |
8000 |
Port the backend listens on |
DASHBOARD_API_KEY |
— | Shared secret between bot API and dashboard (server-side only) |
DASHBOARD_ADMIN_IDS |
— | Discord user IDs allowed to use admin API routes |
CORS_ORIGINS |
(empty) | Extra CORS-allowed origins, comma-separated |
CMD_WEBHOOK_URL |
(empty) | Optional Discord webhook for command logging |
TUNNEL_ENABLED |
false |
Expose the API over HTTPS via Cloudflare Tunnel |
CF_TUNNEL_TOKEN |
— | Token from Cloudflare Zero Trust dashboard |
CF_TUNNEL_URL |
— | Your permanent public URL (e.g. https://api.yourdomain.com) |
LOG_CHANNEL_ID |
(empty) | Optional channel for join/leave logs |
Dashboard — dashboard/.env.local
| Variable | Description |
|---|---|
DASHBOARD_API_URL |
Bot API URL (server-side, e.g. http://127.0.0.1:8000/api/v1) |
DASHBOARD_API_KEY |
Must match DASHBOARD_API_KEY in the bot — never use NEXT_PUBLIC_ |
NEXTAUTH_URL |
Your dashboard's public URL |
NEXTAUTH_SECRET |
Random secret for NextAuth session signing |
DISCORD_CLIENT_ID |
Discord OAuth2 client ID |
DISCORD_CLIENT_SECRET |
Discord OAuth2 client secret |
ADMIN_IDS |
Comma-separated Discord user IDs with admin panel access (server-side) |
NEXT_PUBLIC_ADMIN_IDS |
Same IDs for client-side admin UI visibility |
NEXT_PUBLIC_BRAND_NAME |
Bot name shown in the dashboard UI |
NEXT_PUBLIC_BRAND_NAME_WORD |
Short abbreviation shown in the dashboard |
API security: Guild routes require a valid Discord OAuth token with Manage Server permission. The dashboard forwards this automatically via
/api/proxy.
✦ HTTPS Tunnel (Cloudflare)
The bot uses pycloudflared — a Python package that downloads the cloudflared binary automatically on first run. No CLI installs, no system packages — works on Pterodactyl and any Python host.
Why Cloudflare over ngrok:
- ✅ Unlimited bandwidth & requests — no monthly caps
- ✅ Permanent URL that never changes between restarts
- ✅ Free — no paid plan needed
- ✅ Zero system installs — binary downloads via Python
Setup (browser only, no CLI needed):
- Go to one.dash.cloudflare.com → Networks → Tunnels → Create a tunnel
- Choose Cloudflared, give it a name (e.g.
axiom-api), save - On the Install connector step, copy the token from the command shown:
cloudflared tunnel run --token <COPY_THIS> - Go to Public Hostname tab → add a hostname:
- Subdomain:
api· Domain:yourdomain.com· Service:http://localhost:8000
- Subdomain:
- Add to
bot/.env:CF_TUNNEL_TOKEN = "eyJhIjoiXXXX..." CF_TUNNEL_URL = "https://api.yourdomain.com"
On every startup the console prints:
◈ Tunnel: cloudflared binary ready — starting tunnel on port 8000…
◈ Tunnel: API is live at https://api.yourdomain.com
↳ NEXT_PUBLIC_API_URL = https://api.yourdomain.com/api/v1
✦ Deployment
🤖 Bot — any Python host
- Upload the entire
bot/folder to your host (Pterodactyl, Render, Railway, Fly.io, VPS…) - Set the start command to
python Axiom.py - Add all environment variables
pycloudflareddownloads the binary automatically on first run — no extra steps
Recommended free/cheap hosts: Render · Railway · Fly.io · VPS
⭐ NexioHost — Premium bot hosting, built for Discord bots. Fast, reliable, and affordable.
🌐 Dashboard — Vercel
- Go to vercel.com → Add New Project → connect your GitHub repo
- Set root directory to
dashboard/ - Add all environment variables under Settings → Environment Variables
- Add the OAuth redirect URI in Discord Developer Portal:
https://your-app.vercel.app/api/auth/callback/discord - Hit Deploy — done ✓
✦ Emoji Sync
Runs automatically on startup when EMOJI_SYNC=true:
★ Starting Application Emoji Sync — 144 unique emojis found in emoji.py
◈ Found 144 templates | Application hosts 202 emojis
↑ Uploading: ztick (not in application emojis)
✔ Uploaded: ztick [saved as ID: 1234567890]
✔ emoji.py patched in-place to reflect current API state.
★ Restarting bot to load updated emoji IDs...
| Event | Action |
|---|---|
| New emoji found | Uploaded to application, ID written to emoji.py |
| Stale ID detected | emoji.py patched automatically |
| No changes | Sync completes instantly, no restart |
| After any patch | Bot restarts itself so fresh IDs are live |
✦ Troubleshooting
| Problem | Fix |
|---|---|
| Bot fails to start | Check TOKEN is set and bot has correct gateway intents |
| Music not working | Verify LAVALINK_HOST, LAVALINK_SECURE, and LAVALINK_PORT |
| Dashboard auth error | Check Discord OAuth client ID/secret and redirect URI |
| Dashboard can't load data | Confirm API_ENABLED=true, bot running, DASHBOARD_API_URL correct, user logged in via Discord |
| API 403 on guild routes | User needs Manage Server or Admin permission on that Discord server |
| API key rejected (401) | DASHBOARD_API_KEY must exactly match in bot and dashboard .env |
| Emojis showing as plain text | Run with EMOJI_SYNC=true once to upload and patch IDs |
| CORS errors from dashboard | Add your Vercel URL to CORS_ORIGINS in bot/.env |
| Tunnel not starting | Check CF_TUNNEL_TOKEN is valid and pycloudflared is installed |
| Tunnel URL changed | Set CF_TUNNEL_URL — named tunnels always produce the same URL |
✦ Security
- Never commit
.envfiles —.gitignorealready covers them - Use a strong, unique
NEXTAUTH_SECRETandDASHBOARD_API_KEY - Rotate any secret that gets accidentally exposed
- The bot API is always behind an API key — never expose it without one
