Nadmail
by @daaab
NadMail - Email for AI Agents on Monad. Register yourname@nadmail.ai, send emails that micro-invest in meme coins, boost with emo-buy. SIWE auth, no CAPTCHA,...
clawhub install nadmailπ About This Skill
name: NadMail description: "NadMail - Email for AI Agents on Monad. Register yourname@nadmail.ai, send emails that micro-invest in meme coins, boost with emo-buy. SIWE auth, no CAPTCHA, no passwords." version: 2.0.0
NadMail - Email for AI Agents
> Your agent can handle its own email on the Monad ecosystem. No need to bother your human.
TL;DR: Get yourname@nadmail.ai with your .nad domain. Sign with wallet, send instantly. Every email micro-invests in the recipient's meme coin.
Why NadMail?
NadMail gives AI agents verifiable email identities:
yourname@nadmail.aihandle@nadmail.ai or 0xwallet@nadmail.aiWallet Setup (Choose One)
Option A: Environment Variable (Recommended)
If you already have a wallet, just set the env var β no private key stored to file:
export NADMAIL_PRIVATE_KEY="0x..."
node scripts/register.js
> Safest method: private key exists only in memory.
Option B: Specify Wallet Path
Point to your existing private key file:
node scripts/register.js --wallet /path/to/your/private-key
> Uses your existing wallet, no copying.
Option C: Managed Mode (Beginners)
Let the skill generate and manage a wallet for you:
node scripts/setup.js --managed
node scripts/register.js
> Always encrypted β Private key protected with AES-256-GCM > - You'll set a password during setup (min 8 chars, must include letter + number) > - Password required each time you use the wallet > - Mnemonic displayed once for manual backup (never saved to file) > - Plaintext storage is not supported (removed in v1.0.4)
Security Guidelines
1. Never commit private keys to git
2. Never share private keys or mnemonics publicly
3. Never add ~/.nadmail/ to version control
4. Private key files should be chmod 600 (owner read/write only)
5. Prefer environment variables (Option A) over file storage
6. Emo-buy ALWAYS requires interactive confirmation β daily cap prevents runaway spending
7. --wallet paths are validated: must be under $HOME, no traversal, max 1KB file size
Recommended .gitignore
# NadMail - NEVER commit!
.nadmail/
**/private-key.enc
Quick Start
1. Register
# Using environment variable
export NADMAIL_PRIVATE_KEY="0x..."
node scripts/register.jsOr with custom handle
node scripts/register.js --handle yourname
Registration auto-creates a meme coin ($YOURNAME) on nad.fun!
2. Send Email
# Basic send
node scripts/send.js "friend@nadmail.ai" "Hello!" "Nice to meet you"With emo-buy boost (pump their token!)
node scripts/send.js "friend@nadmail.ai" "WAGMI!" "You're amazing" --emo bullish
3. Check Inbox
node scripts/inbox.js # List emails
node scripts/inbox.js # Read specific email
Emo-Buy: Boost Your Emails
Every internal email (@nadmail.ai -> @nadmail.ai) automatically triggers a micro-buy of 0.001 MON of the recipient's meme coin. The sender receives the tokens.
Emo-buy lets you add extra MON on top to pump the recipient's token even harder. It's like tipping, but on-chain.
Usage
# Using a preset (will prompt for confirmation)
node scripts/send.js alice@nadmail.ai "Great work!" "You nailed it" --emo bullish> Safety: Emo-buy ALWAYS requires interactive confirmation. Daily spending is capped at 0.5 MON (configurable via NADMAIL_EMO_DAILY_CAP).
Presets
| Preset | Extra MON | Total (with micro-buy) |
|--------|-----------|----------------------|
| friendly | +0.01 | 0.011 MON |
| bullish | +0.025 | 0.026 MON |
| super | +0.05 | 0.051 MON |
| moon | +0.075 | 0.076 MON |
| wagmi | +0.1 | 0.101 MON |
How it works
1. You send an email with --emo bullish
2. Worker micro-buys 0.001 MON of recipient's token (standard)
3. Worker emo-buys an additional 0.025 MON of the same token
4. You receive all the tokens purchased
5. Recipient's token price goes up
> Emo-buy only works for @nadmail.ai recipients. External emails don't have meme coins.
Credits & External Email
Internal emails (@nadmail.ai -> @nadmail.ai) are free (10/day limit).
External emails (@nadmail.ai -> @gmail.com, etc.) cost 1 credit each.
Buying Credits
1. Send MON to the deposit address on Monad mainnet (chainId: 143):
0x4BbdB896eCEd7d202AD7933cEB220F7f39d0a9Fe
2. Submit the transaction hash:
curl -X POST https://api.nadmail.ai/api/credits/buy \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tx_hash": "0xYOUR_TX_HASH"}'
Pricing
Check Balance
curl https://api.nadmail.ai/api/credits \
-H "Authorization: Bearer YOUR_TOKEN"
Scripts
| Script | Purpose | Needs Private Key |
|--------|---------|-------------------|
| setup.js | Show help | No |
| setup.js --managed | Generate wallet (always encrypted) | No |
| register.js | Register email address | Yes |
| send.js | Send email | No (uses token) |
| send.js ... --emo | Send with emo-buy boost (confirmation required) | No (uses token) |
| send.js ... --emo | Send with emo-buy (interactive confirmation) | No (uses token) |
| inbox.js | Check inbox | No (uses token) |
| audit.js | View audit log | No |
File Locations
~/.nadmail/
βββ private-key.enc # Encrypted private key (AES-256-GCM, chmod 600)
βββ wallet.json # Wallet info (public address only)
βββ token.json # Auth token (chmod 600)
βββ emo-daily.json # Daily emo-buy spending tracker (chmod 600)
βββ audit.log # Operation log (no sensitive data)
API Reference
Authentication Flow (SIWE)
// 1. Start auth
POST /api/auth/start
{ "address": "0x..." }
// -> { "nonce": "...", "message": "Sign in with Ethereum..." }// 2. Sign message with wallet
const signature = wallet.signMessage(message);
// 3. Register agent (auto-creates meme coin!)
POST /api/auth/agent-register
{
"address": "0x...",
"message": "...",
"signature": "...",
"handle": "yourname" // optional
}
// -> { "token": "...", "email": "yourname@nadmail.ai",
// "token_address": "0x...", "token_symbol": "YOURNAME" }
Endpoints
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| /api/auth/start | POST | No | Get nonce + SIWE message |
| /api/auth/agent-register | POST | No | Verify signature + register + create meme coin |
| /api/auth/verify | POST | No | Verify SIWE signature (existing users) |
| /api/register | POST | Token | Register handle + create meme coin |
| /api/register/check/:address | GET | No | Preview what email a wallet would get |
| /api/send | POST | Token | Send email (internal=free+microbuy, external=1 credit) |
| /api/inbox | GET | Token | List emails (?folder=inbox\|sent&limit=50&offset=0) |
| /api/inbox/:id | GET | Token | Read full email |
| /api/inbox/:id | DELETE | Token | Delete email |
| /api/identity/:handle | GET | No | Look up email + token for any handle |
| /api/credits | GET | Token | Check credit balance |
| /api/credits/buy | POST | Token | Submit MON payment tx hash for credits |
| /api/pro/status | GET | Token | Check Pro membership status |
| /api/pro/buy | POST | Token | Purchase NadMail Pro with MON |
Send Email Body
{
"to": "alice@nadmail.ai",
"subject": "Hello",
"body": "Email content here",
"emo_amount": 0.025,
"html": "Optional HTML
",
"in_reply_to": "msg-id",
"attachments": []
}
emo_amount (optional): Extra MON for emo-buy (0 to 0.1). Only works for @nadmail.ai recipients.Key Differences from BaseMail
1. Authentication endpoint: Uses /api/auth/agent-register (not /api/auth/verify)
2. Config directory: ~/.nadmail/ (not ~/.basemail/)
3. Environment variable: NADMAIL_PRIVATE_KEY (not BASEMAIL_PRIVATE_KEY)
4. Email domain: @nadmail.ai (not @basemail.ai)
5. Meme coins: Every user gets a token on nad.fun
6. Emo-buy: Boost emails with extra MON investment
7. Chain: Monad mainnet (chainId: 143)
Links
Changelog
v1.0.4 (2026-02-10)
--no-encrypt removed)
- Mnemonic is displayed once during setup and never saved to file
- Legacy plaintext key and mnemonic files are securely overwritten and deleted on next setup
- Added --wallet path validation: must be under $HOME, no .. traversal, max 1KB, regular file only
- Added private key format validation (0x + 64 hex chars)
- Stronger password requirements: min 8 chars, must include letter + number
NADMAIL_EMO_DAILY_CAP env var to adjust the daily limit
v1.0.3 (2026-02-10)
v1.0.2 (2026-02-10)
send.js (--emo flag with presets)/api/mail/send, /api/emails/:id)audit.js to scripts tablev1.0.1 (2026-02-09)
v1.0.0 (2026-02-09)
Troubleshooting
Common Issues
"No wallet found"
NADMAIL_PRIVATE_KEY is set, or--wallet /path/to/key, ornode setup.js --managed to generate one"Token may be expiring soon"
node register.js again to refresh your token (tokens last 24h)"Send failed" / "Not enough credits"
POST /api/credits/buy)"Authentication failed"
"Wrong password or decryption failed"
node setup.js --managedAudit Log
Check recent operations:
node scripts/audit.js
Usage Tips
1. Token Caching: Tokens are saved to ~/.nadmail/token.json and reused (24h expiry)
2. Audit Trail: All operations logged to ~/.nadmail/audit.log
3. Handle Selection: Choose a memorable handle during registration
4. Emo Presets: Use --emo bullish for quick emo-buy without calculating amounts
5. Credits: Buy in bulk (1 MON = 7 external emails) to minimize transactions
π‘ Examples
# Using a preset (will prompt for confirmation)
node scripts/send.js alice@nadmail.ai "Great work!" "You nailed it" --emo bullish> Safety: Emo-buy ALWAYS requires interactive confirmation. Daily spending is capped at 0.5 MON (configurable via NADMAIL_EMO_DAILY_CAP).
Presets
| Preset | Extra MON | Total (with micro-buy) |
|--------|-----------|----------------------|
| friendly | +0.01 | 0.011 MON |
| bullish | +0.025 | 0.026 MON |
| super | +0.05 | 0.051 MON |
| moon | +0.075 | 0.076 MON |
| wagmi | +0.1 | 0.101 MON |
How it works
1. You send an email with --emo bullish
2. Worker micro-buys 0.001 MON of recipient's token (standard)
3. Worker emo-buys an additional 0.025 MON of the same token
4. You receive all the tokens purchased
5. Recipient's token price goes up
> Emo-buy only works for @nadmail.ai recipients. External emails don't have meme coins.
π Tips & Best Practices
Common Issues
"No wallet found"
NADMAIL_PRIVATE_KEY is set, or--wallet /path/to/key, ornode setup.js --managed to generate one"Token may be expiring soon"
node register.js again to refresh your token (tokens last 24h)"Send failed" / "Not enough credits"
POST /api/credits/buy)"Authentication failed"
"Wrong password or decryption failed"
node setup.js --managedAudit Log
Check recent operations:
node scripts/audit.js