Email reminders from your DSH agent when you're away: fires at goal completion, blockage, before asking the user a decision, and at long-task milestones via a bundled zero-dependency Node SMTP sender.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-notify-skill
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:PAKIKNOWLEDGE/dsh-notify-skill
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文
Email reminders from your DSH agent when you're away from the computer.
You start a long-running goal in DSH (or any AI coding agent), then walk away. When the agent finishes, gets blocked, or needs your decision, it sends an email to your phone mailbox — you see it and come back. One-way ping, no remote control.
Design: bundle a sender, teach the fallback
The skill ships one zero-dependency implementation — sender.mjs (~70 lines, only Node built-ins tls/net), so the agent sends mail deterministically in every normal DSH session (DSH runs on Node). The SKILL.md still carries the full contract:
- when to notify (goal done / blocked / before asking you a decision / long-task milestone),
- what to write (specific, in your language, short),
- the config contract (
config.json: sender, SMTP authorization code, recipient; auto-inferred hosts for QQ/163 mail), - how to guide the user through getting an SMTP authorization code when the config is missing,
- failure handling and security rules.
If Node is genuinely unavailable (rare), the skill's instructions tell the agent to implement the ~15-line SMTP call itself with whatever the environment provides — Python smtplib, curl, mail, … — so the skill stays cross-platform (Windows/Linux/macOS) and future-proof.
How it works
| Moment | Suggested marker |
|---|---|
| Goal completed | done |
| Goal blocked / stuck | block |
| About to ask the user a decision | question |
| Long task milestone | info |
The agent sends via the bundled sender:
node sender.mjs "subject" "body" # reads config.json next to it
Knowledge note (Windows): .NET
SmtpClienthas a known hang on implicit-TLS port 465 — the bundled sender usesnode:tlsinstead, which has no such issue.
Install (DSH)
Plugin install (recommended) — the skill ships as a DSH plugin and registers on ctx.skills:
dsh plugin --profile web add dsh-notify-skill
Or from GitHub: dsh plugin --profile web add github:PAKIKNOWLEDGE/dsh-notify-skill. Restart dsh web once after installing, then the skill appears in the session skill catalog.
Manual install (no plugin) — DSH also discovers skills from <dshHome>/skills/<name>/SKILL.md (default ~/.dsh/skills), hot-reloaded by a filesystem watcher:
git clone https://github.com/PAKIKNOWLEDGE/dsh-notify-skill.git "$HOME/.dsh/skills/notify"
Or copy the folder manually to ~/.dsh/skills/notify/. New sessions pick it up immediately.
Setup (one-time, ~5 minutes)
The agent will also walk you through this if you just ask it to use the skill.
- Get an SMTP authorization code (not your login password):
- QQ Mail: web QQ Mail → 设置 → 账户 → enable "POP3/SMTP 服务" → generate a 16-char 授权码
- 163 Mail: web 163 Mail → 设置 → POP3/SMTP/IMAP/SMTP → enable → create 授权码
- Copy
config.example.jsontoconfig.jsonand fill it in:{ "email": { "smtpHost": "", "smtpPort": 465, "useSsl": true, "from": "your-address@qq.com", "authCode": "16-char authorization code", "to": "recipient@example.com" } }smtpHostmay be left empty — it is inferred (@qq.com→smtp.qq.com,@163.com→smtp.163.com, port 465 SSL). - Test: ask your agent to send a test notification (it will implement the sender itself).
Other agents (Claude Code, Codex, ...)
No compatibility work needed — modern agents are smart. Point them at SKILL.md and the config contract; they implement the sender themselves.
Security
config.json(contains your SMTP authorization code) andnotify.logare gitignored — never force-commit them. A leaked authorization code lets anyone send mail as your mailbox.- The skill instructs agents to never print or commit the authorization code.
License
Links
More in this category
xmanrui/dsh-im★ 1525
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
shaobeichen/dsh-pocket★ 1396
Remote phone access to the DSH Web UI: scan a QR code for LAN or public (cloudflared tunnel) access with real-time sync, a mobile-adaptive layout, and a settings tab.
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 572
Connects DeepSeek Harness to Avernet's Bot Collaboration Network over WebSocket V2, with automatic onboarding, isolated agent sessions, tool-call events, and multi-bot routing tools.
omdsh-dev/dsh-notification★ 85
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
whyihaveyou/dsh-suite#plugin-notify★ 57
IM webhook and local notifications on turn completion, errors, or approval (Feishu/WeCom/DingTalk/Slack/Discord/custom).
omdsh-dev/dsh-lark★ 55
Lark/Feishu bot channel for DeepSeek Harness: each chat drives its own agent, and tool approvals, model questions, and plan reviews return as cards answered by a button or a reply. Switch workspace and model from the chat (`/cd`, `/model`, `/new`), and run several bots that keep separate sessions and can hand turns to each other in one group.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.