Spraxium logoSpraxium

Crie bots para Discord
como software de verdade.

O Spraxium adiciona a camada de arquitetura que o Discord.js não oferece: módulos, injeção de dependência, guard pipelines e comandos tipados. Um único modelo para todos os tipos de interação.

Code editor preview showing a Spraxium bot project
src/main.ts
1import { IntentPreset, SpraxiumFactory } from '@spraxium/core';
2import { EnvValidator } from '@spraxium/env';
3import { Logger } from '@spraxium/logger';
4import { AppEnv } from './app.env';
5import { AppModule } from './app.module';
6
7async function main() {
8 const logger = new Logger('Main');
9 const environment = EnvValidator.validate(AppEnv);
10
11 const app = await SpraxiumFactory.create({ token: environment.token });
12 app.useModule(AppModule);
13 app.provide(AppEnv, environment);
14 app.intents(IntentPreset.Standard);
15
16 logger.info('Starting application...');
17 await app.listen();
18}
19
20main();

Módulos com fronteiras bem definidas, provedores injetados e um container de DI que resolve tudo de forma determinística durante a inicialização.

Combine módulos entre domínios, compartilhe provedores entre eles e aplique guards a qualquer tipo de interação com um único decorator.

Cada provedor se conecta ao onBoot(), onReady() e onShutdown(). Sem ordem de inicialização oculta, sem condições de corrida.

Escreva a lógica de permissões uma vez como classe guard e aplique-a a slash commands, context menus e prefix commands com um único decorator.

Cada opção de comando, payload de interação e contrato de provedor é totalmente tipado. Sem castings, sem any, sem surpresas em runtime da API do Discord.

Providers são classes injetáveis puras com dependências declaradas. Troque implementações reais por mocks no teste sem tocar o código de produção.

Benchmark de arquitetura

Menos complexidade conforme seu bot cresce.

À medida que um projeto escala além de alguns comandos, o discord.js exige uma configuração manual crescente - guards, DI, agendamento e estado feitos à mão. O Spraxium cuida dessa camada.

Spraxium
Sapphire
discord.js
Complexidade0255075100Hello World5 CommandsServicesProduction

* Estimativas ilustrativas de complexidade com base nas linhas de código de infraestrutura necessárias por marco em um projeto de bot de produção típico.

A Lacuna Arquitetural

Mesmo comando. Mundo diferente.

O mesmo comando /ban, implementado duas vezes. Uma com discord.js puro, outra com Spraxium. A diferença não está na sintaxe. Está na estrutura, na segurança e na escala.

1// 1. Register the slash command with Discord
2const { REST, Routes, SlashCommandBuilder } = require('discord.js');
3
4const command = new SlashCommandBuilder()
5 .setName('ban')
6 .setDescription('Ban a member from the server.')
7 .addUserOption(opt =>
8 opt.setName('user').setDescription('Target').setRequired(true))
9 .addStringOption(opt =>
10 opt.setName('reason').setDescription('Reason'));
11
12const rest = new REST().setToken(process.env.DISCORD_TOKEN);
13await rest.put(Routes.applicationCommands(CLIENT_ID), {
14 body: [command.toJSON()],
15});
16
17// 2. Handle the interaction at runtime
18client.on('interactionCreate', async (interaction) => {
19 if (!interaction.isChatInputCommand()) return;
20 if (interaction.commandName !== 'ban') return;
21
22 if (!interaction.memberPermissions?.has('BanMembers')) {
23 return interaction.reply({ content: 'No permission.', flags: 'Ephemeral' });
24 }
25
26 const target = interaction.options.getUser('user', true);
27 const reason = interaction.options.getString('reason') ?? 'No reason';
28 const member = interaction.guild?.members.cache.get(target.id);
29
30 if (!member) {
31 return interaction.reply({ content: 'User not found.', flags: 'Ephemeral' });
32 }
33
34 await member.ban({ reason });
35 await interaction.reply(`Banned ${target.tag}.`);
36});
  • Registro e handler totalmente desacoplados, sem vínculo estrutural entre eles
  • Checks de permissão escritos à mão em cada handler, sem enforcement ou reuso
  • Todas as interações passam por um único listener global, zero isolamento por feature
  • Sem injeção de dependência; serviços são importados diretamente, sem abstração
  • Sem sistema de módulos; as features crescem lado a lado sem limites claros

Por que existe

Nascido de uma frustração real.

Todo bot da Spacelaxy começava do mesmo jeito: um projeto discord.js limpo que virava uma bagunça conforme novas funcionalidades eram adicionadas. Sem estrutura, sem fronteiras, estado global em todo lugar. O código funcionava, mas ninguém queria mexer nele.

O Spraxium começou como uma ferramenta interna pra resolver isso. Módulos, injeção de dependências, guards: princípios de backend aplicados ao desenvolvimento de bots Discord. Rodou todos os bots da Spacelaxy em produção por mais de um ano antes de qualquer pessoa de fora conhecer.

Agora é open source. O mesmo framework, organizado, documentado e pronto pra quem está cansado de escrever os mesmos if-else em cada listener.

Henry Thierry
Henry Thierry
Fundador, Spacelaxy " Criador do Spraxium

Slash commands

Defina a estrutura. Cuide da lógica. Mantenha-os separados.

O Spraxium divide slash commands em dois arquivos: uma classe de comando que declara opções e permissões, e um handler que recebe serviços injetados e executa a lógica. O framework os conecta automaticamente no boot.

  • Opções type-safe com decorators @SlashOption
  • Injeção de DI completa no handler, como qualquer outra classe
  • Guards aplicados no nível do handler, não dentro do código
  • Auto-registrado no Discord durante a inicialização
src/modules/slash/commands/ban.command.ts
1import { SlashCommand, SlashOption } from '@spraxium/common';
2import { PermissionFlagsBits } from 'discord.js';
3
4@SlashCommand({
5 name: 'ban',
6 description: 'Ban a member from the server.',
7 defaultMemberPermissions: PermissionFlagsBits.BanMembers,
8})
9export class BanCommand {
10 @SlashOption.User('target', {
11 description: 'The member to ban',
12 required: true,
13 })
14 @SlashOption.String('reason', {
15 description: 'Reason for the ban',
16 required: false,
17 })
18 build() {}
19}

Ecossistema de pacotes

Um framework, doze pacotes.

Doze pacotes focados construídos em torno do mesmo contrato de módulos e DI. Cada um é opcional, versionado de forma independente e entra em qualquer módulo com um único import. Comece com core e common. Adicione o restante conforme seu bot cresce.

Componentes de UI

Construa componentes de UI do Discord como classes TypeScript.

Declare cada componente de UI do Discord como uma classe TypeScript tipada. Sem construtores manuais, sem opções espalhadas pelo código. Composível e injetável por padrão.

Explorar Componentes
src/modules/moderation/schemas/buttons.ts
1import { Button, LinkButton } from '@spraxium/components';
2
3@Button({
4 customId: 'mod:ban-confirm',
5 label: 'Confirm Ban',
6 style: 'danger',
7 emoji: '🔨',
8})
9export class BanConfirmButton {}
10
11@Button({
12 customId: 'mod:ban-cancel',
13 label: 'Cancel',
14 style: 'secondary',
15})
16export class BanCancelButton {}
17
18@LinkButton({
19 label: 'View User',
20 url: 'https://discord.com/users/...',
21 emoji: '🔗',
22})
23export class ViewUserButton {}

Modais

Modais com experiência nativa, validados e prontos para produção.

Defina campos de modais como propriedades de classe. Os validadores executam antes do handler ser chamado. Respostas em cache sobrevivem ao timeout de 15 minutos do Discord automaticamente.

Ver documentação
1import {
2 ModalCache,
3 ModalComponent,
4 ModalInput,
5 ModalValidate,
6 minWords,
7 minLength,
8} from '@spraxium/components';
9
10@ModalCache({ ttl: 300 })
11@ModalComponent({ id: 'report', title: 'Report an issue' })
12export class ReportModal {
13 @ModalValidate([minWords(5)])
14 @ModalInput({
15 label: 'What happened?',
16 style: 'paragraph',
17 required: true,
18 maxLength: 1000,
19 })
20 description!: string;
21
22 @ModalValidate([minLength(3)])
23 @ModalInput({
24 label: 'Evidence link',
25 placeholder: 'https://…',
26 })
27 evidence!: string;
28}

Ecossistema CLI

Um comando. Qualquer integração.

A CLI do Spraxium não para em instalar dependência. Ela gera providers, registra módulos e conecta configurações base na sua arquitetura em segundos. Clique em qualquer integração para ver o comando exato e o setup gerado.

Spraxium

Casos de uso

Um framework. Todo tipo de bot.

De bots com slash commands escaláveis a arquiteturas multi-serviço, cada pacote entra de forma independente e faz um único trabalho bem feito.

Arquitetura de bot escalável

Crie bots multi-módulo com DI topológica, pipelines de guards e lifecycle hooks tipados. @spraxium/core e @spraxium/common sustentam estruturas que crescem de 10 a 200 comandos.

Endpoints HTTP dentro do bot

Execute controllers REST no mesmo processo que o Discord. @spraxium/http oferece DTOs, validação e um BotBridge para enviar mensagens no Discord direto dos handlers HTTP.

Entrega de eventos entre serviços

Receba eventos tipados e assinados com HMAC de qualquer backend Node.js via @spraxium/signal. Sem polling, sem banco compartilhado, sem acoplamento entre serviços.

Jobs agendados e automação

Declare jobs cron e por intervalo que iniciam após onReady() e encerram limpos no desligamento. @spraxium/schedule integra nativamente com o lifecycle dos módulos.

Bots multilíngues para comunidades

Resolução de idioma por servidor, arquivos de mensagens carregados sob demanda e chaves de tradução tipadas em todos os slash commands. Desenvolvido com @spraxium/i18n.

Configuração tipada e observabilidade

Valide todas as variáveis de ambiente no boot com schemas gerados automaticamente. Monitore uso de comandos, latência e taxas de erro desde o primeiro dia com @spraxium/env e @spraxium/analytics.

Opiniões reais de beta testers · pré-lançamento

“Já testei discord.js, Necord e até chamadas REST puras. Nada chega perto. Spraxium é o primeiro framework que realmente parece ter sido criado para bots grandes. Necord acopla demais aos internals do discord.js e espalha essa complexidade por todo o projeto. Com Spraxium, cada feature finalmente tem um lugar certo.”

Smoker's avatar
SmokerDesenvolvedor de bots · beta tester

Status do Projeto

O que foi entregue. O que vem a seguir.

O Spraxium está em desenvolvimento ativo. Aqui está uma visão transparente do que está disponível hoje e o que está no roadmap.

Overall progress26 / 35
Concluído
26
  • @spraxium/logger: structured logging
  • @spraxium/webhook: decorator-based senders
  • @Defer() and @AutoDefer() decorators
  • Process lock & --force-unlock flag
  • Upgrade notifier on startup
  • Cross-package stabilization (0.2.0)
  • Webhook handler decorators
  • Hot module reload (dev mode)
Em Progresso
3
  • Documentation site
  • Testing utilities & vitest helpers
  • Example bot projects
Em breve
6
  • @spraxium/dashboard: web UI
  • Plugin registry & marketplace
  • Voice state handler decorators
  • CLI new project templates v2
  • Rate limiting decorators
  • @spraxium/cache: distributed cache

Comece a construir

Trate seu bot como uma superfície de produto.

Limites claros de módulos, um pipeline de guards que cobre todos os tipos de interação, diagnóstico de inicialização que mostra exatamente o que foi carregado, e nove pacotes prontos quando seu bot precisar crescer.