ClawKit Logo
ClawKitReliability Toolkit
Back to Registry
Official Verified

joomla-5

Joomla 5 site management via REST API, SFTP, and direct database access. Use when working with a Joomla 5 site to: manage articles, categories, menus, and modules via the REST API; edit files via SFTP (templates, .htaccess, robots.txt, configuration.php); run DB queries or patches via a custom PHP endpoint; configure SEO (sitemap, canonical, hreflang, robots.txt); tune performance (gzip, cache, session handler, Varnish); manage extensions and plugins; work with SP Page Builder content; configure FaLang multilingual translations; configure JSitemap Pro; or diagnose Core Web Vitals issues.

skill-install — Terminal

Install via CLI (Recommended)

clawhub install openclaw/skills/skills/andongne/joomla-5
Or

Joomla 5 — Site Management

Access Patterns

Three complementary access layers — choose the right one for each task:

LayerUse forTool
REST APIArticles, categories, menus (read/write)urllib / requests
SFTPTemplate files, .htaccess, configuration.php, robots.txtparamiko
DB endpoint (sppb5.php)Direct DB queries, extension params, plugin config, cache purgeurllib

⚠️ Never use curl --noproxy '*' in this sandbox — it errors. Always use Python urllib.

⚠️ configuration.php is chmod 444 — use SFTP chmod(0o644) before write, restore 0o444 after.

REST API

Base: $JOOMLA_BASE_URL/api/index.php/v1/
Auth: Authorization: Bearer $JOOMLA_API_TOKEN

import urllib.request, json, os

BASE = os.environ['JOOMLA_BASE_URL']
TOKEN = os.environ['JOOMLA_API_TOKEN']

def api(method, path, body=None):
    url = f"{BASE}/api/index.php/v1/{path}"
    data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(url, data=data, method=method,
        headers={'Authorization': f'Bearer {TOKEN}',
                 'Accept': 'application/vnd.api+json',
                 'Content-Type': 'application/json'})
    with urllib.request.urlopen(req) as r:
        return json.loads(r.read())

Key endpoints:

  • content/articles — list/create articles
  • content/articles/{id} — read/update/delete
  • content/categories — categories
  • menus/{menutype}/items — menu items
  • extensions?filter[type]=plugin — list extensions

SFTP Access

import paramiko, os

def sftp_connect():
    key = paramiko.Ed25519Key.from_private_key_file(os.environ['GANDI_SSH_KEY'])
    t = paramiko.Transport((os.environ['GANDI_SFTP_HOST'], 22))
    t.connect(username=os.environ['GANDI_SFTP_USER'], pkey=key)
    return paramiko.SFTPClient.from_transport(t), t

sftp, transport = sftp_connect()
# Read
with sftp.open('/path/to/file', 'r') as f: content = f.read().decode()
# Write (for read-only files: chmod first)
sftp.chmod('/path/to/configuration.php', 0o644)
with sftp.open('/path/to/configuration.php', 'w') as f: f.write(new_content)
sftp.chmod('/path/to/configuration.php', 0o444)

DB Endpoint (sppb5.php)

Custom PHP endpoint at /falang-inject/sppb5.php. Auth: X-Falang-Token header.
See references/sppb5-actions.md for all available actions.

import urllib.request, json, os

SPPB = os.environ['SPPB_URL']   # https://site.org/falang-inject/sppb5.php
TOKEN = os.environ['FALANG_SECRET_TOKEN']

def sppb(action, params='', body=None):
    url = f"{SPPB}?action={action}{params}"
    data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(url, data=data,
        headers={'X-Falang-Token': TOKEN,
                 **(({'Content-Type': 'application/json'}) if body else {})})
    with urllib.request.urlopen(req) as r:
        return json.loads(r.read())

Metadata

Author@andongne
Stars4473
Views1
Updated2026-05-01
View Author Profile
AI Skill Finder

Not sure this is the right skill?

Describe what you want to build — we'll match you to the best skill from 16,000+ options.

Find the right skill
Add to Configuration

Paste this into your clawhub.json to enable this plugin.

{
  "plugins": {
    "official-andongne-joomla-5": {
      "enabled": true,
      "auto_update": true
    }
  }
}
Safety NoteClawKit audits metadata but not runtime behavior. Use with caution.