Skip to main content
DevDaily can send standup notes, PR announcements, and weekly summaries directly to Slack and Discord channels using webhooks.

Overview

Notifications enable:
  • Automated standups: Send daily updates to your team channel
  • PR announcements: Notify reviewers when PRs are created
  • Weekly summaries: Share accomplishments with stakeholders
  • Custom messages: Send any DevDaily output to chat
All notifications use webhooks - no OAuth or app installation required. Messages are sent via HTTPS POST requests.

Quick Setup

Run the interactive notification setup:
devdaily init --notifications
This will:
  1. Ask which platform(s) you want to configure
  2. Guide you through webhook URL creation
  3. Test the connection with a sample message
  4. Save configuration to secrets.json

Slack Setup

1

Create Incoming Webhook

  1. Go to https://api.slack.com/apps
  2. Click “Create New App” → “From scratch”
  3. Name it “DevDaily” and select your workspace
  4. Under “Features” → “Incoming Webhooks”, toggle “Activate Incoming Webhooks”
  5. Click “Add New Webhook to Workspace”
  6. Select the channel (e.g., #engineering-standups)
  7. Copy the webhook URL (starts with https://hooks.slack.com/services/...)
2

Store Webhook URL

Add to ~/.config/devdaily/secrets.json:
{
  "slack": {
    "webhookUrl": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXX"
  }
}
3

Enable in Configuration

Update .devdaily.json:
{
  "notifications": {
    "slack": {
      "enabled": true,
      "channel": "#engineering-standups"
    }
  }
}
4

Test Connection

devdaily standup --test-webhook
# Sends test message to Slack

Configuration Options

notifications.slack.enabled
boolean
default:"false"
Enable Slack notifications
notifications.slack.webhookUrl
string
required
Slack incoming webhook URL (stored in secrets.json)
notifications.slack.channel
string
Default channel name (optional, for documentation only - webhook determines actual channel)

Environment Variable

export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."

Discord Setup

1

Create Webhook

  1. Open your Discord server
  2. Right-click the channel → “Edit Channel”
  3. Go to “Integrations” → “Webhooks”
  4. Click “New Webhook”
  5. Name it “DevDaily” and optionally set an avatar
  6. Copy the webhook URL (starts with https://discord.com/api/webhooks/...)
2

Store Webhook URL

Add to ~/.config/devdaily/secrets.json:
{
  "discord": {
    "webhookUrl": "https://discord.com/api/webhooks/123456789/abcdefghijklmnopqrstuvwxyz"
  }
}
3

Enable in Configuration

Update .devdaily.json:
{
  "notifications": {
    "discord": {
      "enabled": true
    }
  }
}
4

Test Connection

devdaily standup --test-webhook
# Sends test message to Discord

Configuration Options

notifications.discord.enabled
boolean
default:"false"
Enable Discord notifications
notifications.discord.webhookUrl
string
required
Discord webhook URL (stored in secrets.json)

Environment Variable

export DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."

Scheduled Standups

Configure automatic daily standup delivery:
.devdaily.json
{
  "notifications": {
    "slack": {
      "enabled": true
    },
    "standupSchedule": "0 9 * * 1-5",
    "standupTimezone": "America/New_York"
  },
  "standup": {
    "scheduleDays": ["monday", "tuesday", "wednesday", "thursday", "friday"],
    "scheduleTime": "09:00"
  }
}
notifications.standupSchedule
string (cron)
Cron expression for standup schedule (e.g., 0 9 * * 1-5 = 9am weekdays)
notifications.standupTimezone
string
default:"America/New_York"
Timezone for scheduled standups (e.g., America/Los_Angeles, Europe/London)
standup.scheduleDays
string[]
Days of week to send standups: monday, tuesday, wednesday, thursday, friday, saturday, sunday
Scheduled standups require setting up a cron job or CI workflow. See the Automation Guide below.

Sending Notifications

Manual Sending

Send any command output to configured channels:
# Send standup to all enabled channels
devdaily standup --send

# Send to Slack only
devdaily standup --slack

# Send to Discord only
devdaily standup --discord

# Send weekly summary
devdaily week --send

# Send PR announcement
devdaily pr --create --send

Automatic Sending

When notifications are enabled, you can configure commands to always send:
.devdaily.json
{
  "standup": {
    "autoSend": true  // Always send standups
  },
  "pr": {
    "announceOnCreate": true  // Announce new PRs
  }
}

Message Formats

Slack Format

Slack messages use Block Kit for rich formatting:
{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "☀️ Daily Standup",
        "emoji": true
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Yesterday:*\n- Implemented OAuth\n- Fixed login bug"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Related Tickets:*\n• <https://jira.com/PROJ-123|PROJ-123>: Add OAuth"
      }
    }
  ]
}
Features:
  • Header with emoji
  • Markdown formatting (*bold*, _italic_, strikethrough)
  • Clickable links for tickets
  • Dividers between sections
  • Contextual footer with timestamp

Discord Format

Discord messages use embeds:
{
  "embeds": [
    {
      "title": "☀️ Daily Standup",
      "description": "**Yesterday:**\n- Implemented OAuth\n- Fixed login bug",
      "color": 4905600,
      "fields": [
        {
          "name": "PROJ-123",
          "value": "[Add OAuth](https://jira.com/PROJ-123)",
          "inline": true
        }
      ],
      "footer": {
        "text": "Sent via DevDaily"
      },
      "timestamp": "2026-03-03T10:15:30.000Z"
    }
  ],
  "username": "DevDaily"
}
Features:
  • Color-coded embeds (green for standup, blue for PR, purple for weekly)
  • Markdown in description
  • Fields for ticket metadata
  • Timestamp and footer
  • Custom username and avatar

Output Format Override

Send Slack-optimized output to any channel:
devdaily standup --format slack --slack
This converts markdown to Slack’s mrkdwn format:
  • **bold***bold*
  • *italic*_italic_
  • [link](url)<url|link>
  • Code blocks → Slack code blocks

Automation

GitHub Actions

Send standups via GitHub Actions:
.github/workflows/daily-standup.yml
name: Daily Standup

on:
  schedule:
    - cron: '0 9 * * 1-5'  # 9am weekdays (UTC)
  workflow_dispatch:  # Manual trigger

jobs:
  standup:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
      
      - name: Install DevDaily
        run: npm install -g devdaily-ai
      
      - name: Send Standup
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        run: |
          devdaily standup --slack --no-copy
Add SLACK_WEBHOOK_URL and DISCORD_WEBHOOK_URL to your repository secrets under Settings → Secrets and variables → Actions.

Cron Job

Send standups via cron (Linux/macOS):
crontab -e
Add:
# Daily standup at 9am (Mon-Fri)
0 9 * * 1-5 cd /path/to/repo && devdaily standup --slack --no-copy

# Weekly summary on Friday at 5pm
0 17 * * 5 cd /path/to/repo && devdaily week --slack --no-copy
Export webhook URLs in your shell profile:
~/.bashrc
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."
export DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."

Notification Types

Standup Notification

devdaily standup --send
Includes:
  • Yesterday’s completed work
  • Today’s planned work
  • Blockers (if any)
  • Related ticket links
  • Commit/file statistics
Appearance:
  • Title: “☀️ Daily Standup”
  • Color: Green
  • Emoji: ☀️

PR Notification

devdaily pr --create --send
Includes:
  • PR title and link
  • Description summary
  • Ticket references
  • Diff statistics
Appearance:
  • Title: ”🔀 New PR: [title]”
  • Color: Blue
  • Emoji: 🔀
  • Direct link to PR

Weekly Summary Notification

devdaily week --send
Includes:
  • Weekly accomplishments
  • Commit and PR counts
  • Ticket completions
  • Stats footer
Appearance:
  • Title: ”📊 Weekly Summary”
  • Color: Purple
  • Emoji: 📊
  • Footer: ”📊 X commits · Y PRs this week”

Custom Messages

Send custom notifications programmatically:
import { sendNotification, formatStandupNotification } from 'devdaily-ai';

const message = formatStandupNotification(
  'Yesterday:\n- Implemented OAuth\n- Fixed login bug',
  [
    {
      id: 'PROJ-123',
      url: 'https://jira.com/browse/PROJ-123',
      title: 'Add OAuth'
    }
  ]
);

await sendNotification(message, { slack: true, discord: true });

Troubleshooting

Webhook Test Fails

  1. Verify webhook URL:
    devdaily config --path
    cat ~/.config/devdaily/secrets.json | grep webhookUrl
    
  2. Test with curl:
    # Slack
    curl -X POST -H 'Content-Type: application/json' \
      -d '{"text":"Test from DevDaily"}' \
      https://hooks.slack.com/services/YOUR/WEBHOOK/URL
    
    # Discord
    curl -X POST -H 'Content-Type: application/json' \
      -d '{"content":"Test from DevDaily"}' \
      https://discord.com/api/webhooks/YOUR/WEBHOOK/URL
    
  3. Check webhook status:

Messages Not Sending

Check configuration:
devdaily config | grep -A5 notifications
Ensure:
  • enabled: true for your platform
  • webhookUrl is set in secrets.json
Both platforms have rate limits:
  • Slack: 1 message per second
  • Discord: 30 messages per minute
Avoid rapid-fire sends. Use --send sparingly.
Test different formats:
devdaily standup --format plain --slack
devdaily standup --format markdown --slack

Network/Firewall Issues

Ensure outbound HTTPS is allowed to:
  • Slack: hooks.slack.com
  • Discord: discord.com
Test connectivity:
ping hooks.slack.com
ping discord.com

Security Best Practices

Webhook URLs are sensitive credentials. Anyone with a webhook URL can send messages to your channel.
  1. Store in secrets.json, never in .devdaily.json:
    // ❌ Bad
    .devdaily.json: { "notifications": { "slack": { "webhookUrl": "..." } } }
    
    // ✅ Good
    secrets.json: { "slack": { "webhookUrl": "..." } }
    
  2. Add secrets.json to .gitignore:
    echo ".devdaily.secrets.json" >> .gitignore
    echo "~/.config/devdaily/secrets.json" >> ~/.gitignore_global
    
  3. Use environment variables in CI/CD:
    env:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
    
  4. Rotate webhooks if exposed:
    • Slack: Delete old webhook, create new one
    • Discord: Delete webhook in channel settings, create new
  5. Restrict channel permissions:
    • Make notification channels read-only for most users
    • Limit who can create/edit webhooks

Disabling Notifications

Temporarily disable without removing configuration:
.devdaily.json
{
  "notifications": {
    "slack": { "enabled": false },
    "discord": { "enabled": false }
  }
}
Or per-command:
devdaily standup --no-send

Configuration Overview

Learn about all configuration options

Standup Command

Generate and send daily standups