Create Navidrome client app catalog entries from a URL. This skill should be used when the user provides a URL and wants to add an app to the Compatible Client Apps catalog. It automates discovering app metadata, downloading screenshots, and generating the index.yaml file.
This skill creates complete app entries for the Navidrome Compatible Client Apps catalog by analyzing a provided URL and discovering all relevant information automatically.
Use this skill when:
assets/apps/Determine the URL type and extract initial information:
| URL Type | What to Extract | | ----------- | -------------------------------------------------------------------- | | GitHub repo | Name, description, README content, releases, screenshots from README | | App website | Name, description, screenshots, links to stores | | Play Store | App name, description, screenshots, developer website | | App Store | App name, description, screenshots, developer website | | Docker Hub | Image name, description, GitHub link |
From the initial URL, find all related resources:
From GitHub repos: Look for:
/screenshots, /images, /docs foldersFrom app websites: Look for:
From app stores: Look for:
If the app has a GitHub/GitLab repository, determine if it's truly open source:
| Check | Result |
| ------------------------------------------------------------------ | ------------------------------------------- |
| Repository has source code (.java, .swift, .ts, .py, etc.) | Likely open source |
| Repository only has releases, issues, or documentation | NOT open source - set isOpenSource: false |
| Repository has a LICENSE file with OSI-approved license | Open source |
| Repository marked as "Source available" but restrictive license | NOT open source - set isOpenSource: false |
| Repository is empty or only contains binaries | NOT open source - set isOpenSource: false |
How to check:
Default behavior:
repoUrl is set and isOpenSource is omitted → treated as open sourceisOpenSource: false when you've confirmed the source is NOT publicly availableCheck documentation/README for mentions of:
api: OpenSubsonicapi: Subsonicapi: NavidromeDefault to Subsonic if unclear but the app claims Subsonic compatibility.
Map discovered information to platforms:
| Evidence | Platform Config |
| --------------------------- | -------------------------------------------- |
| Play Store URL | android: { store: <url> } |
| App Store URL (iPhone/iPad) | ios: { store: <url> } |
| Mac App Store URL | macos: { store: <url> } |
| macOS downloads/releases | macos: true |
| Windows downloads/releases | windows: true |
| Linux downloads/releases | linux: true |
| Web demo/hosted version | web: { url: <url> } or web: true |
| Docker image | docker: { store: <url> } or docker: true |
| CLI tool | other: true |
Find screenshot sources (in priority order):
/screenshots or /images folder in repoDownload images using terminal commands:
cd assets/apps/<app-name>
curl -L -o thumbnail.png "<image-url>"
curl -L -o screen1.png "<image-url>"
Skip these image types:
Run the conversion script:
npm run convert:images <app-name>
Create the folder using kebab-case:
mkdir -p assets/apps/<app-name>
Generate index.yaml with all discovered information following the schema in references/app-schema.json
Required fields (must have values):
name: Display nameurl: Official website or GitHub URLplatforms: At least one platformapi: One of OpenSubsonic, Subsonic, Navidromedescription: 1-2 sentences (max 500 chars)screenshots.thumbnail: Filename of downloaded thumbnailpricing: free, freemium (free + in-app purchases), trial (paid + free trial), or paidOptional fields (include if found):
repoUrl: Repository URL (for release date tracking)isOpenSource: Set to false if repo exists but source is not public (see Step 3)screenshots.gallery: Array of screenshot filenames (max 5)keywords: Search terms not in name/description (max 6)Run validation to ensure correctness:
npm run validate:app <app-name>
Fix any errors before presenting to user.
Given URL: https://github.com/jeffvli/feishin
isOpenSource)api: Navidromeassets/apps/feishin/
index.yaml
thumbnail.webp
screen1.webp
screen2.webp
npm run validate:app feishinAfter completion, present:
index.yaml contentapps/app-schema.json - JSON Schema for validationapps/_template/index.yaml - Example index.yaml structure| Issue | Action |
| ----------------------- | ----------------------------------------------------------- |
| No screenshots found | Warn user, create entry without gallery, thumbnail required |
| URL unreachable | Report error, ask for alternative URL |
| API type unclear | Default to Subsonic, note uncertainty |
| Multiple possible names | Use the most prominent/official name |
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer