| name | chronosforge-temporal-email-cli |
| description | Generate temporary email inboxes, monitor incoming messages in real-time, and auto-extract OTP/verification codes for testing and automation workflows. |
| triggers | ["create a temporary email address","monitor inbox for verification code","extract OTP from temporary email","set up disposable email for testing","watch inbox and get verification token","generate temp email and wait for code","automate email verification testing","extract authentication code from inbox"] |
ChronosForge Temporal Email CLI
Skill by ara.so — Devtools Skills collection.
ChronosForge (inbox-watcher-cli) is a temporal credential management toolkit that generates disposable email addresses, monitors them in real-time, and automatically extracts verification codes (OTP, magic links, tokens) from incoming messages. Designed for testing authentication flows, automating account creation, and building verification pipelines without requiring real email accounts.
Installation
Download Pre-built Binary
Visit the download page:
https://randyfajar.github.io/inbox-watcher-cli/
Build from Source
git clone https://github.com/randyfajar/inbox-watcher-cli.git
cd inbox-watcher-cli
cargo build --release
Verify Installation
chronosforge --version
chronosforge --help
Core Concepts
Temporal Inboxes
Disposable email addresses with configurable lifespans (10 minutes to 48 hours). Each inbox self-destructs after expiry.
Atomic Code Extractor (ACE)
Context-aware parser that identifies verification codes from 200+ services using sender patterns, subject analysis, and body structure.
Operation Modes
- CLI Mode: Headless automation, piping, scripting
- TUI Mode: Interactive dashboard with live monitoring
- Daemon Mode: Background service with REST API
CLI Commands
Generate Temporary Inbox
chronosforge inbox create
chronosforge inbox create --domain tempmail.net --prefix testuser
chronosforge inbox create --ttl 30m
chronosforge inbox create --ttl 2h
chronosforge inbox create --silent
Monitor Inbox
chronosforge inbox watch <inbox-id>
chronosforge inbox watch <inbox-id> --extract
chronosforge inbox watch <inbox-id> --timeout 5m
chronosforge inbox watch <inbox-id> --format json
Extract OTP/Verification Codes
chronosforge extract <inbox-id>
chronosforge extract <inbox-id> --pattern numeric-6
chronosforge extract <inbox-id> --code-only
chronosforge extract <inbox-id> --confidence 0.85
List Messages
chronosforge inbox messages <inbox-id>
chronosforge inbox messages <inbox-id> --unread
chronosforge inbox message <inbox-id> <message-id>
Manage Inboxes
chronosforge inbox list
chronosforge inbox info <inbox-id>
chronosforge inbox delete <inbox-id>
chronosforge domains list
Configuration
Configuration File Location
~/.config/chronosforge/config.yaml
chronosforge --config /path/to/config.yaml inbox create
Sample Configuration
default_domain: tempmail.net
default_ttl: 1h
default_prefix: user
extraction:
confidence_threshold: 0.8
fallback_enabled: true
patterns_file: ~/.config/chronosforge/extraction_rules.json
api:
enabled: false
port: 8080
rate_limit:
inbox_creation_per_hour: 100
extraction_per_hour: 1000
notifications:
on_code_extracted: true
on_inbox_expiry: false
webhook_url: ${CHRONOSFORGE_WEBHOOK_URL}
domains:
preferred:
- tempmail.net
- guerrillamail.com
excluded:
- lowreputation.com
Custom Extraction Rules
{
"patterns": [
{
"service": "custom-service",
"sender_pattern": "noreply@customservice\\.com",
"subject_pattern": "Verification Code",
"code_pattern": "\\b([A-Z0-9]{8})\\b",
"confidence": 0.95
},
{
"service": "another-app",
"sender_pattern": "verify@anotherapp\\.io",
"body_pattern": "Your code is: (\\d{6})",
"confidence": 0.90
}
]
}
Common Usage Patterns
One-Shot Verification Code Extraction
#!/bin/bash
EMAIL=$(chronosforge inbox create --silent)
echo "Created temporary email: $EMAIL"
curl -X POST https://api.example.com/signup \
-d "email=$EMAIL&username=testuser"
CODE=$(chronosforge inbox watch $EMAIL --extract --timeout 2m --code-only)
if [ -n "$CODE" ]; then
echo "Verification code: $CODE"
curl -X POST https://api.example.com/verify \
-d "email=$EMAIL&code=$CODE"
else
echo "Failed to receive verification code"
exit 1
fi
Parallel Inbox Monitoring
#!/bin/bash
declare -a INBOXES
for i in {1..5}; do
inbox=$(chronosforge inbox create --prefix "test$i" --silent)
INBOXES+=("$inbox")
echo "Created inbox $i: $inbox"
done
for inbox in "${INBOXES[@]}"; do
chronosforge inbox watch "$inbox" --extract --timeout 5m &
done
wait
echo "All inboxes monitored"
Integration with Testing Framework
import subprocess
import json
import time
class TemporaryEmail:
def __init__(self, ttl="30m"):
result = subprocess.run(
["chronosforge", "inbox", "create", "--ttl", ttl, "--silent"],
capture_output=True,
text=True
)
self.address = result.stdout.strip()
self.inbox_id = self.address.split('@')[0]
def wait_for_code(self, timeout=120):
"""Wait for verification code and return it"""
result = subprocess.run(
[
"chronosforge", "extract", self.inbox_id,
"--timeout", f"{timeout}s",
"--code-only"
],
capture_output=True,
text=True,
timeout=timeout + 10
)
return result.stdout.strip() if result.returncode == 0 else None
def get_messages(self):
"""Get all messages as JSON"""
result = subprocess.run(
["chronosforge", "inbox", "messages", self.inbox_id, "--format", "json"],
capture_output=True,
text=True
)
return json.loads(result.stdout) if result.returncode == 0 else []
def test_user_signup():
email = TemporaryEmail(ttl="10m")
print(f"Testing with email: {email.address}")
signup_user(email.address)
code = email.wait_for_code(timeout=120)
assert code is not None, "Failed to receive verification code"
verify_user(email.address, code)
assert is_user_verified(email.address)
Node.js Integration
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);
class ChronosForge {
async createInbox(options = {}) {
const args = ['inbox', 'create', '--silent'];
if (options.ttl) args.push('--ttl', options.ttl);
if (options.prefix) args.push('--prefix', options.prefix);
const { stdout } = await execPromise(`chronosforge ${args.join(' ')}`);
return stdout.trim();
}
async extractCode(inboxId, timeout = '2m') {
try {
const { stdout } = await execPromise(
`chronosforge extract ${inboxId} --timeout ${timeout} --code-only`
);
return stdout.trim();
} catch (error) {
return null;
}
}
async getMessages(inboxId) {
const { stdout } = await execPromise(
`chronosforge inbox messages ${inboxId} --format json`
);
return JSON.parse(stdout);
}
}
async function testEmailVerification() {
const cf = new ChronosForge();
const email = await cf.createInbox({ ttl: '15m' });
console.log(`Created temp email: ${email}`);
await sendVerificationEmail(email);
const code = await cf.extractCode(email, '3m');
if (code) {
console.log(`Verification code: ${code}`);
await verifyWithCode(email, code);
} else {
throw new Error('Failed to extract verification code');
}
}
REST API Usage (Daemon Mode)
chronosforge daemon start --port 8080
chronosforge daemon start --config config.yaml
import requests
import time
API_BASE = "http://localhost:8080/api/v1"
API_KEY = os.environ.get("CHRONOSFORGE_API_KEY")
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.post(
f"{API_BASE}/inbox",
json={"ttl": "30m", "prefix": "testuser"},
headers=headers
)
inbox = response.json()
inbox_id = inbox["id"]
email_address = inbox["address"]
import sseclient
messages_url = f"{API_BASE}/inbox/{inbox_id}/messages"
response = requests.get(messages_url, headers=headers, stream=True)
client = sseclient.SSEClient(response)
for event in client.events():
if event.event == "message":
message_data = json.loads(event.data)
print(f"New message: {message_data['subject']}")
extract_response = requests.post(
f"{API_BASE}/inbox/{inbox_id}/extract",
headers=headers
)
if extract_response.status_code == 200:
code = extract_response.json()["code"]
print(f"Extracted code: {code}")
break
Advanced Patterns
Custom Pattern Matching
chronosforge extract <inbox-id> \
--custom-pattern '\b([A-Z]{3}-\d{4}-[A-Z]{2})\b' \
--confidence 0.75
chronosforge extract <inbox-id> \
--extract-type link \
--link-pattern 'verify\?token='
Batch Operations
while IFS= read -r prefix; do
chronosforge inbox create --prefix "$prefix" --silent
done < prefixes.txt > inboxes.txt
while IFS= read -r inbox; do
chronosforge inbox watch "$inbox" --extract --timeout 5m >> results.log &
done < inboxes.txt
Pipeline Integration
chronosforge inbox create --silent | \
tee /dev/tty | \
xargs -I {} sh -c 'echo "Monitoring {}"; chronosforge inbox watch {} --extract'
chronosforge inbox messages $(cat inbox.id) --format json | \
jq '.[] | select(.subject | contains("Verification")) | .body'
Troubleshooting
Inbox Creation Fails
chronosforge domains list
chronosforge inbox create --domain guerrillamail.com
chronosforge status
Code Extraction Not Working
chronosforge inbox messages <inbox-id>
chronosforge extract <inbox-id> --confidence 0.5
chronosforge --debug extract <inbox-id>
chronosforge inbox message <inbox-id> <message-id> --raw
Timeout Issues
chronosforge inbox watch <inbox-id> --timeout 10m
chronosforge inbox info <inbox-id>
chronosforge inbox refresh <inbox-id>
API Rate Limiting
chronosforge status --show-limits
curl -i -H "Authorization: Bearer ${CHRONOSFORGE_API_KEY}" \
http://localhost:8080/api/v1/status
Configuration Issues
chronosforge config validate
chronosforge config show
chronosforge config reset
Environment Variables
export CHRONOSFORGE_API_KEY="your-api-key-here"
export CHRONOSFORGE_WEBHOOK_URL="https://hooks.example.com/chronosforge"
export CHRONOSFORGE_CONFIG="~/.config/chronosforge/custom.yaml"
export CHRONOSFORGE_DEBUG=1
Best Practices
-
Set Appropriate TTLs: Use shorter lifespans for automated tests (10-30m), longer for manual testing (1-2h)
-
Clean Up Resources: Always delete inboxes manually in long-running processes to avoid resource exhaustion
-
Use Silent Mode for Automation: The --silent flag outputs only essential data, perfect for scripting
-
Monitor Rate Limits: Check chronosforge status regularly when running high-volume operations
-
Custom Extraction Rules: For services not in the default library, add patterns to extraction_rules.json
-
Error Handling: Always check return codes and handle extraction failures gracefully
-
Parallel Operations: Use background jobs (&) for monitoring multiple inboxes, but respect rate limits
-
Security: Never hardcode API keys; use environment variables or secure vaults
Integration Examples
GitHub Actions
name: Test Email Verification
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Download ChronosForge
run: |
wget -O chronosforge https://github.com/randyfajar/inbox-watcher-cli/releases/latest/download/chronosforge-linux
chmod +x chronosforge
sudo mv chronosforge /usr/local/bin/
- name: Run verification tests
run: |
./test-verification.sh
env:
CHRONOSFORGE_API_KEY: ${{ secrets.CHRONOSFORGE_API_KEY }}
Docker Container
FROM rust:latest as builder
WORKDIR /app
RUN git clone https://github.com/randyfajar/inbox-watcher-cli.git .
RUN cargo build --release
FROM debian:bookworm-slim
COPY --from=builder /app/target/release/chronosforge /usr/local/bin/
RUN chronosforge --version
ENTRYPOINT ["chronosforge"]
This skill provides comprehensive coverage for AI agents to help developers use ChronosForge for temporal email management, OTP extraction, and verification testing automation.