---
sidebar_position: 1
---



# Goal 

This walkthrough will be written in [TypeScript](https://www.typescriptlang.org/) but will have JavaScript snippets throughout. 

# Make robust, modular, bots 

- *Modularity*:  sern is built with modularity in mind. You can swap pieces and parts easily. 
- *Familiar*: commands and structures are similar to classic v12 handlers and the official discord.js command handler guide, while packing many features
- *Concise*: Too much code is a liability. with sern, write less for more 🤯 


### Using @sapphire/framework
```ts title="commands/ping.ts" showLineNumbers
import { Command } from '@sapphire/framework'
import type { CommandInteraction } from 'discord.js'

export class PingCommand extends Command {
  public constructor(context: Command.Context) {
    super(context, {
      description: 'Pong!',
      chatInputCommand: {
        register: true,
      },
    })
  }
  public async chatInputRun(interaction: CommandInteraction) {
    await interaction.reply('Pong!')
  }
}
```
### Using @sern/handler
```ts title="commands/ping.ts" showLineNumbers
import { commandModule, CommandType } from '@sern/handler'
import { publish } from '../plugins';

export default commandModule({ 
    type: CommandType.Both,
    plugins: [publish()],
    description: 'Pong!',
    execute: (ctx, args) => {
        await ctx.reply('Pong!')
    }
})
```
Keep in mind the above example acts as both a slash command AND text command
