Brave Local POI Details
brave/brave-search-skills
Looks up full details for local businesses and places, including ratings, hours and contact information, from Brave Search API point-of-interest IDs.
Manages a SublinkPro proxy subscription server through natural language, adding nodes, building subscriptions and share links, and editing templates and tags.
$ npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ZeroDeng01/sublinkPro sublinkpro --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ZeroDeng01/sublinkPro.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skill-sublinkpro .claude/skills/sublinkpro && rm -rf skills-srcUse ~/.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/
Install the "sublinkpro" agent skill from https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkpro into .claude/skills/sublinkpro/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sublinkpro", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkproType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ZeroDeng01/sublinkPro sublinkpro --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZeroDeng01/sublinkPro.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skill-sublinkpro .agents/skills/sublinkpro && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sublinkpro" agent skill from https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkpro into .agents/skills/sublinkpro/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sublinkpro", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ZeroDeng01/sublinkPro sublinkpro --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZeroDeng01/sublinkPro.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skill-sublinkpro .cursor/skills/sublinkpro && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sublinkpro" agent skill from https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkpro into .cursor/skills/sublinkpro/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sublinkpro", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ZeroDeng01/sublinkPro.git --path skill-sublinkpro--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ZeroDeng01/sublinkPro sublinkpro --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZeroDeng01/sublinkPro.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skill-sublinkpro .gemini/skills/sublinkpro && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sublinkpro" agent skill from https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkpro into .gemini/skills/sublinkpro/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sublinkpro", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ZeroDeng01/sublinkPro sublinkproInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ZeroDeng01/sublinkPro.git skills-src && mkdir -p .github/skills && cp -r skills-src/skill-sublinkpro .github/skills/sublinkpro && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sublinkpro" agent skill from https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkpro into .github/skills/sublinkpro/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sublinkpro", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ZeroDeng01/sublinkPro sublinkpro --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZeroDeng01/sublinkPro.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skill-sublinkpro .opencode/skills/sublinkpro && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sublinkpro" agent skill from https://github.com/ZeroDeng01/sublinkPro/tree/main/skill-sublinkpro into .opencode/skills/sublinkpro/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sublinkpro", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
sublinkproManages a SublinkPro proxy subscription server through natural language, adding nodes, building subscriptions and share links, and editing templates and tags.
Once pointed at your SublinkPro server with a base URL and API key, the skill lets you add or query proxy nodes, build and share subscriptions, manage airports and templates, including AI-assisted template edits, work with smart tags and view dashboard stats, all by calling the SublinkPro REST API with curl or an optional Python helper. You do not need to know the API or its parameter names; a plain request such as add this node or show dashboard stats is enough, and asking what can I do lists the available actions.
The skill treats every request as a guided, conversational flow rather than a one-shot command that fails on a missing field, walking through each step when details are missing instead of asking for everything up front. It can also fetch and explain the product's own documentation, for example how the smart tag system works, and if SublinkPro is not installed yet it walks through deploying it using a separate deploy reference.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 11479da. It shows what the files ask for, not the result of running them.
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.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
curldockerdocker-composepythonsshFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
t.meFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
SUBLINK_API_KEYSUBLINK_JWT_SECRETSUBLINK_API_ENCRYPTION_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
SublinkPro Manager loads about 7.2k tokens when it runs. Until then it costs about 66 tokens; SKILL.md has 3,751 words of instructions outside code blocks.
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.
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); the scripts in this folder are not scanned.
The full file from ZeroDeng01/sublinkPro at commit 11479da, republished under its MIT licence (© ZeroDeng01). 3,751 words, ~7,158 tokens.
.claude/skills/sublinkpro/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Control your SublinkPro instance through natural language. This skill lets an AI assistant call the SublinkPro API directly, so you can manage nodes, subscriptions, shares, airports, and templates without opening the web UI.
Copy this directory into your AI agent's skills directory. The exact path depends on your tool — for Claude Code it is ~/.claude/skills/sublinkpro:
cp -r skill-sublinkpro ~/.claude/skills/sublinkpro
# or symlink if you cloned the repo:
ln -s /path/to/sublinkE/skill-sublinkpro ~/.claude/skills/sublinkproFor other agents, place the directory wherever that tool loads skills from.
Set environment variables:
export SUBLINK_BASE_URL=http://localhost:8000 # your SublinkPro server address
export SUBLINK_API_KEY=prefix_xxx_yyy # your API keyGet an API key:
SUBLINK_API_KEYYou don't need to know the API, the parameter names, or what data already exists. Just say what you want in plain language and the assistant guides you the rest of the way. If you're not sure what's possible, simply ask "what can I do?" and you'll get a menu.
Example openers:
vless://..."Under the hood the assistant calls the SublinkPro REST API with curl (or the optional Python helper). Authentication and API quirks are handled for you.
This is the most important section. The agent must treat every request as a guided, conversational flow — never a one-shot command that fails on a missing field. Users generally do not know the API, the parameter names, or what data already exists. Lead them.
Core rules for the agent:
GET /api/v1/nodes/groupsGET /api/v1/subcription/getGET /api/v1/nodes/selector (compact id+name list)GET /api/v1/airportsGET /api/v1/template/getGET /api/v1/nodes/countries / /protocols / /sourcesexpire_type: never / N days / specific date), describe them in words and let the user choose, then map to the correct value yourself.msg, explain it simply, and propose the fix.--form vs --json; the agent handles it.When the user asks "what can you do", "help", or seems unsure where to start, present this menu and ask which one they'd like:
When the user asks how a feature works, how to configure something, what a feature does, or how to troubleshoot — fetch the project's official documentation from GitHub and answer from it. Do not invent or paraphrase from memory. The documentation is always current and authoritative.
How to use the docs:
reference/docs.md (the documentation map).Topics covered: installation & configuration, smart tags, speed tests, unlock checks, chain proxy, AI template editing, airport management, subscription sharing, host management, Cloudflare Tunnel, Telegram bot, MFA, script support, development guide, protocol extensions, internationalization.
When docs don't solve the problem:
If the documentation can't answer the user's question, or they've tried the documented solution and it still doesn't work, guide them to escalate:
Phrase it like: "The docs cover X but your specific case (Y) isn't documented. I'd recommend opening a GitHub issue at [link] or reaching out to the author on Telegram at [link] — they can help diagnose this."
Call the REST API with curl — it ships on virtually every macOS, Windows 10+, and Linux system, so it's the most portable choice and the default. (A Python convenience wrapper, scripts/sublink.py, also exists for hosts that have Python 3 — see the end of this section — but it is optional.)
First ensure the env vars are set (check before calling; if missing, guide the user — see "Error Handling Playbook"):
export SUBLINK_BASE_URL=http://localhost:8000
export SUBLINK_API_KEY=prefix_xxx_yyyEach endpoint in reference/api.md is tagged with a content type. Map it to curl like this:
| Tag in api.md | curl form |
|---|---|
| GET + query | curl -s -H "X-API-Key: $SUBLINK_API_KEY" "$SUBLINK_BASE_URL<path>?k=v&k2=v2" |
| form (POST) | curl -s -H "X-API-Key: $SUBLINK_API_KEY" --data-urlencode 'k=v' --data-urlencode 'k2=v2' "$SUBLINK_BASE_URL<path>" |
| JSON (POST/PUT) | curl -s -H "X-API-Key: $SUBLINK_API_KEY" -H "Content-Type: application/json" -d '{"k":"v"}' "$SUBLINK_BASE_URL<path>" |
| DELETE | curl -s -X DELETE -H "X-API-Key: $SUBLINK_API_KEY" "$SUBLINK_BASE_URL<path>?id=123" |
raw (/c/, SSE) | same as GET, but read the body as-is (no {code,msg,data} wrapper) |
Which endpoints are form vs JSON:
c.PostForm in backend): auth login, node add/update, subscription add/update, template add/update/delete.c.ShouldBindJSON): access keys, node batch operations, subscription preview, subscription sort/batch-sort, chain rules, airports, tags (except /tags/delete which is a query param), scripts, hosts, geoip, group-sort, node-check, settings, AI template endpoints.copy, refresh, trigger).Judge success by the body's code, not the HTTP status — a failure often returns HTTP 200 with code:500. Parse the JSON, check .code (200 = ok; 400/403/404/500 = failure, read .msg and translate it). The #1 cause of 参数错误 failures is a form-vs-JSON mismatch or wrong field casing — re-check the endpoint's tag and exact field names in reference/api.md before retrying.
Examples:
# Get version (public, no key needed)
curl -s "$SUBLINK_BASE_URL/api/v1/version"
# Add a node (form)
curl -s -H "X-API-Key: $SUBLINK_API_KEY" \
--data-urlencode 'link=vless://...' --data-urlencode 'group=US' \
"$SUBLINK_BASE_URL/api/v1/nodes/add"
# Create an airport (JSON)
curl -s -H "X-API-Key: $SUBLINK_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"MyAirport","url":"https://...","cronExpr":"0 */6 * * *","enabled":true}' \
"$SUBLINK_BASE_URL/api/v1/airports"
# List nodes (GET + query)
curl -s -H "X-API-Key: $SUBLINK_API_KEY" \
"$SUBLINK_BASE_URL/api/v1/nodes/get?page=1&pageSize=50"
# Fetch subscription output (raw — uses a share token, not the API key)
curl -s "$SUBLINK_BASE_URL/c/?token=<shareToken>"Optional helper script. If Python 3 is present, scripts/sublink.py does the auth header, form-vs-JSON routing, and code check for you, exiting non-zero on failure. The --form/--json/--query/--raw flags used throughout this doc map directly to the curl table above:
python scripts/sublink.py GET /api/v1/nodes/get --query page=1 --query pageSize=50
python scripts/sublink.py POST /api/v1/nodes/add --form link='vless://...' --form group='US'
python scripts/sublink.py POST /api/v1/airports --json name='MyAirport' --json enabled=true
python scripts/sublink.py GET /c/ --query token='<shareToken>' --rawUse whichever is available on the host — curl first, the script if you prefer and Python is installed. Throughout the workflows below, an endpoint marked (--form) / (--json) just means "use that content type" — apply it with either tool.
Base URL: All routes are under /api/v1/... (except /c/ for subscription consumption)
Response envelope: Every JSON response has {code, msg, data} where code: 200 = success, code: 500 = error
Subscription group spelling: /api/v1/subcription (missing second 's')
Demo mode: Write endpoints with DemoModeRestrict are blocked in demo mode
Share tokens vs API keys: Subscription consumption (/c/?token=...) uses share tokens (from POST /api/v1/shares/add), NOT the API key
See reference/api.md for the complete list of endpoints with parameters and response shapes.
This is how the skill replaces complex web-UI widgets. In the web UI, fields like "Clash template", "nodes", "group", "country filter" are dropdowns, multi-selects, and visual builders. In this skill, the agent reproduces that experience by calling a discovery endpoint, showing the results as a numbered list, and letting the user pick a number. The agent never asks the user to free-type a value that can be discovered, and never invents one.
Whenever you need one of these values, call its source first and present choices:
| Field (what the user picks) | Discovery call | What to show / how it maps |
|---|---|---|
Clash/Surge template (subscription config) | GET /api/v1/template/get | List each file with its category (e.g. clash.yaml — clash). The chosen file string IS the config value. Empty = no template (raw node list). |
Nodes (nodeIds) | GET /api/v1/nodes/selector (paginated; supports --query group= / country= / protocol= filters) | Show items[].ID + Name (+ Group/LinkCountry for context). Selected IDs → comma-joined nodeIds. For "all matching", use GET /api/v1/nodes/ids. |
Group(s) (groups, or node group) | GET /api/v1/nodes/groups | Numbered list of group names. Selected → comma-joined. |
Country filter (CountryWhitelist/CountryBlacklist) | GET /api/v1/nodes/countries | List country codes present; user picks; comma-join. |
Protocol filter (ProtocolWhitelist/ProtocolBlacklist) | GET /api/v1/nodes/protocols | List protocols in use; user picks; comma-join. |
Source filter (node source) | GET /api/v1/nodes/sources | List sources; user picks. |
Tag filter (TagWhitelist/TagBlacklist) | GET /api/v1/tags/list | List tag names; user picks; comma-join. |
Scripts (scripts) | GET /api/v1/script/list | List scripts by id+name; selected IDs → comma-joined. |
| Subscription (to edit/share) | GET /api/v1/subcription/get | List by id+name. |
| Airport (to pull/edit) | GET /api/v1/airports | List by id+name. |
If a discovery call returns an empty list (e.g. no groups yet), say so and offer the alternative (e.g. "you have no groups — want to pick individual nodes instead, or create the group while adding?").
For multi-field resources (subscriptions especially), split fields into three tiers and walk them in order. Never present all fields at once.
name + at least one of nodeIds/groups.)config, country/protocol filter, DelayTime, MinSpeed, UpdateInterval.)DeduplicationRule, NodeNamePreprocess, UnlockRules) which mirror visual builders in the UI and are easy to malform. Do not hand-craft their JSON from a vague request; if the user wants them, ask precise questions or point them to the web UI for that specific widget, and confirm the exact JSON before sending.These describe how to lead the user through each task. Discovery calls (GET) need no confirmation — run them freely to populate choices. Writes (POST/PUT/DELETE) always need a confirmation step. Use the Field Discovery Map above for every "which X?" question.
Add a node
GET /api/v1/nodes/groups, numbered list (plus "new group" / "no group").POST /api/v1/nodes/add (--form). Report the result; offer to add it to a subscription.Build a subscription (the flagship multi-field flow — follow the tiers)
GET /api/v1/nodes/groups, numbered list, multi-pick → groups (comma-joined).GET /api/v1/nodes/selector (offer to narrow with a group/country/protocol filter first since lists can be long), numbered list → nodeIds (comma-joined). At least one of the two is required.config): "Which output template? I'll list your Clash/Surge templates." → GET /api/v1/template/get, list each file+category, the picked file becomes config. Offer "none" (raw nodes).DelayTime (max latency ms), MinSpeed (min MB/s), UpdateInterval (hours). Describe each plainly; default all to off. Say "or just say 'skip' to use none."POST /api/v1/subcription/add (--form).POST /api/v1/subcription/preview is JSON with capitalized field names (NodeIDs as an int array, Groups, DelayTime, CountryWhitelist, ...) — it does NOT mirror the add form fields. See reference/api.md "Preview subscription nodes" for the exact shape.Edit a subscription
GET /api/v1/subcription/get. Show current values so the user edits from a known state, not a blank form.POST /api/v1/subcription/update (--form). Key detail: the subscription is located by oldname (its current name); name is the new name (use the same value if not renaming). You must resend the full field set you want to keep — omitted fields are not preserved. So fetch current values first and re-send them plus your edits.Create a share link
GET /api/v1/subcription/get (numbered list).expire_type 0/1/2 (+ expire_days or expire_at).POST /api/v1/shares/add (--json).GET /c/?token=<shareToken> (use --raw if fetching the actual output).Import an airport
POST /api/v1/airports (--json).POST /api/v1/airports/{id}/pull, then show new nodes via GET /api/v1/nodes/get --query groups=<airportGroup>.AI template editing
GET /api/v1/template/get; capture its text and category.match: "all" for replace/delete operations. Otherwise the default operation contract requires one exact unique match and may fail with PATCH_AMBIGUOUS_MATCH when the same text appears more than once.POST /api/v1/template/ai/edit-sessions/stream (--json with userPrompt, filename, category, currentText, plus current template metadata such as ruleSource, useProxy, proxyLink, and enableIncludeAll when available). Read the SSE stream until template.edit.preview.ready or template.edit.completed; model deltas are progress only. Note: this requires the server's AI assistant to be configured in the web UI; if it returns an upstream/credential error, explain that and stop.candidateText, list operations and warnings, and confirm whether the user wants to accept it. Explain that warnings are review metadata, while validation errors block accept.POST /api/v1/template/ai/edit-sessions/{sessionId}/accept (--json with optional currentText set to the editor's current text). Send currentText whenever you have the current editor text, especially after a prior accepted preview has not been saved yet. It proves the editor base matches the session base so consecutive unsaved accepts can work. It is not the candidate, is never persisted, and must not be treated as the accepted output. Don't include warning-related request fields. The response returns candidateText for the editor but does not persist the template, so save it with the normal template update flow after the user confirms. If currentText is absent or mismatched, the server still protects stale bases through the saved template file check and may return AI_EDIT_STALE_BASE.POST /api/v1/template/ai/edit-sessions/{sessionId}/discard when a sessionId exists.Edit / delete (any resource)
batch-* operation, show the count and affected names/IDs and warn it isn't easily reversible.Deploy or install SublinkPro (the skill can stand up a new instance, not just operate one)
Full command reference: reference/deploy.md. Read it before running anything — never invent deploy commands. Lead the user through these steps:
ssh user@host '...'). Only do this after they confirm the host and grant permission for each remote command.docker --version, docker compose version (or docker-compose version). For the install script, note it needs root and is interactive.docker run, or the one-line install script (binary + systemd/OpenRC; root; interactive menu — hand it over, don't pipe answers).config.yaml alternative are in reference/deploy.md ("Configuration: environment variables & config file") — consult it, never invent a variable. Only add the env vars the user actually chose; everything else stays default. For multi-instance/migration setups, remember SUBLINK_JWT_SECRET + SUBLINK_API_ENCRYPTION_KEY must be set and identical across instances.ssh/scp command you're about to run and get a yes.GET /api/v1/version against the new address (public, no key needed) to confirm it's up. (curl <base>/api/v1/version works too, e.g. for remote.)http://<host>:8000 → sign in admin / 123456 → change the password immediately → Settings → Access Keys → Create → copy the key → set export SUBLINK_BASE_URL=... and export SUBLINK_API_KEY=.... Then offer to continue into operating the instance.Manage an existing deployment (status / logs / update / uninstall) — see reference/deploy.md "Lifecycle".
GET /api/v1/version for up/down; docker ps, docker logs sublinkpro, or docker-compose ps / docker-compose logs -f for container detail.docker-compose pull && docker-compose up -d; plain docker → stop/rm/pull/run with the same flags; script install → re-run the install script.docker-compose down or docker stop/rm, or uninstall.sh. Removing the ./db ./template ./logs data directories is destructive — show exactly what would be deleted and get explicit confirmation before suggesting it.Whenever an API call fails (curl returns an error envelope, or the optional scripts/sublink.py exits non-zero), never dump raw output at the user. Translate it into plain language + the concrete next step, and offer to fix it. Before any call, also make sure SUBLINK_BASE_URL and SUBLINK_API_KEY are set — if not, guide the user through setting them (or deploying) rather than letting the call fail. Map the failure to one of these classes:
| Condition | What it means | What to do for the user |
|---|---|---|
$SUBLINK_BASE_URL is empty/unset | No instance address configured | Ask for their instance address and set it; if they don't have one running, offer to deploy (see workflow above). |
$SUBLINK_API_KEY is empty/unset | No API key configured | Walk them through creating one: web UI → sign in (admin/123456 if fresh) → Settings → Access Keys → Create → copy → set the env var. |
| curl connection error / no response (or the script prints "Could not reach...") | Server unreachable (wrong host/port, not running, firewall) | Run the checklist: is it running? right host/port? remote port exposed? Confirm with GET /api/v1/version. Offer to deploy or check container status. |
code:403 (or HTTP 403) | Auth rejected | Key missing/wrong/expired, or base URL points at a different instance than the key. Re-create the key in the web UI. (Exception: /settings/ai-assistant* 403s by design with an API key — explain that's expected and not fixable via the key.) |
code:500 with a msg | Server rejected the request | Read the msg (it's usually specific, e.g. "订阅名称不能重复"), explain it simply, and propose the correction (pick another name, fill the missing field, etc.). |
code:400/code:404 | Bad/missing parameter or wrong path | Re-check required fields and the resource id (and the form-vs-JSON tag in reference/api.md); re-run discovery (GET) to get valid values, then retry. |
body isn't {code,msg,data} JSON | Hit a non-envelope endpoint (/c/ output, SSE) | That's expected for those endpoints — read the body as-is; don't try to parse an envelope. |
After explaining, always offer the fix as the next action ("want me to set that now?" / "shall I create the key step by step?" / "want me to deploy an instance?") rather than leaving the user at a dead end.
© ZeroDeng01, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (scripts) in skill-sublinkpro of ZeroDeng01/sublinkPro.
Open the folder on GitHubat commit 11479da
SublinkPro Manager 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| SublinkPro Manager this skillZeroDeng01/sublinkPro | 1.7k | — | ~7.2k | Automated safety check: Pass | MIT | |
| Brave Local POI Detailsbrave/brave-search-skills | 183 | — | ~1.9k | Automated safety check: Pass | MIT | |
| OmniRoute Provider Managementdiegosouzapw/OmniRoute | 74k | — | ~2.4k | Automated safety check: Pass | MIT | |
| OpenAPI CLI CallerEvilFreelancer/openapi-to-cli | 265 | — | ~879 | Automated safety check: Pass | MIT | |
| Fivetranrocky-data/rocky | 304 | — | ~914 | Automated safety check: Pass | Apache-2.0 | |
| Dinobase Connector Builderkappa90/dinobase | 263 | — | ~1.9k | Automated safety check: Pass | Custom licence |
brave/brave-search-skills
Looks up full details for local businesses and places, including ratings, hours and contact information, from Brave Search API point-of-interest IDs.
diegosouzapw/OmniRoute
Manages AI provider connections, API keys, OAuth flows and connection tests through OmniRoute's REST API across its 327-provider catalog.
EvilFreelancer/openapi-to-cli
Turns an OpenAPI, Swagger or OpenRPC spec into CLI commands the agent can search and call, with no MCP server or code generation.
rocky-data/rocky
Fivetran REST API reference for Rocky's source adapter. An agent skill from rocky-data/rocky.
kappa90/dinobase
Writes a new Dinobase YAML connector for a REST API that has no verified dlt source, covering auth, pagination, read and write endpoints and incremental loading.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when building ERPNext/Frappe API integrations (v14/v15/v16) including REST API, RPC API, authentication, webhooks, and rate limiting.
ZeroDeng01/sublinkPro
Checklist for reviewing code changes that touch queries, APIs, rendering, caching or algorithms for performance, scalability and resource-usage problems.
ZeroDeng01/sublinkPro
Checklist-driven security review for changes to authentication, authorization, MFA, secrets, input validation and other security-critical code.
ZeroDeng01/sublinkPro
A required checklist for after code changes: validate each changed layer, check that docs and other layers stay in sync, and test before committing or opening a PR.
ZeroDeng01/sublinkPro
Checklist for keeping README, feature, configuration, install and API docs in step with code changes in the same PR, including the Chinese copies.
ZeroDeng01/sublinkPro
Blocking checklist that runs formatting, lint and test commands for changed Go and frontend files before any git add, commit or pull request.
ZeroDeng01/sublinkPro
A checklist for UI changes that touch colors, surfaces or theme code, making sure light and dark modes, devices, states and layering all still work.
Categories
Manages a SublinkPro proxy subscription server through natural language, adding nodes, building subscriptions and share links, and editing templates and tags. Once pointed at your SublinkPro server with a base URL and API key, the skill lets you add or query proxy nodes, build and share subscriptions, manage airports and templates, including AI-assisted template edits, work with smart tags and view dashboard stats, all by calling the SublinkPro REST API with curl or an optional Python helper. You do not need to know the API or its parameter names; a plain request such as add this node or show dashboard stats is enough, and asking what can I do lists the available actions.
SublinkPro Manager fits situations like: adding a new proxy node to a SublinkPro server; building or sharing a subscription from existing nodes; editing a SublinkPro template or checking dashboard stats.
Run `npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a claude-code`. Or copy the skill folder (skill-sublinkpro in ZeroDeng01/sublinkPro) into .claude/skills/sublinkpro in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a codex`. Or copy the skill folder (skill-sublinkpro in ZeroDeng01/sublinkPro) into .agents/skills/sublinkpro in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ZeroDeng01/sublinkPro --skill sublinkpro -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sublinkpro, .gemini/skills/sublinkpro, .github/skills/sublinkpro and .opencode/skills/sublinkpro in your project.
Going by SKILL.md and its folder, SublinkPro Manager needs Python for the scripts in its folder, the command-line tools its instructions call (curl, docker, docker-compose, python and ssh) and credentials named SUBLINK_API_KEY, SUBLINK_JWT_SECRET and SUBLINK_API_ENCRYPTION_KEY. Our summary lists: A running SublinkPro server; A SublinkPro API key.
SKILL.md names 1 domain. As links in the text: t.me. This is read from the text; nothing was executed.
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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
SublinkPro Manager is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.2k tokens (SKILL.md is roughly 29k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with SublinkPro Manager: Brave Local POI Details (brave/brave-search-skills, 183 stars), OmniRoute Provider Management (diegosouzapw/OmniRoute, 74k stars), OpenAPI CLI Caller (EvilFreelancer/openapi-to-cli, 265 stars) and Fivetran (rocky-data/rocky, 304 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ZeroDeng01 (a GitHub user) maintains it in ZeroDeng01/sublinkPro, which has 1,665 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 5, 2026.
Source: ZeroDeng01/sublinkPro on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.