[{"data":1,"prerenderedAt":1016},["ShallowReactive",2],{"navigation_docs_en":3,"-en-cli-worker-generators":342,"-en-cli-worker-generators-surround":1011},[4,45,61,96,132,166,196,217,241,265],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F10.reference",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F10.reference\u002F1.configuration","i-lucide-settings",{"title":57,"path":58,"stem":59,"icon":60},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F10.reference\u002F2.dependencies","i-lucide-package",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[67,72,77,82,86,91],{"title":68,"path":69,"stem":70,"icon":71},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture","i-lucide-layers",{"title":73,"path":74,"stem":75,"icon":76},"Application lifecycle","\u002Fen\u002Fconcepts\u002Fapplication-lifecycle","en\u002F2.concepts\u002F2.application-lifecycle","i-lucide-power",{"title":78,"path":79,"stem":80,"icon":81},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F3.error-model","i-lucide-shield-alert",{"title":52,"path":83,"stem":84,"icon":85},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F4.configuration","i-lucide-settings-2",{"title":87,"path":88,"stem":89,"icon":90},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F5.codegen-pipeline","i-lucide-file-json",{"title":92,"path":93,"stem":94,"icon":95},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F6.design-patterns","i-lucide-puzzle",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":44},"HTTP & Routing","i-lucide-globe","\u002Fen\u002Fhttp","en\u002F3.http",[102,107,112,117,122,127],{"title":103,"path":104,"stem":105,"icon":106},"The server core","\u002Fen\u002Fhttp\u002Fserver","en\u002F3.http\u002F1.server","i-lucide-server",{"title":108,"path":109,"stem":110,"icon":111},"The Fiber engine","\u002Fen\u002Fhttp\u002Ffiber","en\u002F3.http\u002F2.fiber","i-lucide-zap",{"title":113,"path":114,"stem":115,"icon":116},"The chi engine","\u002Fen\u002Fhttp\u002Fchi","en\u002F3.http\u002F3.chi","i-lucide-route",{"title":118,"path":119,"stem":120,"icon":121},"Error responses","\u002Fen\u002Fhttp\u002Ferror-responses","en\u002F3.http\u002F4.error-responses","i-lucide-octagon-alert",{"title":123,"path":124,"stem":125,"icon":126},"Validation","\u002Fen\u002Fhttp\u002Fvalidation","en\u002F3.http\u002F5.validation","i-lucide-badge-check",{"title":128,"path":129,"stem":130,"icon":131},"Pagination","\u002Fen\u002Fhttp\u002Fpagination","en\u002F3.http\u002F6.pagination","i-lucide-list-ordered",{"title":133,"icon":134,"path":135,"stem":136,"children":137,"page":44},"Database","i-lucide-database","\u002Fen\u002Fdatabase","en\u002F4.database",[138,142,147,151,156,161],{"title":139,"path":140,"stem":141,"icon":134},"Overview","\u002Fen\u002Fdatabase\u002Foverview","en\u002F4.database\u002F1.overview",{"title":143,"path":144,"stem":145,"icon":146},"pgx","\u002Fen\u002Fdatabase\u002Fpgx","en\u002F4.database\u002F2.pgx","i-lucide-plug",{"title":148,"path":149,"stem":150,"icon":71},"bun","\u002Fen\u002Fdatabase\u002Fbun","en\u002F4.database\u002F3.bun",{"title":152,"path":153,"stem":154,"icon":155},"Transactions","\u002Fen\u002Fdatabase\u002Ftransactions","en\u002F4.database\u002F4.transactions","i-lucide-git-merge",{"title":157,"path":158,"stem":159,"icon":160},"Migrations","\u002Fen\u002Fdatabase\u002Fmigrations","en\u002F4.database\u002F5.migrations","i-lucide-file-stack",{"title":162,"path":163,"stem":164,"icon":165},"Seeders","\u002Fen\u002Fdatabase\u002Fseeding","en\u002F4.database\u002F6.seeding","i-lucide-sprout",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":44},"Async & Background","i-lucide-workflow","\u002Fen\u002Fasync","en\u002F5.async",[172,176,181,186,191],{"title":173,"path":174,"stem":175,"icon":131},"Queue","\u002Fen\u002Fasync\u002Fqueue","en\u002F5.async\u002F1.queue",{"title":177,"path":178,"stem":179,"icon":180},"Events","\u002Fen\u002Fasync\u002Fevents","en\u002F5.async\u002F2.events","i-lucide-radio",{"title":182,"path":183,"stem":184,"icon":185},"Outbox","\u002Fen\u002Fasync\u002Foutbox","en\u002F5.async\u002F3.outbox","i-lucide-inbox",{"title":187,"path":188,"stem":189,"icon":190},"Scheduling","\u002Fen\u002Fasync\u002Fscheduler","en\u002F5.async\u002F4.scheduler","i-lucide-calendar-clock",{"title":192,"path":193,"stem":194,"icon":195},"Worker","\u002Fen\u002Fasync\u002Fworker","en\u002F5.async\u002F5.worker","i-lucide-cog",{"title":197,"icon":198,"path":199,"stem":200,"children":201,"page":44},"Security","i-lucide-shield-check","\u002Fen\u002Fsecurity","en\u002F6.security",[202,207,212],{"title":203,"path":204,"stem":205,"icon":206},"Authentication","\u002Fen\u002Fsecurity\u002Fauthentication","en\u002F6.security\u002F1.authentication","i-lucide-key-round",{"title":208,"path":209,"stem":210,"icon":211},"RBAC","\u002Fen\u002Fsecurity\u002Frbac","en\u002F6.security\u002F2.rbac","i-lucide-users",{"title":213,"path":214,"stem":215,"icon":216},"Policies","\u002Fen\u002Fsecurity\u002Fpolicies","en\u002F6.security\u002F3.policies","i-lucide-gavel",{"title":218,"icon":219,"path":220,"stem":221,"children":222,"page":44},"Observability","i-lucide-activity","\u002Fen\u002Fobservability","en\u002F7.observability",[223,226,231,236],{"title":139,"path":224,"stem":225,"icon":219},"\u002Fen\u002Fobservability\u002Foverview","en\u002F7.observability\u002F1.overview",{"title":227,"path":228,"stem":229,"icon":230},"Logging","\u002Fen\u002Fobservability\u002Flogging","en\u002F7.observability\u002F2.logging","i-lucide-scroll-text",{"title":232,"path":233,"stem":234,"icon":235},"OpenTelemetry","\u002Fen\u002Fobservability\u002Fopentelemetry","en\u002F7.observability\u002F3.opentelemetry","i-lucide-radar",{"title":237,"path":238,"stem":239,"icon":240},"Sentry","\u002Fen\u002Fobservability\u002Fsentry","en\u002F7.observability\u002F4.sentry","i-lucide-bug",{"title":242,"icon":243,"path":244,"stem":245,"children":246,"page":44},"Storage & Mail","i-lucide-hard-drive","\u002Fen\u002Fstorage-mail","en\u002F8.storage-mail",[247,251,256,261],{"title":248,"path":249,"stem":250,"icon":243},"Storage","\u002Fen\u002Fstorage-mail\u002Fstorage","en\u002F8.storage-mail\u002F1.storage",{"title":252,"path":253,"stem":254,"icon":255},"Email","\u002Fen\u002Fstorage-mail\u002Fmail","en\u002F8.storage-mail\u002F2.mail","i-lucide-mail",{"title":257,"path":258,"stem":259,"icon":260},"Notifications","\u002Fen\u002Fstorage-mail\u002Fnotifications","en\u002F8.storage-mail\u002F3.notifications","i-lucide-bell",{"title":262,"path":263,"stem":264,"icon":180},"Realtime","\u002Fen\u002Fstorage-mail\u002Frealtime","en\u002F8.storage-mail\u002F4.realtime",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F9.cli",[271,274,279,284,289,294,299,303,308,313,318,323,328,333,337],{"title":139,"path":272,"stem":273,"icon":267},"\u002Fen\u002Fcli\u002Foverview","en\u002F9.cli\u002F1.overview",{"title":275,"path":276,"stem":277,"icon":278},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F9.cli\u002F10.add-db","i-lucide-database-zap",{"title":280,"path":281,"stem":282,"icon":283},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F9.cli\u002F11.add-compose","i-lucide-container",{"title":285,"path":286,"stem":287,"icon":288},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F9.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":290,"path":291,"stem":292,"icon":293},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F9.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":295,"path":296,"stem":297,"icon":298},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F9.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":300,"path":301,"stem":302,"icon":165},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F9.cli\u002F15.add-seeder",{"title":304,"path":305,"stem":306,"icon":307},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F9.cli\u002F2.new-project","i-lucide-folder-plus",{"title":309,"path":310,"stem":311,"icon":312},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F9.cli\u002F3.new-module","i-lucide-blocks",{"title":314,"path":315,"stem":316,"icon":317},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F9.cli\u002F4.add-surface","i-lucide-layers-2",{"title":319,"path":320,"stem":321,"icon":322},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F9.cli\u002F5.add-core","i-lucide-box",{"title":324,"path":325,"stem":326,"icon":327},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F9.cli\u002F6.add-handler","i-lucide-webhook",{"title":329,"path":330,"stem":331,"icon":332},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F9.cli\u002F7.new-migration","i-lucide-file-plus",{"title":334,"path":335,"stem":336,"icon":195},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F9.cli\u002F8.worker-generators",{"title":338,"path":339,"stem":340,"icon":341},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F9.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"id":343,"title":334,"body":344,"description":1004,"extension":1005,"links":1006,"meta":1007,"navigation":1008,"path":335,"seo":1009,"stem":336,"__hash__":1010},"docs_en\u002Fen\u002F9.cli\u002F8.worker-generators.md",{"type":345,"value":346,"toc":997},"minimark",[347,373,378,433,469,492,502,506,566,589,623,680,686,690,736,753,784,787,805,833,837,940,960,973,993],[348,349,350,351,355,356,359,360,363,364,368,369,372],"p",{},"Four generators scaffold the ",[352,353,354],"a",{"href":193},"worker"," side: ",[352,357,358],{"href":178},"events",", listeners and ",[352,361,362],{"href":188},"scheduled jobs",". New projects already include the ",[365,366,367],"code",{},"cmd\u002Fworker"," binary; ",[365,370,371],{},"add worker"," retrofits it into older ones.",[374,375,377],"h2",{"id":376},"add-event","add event",[379,380,385],"pre",{"className":381,"code":382,"language":383,"meta":384,"style":384},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem add event \u003Cmodule> \u003Cname>\n","sh","",[365,386,387],{"__ignoreMap":384},[388,389,392,396,400,403,406,409,413,416,420,423,425,428,430],"span",{"class":390,"line":391},"line",1,[388,393,395],{"class":394},"sBMFI","go",[388,397,399],{"class":398},"sfazB"," tool",[388,401,402],{"class":398}," gpsystem",[388,404,405],{"class":398}," add",[388,407,408],{"class":398}," event",[388,410,412],{"class":411},"sMK4o"," \u003C",[388,414,415],{"class":398},"modul",[388,417,419],{"class":418},"sTEyZ","e",[388,421,422],{"class":411},">",[388,424,412],{"class":411},[388,426,427],{"class":398},"nam",[388,429,419],{"class":418},[388,431,432],{"class":411},">\n",[348,434,435,436,439,440,443,444,448,449,452,453,456,457,460,461,464,465,468],{},"Creates ",[365,437,438],{},"internal\u002Fmodules\u002F\u003Cmodule>\u002Fevents\u002F\u003Cname>.go"," (an event struct + ",[365,441,442],{},"EventName()",") and, on the module's ",[445,446,447],"strong",{},"first"," event, wires an outbox ",[365,450,451],{},"events.Dispatcher"," into its ",[365,454,455],{},"Dependencies"," and constructs it in both ",[365,458,459],{},"cmd\u002F\u003Cmodule>\u002Fmain.go"," and ",[365,462,463],{},"cmd\u002Fworker\u002Fmain.go",". Idempotent: a second event reuses the dispatcher. Records the event in ",[365,466,467],{},"gpsystem.yaml",".",[379,470,472],{"className":381,"code":471,"language":383,"meta":384,"style":384},"go tool gpsystem add event orders orderPlaced\n",[365,473,474],{"__ignoreMap":384},[388,475,476,478,480,482,484,486,489],{"class":390,"line":391},[388,477,395],{"class":394},[388,479,399],{"class":398},[388,481,402],{"class":398},[388,483,405],{"class":398},[388,485,408],{"class":398},[388,487,488],{"class":398}," orders",[388,490,491],{"class":398}," orderPlaced\n",[348,493,494,495,498,499,501],{},"Then add fields to the generated struct and dispatch it from a service inside ",[365,496,497],{},"Transactor.WithinTransaction"," (see ",[352,500,358],{"href":178},").",[374,503,505],{"id":504},"add-listener","add listener",[379,507,509],{"className":381,"code":508,"language":383,"meta":384,"style":384},"go tool gpsystem add listener \u003Cmodule> \u003Cevent> \u003Cname> [--queue \u003Cqueue>]\n",[365,510,511],{"__ignoreMap":384},[388,512,513,515,517,519,521,524,526,528,530,532,534,537,540,542,544,546,548,550,553,556,559,561,563],{"class":390,"line":391},[388,514,395],{"class":394},[388,516,399],{"class":398},[388,518,402],{"class":398},[388,520,405],{"class":398},[388,522,523],{"class":398}," listener",[388,525,412],{"class":411},[388,527,415],{"class":398},[388,529,419],{"class":418},[388,531,422],{"class":411},[388,533,412],{"class":411},[388,535,536],{"class":398},"even",[388,538,539],{"class":418},"t",[388,541,422],{"class":411},[388,543,412],{"class":411},[388,545,427],{"class":398},[388,547,419],{"class":418},[388,549,422],{"class":411},[388,551,552],{"class":418}," [--queue ",[388,554,555],{"class":411},"\u003C",[388,557,558],{"class":398},"queu",[388,560,419],{"class":418},[388,562,422],{"class":411},[388,564,565],{"class":398},"]\n",[348,567,568,569,572,573,576,577,580,581,584,585,588],{},"Creates a listener stub in ",[365,570,571],{},"\u003Cmodule>"," and registers it in ",[365,574,575],{},"listeners\u002Fregister.go",". ",[365,578,579],{},"\u003Cevent>"," is ",[365,582,583],{},"name"," for an event the module owns, or ",[365,586,587],{},"producer.name"," to subscribe to another module's event.",[590,591,592,605],"table",{},[593,594,595],"thead",{},[596,597,598,602],"tr",{},[599,600,601],"th",{},"Flag",[599,603,604],{},"Meaning",[606,607,608],"tbody",{},[596,609,610,616],{},[611,612,613],"td",{},[365,614,615],{},"--queue",[611,617,618,619,622],{},"asynq queue the listener runs on (default: the ",[365,620,621],{},"default"," queue)",[379,624,626],{"className":381,"code":625,"language":383,"meta":384,"style":384},"go tool gpsystem add listener orders orderPlaced sendConfirmationEmail --queue emails\ngo tool gpsystem add listener shipping orders.orderPlaced reserveStock   # cross-module\n",[365,627,628,654],{"__ignoreMap":384},[388,629,630,632,634,636,638,640,642,645,648,651],{"class":390,"line":391},[388,631,395],{"class":394},[388,633,399],{"class":398},[388,635,402],{"class":398},[388,637,405],{"class":398},[388,639,523],{"class":398},[388,641,488],{"class":398},[388,643,644],{"class":398}," orderPlaced",[388,646,647],{"class":398}," sendConfirmationEmail",[388,649,650],{"class":398}," --queue",[388,652,653],{"class":398}," emails\n",[388,655,657,659,661,663,665,667,670,673,676],{"class":390,"line":656},2,[388,658,395],{"class":394},[388,660,399],{"class":398},[388,662,402],{"class":398},[388,664,405],{"class":398},[388,666,523],{"class":398},[388,668,669],{"class":398}," shipping",[388,671,672],{"class":398}," orders.orderPlaced",[388,674,675],{"class":398}," reserveStock",[388,677,679],{"class":678},"sHwdD","   # cross-module\n",[348,681,682,683,685],{},"The event must already exist (",[365,684,377],{}," first). Each listener is an independent, retried task: implement the body idempotently.",[374,687,689],{"id":688},"add-job","add job",[379,691,693],{"className":381,"code":692,"language":383,"meta":384,"style":384},"go tool gpsystem add job \u003Cmodule> \u003Cname> --cron \"0 3 * * *\"\n",[365,694,695],{"__ignoreMap":384},[388,696,697,699,701,703,705,708,710,712,714,716,718,720,722,724,727,730,733],{"class":390,"line":391},[388,698,395],{"class":394},[388,700,399],{"class":398},[388,702,402],{"class":398},[388,704,405],{"class":398},[388,706,707],{"class":398}," job",[388,709,412],{"class":411},[388,711,415],{"class":398},[388,713,419],{"class":418},[388,715,422],{"class":411},[388,717,412],{"class":411},[388,719,427],{"class":398},[388,721,419],{"class":418},[388,723,422],{"class":411},[388,725,726],{"class":398}," --cron",[388,728,729],{"class":411}," \"",[388,731,732],{"class":398},"0 3 * * *",[388,734,735],{"class":411},"\"\n",[348,737,738,739,576,742,745,746,749,750,501],{},"Creates a job handler stub and schedules it in ",[365,740,741],{},"jobs\u002Fregister.go",[365,743,744],{},"--cron"," accepts 5-field cron specs and asynq descriptors (",[365,747,748],{},"@every 30m",", ",[365,751,752],{},"@daily",[379,754,756],{"className":381,"code":755,"language":383,"meta":384,"style":384},"go tool gpsystem add job orders expireStaleCarts --cron \"0 * * * *\"\n",[365,757,758],{"__ignoreMap":384},[388,759,760,762,764,766,768,770,772,775,777,779,782],{"class":390,"line":391},[388,761,395],{"class":394},[388,763,399],{"class":398},[388,765,402],{"class":398},[388,767,405],{"class":398},[388,769,707],{"class":398},[388,771,488],{"class":398},[388,773,774],{"class":398}," expireStaleCarts",[388,776,726],{"class":398},[388,778,729],{"class":411},[388,780,781],{"class":398},"0 * * * *",[388,783,735],{"class":411},[374,785,371],{"id":786},"add-worker",[379,788,790],{"className":381,"code":789,"language":383,"meta":384,"style":384},"go tool gpsystem add worker\n",[365,791,792],{"__ignoreMap":384},[388,793,794,796,798,800,802],{"class":390,"line":391},[388,795,395],{"class":394},[388,797,399],{"class":398},[388,799,402],{"class":398},[388,801,405],{"class":398},[388,803,804],{"class":398}," worker\n",[348,806,807,808,811,812,814,815,460,818,821,822,824,825,828,829,832],{},"Retrofits the whole worker layer into a project generated ",[445,809,810],{},"before"," the worker feature: the ",[365,813,367],{}," binary, each module's ",[365,816,817],{},"listeners\u002F",[365,819,820],{},"jobs\u002F"," subpackages, the outbox migration, and the Redis\u002Fworker config. New projects and ",[365,823,309],{}," already include it, so you only need this once on an older project. For a ",[365,826,827],{},"compose.yml"," \u002F ",[365,830,831],{},".env.example"," that lack the anchors, it prints the block to paste rather than failing (those files are not compiled).",[374,834,836],{"id":835},"what-gets-wired","What gets wired",[590,838,839,856],{},[593,840,841],{},[596,842,843,846,849],{},[599,844,845],{},"Generator",[599,847,848],{},"Creates",[599,850,851,852,855],{},"Wires (at ",[365,853,854],{},"\u002F\u002F gpsystem:*"," anchors)",[606,857,858,884,903,921],{},[596,859,860,864,869],{},[611,861,862],{},[365,863,377],{},[611,865,866],{},[365,867,868],{},"events\u002F\u003Cname>.go",[611,870,871,874,875,878,879,460,882],{},[365,872,873],{},"Dispatcher"," field in ",[365,876,877],{},"register.go","; its construction in ",[365,880,881],{},"cmd\u002F\u003Cmodule>",[365,883,367],{},[596,885,886,890,895],{},[611,887,888],{},[365,889,505],{},[611,891,892],{},[365,893,894],{},"listeners\u002F\u003Cname>.go",[611,896,897,900,901],{},[365,898,899],{},"events.Listen(...)"," in ",[365,902,575],{},[596,904,905,909,914],{},[611,906,907],{},[365,908,689],{},[611,910,911],{},[365,912,913],{},"jobs\u002F\u003Cname>.go",[611,915,916,900,919],{},[365,917,918],{},"sched.Job(...)",[365,920,741],{},[596,922,923,927,937],{},[611,924,925],{},[365,926,371],{},[611,928,929,749,931,933,934,936],{},[365,930,367],{},[365,932,817],{},"\u002F",[365,935,820],{}," subpackage per module, outbox migration",[611,938,939],{},"worker\u002Fredis config; each module into the worker main",[348,941,942,943,460,945,947,948,828,951,954,955,828,957,959],{},"On a project generated before the worker subpackages existed, ",[365,944,505],{},[365,946,689],{}," stop with guidance: move the old ",[365,949,950],{},"listeners.go",[365,952,953],{},"jobs.go"," from the module root to ",[365,956,575],{},[365,958,741],{}," first.",[961,962,963,965,966,969,970,972],"note",{},[365,964,338],{}," re-syncs only the copied oapi-codegen templates; it does ",[445,967,968],{},"not"," touch the worker scaffold. Use ",[365,971,371],{}," to introduce the worker layer into an existing project.",[961,974,975,976,980,981,984,985,988,989,468],{},"There is a fifth module-level generator, documented separately because it wires a shared kit resource rather than the worker: ",[352,977,978],{"href":286},[365,979,285],{}," scaffolds a mail notifier (",[365,982,983],{},"internal\u002Fmodules\u002F\u003Cmodule>\u002Fmail\u002F",") and, on a project's first notifier, wires ",[365,986,987],{},"mail.Mailer"," into every entry point. A mail notifier is typically called from a listener generated here; see the ",[352,990,992],{"href":991},"\u002Fen\u002Fstorage-mail\u002Fmail#worked-example-the-contact-email-flow","contact-email worked example",[994,995,996],"style",{},"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 .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 .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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":384,"searchDepth":656,"depth":656,"links":998},[999,1000,1001,1002,1003],{"id":376,"depth":656,"text":377},{"id":504,"depth":656,"text":505},{"id":688,"depth":656,"text":689},{"id":786,"depth":656,"text":371},{"id":835,"depth":656,"text":836},"add event, add listener, add job and add worker: scaffold background work for the cmd\u002Fworker binary.","md",null,{},{"icon":195},{"title":334,"description":1004},"1OVopNfdZt8kpmSixGJ4PczTanPl5b-mzbTwm-Gj4QY",[1012,1014],{"title":329,"path":330,"stem":331,"description":1013,"icon":332,"children":-1},"Create a new, timestamp-prefixed SQL migration in the project's migrations\u002F directory.",{"title":338,"path":339,"stem":340,"description":1015,"icon":341,"children":-1},"Re-sync the project's codegen templates from the CLI's embedded set.",1784668714219]