[{"data":1,"prerenderedAt":340},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Fintroduction":115,"\u002Fgetting-started\u002Fintroduction-surround":337},[4,36,57,88,104],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F2.install","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F3.quickstart","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Testing","\u002Fgetting-started\u002Ftesting","1.getting-started\u002F4.testing","i-lucide-flask-conical",{"title":31,"path":32,"stem":33,"icon":34},"CLI","\u002Fgetting-started\u002Fcli","1.getting-started\u002F5.cli","i-lucide-terminal",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Concepts","i-lucide-boxes","\u002Fconcepts","2.concepts",[42,47,52],{"title":43,"path":44,"stem":45,"icon":46},"SQL-first contract","\u002Fconcepts\u002Fsql-first-contract","2.concepts\u002F1.sql-first-contract","i-lucide-database",{"title":48,"path":49,"stem":50,"icon":51},"Jobs and status","\u002Fconcepts\u002Fjobs-and-status","2.concepts\u002F2.jobs-and-status","i-lucide-list-checks",{"title":53,"path":54,"stem":55,"icon":56},"Fencing and settles","\u002Fconcepts\u002Ffencing-and-settles","2.concepts\u002F3.fencing-and-settles","i-lucide-shield",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":35},"API","i-lucide-code-2","\u002Fapi","3.api",[63,68,73,78,83],{"title":64,"path":65,"stem":66,"icon":67},"Enqueue","\u002Fapi\u002Fenqueue","3.api\u002F1.enqueue","i-lucide-plus-circle",{"title":69,"path":70,"stem":71,"icon":72},"Claim and heartbeat","\u002Fapi\u002Fclaim-and-heartbeat","3.api\u002F2.claim-and-heartbeat","i-lucide-hand",{"title":74,"path":75,"stem":76,"icon":77},"Worker and handlers","\u002Fapi\u002Fworker-and-handlers","3.api\u002F3.worker-and-handlers","i-lucide-cpu",{"title":79,"path":80,"stem":81,"icon":82},"HTTP facade","\u002Fapi\u002Fhttp-facade","3.api\u002F4.http-facade","i-lucide-globe",{"title":84,"path":85,"stem":86,"icon":87},"Authorization","\u002Fapi\u002Fauthorization","3.api\u002F5.authorization","i-lucide-key-round",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":35},"Operations","i-lucide-activity","\u002Foperations","4.operations",[94,99],{"title":95,"path":96,"stem":97,"icon":98},"Housekeeping","\u002Foperations\u002Fhousekeeping","4.operations\u002F1.housekeeping","i-lucide-timer",{"title":100,"path":101,"stem":102,"icon":103},"Redrive and dead letters","\u002Foperations\u002Fredrive-and-dlq","4.operations\u002F2.redrive-and-dlq","i-lucide-rotate-ccw",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":35},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[110],{"title":111,"path":112,"stem":113,"icon":114},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F1.configuration","i-lucide-settings",{"id":116,"title":11,"body":117,"description":330,"extension":331,"links":332,"meta":333,"navigation":334,"path":12,"seo":335,"stem":13,"__hash__":336},"docs\u002F1.getting-started\u002F1.introduction.md",{"type":118,"value":119,"toc":320},"minimark",[120,133,146,151,154,168,179,187,255,259,268,271,275],[121,122,123,127,128,132],"p",{},[124,125,126],"strong",{},"OutlabsTaskq"," (",[129,130,131],"code",{},"outlabs-taskq",") is a Postgres-native task queue for Python fleets.",[121,134,135,136,145],{},"It is infrastructure extracted from production systems at OutLabs — the same class of problem as ",[137,138,142],"a",{"href":139,"rel":140},"https:\u002F\u002Fauth.outlabs.io",[141],"nofollow",[129,143,144],{},"outlabs-auth",": stop reinventing a foundational backend piece in every product.",[147,148,150],"h2",{"id":149},"why-it-exists","Why it exists",[121,152,153],{},"Most teams either:",[155,156,157,161],"ol",{},[158,159,160],"li",{},"Run Redis \u002F RabbitMQ \u002F Celery and accept another operational dependency, or",[158,162,163,164,167],{},"Grow an ad-hoc ",[129,165,166],{},"jobs"," table until claim races, lost settles, and silent duplicates show up at 2am.",[121,169,170,171,174,175,178],{},"OutlabsTaskq takes a third path: ",[124,172,173],{},"PostgreSQL is the broker",", and the ",[124,176,177],{},"PL\u002FpgSQL functions are the contract",". The Python package is a typed client — not a second source of truth.",[147,180,182,183,186],{"id":181},"what-you-get-today-010a2","What you get today (",[129,184,185],{},"0.1.0a2",")",[188,189,190,209,233,242],"card-group",{},[191,192,194],"card",{"icon":46,"title":193},"SQL kernel",[121,195,196,197,200,201,204,205,208],{},"Schema ",[129,198,199],{},"taskq",", three packaged migrations, capability roles, and ",[129,202,203],{},"taskq migrate"," \u002F ",[129,206,207],{},"taskq verify",".",[191,210,213],{"icon":211,"title":212},"i-lucide-braces","Typed client",[121,214,215,218,219,218,222,225,226,204,229,232],{},[129,216,217],{},"Task"," + ",[129,220,221],{},"TaskRegistry",[129,223,224],{},"TaskQ.enqueue"," with ",[129,227,228],{},"created",[129,230,231],{},"existed"," results — never silent null.",[191,234,236],{"icon":77,"title":235},"Worker + CLI",[121,237,238,239,208],{},"Fenced claims, heartbeats, settle mapping, soft stop, and ",[129,240,241],{},"taskq worker",[191,243,245],{"icon":82,"title":244},"Optional HTTP",[121,246,247,248,251,252,254],{},"Mount ",[129,249,250],{},"create_taskq_app"," for credential-free workers. Auth is injected; ",[129,253,144],{}," is optional.",[147,256,258],{"id":257},"status","Status",[121,260,261,267],{},[124,262,263,264,266],{},"Pre-alpha (",[129,265,185],{},")."," Stages 1–3 are independently accepted and ship in the package: SQL kernel, typed client\u002Fworker\u002FCLI, consumer testing helpers, Protocol-v1 HTTP clients and facade, authorization boundary, and optional OutLabs authorizer\u002Fprovisioning.",[121,269,270],{},"Stage 4 (first-host dogfood on outlabsAPI) is open — usable for local and staging adoption, with the production canary still gated.",[147,272,274],{"id":273},"related-outlabs-infrastructure","Related OutLabs infrastructure",[276,277,278,291],"table",{},[279,280,281],"thead",{},[282,283,284,288],"tr",{},[285,286,287],"th",{},"Package",[285,289,290],{},"Role",[292,293,294,307],"tbody",{},[282,295,296,304],{},[297,298,299],"td",{},[137,300,302],{"href":139,"rel":301},[141],[129,303,144],{},[297,305,306],{},"Identity \u002F RBAC \u002F API keys for FastAPI",[282,308,309,317],{},[297,310,311],{},[137,312,315],{"href":313,"rel":314},"https:\u002F\u002Fgithub.com\u002Foutlabsio\u002Foutlabs-taskq",[141],[129,316,131],{},[297,318,319],{},"Job queue \u002F worker coordination on Postgres",{"title":321,"searchDepth":322,"depth":323,"links":324},"",1,2,[325,326,328,329],{"id":149,"depth":323,"text":150},{"id":181,"depth":323,"text":327},"What you get today (0.1.0a2)",{"id":257,"depth":323,"text":258},{"id":273,"depth":323,"text":274},"What OutlabsTaskq is, and what problems it is built to solve.","md",null,{},{"icon":14},{"title":11,"description":330},"pBD2D54pOs3seuIJ1kDqkZez5ZfWsRmJlcpiUr58cPs",[332,338],{"title":16,"path":17,"stem":18,"description":339,"icon":19,"children":-1},"Install the package and choose the right extras.",1784549299452]