[{"data":1,"prerenderedAt":1090},["ShallowReactive",2],{"page-\u002Frunners\u002Fcustom-image":3,"all-pages":755},{"id":4,"title":5,"body":6,"description":746,"extension":747,"meta":748,"navigation":227,"path":749,"robots":750,"seo":751,"sitemap":752,"stem":753,"__hash__":754},"content\u002F03.runners\u002F3.custom-image.md","Custom Runner Images",{"type":7,"value":8,"toc":736},"minimark",[9,14,18,21,53,57,132,159,187,191,205,333,337,340,455,468,472,498,504,508,515,635,638,688,697,701,714,718,732],[10,11,13],"h2",{"id":12},"custom-runner-images","Custom runner images",[15,16,17],"p",{},"The official runner image is deliberately minimal. It ships the runner and its\nhelper binaries and nothing else, so you can build on top of it instead of\nmaintaining a fork of the runner whenever you need extra tooling.",[15,19,20],{},"Reasons to build your own image:",[22,23,24,37,43],"ul",{},[25,26,27,31,32,36],"li",{},[28,29,30],"strong",{},"Preinstall tools."," Workflows invoke programs by name from ",[33,34,35],"code",{},"PATH",". Tools\nbaked into the image are available immediately instead of being downloaded on\nevery run.",[25,38,39,42],{},[28,40,41],{},"Keep private tooling private."," Proprietary scanners can live in your image\nand never leave your infrastructure.",[25,44,45,48,49,52],{},[28,46,47],{},"Control versions."," Pin the exact scanner\u002Fruntime versions your workflows\nwere tested against instead of installing ",[33,50,51],{},"latest"," at run time.",[10,54,56],{"id":55},"what-the-official-image-contains","What the official image contains",[58,59,60,73],"table",{},[61,62,63],"thead",{},[64,65,66,70],"tr",{},[67,68,69],"th",{},"Path",[67,71,72],{},"Purpose",[74,75,76,87,101,118],"tbody",{},[64,77,78,84],{},[79,80,81],"td",{},[33,82,83],{},"\u002Fusr\u002Flocal\u002Fbin\u002Frunner-worker-local",[79,85,86],{},"Runner controller. Also the image entrypoint.",[64,88,89,94],{},[79,90,91],{},[33,92,93],{},"\u002Fusr\u002Flocal\u002Fbin\u002Fbh",[79,95,96,97,100],{},"BountyHub CLI. Workflow steps use ",[33,98,99],{},"bh ask"," to reach the operator.",[64,102,103,108],{},[79,104,105],{},[33,106,107],{},"\u002Fusr\u002Flocal\u002Fbin\u002Fcookielab",[79,109,110,111,114,115,117],{},"Native ",[33,112,113],{},"cookielab"," CLI used by the ",[33,116,113],{}," BHW module.",[64,119,120,125],{},[79,121,122],{},[33,123,124],{},"\u002Fopt\u002Fbountyhub\u002Fdsh",[79,126,127,128,131],{},"Pinned DeepSeek Harness payload (",[33,129,130],{},"BH_DSH_BIN=\u002Fopt\u002Fbountyhub\u002Fdsh\u002Fbin\u002Fdsh",").",[15,133,134,135,138,139,142,143,146,147,150,151,154,155,158],{},"The runtime base is ",[33,136,137],{},"debian:bookworm-slim"," with ",[33,140,141],{},"ca-certificates"," and\n",[33,144,145],{},"libstdc++6"," installed. The image runs as the non-root ",[33,148,149],{},"runner"," user (uid\n",[33,152,153],{},"1000",") and has no writable home directory by default; the runner stores its\nconfig and workdir under ",[33,156,157],{},"$HOME\u002F.bountyhub\u002Frunners\u002F\u003Cname>",".",[15,160,161,162,165,166,169,170,173,174,177,178,180,181,183,184,186],{},"The ",[33,163,164],{},"runner-worker-local"," and ",[33,167,168],{},"runner-worker"," images include the dsh payload.\nThe ",[33,171,172],{},"runner-worker-serverless"," image contains the same layout minus ",[33,175,176],{},"bh"," and\ndsh (it only starts job containers), and the ",[33,179,168],{}," job image ships\n",[33,182,168],{},", ",[33,185,113],{},", and dsh.",[10,188,190],{"id":189},"option-1-extend-the-official-image","Option 1: extend the official image",[15,192,193,194,197,198,201,202,204],{},"Derive from the published image and add your tools. The image sets\n",[33,195,196],{},"USER runner",", so switch to ",[33,199,200],{},"root"," for package installation and back to ",[33,203,149],{},"\nafterwards.",[206,207,212],"pre",{"className":208,"code":209,"language":210,"meta":211,"style":211},"language-dockerfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","FROM ghcr.io\u002Fbountyhub-org\u002Frunner-worker-local:latest\n\nUSER root\n\n# Preinstall everything your workflows call by name.\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends \\\n        git curl jq unzip python3 \\\n    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n\n# The runner stores its config and workdir under ~\u002F.bountyhub, so the user\n# needs a writable home directory.\nRUN mkdir -p \u002Fhome\u002Frunner && chown -R runner:runner \u002Fhome\u002Frunner\nWORKDIR \u002Fhome\u002Frunner\n\n# Bring your own tooling; keep it out of the base image.\nCOPY --chown=runner:runner .\u002Ftools \u002Fopt\u002Ftools\nENV PATH=\"\u002Fopt\u002Ftools:${PATH}\"\n\nUSER runner\n","dockerfile","",[33,213,214,222,229,235,240,246,252,258,264,270,275,281,287,293,299,304,310,316,322,327],{"__ignoreMap":211},[215,216,219],"span",{"class":217,"line":218},"line",1,[215,220,221],{},"FROM ghcr.io\u002Fbountyhub-org\u002Frunner-worker-local:latest\n",[215,223,225],{"class":217,"line":224},2,[215,226,228],{"emptyLinePlaceholder":227},true,"\n",[215,230,232],{"class":217,"line":231},3,[215,233,234],{},"USER root\n",[215,236,238],{"class":217,"line":237},4,[215,239,228],{"emptyLinePlaceholder":227},[215,241,243],{"class":217,"line":242},5,[215,244,245],{},"# Preinstall everything your workflows call by name.\n",[215,247,249],{"class":217,"line":248},6,[215,250,251],{},"RUN apt-get update \\\n",[215,253,255],{"class":217,"line":254},7,[215,256,257],{},"    && apt-get install -y --no-install-recommends \\\n",[215,259,261],{"class":217,"line":260},8,[215,262,263],{},"        git curl jq unzip python3 \\\n",[215,265,267],{"class":217,"line":266},9,[215,268,269],{},"    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n",[215,271,273],{"class":217,"line":272},10,[215,274,228],{"emptyLinePlaceholder":227},[215,276,278],{"class":217,"line":277},11,[215,279,280],{},"# The runner stores its config and workdir under ~\u002F.bountyhub, so the user\n",[215,282,284],{"class":217,"line":283},12,[215,285,286],{},"# needs a writable home directory.\n",[215,288,290],{"class":217,"line":289},13,[215,291,292],{},"RUN mkdir -p \u002Fhome\u002Frunner && chown -R runner:runner \u002Fhome\u002Frunner\n",[215,294,296],{"class":217,"line":295},14,[215,297,298],{},"WORKDIR \u002Fhome\u002Frunner\n",[215,300,302],{"class":217,"line":301},15,[215,303,228],{"emptyLinePlaceholder":227},[215,305,307],{"class":217,"line":306},16,[215,308,309],{},"# Bring your own tooling; keep it out of the base image.\n",[215,311,313],{"class":217,"line":312},17,[215,314,315],{},"COPY --chown=runner:runner .\u002Ftools \u002Fopt\u002Ftools\n",[215,317,319],{"class":217,"line":318},18,[215,320,321],{},"ENV PATH=\"\u002Fopt\u002Ftools:${PATH}\"\n",[215,323,325],{"class":217,"line":324},19,[215,326,228],{"emptyLinePlaceholder":227},[215,328,330],{"class":217,"line":329},20,[215,331,332],{},"USER runner\n",[10,334,336],{"id":335},"option-2-copy-the-binaries-into-your-own-base","Option 2: copy the binaries into your own base",[15,338,339],{},"If you need a different distribution, or an image where you control every layer,\ncopy the binaries out of the official image. This is the same approach the\nofficial Dockerfiles use.",[206,341,343],{"className":208,"code":342,"language":210,"meta":211,"style":211},"FROM debian:bookworm-slim\n\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends ca-certificates libstdc++6 \\\n    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F* \\\n    && useradd --system --uid 1000 --create-home runner\n\nCOPY --from=ghcr.io\u002Fbountyhub-org\u002Frunner-worker-local:latest \\\n     \u002Fusr\u002Flocal\u002Fbin\u002Frunner-worker-local \\\n     \u002Fusr\u002Flocal\u002Fbin\u002Fbh \\\n     \u002Fusr\u002Flocal\u002Fbin\u002Fcookielab \\\n     \u002Fusr\u002Flocal\u002Fbin\u002F\n\n# The harness is a separate tree, not a single binary. Copy it if you want\n# agent steps to work; otherwise the runner falls back to `dsh` on PATH or\n# fails the agent step.\nCOPY --from=ghcr.io\u002Fbountyhub-org\u002Frunner-worker-local:latest \\\n     \u002Fopt\u002Fbountyhub\u002Fdsh \u002Fopt\u002Fbountyhub\u002Fdsh\nENV BH_DSH_BIN=\u002Fopt\u002Fbountyhub\u002Fdsh\u002Fbin\u002Fdsh\n\nWORKDIR \u002Fhome\u002Frunner\nUSER runner\nENTRYPOINT [\"\u002Fusr\u002Flocal\u002Fbin\u002Frunner-worker-local\"]\n",[33,344,345,350,354,358,363,368,373,377,382,387,392,397,402,406,411,416,421,425,430,435,439,444,449],{"__ignoreMap":211},[215,346,347],{"class":217,"line":218},[215,348,349],{},"FROM debian:bookworm-slim\n",[215,351,352],{"class":217,"line":224},[215,353,228],{"emptyLinePlaceholder":227},[215,355,356],{"class":217,"line":231},[215,357,251],{},[215,359,360],{"class":217,"line":237},[215,361,362],{},"    && apt-get install -y --no-install-recommends ca-certificates libstdc++6 \\\n",[215,364,365],{"class":217,"line":242},[215,366,367],{},"    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F* \\\n",[215,369,370],{"class":217,"line":248},[215,371,372],{},"    && useradd --system --uid 1000 --create-home runner\n",[215,374,375],{"class":217,"line":254},[215,376,228],{"emptyLinePlaceholder":227},[215,378,379],{"class":217,"line":260},[215,380,381],{},"COPY --from=ghcr.io\u002Fbountyhub-org\u002Frunner-worker-local:latest \\\n",[215,383,384],{"class":217,"line":266},[215,385,386],{},"     \u002Fusr\u002Flocal\u002Fbin\u002Frunner-worker-local \\\n",[215,388,389],{"class":217,"line":272},[215,390,391],{},"     \u002Fusr\u002Flocal\u002Fbin\u002Fbh \\\n",[215,393,394],{"class":217,"line":277},[215,395,396],{},"     \u002Fusr\u002Flocal\u002Fbin\u002Fcookielab \\\n",[215,398,399],{"class":217,"line":283},[215,400,401],{},"     \u002Fusr\u002Flocal\u002Fbin\u002F\n",[215,403,404],{"class":217,"line":289},[215,405,228],{"emptyLinePlaceholder":227},[215,407,408],{"class":217,"line":295},[215,409,410],{},"# The harness is a separate tree, not a single binary. Copy it if you want\n",[215,412,413],{"class":217,"line":301},[215,414,415],{},"# agent steps to work; otherwise the runner falls back to `dsh` on PATH or\n",[215,417,418],{"class":217,"line":306},[215,419,420],{},"# fails the agent step.\n",[215,422,423],{"class":217,"line":312},[215,424,381],{},[215,426,427],{"class":217,"line":318},[215,428,429],{},"     \u002Fopt\u002Fbountyhub\u002Fdsh \u002Fopt\u002Fbountyhub\u002Fdsh\n",[215,431,432],{"class":217,"line":324},[215,433,434],{},"ENV BH_DSH_BIN=\u002Fopt\u002Fbountyhub\u002Fdsh\u002Fbin\u002Fdsh\n",[215,436,437],{"class":217,"line":329},[215,438,228],{"emptyLinePlaceholder":227},[215,440,442],{"class":217,"line":441},21,[215,443,298],{},[215,445,447],{"class":217,"line":446},22,[215,448,332],{},[215,450,452],{"class":217,"line":451},23,[215,453,454],{},"ENTRYPOINT [\"\u002Fusr\u002Flocal\u002Fbin\u002Frunner-worker-local\"]\n",[15,456,457,458,461,462,165,464,467],{},"The binaries are dynamically linked, so use a base with at least the glibc\nversion of ",[33,459,460],{},"debian:bookworm"," (2.36). ",[33,463,137],{},[33,465,466],{},"ubuntu:24.04","\nboth work; older bases may fail at startup.",[10,469,471],{"id":470},"build-the-image","Build the image",[206,473,477],{"className":474,"code":475,"language":476,"meta":211,"style":211},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker build -t my-runner:latest .\n","bash",[33,478,479],{"__ignoreMap":211},[215,480,481,485,489,492,495],{"class":217,"line":218},[215,482,484],{"class":483},"sBMFI","docker",[215,486,488],{"class":487},"sfazB"," build",[215,490,491],{"class":487}," -t",[215,493,494],{"class":487}," my-runner:latest",[215,496,497],{"class":487}," .\n",[15,499,500,501,503],{},"Pin a specific image tag instead of ",[33,502,51],{}," when you want reproducible builds,\nand rebuild when you upgrade the runner.",[10,505,507],{"id":506},"register-and-run-in-a-container","Register and run in a container",[15,509,510,511,514],{},"The runner writes its config to ",[33,512,513],{},"$HOME\u002F.bountyhub",", so mount a volume over the\nhome directory. A named volume inherits the ownership of the directory in the\nimage, which keeps it writable for the non-root user.",[206,516,518],{"className":474,"code":517,"language":476,"meta":211,"style":211},"docker volume create my-runner-home\n\ndocker run --rm -it \\\n  -v my-runner-home:\u002Fhome\u002Frunner \\\n  my-runner:latest \\\n  register --token \"\u003CREGISTRATION_TOKEN>\" \\\n           --url \"https:\u002F\u002Fbountyhub.org\" \\\n           --name \"my-runner\" \\\n           --capacity 4 \\\n           --unattended\n",[33,519,520,533,537,554,564,571,591,605,619,630],{"__ignoreMap":211},[215,521,522,524,527,530],{"class":217,"line":218},[215,523,484],{"class":483},[215,525,526],{"class":487}," volume",[215,528,529],{"class":487}," create",[215,531,532],{"class":487}," my-runner-home\n",[215,534,535],{"class":217,"line":224},[215,536,228],{"emptyLinePlaceholder":227},[215,538,539,541,544,547,550],{"class":217,"line":231},[215,540,484],{"class":483},[215,542,543],{"class":487}," run",[215,545,546],{"class":487}," --rm",[215,548,549],{"class":487}," -it",[215,551,553],{"class":552},"sTEyZ"," \\\n",[215,555,556,559,562],{"class":217,"line":237},[215,557,558],{"class":487},"  -v",[215,560,561],{"class":487}," my-runner-home:\u002Fhome\u002Frunner",[215,563,553],{"class":552},[215,565,566,569],{"class":217,"line":242},[215,567,568],{"class":487},"  my-runner:latest",[215,570,553],{"class":552},[215,572,573,576,579,583,586,589],{"class":217,"line":248},[215,574,575],{"class":487},"  register",[215,577,578],{"class":487}," --token",[215,580,582],{"class":581},"sMK4o"," \"",[215,584,585],{"class":487},"\u003CREGISTRATION_TOKEN>",[215,587,588],{"class":581},"\"",[215,590,553],{"class":552},[215,592,593,596,598,601,603],{"class":217,"line":254},[215,594,595],{"class":487},"           --url",[215,597,582],{"class":581},[215,599,600],{"class":487},"https:\u002F\u002Fbountyhub.org",[215,602,588],{"class":581},[215,604,553],{"class":552},[215,606,607,610,612,615,617],{"class":217,"line":260},[215,608,609],{"class":487},"           --name",[215,611,582],{"class":581},[215,613,614],{"class":487},"my-runner",[215,616,588],{"class":581},[215,618,553],{"class":552},[215,620,621,624,628],{"class":217,"line":266},[215,622,623],{"class":487},"           --capacity",[215,625,627],{"class":626},"sbssI"," 4",[215,629,553],{"class":552},[215,631,632],{"class":217,"line":272},[215,633,634],{"class":487},"           --unattended\n",[15,636,637],{},"Then run the controller:",[206,639,641],{"className":474,"code":640,"language":476,"meta":211,"style":211},"docker run -d --name my-runner \\\n  -v my-runner-home:\u002Fhome\u002Frunner \\\n  my-runner:latest \\\n  run --name \"my-runner\"\n",[33,642,643,660,668,674],{"__ignoreMap":211},[215,644,645,647,649,652,655,658],{"class":217,"line":218},[215,646,484],{"class":483},[215,648,543],{"class":487},[215,650,651],{"class":487}," -d",[215,653,654],{"class":487}," --name",[215,656,657],{"class":487}," my-runner",[215,659,553],{"class":552},[215,661,662,664,666],{"class":217,"line":224},[215,663,558],{"class":487},[215,665,561],{"class":487},[215,667,553],{"class":552},[215,669,670,672],{"class":217,"line":231},[215,671,568],{"class":487},[215,673,553],{"class":552},[215,675,676,679,681,683,685],{"class":217,"line":237},[215,677,678],{"class":487},"  run",[215,680,654],{"class":487},[215,682,582],{"class":581},[215,684,614],{"class":487},[215,686,687],{"class":581},"\"\n",[15,689,690,691,693,694,158],{},"If you bind-mount a host directory instead of using a named volume, make sure\nuid ",[33,692,153],{}," can write to it, or pass ",[33,695,696],{},"--user \"$(id -u):$(id -g)\"",[10,698,700],{"id":699},"upgrading","Upgrading",[15,702,703,704,707,708,711,712,158],{},"Treat the image as the deployment unit: rebuild it from a newer base tag when a\nnew runner release is available. The ",[33,705,706],{},"upgrade"," subcommand replaces the running\nexecutable in place, so it cannot update the root-owned binary in\n",[33,709,710],{},"\u002Fusr\u002Flocal\u002Fbin"," while the container runs as ",[33,713,149],{},[10,715,717],{"id":716},"security-notes","Security notes",[22,719,720,723,729],{},[25,721,722],{},"Never bake a registration token or platform token into the image.",[25,724,725,726,728],{},"Keep ",[33,727,196],{}," unless a tool genuinely requires root; prefer installing\ntools to a writable path over running the whole runner as root.",[25,730,731],{},"The runner can execute arbitrary commands by design. Run one runner per\ncontainer and isolate it the same way you would isolate any other scanning\nhost.",[733,734,735],"style",{},"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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":211,"searchDepth":242,"depth":237,"links":737},[738,739,740,741,742,743,744,745],{"id":12,"depth":224,"text":13},{"id":55,"depth":224,"text":56},{"id":189,"depth":224,"text":190},{"id":335,"depth":224,"text":336},{"id":470,"depth":224,"text":471},{"id":506,"depth":224,"text":507},{"id":699,"depth":224,"text":700},{"id":716,"depth":224,"text":717},"Build your own runner image from the official BountyHub image to preinstall tools.","md",{},"\u002Frunners\u002Fcustom-image",null,{"title":5,"description":746},{"loc":749},"03.runners\u002F3.custom-image","o4uStOJLEHWqB2ISujIfNKo4VRoqJlUiOSAXqekwzTs",[756,819,835,851,886,902,914,925,936,947,971,990,1010,1021,1032],{"title":757,"path":758,"stem":759,"children":760},"Workflows","\u002Fworkflows","01.workflows",[761,763,767,771,775,779,783,787,791,795,799,803,807,811,815],{"title":757,"path":758,"stem":762},"01.workflows\u002Findex",{"title":764,"path":765,"stem":766},"Workflow Quick Reference","\u002Fworkflows\u002Fquick-reference","01.workflows\u002F00.quick-reference",{"title":768,"path":769,"stem":770},"Workflows Overview","\u002Fworkflows\u002Foverview","01.workflows\u002F01.overview",{"title":772,"path":773,"stem":774},"Workflow Syntax Reference","\u002Fworkflows\u002Fsyntax-reference","01.workflows\u002F02.syntax-reference",{"title":776,"path":777,"stem":778},"Steps","\u002Fworkflows\u002Fsteps","01.workflows\u002F03.steps",{"title":780,"path":781,"stem":782},"Step Outputs","\u002Fworkflows\u002Fstep-outputs","01.workflows\u002F04.step-outputs",{"title":784,"path":785,"stem":786},"Concurrency","\u002Fworkflows\u002Fconcurrency","01.workflows\u002F05.concurrency",{"title":788,"path":789,"stem":790},"Transforms","\u002Fworkflows\u002Ftransforms","01.workflows\u002F06.transforms",{"title":792,"path":793,"stem":794},"For Each","\u002Fworkflows\u002Ffor-each","01.workflows\u002F07.for-each",{"title":796,"path":797,"stem":798},"Modules","\u002Fworkflows\u002Fmodules","01.workflows\u002F08.modules",{"title":800,"path":801,"stem":802},"Agents","\u002Fworkflows\u002Fagents","01.workflows\u002F09.agents",{"title":804,"path":805,"stem":806},"Decisions","\u002Fworkflows\u002Fdecisions","01.workflows\u002F10.decisions",{"title":808,"path":809,"stem":810},"Configuration References","\u002Fworkflows\u002Fconfig","01.workflows\u002F11.config",{"title":812,"path":813,"stem":814},"Comparison With Other Automation Systems","\u002Fworkflows\u002Fcomparison","01.workflows\u002F12.comparison",{"title":816,"path":817,"stem":818},"Generate with AI","\u002Fworkflows\u002Fai-generation","01.workflows\u002F13.ai-generation",{"title":820,"path":821,"stem":822,"children":823},"Projects","\u002Fprojects","02.projects",[824,827,831],{"title":825,"path":821,"stem":826},"Projects & Runs","02.projects\u002Findex",{"title":828,"path":829,"stem":830},"Projects Overview","\u002Fprojects\u002Foverview","02.projects\u002F1.overview",{"title":832,"path":833,"stem":834},"Runs & Artifacts","\u002Fprojects\u002Fruns-artifacts","02.projects\u002F2.runs-artifacts",{"title":836,"path":837,"stem":838,"children":839},"Runners","\u002Frunners","03.runners",[840,842,846,850],{"title":836,"path":837,"stem":841},"03.runners\u002Findex",{"title":843,"path":844,"stem":845},"Runner Overview","\u002Frunners\u002Foverview","03.runners\u002F1.overview",{"title":847,"path":848,"stem":849},"Getting Started with Runners","\u002Frunners\u002Fgetting-started","03.runners\u002F2.getting-started",{"title":5,"path":749,"stem":753},{"title":852,"path":853,"stem":854,"children":855},"Datasets","\u002Fdatasets","04.datasets",[856,858,862,866,870,874,878,882],{"title":852,"path":853,"stem":857},"04.datasets\u002Findex",{"title":859,"path":860,"stem":861},"Datasets Overview","\u002Fdatasets\u002Foverview","04.datasets\u002F1.overview",{"title":863,"path":864,"stem":865},"Dataset Schemas and Identity","\u002Fdatasets\u002Fschema","04.datasets\u002F2.schema",{"title":867,"path":868,"stem":869},"Pushing and Reading Dataset Rows","\u002Fdatasets\u002Fworkflows","04.datasets\u002F3.workflows",{"title":871,"path":872,"stem":873},"Dataset SQL Reference","\u002Fdatasets\u002Fsql","04.datasets\u002F4.sql",{"title":875,"path":876,"stem":877},"Dataset Structured Filters","\u002Fdatasets\u002Ffilters","04.datasets\u002F5.filters",{"title":879,"path":880,"stem":881},"Dataset Saved Views","\u002Fdatasets\u002Fviews","04.datasets\u002F6.views",{"title":883,"path":884,"stem":885},"Datasets API and CLI","\u002Fdatasets\u002Fapi-cli","04.datasets\u002F7.api-cli",{"title":887,"path":888,"stem":889,"children":890},"Agent","\u002Fagent","05.agent",[891,894,898],{"title":892,"path":888,"stem":893},"BH Agent","05.agent\u002Findex",{"title":895,"path":896,"stem":897},"BH Agent Overview","\u002Fagent\u002Foverview","05.agent\u002F1.overview",{"title":899,"path":900,"stem":901},"MCP servers","\u002Fagent\u002Fmcp-servers","05.agent\u002F2.mcp-servers",{"title":903,"path":904,"stem":905,"children":906},"Bhlast","\u002Fbhlast","06.bhlast",[907,910],{"title":908,"path":904,"stem":909},"Bhlast Servers","06.bhlast\u002Findex",{"title":911,"path":912,"stem":913},"Bhlast servers overview","\u002Fbhlast\u002Foverview","06.bhlast\u002F1.overview",{"title":915,"path":916,"stem":917,"children":918},"Notifications","\u002Fnotifications","07.notifications",[919,921],{"title":915,"path":916,"stem":920},"07.notifications\u002Findex",{"title":922,"path":923,"stem":924},"Notifications Overview","\u002Fnotifications\u002Foverview","07.notifications\u002F1.overview",{"title":926,"path":927,"stem":928,"children":929},"Blob Storage","\u002Fblob-storage","08.blob-storage",[930,932],{"title":926,"path":927,"stem":931},"08.blob-storage\u002Findex",{"title":933,"path":934,"stem":935},"Blob Storage Overview","\u002Fblob-storage\u002Foverview","08.blob-storage\u002F1.overview",{"title":937,"path":938,"stem":939,"children":940},"Payloads","\u002Fpayloads","09.payloads",[941,943],{"title":937,"path":938,"stem":942},"09.payloads\u002Findex",{"title":944,"path":945,"stem":946},"Payloads overview","\u002Fpayloads\u002Foverview","09.payloads\u002F1.overview",{"title":948,"path":949,"stem":950,"children":951},"Cve Watcher","\u002Fcve-watcher","10.cve-watcher",[952,955,959,963,967],{"title":953,"path":949,"stem":954},"CVE Watcher","10.cve-watcher\u002Findex",{"title":956,"path":957,"stem":958},"CVE Watcher Overview","\u002Fcve-watcher\u002Foverview","10.cve-watcher\u002F1.overview",{"title":960,"path":961,"stem":962},"CVE Watcher Search and Filters","\u002Fcve-watcher\u002Fsearch","10.cve-watcher\u002F2.search",{"title":964,"path":965,"stem":966},"CVE Watcher Push Notifications","\u002Fcve-watcher\u002Fnotifications","10.cve-watcher\u002F3.notifications",{"title":968,"path":969,"stem":970},"CVE Watcher API and Scopes","\u002Fcve-watcher\u002Fapi","10.cve-watcher\u002F4.api",{"title":972,"path":973,"stem":974,"children":975},"Developer","\u002Fdeveloper","11.developer",[976,978,982,986],{"title":972,"path":973,"stem":977},"11.developer\u002Findex",{"title":979,"path":980,"stem":981},"Developer Overview","\u002Fdeveloper\u002Foverview","11.developer\u002F1.overview",{"title":983,"path":984,"stem":985},"Personal Access Token Scopes","\u002Fdeveloper\u002Fscopes","11.developer\u002F2.scopes",{"title":987,"path":988,"stem":989},"Personal Access Tokens","\u002Fdeveloper\u002Fpersonal-access-tokens","11.developer\u002F3.personal-access-tokens",{"title":991,"path":992,"stem":993,"children":994},"Bh","\u002Fbh","12.bh",[995,998,1002,1006],{"title":996,"path":992,"stem":997},"BH CLI","12.bh\u002Findex",{"title":999,"path":1000,"stem":1001},"BH CLI Overview","\u002Fbh\u002Foverview","12.bh\u002F1.overview",{"title":1003,"path":1004,"stem":1005},"BH CLI Commands","\u002Fbh\u002Fcommands","12.bh\u002F2.commands",{"title":1007,"path":1008,"stem":1009},"BH CLI Examples","\u002Fbh\u002Fexamples","12.bh\u002F3.examples",{"title":1011,"path":1012,"stem":1013,"children":1014},"Billing","\u002Fbilling","13.billing",[1015,1017],{"title":1011,"path":1012,"stem":1016},"13.billing\u002Findex",{"title":1018,"path":1019,"stem":1020},"Billing Overview","\u002Fbilling\u002Foverview","13.billing\u002F1.overview",{"title":1022,"path":1023,"stem":1024,"children":1025},"Tools","\u002Ftools","14.tools",[1026,1028],{"title":1022,"path":1023,"stem":1027},"14.tools\u002Findex",{"title":1029,"path":1030,"stem":1031},"Cookie Lab","\u002Ftools\u002Fcookie-lab","14.tools\u002F1.cookie-lab",{"title":1033,"path":1034,"stem":1035,"children":1036},"Site Policies","\u002Fsite-policies","99.site-policies",[1037,1039,1052,1056,1060,1064,1068,1072,1076],{"title":1033,"path":1034,"stem":1038},"99.site-policies\u002Findex",{"title":1040,"path":1041,"stem":1042,"children":1043},"Privacy Policy","\u002Fsite-policies\u002Fprivacy-policy","99.site-policies\u002F1.privacy-policy",[1044,1048],{"title":1045,"path":1046,"stem":1047},"Company Processors","\u002Fsite-policies\u002Fprivacy-policy\u002Fcompany-processors","99.site-policies\u002Fprivacy-policy\u002F1.company-processors",{"title":1049,"path":1050,"stem":1051},"Data Export Instructions","\u002Fsite-policies\u002Fprivacy-policy\u002Fdata-export-instructions","99.site-policies\u002Fprivacy-policy\u002F2.data-export-instructions",{"title":1053,"path":1054,"stem":1055},"Terms of Service","\u002Fsite-policies\u002Fterms-of-service","99.site-policies\u002F2.terms-of-service",{"title":1057,"path":1058,"stem":1059},"California Resident Notice at Collection","\u002Fsite-policies\u002Fccpa","99.site-policies\u002F3.ccpa",{"title":1061,"path":1062,"stem":1063},"Cancellation Policy","\u002Fsite-policies\u002Fcancellation-policy","99.site-policies\u002F4.cancellation-policy",{"title":1065,"path":1066,"stem":1067},"Refund Policy","\u002Fsite-policies\u002Frefund-policy","99.site-policies\u002F5.refund-policy",{"title":1069,"path":1070,"stem":1071},"Taxes on Services","\u002Fsite-policies\u002Ftaxes-on-services","99.site-policies\u002F6.taxes-on-services",{"title":1073,"path":1074,"stem":1075},"Disclaimer","\u002Fsite-policies\u002Fdisclaimer","99.site-policies\u002F7.disclaimer",{"title":1077,"path":1078,"stem":1079,"children":1080},"Security","\u002Fsite-policies\u002Fsecurity","99.site-policies\u002Fsecurity\u002Findex",[1081,1082,1086],{"title":1077,"path":1078,"stem":1079},{"title":1083,"path":1084,"stem":1085},"Security Overview","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-overview","99.site-policies\u002Fsecurity\u002F1.security-overview",{"title":1087,"path":1088,"stem":1089},"Security Response","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-response","99.site-policies\u002Fsecurity\u002F2.security-response",1794410312376]