Agent skill

Convert Website

by growerp in growerp/growerp

Convert an existing company website into a GrowERP-hosted website for a new owner (tenant), including logo and page images.

Apache-2.0Auto-check passedData & Analytics

Install Convert Website

skills CLI
$ npx skills add growerp/growerp --skill convert-website -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install growerp/growerp convert-website --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/growerp/growerp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/convert-website .claude/skills/convert-website && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
convert-website
GitHub stars
115
Token cost
~2.6k tokens
SKILL.md length
698 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
Apache-2.0

At a glance

Convert an existing company website into a GrowERP-hosted website for a new owner (tenant), including logo and page images.

  • Works in 7 steps: Scrape and inventory → Theme → Assets → …
  • The user says convert this website
  • SKILL.md covers Arguments, 1. Scrape and inventory, 2. Theme and 3. Assets, plus 4 more sections
  • Calls curl

What it does

Convert Website is an agent skill from growerp/growerp. Convert an existing company website into a GrowERP-hosted website for a new owner (tenant), including logo and page images. Use when the user says "convert this website", "scrape <site into GrowERP", "import a website as a new owner", or gives a company URL to turn into a GrowERP site.

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Data & Analytics, covering Web scraping. It works with Flutter, Linux and macOS. The repository describes itself as: GrowERP AI Flutter ERP for Web, Linux, MacOS, Windows, Android, IOS using Moqui.org in English, French, German, Spanish, Thai and Dutch. The licence is Apache-2.0.

When your agent uses it

  • The user says convert this website
  • Scrape <site into GrowERP
  • Import a website as a new owner
  • Gives a company URL to turn into a GrowERP site

Example prompts

  • “convert this website”
  • “scrape <site into GrowERP”
  • “import a website as a new owner”
  • “/convert-website”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Scrape and inventory
  2. Theme
  3. Assets
  4. Author pages
  5. Generate backend/data/OwnerImportData.xml
  6. Import
  7. Verify

What it can do on your machine

Read from SKILL.md and the folder at commit 83e237c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Convert Website loads about 2.6k tokens when it runs. Until then it costs about 76 tokens; SKILL.md has 698 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~76
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from growerp/growerp at commit 83e237c, republished under its Apache-2.0 licence (© growerp). 698 words, ~2,557 tokens.

Download SKILL.mdSave it as .claude/skills/convert-website/SKILL.md (or your agent's skills folder).
name
convert-website
description
Convert an existing company website into a GrowERP-hosted website for a new owner (tenant), including logo and page images. Use when the user says "convert this website", "scrape <site> into GrowERP", "import a website as a new owner", or gives a company URL to turn into a GrowERP site.

Convert an external website into a new GrowERP owner

Scrape a company website, author it as a GrowERP modern (Lumina) template site, write everything into ONE Moqui data file, and import that file to create a live, tenant-owned, admin-app-editable website.

The full page/theme/styling contract is docs/Website_Template_Definition.md — read it before authoring pages. This skill only covers the conversion pipeline around it.

Arguments

/convert-website <url> --admin-email <e> --admin-first <f> --admin-last <l>
                       --company-name <n> --currency <USD|EUR|...>
                       [--hostnames a.com,www.a.com] [--app AppAdmin]

Interview the user for anything missing. Never use a scraped address as the admin login — that creates a login for a mailbox we do not control. The scraped contact email becomes the company email only.

Pick a <ID>: uppercase, from the company name (ACCUGEO, ANTWEBSYS). It prefixes every resource id in the file. Check it is free before generating: moqui_rest_call e1/moqui.resource.wiki.WikiSpace/<ID>_WS must 404, and grep -rl '<ID>_ROOT' backend/data/ must be empty.

1. Scrape and inventory

bash
curl -sL <url> -o /tmp/home.html                     # follow redirects
grep -oE 'href="[^"]*"' /tmp/home.html | sort -u     # route inventory

Single-page apps: download the JS bundle and mine it — routes grep -oE "path:['\"][^'\"]*", Vue text nodes perl -ne 'while (/t\._v\("([^"]{25,400})"\)/g) { print "$1\n" }', colors grep -oE '#[0-9a-fA-F]{6}' | sort | uniq -c | sort -rn.

Map every page to the page-type matrix (doc §2). Drop pages covered by system routes (product lists, search, cart). Organize many pages into two-level paths (products/pvc, applications/canals) → one navbar dropdown per first segment. Detail/spec pages get a _ prefix on the leaf (products/_pvc-spec) → routable but hidden from menus. Dated blog/news post lists are still not supported — convert posts to hidden pages plus a manual index page, and tell the user.

2. Theme

Extract the palette from the source CSS. Fill all 16 lumina tokens plus luminaBrightness ("dark"/"light") and the social *Url keys per doc §3. Never add a contrast key.

3. Assets

bash
curl -sL <imgUrl> -o /tmp/img/hero-plant.jpg
convert /tmp/img/hero-plant.jpg -resize '1600x1600>' -quality 82 /tmp/img/hero-plant.jpg  # if >300KB and ImageMagick present
base64 -w0 /tmp/img/hero-plant.jpg

Take the logo plus the images that actually carry meaning (hero, product, team) — not sprites, icons or tracking pixels.

Filename rules (/getImage matches with SQL LIKE '<path>%'): lowercase, hyphens only, no _ or % (both are SQL wildcards), and no name may be a prefix of another (hero.jpg + hero-2.jpg is fine, hero.jpg + hero.jpg.webp is not — the lookup takes an arbitrary one of the two).

4. Author pages

Per doc §§2–7: first line exactly <#-- title: X -->, body-only, <main class="pt-28 pb-16"> (pt-24 for home), token classes only (no hex), FreeMarker safety rules (<#noparse> around literal ${} in JS/CSS, no backticks). Text-heavy pages may be .md.ftl (first line # Title, gets prose styling and a TOC sidebar).

Images are referenced as <img src="/getImage/images/<filename>">; the logo is /getLogo. Footer contact details render automatically from the company's contact records — do not hardcode them.

Show full SKILL.md (296 more words)Show less

5. Generate backend/data/<Name>OwnerImportData.xml

<entity-facade-xml type="demo"> (never auto-loaded at install). Content only — no Party, ProductStore or ProductStoreSetting records; those are created at import time.

xml
<!-- 1. directory tree; the root's filename must equal its resourceId -->
<moqui.resource.DbResource filename="<ID>_ROOT" isFile="N" resourceId="<ID>_ROOT" parentResourceId=""/>
<moqui.resource.DbResource filename="content" isFile="N" resourceId="<id>_content_dir" parentResourceId="<ID>_ROOT"/>
<moqui.resource.DbResource filename="images"  isFile="N" resourceId="<ID>_IMAGES"      parentResourceId="<ID>_ROOT"/>
<!-- one extra dir per two-level path group, parent = <id>_content_dir -->

<!-- 2. wiki space (no rootWikiPageId field — it does not exist) -->
<moqui.resource.wiki.WikiSpace wikiSpaceId="<ID>_WS" description="<Company> Website"
    allowAnyHtml="Y" rootPageLocation="dbresource://<ID>_ROOT"/>

<!-- 3. one pair per page; sequenceNum = menu order -->
<moqui.resource.wiki.WikiPage wikiPageId="<id>_about" wikiSpaceId="<ID>_WS" pagePath="about"
    publishedVersionName="01" sequenceNum="3">
    <histories historySeqId="01" versionName="01" changeDateTime="1485028800000"/>
</moqui.resource.wiki.WikiPage>
<moqui.resource.DbResource filename="about.html.ftl" isFile="Y" resourceId="<id>_about"
    parentResourceId="<id>_content_dir">
    <file mimeType="text/html" versionName="01" rootVersionName="01">
        <fileData><![CDATA[<#-- title: About -->
<main class="pt-28 pb-16"> ... </main>]]></fileData>
        <histories versionName="01" versionDate="1485028800000" isDiff="N"/>
    </file>
</moqui.resource.DbResource>

<!-- 4. images and logo, base64 in the CDATA -->
<moqui.resource.DbResource filename="logo.png" isFile="Y" resourceId="<ID>_LOGO" parentResourceId="<ID>_IMAGES"/>
<moqui.resource.DbResourceFile resourceId="<ID>_LOGO" rootVersionName="01" versionName="01" mimeType="image/png">
    <fileData><![CDATA[iVBORw0KGgo...]]></fileData>
</moqui.resource.DbResourceFile>

<!-- 5. theme, under the content dir -->
<moqui.resource.DbResource filename="websiteColor.json" isFile="Y" resourceId="<id>_website_color"
    parentResourceId="<id>_content_dir"> ... mimeType="application/json" ... </moqui.resource.DbResource>

<!-- 6. owner spec, directly under the root -->
<moqui.resource.DbResource filename="ownerSpec.json" isFile="Y" resourceId="<ID>_OWNER_SPEC"
    parentResourceId="<ID>_ROOT">
    <file mimeType="application/json" versionName="01" rootVersionName="01">
        <fileData><![CDATA[{
  "adminEmail": "...", "adminFirstName": "...", "adminLastName": "...",
  "companyName": "AccuGeo Liner, Inc.", "currencyId": "USD", "applicationId": "AppAdmin",
  "hostNames": ["www.accugeo.com", "accugeo.com", "accugeo.localhost:8080"],
  "logoPath": "images/logo.png",
  "contact": {
    "email": "info@accugeo.com",
    "telephone": {"countryCode": "1", "areaCode": "661", "contactNumber": "321-0447"},
    "address": {"address1": "321 Industrial St.", "city": "Bakersfield",
                "postalCode": "93307", "stateProvinceGeoId": "USA_CA", "countryGeoId": "USA"}
  }
}]]></fileData>
        <histories versionName="01" versionDate="1485028800000" isDiff="N"/>
    </file>
</moqui.resource.DbResource>

Gotchas that fail silently:

  • fileData must be a nested element with CDATA. Bare text on the <file> element loads as NULL with no error.
  • publishedVersionName must equal the file versionName exactly — "01", not "1".
  • The root DbResource resolves by filename, not by resourceId; they must match.
  • Keep hostNames literal — the value is used as a regex and the oldest matching row over all stores wins. Always include a <name>.localhost:8080 entry for local testing.
  • Verify stateProvinceGeoId/countryGeoId exist: moqui_rest_call e1/moqui.basic.Geo/USA_CA. A wrong id aborts the import with an FK error.

6. Import

Backend must be running.

mcp__moqui__moqui_execute_service
  serviceName: growerp.100.ImportExportServices100.import#WebsiteOwner
  parameters:  {location: 'component://growerp/data/<Name>OwnerImportData.xml',
                siteId: '<ID>', password: '<chosen or omit for a random one>'}

If the MCP server answers "Unknown service name", its service list predates the backend start — call the service over the Moqui tools endpoint instead (same result, works without a restart):

bash
curl -s -u SystemSupport:moqui -X POST \
  'http://localhost:8080/apps/tools/Service/ServiceRun/runJson' \
  --data-urlencode 'serviceName=growerp.100.ImportExportServices100.import#WebsiteOwner' \
  --data-urlencode 'location=component://growerp/data/<Name>OwnerImportData.xml' \
  --data-urlencode 'siteId=<ID>' --data-urlencode 'password=<chosen>'

The service loads the file, creates the owner with create#Tenant + complete#TenantSetup, repoints the new store at <ID>_WS / dbresource://<ID>_ROOT with PsstTemplateId=modern, adds the hostnames, links the logo and registers every image under <ID>_IMAGES.

Report ownerPartyId, companyPartyId, productStoreId and the password back to the user — it is not recoverable afterwards.

The import runs once per owner: a second run stops with "already registered" and changes nothing. To re-import content into an existing tenant, edit the pages in the admin app's Website dialog instead.

7. Verify

bash
H='Host: www.accugeo.com'
curl -s -o /dev/null -w '%{http_code}\n' -H "$H" http://localhost:8080/            # 200
curl -s -o /dev/null -w '%{http_code}\n' -H "$H" http://localhost:8080/content/about
curl -s -H "$H" http://localhost:8080/ | grep -E '<#|\$\{'                          # empty
curl -s -o /dev/null -w '%{http_code}\n' -H "$H" http://localhost:8080/getLogo      # 200
curl -s -o /dev/null -w '%{http_code}\n' -H "$H" http://localhost:8080/getImage/images/logo.png
curl -s http://localhost:8080/components/styles/<productStoreId>.css | grep -- '--l-contrast'

Check every route from the inventory, that hidden _ pages are absent from the navbar markup, that the dropdown count matches the path groups, and that pre-existing stores still resolve on their own hostnames. Then log in to the admin app with the admin email and the returned password: the Website dialog must list all pages, and the company must show the scraped address, phone and logo.

© growerp, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/convert-website of growerp/growerp.

Open the folder on GitHubat commit 83e237c

Compare with similar skills

Convert Website next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Convert Website compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Convert Website this skillgrowerp/growerp115—~2.6kAutomated safety check: PassApache-2.0
Engine Whats Newflutter/flutter179k—~978Automated safety check: PassBSD-3-Clause
Updating Android SDKflutter/flutter179k—~1.7kAutomated safety check: PassBSD-3-Clause
OdevioOdevio/Odevio-CLI423—~7.6kAutomated safety check: PassMIT
Flutter UI Probelibnativeapi/nativeapi161—~988Automated safety check: PassMIT
flutter_soloud Setupalnitak/flutter_soloud424—~3.6kAutomated safety check: NotesMIT

Similar skills

  • Engine Whats New

    flutter/flutter

    Generates the "what's new" release summary and diff file for changes in the Flutter engine (//engine/src/flutter) between two releases (e.g., 3.47 vs 3.44).

    179k GitHub stars~978 tokensUpdated today
    MobileAuto-check passed
  • Updating Android SDK

    flutter/flutter

    Upgrades Flutter's Android SDK dependency to a new Android API version (or preview/canary release) in packages.txt, verifies CIPD tag uniqueness, and packages/uploads the binaries using…

    179k GitHub stars~1.7k tokensUpdated today
    MobileAuto-check passed
  • Odevio

    Odevio/Odevio-CLI

    Take a Flutter project to an iPhone or the App Store with Odevio - build, sign and publish iOS apps from Windows, Linux or macOS with no Mac and no Xcode.

    423 GitHub stars~7.6k tokensUpdated 14 days ago
    MobileAuto-check passed
  • Flutter UI Probe

    libnativeapi/nativeapi

    Find where widgets are on screen in a running debug Flutter desktop app (macOS, Windows, Linux) by reading its render tree through the VM service — no hard-coded coordinates, no screenshots, works…

    161 GitHub stars~988 tokensUpdated yesterday
    MobileAuto-check passed
  • flutter_soloud Setup

    alnitak/flutter_soloud

    Walks through adding the flutter_soloud audio engine to a Flutter app, with per-platform setup, initialization, binary-size and logging options, and output device switching.

    424 GitHub stars~3.6k tokensUpdated 2 days ago
    MobileAuto-check: notes
  • Gui Test

    libnativeapi/nativeapi

    End-to-end test a desktop app (Flutter desktop apps and plain native executables such as C++ examples) by launching the real app, driving it with guarded synthetic mouse input — eased moves, clicks…

    161 GitHub stars~3.5k tokensUpdated yesterday
    MobileAuto-check passed

More from growerp/growerp

  • Verify

    growerp/growerp

    Build, run and screenshot the GrowERP admin Flutter app headless to verify UI changes at runtime.

    115 GitHub stars~491 tokensUpdated today
    Auto-check passed
  • Create Vertical

    growerp/growerp

    Create a new GrowERP vertical app or extend an existing one from building blocks.

    115 GitHub stars~392 tokensUpdated today
    Auto-check passed

Questions about Convert Website

What does Convert Website do?

Convert an existing company website into a GrowERP-hosted website for a new owner (tenant), including logo and page images. Convert Website is an agent skill from growerp/growerp. Convert an existing company website into a GrowERP-hosted website for a new owner (tenant), including logo and page images.

When should I use Convert Website?

Convert Website fits situations like: the user says convert this website; scrape <site into GrowERP; import a website as a new owner; gives a company URL to turn into a GrowERP site.

How do I install Convert Website in Claude Code?

Run `npx skills add growerp/growerp --skill convert-website -a claude-code`. Or copy the skill folder (.claude/skills/convert-website in growerp/growerp) into .claude/skills/convert-website in your project. Claude Code loads it when a task matches its description.

How do I install Convert Website in Codex?

Run `npx skills add growerp/growerp --skill convert-website -a codex`. Or copy the skill folder (.claude/skills/convert-website in growerp/growerp) into .agents/skills/convert-website in your project. Codex loads it when a task matches its description.

Can I use Convert Website in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add growerp/growerp --skill convert-website -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/convert-website, .gemini/skills/convert-website, .github/skills/convert-website and .opencode/skills/convert-website in your project.

What does Convert Website need to run?

Going by SKILL.md and its folder, Convert Website needs the command-line tools its instructions call (curl).

Does Convert Website access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Convert Website safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Convert Website use?

Convert Website is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Convert Website use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Convert Website?

Skills that share tags, products or a category with Convert Website: Engine Whats New (flutter/flutter, 179k stars), Updating Android SDK (flutter/flutter, 179k stars), Odevio (Odevio/Odevio-CLI, 423 stars) and Flutter UI Probe (libnativeapi/nativeapi, 161 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Convert Website?

growerp (a GitHub organization) maintains it in growerp/growerp, which has 115 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 8, 2026.

Source: growerp/growerp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.