skills$openclaw/ecto
visionik3.3k

by visionik

ecto – OpenClaw Skill

ecto is an OpenClaw Skills integration for writing workflows. Ghost.io Admin API CLI for managing blog posts, pages, tags, and content.

3.3k stars5.6k forksSecurity L1
Updated Feb 7, 2026Created Feb 7, 2026writing

Skill Snapshot

nameecto
descriptionGhost.io Admin API CLI for managing blog posts, pages, tags, and content. OpenClaw Skills integration.
ownervisionik
repositoryvisionik/ecto
languageMarkdown
licenseMIT
topics
securityL1
installopenclaw add @visionik/ecto
last updatedFeb 7, 2026

Maintainer

visionik

visionik

Maintains ecto in the OpenClaw Skills directory.

View GitHub profile
File Explorer
32 files
.
cmd
auth_test.go
8.0 KB
auth.go
2.4 KB
images_test.go
3.1 KB
images.go
846 B
newsletters_test.go
3.7 KB
newsletters.go
1.7 KB
pages_test.go
9.0 KB
pages.go
5.9 KB
posts_test.go
17.3 KB
posts.go
8.4 KB
root_test.go
2.5 KB
root.go
5.6 KB
site_test.go
3.8 KB
site.go
1.6 KB
tags_test.go
7.1 KB
tags.go
4.0 KB
testutil_test.go
9.8 KB
users_test.go
3.4 KB
users.go
1.5 KB
webhooks_test.go
3.6 KB
webhooks.go
2.1 KB
internal
config
config_test.go
20.4 KB
config.go
6.2 KB
_meta.json
262 B
CHANGELOG.md
822 B
main.go
84 B
README.md
4.2 KB
SKILL.md
2.9 KB
Taskfile.yml
717 B
SKILL.md

name: ecto description: Ghost.io Admin API CLI for managing blog posts, pages, tags, and content.

ecto - Ghost.io Admin API CLI

Manage Ghost.io blogs via the Admin API. Supports multi-site configuration, markdown-to-HTML conversion, and JSON output for scripting.

Quick Reference

Authentication

ecto auth add <name> --url <ghost-url> --key <admin-api-key>
ecto auth list
ecto auth default <name>
ecto auth remove <name>

Environment overrides: GHOST_URL, GHOST_ADMIN_KEY, GHOST_SITE

Posts

ecto posts [--status draft|published|scheduled|all] [--limit N] [--json]
ecto post <id|slug> [--json] [--body]
ecto post create --title "Title" [--markdown-file file.md] [--stdin-format markdown] [--tag tag1,tag2] [--status draft|published]
ecto post edit <id|slug> [--title "New Title"] [--markdown-file file.md] [--status draft|published]
ecto post delete <id|slug> [--force]
ecto post publish <id|slug>
ecto post unpublish <id|slug>
ecto post schedule <id|slug> --at "2025-01-25T10:00:00Z"

Pages

ecto pages [--status draft|published|all] [--limit N] [--json]
ecto page <id|slug> [--json] [--body]
ecto page create --title "Title" [--markdown-file file.md] [--status draft|published]
ecto page edit <id|slug> [--title "New Title"] [--markdown-file file.md]
ecto page delete <id|slug> [--force]
ecto page publish <id|slug>

Tags

ecto tags [--json]
ecto tag <id|slug> [--json]
ecto tag create --name "Tag Name" [--description "desc"]
ecto tag edit <id|slug> [--name "New Name"] [--description "desc"]
ecto tag delete <id|slug> [--force]

Images

ecto image upload <path> [--json]

Site Info

ecto site [--json]
ecto settings [--json]
ecto users [--json]
ecto user <id|slug> [--json]
ecto newsletters [--json]
ecto newsletter <id> [--json]

Webhooks

ecto webhook create --event <event> --target-url <url> [--name "Hook Name"]
ecto webhook delete <id> [--force]

Events: post.published, post.unpublished, post.added, post.deleted, page.published, etc.

Multi-Site

Use --site <name> to target a specific configured site:

ecto posts --site blog2

Common Workflows

Create and publish from markdown:

ecto post create --title "My Post" --markdown-file post.md --tag blog --status published

Pipe content from stdin:

echo "# Hello World" | ecto post create --title "Quick Post" --stdin-format markdown

Schedule a post:

ecto post schedule future-post --at "2025-02-01T09:00:00Z"

Batch publish drafts:

for id in $(ecto posts --status draft --json | jq -r '.posts[].id'); do
  ecto post publish "$id"
done

Limitations

  • Ghost API does not support listing images or webhooks
  • Member/subscription management not available via Admin API
  • Read-only access to users

Full Docs

Run ecto --ai-help for comprehensive documentation.

README.md

ecto

Command-line interface for the https://ghost.io Admin API.

Manage your Ghost blog from the terminal: create posts, publish pages, upload images, and more.

Installation

go install github.com/visionik/ecto@latest

Or build from source:

git clone https://github.com/visionik/ecto
cd ecto
go build -o ecto .

Quick Start

1. Get your Admin API key

Ghost Admin → Settings → Integrations → Add Custom Integration

Copy the Admin API Key (format: id:secret)

2. Configure ecto

ecto auth add mysite --url https://mysite.ghost.io --key 1234567890abcdef:abcdef1234567890
ecto auth default mysite

3. Start using it

# List posts
ecto posts

# Create a post from markdown
ecto post create --title "Hello World" --markdown-file post.md --status published

# Publish a draft
ecto post publish my-draft-slug

Commands

Authentication

ecto auth add <name> --url <ghost-url> --key <admin-api-key>
ecto auth list
ecto auth default <name>
ecto auth remove <name>

Posts

ecto posts [--status draft|published|scheduled|all] [--limit N] [--json]
ecto post <id|slug> [--json] [--body]
ecto post create --title "Title" [--markdown-file file.md] [--tag tag1,tag2] [--status draft|published]
ecto post edit <id|slug> [--title "New Title"] [--markdown-file file.md] [--status draft|published]
ecto post delete <id|slug> [--force]
ecto post publish <id|slug>
ecto post unpublish <id|slug>
ecto post schedule <id|slug> --at "2025-01-25T10:00:00Z"

Pages

ecto pages [--status draft|published|all] [--limit N] [--json]
ecto page <id|slug> [--json] [--body]
ecto page create --title "Title" [--markdown-file file.md] [--status draft|published]
ecto page edit <id|slug> [--title "New Title"] [--markdown-file file.md]
ecto page delete <id|slug> [--force]
ecto page publish <id|slug>

Tags

ecto tags [--json]
ecto tag <id|slug> [--json]
ecto tag create --name "Tag Name" [--description "desc"]
ecto tag edit <id|slug> [--name "New Name"] [--description "desc"]
ecto tag delete <id|slug> [--force]

Images

ecto image upload <path> [--json]

Site Info

ecto site [--json]
ecto settings [--json]
ecto users [--json]
ecto user <id|slug> [--json]
ecto newsletters [--json]
ecto newsletter <id> [--json]

Webhooks

ecto webhook create --event <event> --target-url <url> [--name "Hook Name"]
ecto webhook delete <id> [--force]

Multi-Site Support

Configure multiple sites and switch between them:

ecto auth add production --url https://blog.example.com --key xxx
ecto auth add staging --url https://staging.example.com --key yyy

# Use --site flag
ecto posts --site staging
ecto post create --title "Test" --site staging

Environment Variables

Override config with environment variables:

  • GHOST_URL - Ghost site URL
  • GHOST_ADMIN_KEY - Admin API key (id:secret format)
  • GHOST_SITE - Site name from config

JSON Output

All read commands support --json for scripting:

# Get all post titles
ecto posts --json | jq -r '.posts[].title'

# Batch publish drafts
for id in $(ecto posts --status draft --json | jq -r '.posts[].id'); do
  ecto post publish "$id"
done

Common Workflows

Create and publish from markdown

ecto post create --title "My Post" --markdown-file post.md --tag blog --status published

Pipe content from stdin

echo "# Quick Note" | ecto post create --title "Quick Note" --stdin-format markdown

Schedule a post

ecto post create --title "Future Post" --markdown-file post.md
ecto post schedule future-post --at "2025-02-01T09:00:00Z"

AI Integration

For LLM/AI agents, use --ai-help to get comprehensive documentation:

ecto --ai-help

Configuration

Config file location: ~/.config/ecto/config.json

{
  "default_site": "mysite",
  "sites": {
    "mysite": {
      "name": "mysite",
      "url": "https://mysite.ghost.io",
      "api_key": "id:secret"
    }
  }
}

Requirements

  • Go 1.21+
  • Ghost 5.x (Admin API v5)

Library

ecto is built on libecto, a Go library for the Ghost Admin API. Use libecto directly for programmatic access.

License

MIT

Permissions & Security

Security level L1: Low-risk skills with minimal permissions. Review inputs and outputs before running in production.

Requirements

  • OpenClaw CLI installed and configured.
  • Language: Markdown
  • License: MIT
  • Topics:

FAQ

How do I install ecto?

Run openclaw add @visionik/ecto in your terminal. This installs ecto into your OpenClaw Skills catalog.

Does this skill run locally or in the cloud?

OpenClaw Skills execute locally by default. Review the SKILL.md and permissions before running any skill.

Where can I verify the source code?

The source repository is available at https://github.com/openclaw/skills/tree/main/skills/visionik/ecto. Review commits and README documentation before installing.