[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-upstash-upstash-box-cli":3,"mdc-lh3ql1-key":37,"related-repo-upstash-upstash-box-cli":1984,"related-org-upstash-upstash-box-cli":2081},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"upstash-box-cli","manage remote sandboxed workspaces with Upstash","Drive an Upstash Box (a remote sandboxed workspace) from the terminal with the `box` CLI. Use when asked to run commands, edit files, clone repos, run builds or tests, publish a public URL, or do any work inside a box rather than on this machine.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"upstash","Upstash","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fupstash.png",[12,16,19,22,25],{"name":13,"slug":14,"type":15},"Sandboxing","sandboxing","tag",{"name":17,"slug":18,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"Deployment","deployment",{"name":23,"slug":24,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},15,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fskills","2026-09-04T08:00:47.636184",null,2,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Collection of skills for Upstash","https:\u002F\u002Fgithub.com\u002Fupstash\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fupstash-box-cli","---\nname: upstash-box-cli\ndescription: Drive an Upstash Box (a remote sandboxed workspace) from the terminal with the `box` CLI. Use when asked to run commands, edit files, clone repos, run builds or tests, publish a public URL, or do any work inside a box rather than on this machine.\n---\n\n`box` operates on a **remote container**, not this machine. Your own file and shell\ntools act locally; anything that must happen inside the box goes through `box`.\n\n## Install\n\n```bash\nnpm i -g @upstash\u002Fbox-cli\n```\n\n## Authentication\n\nEvery command needs an API key, or it fails with \"API token required\". Set it once,\nor pass `--token` on any single command. Create one at\nhttps:\u002F\u002Fconsole.upstash.com\u002Fbox.\n\n```bash\nexport UPSTASH_BOX_API_KEY=box_...\n```\n\n## Selecting a box\n\nResolution order is `--box \u003Cid>`, then `$BOX_ID`, then the nearest `.box` file\n(searched upward). Create one and pin it to the working directory:\n\n```bash\nbox create --no-repl --runtime node                    # prints the id, writes .box\nbox create --no-repl --runtime node --clone-repo https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\nbox status                                             # id, where it came from, state\n```\n\n`paused` is not an error; the next command resumes the box.\n\nClean up when the work is done. Boxes cost money while they exist:\n\n```bash\nbox pause                   # keeps the workspace, resumes on the next command\nbox delete --yes            # irreversible; --yes is required without a terminal\n```\n\nNever run `box create` without `--no-repl`, or `box connect` \u002F `box from-snapshot`:\nthey open an interactive REPL and will hang.\n\n## Running commands\n\nPut the remote command after `--`, or its flags are parsed as `box`'s own.\n\n```bash\nbox exec -- npm install\nbox exec -C repo -- npm test\nbox exec --json -- node -e 'console.log(1)'   # {stdout, stderr, exit_code}\n```\n\nOne argument is a shell expression, sent as written, so pipes and redirection work.\nSeveral arguments are argv and are quoted individually, so an argument containing\nspaces stays one argument.\n\nThe remote command's exit code is passed through, so `box exec -- npm test && ...`\nchains normally. Exit code **125** means the CLI itself failed (bad box, bad flags),\nnever a status the remote command returned.\n\nA background server dies with the command that started it. Detach it:\n\n```bash\nbox exec -- '( npm run dev > dev.log 2>&1 & )'\nbox public-url 3000                               # prints the public URL\n```\n\n## Building something and handing back a link\n\n\"Make me a snake game, use Upstash Box\" is a request to build it in a box, run it\nthere, and reply with a URL the user can open. Do the whole thing; do not stop at\nwriting the file.\n\n```bash\nbox create --no-repl --runtime node          # writes .box, so later commands need no --box\n\nbox files write index.html - \u003C\u003C'HTML'\n\u003C!doctype html>\u003Cmeta charset=\"utf-8\">\u003Ctitle>Snake\u003C\u002Ftitle>\n\u003Ccanvas id=\"c\" width=\"400\" height=\"400\">\u003C\u002Fcanvas>\n\u003Cscript>\u002F* the game *\u002F\u003C\u002Fscript>\nHTML\n\nbox files write server.js - \u003C\u003C'JS'\nconst http = require(\"http\"), fs = require(\"fs\");\nhttp.createServer((_, res) => {\n  res.writeHead(200, { \"Content-Type\": \"text\u002Fhtml\" });\n  res.end(fs.readFileSync(\"index.html\"));\n}).listen(3000);\nJS\n\nbox exec -- '( node server.js > server.log 2>&1 & )'          # detached, or it dies\nbox exec -- 'sleep 1; curl -sf localhost:3000 >\u002Fdev\u002Fnull && echo up'\nbox public-url 3000                                           # the link to reply with\n```\n\nNode's own `http` module rather than a package: no install, no network fetch, and it\nworks on a bare `node` runtime.\n\nCheck the port answers before publishing it. A public URL for a port nothing is\nlistening on returns 502, which reads as a broken game rather than as a race with a\nserver that had not finished starting.\n\nReply with the URL itself, not just \"it is running\". Say that the box keeps costing\nmoney until `box delete --yes`, and that the URL is public to anyone who has it —\n`box public-url 3000 --basic-auth` puts credentials in front of it.\n\n## Files\n\nPaths are relative to `\u002Fworkspace\u002Fhome`.\n\n```bash\nbox files list src\nbox files read src\u002Findex.ts\nbox files write src\u002Fapp.ts -    \u003C local.ts    # - reads stdin: use this for code\nbox files write notes.txt \"short text\"\nbox files stat src\u002Findex.ts\nbox files mkdir -p a\u002Fb\u002Fc\nbox files rename old.ts new.ts\nbox files remove build -r                      # a directory needs -r\nbox files upload .\u002Flocal.zip \u002Fworkspace\u002Fhome\u002Flocal.zip\nbox files download repo\n```\n\nWrite code with `-` and stdin. Passing source as an argument mangles it in the shell.\n\nTo search, use the box's own tools: `box exec -- grep -rn TODO src`.\n\n## Git\n\nA clone lands in a directory named after the repo, and every git verb except `clone`\nneeds that directory via `-C`. Without it git runs at the workspace root, which is not\na repository.\n\n```bash\nbox git clone https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\nbox git clone https:\u002F\u002Fgithub.com\u002Forg\u002Frepo -C my-app   # -C is the destination here\nbox git status -C repo\nbox git diff -C repo\nbox git config -C repo --name \"Bot\" --email bot@example.com\nbox git checkout -C repo feature\u002Fx             # creates the branch if missing\nbox git exec -C repo -- add -A\nbox git commit -C repo -m \"message\"\nbox git push -C repo\nbox git create-pr -C repo --title \"Fix the thing\" --base main\n```\n\n`box git exec` takes git's arguments without the leading `git`, and passes git's exit\ncode through.\n\nPrivate repos and PRs need a token at creation: `box create --no-repl --git-token $GITHUB_TOKEN`.\n\n## Agent\n\nIf the box was created with an agent, hand it a task:\n\n```bash\nbox create --no-repl --agent-harness claude-code --agent-model anthropic\u002Fclaude-sonnet-5\nbox run \"Fix the failing test in src\u002Fauth.test.ts\"\nbox run - \u003C prompt.txt\n```\n\nText goes to stdout, tool calls to stderr. Prefer doing the work yourself with the\ncommands above; `box run` is for delegating a whole task to the box's own agent.\n\n## Output\n\nData goes to stdout, diagnostics to stderr, so piping is safe. `--json` prints the\nresult as JSON with no wrapper, on every command that returns data. The ones that\nopen a REPL or print a shell script (`connect`, `from-snapshot`, `init-demo`,\n`completion`) reject it rather than answering an automation caller with a prompt:\n\n```bash\nbox files list --json | jq -r '.[].name'\nbox get \"$(cat .box)\" --json\n```\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,72,79,118,124,146,179,185,214,305,316,321,367,404,410,430,547,552,572,577,636,642,647,951,972,977,998,1004,1016,1289,1302,1314,1320,1341,1692,1710,1722,1728,1733,1825,1838,1844,1888,1978],{"type":43,"tag":44,"props":45,"children":46},"element","p",{},[47,55,57,63,65,70],{"type":43,"tag":48,"props":49,"children":51},"code",{"className":50},[],[52],{"type":53,"value":54},"text","box",{"type":53,"value":56}," operates on a ",{"type":43,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":53,"value":62},"remote container",{"type":53,"value":64},", not this machine. Your own file and shell\ntools act locally; anything that must happen inside the box goes through ",{"type":43,"tag":48,"props":66,"children":68},{"className":67},[],[69],{"type":53,"value":54},{"type":53,"value":71},".",{"type":43,"tag":73,"props":74,"children":76},"h2",{"id":75},"install",[77],{"type":53,"value":78},"Install",{"type":43,"tag":80,"props":81,"children":86},"pre",{"className":82,"code":83,"language":84,"meta":85,"style":85},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm i -g @upstash\u002Fbox-cli\n","bash","",[87],{"type":43,"tag":48,"props":88,"children":89},{"__ignoreMap":85},[90],{"type":43,"tag":91,"props":92,"children":95},"span",{"class":93,"line":94},"line",1,[96,102,108,113],{"type":43,"tag":91,"props":97,"children":99},{"style":98},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[100],{"type":53,"value":101},"npm",{"type":43,"tag":91,"props":103,"children":105},{"style":104},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[106],{"type":53,"value":107}," i",{"type":43,"tag":91,"props":109,"children":110},{"style":104},[111],{"type":53,"value":112}," -g",{"type":43,"tag":91,"props":114,"children":115},{"style":104},[116],{"type":53,"value":117}," @upstash\u002Fbox-cli\n",{"type":43,"tag":73,"props":119,"children":121},{"id":120},"authentication",[122],{"type":53,"value":123},"Authentication",{"type":43,"tag":44,"props":125,"children":126},{},[127,129,135,137,145],{"type":53,"value":128},"Every command needs an API key, or it fails with \"API token required\". Set it once,\nor pass ",{"type":43,"tag":48,"props":130,"children":132},{"className":131},[],[133],{"type":53,"value":134},"--token",{"type":53,"value":136}," on any single command. Create one at\n",{"type":43,"tag":138,"props":139,"children":143},"a",{"href":140,"rel":141},"https:\u002F\u002Fconsole.upstash.com\u002Fbox",[142],"nofollow",[144],{"type":53,"value":140},{"type":53,"value":71},{"type":43,"tag":80,"props":147,"children":149},{"className":82,"code":148,"language":84,"meta":85,"style":85},"export UPSTASH_BOX_API_KEY=box_...\n",[150],{"type":43,"tag":48,"props":151,"children":152},{"__ignoreMap":85},[153],{"type":43,"tag":91,"props":154,"children":155},{"class":93,"line":94},[156,162,168,174],{"type":43,"tag":91,"props":157,"children":159},{"style":158},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[160],{"type":53,"value":161},"export",{"type":43,"tag":91,"props":163,"children":165},{"style":164},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[166],{"type":53,"value":167}," UPSTASH_BOX_API_KEY",{"type":43,"tag":91,"props":169,"children":171},{"style":170},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[172],{"type":53,"value":173},"=",{"type":43,"tag":91,"props":175,"children":176},{"style":164},[177],{"type":53,"value":178},"box_...\n",{"type":43,"tag":73,"props":180,"children":182},{"id":181},"selecting-a-box",[183],{"type":53,"value":184},"Selecting a box",{"type":43,"tag":44,"props":186,"children":187},{},[188,190,196,198,204,206,212],{"type":53,"value":189},"Resolution order is ",{"type":43,"tag":48,"props":191,"children":193},{"className":192},[],[194],{"type":53,"value":195},"--box \u003Cid>",{"type":53,"value":197},", then ",{"type":43,"tag":48,"props":199,"children":201},{"className":200},[],[202],{"type":53,"value":203},"$BOX_ID",{"type":53,"value":205},", then the nearest ",{"type":43,"tag":48,"props":207,"children":209},{"className":208},[],[210],{"type":53,"value":211},".box",{"type":53,"value":213}," file\n(searched upward). Create one and pin it to the working directory:",{"type":43,"tag":80,"props":215,"children":217},{"className":82,"code":216,"language":84,"meta":85,"style":85},"box create --no-repl --runtime node                    # prints the id, writes .box\nbox create --no-repl --runtime node --clone-repo https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\nbox status                                             # id, where it came from, state\n",[218],{"type":43,"tag":48,"props":219,"children":220},{"__ignoreMap":85},[221,254,287],{"type":43,"tag":91,"props":222,"children":223},{"class":93,"line":94},[224,228,233,238,243,248],{"type":43,"tag":91,"props":225,"children":226},{"style":98},[227],{"type":53,"value":54},{"type":43,"tag":91,"props":229,"children":230},{"style":104},[231],{"type":53,"value":232}," create",{"type":43,"tag":91,"props":234,"children":235},{"style":104},[236],{"type":53,"value":237}," --no-repl",{"type":43,"tag":91,"props":239,"children":240},{"style":104},[241],{"type":53,"value":242}," --runtime",{"type":43,"tag":91,"props":244,"children":245},{"style":104},[246],{"type":53,"value":247}," node",{"type":43,"tag":91,"props":249,"children":251},{"style":250},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[252],{"type":53,"value":253},"                    # prints the id, writes .box\n",{"type":43,"tag":91,"props":255,"children":256},{"class":93,"line":30},[257,261,265,269,273,277,282],{"type":43,"tag":91,"props":258,"children":259},{"style":98},[260],{"type":53,"value":54},{"type":43,"tag":91,"props":262,"children":263},{"style":104},[264],{"type":53,"value":232},{"type":43,"tag":91,"props":266,"children":267},{"style":104},[268],{"type":53,"value":237},{"type":43,"tag":91,"props":270,"children":271},{"style":104},[272],{"type":53,"value":242},{"type":43,"tag":91,"props":274,"children":275},{"style":104},[276],{"type":53,"value":247},{"type":43,"tag":91,"props":278,"children":279},{"style":104},[280],{"type":53,"value":281}," --clone-repo",{"type":43,"tag":91,"props":283,"children":284},{"style":104},[285],{"type":53,"value":286}," https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\n",{"type":43,"tag":91,"props":288,"children":290},{"class":93,"line":289},3,[291,295,300],{"type":43,"tag":91,"props":292,"children":293},{"style":98},[294],{"type":53,"value":54},{"type":43,"tag":91,"props":296,"children":297},{"style":104},[298],{"type":53,"value":299}," status",{"type":43,"tag":91,"props":301,"children":302},{"style":250},[303],{"type":53,"value":304},"                                             # id, where it came from, state\n",{"type":43,"tag":44,"props":306,"children":307},{},[308,314],{"type":43,"tag":48,"props":309,"children":311},{"className":310},[],[312],{"type":53,"value":313},"paused",{"type":53,"value":315}," is not an error; the next command resumes the box.",{"type":43,"tag":44,"props":317,"children":318},{},[319],{"type":53,"value":320},"Clean up when the work is done. Boxes cost money while they exist:",{"type":43,"tag":80,"props":322,"children":324},{"className":82,"code":323,"language":84,"meta":85,"style":85},"box pause                   # keeps the workspace, resumes on the next command\nbox delete --yes            # irreversible; --yes is required without a terminal\n",[325],{"type":43,"tag":48,"props":326,"children":327},{"__ignoreMap":85},[328,345],{"type":43,"tag":91,"props":329,"children":330},{"class":93,"line":94},[331,335,340],{"type":43,"tag":91,"props":332,"children":333},{"style":98},[334],{"type":53,"value":54},{"type":43,"tag":91,"props":336,"children":337},{"style":104},[338],{"type":53,"value":339}," pause",{"type":43,"tag":91,"props":341,"children":342},{"style":250},[343],{"type":53,"value":344},"                   # keeps the workspace, resumes on the next command\n",{"type":43,"tag":91,"props":346,"children":347},{"class":93,"line":30},[348,352,357,362],{"type":43,"tag":91,"props":349,"children":350},{"style":98},[351],{"type":53,"value":54},{"type":43,"tag":91,"props":353,"children":354},{"style":104},[355],{"type":53,"value":356}," delete",{"type":43,"tag":91,"props":358,"children":359},{"style":104},[360],{"type":53,"value":361}," --yes",{"type":43,"tag":91,"props":363,"children":364},{"style":250},[365],{"type":53,"value":366},"            # irreversible; --yes is required without a terminal\n",{"type":43,"tag":44,"props":368,"children":369},{},[370,372,378,380,386,388,394,396,402],{"type":53,"value":371},"Never run ",{"type":43,"tag":48,"props":373,"children":375},{"className":374},[],[376],{"type":53,"value":377},"box create",{"type":53,"value":379}," without ",{"type":43,"tag":48,"props":381,"children":383},{"className":382},[],[384],{"type":53,"value":385},"--no-repl",{"type":53,"value":387},", or ",{"type":43,"tag":48,"props":389,"children":391},{"className":390},[],[392],{"type":53,"value":393},"box connect",{"type":53,"value":395}," \u002F ",{"type":43,"tag":48,"props":397,"children":399},{"className":398},[],[400],{"type":53,"value":401},"box from-snapshot",{"type":53,"value":403},":\nthey open an interactive REPL and will hang.",{"type":43,"tag":73,"props":405,"children":407},{"id":406},"running-commands",[408],{"type":53,"value":409},"Running commands",{"type":43,"tag":44,"props":411,"children":412},{},[413,415,421,423,428],{"type":53,"value":414},"Put the remote command after ",{"type":43,"tag":48,"props":416,"children":418},{"className":417},[],[419],{"type":53,"value":420},"--",{"type":53,"value":422},", or its flags are parsed as ",{"type":43,"tag":48,"props":424,"children":426},{"className":425},[],[427],{"type":53,"value":54},{"type":53,"value":429},"'s own.",{"type":43,"tag":80,"props":431,"children":433},{"className":82,"code":432,"language":84,"meta":85,"style":85},"box exec -- npm install\nbox exec -C repo -- npm test\nbox exec --json -- node -e 'console.log(1)'   # {stdout, stderr, exit_code}\n",[434],{"type":43,"tag":48,"props":435,"children":436},{"__ignoreMap":85},[437,464,498],{"type":43,"tag":91,"props":438,"children":439},{"class":93,"line":94},[440,444,449,454,459],{"type":43,"tag":91,"props":441,"children":442},{"style":98},[443],{"type":53,"value":54},{"type":43,"tag":91,"props":445,"children":446},{"style":104},[447],{"type":53,"value":448}," exec",{"type":43,"tag":91,"props":450,"children":451},{"style":104},[452],{"type":53,"value":453}," --",{"type":43,"tag":91,"props":455,"children":456},{"style":104},[457],{"type":53,"value":458}," npm",{"type":43,"tag":91,"props":460,"children":461},{"style":104},[462],{"type":53,"value":463}," install\n",{"type":43,"tag":91,"props":465,"children":466},{"class":93,"line":30},[467,471,475,480,485,489,493],{"type":43,"tag":91,"props":468,"children":469},{"style":98},[470],{"type":53,"value":54},{"type":43,"tag":91,"props":472,"children":473},{"style":104},[474],{"type":53,"value":448},{"type":43,"tag":91,"props":476,"children":477},{"style":104},[478],{"type":53,"value":479}," -C",{"type":43,"tag":91,"props":481,"children":482},{"style":104},[483],{"type":53,"value":484}," repo",{"type":43,"tag":91,"props":486,"children":487},{"style":104},[488],{"type":53,"value":453},{"type":43,"tag":91,"props":490,"children":491},{"style":104},[492],{"type":53,"value":458},{"type":43,"tag":91,"props":494,"children":495},{"style":104},[496],{"type":53,"value":497}," test\n",{"type":43,"tag":91,"props":499,"children":500},{"class":93,"line":289},[501,505,509,514,518,522,527,532,537,542],{"type":43,"tag":91,"props":502,"children":503},{"style":98},[504],{"type":53,"value":54},{"type":43,"tag":91,"props":506,"children":507},{"style":104},[508],{"type":53,"value":448},{"type":43,"tag":91,"props":510,"children":511},{"style":104},[512],{"type":53,"value":513}," --json",{"type":43,"tag":91,"props":515,"children":516},{"style":104},[517],{"type":53,"value":453},{"type":43,"tag":91,"props":519,"children":520},{"style":104},[521],{"type":53,"value":247},{"type":43,"tag":91,"props":523,"children":524},{"style":104},[525],{"type":53,"value":526}," -e",{"type":43,"tag":91,"props":528,"children":529},{"style":170},[530],{"type":53,"value":531}," '",{"type":43,"tag":91,"props":533,"children":534},{"style":104},[535],{"type":53,"value":536},"console.log(1)",{"type":43,"tag":91,"props":538,"children":539},{"style":170},[540],{"type":53,"value":541},"'",{"type":43,"tag":91,"props":543,"children":544},{"style":250},[545],{"type":53,"value":546},"   # {stdout, stderr, exit_code}\n",{"type":43,"tag":44,"props":548,"children":549},{},[550],{"type":53,"value":551},"One argument is a shell expression, sent as written, so pipes and redirection work.\nSeveral arguments are argv and are quoted individually, so an argument containing\nspaces stays one argument.",{"type":43,"tag":44,"props":553,"children":554},{},[555,557,563,565,570],{"type":53,"value":556},"The remote command's exit code is passed through, so ",{"type":43,"tag":48,"props":558,"children":560},{"className":559},[],[561],{"type":53,"value":562},"box exec -- npm test && ...",{"type":53,"value":564},"\nchains normally. Exit code ",{"type":43,"tag":58,"props":566,"children":567},{},[568],{"type":53,"value":569},"125",{"type":53,"value":571}," means the CLI itself failed (bad box, bad flags),\nnever a status the remote command returned.",{"type":43,"tag":44,"props":573,"children":574},{},[575],{"type":53,"value":576},"A background server dies with the command that started it. Detach it:",{"type":43,"tag":80,"props":578,"children":580},{"className":82,"code":579,"language":84,"meta":85,"style":85},"box exec -- '( npm run dev > dev.log 2>&1 & )'\nbox public-url 3000                               # prints the public URL\n",[581],{"type":43,"tag":48,"props":582,"children":583},{"__ignoreMap":85},[584,613],{"type":43,"tag":91,"props":585,"children":586},{"class":93,"line":94},[587,591,595,599,603,608],{"type":43,"tag":91,"props":588,"children":589},{"style":98},[590],{"type":53,"value":54},{"type":43,"tag":91,"props":592,"children":593},{"style":104},[594],{"type":53,"value":448},{"type":43,"tag":91,"props":596,"children":597},{"style":104},[598],{"type":53,"value":453},{"type":43,"tag":91,"props":600,"children":601},{"style":170},[602],{"type":53,"value":531},{"type":43,"tag":91,"props":604,"children":605},{"style":104},[606],{"type":53,"value":607},"( npm run dev > dev.log 2>&1 & )",{"type":43,"tag":91,"props":609,"children":610},{"style":170},[611],{"type":53,"value":612},"'\n",{"type":43,"tag":91,"props":614,"children":615},{"class":93,"line":30},[616,620,625,631],{"type":43,"tag":91,"props":617,"children":618},{"style":98},[619],{"type":53,"value":54},{"type":43,"tag":91,"props":621,"children":622},{"style":104},[623],{"type":53,"value":624}," public-url",{"type":43,"tag":91,"props":626,"children":628},{"style":627},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[629],{"type":53,"value":630}," 3000",{"type":43,"tag":91,"props":632,"children":633},{"style":250},[634],{"type":53,"value":635},"                               # prints the public URL\n",{"type":43,"tag":73,"props":637,"children":639},{"id":638},"building-something-and-handing-back-a-link",[640],{"type":53,"value":641},"Building something and handing back a link",{"type":43,"tag":44,"props":643,"children":644},{},[645],{"type":53,"value":646},"\"Make me a snake game, use Upstash Box\" is a request to build it in a box, run it\nthere, and reply with a URL the user can open. Do the whole thing; do not stop at\nwriting the file.",{"type":43,"tag":80,"props":648,"children":650},{"className":82,"code":649,"language":84,"meta":85,"style":85},"box create --no-repl --runtime node          # writes .box, so later commands need no --box\n\nbox files write index.html - \u003C\u003C'HTML'\n\u003C!doctype html>\u003Cmeta charset=\"utf-8\">\u003Ctitle>Snake\u003C\u002Ftitle>\n\u003Ccanvas id=\"c\" width=\"400\" height=\"400\">\u003C\u002Fcanvas>\n\u003Cscript>\u002F* the game *\u002F\u003C\u002Fscript>\nHTML\n\nbox files write server.js - \u003C\u003C'JS'\nconst http = require(\"http\"), fs = require(\"fs\");\nhttp.createServer((_, res) => {\n  res.writeHead(200, { \"Content-Type\": \"text\u002Fhtml\" });\n  res.end(fs.readFileSync(\"index.html\"));\n}).listen(3000);\nJS\n\nbox exec -- '( node server.js > server.log 2>&1 & )'          # detached, or it dies\nbox exec -- 'sleep 1; curl -sf localhost:3000 >\u002Fdev\u002Fnull && echo up'\nbox public-url 3000                                           # the link to reply with\n",[651],{"type":43,"tag":48,"props":652,"children":653},{"__ignoreMap":85},[654,682,691,728,737,746,755,764,772,806,815,824,833,842,851,859,867,901,930],{"type":43,"tag":91,"props":655,"children":656},{"class":93,"line":94},[657,661,665,669,673,677],{"type":43,"tag":91,"props":658,"children":659},{"style":98},[660],{"type":53,"value":54},{"type":43,"tag":91,"props":662,"children":663},{"style":104},[664],{"type":53,"value":232},{"type":43,"tag":91,"props":666,"children":667},{"style":104},[668],{"type":53,"value":237},{"type":43,"tag":91,"props":670,"children":671},{"style":104},[672],{"type":53,"value":242},{"type":43,"tag":91,"props":674,"children":675},{"style":104},[676],{"type":53,"value":247},{"type":43,"tag":91,"props":678,"children":679},{"style":250},[680],{"type":53,"value":681},"          # writes .box, so later commands need no --box\n",{"type":43,"tag":91,"props":683,"children":684},{"class":93,"line":30},[685],{"type":43,"tag":91,"props":686,"children":688},{"emptyLinePlaceholder":687},true,[689],{"type":53,"value":690},"\n",{"type":43,"tag":91,"props":692,"children":693},{"class":93,"line":289},[694,698,703,708,713,718,723],{"type":43,"tag":91,"props":695,"children":696},{"style":98},[697],{"type":53,"value":54},{"type":43,"tag":91,"props":699,"children":700},{"style":104},[701],{"type":53,"value":702}," files",{"type":43,"tag":91,"props":704,"children":705},{"style":104},[706],{"type":53,"value":707}," write",{"type":43,"tag":91,"props":709,"children":710},{"style":104},[711],{"type":53,"value":712}," index.html",{"type":43,"tag":91,"props":714,"children":715},{"style":104},[716],{"type":53,"value":717}," -",{"type":43,"tag":91,"props":719,"children":720},{"style":170},[721],{"type":53,"value":722}," \u003C\u003C",{"type":43,"tag":91,"props":724,"children":725},{"style":170},[726],{"type":53,"value":727},"'HTML'\n",{"type":43,"tag":91,"props":729,"children":731},{"class":93,"line":730},4,[732],{"type":43,"tag":91,"props":733,"children":734},{"style":104},[735],{"type":53,"value":736},"\u003C!doctype html>\u003Cmeta charset=\"utf-8\">\u003Ctitle>Snake\u003C\u002Ftitle>\n",{"type":43,"tag":91,"props":738,"children":740},{"class":93,"line":739},5,[741],{"type":43,"tag":91,"props":742,"children":743},{"style":104},[744],{"type":53,"value":745},"\u003Ccanvas id=\"c\" width=\"400\" height=\"400\">\u003C\u002Fcanvas>\n",{"type":43,"tag":91,"props":747,"children":749},{"class":93,"line":748},6,[750],{"type":43,"tag":91,"props":751,"children":752},{"style":104},[753],{"type":53,"value":754},"\u003Cscript>\u002F* the game *\u002F\u003C\u002Fscript>\n",{"type":43,"tag":91,"props":756,"children":758},{"class":93,"line":757},7,[759],{"type":43,"tag":91,"props":760,"children":761},{"style":170},[762],{"type":53,"value":763},"HTML\n",{"type":43,"tag":91,"props":765,"children":767},{"class":93,"line":766},8,[768],{"type":43,"tag":91,"props":769,"children":770},{"emptyLinePlaceholder":687},[771],{"type":53,"value":690},{"type":43,"tag":91,"props":773,"children":775},{"class":93,"line":774},9,[776,780,784,788,793,797,801],{"type":43,"tag":91,"props":777,"children":778},{"style":98},[779],{"type":53,"value":54},{"type":43,"tag":91,"props":781,"children":782},{"style":104},[783],{"type":53,"value":702},{"type":43,"tag":91,"props":785,"children":786},{"style":104},[787],{"type":53,"value":707},{"type":43,"tag":91,"props":789,"children":790},{"style":104},[791],{"type":53,"value":792}," server.js",{"type":43,"tag":91,"props":794,"children":795},{"style":104},[796],{"type":53,"value":717},{"type":43,"tag":91,"props":798,"children":799},{"style":170},[800],{"type":53,"value":722},{"type":43,"tag":91,"props":802,"children":803},{"style":170},[804],{"type":53,"value":805},"'JS'\n",{"type":43,"tag":91,"props":807,"children":809},{"class":93,"line":808},10,[810],{"type":43,"tag":91,"props":811,"children":812},{"style":104},[813],{"type":53,"value":814},"const http = require(\"http\"), fs = require(\"fs\");\n",{"type":43,"tag":91,"props":816,"children":818},{"class":93,"line":817},11,[819],{"type":43,"tag":91,"props":820,"children":821},{"style":104},[822],{"type":53,"value":823},"http.createServer((_, res) => {\n",{"type":43,"tag":91,"props":825,"children":827},{"class":93,"line":826},12,[828],{"type":43,"tag":91,"props":829,"children":830},{"style":104},[831],{"type":53,"value":832},"  res.writeHead(200, { \"Content-Type\": \"text\u002Fhtml\" });\n",{"type":43,"tag":91,"props":834,"children":836},{"class":93,"line":835},13,[837],{"type":43,"tag":91,"props":838,"children":839},{"style":104},[840],{"type":53,"value":841},"  res.end(fs.readFileSync(\"index.html\"));\n",{"type":43,"tag":91,"props":843,"children":845},{"class":93,"line":844},14,[846],{"type":43,"tag":91,"props":847,"children":848},{"style":104},[849],{"type":53,"value":850},"}).listen(3000);\n",{"type":43,"tag":91,"props":852,"children":853},{"class":93,"line":26},[854],{"type":43,"tag":91,"props":855,"children":856},{"style":170},[857],{"type":53,"value":858},"JS\n",{"type":43,"tag":91,"props":860,"children":862},{"class":93,"line":861},16,[863],{"type":43,"tag":91,"props":864,"children":865},{"emptyLinePlaceholder":687},[866],{"type":53,"value":690},{"type":43,"tag":91,"props":868,"children":870},{"class":93,"line":869},17,[871,875,879,883,887,892,896],{"type":43,"tag":91,"props":872,"children":873},{"style":98},[874],{"type":53,"value":54},{"type":43,"tag":91,"props":876,"children":877},{"style":104},[878],{"type":53,"value":448},{"type":43,"tag":91,"props":880,"children":881},{"style":104},[882],{"type":53,"value":453},{"type":43,"tag":91,"props":884,"children":885},{"style":170},[886],{"type":53,"value":531},{"type":43,"tag":91,"props":888,"children":889},{"style":104},[890],{"type":53,"value":891},"( node server.js > server.log 2>&1 & )",{"type":43,"tag":91,"props":893,"children":894},{"style":170},[895],{"type":53,"value":541},{"type":43,"tag":91,"props":897,"children":898},{"style":250},[899],{"type":53,"value":900},"          # detached, or it dies\n",{"type":43,"tag":91,"props":902,"children":904},{"class":93,"line":903},18,[905,909,913,917,921,926],{"type":43,"tag":91,"props":906,"children":907},{"style":98},[908],{"type":53,"value":54},{"type":43,"tag":91,"props":910,"children":911},{"style":104},[912],{"type":53,"value":448},{"type":43,"tag":91,"props":914,"children":915},{"style":104},[916],{"type":53,"value":453},{"type":43,"tag":91,"props":918,"children":919},{"style":170},[920],{"type":53,"value":531},{"type":43,"tag":91,"props":922,"children":923},{"style":104},[924],{"type":53,"value":925},"sleep 1; curl -sf localhost:3000 >\u002Fdev\u002Fnull && echo up",{"type":43,"tag":91,"props":927,"children":928},{"style":170},[929],{"type":53,"value":612},{"type":43,"tag":91,"props":931,"children":933},{"class":93,"line":932},19,[934,938,942,946],{"type":43,"tag":91,"props":935,"children":936},{"style":98},[937],{"type":53,"value":54},{"type":43,"tag":91,"props":939,"children":940},{"style":104},[941],{"type":53,"value":624},{"type":43,"tag":91,"props":943,"children":944},{"style":627},[945],{"type":53,"value":630},{"type":43,"tag":91,"props":947,"children":948},{"style":250},[949],{"type":53,"value":950},"                                           # the link to reply with\n",{"type":43,"tag":44,"props":952,"children":953},{},[954,956,962,964,970],{"type":53,"value":955},"Node's own ",{"type":43,"tag":48,"props":957,"children":959},{"className":958},[],[960],{"type":53,"value":961},"http",{"type":53,"value":963}," module rather than a package: no install, no network fetch, and it\nworks on a bare ",{"type":43,"tag":48,"props":965,"children":967},{"className":966},[],[968],{"type":53,"value":969},"node",{"type":53,"value":971}," runtime.",{"type":43,"tag":44,"props":973,"children":974},{},[975],{"type":53,"value":976},"Check the port answers before publishing it. A public URL for a port nothing is\nlistening on returns 502, which reads as a broken game rather than as a race with a\nserver that had not finished starting.",{"type":43,"tag":44,"props":978,"children":979},{},[980,982,988,990,996],{"type":53,"value":981},"Reply with the URL itself, not just \"it is running\". Say that the box keeps costing\nmoney until ",{"type":43,"tag":48,"props":983,"children":985},{"className":984},[],[986],{"type":53,"value":987},"box delete --yes",{"type":53,"value":989},", and that the URL is public to anyone who has it —\n",{"type":43,"tag":48,"props":991,"children":993},{"className":992},[],[994],{"type":53,"value":995},"box public-url 3000 --basic-auth",{"type":53,"value":997}," puts credentials in front of it.",{"type":43,"tag":73,"props":999,"children":1001},{"id":1000},"files",[1002],{"type":53,"value":1003},"Files",{"type":43,"tag":44,"props":1005,"children":1006},{},[1007,1009,1015],{"type":53,"value":1008},"Paths are relative to ",{"type":43,"tag":48,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":53,"value":1014},"\u002Fworkspace\u002Fhome",{"type":53,"value":71},{"type":43,"tag":80,"props":1017,"children":1019},{"className":82,"code":1018,"language":84,"meta":85,"style":85},"box files list src\nbox files read src\u002Findex.ts\nbox files write src\u002Fapp.ts -    \u003C local.ts    # - reads stdin: use this for code\nbox files write notes.txt \"short text\"\nbox files stat src\u002Findex.ts\nbox files mkdir -p a\u002Fb\u002Fc\nbox files rename old.ts new.ts\nbox files remove build -r                      # a directory needs -r\nbox files upload .\u002Flocal.zip \u002Fworkspace\u002Fhome\u002Flocal.zip\nbox files download repo\n",[1020],{"type":43,"tag":48,"props":1021,"children":1022},{"__ignoreMap":85},[1023,1044,1065,1104,1139,1159,1185,1211,1242,1268],{"type":43,"tag":91,"props":1024,"children":1025},{"class":93,"line":94},[1026,1030,1034,1039],{"type":43,"tag":91,"props":1027,"children":1028},{"style":98},[1029],{"type":53,"value":54},{"type":43,"tag":91,"props":1031,"children":1032},{"style":104},[1033],{"type":53,"value":702},{"type":43,"tag":91,"props":1035,"children":1036},{"style":104},[1037],{"type":53,"value":1038}," list",{"type":43,"tag":91,"props":1040,"children":1041},{"style":104},[1042],{"type":53,"value":1043}," src\n",{"type":43,"tag":91,"props":1045,"children":1046},{"class":93,"line":30},[1047,1051,1055,1060],{"type":43,"tag":91,"props":1048,"children":1049},{"style":98},[1050],{"type":53,"value":54},{"type":43,"tag":91,"props":1052,"children":1053},{"style":104},[1054],{"type":53,"value":702},{"type":43,"tag":91,"props":1056,"children":1057},{"style":104},[1058],{"type":53,"value":1059}," read",{"type":43,"tag":91,"props":1061,"children":1062},{"style":104},[1063],{"type":53,"value":1064}," src\u002Findex.ts\n",{"type":43,"tag":91,"props":1066,"children":1067},{"class":93,"line":289},[1068,1072,1076,1080,1085,1089,1094,1099],{"type":43,"tag":91,"props":1069,"children":1070},{"style":98},[1071],{"type":53,"value":54},{"type":43,"tag":91,"props":1073,"children":1074},{"style":104},[1075],{"type":53,"value":702},{"type":43,"tag":91,"props":1077,"children":1078},{"style":104},[1079],{"type":53,"value":707},{"type":43,"tag":91,"props":1081,"children":1082},{"style":104},[1083],{"type":53,"value":1084}," src\u002Fapp.ts",{"type":43,"tag":91,"props":1086,"children":1087},{"style":104},[1088],{"type":53,"value":717},{"type":43,"tag":91,"props":1090,"children":1091},{"style":170},[1092],{"type":53,"value":1093},"    \u003C",{"type":43,"tag":91,"props":1095,"children":1096},{"style":104},[1097],{"type":53,"value":1098}," local.ts",{"type":43,"tag":91,"props":1100,"children":1101},{"style":250},[1102],{"type":53,"value":1103},"    # - reads stdin: use this for code\n",{"type":43,"tag":91,"props":1105,"children":1106},{"class":93,"line":730},[1107,1111,1115,1119,1124,1129,1134],{"type":43,"tag":91,"props":1108,"children":1109},{"style":98},[1110],{"type":53,"value":54},{"type":43,"tag":91,"props":1112,"children":1113},{"style":104},[1114],{"type":53,"value":702},{"type":43,"tag":91,"props":1116,"children":1117},{"style":104},[1118],{"type":53,"value":707},{"type":43,"tag":91,"props":1120,"children":1121},{"style":104},[1122],{"type":53,"value":1123}," notes.txt",{"type":43,"tag":91,"props":1125,"children":1126},{"style":170},[1127],{"type":53,"value":1128}," \"",{"type":43,"tag":91,"props":1130,"children":1131},{"style":104},[1132],{"type":53,"value":1133},"short text",{"type":43,"tag":91,"props":1135,"children":1136},{"style":170},[1137],{"type":53,"value":1138},"\"\n",{"type":43,"tag":91,"props":1140,"children":1141},{"class":93,"line":739},[1142,1146,1150,1155],{"type":43,"tag":91,"props":1143,"children":1144},{"style":98},[1145],{"type":53,"value":54},{"type":43,"tag":91,"props":1147,"children":1148},{"style":104},[1149],{"type":53,"value":702},{"type":43,"tag":91,"props":1151,"children":1152},{"style":104},[1153],{"type":53,"value":1154}," stat",{"type":43,"tag":91,"props":1156,"children":1157},{"style":104},[1158],{"type":53,"value":1064},{"type":43,"tag":91,"props":1160,"children":1161},{"class":93,"line":748},[1162,1166,1170,1175,1180],{"type":43,"tag":91,"props":1163,"children":1164},{"style":98},[1165],{"type":53,"value":54},{"type":43,"tag":91,"props":1167,"children":1168},{"style":104},[1169],{"type":53,"value":702},{"type":43,"tag":91,"props":1171,"children":1172},{"style":104},[1173],{"type":53,"value":1174}," mkdir",{"type":43,"tag":91,"props":1176,"children":1177},{"style":104},[1178],{"type":53,"value":1179}," -p",{"type":43,"tag":91,"props":1181,"children":1182},{"style":104},[1183],{"type":53,"value":1184}," a\u002Fb\u002Fc\n",{"type":43,"tag":91,"props":1186,"children":1187},{"class":93,"line":757},[1188,1192,1196,1201,1206],{"type":43,"tag":91,"props":1189,"children":1190},{"style":98},[1191],{"type":53,"value":54},{"type":43,"tag":91,"props":1193,"children":1194},{"style":104},[1195],{"type":53,"value":702},{"type":43,"tag":91,"props":1197,"children":1198},{"style":104},[1199],{"type":53,"value":1200}," rename",{"type":43,"tag":91,"props":1202,"children":1203},{"style":104},[1204],{"type":53,"value":1205}," old.ts",{"type":43,"tag":91,"props":1207,"children":1208},{"style":104},[1209],{"type":53,"value":1210}," new.ts\n",{"type":43,"tag":91,"props":1212,"children":1213},{"class":93,"line":766},[1214,1218,1222,1227,1232,1237],{"type":43,"tag":91,"props":1215,"children":1216},{"style":98},[1217],{"type":53,"value":54},{"type":43,"tag":91,"props":1219,"children":1220},{"style":104},[1221],{"type":53,"value":702},{"type":43,"tag":91,"props":1223,"children":1224},{"style":104},[1225],{"type":53,"value":1226}," remove",{"type":43,"tag":91,"props":1228,"children":1229},{"style":104},[1230],{"type":53,"value":1231}," build",{"type":43,"tag":91,"props":1233,"children":1234},{"style":104},[1235],{"type":53,"value":1236}," -r",{"type":43,"tag":91,"props":1238,"children":1239},{"style":250},[1240],{"type":53,"value":1241},"                      # a directory needs -r\n",{"type":43,"tag":91,"props":1243,"children":1244},{"class":93,"line":774},[1245,1249,1253,1258,1263],{"type":43,"tag":91,"props":1246,"children":1247},{"style":98},[1248],{"type":53,"value":54},{"type":43,"tag":91,"props":1250,"children":1251},{"style":104},[1252],{"type":53,"value":702},{"type":43,"tag":91,"props":1254,"children":1255},{"style":104},[1256],{"type":53,"value":1257}," upload",{"type":43,"tag":91,"props":1259,"children":1260},{"style":104},[1261],{"type":53,"value":1262}," .\u002Flocal.zip",{"type":43,"tag":91,"props":1264,"children":1265},{"style":104},[1266],{"type":53,"value":1267}," \u002Fworkspace\u002Fhome\u002Flocal.zip\n",{"type":43,"tag":91,"props":1269,"children":1270},{"class":93,"line":808},[1271,1275,1279,1284],{"type":43,"tag":91,"props":1272,"children":1273},{"style":98},[1274],{"type":53,"value":54},{"type":43,"tag":91,"props":1276,"children":1277},{"style":104},[1278],{"type":53,"value":702},{"type":43,"tag":91,"props":1280,"children":1281},{"style":104},[1282],{"type":53,"value":1283}," download",{"type":43,"tag":91,"props":1285,"children":1286},{"style":104},[1287],{"type":53,"value":1288}," repo\n",{"type":43,"tag":44,"props":1290,"children":1291},{},[1292,1294,1300],{"type":53,"value":1293},"Write code with ",{"type":43,"tag":48,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":53,"value":1299},"-",{"type":53,"value":1301}," and stdin. Passing source as an argument mangles it in the shell.",{"type":43,"tag":44,"props":1303,"children":1304},{},[1305,1307,1313],{"type":53,"value":1306},"To search, use the box's own tools: ",{"type":43,"tag":48,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":53,"value":1312},"box exec -- grep -rn TODO src",{"type":53,"value":71},{"type":43,"tag":73,"props":1315,"children":1317},{"id":1316},"git",[1318],{"type":53,"value":1319},"Git",{"type":43,"tag":44,"props":1321,"children":1322},{},[1323,1325,1331,1333,1339],{"type":53,"value":1324},"A clone lands in a directory named after the repo, and every git verb except ",{"type":43,"tag":48,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":53,"value":1330},"clone",{"type":53,"value":1332},"\nneeds that directory via ",{"type":43,"tag":48,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":53,"value":1338},"-C",{"type":53,"value":1340},". Without it git runs at the workspace root, which is not\na repository.",{"type":43,"tag":80,"props":1342,"children":1344},{"className":82,"code":1343,"language":84,"meta":85,"style":85},"box git clone https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\nbox git clone https:\u002F\u002Fgithub.com\u002Forg\u002Frepo -C my-app   # -C is the destination here\nbox git status -C repo\nbox git diff -C repo\nbox git config -C repo --name \"Bot\" --email bot@example.com\nbox git checkout -C repo feature\u002Fx             # creates the branch if missing\nbox git exec -C repo -- add -A\nbox git commit -C repo -m \"message\"\nbox git push -C repo\nbox git create-pr -C repo --title \"Fix the thing\" --base main\n",[1345],{"type":43,"tag":48,"props":1346,"children":1347},{"__ignoreMap":85},[1348,1369,1403,1426,1450,1503,1537,1574,1616,1640],{"type":43,"tag":91,"props":1349,"children":1350},{"class":93,"line":94},[1351,1355,1360,1365],{"type":43,"tag":91,"props":1352,"children":1353},{"style":98},[1354],{"type":53,"value":54},{"type":43,"tag":91,"props":1356,"children":1357},{"style":104},[1358],{"type":53,"value":1359}," git",{"type":43,"tag":91,"props":1361,"children":1362},{"style":104},[1363],{"type":53,"value":1364}," clone",{"type":43,"tag":91,"props":1366,"children":1367},{"style":104},[1368],{"type":53,"value":286},{"type":43,"tag":91,"props":1370,"children":1371},{"class":93,"line":30},[1372,1376,1380,1384,1389,1393,1398],{"type":43,"tag":91,"props":1373,"children":1374},{"style":98},[1375],{"type":53,"value":54},{"type":43,"tag":91,"props":1377,"children":1378},{"style":104},[1379],{"type":53,"value":1359},{"type":43,"tag":91,"props":1381,"children":1382},{"style":104},[1383],{"type":53,"value":1364},{"type":43,"tag":91,"props":1385,"children":1386},{"style":104},[1387],{"type":53,"value":1388}," https:\u002F\u002Fgithub.com\u002Forg\u002Frepo",{"type":43,"tag":91,"props":1390,"children":1391},{"style":104},[1392],{"type":53,"value":479},{"type":43,"tag":91,"props":1394,"children":1395},{"style":104},[1396],{"type":53,"value":1397}," my-app",{"type":43,"tag":91,"props":1399,"children":1400},{"style":250},[1401],{"type":53,"value":1402},"   # -C is the destination here\n",{"type":43,"tag":91,"props":1404,"children":1405},{"class":93,"line":289},[1406,1410,1414,1418,1422],{"type":43,"tag":91,"props":1407,"children":1408},{"style":98},[1409],{"type":53,"value":54},{"type":43,"tag":91,"props":1411,"children":1412},{"style":104},[1413],{"type":53,"value":1359},{"type":43,"tag":91,"props":1415,"children":1416},{"style":104},[1417],{"type":53,"value":299},{"type":43,"tag":91,"props":1419,"children":1420},{"style":104},[1421],{"type":53,"value":479},{"type":43,"tag":91,"props":1423,"children":1424},{"style":104},[1425],{"type":53,"value":1288},{"type":43,"tag":91,"props":1427,"children":1428},{"class":93,"line":730},[1429,1433,1437,1442,1446],{"type":43,"tag":91,"props":1430,"children":1431},{"style":98},[1432],{"type":53,"value":54},{"type":43,"tag":91,"props":1434,"children":1435},{"style":104},[1436],{"type":53,"value":1359},{"type":43,"tag":91,"props":1438,"children":1439},{"style":104},[1440],{"type":53,"value":1441}," diff",{"type":43,"tag":91,"props":1443,"children":1444},{"style":104},[1445],{"type":53,"value":479},{"type":43,"tag":91,"props":1447,"children":1448},{"style":104},[1449],{"type":53,"value":1288},{"type":43,"tag":91,"props":1451,"children":1452},{"class":93,"line":739},[1453,1457,1461,1466,1470,1474,1479,1483,1488,1493,1498],{"type":43,"tag":91,"props":1454,"children":1455},{"style":98},[1456],{"type":53,"value":54},{"type":43,"tag":91,"props":1458,"children":1459},{"style":104},[1460],{"type":53,"value":1359},{"type":43,"tag":91,"props":1462,"children":1463},{"style":104},[1464],{"type":53,"value":1465}," config",{"type":43,"tag":91,"props":1467,"children":1468},{"style":104},[1469],{"type":53,"value":479},{"type":43,"tag":91,"props":1471,"children":1472},{"style":104},[1473],{"type":53,"value":484},{"type":43,"tag":91,"props":1475,"children":1476},{"style":104},[1477],{"type":53,"value":1478}," --name",{"type":43,"tag":91,"props":1480,"children":1481},{"style":170},[1482],{"type":53,"value":1128},{"type":43,"tag":91,"props":1484,"children":1485},{"style":104},[1486],{"type":53,"value":1487},"Bot",{"type":43,"tag":91,"props":1489,"children":1490},{"style":170},[1491],{"type":53,"value":1492},"\"",{"type":43,"tag":91,"props":1494,"children":1495},{"style":104},[1496],{"type":53,"value":1497}," --email",{"type":43,"tag":91,"props":1499,"children":1500},{"style":104},[1501],{"type":53,"value":1502}," bot@example.com\n",{"type":43,"tag":91,"props":1504,"children":1505},{"class":93,"line":748},[1506,1510,1514,1519,1523,1527,1532],{"type":43,"tag":91,"props":1507,"children":1508},{"style":98},[1509],{"type":53,"value":54},{"type":43,"tag":91,"props":1511,"children":1512},{"style":104},[1513],{"type":53,"value":1359},{"type":43,"tag":91,"props":1515,"children":1516},{"style":104},[1517],{"type":53,"value":1518}," checkout",{"type":43,"tag":91,"props":1520,"children":1521},{"style":104},[1522],{"type":53,"value":479},{"type":43,"tag":91,"props":1524,"children":1525},{"style":104},[1526],{"type":53,"value":484},{"type":43,"tag":91,"props":1528,"children":1529},{"style":104},[1530],{"type":53,"value":1531}," feature\u002Fx",{"type":43,"tag":91,"props":1533,"children":1534},{"style":250},[1535],{"type":53,"value":1536},"             # creates the branch if missing\n",{"type":43,"tag":91,"props":1538,"children":1539},{"class":93,"line":757},[1540,1544,1548,1552,1556,1560,1564,1569],{"type":43,"tag":91,"props":1541,"children":1542},{"style":98},[1543],{"type":53,"value":54},{"type":43,"tag":91,"props":1545,"children":1546},{"style":104},[1547],{"type":53,"value":1359},{"type":43,"tag":91,"props":1549,"children":1550},{"style":104},[1551],{"type":53,"value":448},{"type":43,"tag":91,"props":1553,"children":1554},{"style":104},[1555],{"type":53,"value":479},{"type":43,"tag":91,"props":1557,"children":1558},{"style":104},[1559],{"type":53,"value":484},{"type":43,"tag":91,"props":1561,"children":1562},{"style":104},[1563],{"type":53,"value":453},{"type":43,"tag":91,"props":1565,"children":1566},{"style":104},[1567],{"type":53,"value":1568}," add",{"type":43,"tag":91,"props":1570,"children":1571},{"style":104},[1572],{"type":53,"value":1573}," -A\n",{"type":43,"tag":91,"props":1575,"children":1576},{"class":93,"line":766},[1577,1581,1585,1590,1594,1598,1603,1607,1612],{"type":43,"tag":91,"props":1578,"children":1579},{"style":98},[1580],{"type":53,"value":54},{"type":43,"tag":91,"props":1582,"children":1583},{"style":104},[1584],{"type":53,"value":1359},{"type":43,"tag":91,"props":1586,"children":1587},{"style":104},[1588],{"type":53,"value":1589}," commit",{"type":43,"tag":91,"props":1591,"children":1592},{"style":104},[1593],{"type":53,"value":479},{"type":43,"tag":91,"props":1595,"children":1596},{"style":104},[1597],{"type":53,"value":484},{"type":43,"tag":91,"props":1599,"children":1600},{"style":104},[1601],{"type":53,"value":1602}," -m",{"type":43,"tag":91,"props":1604,"children":1605},{"style":170},[1606],{"type":53,"value":1128},{"type":43,"tag":91,"props":1608,"children":1609},{"style":104},[1610],{"type":53,"value":1611},"message",{"type":43,"tag":91,"props":1613,"children":1614},{"style":170},[1615],{"type":53,"value":1138},{"type":43,"tag":91,"props":1617,"children":1618},{"class":93,"line":774},[1619,1623,1627,1632,1636],{"type":43,"tag":91,"props":1620,"children":1621},{"style":98},[1622],{"type":53,"value":54},{"type":43,"tag":91,"props":1624,"children":1625},{"style":104},[1626],{"type":53,"value":1359},{"type":43,"tag":91,"props":1628,"children":1629},{"style":104},[1630],{"type":53,"value":1631}," push",{"type":43,"tag":91,"props":1633,"children":1634},{"style":104},[1635],{"type":53,"value":479},{"type":43,"tag":91,"props":1637,"children":1638},{"style":104},[1639],{"type":53,"value":1288},{"type":43,"tag":91,"props":1641,"children":1642},{"class":93,"line":808},[1643,1647,1651,1656,1660,1664,1669,1673,1678,1682,1687],{"type":43,"tag":91,"props":1644,"children":1645},{"style":98},[1646],{"type":53,"value":54},{"type":43,"tag":91,"props":1648,"children":1649},{"style":104},[1650],{"type":53,"value":1359},{"type":43,"tag":91,"props":1652,"children":1653},{"style":104},[1654],{"type":53,"value":1655}," create-pr",{"type":43,"tag":91,"props":1657,"children":1658},{"style":104},[1659],{"type":53,"value":479},{"type":43,"tag":91,"props":1661,"children":1662},{"style":104},[1663],{"type":53,"value":484},{"type":43,"tag":91,"props":1665,"children":1666},{"style":104},[1667],{"type":53,"value":1668}," --title",{"type":43,"tag":91,"props":1670,"children":1671},{"style":170},[1672],{"type":53,"value":1128},{"type":43,"tag":91,"props":1674,"children":1675},{"style":104},[1676],{"type":53,"value":1677},"Fix the thing",{"type":43,"tag":91,"props":1679,"children":1680},{"style":170},[1681],{"type":53,"value":1492},{"type":43,"tag":91,"props":1683,"children":1684},{"style":104},[1685],{"type":53,"value":1686}," --base",{"type":43,"tag":91,"props":1688,"children":1689},{"style":104},[1690],{"type":53,"value":1691}," main\n",{"type":43,"tag":44,"props":1693,"children":1694},{},[1695,1701,1703,1708],{"type":43,"tag":48,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":53,"value":1700},"box git exec",{"type":53,"value":1702}," takes git's arguments without the leading ",{"type":43,"tag":48,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":53,"value":1316},{"type":53,"value":1709},", and passes git's exit\ncode through.",{"type":43,"tag":44,"props":1711,"children":1712},{},[1713,1715,1721],{"type":53,"value":1714},"Private repos and PRs need a token at creation: ",{"type":43,"tag":48,"props":1716,"children":1718},{"className":1717},[],[1719],{"type":53,"value":1720},"box create --no-repl --git-token $GITHUB_TOKEN",{"type":53,"value":71},{"type":43,"tag":73,"props":1723,"children":1725},{"id":1724},"agent",[1726],{"type":53,"value":1727},"Agent",{"type":43,"tag":44,"props":1729,"children":1730},{},[1731],{"type":53,"value":1732},"If the box was created with an agent, hand it a task:",{"type":43,"tag":80,"props":1734,"children":1736},{"className":82,"code":1735,"language":84,"meta":85,"style":85},"box create --no-repl --agent-harness claude-code --agent-model anthropic\u002Fclaude-sonnet-5\nbox run \"Fix the failing test in src\u002Fauth.test.ts\"\nbox run - \u003C prompt.txt\n",[1737],{"type":43,"tag":48,"props":1738,"children":1739},{"__ignoreMap":85},[1740,1775,1800],{"type":43,"tag":91,"props":1741,"children":1742},{"class":93,"line":94},[1743,1747,1751,1755,1760,1765,1770],{"type":43,"tag":91,"props":1744,"children":1745},{"style":98},[1746],{"type":53,"value":54},{"type":43,"tag":91,"props":1748,"children":1749},{"style":104},[1750],{"type":53,"value":232},{"type":43,"tag":91,"props":1752,"children":1753},{"style":104},[1754],{"type":53,"value":237},{"type":43,"tag":91,"props":1756,"children":1757},{"style":104},[1758],{"type":53,"value":1759}," --agent-harness",{"type":43,"tag":91,"props":1761,"children":1762},{"style":104},[1763],{"type":53,"value":1764}," claude-code",{"type":43,"tag":91,"props":1766,"children":1767},{"style":104},[1768],{"type":53,"value":1769}," --agent-model",{"type":43,"tag":91,"props":1771,"children":1772},{"style":104},[1773],{"type":53,"value":1774}," anthropic\u002Fclaude-sonnet-5\n",{"type":43,"tag":91,"props":1776,"children":1777},{"class":93,"line":30},[1778,1782,1787,1791,1796],{"type":43,"tag":91,"props":1779,"children":1780},{"style":98},[1781],{"type":53,"value":54},{"type":43,"tag":91,"props":1783,"children":1784},{"style":104},[1785],{"type":53,"value":1786}," run",{"type":43,"tag":91,"props":1788,"children":1789},{"style":170},[1790],{"type":53,"value":1128},{"type":43,"tag":91,"props":1792,"children":1793},{"style":104},[1794],{"type":53,"value":1795},"Fix the failing test in src\u002Fauth.test.ts",{"type":43,"tag":91,"props":1797,"children":1798},{"style":170},[1799],{"type":53,"value":1138},{"type":43,"tag":91,"props":1801,"children":1802},{"class":93,"line":289},[1803,1807,1811,1815,1820],{"type":43,"tag":91,"props":1804,"children":1805},{"style":98},[1806],{"type":53,"value":54},{"type":43,"tag":91,"props":1808,"children":1809},{"style":104},[1810],{"type":53,"value":1786},{"type":43,"tag":91,"props":1812,"children":1813},{"style":104},[1814],{"type":53,"value":717},{"type":43,"tag":91,"props":1816,"children":1817},{"style":170},[1818],{"type":53,"value":1819}," \u003C",{"type":43,"tag":91,"props":1821,"children":1822},{"style":104},[1823],{"type":53,"value":1824}," prompt.txt\n",{"type":43,"tag":44,"props":1826,"children":1827},{},[1828,1830,1836],{"type":53,"value":1829},"Text goes to stdout, tool calls to stderr. Prefer doing the work yourself with the\ncommands above; ",{"type":43,"tag":48,"props":1831,"children":1833},{"className":1832},[],[1834],{"type":53,"value":1835},"box run",{"type":53,"value":1837}," is for delegating a whole task to the box's own agent.",{"type":43,"tag":73,"props":1839,"children":1841},{"id":1840},"output",[1842],{"type":53,"value":1843},"Output",{"type":43,"tag":44,"props":1845,"children":1846},{},[1847,1849,1855,1857,1863,1865,1871,1872,1878,1880,1886],{"type":53,"value":1848},"Data goes to stdout, diagnostics to stderr, so piping is safe. ",{"type":43,"tag":48,"props":1850,"children":1852},{"className":1851},[],[1853],{"type":53,"value":1854},"--json",{"type":53,"value":1856}," prints the\nresult as JSON with no wrapper, on every command that returns data. The ones that\nopen a REPL or print a shell script (",{"type":43,"tag":48,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":53,"value":1862},"connect",{"type":53,"value":1864},", ",{"type":43,"tag":48,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":53,"value":1870},"from-snapshot",{"type":53,"value":1864},{"type":43,"tag":48,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":53,"value":1877},"init-demo",{"type":53,"value":1879},",\n",{"type":43,"tag":48,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":53,"value":1885},"completion",{"type":53,"value":1887},") reject it rather than answering an automation caller with a prompt:",{"type":43,"tag":80,"props":1889,"children":1891},{"className":82,"code":1890,"language":84,"meta":85,"style":85},"box files list --json | jq -r '.[].name'\nbox get \"$(cat .box)\" --json\n",[1892],{"type":43,"tag":48,"props":1893,"children":1894},{"__ignoreMap":85},[1895,1941],{"type":43,"tag":91,"props":1896,"children":1897},{"class":93,"line":94},[1898,1902,1906,1910,1914,1919,1924,1928,1932,1937],{"type":43,"tag":91,"props":1899,"children":1900},{"style":98},[1901],{"type":53,"value":54},{"type":43,"tag":91,"props":1903,"children":1904},{"style":104},[1905],{"type":53,"value":702},{"type":43,"tag":91,"props":1907,"children":1908},{"style":104},[1909],{"type":53,"value":1038},{"type":43,"tag":91,"props":1911,"children":1912},{"style":104},[1913],{"type":53,"value":513},{"type":43,"tag":91,"props":1915,"children":1916},{"style":170},[1917],{"type":53,"value":1918}," |",{"type":43,"tag":91,"props":1920,"children":1921},{"style":98},[1922],{"type":53,"value":1923}," jq",{"type":43,"tag":91,"props":1925,"children":1926},{"style":104},[1927],{"type":53,"value":1236},{"type":43,"tag":91,"props":1929,"children":1930},{"style":170},[1931],{"type":53,"value":531},{"type":43,"tag":91,"props":1933,"children":1934},{"style":104},[1935],{"type":53,"value":1936},".[].name",{"type":43,"tag":91,"props":1938,"children":1939},{"style":170},[1940],{"type":53,"value":612},{"type":43,"tag":91,"props":1942,"children":1943},{"class":93,"line":30},[1944,1948,1953,1958,1963,1968,1973],{"type":43,"tag":91,"props":1945,"children":1946},{"style":98},[1947],{"type":53,"value":54},{"type":43,"tag":91,"props":1949,"children":1950},{"style":104},[1951],{"type":53,"value":1952}," get",{"type":43,"tag":91,"props":1954,"children":1955},{"style":170},[1956],{"type":53,"value":1957}," \"$(",{"type":43,"tag":91,"props":1959,"children":1960},{"style":98},[1961],{"type":53,"value":1962},"cat",{"type":43,"tag":91,"props":1964,"children":1965},{"style":104},[1966],{"type":53,"value":1967}," .box",{"type":43,"tag":91,"props":1969,"children":1970},{"style":170},[1971],{"type":53,"value":1972},")\"",{"type":43,"tag":91,"props":1974,"children":1975},{"style":104},[1976],{"type":53,"value":1977}," --json\n",{"type":43,"tag":1979,"props":1980,"children":1981},"style",{},[1982],{"type":53,"value":1983},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1985,"total":766},[1986,2002,2010,2028,2040,2055,2070],{"slug":8,"name":8,"fn":1987,"description":1988,"org":1989,"tags":1990,"stars":26,"repoUrl":27,"updatedAt":2001},"build applications with Upstash SDKs","Work with any Upstash product, SDK, or tool, including serverless Redis (caching, sessions, leaderboards, key-value storage), Ratelimit (rate limiting and throttling), QStash (message queue, cron schedules, background jobs), Workflow (durable long-running functions), Vector (vector database for embeddings, semantic search, and RAG), Search (full-text and semantic search), Box (sandboxed cloud containers for AI agents, TypeScript\u002FJavaScript and Python), the Upstash CLI, and no-signup scratch Redis for agents. Use when the user mentions Upstash or needs any of these capabilities in a serverless, edge, or Node.js app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1991,1994,1997,2000],{"name":1992,"slug":1993,"type":15},"Database","database",{"name":1995,"slug":1996,"type":15},"Redis","redis",{"name":1998,"slug":1999,"type":15},"Serverless","serverless",{"name":9,"slug":8,"type":15},"2026-09-04T07:31:42.251942",{"slug":4,"name":4,"fn":5,"description":6,"org":2003,"tags":2004,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2005,2006,2007,2008,2009],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":2011,"name":2011,"fn":2012,"description":2013,"org":2014,"tags":2015,"stars":26,"repoUrl":27,"updatedAt":2027},"upstash-box-py","build sandboxed environments with Upstash Box","Work with the upstash-box Python SDK for sandboxed cloud containers with AI agents, shell, filesystem, git, cron schedules, snapshots, and a headless browser. Use when building with Upstash Box in Python, creating a sandbox or isolated environment to run untrusted or agent-generated code, running AI coding agents in containers, giving an agent a cloud dev environment with a shell and repository, browser automation from a box, scheduling recurring jobs inside a box, saving and restoring snapshots, or orchestrating parallel boxes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2016,2019,2022,2025,2026],{"name":2017,"slug":2018,"type":15},"Cloud","cloud",{"name":2020,"slug":2021,"type":15},"Code Execution","code-execution",{"name":2023,"slug":2024,"type":15},"Python","python",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-09-04T07:31:43.23681",{"slug":2029,"name":2029,"fn":2030,"description":2031,"org":2032,"tags":2033,"stars":26,"repoUrl":27,"updatedAt":2039},"upstash-cli","manage Upstash resources via CLI","Run the Upstash CLI (`upstash`) against the Upstash Developer API for Redis, Vector, Search, QStash, and teams, with non-interactive commands and JSON output for scripts, CI, and agents. Use when creating, listing, renaming, or deleting Redis databases, changing plans, regions, TLS, eviction, auto-upgrade, or budgets, managing backups, running Redis commands with `upstash redis exec`, creating or inspecting Vector and Search indexes, managing QStash instances and tokens, managing team members, reading usage stats, or automating any Upstash account operation from the terminal. Also use when the user asks how to provision or manage Upstash resources without the console.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2034,2035,2036,2037,2038],{"name":17,"slug":18,"type":15},{"name":1992,"slug":1993,"type":15},{"name":1995,"slug":1996,"type":15},{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},"2026-09-01T08:03:44.986279",{"slug":2041,"name":2041,"fn":2042,"description":2043,"org":2044,"tags":2045,"stars":26,"repoUrl":27,"updatedAt":2054},"upstash-qstash-js","manage serverless messaging with QStash","Work with the @upstash\u002Fqstash TypeScript\u002FJavaScript SDK, an HTTP-based message queue, task scheduler, and background job system for serverless and edge runtimes (Next.js, Vercel, Cloudflare Workers, Deno, Node.js). Use when publishing messages to HTTP endpoints or URL groups, running background jobs without a long-running worker process, scheduling with cron expressions, delaying messages, building FIFO queues with parallelism and flow control, configuring retries and callbacks, handling a dead letter queue (DLQ), deduplicating messages, fanning out to multiple endpoints, verifying QStash webhook signatures (Next.js App Router, Pages Router, and Edge Runtime), running a local QStash dev server, or migrating regions. Also use when the user asks for a serverless cron job, async task queue, job scheduler, delayed delivery, webhook delivery with retries, or event-driven messaging between services.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2046,2049,2052,2053],{"name":2047,"slug":2048,"type":15},"Messaging","messaging",{"name":2050,"slug":2051,"type":15},"Node.js","node-js",{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},"2026-09-01T08:03:43.959379",{"slug":2056,"name":2056,"fn":2057,"description":2058,"org":2059,"tags":2060,"stars":26,"repoUrl":27,"updatedAt":2069},"upstash-ratelimit-js","implement rate limiting with Upstash","Rate limiting for serverless and edge apps with the @upstash\u002Fratelimit TypeScript\u002FJavaScript SDK backed by Upstash Redis. Use when adding a rate limiter or throttling to an API route, Next.js middleware, Vercel Edge, Cloudflare Workers, or any HTTP endpoint; returning 429 Too Many Requests; choosing between fixed window, sliding window, and token bucket algorithms; limiting per user, IP, API key, or tenant with prefixes and custom keys; protecting login, signup, form, or AI endpoints from abuse, bots, and brute force; using deny lists, ephemeral caching, analytics, timeouts, and multi-region rate limits; or estimating the Redis command cost of rate limiting. Also use when the user says rate limit, rate-limiting, throttle, quota, request limits, or traffic protection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2061,2062,2065,2068],{"name":2050,"slug":2051,"type":15},{"name":2063,"slug":2064,"type":15},"Performance","performance",{"name":2066,"slug":2067,"type":15},"Security","security",{"name":9,"slug":8,"type":15},"2026-09-01T08:03:39.995169",{"slug":2071,"name":2071,"fn":2072,"description":2073,"org":2074,"tags":2075,"stars":26,"repoUrl":27,"updatedAt":2080},"upstash-redis-js","manage serverless Redis with Upstash","Work with the @upstash\u002Fredis TypeScript\u002FJavaScript SDK, a serverless HTTP-based Redis client for Next.js, Vercel, Cloudflare Workers, edge runtimes, and Node.js. Use when adding a cache (cache-aside, write-through, TTL and expiration strategies), session storage and user sessions, a key-value store, leaderboards and rankings with sorted sets, counters, distributed locks, queues with lists, streams and consumer groups, JSON documents, pipelines and MULTI\u002FEXEC transactions, Lua scripting, read replicas, or full-text search, typo-tolerant search, facets, and aggregations with Upstash Redis Search (different from regular FT.SEARCH; also available for TCP clients via @upstash\u002Fsearch-redis and @upstash\u002Fsearch-ioredis). Also use when migrating from ioredis or node-redis, when a Redis connection is needed from a serverless function without connection pooling, when integrating @upstash\u002Fratelimit, or when the user says Redis cache, KV store, session store, serverless Redis, or Upstash Redis. Supports automatic serialization\u002Fdeserialization of JavaScript types.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2076,2077,2078,2079],{"name":2050,"slug":2051,"type":15},{"name":1995,"slug":1996,"type":15},{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},"2026-09-01T08:03:41.959437",{"items":2082,"total":2245},[2083,2099,2114,2126,2140,2155,2167,2179,2194,2209,2223,2238],{"slug":2084,"name":2084,"fn":2085,"description":2086,"org":2087,"tags":2088,"stars":2096,"repoUrl":2097,"updatedAt":2098},"context7-cli","manage documentation and skills with ctx7","Use the ctx7 CLI to fetch library documentation, manage AI coding skills, and configure Context7 MCP. Activate when the user mentions \"ctx7\" or \"context7\", needs current docs for any library, wants to install\u002Fsearch\u002Fgenerate skills, or needs to set up Context7 for their AI coding agent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2089,2090,2093],{"name":17,"slug":18,"type":15},{"name":2091,"slug":2092,"type":15},"Documentation","documentation",{"name":2094,"slug":2095,"type":15},"Knowledge Management","knowledge-management",60095,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fcontext7","2026-04-06T18:55:02.689254",{"slug":2100,"name":2100,"fn":2101,"description":2102,"org":2103,"tags":2104,"stars":2096,"repoUrl":2097,"updatedAt":2113},"context7-docs","fetch documentation and code examples","Fetch up-to-date documentation and code examples for any library, framework, SDK, CLI tool, or cloud service. Use whenever the user asks about a specific library — even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot — because training data may not reflect recent API changes or version updates.\nAlways use for: API syntax questions, configuration options, version migration issues, \"how do I\" questions mentioning a library name, debugging that involves library-specific behavior, setup instructions, and CLI tool usage.\nUse even when you think you know the answer. Do not rely on training data for API details, signatures, or configuration options — they are frequently out of date. Prefer this over web search for library documentation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2105,2106,2107,2110],{"name":17,"slug":18,"type":15},{"name":2091,"slug":2092,"type":15},{"name":2108,"slug":2109,"type":15},"Reference","reference",{"name":2111,"slug":2112,"type":15},"SDK","sdk","2026-07-28T05:35:31.125695",{"slug":2115,"name":2115,"fn":2116,"description":2117,"org":2118,"tags":2119,"stars":2096,"repoUrl":2097,"updatedAt":2125},"context7-mcp","retrieve library documentation via MCP","This skill should be used when the user asks about libraries, frameworks, API references, or needs code examples. Activates for setup questions, code generation involving libraries, or mentions of specific frameworks like React, Vue, Next.js, Prisma, Supabase, etc.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2120,2121,2122],{"name":2091,"slug":2092,"type":15},{"name":2094,"slug":2095,"type":15},{"name":2123,"slug":2124,"type":15},"MCP","mcp","2026-07-28T05:35:32.109879",{"slug":2127,"name":2127,"fn":2128,"description":2129,"org":2130,"tags":2131,"stars":2096,"repoUrl":2097,"updatedAt":2139},"find-docs","retrieve documentation for developer technologies","Retrieves up-to-date documentation, API references, and code examples for any developer technology. Use this skill whenever the user asks about a specific library, framework, SDK, CLI tool, or cloud service — even for well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. Your training data may not reflect recent API changes or version updates.\nAlways use for: API syntax questions, configuration options, version migration issues, \"how do I\" questions mentioning a library name, debugging that involves library-specific behavior, setup instructions, and CLI tool usage.\nUse even when you think you know the answer — do not rely on training data for API details, signatures, or configuration options as they are frequently outdated. Always verify against current docs. Prefer this over web search for library documentation and API details.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2132,2133,2136],{"name":2091,"slug":2092,"type":15},{"name":2134,"slug":2135,"type":15},"Research","research",{"name":2137,"slug":2138,"type":15},"Search","search","2026-07-28T05:35:30.135004",{"slug":2141,"name":2141,"fn":2142,"description":2143,"org":2144,"tags":2145,"stars":2152,"repoUrl":2153,"updatedAt":2154},"upstash-ratelimit-ts","implement Redis rate limiting with Upstash","Lightweight guidance for using the Redis Rate Limit TypeScript SDK, including setup steps, basic usage, and pointers to advanced algorithm, features, pricing, and traffic‑protection docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2146,2147,2148,2151],{"name":2063,"slug":2064,"type":15},{"name":1995,"slug":1996,"type":15},{"name":2149,"slug":2150,"type":15},"TypeScript","typescript",{"name":9,"slug":8,"type":15},2043,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fratelimit-js","2026-04-06T18:55:05.25459",{"slug":2156,"name":2156,"fn":2072,"description":2157,"org":2158,"tags":2159,"stars":2164,"repoUrl":2165,"updatedAt":2166},"redis-js","Work with the Upstash Redis JavaScript\u002FTypeScript SDK for serverless Redis operations. Use for caching, session storage, rate limiting, leaderboards, full-text search (querying, filtering, aggregating with @upstash\u002Fredis search extension), and all Redis data structures. Supports automatic serialization\u002Fdeserialization of JavaScript types. Search also available via @upstash\u002Fsearch-redis and @upstash\u002Fsearch-ioredis adapters for TCP clients.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2160,2161,2162,2163],{"name":2050,"slug":2051,"type":15},{"name":1995,"slug":1996,"type":15},{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},959,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fredis-js","2026-04-06T18:55:06.549589",{"slug":2168,"name":2168,"fn":2042,"description":2169,"org":2170,"tags":2171,"stars":2176,"repoUrl":2177,"updatedAt":2178},"qstash-js","Work with the QStash JavaScript\u002FTypeScript SDK for serverless messaging, scheduling. Use when publishing messages to HTTP endpoints, creating schedules, managing queues, verifying incoming messages in serverless environments.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2172,2173,2174,2175],{"name":2047,"slug":2048,"type":15},{"name":2050,"slug":2051,"type":15},{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},268,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fqstash-js","2026-04-06T18:55:07.811408",{"slug":2180,"name":2180,"fn":2181,"description":2182,"org":2183,"tags":2184,"stars":2191,"repoUrl":2192,"updatedAt":2193},"upstash-workflow-js","build serverless workflows with Upstash","Lightweight guidance for using the Upstash Workflow SDK to define, trigger, and manage workflows. Use this Skill whenever a user wants to create workflow endpoints, run steps, or interact with the Upstash Workflow client.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2185,2186,2187,2188],{"name":2050,"slug":2051,"type":15},{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},{"name":2189,"slug":2190,"type":15},"Workflow Automation","workflow-automation",150,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fworkflow-js","2026-04-06T18:55:09.106744",{"slug":2195,"name":2195,"fn":2196,"description":2197,"org":2198,"tags":2199,"stars":2206,"repoUrl":2207,"updatedAt":2208},"upstash-vector-js","implement vector search with Upstash","Provides quick-start guidance and a unified entry point for Vector features, SDK usage, and integrations. Use when users ask how to work with Vector, its TS SDK, features, or supported frameworks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2200,2203,2204,2205],{"name":2201,"slug":2202,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2050,"slug":2051,"type":15},{"name":2137,"slug":2138,"type":15},{"name":9,"slug":8,"type":15},70,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fvector-js","2026-04-06T18:55:10.452627",{"slug":2210,"name":2210,"fn":2012,"description":2211,"org":2212,"tags":2213,"stars":2220,"repoUrl":2221,"updatedAt":2222},"upstash-box-js","Work with the @upstash\u002Fbox SDK for sandboxed cloud containers with AI agents, shell, filesystem, and git. Use when building with Upstash Box, creating sandboxed environments, running AI agents in containers, or orchestrating parallel boxes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2214,2217,2218,2219],{"name":2215,"slug":2216,"type":15},"Agents","agents",{"name":2050,"slug":2051,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},34,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fbox","2026-08-06T05:42:09.756449",{"slug":2224,"name":2224,"fn":2225,"description":2226,"org":2227,"tags":2228,"stars":2235,"repoUrl":2236,"updatedAt":2237},"upstash-search-js","implement search features with Upstash","Entry point for documentation skills covering Upstash Search quick starts, core concepts, and TypeScript SDK usage. Use when a user asks how to get started, how indexing works, or how to use the TS client.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2229,2232,2233,2234],{"name":2230,"slug":2231,"type":15},"API Development","api-development",{"name":2050,"slug":2051,"type":15},{"name":2137,"slug":2138,"type":15},{"name":9,"slug":8,"type":15},22,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fsearch-js","2026-04-06T18:55:11.769669",{"slug":8,"name":8,"fn":1987,"description":1988,"org":2239,"tags":2240,"stars":26,"repoUrl":27,"updatedAt":2001},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2241,2242,2243,2244],{"name":1992,"slug":1993,"type":15},{"name":1995,"slug":1996,"type":15},{"name":1998,"slug":1999,"type":15},{"name":9,"slug":8,"type":15},20]