[{"data":1,"prerenderedAt":2135},["ShallowReactive",2],{"navigation_docs":3,"-providers-tangled":195,"-providers-tangled-surround":2130},[4,23,65,87,133,155,173],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Guides","i-lucide-compass","\u002Fguides","2.guides",[29,33,37,41,45,49,53,57,61],{"title":30,"path":31,"stem":32},"Authenticate","\u002Fguides\u002Fauthentication","2.guides\u002F1.authentication",{"title":34,"path":35,"stem":36},"Work with several forges","\u002Fguides\u002Fmultiple-forges","2.guides\u002F2.multiple-forges",{"title":38,"path":39,"stem":40},"Configure from the environment","\u002Fguides\u002Fenvironment","2.guides\u002F3.environment",{"title":42,"path":43,"stem":44},"Receive webhooks","\u002Fguides\u002Fwebhooks","2.guides\u002F4.webhooks",{"title":46,"path":47,"stem":48},"Check what a forge supports","\u002Fguides\u002Fcapabilities","2.guides\u002F5.capabilities",{"title":50,"path":51,"stem":52},"Handle errors and rate limits","\u002Fguides\u002Ferrors","2.guides\u002F6.errors",{"title":54,"path":55,"stem":56},"Page through results","\u002Fguides\u002Fpagination","2.guides\u002F7.pagination",{"title":58,"path":59,"stem":60},"Browser bundles","\u002Fguides\u002Fbundling","2.guides\u002F8.bundling",{"title":62,"path":63,"stem":64},"Test your code","\u002Fguides\u002Ftesting","2.guides\u002F9.testing",{"title":66,"icon":67,"path":68,"stem":69,"children":70,"page":22},"Concepts","i-lucide-lightbulb","\u002Fconcepts","3.concepts",[71,75,79,83],{"title":72,"path":73,"stem":74},"Data model","\u002Fconcepts\u002Fdata-model","3.concepts\u002F1.data-model",{"title":76,"path":77,"stem":78},"Capabilities","\u002Fconcepts\u002Fcapabilities","3.concepts\u002F2.capabilities",{"title":80,"path":81,"stem":82},"Providers and factories","\u002Fconcepts\u002Fproviders","3.concepts\u002F3.providers",{"title":84,"path":85,"stem":86},"Events","\u002Fconcepts\u002Fevents","3.concepts\u002F4.events",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Providers","i-lucide-server","\u002Fproviders","4.providers",[93,97,101,105,109,113,117,121,125,129],{"title":94,"path":95,"stem":96},"Azure DevOps","\u002Fproviders\u002Fazure-devops","4.providers\u002Fazure-devops",{"title":98,"path":99,"stem":100},"Bitbucket Cloud","\u002Fproviders\u002Fbitbucket","4.providers\u002Fbitbucket",{"title":102,"path":103,"stem":104},"Cursor Origin","\u002Fproviders\u002Fcursor-origin","4.providers\u002Fcursor-origin",{"title":106,"path":107,"stem":108},"Forgejo and Codeberg","\u002Fproviders\u002Fforgejo","4.providers\u002Fforgejo",{"title":110,"path":111,"stem":112},"Gitea","\u002Fproviders\u002Fgitea","4.providers\u002Fgitea",{"title":114,"path":115,"stem":116},"Gitee","\u002Fproviders\u002Fgitee","4.providers\u002Fgitee",{"title":118,"path":119,"stem":120},"GitHub","\u002Fproviders\u002Fgithub","4.providers\u002Fgithub",{"title":122,"path":123,"stem":124},"GitLab","\u002Fproviders\u002Fgitlab","4.providers\u002Fgitlab",{"title":126,"path":127,"stem":128},"pushin.eu","\u002Fproviders\u002Fpushin","4.providers\u002Fpushin",{"title":130,"path":131,"stem":132},"Tangled","\u002Fproviders\u002Ftangled","4.providers\u002Ftangled",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":22},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[139,143,147,151],{"title":140,"path":141,"stem":142},"Provider API","\u002Freference\u002Fprovider-api","5.reference\u002F1.provider-api",{"title":144,"path":145,"stem":146},"Capability matrix","\u002Freference\u002Fcapability-matrix","5.reference\u002F2.capability-matrix",{"title":148,"path":149,"stem":150},"Errors","\u002Freference\u002Ferrors","5.reference\u002F3.errors",{"title":152,"path":153,"stem":154},"JSON Schemas","\u002Freference\u002Fjson-schemas","5.reference\u002F5.json-schemas",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":22},"Examples","i-lucide-boxes","\u002Fexamples","6.examples",[161,165,169],{"title":162,"path":163,"stem":164},"Inbox CLI","\u002Fexamples\u002Finbox-cli","6.examples\u002F1.inbox-cli",{"title":166,"path":167,"stem":168},"Label bot","\u002Fexamples\u002Flabel-bot","6.examples\u002F2.label-bot",{"title":170,"path":171,"stem":172},"Release digest","\u002Fexamples\u002Frelease-digest","6.examples\u002F3.release-digest",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":22},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","7.contributing",[179,183,187,191],{"title":180,"path":181,"stem":182},"Contribution guide","\u002Fcontributing\u002Fguidelines","7.contributing\u002F1.guidelines",{"title":184,"path":185,"stem":186},"Write a provider","\u002Fcontributing\u002Fwrite-a-provider","7.contributing\u002F2.write-a-provider",{"title":188,"path":189,"stem":190},"Record fixtures","\u002Fcontributing\u002Frecord-fixtures","7.contributing\u002F3.record-fixtures",{"title":192,"path":193,"stem":194},"Contributors","\u002Fcontributing\u002Fcontributors","7.contributing\u002F4.contributors",{"id":196,"title":130,"body":197,"description":2123,"extension":2124,"links":2125,"meta":2126,"navigation":330,"path":131,"seo":2128,"stem":132,"__hash__":2129},"docs\u002F4.providers\u002Ftangled.md",{"type":198,"value":199,"toc":2110},"minimark",[200,216,276,281,284,479,485,508,524,617,621,630,633,727,731,753,759,776,780,795,799,816,820,838,849,853,863,867,877,1003,1014,1018,1025,1152,1155,1202,1218,1222,1225,1236,1249,1252,1259,2106],[201,202,203,204,210,211,215],"p",{},"The Tangled provider covers ",[205,206,130],"a",{"href":207,"rel":208},"https:\u002F\u002Ftangled.org",[209],"nofollow",", a forge built on atproto. It reads and writes issues, pulls and comments. It also streams live events from Jetstream and verifies incoming push webhooks. Tangled has no reviews, checks, releases or repository contents API, so those capabilities are ",[212,213,214],"code",{},"false",".",[217,218,219,232],"table",{},[220,221,222],"thead",{},[223,224,225,229],"tr",{},[226,227,228],"th",{},"Detail",[226,230,231],{},"Value",[233,234,235,246,260],"tbody",{},[223,236,237,241],{},[238,239,240],"td",{},"Import",[238,242,243],{},[212,244,245],{},"forges\u002Ftangled",[223,247,248,251],{},[238,249,250],{},"Factories",[238,252,253,256,257],{},[212,254,255],{},"tangled()",", ",[212,258,259],{},"tangledLite()",[223,261,262,265],{},[238,263,264],{},"Auth",[238,266,267,256,270,256,273],{},[212,268,269],{},"anonymous",[212,271,272],{},"app_password",[212,274,275],{},"oauth",[277,278,280],"h2",{"id":279},"authentication","Authentication",[201,282,283],{},"Reads are public and need no credentials. Writes need an atproto session, from an app password or from an OAuth client:",[285,286,291],"pre",{"className":287,"code":288,"language":289,"meta":290,"style":290},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { tangled } from 'forges\u002Ftangled'\n\nconst reader = tangled({}).create()\n\nconst writer = tangled({\n  auth: {\n    type: 'app_password',\n    identifier: 'alice.example.com',\n    password: process.env.TANGLED_APP_PASSWORD!,\n  },\n}).create()\n","ts","",[212,292,293,325,332,365,370,387,400,418,435,459,465],{"__ignoreMap":290},[294,295,298,302,306,310,313,316,319,322],"span",{"class":296,"line":297},"line",1,[294,299,301],{"class":300},"s7zQu","import",[294,303,305],{"class":304},"sMK4o"," {",[294,307,309],{"class":308},"sTEyZ"," tangled",[294,311,312],{"class":304}," }",[294,314,315],{"class":300}," from",[294,317,318],{"class":304}," '",[294,320,245],{"class":321},"sfazB",[294,323,324],{"class":304},"'\n",[294,326,328],{"class":296,"line":327},2,[294,329,331],{"emptyLinePlaceholder":330},true,"\n",[294,333,335,339,342,345,348,351,354,357,359,362],{"class":296,"line":334},3,[294,336,338],{"class":337},"spNyl","const",[294,340,341],{"class":308}," reader ",[294,343,344],{"class":304},"=",[294,346,309],{"class":347},"s2Zo4",[294,349,350],{"class":308},"(",[294,352,353],{"class":304},"{}",[294,355,356],{"class":308},")",[294,358,215],{"class":304},[294,360,361],{"class":347},"create",[294,363,364],{"class":308},"()\n",[294,366,368],{"class":296,"line":367},4,[294,369,331],{"emptyLinePlaceholder":330},[294,371,373,375,378,380,382,384],{"class":296,"line":372},5,[294,374,338],{"class":337},[294,376,377],{"class":308}," writer ",[294,379,344],{"class":304},[294,381,309],{"class":347},[294,383,350],{"class":308},[294,385,386],{"class":304},"{\n",[294,388,390,394,397],{"class":296,"line":389},6,[294,391,393],{"class":392},"swJcz","  auth",[294,395,396],{"class":304},":",[294,398,399],{"class":304}," {\n",[294,401,403,406,408,410,412,415],{"class":296,"line":402},7,[294,404,405],{"class":392},"    type",[294,407,396],{"class":304},[294,409,318],{"class":304},[294,411,272],{"class":321},[294,413,414],{"class":304},"'",[294,416,417],{"class":304},",\n",[294,419,421,424,426,428,431,433],{"class":296,"line":420},8,[294,422,423],{"class":392},"    identifier",[294,425,396],{"class":304},[294,427,318],{"class":304},[294,429,430],{"class":321},"alice.example.com",[294,432,414],{"class":304},[294,434,417],{"class":304},[294,436,438,441,443,446,448,451,453,456],{"class":296,"line":437},9,[294,439,440],{"class":392},"    password",[294,442,396],{"class":304},[294,444,445],{"class":308}," process",[294,447,215],{"class":304},[294,449,450],{"class":308},"env",[294,452,215],{"class":304},[294,454,455],{"class":308},"TANGLED_APP_PASSWORD",[294,457,458],{"class":304},"!,\n",[294,460,462],{"class":296,"line":461},10,[294,463,464],{"class":304},"  },\n",[294,466,468,471,473,475,477],{"class":296,"line":467},11,[294,469,470],{"class":304},"}",[294,472,356],{"class":308},[294,474,215],{"class":304},[294,476,361],{"class":347},[294,478,364],{"class":308},[201,480,481,482,484],{},"With ",[212,483,272],{},", the provider creates a session on the account's PDS (personal data server). It finds the PDS in this order:",[486,487,488,496,503],"ol",{},[489,490,491,492,495],"li",{},"The ",[212,493,494],{},"pds"," option, if you pass it.",[489,497,498,499,502],{},"The DID document, if ",[212,500,501],{},"identifier"," is a DID.",[489,504,505,215],{},[212,506,507],{},"https:\u002F\u002Fbsky.social",[201,509,481,510,512,513,516,517,519,520,523],{},[212,511,275],{},", pass the ",[212,514,515],{},"did",", the ",[212,518,494],{}," and a ",[212,521,522],{},"fetch"," from an atproto OAuth client that signs requests:",[285,525,527],{"className":287,"code":526,"language":289,"meta":290,"style":290},"tangled({\n  auth: {\n    type: 'oauth',\n    did: session.did,\n    pds: session.pds,\n    fetch: session.fetch,\n  },\n})\n",[212,528,529,538,546,560,576,591,606,610],{"__ignoreMap":290},[294,530,531,534,536],{"class":296,"line":297},[294,532,533],{"class":347},"tangled",[294,535,350],{"class":308},[294,537,386],{"class":304},[294,539,540,542,544],{"class":296,"line":327},[294,541,393],{"class":392},[294,543,396],{"class":304},[294,545,399],{"class":304},[294,547,548,550,552,554,556,558],{"class":296,"line":334},[294,549,405],{"class":392},[294,551,396],{"class":304},[294,553,318],{"class":304},[294,555,275],{"class":321},[294,557,414],{"class":304},[294,559,417],{"class":304},[294,561,562,565,567,570,572,574],{"class":296,"line":367},[294,563,564],{"class":392},"    did",[294,566,396],{"class":304},[294,568,569],{"class":308}," session",[294,571,215],{"class":304},[294,573,515],{"class":308},[294,575,417],{"class":304},[294,577,578,581,583,585,587,589],{"class":296,"line":372},[294,579,580],{"class":392},"    pds",[294,582,396],{"class":304},[294,584,569],{"class":308},[294,586,215],{"class":304},[294,588,494],{"class":308},[294,590,417],{"class":304},[294,592,593,596,598,600,602,604],{"class":296,"line":389},[294,594,595],{"class":392},"    fetch",[294,597,396],{"class":304},[294,599,569],{"class":308},[294,601,215],{"class":304},[294,603,522],{"class":308},[294,605,417],{"class":304},[294,607,608],{"class":296,"line":402},[294,609,464],{"class":304},[294,611,612,614],{"class":296,"line":420},[294,613,470],{"class":304},[294,615,616],{"class":308},")\n",[277,618,620],{"id":619},"instance-and-services","Instance and services",[201,622,623,626,627,629],{},[212,624,625],{},"baseUrl"," defaults to ",[212,628,207],{},". The provider uses it for web links and as the instance.",[201,631,632],{},"Tangled records are stored on many servers, so the provider reads from several services. You can change each one:",[217,634,635,648],{},[220,636,637],{},[223,638,639,642,645],{},[226,640,641],{},"Option",[226,643,644],{},"Reads",[226,646,647],{},"Default",[233,649,650,665,680,693,706],{},[223,651,652,657,660],{},[238,653,654],{},[212,655,656],{},"plcUrl",[238,658,659],{},"DID documents, to find each author's PDS",[238,661,662],{},[212,663,664],{},"https:\u002F\u002Fplc.directory",[223,666,667,672,675],{},[238,668,669],{},[212,670,671],{},"backlinksUrl",[238,673,674],{},"Records that point at a thread, such as comments",[238,676,677],{},[212,678,679],{},"https:\u002F\u002Fconstellation.microcosm.blue",[223,681,682,687,690],{},[238,683,684],{},[212,685,686],{},"recordsUrl",[238,688,689],{},"Records, through a Slingshot-compatible cache",[238,691,692],{},"Each author's PDS",[223,694,695,700,703],{},[238,696,697],{},[212,698,699],{},"jetstreamUrl",[238,701,702],{},"The live event stream",[238,704,705],{},"A public Bluesky Jetstream instance",[223,707,708,713,722],{},[238,709,710],{},[212,711,712],{},"apiUrl",[238,714,715,718,719],{},[212,716,717],{},"request()"," and ",[212,720,721],{},"listSource: 'index'",[238,723,724],{},[212,725,726],{},"https:\u002F\u002Fapi.tangled.org",[277,728,730],{"id":729},"refs-and-numbers","Refs and numbers",[201,732,733,734,737,738,718,741,744,745,748,749,752],{},"Issues and pulls are atproto records, identified by AT-URI. A ",[212,735,736],{},"ThreadRef"," has the AT-URI as both ",[212,739,740],{},"number",[212,742,743],{},"externalId",". The repo's ",[212,746,747],{},"owner"," is the owner's DID, and ",[212,750,751],{},"RepoRef.externalId"," is the repo DID.",[201,754,755,756,215],{},"The numbers in the Tangled UI and in webhooks come from the appview, and records don't store them. The provider reports them as ",[212,757,758],{},"displayNumber",[201,760,761,762,764,765,767,768,771,772,775],{},"A ref from a webhook has no ",[212,763,740],{}," until it's matched to a record. To fill ",[212,766,740],{}," during ",[212,769,770],{},"webhooks.ingest()",", pass a ",[212,773,774],{},"resolveDisplayNumber(repo, kind, displayNumber)"," function that returns the AT-URI.",[277,777,779],{"id":778},"thread-state","Thread state",[201,781,782,783,786,787,790,791,794],{},"A thread's state is the latest state record written by the thread's author, the repo owner or a collaborator. The provider ignores state records from other accounts. If another account calls ",[212,784,785],{},"close()"," or ",[212,788,789],{},"reopen()",", the call throws ",[212,792,793],{},"InsufficientScopeError"," and writes no record.",[277,796,798],{"id":797},"listing-threads","Listing threads",[201,800,801,802,805,806,808,809,811,812,815],{},"By default, ",[212,803,804],{},"threads.list()"," reads every record and computes each thread's state, which takes several requests per thread. Set ",[212,807,721],{}," to list from the index at ",[212,810,712],{},". The index takes one request per page, but its states can lag behind the records. Every listing from the index has an ",[212,813,814],{},"index_possibly_stale"," warning.",[277,817,819],{"id":818},"notifications","Notifications",[201,821,822,823,826,827,830,831,834,835,215],{},"Notifications use the ",[212,824,825],{},"org.tangled.temp.notification.*"," lexicons. These lexicons are in Tangled's temporary namespace and can change. To enable notifications, pass ",[212,828,829],{},"auth"," and set ",[212,832,833],{},"notificationsUrl"," to the base URL of the notification service. The notification capabilities are then ",[212,836,837],{},"'experimental'",[201,839,840,841,844,845,848],{},"Stars and follows have no thread. They appear with ",[212,842,843],{},"kind: 'other'",", and ",[212,846,847],{},"typeRaw"," contains the notification type.",[277,850,852],{"id":851},"merging","Merging",[201,854,855,856,718,859,862],{},"The knot that hosts a repository merges its pulls, with no review step. ",[212,857,858],{},"merge()",[212,860,861],{},"approveAndMerge()"," are unavailable.",[277,864,866],{"id":865},"live-events","Live events",[201,868,869,872,873,876],{},[212,870,871],{},"sources.subscribe()"," streams events from Jetstream. Each item has a ",[212,874,875],{},"cursor",". Save it, and pass it back to resume the stream:",[285,878,880],{"className":287,"code":879,"language":289,"meta":290,"style":290},"for await (const { event, cursor } of reader.sources.subscribe({\n  cursor: saved,\n  signal,\n})) {\n  console.log(event.kind, event.summary)\n  saved = cursor\n}\n",[212,881,882,928,940,947,956,987,998],{"__ignoreMap":290},[294,883,884,887,890,893,895,897,900,903,906,908,911,914,916,919,921,924,926],{"class":296,"line":297},[294,885,886],{"class":300},"for",[294,888,889],{"class":300}," await",[294,891,892],{"class":308}," (",[294,894,338],{"class":337},[294,896,305],{"class":304},[294,898,899],{"class":308}," event",[294,901,902],{"class":304},",",[294,904,905],{"class":308}," cursor ",[294,907,470],{"class":304},[294,909,910],{"class":304}," of",[294,912,913],{"class":308}," reader",[294,915,215],{"class":304},[294,917,918],{"class":308},"sources",[294,920,215],{"class":304},[294,922,923],{"class":347},"subscribe",[294,925,350],{"class":308},[294,927,386],{"class":304},[294,929,930,933,935,938],{"class":296,"line":327},[294,931,932],{"class":392},"  cursor",[294,934,396],{"class":304},[294,936,937],{"class":308}," saved",[294,939,417],{"class":304},[294,941,942,945],{"class":296,"line":334},[294,943,944],{"class":308},"  signal",[294,946,417],{"class":304},[294,948,949,951,954],{"class":296,"line":367},[294,950,470],{"class":304},[294,952,953],{"class":308},")) ",[294,955,386],{"class":304},[294,957,958,961,963,966,968,971,973,976,978,980,982,985],{"class":296,"line":372},[294,959,960],{"class":308},"  console",[294,962,215],{"class":304},[294,964,965],{"class":347},"log",[294,967,350],{"class":392},[294,969,970],{"class":308},"event",[294,972,215],{"class":304},[294,974,975],{"class":308},"kind",[294,977,902],{"class":304},[294,979,899],{"class":308},[294,981,215],{"class":304},[294,983,984],{"class":308},"summary",[294,986,616],{"class":392},[294,988,989,992,995],{"class":296,"line":389},[294,990,991],{"class":308},"  saved",[294,993,994],{"class":304}," =",[294,996,997],{"class":308}," cursor\n",[294,999,1000],{"class":296,"line":402},[294,1001,1002],{"class":304},"}\n",[201,1004,1005,1006,1009,1010,1013],{},"To close the connection, abort the signal or break out of the loop. If the connection drops, the iterator throws ",[212,1007,1008],{},"SubscriptionClosedError"," with the last cursor. The provider doesn't reconnect, so call ",[212,1011,1012],{},"subscribe()"," again with that cursor.",[277,1015,1017],{"id":1016},"webhooks","Webhooks",[201,1019,1020,1021,1024],{},"Set ",[212,1022,1023],{},"webhookSecret"," to the secret configured on the hook:",[285,1026,1028],{"className":287,"code":1027,"language":289,"meta":290,"style":290},"const forge = tangled({\n  webhookSecret: process.env.TANGLED_WEBHOOK_SECRET,\n}).create()\n\nconst events = await forge.webhooks.ingest({\n  headers: request.headers,\n  body: await request.text(),\n})\n",[212,1029,1030,1045,1065,1077,1081,1108,1125,1146],{"__ignoreMap":290},[294,1031,1032,1034,1037,1039,1041,1043],{"class":296,"line":297},[294,1033,338],{"class":337},[294,1035,1036],{"class":308}," forge ",[294,1038,344],{"class":304},[294,1040,309],{"class":347},[294,1042,350],{"class":308},[294,1044,386],{"class":304},[294,1046,1047,1050,1052,1054,1056,1058,1060,1063],{"class":296,"line":327},[294,1048,1049],{"class":392},"  webhookSecret",[294,1051,396],{"class":304},[294,1053,445],{"class":308},[294,1055,215],{"class":304},[294,1057,450],{"class":308},[294,1059,215],{"class":304},[294,1061,1062],{"class":308},"TANGLED_WEBHOOK_SECRET",[294,1064,417],{"class":304},[294,1066,1067,1069,1071,1073,1075],{"class":296,"line":334},[294,1068,470],{"class":304},[294,1070,356],{"class":308},[294,1072,215],{"class":304},[294,1074,361],{"class":347},[294,1076,364],{"class":308},[294,1078,1079],{"class":296,"line":367},[294,1080,331],{"emptyLinePlaceholder":330},[294,1082,1083,1085,1088,1090,1092,1095,1097,1099,1101,1104,1106],{"class":296,"line":372},[294,1084,338],{"class":337},[294,1086,1087],{"class":308}," events ",[294,1089,344],{"class":304},[294,1091,889],{"class":300},[294,1093,1094],{"class":308}," forge",[294,1096,215],{"class":304},[294,1098,1016],{"class":308},[294,1100,215],{"class":304},[294,1102,1103],{"class":347},"ingest",[294,1105,350],{"class":308},[294,1107,386],{"class":304},[294,1109,1110,1113,1115,1118,1120,1123],{"class":296,"line":389},[294,1111,1112],{"class":392},"  headers",[294,1114,396],{"class":304},[294,1116,1117],{"class":308}," request",[294,1119,215],{"class":304},[294,1121,1122],{"class":308},"headers",[294,1124,417],{"class":304},[294,1126,1127,1130,1132,1134,1136,1138,1141,1144],{"class":296,"line":402},[294,1128,1129],{"class":392},"  body",[294,1131,396],{"class":304},[294,1133,889],{"class":300},[294,1135,1117],{"class":308},[294,1137,215],{"class":304},[294,1139,1140],{"class":347},"text",[294,1142,1143],{"class":308},"()",[294,1145,417],{"class":304},[294,1147,1148,1150],{"class":296,"line":420},[294,1149,470],{"class":304},[294,1151,616],{"class":308},[201,1153,1154],{},"Tangled sends these headers with each delivery:",[217,1156,1157,1167],{},[220,1158,1159],{},[223,1160,1161,1164],{},[226,1162,1163],{},"Header",[226,1165,1166],{},"Content",[233,1168,1169,1182,1192],{},[223,1170,1171,1176],{},[238,1172,1173],{},[212,1174,1175],{},"X-Tangled-Signature-256",[238,1177,1178,1181],{},[212,1179,1180],{},"sha256="," followed by the hex HMAC-SHA256 of the body",[223,1183,1184,1189],{},[238,1185,1186],{},[212,1187,1188],{},"X-Tangled-Event",[238,1190,1191],{},"The event name",[223,1193,1194,1199],{},[238,1195,1196],{},[212,1197,1198],{},"X-Tangled-Delivery",[238,1200,1201],{},"The delivery ID",[201,1203,1204,1205,1208,1209,786,1211,1214,1215,1217],{},"A ",[212,1206,1207],{},"push"," delivery becomes a ",[212,1210,1207],{},[212,1212,1213],{},"ref"," event. Tangled has no API to register hooks, so the ",[212,1216,1016],{}," management methods are unavailable.",[277,1219,1221],{"id":1220},"recording-fixtures","Recording fixtures",[201,1223,1224],{},"Recording needs no credentials:",[285,1226,1230],{"className":1227,"code":1228,"language":1229,"meta":290,"style":290},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm record-fixtures tangled\n","sh",[212,1231,1232],{"__ignoreMap":290},[294,1233,1234],{"class":296,"line":297},[294,1235,1228],{},[201,1237,1238,1239,718,1242,1245,1246,215],{},"To record other threads, set ",[212,1240,1241],{},"FIXTURE_TANGLED_ISSUE",[212,1243,1244],{},"FIXTURE_TANGLED_PULL"," to AT-URIs. To record through a Slingshot cache, set ",[212,1247,1248],{},"TANGLED_RECORDS_URL",[277,1250,76],{"id":1251},"capabilities",[201,1253,1254,1255,1258],{},"Generated by ",[212,1256,1257],{},"pnpm capability-matrix","; do not edit by hand.",[217,1260,1261,1271],{},[220,1262,1263],{},[223,1264,1265,1268],{},[226,1266,1267],{},"Capability",[226,1269,1270],{},"Support",[233,1272,1273,1283,1292,1302,1311,1320,1329,1338,1347,1356,1365,1374,1383,1392,1401,1410,1420,1430,1439,1448,1458,1467,1476,1485,1494,1503,1512,1521,1530,1539,1548,1558,1567,1576,1586,1595,1604,1613,1622,1631,1640,1649,1658,1667,1676,1685,1694,1703,1712,1721,1730,1739,1748,1757,1766,1775,1784,1793,1802,1811,1820,1829,1838,1847,1856,1865,1874,1883,1892,1901,1910,1919,1928,1937,1946,1955,1964,1973,1982,1991,2000,2009,2018,2027,2036,2045,2054,2063,2072,2082,2096],{},[223,1274,1275,1280],{},[238,1276,1277],{},[212,1278,1279],{},"experimental",[238,1281,1282],{},"❌",[223,1284,1285,1290],{},[238,1286,1287],{},[212,1288,1289],{},"sources.poll",[238,1291,1282],{},[223,1293,1294,1299],{},[238,1295,1296],{},[212,1297,1298],{},"sources.webhook",[238,1300,1301],{},"✅",[223,1303,1304,1309],{},[238,1305,1306],{},[212,1307,1308],{},"sources.subscribe",[238,1310,1301],{},[223,1312,1313,1318],{},[238,1314,1315],{},[212,1316,1317],{},"repos.get",[238,1319,1301],{},[223,1321,1322,1327],{},[238,1323,1324],{},[212,1325,1326],{},"users.get",[238,1328,1282],{},[223,1330,1331,1336],{},[238,1332,1333],{},[212,1334,1335],{},"repos.list",[238,1337,1279],{},[223,1339,1340,1345],{},[238,1341,1342],{},[212,1343,1344],{},"repos.labels",[238,1346,1282],{},[223,1348,1349,1354],{},[238,1350,1351],{},[212,1352,1353],{},"repos.createLabel",[238,1355,1282],{},[223,1357,1358,1363],{},[238,1359,1360],{},[212,1361,1362],{},"repos.milestones",[238,1364,1282],{},[223,1366,1367,1372],{},[238,1368,1369],{},[212,1370,1371],{},"repos.collaborators",[238,1373,1282],{},[223,1375,1376,1381],{},[238,1377,1378],{},[212,1379,1380],{},"repos.permissionFor",[238,1382,1282],{},[223,1384,1385,1390],{},[238,1386,1387],{},[212,1388,1389],{},"repos.addCollaborator",[238,1391,1282],{},[223,1393,1394,1399],{},[238,1395,1396],{},[212,1397,1398],{},"repos.assignableUsers",[238,1400,1282],{},[223,1402,1403,1408],{},[238,1404,1405],{},[212,1406,1407],{},"repos.reviewerCandidates",[238,1409,1282],{},[223,1411,1412,1417],{},[238,1413,1414],{},[212,1415,1416],{},"threads.get",[238,1418,1419],{},"issue, PR",[223,1421,1422,1427],{},[238,1423,1424],{},[212,1425,1426],{},"threads.list",[238,1428,1429],{},"issue (experimental), PR",[223,1431,1432,1437],{},[238,1433,1434],{},[212,1435,1436],{},"threads.getMany",[238,1438,1301],{},[223,1440,1441,1446],{},[238,1442,1443],{},[212,1444,1445],{},"comments.list",[238,1447,1419],{},[223,1449,1450,1455],{},[238,1451,1452],{},[212,1453,1454],{},"comments.edit",[238,1456,1457],{},"issue (experimental), PR (experimental)",[223,1459,1460,1465],{},[238,1461,1462],{},[212,1463,1464],{},"comments.delete",[238,1466,1457],{},[223,1468,1469,1474],{},[238,1470,1471],{},[212,1472,1473],{},"reactions.list",[238,1475,1282],{},[223,1477,1478,1483],{},[238,1479,1480],{},[212,1481,1482],{},"notifications.list",[238,1484,1279],{},[223,1486,1487,1492],{},[238,1488,1489],{},[212,1490,1491],{},"notifications.markRead",[238,1493,1279],{},[223,1495,1496,1501],{},[238,1497,1498],{},[212,1499,1500],{},"notifications.markDone",[238,1502,1282],{},[223,1504,1505,1510],{},[238,1506,1507],{},[212,1508,1509],{},"notifications.unsubscribe",[238,1511,1282],{},[223,1513,1514,1519],{},[238,1515,1516],{},[212,1517,1518],{},"notifications.markAllRead",[238,1520,1279],{},[223,1522,1523,1528],{},[238,1524,1525],{},[212,1526,1527],{},"notifications.markAllDone",[238,1529,1282],{},[223,1531,1532,1537],{},[238,1533,1534],{},[212,1535,1536],{},"notifications.unreadCount",[238,1538,1279],{},[223,1540,1541,1546],{},[238,1542,1543],{},[212,1544,1545],{},"writes.comment",[238,1547,1429],{},[223,1549,1550,1555],{},[238,1551,1552],{},[212,1553,1554],{},"writes.upsertComment",[238,1556,1557],{},"issue (emulated), PR (emulated)",[223,1559,1560,1565],{},[238,1561,1562],{},[212,1563,1564],{},"writes.close",[238,1566,1429],{},[223,1568,1569,1574],{},[238,1570,1571],{},[212,1572,1573],{},"writes.reopen",[238,1575,1429],{},[223,1577,1578,1583],{},[238,1579,1580],{},[212,1581,1582],{},"writes.create",[238,1584,1585],{},"issue (experimental)",[223,1587,1588,1593],{},[238,1589,1590],{},[212,1591,1592],{},"writes.update",[238,1594,1457],{},[223,1596,1597,1602],{},[238,1598,1599],{},[212,1600,1601],{},"writes.setLabels",[238,1603,1282],{},[223,1605,1606,1611],{},[238,1607,1608],{},[212,1609,1610],{},"writes.addLabels",[238,1612,1282],{},[223,1614,1615,1620],{},[238,1616,1617],{},[212,1618,1619],{},"writes.removeLabels",[238,1621,1282],{},[223,1623,1624,1629],{},[238,1625,1626],{},[212,1627,1628],{},"writes.setMilestone",[238,1630,1282],{},[223,1632,1633,1638],{},[238,1634,1635],{},[212,1636,1637],{},"writes.react",[238,1639,1282],{},[223,1641,1642,1647],{},[238,1643,1644],{},[212,1645,1646],{},"writes.setAssignees",[238,1648,1282],{},[223,1650,1651,1656],{},[238,1652,1653],{},[212,1654,1655],{},"writes.requestReview",[238,1657,1282],{},[223,1659,1660,1665],{},[238,1661,1662],{},[212,1663,1664],{},"writes.merge",[238,1666,1282],{},[223,1668,1669,1674],{},[238,1670,1671],{},[212,1672,1673],{},"writes.approveAndMerge",[238,1675,1282],{},[223,1677,1678,1683],{},[238,1679,1680],{},[212,1681,1682],{},"writes.transfer",[238,1684,1282],{},[223,1686,1687,1692],{},[238,1688,1689],{},[212,1690,1691],{},"writes.markDuplicate",[238,1693,1282],{},[223,1695,1696,1701],{},[238,1697,1698],{},[212,1699,1700],{},"subscriptions.get",[238,1702,1457],{},[223,1704,1705,1710],{},[238,1706,1707],{},[212,1708,1709],{},"subscriptions.set",[238,1711,1457],{},[223,1713,1714,1719],{},[238,1715,1716],{},[212,1717,1718],{},"installations",[238,1720,1282],{},[223,1722,1723,1728],{},[238,1724,1725],{},[212,1726,1727],{},"checks.thread",[238,1729,1282],{},[223,1731,1732,1737],{},[238,1733,1734],{},[212,1735,1736],{},"checks.list",[238,1738,1282],{},[223,1740,1741,1746],{},[238,1742,1743],{},[212,1744,1745],{},"checks.report",[238,1747,1282],{},[223,1749,1750,1755],{},[238,1751,1752],{},[212,1753,1754],{},"checks.rerun",[238,1756,1282],{},[223,1758,1759,1764],{},[238,1760,1761],{},[212,1762,1763],{},"ci.runs",[238,1765,1282],{},[223,1767,1768,1773],{},[238,1769,1770],{},[212,1771,1772],{},"ci.run",[238,1774,1282],{},[223,1776,1777,1782],{},[238,1778,1779],{},[212,1780,1781],{},"ci.jobs",[238,1783,1282],{},[223,1785,1786,1791],{},[238,1787,1788],{},[212,1789,1790],{},"ci.log",[238,1792,1282],{},[223,1794,1795,1800],{},[238,1796,1797],{},[212,1798,1799],{},"contents.file",[238,1801,1282],{},[223,1803,1804,1809],{},[238,1805,1806],{},[212,1807,1808],{},"contents.tree",[238,1810,1282],{},[223,1812,1813,1818],{},[238,1814,1815],{},[212,1816,1817],{},"contents.branches",[238,1819,1282],{},[223,1821,1822,1827],{},[238,1823,1824],{},[212,1825,1826],{},"contents.tags",[238,1828,1282],{},[223,1830,1831,1836],{},[238,1832,1833],{},[212,1834,1835],{},"contents.resolveRef",[238,1837,1282],{},[223,1839,1840,1845],{},[238,1841,1842],{},[212,1843,1844],{},"contents.commits",[238,1846,1282],{},[223,1848,1849,1854],{},[238,1850,1851],{},[212,1852,1853],{},"contents.commit",[238,1855,1282],{},[223,1857,1858,1863],{},[238,1859,1860],{},[212,1861,1862],{},"contents.compare",[238,1864,1282],{},[223,1866,1867,1872],{},[238,1868,1869],{},[212,1870,1871],{},"contents.threadFiles",[238,1873,1282],{},[223,1875,1876,1881],{},[238,1877,1878],{},[212,1879,1880],{},"contents.threadCommits",[238,1882,1282],{},[223,1884,1885,1890],{},[238,1886,1887],{},[212,1888,1889],{},"reviews.list",[238,1891,1282],{},[223,1893,1894,1899],{},[238,1895,1896],{},[212,1897,1898],{},"reviews.create",[238,1900,1282],{},[223,1902,1903,1908],{},[238,1904,1905],{},[212,1906,1907],{},"reviews.submit",[238,1909,1282],{},[223,1911,1912,1917],{},[238,1913,1914],{},[212,1915,1916],{},"reviews.approve",[238,1918,1282],{},[223,1920,1921,1926],{},[238,1922,1923],{},[212,1924,1925],{},"reviews.resolveThread",[238,1927,1282],{},[223,1929,1930,1935],{},[238,1931,1932],{},[212,1933,1934],{},"releases.list",[238,1936,1282],{},[223,1938,1939,1944],{},[238,1940,1941],{},[212,1942,1943],{},"releases.get",[238,1945,1282],{},[223,1947,1948,1953],{},[238,1949,1950],{},[212,1951,1952],{},"releases.latest",[238,1954,1282],{},[223,1956,1957,1962],{},[238,1958,1959],{},[212,1960,1961],{},"releases.getByTag",[238,1963,1282],{},[223,1965,1966,1971],{},[238,1967,1968],{},[212,1969,1970],{},"releases.downloadAsset",[238,1972,1282],{},[223,1974,1975,1980],{},[238,1976,1977],{},[212,1978,1979],{},"webhooks.list",[238,1981,1282],{},[223,1983,1984,1989],{},[238,1985,1986],{},[212,1987,1988],{},"webhooks.create",[238,1990,1282],{},[223,1992,1993,1998],{},[238,1994,1995],{},[212,1996,1997],{},"webhooks.update",[238,1999,1282],{},[223,2001,2002,2007],{},[238,2003,2004],{},[212,2005,2006],{},"webhooks.delete",[238,2008,1282],{},[223,2010,2011,2016],{},[238,2012,2013],{},[212,2014,2015],{},"webhooks.rotateSecret",[238,2017,1282],{},[223,2019,2020,2025],{},[238,2021,2022],{},[212,2023,2024],{},"webhooks.deliveries",[238,2026,1282],{},[223,2028,2029,2034],{},[238,2030,2031],{},[212,2032,2033],{},"webhooks.redeliver",[238,2035,1282],{},[223,2037,2038,2043],{},[238,2039,2040],{},[212,2041,2042],{},"search.threads",[238,2044,1282],{},[223,2046,2047,2052],{},[238,2048,2049],{},[212,2050,2051],{},"search.repos",[238,2053,1282],{},[223,2055,2056,2061],{},[238,2057,2058],{},[212,2059,2060],{},"search.commits",[238,2062,1282],{},[223,2064,2065,2070],{},[238,2066,2067],{},[212,2068,2069],{},"securityAlerts",[238,2071,1282],{},[223,2073,2074,2079],{},[238,2075,2076],{},[212,2077,2078],{},"eventKinds",[238,2080,2081],{},"native",[223,2083,2084,2088],{},[238,2085,2086],{},[212,2087,829],{},[238,2089,2090,256,2092,256,2094],{},[212,2091,269],{},[212,2093,272],{},[212,2095,275],{},[223,2097,2098,2103],{},[238,2099,2100],{},[212,2101,2102],{},"limits",[238,2104,2105],{},"unknown",[2107,2108,2109],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}",{"title":290,"searchDepth":327,"depth":327,"links":2111},[2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122],{"id":279,"depth":327,"text":280},{"id":619,"depth":327,"text":620},{"id":729,"depth":327,"text":730},{"id":778,"depth":327,"text":779},{"id":797,"depth":327,"text":798},{"id":818,"depth":327,"text":819},{"id":851,"depth":327,"text":852},{"id":865,"depth":327,"text":866},{"id":1016,"depth":327,"text":1017},{"id":1220,"depth":327,"text":1221},{"id":1251,"depth":327,"text":76},"Use Tangled, a forge built on atproto: issues, pulls, comments, live events and webhooks.","md",null,{"icon":2127},"i-lucide-spool",{"title":130,"description":2123},"nn7klI8nPghHV5LU05Q54ArYlNIiA3I85wmdDyILVvg",[2131,2133],{"title":126,"path":127,"stem":128,"description":2132,"children":-1},"Use pushin.eu, a European git host: repositories, issues, pull requests, labels and notifications.",{"title":140,"path":141,"stem":142,"description":2134,"children":-1},"Every namespace on a provider, and the methods in each.",1791294006245]