calabasasYour bots, fully typed
A CLI that generates type-safe Discord event handlers for your Convex backend. Configure once, get full TypeScript types for every message, interaction, and member event.
A CLI that generates type-safe Discord event handlers for your Convex backend. Configure once, get full TypeScript types for every message, interaction, and member event.
Three commands to go from zero to type-safe Discord handlers
calabasas bot addInteractive setup walks you through bot registration. Pick your intents, paste your token, and you're ready to go.
export default {
events: [
"messageCreate",
"guildMemberAdd",
],
sync: {
guilds: true,
roles: true,
}
};calabasas.config.tsEnable the events you need and sync tables you want. Your config is the source of truth for type generation.
calabasas generateCreates validators, TypeScript types, and handler wrappers. Full inference from event name to payload shape.
Define what you need. Get autocomplete everywhere.
export default {
events: [
"messageCreate",
"interactionCreate",
"guildMemberAdd",
],
sync: {
guilds: true,
channels: true,
roles: true,
members: true,
}
};import { handleDiscordEvent } from "./discord.generated";
export const messageCreate = handleDiscordEvent(
"messageCreate",
async (ctx, data) => {
// Full autocomplete ✨
data.content
data.author.id
data.channelId
}
);12+
Events
100%
Typed
4
Sync Tables
1
CLI
Messages, interactions, voice, members — all with complete TypeScript coverage
messageCreateinteractionCreateguildMemberAddvoiceStateUpdatemessageReactionAddguildCreatechannelCreatepresenceUpdate+ 4 more events supported
Enable sync tables and Calabasas automatically mirrors your Discord server data to Convex. Query guilds, channels, roles, and members with reactive subscriptions.
Listens to Gateway events and syncs changes in real-time
guildschannelsrolesmembersUse Convex's useQuery to subscribe to Discord data. UI updates automatically when server changes.
Filter members by role, channels by type, or any field. Full Convex query power on Discord data.
Link Discord members to your users table. Build dashboards that combine Discord and app data.
export const getServerMembers = query({
args: { guildId: v.string() },
handler: async (ctx, args) => {
// Query synced Discord data
return ctx.db
.query("members")
.withIndex("by_guild", q =>
q.eq("guildId", args.guildId))
.collect();
}
});