community-publish
Publish previews to a public URL, open-source projects to community GitHub, and list services (free or paid) on the Service Marketplace. Use when the user wants to share, publish, list, open-source, or monetize what they built (e.g. make this dashboard public, share my project, push to GitHub, 上架到服务
By starchild-ai-agent · 4,001 installs
npx skills add starchild-ai-agent/official-skills --skill community-publish
Source repository · Upstream listing
Two concepts: PUBLISH vs LIST — never confuse them
This skill handles two fundamentally different concepts. Mixing them up is the 1 source of wrong answers.
Concept What it means Functions
PUBLISH (发布) Make something accessible — a URL works, or code is on GitHub publish preview , unpublish preview , list published previews , open source , remove open source , list open source , get open source , fork , validate open source
LIST (上架) Make something discoverable/purchasable on the marketplace Free: list in dashboard , unlist from dashboard , delete listing , get listing status <br Paid: create paid service , submit for review , get review status , publish service , unpublish service , list my services , get service , update service , delete service , restore service <br Cover: upload cover image <br Browse + consumer: explore services , get service detail , get service pricing , get service reviews , write service review , favorite service , unfavorite service , get favorite services , get user services , get service earnings , get earnings summary , get service tags , get featured services <br Projects query: explore projects , my projects , favorite projects , get tab counts , get popular tags , get user projects , favorite project , unfavorite project
Publishing does NOT auto list. publish preview() only allocates the URL. open source() only pushes code. Neither makes the project discoverable on the marketplace — that requires a separate, deliberate LIST call.
Listing has two flows
Flow When to use Review? Pricing? Functions
Free listing Free project, show on /projects gallery No No list in dashboard()
Paid listing Charge for access via x402 Required (6 check review, must pass before publishing) Yes (USDC/USDG/USDC(Solana) on platform networks — default Base+Monad+Robinhood+X Layer+Solana, follows all ) create paid service() → submit for review() (required) → publish service()
POST /api/services no longer accepts service type: "free project" . Free listing is done by list in dashboard() (the project gallery flow). Paid listing uses create paid service() + review + publish (the service API flow).
Limited time free promo ≠ this skill
After a paid service is listed, the owner may run a time window free promotion
( free promo start / free promo end ). That is not marketplace listing work and is
not implemented here.
Concept What it is Where
Free listing Free project on /projects gallery this skill → list in dashboard()
free trial count N free calls before charge (pay per use only) this skill → create paid service(..., free trial count=N)
Limited time free promo Calendar window: amount 0 verify, no settle/debit x402 skill → skills/x402/references/selling.md section Limited time free promotion
If the user asks to “开限时免费 / free promo / free for N days” on an already paid listing:
read the x402 skill (self check P1–P5, then PUT free promo). Do not invent APIs in
community publish or confuse it with free trial count .
Visibility model — read this before answering "can others see it?"
A project's "publicness" is three orthogonal switches , not one:
Switch Off state On state Flipped by
URL access Visiting the URL returns 404 URL works for anyone who has the link publish preview / unpublish preview
Gallery discoverability Not on /projects gallery Appears in the gallery list in dashboard / unlist from dashboard
Marketplace listing Not on the Service Marketplace Discoverable + purchasable create paid service + publish service / unpublish service
A project can be in any combination. Never collapse these into "is it public yet".
Status questions are read only operations. Whenever the user asks:
"is it visible / public / discoverable yet?"
"上架了吗 / 在 dashboard 上吗 / 别人能看到吗"
"is the listing live?"
The authoritative answer comes ONLY from a fresh get listing status(slug) (free) or get review status(service id) (paid) call. Do NOT infer from past actions.
Project types — three only
type What it is Eligible for publish preview() ?
task Scheduled cron/interval job No (no HTTP port)
service Long running HTTP service (dashboard, API, page) Yes
script One shot script No (no HTTP port)
Routing — match user intent to the right action
A. Status intents — user wants to know current state
Sample phrasing Action
"is it visible / public / discoverable / live?" get listing status(slug)
"上架了吗 / 在 dashboard 上吗 / 别人能不能看到" get listing status(slug)
"what URLs do I have published?" / "我发布了哪些" list published previews()
"what's open sourced?" / "都有哪些开源代码" list open source(...)
"我的服务" / "my services" / "我的付费服务" list my services()
"审核状态" / "审核通过了吗" / "review status" get review status(service id)
B. Action intents — user wants to change state
Sample phrasing Action Notes
"publish" / "share" / "make public" / "公开" / "发布" (no qualifier) publish preview(preview id) Allocates the URL only. Listing is NOT auto flipped.
"list on the dashboard" / "上架" / "show on community" / "make discoverable" / "发到广场" list in dashboard(slug) Free listing. Requires the preview to already exist.
"上架付费服务" / "make this a paid service" / "上架到服务市场(付费)" create paid service(...) → submit for review() (recommended) → publish service() Paid listing. Needs x402 config first.
"publish AND list" / "发布并上架" publish preview() THEN list in dashboard() Two separate calls in order.
"remove from dashboard" / "下架" / "unlist" / "hide from gallery" unlist from dashboard(slug) Free listing only. Soft unlist (sets is public=false , review status='unlisted' , preserves stats). Preview URL stays alive.
"下架付费服务" / "unpublish service" unpublish service(service id) Paid listing only.
"open source" / "open source the code" / "开源代码" open source(project dir) Pushes code to GitHub. Does NOT list.
"unpublish the URL" / "take down the link" / "停止服务" unpublish preview(slug) Stops the preview container service only. Does NOT affect listing state ( is public / review status unchanged). URL becomes inaccessible (404).
"remove the open source" / "delete from GitHub" remove open source(slug)
"fork" / "install someone's project" fork(source)
"提交审核" / "submit for review" submit for review(service id) Paid only. Required — must pass before publishing
"发布服务" / "publish my service" publish service(service id) Paid only, requires approved or unlisted state
"更新服务" / "update service" update service(service id, ...) Paid only
"删除服务" / "delete service" delete service(service id) Paid only
"删除项目" / "delete listing" / "permanently remove from marketplace" delete listing(slug) Free listing only. Permanently deletes the listing row AND the community slugs record. URL becomes inaccessible (404). Removes from both explore and my projects. Use unlist from dashboard() to hide without deleting.
Ambiguous after rereading Ask one question "你是要 (a) 发布公开 URL,(b) 免费上架到广场,(c) 付费上架到服务市场,还是 (d) 开源代码?"
Cross link via publisher: binding
When the same project has BOTH a public URL AND open sourced code, you want them paired so the frontend renders "View Source" on the listing card and "Visit Live Demo" on the code card. This skill drives that pairing through one explicit binding in project.yaml.
How to declare the binding
Add a publisher: block to project.yaml :
Both fields are optional. If omitted, both default to manifest.name .
Either side can be published first
The gateway holds a pending entry until the second side arrives. No ordering requirement , no manual link step.
Order What happens
open source first → publish preview second open source records pending entry; publish preview consumes it and links
publish preview first → open source second publish preview records pending entry (needs publisher code slug arg); open source consumes it and links
Manual repair (rare)
If a pairing was wired wrong (e.g. after a rename), use:
Architecture
PUBLISH: publish preview() — public URL
publish preview(preview id, slug="", title="", publisher code slug="")
Map a running service to https://community.iamstarchild.com/{user id} {slug} .
preview id : from preview(action='serve') . Must be status=running .
slug : URL suffix only (lowercase alphanumeric + hyphens, 3 50 chars). User id prefix is added automatically.
title : display name for the listing.
publisher code slug : optional cross link binding to a code project's slug.
Returns {"ok": True, "url": "...", "publisher": {...}, "hint": "...",
"x402 detected": bool} — plus a next step warning when x402 detected
is true (complete the paid listing chain).
Constraints:
publish preview does NOT create a paid listing. If the endpoint
charges via x402 (returns 402), the publish flow is INCOMPLETE until you
also run create paid service → submit for review (recommended) → publish service
— otherwise the marketplace shows nothing or "free". The return value
flags this ( x402 detected: true + next step ) when billing is detected.
Max 20 published previews per user (gateway returns 429 over).
Service must be running. Stops working when the container goes down.
Only works inside the Starchild Fly container (needs FLY MACHINE ID ).
Listing visibility default is is public=false . A successful publish preview allocates the URL but does NOT make it discoverable. Discovery requires a separate list in dashboard() call.
Companions:
unpublish preview(slug) — stop the preview container service. URL becomes inaccessible (404). Does NOT affect listing state ( is public / review status unchanged).
list published previews() — all currently published preview URLs for this user.
PUBLISH: open source() — push code to GitHub
open source(project dir, version bump="patch", message="")
Push project source to community projects/projects/{user id}/{slug}/ on GitHub.
project dir : e.g. output/projects/my task
version bump : patch minor major none
message : commit message body describing what this version changed.
You (the agent) should always compose this based on the actual code
changes you made in this session — never leave it blank if you know
what changed. Aim for one to three short lines describing the user visible
change.
This is a PUBLISH action only — it does NOT list anything on the marketplace.
To make a project discoverable, call list in dashboard() (free) or
create paid service() (paid) separately after publishing.
Companions:
fork(source, dest dir=None) — install someone else's open sourced project locally
list open source(type=None, tag=None, user=None, q=None) — browse the GitHub catalog
get open source(source) — fetch one project's full metadata
remove open source(slug) — delete project directory from GitHub catalog (owner only)
validate open source(project dir) — pre flight check before publishing
Project structure
Every project under output/projects/{slug}/ :
LIST (FREE): list in dashboard() — show on /projects gallery
list in dashboard(slug, name=None, description="", cover url=None, tags=None)
Make a published preview discoverable in the public gallery at https://community.iamstarchild.com/projects . Without this, the preview URL works but is invisible to anyone who doesn't already know it.
slug : the full slug returned by publish preview() (i.e. {user id} {suffix} ).
name : gallery card display name