Discord
Admin notifications for new signups and new submissions.
Discord webhooks are the simplest admin alert channel — no SDK, no auth, just a URL. Launchy fires two events by default.
Setup
- In your Discord server, create a channel (e.g.,
#launchy-alerts) - Right-click the channel → Edit Channel → Integrations → Webhooks → New Webhook
- Copy the Webhook URL:
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/.../...Without this, Discord notifications are silently skipped (lib/discord.ts returns early).
What fires
Two events shipped:
| Event | Message format |
|---|---|
| New user signup | 👤 New user — {name} ({email}) |
| New submission | 📦 New submission — {name} [{tierLabel}]\n{websiteUrl} |
Both are plain text content, not Discord embeds.
See lib/discord.ts for the exact call sites.
Adding custom notifications
The helper accepts a single string (posted as Discord content):
import { notifyDiscord } from "@/lib/discord"
await notifyDiscord("⚠️ Something happened")Fire-and-forget: network errors are caught (.catch(console.error)), so a Discord outage won't break the app.
For the two built-in shortcuts, there's also notifyNewUser(name, email) and notifyNewSubmission(name, tier, websiteUrl) exported from the same file.
Converting to embeds
If you want rich embeds with colors / fields / thumbnails, edit the payload in lib/discord.ts:
body: JSON.stringify({
embeds: [{
title: "New submission",
description: `${name} — ${websiteUrl}`,
color: 0x10b981,
timestamp: new Date().toISOString(),
}],
})Rate limits
Discord webhooks allow 30 requests / minute per webhook. Launchy's event volume stays well under this.
Replacing with Slack / Telegram
Both have similar webhook semantics — edit the POST body shape in lib/discord.ts:
- Slack:
{ text, blocks }to the webhook URL - Telegram:
{ chat_id, text }tohttps://api.telegram.org/bot{TOKEN}/sendMessage
Call sites (notifyDiscord(...)) stay the same.
Common issues
401 Unauthorized — Webhook URL is invalid or was deleted in Discord.
Messages not appearing, no error in logs — The channel may be muted, or the webhook was disabled in Discord settings. Check Edit Channel → Integrations → Webhooks.