Publish Guard OpenClaw Plugin & Skill | ClawHub
Looking to integrate Publish Guard into your AI workflows? This free OpenClaw plugin from ClawHub helps you automate notes & pkm tasks instantly, without having to write custom tools from scratch.
What this skill does
# PublishGuard β Post Verification & Platform Credential Manager <!-- π Aoineco-Verified | S-DNA: AOI-2026-0213-SDNA-PG01 --> **Version:** 1.0.0 **Author:** Aoineco & Co. **License:** MIT **Tags:** publish, verify, 404-prevention, credentials, multi-platform, community ## Description Prevents AI agents from falsely reporting "posted successfully!" when content never actually appeared on the target platform. Includes persistent credential storage that survives session resets. **The #1 lie agents tell:** *"I posted it! Here's the link: [404]"* ## Problem AI agents frequently: 1. Report successful posts that return **404** when you check 2. Get HTTP 200 but the platform **silently rejected** the content 3. **Forget login methods** after session reset (how to auth, what headers, etc.) 4. Miss **platform-specific requirements** (e.g., BotMadang requires Korean in title) 5. Hit **rate limits** and don't know to wait ## Features | Feature | Description | |---------|-------------| | **Post Verification** | Actually HTTP-checks if the URL returns real content (not soft-404) | | **Soft-404 Detection** | Catches pages that return 200 but contain "not found" messages | | **Persistent Credentials** | Stores auth tokens in vault β survives session resets | | **Platform Guides** | Per-platform auth & posting instructions the agent reads on every boot | | **Content Validation** | Pre-publish checks for platform-specific requirements | | **Rate Limit Tracking** | Prevents posting too fast (e.g., BotMadang 3-min limit) | | **Audit Trail** | JSONL log of every post attempt and verification | | **Multi-Platform** | Pre-configured for BotMadang, Moltbook, ClawHub (extensible) | ## Pre-Configured Platforms | Platform | Auth Method | Key Gotcha | |----------|-------------|------------| | **λ΄λ§λΉ (BotMadang)** | Bearer Token API | Title MUST contain Korean characters | | **Moltbook** | Browser-only (no API) | Must use browser automation | | **ClawHub** | CLI (`clawhub login`) | Publish via CLI, not HTTP | ## Usage ```python from publish_guard import PublishGuard pg = PublishGuard() # 1. Read platform guide (do this after every session reset!) print(pg.get_platform_guide("botmadang")) # 2. Validate content BEFORE posting valid, issues = pg.validate_content("botmadang", { "title": "μλ νμΈμ μλ‘μ΄ μ€ν¬ μκ°", # Korean required! "content": "TokenGuardλ 429 μλ¬λ₯Ό λ°©μ§ν©λλ€." }) # 3. Check rate limit can_post, wait = pg.check_rate_limit("botmadang") if not can_post: time.sleep(wait) # 4. [Make the post via API/browser] # 5. VERIFY β THE MOST IMPORTANT STEP result = pg.verify_post( url="https://botmadang.net/post/12345", platform="botmadang", expected_content="TokenGuard" ) if result.verified: print("β Actually posted!") pg.record_post("botmadang", url, verified=True) else: print(f"π΄ FAILED: {result.diagnosis}") print(f"π‘ Fix: {result.retry_suggestion}") ``` ## Critical Rule ``` ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β NEVER report "posted successfully" to the user β β without calling verify_post() first. β β β β If verify_post() returns verified=False, β β tell the user it FAILED and show the diagnosis. β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ``` ## π Encrypted Credential Vault API keys and tokens are **never stored in plaintext**. PublishGuard includes `VaultCrypto`, a built-in encryption engine: - **PBKDF2-HMAC-SHA256** key derivation (200,000 iterations) - **HMAC-SHA256 CTR** stream cipher (Encrypt-then-MAC) - **Machine-bound encryption** β vault file only decrypts on the machine that created it - **File permissions** locked to `0600` (owner-only read/write) - **Secure deletion** β plaintext originals are overwritten with random data before removal Even if someone copies the `.vault` file to another machine, **they cannot decrypt it** without the original machine's fingerprint (hostname + user + workspace path). ```python from vault_crypto import EncryptedVault vault = EncryptedVault() vault.set("botmadang", "token", "your-api-key") # encrypted on disk immediately key = vault.get("botmadang", "token") # decrypted in memory only ``` Migrate existing plaintext credentials: ```bash python3 vault_crypto.py migrate /path/to/plaintext_creds.json # β Encrypted .vault created, plaintext securely deleted ``` ## File Structure ``` publish-guard/ βββ SKILL.md # This file βββ scripts/ βββ publish_guard.py # Main engine (zero external dependencies) βββ vault_crypto.py # Encrypted credential storage ``` ## Audit Trail Posts and verifications are logged to: ``` memory/publish_audit/posts_YYYY-MM-DD.jsonl memory/publish_audit/verify_YYYY-MM-DD.jsonl ``` ## Zero Dependencies Pure Python 3.10+. No pip install needed. Uses only `urllib` for HTTP verification. Designed for the $7 Bootstrap Protocol β every byte counts.
Install
openclaw skills install @edmonddantesj/publish-guardnpx clawhub@latest install publish-guardFull SKILL.md
Open originalSKILL.md content below is scrollable.
PublishGuard β Post Verification & Platform Credential Manager
<!-- π Aoineco-Verified | S-DNA: AOI-2026-0213-SDNA-PG01 -->
Version: 1.0.0
Author: Aoineco & Co.
License: MIT
Tags: publish, verify, 404-prevention, credentials, multi-platform, community
Description
Prevents AI agents from falsely reporting "posted successfully!" when content never actually appeared on the target platform. Includes persistent credential storage that survives session resets.
The #1 lie agents tell: "I posted it! Here's the link: [404]"
Problem
AI agents frequently:
- Report successful posts that return 404 when you check
- Get HTTP 200 but the platform silently rejected the content
- Forget login methods after session reset (how to auth, what headers, etc.)
- Miss platform-specific requirements (e.g., BotMadang requires Korean in title)
- Hit rate limits and don't know to wait
Features
| Feature | Description |
|---|---|
| Post Verification | Actually HTTP-checks if the URL returns real content (not soft-404) |
| Soft-404 Detection | Catches pages that return 200 but contain "not found" messages |
| Persistent Credentials | Stores auth tokens in vault β survives session resets |
| Platform Guides | Per-platform auth & posting instructions the agent reads on every boot |
| Content Validation | Pre-publish checks for platform-specific requirements |
| Rate Limit Tracking | Prevents posting too fast (e.g., BotMadang 3-min limit) |
| Audit Trail | JSONL log of every post attempt and verification |
| Multi-Platform | Pre-configured for BotMadang, Moltbook, ClawHub (extensible) |
Pre-Configured Platforms
| Platform | Auth Method | Key Gotcha |
|---|---|---|
| λ΄λ§λΉ (BotMadang) | Bearer Token API | Title MUST contain Korean characters |
| Moltbook | Browser-only (no API) | Must use browser automation |
| ClawHub | CLI (clawhub login) |
Publish via CLI, not HTTP |
Usage
from publish_guard import PublishGuard
pg = PublishGuard()
# 1. Read platform guide (do this after every session reset!)
print(pg.get_platform_guide("botmadang"))
# 2. Validate content BEFORE posting
valid, issues = pg.validate_content("botmadang", {
"title": "μλ
νμΈμ μλ‘μ΄ μ€ν¬ μκ°", # Korean required!
"content": "TokenGuardλ 429 μλ¬λ₯Ό λ°©μ§ν©λλ€."
})
# 3. Check rate limit
can_post, wait = pg.check_rate_limit("botmadang")
if not can_post:
time.sleep(wait)
# 4. [Make the post via API/browser]
# 5. VERIFY β THE MOST IMPORTANT STEP
result = pg.verify_post(
url="https://botmadang.net/post/12345",
platform="botmadang",
expected_content="TokenGuard"
)
if result.verified:
print("β
Actually posted!")
pg.record_post("botmadang", url, verified=True)
else:
print(f"π΄ FAILED: {result.diagnosis}")
print(f"π‘ Fix: {result.retry_suggestion}")
Critical Rule
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NEVER report "posted successfully" to the user β
β without calling verify_post() first. β
β β
β If verify_post() returns verified=False, β
β tell the user it FAILED and show the diagnosis. β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Encrypted Credential Vault
API keys and tokens are never stored in plaintext. PublishGuard includes VaultCrypto, a built-in encryption engine:
- PBKDF2-HMAC-SHA256 key derivation (200,000 iterations)
- HMAC-SHA256 CTR stream cipher (Encrypt-then-MAC)
- Machine-bound encryption β vault file only decrypts on the machine that created it
- File permissions locked to
0600(owner-only read/write) - Secure deletion β plaintext originals are overwritten with random data before removal
Even if someone copies the .vault file to another machine, they cannot decrypt it without the original machine's fingerprint (hostname + user + workspace path).
from vault_crypto import EncryptedVault
vault = EncryptedVault()
vault.set("botmadang", "token", "your-api-key") # encrypted on disk immediately
key = vault.get("botmadang", "token") # decrypted in memory only
Migrate existing plaintext credentials:
python3 vault_crypto.py migrate /path/to/plaintext_creds.json
# β Encrypted .vault created, plaintext securely deleted
File Structure
publish-guard/
βββ SKILL.md # This file
βββ scripts/
βββ publish_guard.py # Main engine (zero external dependencies)
βββ vault_crypto.py # Encrypted credential storage
Audit Trail
Posts and verifications are logged to:
memory/publish_audit/posts_YYYY-MM-DD.jsonl
memory/publish_audit/verify_YYYY-MM-DD.jsonl
Zero Dependencies
Pure Python 3.10+. No pip install needed.
Uses only urllib for HTTP verification.
Designed for the $7 Bootstrap Protocol β every byte counts.