[{"data":1,"prerenderedAt":641},["ShallowReactive",2],{"docs-doc-en-github-source":3,"docs-list-en":545},{"doc":4,"locale":542,"available":543},{"id":5,"title":6,"body":7,"description":531,"extension":532,"group":533,"meta":534,"navigation":535,"order":536,"path":537,"section":533,"seo":538,"stem":539,"updated":540,"__hash__":541},"docs_en\u002Fdocs\u002Fgithub-source.md","GitHub source standard",{"type":8,"value":9,"toc":521},"minimark",[10,19,33,38,41,73,80,84,196,220,227,231,234,244,297,304,347,363,367,374,377,404,410,417,421,500,504,514],[11,12,13,14,18],"p",{},"Besides the Workshop, Downloads can fetch a work straight from a public GitHub repository. The repository is the package: the client reads ",[15,16,17],"code",{},"package.json"," in the repository root, validates it against that manifest, then downloads the source archive of that commit. Authors need neither a release nor a zip asset.",[11,20,21,22,27,28,32],{},"This page covers what such a repository has to satisfy. The player-side steps are in ",[23,24,26],"a",{"href":25},"\u002Fdocs\u002Fdownloads","Downloads",", and the manifest fields are in the ",[23,29,31],{"href":30},"\u002Fdocs\u002Fscnexus-package","SCNexus package standard",".",[34,35,37],"h2",{"id":36},"what-the-client-does","What the client does",[11,39,40],{},"Selecting Check and download makes the app fetch the content in four steps:",[42,43,44,53,63,70],"ol",{},[45,46,47,48,52],"li",{},"It resolves the ",[49,50,51],"strong",{},"commit"," for that reference from GitHub using the repository URL and branch, then pins it.",[45,54,55,56,58,59,62],{},"It reads the ",[15,57,17],{}," in that commit's root (capped at 128 KiB), validates it against the SCNexus standard, and requires ",[15,60,61],{},"version"," to be a full semantic version.",[45,64,65,66,69],{},"Once validation passes it shows a preview (name, description, author, version, type, campaign, ",[15,67,68],{},"SCNID"," and whichever other fields the manifest carries); downloading only starts after you confirm.",[45,71,72],{},"It downloads the source archive of that commit into the download directory and marks it completed; the player then selects Install to enter the usual installation flow.",[11,74,75,76,79],{},"The key point is the ",[49,77,78],{},"pinned commit",": the branch is resolved to a concrete commit at preview time and recorded, and the download uses that same commit, so new commits pushed to the branch after the check do not change what this download returns. To pick up a new version, create the task again.",[34,81,83],{"id":82},"what-the-repository-has-to-satisfy","What the repository has to satisfy",[85,86,87,100],"table",{},[88,89,90],"thead",{},[91,92,93,97],"tr",{},[94,95,96],"th",{},"Requirement",[94,98,99],{},"Description",[101,102,103,126,136,146,165,184],"tbody",{},[91,104,105,109],{},[106,107,108],"td",{},"Public repository",[106,110,111,112,115,116,115,119,122,123],{},"Private repositories are never read and no sign-in is used; the endpoints are fixed to ",[15,113,114],{},"github.com",", ",[15,117,118],{},"api.github.com",[15,120,121],{},"raw.githubusercontent.com"," and ",[15,124,125],{},"codeload.github.com",[91,127,128,133],{},[106,129,130,132],{},[15,131,17],{}," in the root",[106,134,135],{},"Only the repository root counts, never a subfolder; one repository holds one work",[91,137,138,141],{},[106,139,140],{},"Manifest meets the standard",[106,142,143,144],{},"Fields, types and resource paths are validated against the ",[23,145,31],{"href":30},[91,147,148,151],{},[106,149,150],{},"Full version number",[106,152,153,154,157,158,115,161,164],{},"A complete semantic version such as ",[15,155,156],{},"1.2.3","; ",[15,159,160],{},"1.2",[15,162,163],{},"v1.2.3"," and \"latest\" are all rejected",[91,166,167,170],{},[106,168,169],{},"Resources really exist",[106,171,172,173,176,177,122,180,183],{},"Every ",[15,174,175],{},"source_path"," declared in ",[15,178,179],{},"maps[]",[15,181,182],{},"mods[]"," must exist in the repository as a file or a component directory",[91,185,186,189],{},[106,187,188],{},"Simple archive structure",[106,190,191,192,195],{},"The archive GitHub produces has a single ",[15,193,194],{},"\u003Crepository>-\u003Ccommit>\u002F"," level, and the work files sit inside it — no nested wrappers",[11,197,198,199,202,203,115,206,122,209,211,212,215,216,219],{},"In plain terms: ",[49,200,201],{},"the repository root is the package root",". Put ",[15,204,205],{},"Maps\u002F",[15,207,208],{},"Mods\u002F",[15,210,17],{}," directly under it; adding a ",[15,213,214],{},"src\u002F"," or ",[15,217,218],{},"pack\u002F"," folder for tidiness is read as the manifest not being in the root.",[11,221,222,223,226],{},"The repository may hold drafts, build scripts and a ",[15,224,225],{},"README.md"," that have nothing to do with installation: they come down with the archive, but only the resources and attachments declared in the manifest are installed.",[34,228,230],{"id":229},"how-to-write-the-address-and-branch","How to write the address and branch",[11,232,233],{},"The repository URL must look like this:",[235,236,242],"pre",{"className":237,"code":239,"language":240,"meta":241},[238],"language-text","https:\u002F\u002Fgithub.com\u002Fowner\u002Frepository\n","text","",[15,243,239],{"__ignoreMap":241},[245,246,247,262,273,292],"ul",{},[45,248,249,250,253,254,257,258,261],{},"Only ",[15,251,252],{},"https:\u002F\u002F"," is accepted — not ",[15,255,256],{},"http:\u002F\u002F",", and not a branch path (",[15,259,260],{},"\u002Ftree\u002Fmain",") or file path copied from the web interface.",[45,263,264,265,268,269,272],{},"A trailing ",[15,266,267],{},"\u002F"," is optional, and a trailing ",[15,270,271],{},".git"," is removed automatically.",[45,274,275,276,279,280,283,284,115,286,215,289,291],{},"The owner may contain letters, digits and ",[15,277,278],{},"-"," and must start with a letter or digit; the repository name may contain letters, digits and ",[15,281,282],{},"_ . -"," but cannot be ",[15,285,32],{},[15,287,288],{},"..",[15,290,271],{}," alone.",[45,293,294,295,32],{},"GitHub Enterprise and other hosts are not supported — the prefix is fixed to ",[15,296,114],{},[11,298,299,300,303],{},"The branch may be a branch name, a tag or a commit, defaulting to ",[15,301,302],{},"main",":",[85,305,306,316],{},[88,307,308],{},[91,309,310,313],{},[94,311,312],{},"Accepted",[94,314,315],{},"Rejected",[101,317,318],{},[91,319,320,331],{},[106,321,322,115,324,115,327,330],{},[15,323,302],{},[15,325,326],{},"release\u002F1.x",[15,328,329],{},"v1.2.0",", a full 40-character commit hash",[106,332,333,334,336,337,215,339,342,343,346],{},"Starting or ending with ",[15,335,267],{},", containing ",[15,338,288],{},[15,340,341],{},"@{",", whitespace, ",[15,344,345],{},"~ ^ : ? * [ \\",", or control characters",[11,348,349,350,352,353,215,355,358,359,362],{},"No path segment may start with ",[15,351,32],{}," or end with ",[15,354,32],{},[15,356,357],{},".lock",". A mistake is reported in the dialog straight away, asking for an address in the ",[15,360,361],{},"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepository"," form or for a branch name.",[34,364,366],{"id":365},"size-and-structure","Size and structure",[11,368,369,370,373],{},"A GitHub source ",[49,371,372],{},"sets no size threshold of its own",": there is no maximum archive size, and the Workshop's creator quota does not apply. As long as the repository can be pushed and the archive produced, the client will fetch it; the real limits are GitHub's own rules on file and repository size, which are not ours and are not checked here.",[11,375,376],{},"Only structural problems are rejected. Before extracting, the client walks the archive's entries; these checks have nothing to do with how large the work is and exist to block archives that cannot be extracted safely:",[245,378,379,395,398,401],{},[45,380,381,382,384,385,115,388,115,391,394],{},"Absolute paths, drive letters or ",[15,383,288],{}," in a path, or Windows reserved names (",[15,386,387],{},"con",[15,389,390],{},"aux",[15,392,393],{},"com1"," and the like).",[45,396,397],{},"Two files differing only in case, which would overwrite each other on Windows.",[45,399,400],{},"Paths nested unreasonably deep, or an enormous number of entries — usually a packaging tool that went wrong.",[45,402,403],{},"A total extracted size far beyond any reasonable range (a hard line against archive bombs); ordinary campaigns and mods never come close.",[11,405,406,407,409],{},"When one of these hits, the dialog reports that the archive structure is unsafe; repack it with a normal directory depth. Reading the manifest has its own separate cap: the root ",[15,408,17],{}," may not exceed 128 KiB, and a normal manifest is only a few KB.",[11,411,412,413,416],{},"When you do want to keep the download small, the reason is usually the player's experience rather than the checks: split the mod into a separate dependency package, declare it in ",[15,414,415],{},"dependencies",", and let the installer place the upstream first.",[34,418,420],{"id":419},"common-failures-and-their-causes","Common failures and their causes",[85,422,423,433],{},[88,424,425],{},[91,426,427,430],{},[94,428,429],{},"Symptom",[94,431,432],{},"Likely cause",[101,434,435,446,466,482,492],{},[91,436,437,443],{},[106,438,439,440,442],{},"Unable to create download task, asking you to check that the repository is public, the branch exists and the root ",[15,441,17],{}," meets the standard",[106,444,445],{},"The repository is private or deleted; the branch, tag or commit is wrong; there is no manifest in the root; a manifest field is invalid; the version is not a full semantic version",[91,447,448,451],{},[106,449,450],{},"Fields missing from the preview",[106,452,453,454,115,457,115,460,115,463,465],{},"The manifest reads fine but ",[15,455,456],{},"name",[15,458,459],{},"description",[15,461,462],{},"author",[15,464,61],{}," and the like are simply absent",[91,467,468,471],{},[106,469,470],{},"The task fails and reports a missing resource",[106,472,473,474,477,478,481],{},"A declared ",[15,475,476],{},".SC2Map"," \u002F ",[15,479,480],{},".SC2Mod"," is not in the repository, or its case or relative path is wrong",[91,483,484,487],{},[106,485,486],{},"The manifest is reported as not being in the root",[106,488,489,490],{},"The work sits in a subfolder, or the repository holds more than one ",[15,491,17],{},[91,493,494,497],{},[106,495,496],{},"The manifest is reported as having changed after the check",[106,498,499],{},"Rarely, GitHub returns content that does not match the pinned commit; create the task again",[34,501,503],{"id":502},"how-it-divides-work-with-the-workshop","How it divides work with the Workshop",[11,505,506,507,510,511,513],{},"A GitHub source is a ",[49,508,509],{},"distribution channel",", not a publishing channel: nothing is reviewed, there is no version history and no work number is produced. To appear in the Workshop and be downloadable by ",[15,512,68],{},", a work still has to be created and uploaded in the creator center.",[11,515,516,517,520],{},"The two can coexist: keep developing in the repository and upload stable versions to the Workshop. Fill the ",[15,518,519],{},"scnid"," field with the number actually assigned to that project; the client will not treat the repository as a Workshop work just because the field is there.",{"title":241,"searchDepth":522,"depth":522,"links":523},3,[524,526,527,528,529,530],{"id":36,"depth":525,"text":37},2,{"id":82,"depth":525,"text":83},{"id":229,"depth":525,"text":230},{"id":365,"depth":525,"text":366},{"id":419,"depth":525,"text":420},{"id":502,"depth":525,"text":503},"The manifest and structural requirements a public GitHub repository has to meet to serve as an install source, and how addresses and branches are written.","md","reference",{},true,30,"\u002Fdocs\u002Fgithub-source",{"title":6,"description":531},"docs\u002Fgithub-source","2026-11-01","E_l1f5j0BV5L4gPTBby-ihqzYGEAb0E0KiENu3mgrUs","en",[542,544],"zh-CN",[546,553,558,562,568,572,574,579,583,587,588,592,597,602,607,610,615,620,625,630,636],{"path":547,"title":548,"description":549,"order":550,"group":551,"section":552,"contentLocale":544},"\u002Fdocs\u002Feditor","创作流程概览","从在《星际争霸II》编辑器中制作，到打包、分发与更新，说明星际枢纽在创作流程里承担的环节。",1,"start","editor",{"path":554,"title":555,"description":556,"order":550,"group":551,"section":557,"contentLocale":542},"\u002Fdocs\u002Foverview","Getting started","SCNexus is a hub app built for the StarCraft community","app",{"path":559,"title":560,"description":561,"order":550,"group":533,"section":533,"contentLocale":542},"\u002Fdocs\u002Freference","Overview","The packaging and source conventions that importing, installing and distributing content depends on.",{"path":563,"title":564,"description":565,"order":566,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fcampaign","Campaign management","Import your own campaigns into the library, activate them in the game, and restore the official campaigns at any time",10,"usage",{"path":569,"title":570,"description":571,"order":566,"group":567,"section":552,"contentLocale":544},"\u002Fdocs\u002Fpackaging","打包安装包","把编辑器产出的地图、模组与 package.json 组织成一个能被星际枢纽自动识别并安装的压缩包。",{"path":30,"title":31,"description":573,"order":566,"group":533,"section":533,"contentLocale":542},"Directory layout, package.json manifest fields, map and mod resource declarations, and how launchers and bundled documents are written for SCNexus work packages.",{"path":575,"title":576,"description":577,"order":578,"group":533,"section":533,"contentLocale":542},"\u002Fdocs\u002Fccm-package","CCM package standard","How CCM describes a campaign in metadata.txt, the key-value format, the directory layout and install targets, and how SCNexus reads these packages.",20,{"path":580,"title":581,"description":582,"order":578,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fcustomize","Custom content","Install maps and mods straight into the game, then pick a launcher map and start in one click",{"path":584,"title":585,"description":586,"order":578,"group":567,"section":552,"contentLocale":544},"\u002Fdocs\u002Ftoolbox","创作工具 · 编码转换","把中文等非 ASCII 文本转成 Galaxy 代码里可用的转义写法，可选直接转码、字符串、文本与触发调试四种输出。",{"path":537,"title":6,"description":531,"order":536,"group":533,"section":533,"contentLocale":542},{"path":589,"title":590,"description":591,"order":536,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fweekly-mutations","Weekly mutations","This week's mutation map, mutators and community rating, plus the full mutator reference",{"path":593,"title":594,"description":595,"order":596,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Freplays","Replays","Index replays by StarCraft profile and replay type, with duplicate detection, bulk export and match data",40,{"path":598,"title":599,"description":600,"order":601,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fworkshop","Workshop","Browse community works, open their details and download reviewed releases",50,{"path":603,"title":604,"description":605,"order":606,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fcreator","Creator center and uploads","Create works, maintain their details, upload new versions and track upload tasks",60,{"path":25,"title":26,"description":608,"order":609,"group":567,"section":557,"contentLocale":542},"Fetch content from GitHub or the Workshop, then install it once you have checked it",70,{"path":611,"title":612,"description":613,"order":614,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Ftools","Creation tools","Local helpers such as the encoding converter; input is never uploaded or stored",80,{"path":616,"title":617,"description":618,"order":619,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fai-assistant","Smart Assistant","A controlled MCP service connecting local data to AI clients on the same machine",90,{"path":621,"title":622,"description":623,"order":624,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Faccount","Account and personal center","Signing in, your profile and level progression, and setting up and maintaining two-step verification",100,{"path":626,"title":627,"description":628,"order":629,"group":567,"section":557,"contentLocale":542},"\u002Fdocs\u002Fsettings","Settings","Language, game directories, feature switches and logging privacy, tab by tab",110,{"path":631,"title":632,"description":633,"order":634,"group":635,"section":557,"contentLocale":542},"\u002Fdocs\u002Fcontributing","Contributing","How to contribute to SCNexus: where the repositories live, how to set up a development environment, what to run before submitting, the code and documentation conventions, the code of conduct, and how to report security issues.",200,"contribute",{"path":637,"title":638,"description":639,"order":640,"group":635,"section":557,"contentLocale":542},"\u002Fdocs\u002Flocalization","Translating the interface","Where the interface translation files live, how keys are named, how to submit changes, how to verify them locally, and what adding a language touches.",210,1793550744913]