Back to blog

Seyfert v3.2.0: Developer Experience, Refined

Small release, big impact. Quality of life improvements that make daily development smoother.

June 17, 2025

The Little Things

Not every release needs a headline feature. Sometimes the best updates are the ones that remove friction from your daily workflow.

Seyfert v3.2.0 is a love letter to developer experience.


waitFor: Await Specific Components

Collectors are powerful, but sometimes you just want to wait for that one button click:

const interaction = await collector.waitFor(
  (i) => i.customId === 'confirm' && i.user.id === userId,
  { timeout: 30000 }
);

if (interaction) {
  await interaction.reply({ content: 'Confirmed!' });
}

No more callback soup. Just clean, linear async code.


Awaitable Text Command Responses

deferReplyResponse and reply for text commands are now properly awaitable:

// Before: Fire and forget
ctx.deferReplyResponse();

// After: Wait for it
await ctx.deferReplyResponse();
await ctx.reply({ content: 'Processing complete!' });

Better control flow. Fewer race conditions.


RegExp Custom IDs

CommandComponent now accepts regular expressions for customId matching:

import { ComponentCommand, type ComponentContext } from 'seyfert';

export default class ProductHandler extends ComponentCommand {
  componentType = 'Button' as const;
  customId = /^product-\d+$/; // Matches product-1, product-42, etc.

  run(ctx: ComponentContext<typeof this.componentType>) {
    const productId = ctx.customId.split('-')[1];
    // Handle any product-{number} button
  }
}

One handler for many buttons. DRY and powerful.


Thread Management

New utility for fetching active threads:

const activeThreads = await client.threads.listGuildActive(guildId);

No more workarounds to find what threads are currently active.


Stability Improvements

Worker Heartbeat

Workers now maintain a heartbeat to keep connections alive. No more mysterious disconnections in long-running worker processes.

Bug Fixes

  • Thread parentId now correctly returns the parent channel ID (was undefined)
  • Gateway properties properly propagate from parent process to child workers
  • Section.accessory throws a clear error when missing
  • roles.delete no longer incorrectly returns a Role object
  • Locale router handles undefined lang gracefully

Upgrade

pnpm install [email protected]

No breaking changes. Just improvements.

Sometimes that's exactly what you need.