# Discord Integration Guide - Getting Started
**Build games and experiences that run inside Discord**
---
## Overview
AeThex can be embedded as a Discord Activity, allowing users to access your games directly within Discord servers. This guide will help you integrate Discord Activity into your AeThex game in 5 minutes.
### What is a Discord Activity?
A Discord Activity is an embedded application that runs within Discord. With AeThex Discord integration, you can:
- ✅ Launch your game directly inside Discord servers
- ✅ Share real-time experiences with server members
- ✅ Authenticate users seamlessly with Discord OAuth
- ✅ Enable voice chat and collaboration without leaving Discord
- ✅ Reach Discord's 150M+ active users
### Architecture Overview
```
User in Discord Server
↓
Launches AeThex Activity
↓
Your Game loads in Discord iframe
↓
AeThex SDK handles authentication & state
↓
Your game logic runs normally
```
---
## Prerequisites
Before you begin, ensure you have:
- ✅ **Discord Application** registered at [Discord Developer Portal](https://discord.com/developers/applications)
- ✅ **HTTPS domain** (Discord Activities require SSL/TLS)
- ✅ **AeThex account** with API credentials
- ✅ **Node.js 18+** installed for development
> **Note:** Discord Activities do NOT work with IP addresses or `localhost` (except for local SDK testing). You must use a proper domain.
---
## Quick Start (5 minutes)
### Step 1: Enable Discord Activity in Developer Portal
1. Go to [Discord Developer Portal](https://discord.com/developers/applications)
2. Select your application (or create a new one)
3. Navigate to **General Information** tab
4. Scroll to **Activity Settings** section
5. Click **Enable Activities** (if not already enabled)
6. Set **Activity URL** to: `https://yourdomain.com/discord`
7. Set **Interactions Endpoint URL** to: `https://yourdomain.com/api/discord/interactions`
8. Click **Save Changes**
### Step 2: Configure OAuth2 Redirect URIs
1. In Discord Developer Portal, go to **OAuth2** tab
2. Under **Redirects**, add:
```
https://yourdomain.com/api/discord/oauth/callback
https://yourdomain.com/discord/callback
```
3. Under **OAuth2 Scopes**, ensure these are enabled:
- ✅ `identify` (read user profile)
- ✅ `email` (read user email)
- ✅ `guilds` (see servers user is in)
4. Click **Save Changes**
> **Important:** Wait 1-2 minutes for Discord to propagate your changes.
### Step 3: Install AeThex SDK
```bash
npm install @aethex/sdk
# or
yarn add @aethex/sdk
```
### Step 4: Configure Environment Variables
Create a `.env` file in your project root:
```env
# Discord Application
VITE_DISCORD_CLIENT_ID=your_discord_client_id
DISCORD_CLIENT_SECRET=your_discord_client_secret
DISCORD_PUBLIC_KEY=your_discord_public_key
# AeThex API
AETHEX_API_KEY=your_aethex_api_key
# Supabase (for user data)
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE=your_service_role_key
```
> **Security Note:** Never commit `CLIENT_SECRET` or `SERVICE_ROLE` keys to version control.
### Step 5: Create Discord Activity Page
Create a new page at `/discord` in your app:
```typescript
// src/pages/DiscordActivity.tsx
import { useEffect } from 'react';
import { DiscordSDK } from '@discord/embedded-app-sdk';
export default function DiscordActivity() {
useEffect(() => {
// Initialize Discord SDK
const discordSdk = new DiscordSDK(import.meta.env.VITE_DISCORD_CLIENT_ID);
discordSdk.ready().then(() => {
console.log('Discord SDK is ready!');
// Authenticate user
discordSdk.commands.authenticate({
scopes: ['identify', 'email', 'guilds']
}).then(({ access_token }) => {
// User is authenticated!
// Now you can access Discord user data
console.log('User authenticated:', access_token);
});
});
}, []);
return (
Welcome to AeThex Activity!
Your game content goes here...
);
}
```
### Step 6: Add Route
In your router configuration:
```typescript
// src/App.tsx (React Router)
import DiscordActivity from './pages/DiscordActivity';
} />
```
### Step 7: Test Your Activity
1. **Add your bot to a test Discord server:**
- Go to Discord Developer Portal → **OAuth2** → **URL Generator**
- Select scopes: `bot`, `applications.commands`
- Copy the generated URL and paste in browser
- Select a test server and authorize
2. **Launch the Activity:**
- In Discord, click on your bot
- Look for "Activities" or right-click → **Apps**
- Select your Activity
- It should open in a modal within Discord
3. **Verify it works:**
- Open browser console (F12)
- Check for "Discord SDK is ready!" message
- Verify no errors
---
## Authentication Flow
Discord Activities use OAuth2 for user authentication. Here's how it works:
### 1. User Flow
```
User clicks "Launch Activity" in Discord
↓
Discord SDK initializes in your app
↓
Your app calls discordSdk.commands.authenticate()
↓
Discord prompts user to authorize (first time only)
↓
Discord returns access_token
↓
Your app exchanges token for user profile
↓
User is authenticated and can play!
```
### 2. Implementation Example
```typescript
import { DiscordSDK } from '@discord/embedded-app-sdk';
import { AeThex } from '@aethex/sdk';
// Initialize Discord SDK
const discordSdk = new DiscordSDK(process.env.VITE_DISCORD_CLIENT_ID);
// Initialize AeThex SDK
const aethex = new AeThex({
apiKey: process.env.AETHEX_API_KEY
});
async function authenticateUser() {
// Wait for Discord SDK to be ready
await discordSdk.ready();
// Authenticate with Discord
const { access_token } = await discordSdk.commands.authenticate({
scopes: ['identify', 'email', 'guilds']
});
// Get Discord user profile
const response = await fetch('https://discord.com/api/users/@me', {
headers: { Authorization: `Bearer ${access_token}` }
});
const discordUser = await response.json();
// Link to AeThex account
const aethexUser = await aethex.auth.loginWithDiscord({
discordId: discordUser.id,
email: discordUser.email,
username: discordUser.username,
avatar: discordUser.avatar
});
return aethexUser;
}
```
---
## Detecting Discord Activity Context
Your app should detect when it's running inside Discord and adjust the UI accordingly:
```typescript
// src/utils/discord.ts
export function isRunningInDiscord(): boolean {
// Check if Discord SDK is available
if (typeof window !== 'undefined') {
return window.location.pathname.startsWith('/discord') ||
window.location.search.includes('frame_id=');
}
return false;
}
// Use in components
import { isRunningInDiscord } from '@/utils/discord';
function MyComponent() {
const inDiscord = isRunningInDiscord();
return (
{inDiscord ? (
{/* Activity-specific UI */}
) : (
{/* Normal web UI */}
)}
);
}
```
---
## Account Linking
Allow users to link their existing AeThex account with Discord:
### Option 1: Link from Dashboard
Users can link Discord from their account settings:
```typescript
// In your Dashboard/Settings page
import { useAuth } from '@/contexts/AuthContext';
function ConnectionsTab() {
const { linkProvider } = useAuth();
const handleLinkDiscord = async () => {
try {
await linkProvider('discord');
alert('Discord account linked successfully!');
} catch (error) {
console.error('Failed to link Discord:', error);
}
};
return (
);
}
```
### Option 2: Link via `/verify` Command (Discord Bot)
If you have a Discord bot, users can type `/verify` in Discord to get a linking code:
1. User types `/verify` in Discord
2. Bot generates a 6-digit code
3. User visits `yourdomain.com/discord-verify?code=123456`
4. Account is linked automatically
Implementation example in [Discord Activity Reference](./discord-activity-reference.md#bot-commands).
---
## Best Practices
### ✅ Do's
- ✅ **Always use HTTPS** - Discord requires secure connections
- ✅ **Handle authentication errors gracefully** - Show helpful error messages
- ✅ **Optimize for Discord's iframe size** - Test responsive layouts
- ✅ **Cache Discord user data** - Reduce API calls
- ✅ **Test on multiple devices** - Desktop and mobile Discord apps
### ❌ Don'ts
- ❌ **Don't use IP addresses** - Discord won't load your Activity
- ❌ **Don't store tokens in localStorage** - Use secure HTTP-only cookies
- ❌ **Don't assume all users have Discord** - Support web login too
- ❌ **Don't make excessive API calls** - Respect rate limits
- ❌ **Don't forget error handling** - Network issues happen
---
## Common Issues & Solutions
### Issue: "Could not fetch application data"
**Cause:** Activities feature not enabled or Activity URL not set
**Solution:**
1. Go to Discord Developer Portal
2. Enable Activities in General Information
3. Set Activity URL to your domain
4. Wait 2 minutes for changes to propagate
### Issue: "Failed to authenticate"
**Cause:** OAuth redirect URI not registered
**Solution:**
1. Go to Discord Developer Portal → OAuth2
2. Add your callback URL: `https://yourdomain.com/api/discord/oauth/callback`
3. Save and wait 2 minutes
### Issue: "Session lost during OAuth"
**Cause:** Cookies not being sent with OAuth callback
**Solution:**
1. Ensure your API domain matches your frontend domain
2. Set cookies with `SameSite=Lax` or `SameSite=None; Secure`
3. Verify OAuth callback URL is EXACTLY as registered in Discord portal
For more troubleshooting tips, see [Discord Deployment Guide](./discord-deployment.md#troubleshooting).
---
## Next Steps
Now that you have Discord Activity integrated, explore these advanced features:
- 📚 [Discord Activity Reference](./discord-activity-reference.md) - Complete API documentation
- 🚀 [Discord Deployment Guide](./discord-deployment.md) - Production deployment checklist
- 🎮 [Example Projects](../examples/discord-games) - Sample Discord Activity games
- 💬 [Community Support](https://discord.gg/aethex) - Get help from the community
---
## Need Help?
- 📖 [Full Documentation](https://aethex.dev/docs)
- 💬 [Discord Community](https://discord.gg/aethex)
- 📧 [Support Email](mailto:support@aethex.dev)
- 🐛 [Report Issues](https://github.com/AeThex-Corporation/aethex-forge/issues)
---
**Last Updated:** January 7, 2026
**AeThex SDK Version:** 2.0+
**Discord SDK Version:** 1.0+