A modern Discord-like application (text/voice chat + roles + moderation) with full Discord integration, built with:
- Rust backend (
actix-web+sqlx+ SQLite) - Tauri frontend + HTML/CSS/JS
- Features
- Discord Integration
- Roadmap
- Technical Docs
- Prerequisites
- Quick Local Setup
- Using It with Friends (Network)
- Roles & Administration
- Contributing
- Troubleshooting
- Authentication (register/login)
- Text and voice channels with real-time messaging (WebSocket)
- Image uploads, replies, pins, advanced search
- Server roles + room-level permissions
- Server/room settings in the UI
- Discord-inspired interface with guild bar, sidebar, chat area, and members panel
- Dark theme with smooth transitions and hover effects
- Pill indicators, active states, and guild icon system
- Collapsible channel categories
- Markdown rendering in messages (bold, italic, code blocks, spoilers, links)
- Embed previews and message reactions
- Infinite scroll (older messages loaded on scroll-up)
- Integrated Discord mode — browse your real Discord servers, DMs, and channels directly inside Voxium using the same UI layout (guild bar, sidebar, chat area)
- Discord servers displayed in the guild bar with the exact same order as your official Discord client (via
guild_folders) - DMs sorted by most recent conversation
- Full channel browsing with categories, text & voice channel icons
- Message rendering with Discord markdown, embeds, attachments, stickers, and reactions
- Send messages to Discord channels from within Voxium
- QR code remote authentication for Discord token linking
- Discord REST bridge endpoint (
/api/discord/proxy)
- Core text/voice chat system
- Role-based permissions + admin tools
- Image uploads, replies, pins, search
- Discord-inspired UI (guild bar, sidebar, chat area, members panel)
- Discord integration v1 — browse servers, DMs, channels, and messages using the native Voxium UI
- Guild ordering matching official Discord client (
guild_folders) - DM sorting by most recent message
- Discord message rendering (markdown, embeds, reactions, attachments, stickers)
- Send messages to Discord from Voxium
- QR remote auth for Discord token linking
- Typing indicators in Discord mode
- Discord thread support
- Presence / online status display
- Better multi-user stability on LAN/Internet
- Faster room/server settings workflows (admin UX)
- Discord voice channel integration (listen/join)
- More robust notifications (mentions, presence, activity)
- Advanced moderation tools (logs, bulk actions)
- Better DB performance and message pagination
- Cleaner Tauri build configuration for packaging
- Discord Gateway WebSocket (real-time events without polling)
- Multi-account Discord support
- Plugin / extension system
Rust(stable)Node.js(LTS recommended)npm
WebView2 Runtime- C++ Build Tools (Visual Studio Build Tools)
The backend listens on
0.0.0.0:8080by default.
git clone https://github.com/Pouare514/voxium.git
cd discord2cd discord-app
npm install
cd ..The backend reads .env (optional) from the workspace root.
You can start from:
cp .env.example .envExample:
PORT=8080
JWT_SECRET=change-me
DATABASE_URL=sqlite:voxium.db
DISCORD_CLIENT_ID=your_discord_app_client_id
DISCORD_CLIENT_SECRET=your_discord_app_client_secret
DISCORD_REDIRECT_URI=http://127.0.0.1:1420/Without .env, the default DB is created automatically: sqlite:voxium.db.
Option A (Windows):
launch.batOption B (manual, 2 terminals):
Terminal 1:
cd backend
cargo run --bin backendTerminal 2:
cd discord-app
npm run tauri devBy default, the frontend points to 127.0.0.1 (localhost), so each friend must point to the host server IP.
On the host machine:
cd backend
cargo run --bin backendOpen port 8080 in firewall/router if needed.
Edit discord-app/src/runtime-config.js:
window.VOXIUM_RUNTIME_CONFIG = {
apiBaseUrl: "http://192.168.1.42:8080",
wsUrl: "ws://192.168.1.42:8080/ws",
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
discordAuthorizeBaseUrl: "https://discord.com/oauth2/authorize",
discordClientId: "YOUR_DISCORD_APP_CLIENT_ID",
discordRedirectUri: "http://127.0.0.1:1420/auth/discord/callback",
discordScope: "identify email guilds",
discordResponseType: "code",
discordPrompt: "consent"
};For HTTPS deployment, use:
apiBaseUrl: "https://your-domain.tld"wsUrl: "wss://your-domain.tld/ws"
discord-app/src-tauri/tauri.conf.json also includes 127.0.0.1 in connect-src.
Replace it with the IP/domain you actually use, otherwise connections may be blocked.
cd discord-app
npm install
npm run tauri devOption 1 (UI): via member context menu (if you are already admin).
Option 2 (CLI):
make_admin.batThen enter the username in the terminal.
- Server settings: create/delete roles + role assignment
- Room settings (right-click): name, type, required role, public/private mode
Thanks to everyone who wants to contribute ❤️
Whether it’s a big feature, a bug fix, a UX idea, or even a typo, contributions are welcome.
- Fork/clone and create a branch:
git checkout -b feat/my-feature- Make your changes (small and focused if possible)
- Run quick checks:
cargo check -p backend
node --check discord-app/src/main.js- Commit with a clear message:
git add .
git commit -m "feat: add ..."- Push + open a Pull Request
- Keep changes readable and within PR scope
- Explain the “why” in the PR description (2-3 lines is enough)
- If you changed UX, add a short screenshot/video
- If you changed roles/permissions, list tested scenarios
- If unsure about direction, open an issue/discussion before a big refactor
This is caused by the current Tauri config (frontendDist: "../").
For local development, use npm run tauri dev.
- Check
API/WS_URLindiscord-app/src/main.js - Check CSP in
discord-app/src-tauri/tauri.conf.json - Check port/firewall (
8080)
- Verify backend env:
DISCORD_CLIENT_ID,DISCORD_CLIENT_SECRET,DISCORD_REDIRECT_URI - The redirect URI configured in the Discord developer portal must exactly match
DISCORD_REDIRECT_URI - Ensure
discordClientIdanddiscordRedirectUriare set indiscord-app/src/runtime-config.js - If frontend values are empty, the app now falls back to
GET /api/auth/discord/config(backend env) - For the non-official user-side flow (Userdoccers / docs.discord.food), see
README_DISCORD_USER_API.md
- Use
window.VoxiumDiscord.request('/users/@me/guilds')once logged in via Discord - Calls are forwarded through
POST /api/discord/proxywith your linked Discord OAuth token - Message example:
window.VoxiumDiscord.request('/channels/<channel_id>/messages', { method: 'POST', body: { content: 'hello' } })
- Check
DATABASE_URL - In dev, if needed, recreate the local SQLite file from scratch
backend/: Rust API + WebSocket + DBdiscord-app/: Tauri client (UI)migrations/: SQL scripts applied at startupuploads/: uploaded files