[{"data":1,"prerenderedAt":982},["ShallowReactive",2],{"docs-page-\u002Fdocs\u002Fsetup":3,"docs-surround-\u002Fdocs\u002Fsetup":961,"docs-navigation":967},{"id":4,"title":5,"body":6,"description":952,"extension":953,"meta":954,"navigation":955,"path":957,"seo":958,"stem":959,"__hash__":960},"docs\u002Fdocs\u002F1.setup.md","Guía de setup",{"type":7,"value":8,"toc":940},"minimark",[9,27,39,44,126,130,151,155,162,257,271,276,398,402,665,692,730,743,747,783,787,798,804,810,853,864,868,903,907,936],[10,11,12,13,17,18,22,23,26],"p",{},"Esta guía te deja el template corriendo en local, con la base de datos migrada y una cuenta con la que entrar. Todo se ejecuta con ",[14,15,16],"strong",{},"pnpm",", que es el gestor fijado en ",[19,20,21],"code",{},"packageManager"," dentro de ",[19,24,25],{},"package.json",".",[28,29,30],"tip",{},[10,31,32,35,36,26],{},[19,33,34],{},"pnpm install"," instala también los hooks de git: en cada commit corre ESLint sobre lo que esté en stage (segundos) y en cada push la suite completa de Playwright. Para saltar la suite de forma deliberada existe ",[19,37,38],{},"SKIP_E2E=1 git push",[40,41,43],"h2",{"id":42},"requisitos","Requisitos",[45,46,47,63],"table",{},[48,49,50],"thead",{},[51,52,53,57,60],"tr",{},[54,55,56],"th",{},"Herramienta",[54,58,59],{},"Versión",[54,61,62],{},"Para qué",[64,65,66,88,105],"tbody",{},[51,67,68,74,79],{},[69,70,71],"td",{},[14,72,73],{},"Node.js",[69,75,76],{},[19,77,78],{},">= 22.12",[69,80,81,82,84,85],{},"El runtime fijado en ",[19,83,25],{}," → ",[19,86,87],{},"engines",[51,89,90,94,99],{},[69,91,92],{},[14,93,16],{},[69,95,96],{},[19,97,98],{},"10.x",[69,100,101,102],{},"Gestor de paquetes; actívalo con ",[19,103,104],{},"corepack enable",[51,106,107,112,115],{},[69,108,109],{},[14,110,111],{},"PostgreSQL",[69,113,114],{},"15 o superior",[69,116,117,118,125],{},"Base de datos. Sirve una gratuita de ",[119,120,124],"a",{"href":121,"rel":122},"https:\u002F\u002Fneon.tech",[123],"nofollow","Neon"," o una local",[40,127,129],{"id":128},"_1-instala-las-dependencias","1. Instala las dependencias",[131,132,137],"pre",{"className":133,"code":134,"language":135,"meta":136,"style":136},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm install\n","bash","",[19,138,139],{"__ignoreMap":136},[140,141,144,147],"span",{"class":142,"line":143},"line",1,[140,145,16],{"class":146},"sBMFI",[140,148,150],{"class":149},"sfazB"," install\n",[40,152,154],{"id":153},"_2-configura-el-entorno","2. Configura el entorno",[10,156,157,158,161],{},"Crea un ",[19,159,160],{},".env"," en la raíz del proyecto. Estas son las variables que necesitas para arrancar:",[131,163,167],{"className":164,"code":165,"language":166,"meta":136,"style":136},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Base de datos PostgreSQL (usa la connection string completa)\nNUXT_DATABASE_URL=\"postgresql:\u002F\u002Fusuario:password@host:5432\u002Fbase?sslmode=require\"\n\n# Better Auth: cadena larga y aleatoria, distinta en cada entorno\nBETTER_AUTH_SECRET=\"pega-aqui-un-secreto-largo\"\n\n# URL pública de la app (Better Auth la usa como baseURL)\nNUXT_APP_URL=\"http:\u002F\u002Flocalhost:3000\"\n\n# Email del administrador de la instancia: con la tabla `user` vacía, `\u002Fsetup`\n# solo acepta esta dirección para crear la primera cuenta (paso 4).\nNUXT_ADMIN_EMAIL=\"admin@example.com\"\n# Opcional: solo la usa la tarea no interactiva `db:seed_admin`. La contraseña\n# normal se elige en `\u002Fsetup`, no en el entorno.\nNUXT_ADMIN_PASSWORD=\"una-password-larga\"\n","ini",[19,168,169,174,180,187,193,199,204,210,216,221,227,233,239,245,251],{"__ignoreMap":136},[140,170,171],{"class":142,"line":143},[140,172,173],{},"# Base de datos PostgreSQL (usa la connection string completa)\n",[140,175,177],{"class":142,"line":176},2,[140,178,179],{},"NUXT_DATABASE_URL=\"postgresql:\u002F\u002Fusuario:password@host:5432\u002Fbase?sslmode=require\"\n",[140,181,183],{"class":142,"line":182},3,[140,184,186],{"emptyLinePlaceholder":185},true,"\n",[140,188,190],{"class":142,"line":189},4,[140,191,192],{},"# Better Auth: cadena larga y aleatoria, distinta en cada entorno\n",[140,194,196],{"class":142,"line":195},5,[140,197,198],{},"BETTER_AUTH_SECRET=\"pega-aqui-un-secreto-largo\"\n",[140,200,202],{"class":142,"line":201},6,[140,203,186],{"emptyLinePlaceholder":185},[140,205,207],{"class":142,"line":206},7,[140,208,209],{},"# URL pública de la app (Better Auth la usa como baseURL)\n",[140,211,213],{"class":142,"line":212},8,[140,214,215],{},"NUXT_APP_URL=\"http:\u002F\u002Flocalhost:3000\"\n",[140,217,219],{"class":142,"line":218},9,[140,220,186],{"emptyLinePlaceholder":185},[140,222,224],{"class":142,"line":223},10,[140,225,226],{},"# Email del administrador de la instancia: con la tabla `user` vacía, `\u002Fsetup`\n",[140,228,230],{"class":142,"line":229},11,[140,231,232],{},"# solo acepta esta dirección para crear la primera cuenta (paso 4).\n",[140,234,236],{"class":142,"line":235},12,[140,237,238],{},"NUXT_ADMIN_EMAIL=\"admin@example.com\"\n",[140,240,242],{"class":142,"line":241},13,[140,243,244],{},"# Opcional: solo la usa la tarea no interactiva `db:seed_admin`. La contraseña\n",[140,246,248],{"class":142,"line":247},14,[140,249,250],{},"# normal se elige en `\u002Fsetup`, no en el entorno.\n",[140,252,254],{"class":142,"line":253},15,[140,255,256],{},"NUXT_ADMIN_PASSWORD=\"una-password-larga\"\n",[10,258,259,260,263,264,266,267,270],{},"El archivo ",[19,261,262],{},".env.example"," de la raíz es la plantilla comentada: cópialo a ",[19,265,160],{}," y completa los valores. ",[19,268,269],{},"server\u002Futils\u002FruntimeConfig.ts"," es la fuente de verdad de los nombres.",[272,273,275],"h3",{"id":274},"obligatorias","Obligatorias",[45,277,278,290],{},[48,279,280],{},[51,281,282,285,287],{},[54,283,284],{},"Variable",[54,286,62],{},[54,288,289],{},"Dónde se lee",[64,291,292,314,341,361,380],{},[51,293,294,299,302],{},[69,295,296],{},[19,297,298],{},"NUXT_DATABASE_URL",[69,300,301],{},"Connection string de PostgreSQL",[69,303,304,307,308,307,311],{},[19,305,306],{},"server\u002Futils\u002Fdb.ts",", ",[19,309,310],{},"server\u002Futils\u002Fpgboss.ts",[19,312,313],{},"server\u002Fdatabase\u002Fdrizzle.config.ts",[51,315,316,321,324],{},[69,317,318],{},[19,319,320],{},"BETTER_AUTH_SECRET",[69,322,323],{},"Firma de sesiones, magic links y tokens",[69,325,326,327,84,330,333,334,307,337,340],{},"Better Auth la toma del entorno (fallback del SDK); alternativa ",[19,328,329],{},"NUXT_BETTER_AUTH_SECRET",[19,331,332],{},"runtimeConfig.betterAuthSecret"," (",[19,335,336],{},"server\u002Futils\u002Fauth.ts",[19,338,339],{},"secret",")",[51,342,343,348,351],{},[69,344,345],{},[19,346,347],{},"NUXT_APP_URL",[69,349,350],{},"Origen público: baseURL y trustedOrigins de Better Auth, enlaces de invitación y exportaciones, baseUrl de i18n",[69,352,353,307,356,307,358],{},[19,354,355],{},"nuxt.config.ts",[19,357,336],{},[19,359,360],{},"server\u002Futils\u002Finvitations.ts",[51,362,363,368,375],{},[69,364,365],{},[19,366,367],{},"NUXT_ADMIN_EMAIL",[69,369,370,371,374],{},"Email del administrador: es la única dirección que ",[19,372,373],{},"\u002Fsetup"," acepta para crear la primera cuenta",[69,376,377],{},[19,378,379],{},"server\u002Fapi\u002Fsetup\u002F*",[51,381,382,387,393],{},[69,383,384],{},[19,385,386],{},"NUXT_ADMIN_PASSWORD",[69,388,389,390],{},"Opcional — solo la tarea no interactiva ",[19,391,392],{},"db:seed_admin",[69,394,395],{},[19,396,397],{},"server\u002Ftasks\u002Fdb\u002Fseed_admin.ts",[272,399,401],{"id":400},"opcionales","Opcionales",[45,403,404,415],{},[48,405,406],{},[51,407,408,410,413],{},[54,409,284],{},[54,411,412],{},"Para qué y sin ella",[54,414,289],{},[64,416,417,435,459,477,494,511,529,567,587,618,635,650],{},[51,418,419,424,431],{},[69,420,421],{},[19,422,423],{},"NUXT_NITRO_PRESET",[69,425,426,427,430],{},"Preset de Nitro; con ",[19,428,429],{},"node-server"," (el del repo) el pool de Drizzle se cachea por proceso",[69,432,433],{},[19,434,306],{},[51,436,437,452,455],{},[69,438,439,442,443,442,446,442,449],{},[19,440,441],{},"NUXT_DB_POOL_MAX"," · ",[19,444,445],{},"_IDLE_TIMEOUT",[19,447,448],{},"_CONNECT_TIMEOUT",[19,450,451],{},"_MAX_LIFETIME",[69,453,454],{},"Ajuste del pool de postgres-js (segundos); sin ellas, 10 conexiones y timeouts 20\u002F10\u002F1800 s",[69,456,457],{},[19,458,306],{},[51,460,461,466,469],{},[69,462,463],{},[19,464,465],{},"NUXT_REDIS_URL",[69,467,468],{},"Redis como almacenamiento secundario de Better Auth; sin ella (o si Redis cae) todo va contra la base de datos",[69,470,471,307,474],{},[19,472,473],{},"server\u002Futils\u002Fsecondary-storage.ts",[19,475,476],{},"server\u002Fapi\u002Fadmin\u002Fsystem\u002Fhealth.get.ts",[51,478,479,484,487],{},[69,480,481],{},[19,482,483],{},"NUXT_RESEND_API_KEY",[69,485,486],{},"Correos transaccionales; sin clave se registran pero no se envían",[69,488,489,307,492],{},[19,490,491],{},"server\u002Futils\u002Fmails-templates.ts",[19,493,476],{},[51,495,496,501,504],{},[69,497,498],{},[19,499,500],{},"NUXT_APP_NAME",[69,502,503],{},"Nombre visible en correos y comunicaciones (el de la interfaz sale de i18n)",[69,505,506,307,508],{},[19,507,491],{},[19,509,510],{},"server\u002Femails\u002Fcommunication.ts",[51,512,513,518,525],{},[69,514,515],{},[19,516,517],{},"NUXT_APP_NOTIFY_EMAIL",[69,519,520,521,524],{},"Remitente ",[19,522,523],{},"From"," de los correos",[69,526,527],{},[19,528,491],{},[51,530,531,548,554],{},[69,532,533,442,536,442,539,442,542,442,545],{},[19,534,535],{},"NUXT_APP_S3_ENDPOINT",[19,537,538],{},"_REGION",[19,540,541],{},"_ACCESS_KEY",[19,543,544],{},"_SECRET_KEY",[19,546,547],{},"_BUCKET_NAME",[69,549,550,551,340],{},"Documentos, fotos y adjuntos; sin ellas las subidas quedan apagadas (región por defecto ",[19,552,553],{},"us-east-1",[69,555,556,307,559,307,562,307,565],{},[19,557,558],{},"server\u002Futils\u002Fcreate-s3-client.ts",[19,560,561],{},"server\u002Futils\u002Fget-presigned.ts",[19,563,564],{},"server\u002Fapi\u002Fupload\u002F*",[19,566,476],{},[51,568,569,574,577],{},[69,570,571],{},[19,572,573],{},"NUXT_APP_S3_BACKUP_BUCKET_NAME",[69,575,576],{},"Bucket dedicado a los backups de base de datos del dashboard admin; sin él los backups quedan apagados (requiere la sección S3 de arriba)",[69,578,579,307,582,307,585],{},[19,580,581],{},"server\u002Futils\u002Fdatabase-backup.ts",[19,583,584],{},"server\u002Fapi\u002Fadmin\u002Fbackups\u002F*",[19,586,476],{},[51,588,589,597,614],{},[69,590,591,442,594],{},[19,592,593],{},"NUXT_BACKUP_DATABASE_URL",[19,595,596],{},"NUXT_BACKUP_PG_DUMP_PATH",[69,598,599,600,603,604,606,607,610,611,613],{},"Backups: conexión directa para ",[19,601,602],{},"pg_dump"," (si la principal es pooled) y ruta del binario; sin ellas se usa ",[19,605,298],{}," quitándole ",[19,608,609],{},"-pooler"," y el ",[19,612,602],{}," del PATH",[69,615,616],{},[19,617,581],{},[51,619,620,628,631],{},[69,621,622,442,625],{},[19,623,624],{},"NUXT_APP_GOOGLE_CLIENT_ID",[19,626,627],{},"NUXT_APP_GOOGLE_CLIENT_SECRET",[69,629,630],{},"Login con Google; sin claves el proveedor solo emite un warning al arrancar",[69,632,633],{},[19,634,336],{},[51,636,637,642,645],{},[69,638,639],{},[19,640,641],{},"NUXT_GOOGLE_MAPS_SERVER_KEY",[69,643,644],{},"Geocodificación en el servidor (autocomplete, place details, timezone)",[69,646,647],{},[19,648,649],{},"server\u002Fapi\u002Fgoogle\u002F*.get.ts",[51,651,652,657,660],{},[69,653,654],{},[19,655,656],{},"NUXT_PUBLIC_GOOGLE_MAPS_CLIENT_KEY",[69,658,659],{},"Key pública del selector de ubicación (restringida por referrer)",[69,661,662],{},[19,663,664],{},"app\u002Fcomponents\u002Fplan\u002FLocationPicker.vue",[666,667,668],"note",{},[10,669,670,671,333,674,677,678,680,681,684,685,688,689,26],{},"Los ",[14,672,673],{},"backups de base de datos",[19,675,676],{},"\u002Fapp\u002Fadmin\u002Fdashboard",") necesitan además el binario ",[19,679,602],{}," (versión ≥ a la del servidor PostgreSQL) en la máquina que corre la app: en local ",[19,682,683],{},"brew install postgresql@17"," o ",[19,686,687],{},"apt install postgresql-client-17","; en el deploy lo instala el ",[19,690,691],{},"Dockerfile",[666,693,694],{},[10,695,696,699,700,703,704,707,708,710,711,307,714,307,717,307,720,333,723,726,727,26],{},[19,697,698],{},"runtimeConfig"," lee algunas variables que hoy ",[14,701,702],{},"no tienen consumidores",", así que no hacen falta para arrancar: ",[19,705,706],{},"BETTER_AUTH_URL"," (el baseURL sale de ",[19,709,347],{},"), ",[19,712,713],{},"NUXT_RESEND_WEBHOOK_SECRET",[19,715,716],{},"NUXT_ADMIN_USER_IDS",[19,718,719],{},"NUXT_APP_CONTACT_EMAIL",[19,721,722],{},"NODE_ENV",[19,724,725],{},"public.appEnv",") y ",[19,728,729],{},"NUXT_PUBLIC_SITE_URL",[731,732,733],"warning",{},[10,734,735,736,738,739,742],{},"El ",[19,737,320],{}," local, el de dev y el de producción deben ser ",[14,740,741],{},"distintos",". Ese secreto firma sesiones y enlaces mágicos: si se filtra, hay que rotarlo y todos los enlaces pendientes dejan de valer.",[40,744,746],{"id":745},"_3-migra-la-base-de-datos","3. Migra la base de datos",[131,748,750],{"className":133,"code":749,"language":135,"meta":136,"style":136},"pnpm db:migrate    # aplica las migraciones pendientes\npnpm db:generate   # genera una migración después de cambiar el schema\npnpm studio        # abre Drizzle Studio para inspeccionar datos\n",[19,751,752,763,773],{"__ignoreMap":136},[140,753,754,756,759],{"class":142,"line":143},[140,755,16],{"class":146},[140,757,758],{"class":149}," db:migrate",[140,760,762],{"class":761},"sHwdD","    # aplica las migraciones pendientes\n",[140,764,765,767,770],{"class":142,"line":176},[140,766,16],{"class":146},[140,768,769],{"class":149}," db:generate",[140,771,772],{"class":761},"   # genera una migración después de cambiar el schema\n",[140,774,775,777,780],{"class":142,"line":182},[140,776,16],{"class":146},[140,778,779],{"class":149}," studio",[140,781,782],{"class":761},"        # abre Drizzle Studio para inspeccionar datos\n",[40,784,786],{"id":785},"_4-crea-la-cuenta-admin","4. Crea la cuenta admin",[10,788,789,790,793,794,797],{},"El template no tiene registro público. La primera cuenta se crea desde la pantalla de\n",[14,791,792],{},"setup de primer arranque",": arranca el servidor y abre ",[19,795,796],{},"http:\u002F\u002Flocalhost:3000\u002Fsetup","\n(con la app en marcha, cualquier visita a una ruta privada te lleva ahí mientras no exista\nningún usuario).",[10,799,800,801,803],{},"La pantalla pide el email y la contraseña. El email tiene que coincidir con\n",[19,802,367],{}," — el servidor rechaza cualquier otro, así que funciona como el secreto\nde la instalación — y la contraseña la eliges tú en ese momento. La cuenta que se crea es\nplatform admin, queda verificada y se inicia sesión automáticamente.",[10,805,806,807,809],{},"La pantalla deja de existir en cuanto hay un usuario: ",[19,808,373],{}," redirige al login.",[811,812,813,828,847],"blockquote",{},[10,814,815,818,819,821,822,824,825,827],{},[14,816,817],{},"Alternativa no interactiva."," Para un deploy automatizado, ",[19,820,392],{}," crea la\ncuenta a partir de ",[19,823,367],{}," y ",[19,826,386],{}," del entorno. Con el\nservidor corriendo:",[131,829,831],{"className":133,"code":830,"language":135,"meta":136,"style":136},"curl -X POST http:\u002F\u002Flocalhost:3000\u002F_nitro\u002Ftasks\u002Fdb:seed_admin\n",[19,832,833],{"__ignoreMap":136},[140,834,835,838,841,844],{"class":142,"line":143},[140,836,837],{"class":146},"curl",[140,839,840],{"class":149}," -X",[140,842,843],{"class":149}," POST",[140,845,846],{"class":149}," http:\u002F\u002Flocalhost:3000\u002F_nitro\u002Ftasks\u002Fdb:seed_admin\n",[10,848,849,850,26],{},"La tarea es idempotente: si el usuario ya existe, no hace nada. La lista completa de\ntareas está en ",[19,851,852],{},"GET \u002F_nitro\u002Ftasks",[10,854,855,856,859,860,863],{},"Esa cuenta es también la que usa la suite de Playwright (",[19,857,858],{},"E2E_EMAIL"," \u002F ",[19,861,862],{},"E2E_PASSWORD",", con\nlas credenciales del seed como fallback).",[40,865,867],{"id":866},"_5-arranca","5. Arranca",[131,869,871],{"className":133,"code":870,"language":135,"meta":136,"style":136},"pnpm dev              # http:\u002F\u002Flocalhost:3000\npnpm test:e2e:smoke   # smoke de Playwright sobre las páginas principales\npnpm lint             # ESLint (es el único formatter del repo)\n",[19,872,873,883,893],{"__ignoreMap":136},[140,874,875,877,880],{"class":142,"line":143},[140,876,16],{"class":146},[140,878,879],{"class":149}," dev",[140,881,882],{"class":761},"              # http:\u002F\u002Flocalhost:3000\n",[140,884,885,887,890],{"class":142,"line":176},[140,886,16],{"class":146},[140,888,889],{"class":149}," test:e2e:smoke",[140,891,892],{"class":761},"   # smoke de Playwright sobre las páginas principales\n",[140,894,895,897,900],{"class":142,"line":182},[140,896,16],{"class":146},[140,898,899],{"class":149}," lint",[140,901,902],{"class":761},"             # ESLint (es el único formatter del repo)\n",[40,904,906],{"id":905},"siguientes-pasos","Siguientes pasos",[908,909,910,918,929],"ul",{},[911,912,913,917],"li",{},[119,914,916],{"href":915},"\u002Fdocs\u002Fbranching","Ramas y flujo de trabajo",": cómo crear una feature, un fix o un hotfix.",[911,919,920,924,925,928],{},[119,921,923],{"href":922},"\u002Fdocs\u002Fdesign-system","Design system",": los tokens, las clases ",[19,926,927],{},".ds-*"," y las reglas de UI.",[911,930,931,935],{},[119,932,934],{"href":933},"\u002Fdocs\u002Fdeploy","Deploy y CI\u002FCD",": Dokploy, entornos y migraciones.",[937,938,939],"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 .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":136,"searchDepth":176,"depth":176,"links":941},[942,943,944,948,949,950,951],{"id":42,"depth":176,"text":43},{"id":128,"depth":176,"text":129},{"id":153,"depth":176,"text":154,"children":945},[946,947],{"id":274,"depth":182,"text":275},{"id":400,"depth":182,"text":401},{"id":745,"depth":176,"text":746},{"id":785,"depth":176,"text":786},{"id":866,"depth":176,"text":867},{"id":905,"depth":176,"text":906},"Requisitos, variables de entorno y primer arranque, con comandos listos para copiar y pegar.","md",{},{"icon":956},"i-lucide-rocket","\u002Fdocs\u002Fsetup",{"title":5,"description":952},"docs\u002F1.setup","h8LihQJEUm-ugkFEP3U3rTqCN_HBiiMZ94aH34l8il4",[962,963],null,{"title":916,"path":915,"stem":964,"description":965,"icon":966,"children":-1},"docs\u002F2.branching","El modelo de dos ramas permanentes, los pasos para features y fixes, y qué corre en cada gate.","i-lucide-git-branch",[968],{"title":969,"path":970,"stem":971,"children":972,"page":981},"Docs","\u002Fdocs","docs",[973,974,975,978],{"title":5,"path":957,"stem":959,"icon":956},{"title":916,"path":915,"stem":964,"icon":966},{"title":923,"path":922,"stem":976,"icon":977},"docs\u002F3.design-system","i-lucide-swatch-book",{"title":934,"path":933,"stem":979,"icon":980},"docs\u002F4.deploy","i-lucide-cloud-upload",false,1791214063325]