[{"data":1,"prerenderedAt":3657},["ShallowReactive",2],{"biblioteca-list":3},[4,849,1927],{"id":5,"title":6,"author":7,"body":8,"cover":834,"description":835,"extension":836,"meta":837,"navigation":838,"path":839,"publishedAt":840,"seo":841,"stem":842,"tags":843,"__hash__":848},"biblioteca\u002Fbiblioteca\u002Fgbrain-memoria-persistente-claude.md","GBrain · darle memoria a Claude sin dejar lo que ya usas","Miguel Santa",{"type":9,"value":10,"toc":820},"minimark",[11,29,48,53,60,66,95,100,103,109,115,118,121,125,132,136,153,155,159,166,173,179,181,185,188,231,242,244,248,251,254,262,269,280,290,297,304,315,317,321,327,434,528,593,613,643,645,649,689,691,695,701,719,726,733,735,739,770,772,776,807,816],[12,13,16,20,26],"callout",{"title":14,"type":15},"¿Apurado? Que Claude te haga un resumen rápido.","claude",[17,18,19],"p",{},"Copia el link de esta página y pégalo en Claude (claude.ai, el escritorio o la app). Le pides:",[17,21,22],{},[23,24,25],"strong",{},"\"Resúmeme esta guía y dime si GBrain me sirve a mí según cómo uso Claude hoy.\"",[17,27,28],{},"En 30 segundos tienes la respuesta personalizada. Si te interesa profundo, te devuelves a la sección que te llame.",[12,30,33,45],{"title":31,"type":32},"El repositorio oficial","info",[17,34,35,36],{},"GBrain vive acá: ",[37,38,42],"a",{"href":39,"rel":40},"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain",[41],"nofollow",[23,43,44],{},"github.com\u002Fgarrytan\u002Fgbrain",[17,46,47],{},"Open source, licencia MIT, mantenimiento activo. Si quieres ver el código, los issues o las versiones nuevas, ese es el lugar.",[49,50,52],"h2",{"id":51},"primero-por-qué-claude-se-olvida-de-ti","Primero · ¿Por qué Claude se \"olvida\" de ti?",[17,54,55,56,59],{},"Si llevas un mes usando Claude para algo serio, ya viviste esto: ayer le explicaste qué hace tu empresa, qué herramientas usas, cómo se llama tu equipo. Hoy abres una sesión nueva y ",[23,57,58],{},"arrancas desde cero otra vez",".",[17,61,62,63,59],{},"No es un error. Es ",[23,64,65],{},"diseño",[12,67,69,75,92],{"title":68,"type":32},"Una metáfora simple",[17,70,71,72,59],{},"Claude es como un ",[23,73,74],{},"asistente brillantísimo con memoria de pez",[76,77,78,82,89],"ul",{},[79,80,81],"li",{},"Es rapidísimo, sabe muchísimo, te ayuda con todo en el momento.",[79,83,84,85,88],{},"Pero cuando cierras la sesión, ",[23,86,87],{},"no recuerda nada"," de lo que conversaron.",[79,90,91],{},"Mañana lo abres y vuelve a preguntar \"¿quién eres?\". Igual que la primera vez.",[17,93,94],{},"Esa amnesia no es bug. Es cómo está construido por dentro.",[96,97,99],"h3",{"id":98},"así-se-ve-la-amnesia-en-práctica","Así se ve la amnesia en práctica",[101,102],"diagram-amnesia-claude",{},[17,104,105,106],{},"Tu costo escondido: ",[23,107,108],{},"cada sesión gastas los primeros 5 minutos re-explicándole quién eres, qué proyecto manejas, qué herramientas usas, qué decidieron juntos la semana pasada.",[17,110,111,112,59],{},"Multiplica por 10 sesiones a la semana. Son ",[23,113,114],{},"50 minutos perdidos cada semana solo en repetirte",[17,116,117],{},"Aquí entra GBrain.",[119,120],"hr",{},[49,122,124],{"id":123},"qué-es-gbrain-y-quién-lo-hace","¿Qué es GBrain y quién lo hace?",[17,126,127,128,131],{},"GBrain es una ",[23,129,130],{},"libreta persistente"," que se conecta a Claude (y a otros agentes de IA). Vive en tu computador. Recuerda lo que le cuentas. Y la próxima sesión, Claude tiene acceso a esa libreta.",[133,134],"stat-grid",{":items":135},"[{\"value\":\"15,1k\",\"label\":\"estrellas en GitHub\",\"caption\":\"open source, MIT\",\"accent\":true},{\"value\":\"Garry Tan\",\"label\":\"creador\",\"caption\":\"actual presidente de Y Combinator\"},{\"value\":\"$0\",\"label\":\"precio\",\"caption\":\"gratis en tu máquina\"}]",[12,137,139,146],{"title":138,"type":32},"¿Por qué importa quién lo hace?",[17,140,141,142,145],{},"Garry Tan no es un developer cualquiera. Es ",[23,143,144],{},"presidente de Y Combinator",", la incubadora de startups más famosa del mundo (la que sacó a Airbnb, Stripe, Dropbox, OpenAI). Cuando alguien con ese acceso construye una herramienta en open source y la publica gratis, vale la pena mirarla en serio.",[17,147,148,149,152],{},"GBrain tiene ",[23,150,151],{},"17.888 páginas, 4.383 personas y 723 empresas"," en el brain personal del propio Tan. Lo usa él mismo todos los días.",[119,154],{},[49,156,158],{"id":157},"la-tesis","La tesis",[17,160,161,162,165],{},"GBrain ",[23,163,164],{},"no reemplaza"," tu sistema de notas. No reemplaza Obsidian, Notion, Apple Notes o tu cabeza.",[17,167,168,169,172],{},"GBrain le da a ",[23,170,171],{},"Claude la capacidad de leer y escribir"," en una libreta persistente que tú controlas.",[17,174,175,178],{},[23,176,177],{},"Esa es la diferencia."," No es otra app para organizar tus notas. Es la conexión que faltaba entre tu vida con Claude y la memoria que Claude no tiene.",[119,180],{},[49,182,184],{"id":183},"qué-hace-gbrain-qué-no-hace","¿Qué hace GBrain · qué NO hace?",[17,186,187],{},"Honestidad antes de instalar nada:",[189,190,193,214],"compare-grid",{"bad-label":191,"good-label":192},"LO QUE NO HACE","LO QUE SÍ HACE",[194,195,197],"template",{"v-slot:bad":196},"",[76,198,199,202,205,208,211],{},[79,200,201],{},"No reemplaza tu Obsidian \u002F Notion \u002F Apple Notes",[79,203,204],{},"No es un editor de notas bonito",[79,206,207],{},"No te ahorra escribir lo importante",[79,209,210],{},"No piensa por ti",[79,212,213],{},"No es magia · sigue siendo Claude con una libreta al lado",[194,215,216,219,222,225,228],{"v-slot:good":196},[79,217,218],{},"Le da a Claude memoria entre sesiones",[79,220,221],{},"Importa lo que ya tienes (Obsidian, Notion, Logseq, markdown)",[79,223,224],{},"Busca por significado, no solo por palabras exactas",[79,226,227],{},"Conecta automáticamente nombres, fechas, proyectos",[79,229,230],{},"Funciona con Claude.ai, Claude Code, Cursor, ChatGPT, Perplexity",[12,232,235],{"title":233,"type":234},"Si nunca usas Claude para algo serio","warning",[17,236,237,238,241],{},"GBrain es para quien ",[23,239,240],{},"ya usa Claude muchas veces al día"," y se cansó de repetirse. Si solo le preguntas cosas sueltas una vez por semana, esto es sobre-ingeniería para ti. Vuelve cuando Claude sea tu mano derecha.",[119,243],{},[49,245,247],{"id":246},"cómo-trabaja-por-dentro-el-ciclo-de-6-pasos","Cómo trabaja por dentro · el ciclo de 6 pasos",[17,249,250],{},"Cada vez que le preguntas algo a Claude, GBrain hace este ciclo en segundo plano:",[252,253],"diagram-ciclo-gbrain",{},[255,256,259],"step-card",{"number":257,"title":258},"1","Recibe la señal",[17,260,261],{},"Tu pregunta o tu mensaje llega a Claude.",[255,263,266],{"number":264,"title":265},"2","Detecta el tipo",[17,267,268],{},"GBrain identifica qué tipo de pregunta es: ¿estás pidiendo info? ¿estás contando algo nuevo? ¿estás corrigiendo algo viejo?",[255,270,273],{"number":271,"title":272},"3","Busca en el brain",[17,274,275,276,279],{},"Mira si en su libreta ya hay información relevante. Usa ",[23,277,278],{},"3 estrategias combinadas",": búsqueda por significado, por palabras exactas, y por relaciones entre entidades.",[255,281,284],{"number":282,"title":283},"4","Responde con contexto",[17,285,286,287,59],{},"Le pasa a Claude la info encontrada para que responda ",[23,288,289],{},"sabiendo lo que ya saben de ti",[255,291,294],{"number":292,"title":293},"5","Guarda lo nuevo",[17,295,296],{},"Si dijiste algo nuevo (un proyecto, una decisión, un nombre), lo escribe en el brain.",[255,298,301],{"number":299,"title":300},"6","Conecta los puntos",[17,302,303],{},"Detecta automáticamente entidades (personas, empresas, fechas, proyectos) y los enlaza entre sí. Sin pedirte que escribas links a mano.",[12,305,308],{"title":306,"type":307},"Lo que no es obvio","tip",[17,309,310,311,314],{},"La extracción de entidades es ",[23,312,313],{},"determinística",". No usa otra llamada a IA para detectar nombres. Eso significa: cero costo adicional y resultados consistentes. Una decisión técnica que ahorra dinero a quien lo usa intensivo.",[119,316],{},[49,318,320],{"id":319},"instalación-4-caminos-según-tu-nivel","Instalación · 4 caminos según tu nivel",[17,322,323,324],{},"Te muestro los 4 caminos. ",[23,325,326],{},"Empieza por el más simple que aplique a tu caso.",[255,328,330,333,395,398,413,416,431],{"number":257,"title":329},"CLI standalone · si solo quieres probar",[17,331,332],{},"Lo más rápido. Brain local, sin conectar a Claude todavía.",[334,335,339],"pre",{"className":336,"code":337,"language":338,"meta":196,"style":196},"language-bash shiki shiki-themes github-light github-dark","git clone https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain.git && cd gbrain\nbun install\nbun link\ngbrain init\n","bash",[340,341,342,369,378,386],"code",{"__ignoreMap":196},[343,344,347,351,355,358,362,366],"span",{"class":345,"line":346},"line",1,[343,348,350],{"class":349},"sScJk","git",[343,352,354],{"class":353},"sZZnC"," clone",[343,356,357],{"class":353}," https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain.git",[343,359,361],{"class":360},"sVt8B"," && ",[343,363,365],{"class":364},"sj4cs","cd",[343,367,368],{"class":353}," gbrain\n",[343,370,372,375],{"class":345,"line":371},2,[343,373,374],{"class":349},"bun",[343,376,377],{"class":353}," install\n",[343,379,381,383],{"class":345,"line":380},3,[343,382,374],{"class":349},[343,384,385],{"class":353}," link\n",[343,387,389,392],{"class":345,"line":388},4,[343,390,391],{"class":349},"gbrain",[343,393,394],{"class":353}," init\n",[17,396,397],{},"Importas tus notas existentes:",[334,399,401],{"className":336,"code":400,"language":338,"meta":196,"style":196},"gbrain import ~\u002Fnotas-mias\u002F\n",[340,402,403],{"__ignoreMap":196},[343,404,405,407,410],{"class":345,"line":346},[343,406,391],{"class":349},[343,408,409],{"class":353}," import",[343,411,412],{"class":353}," ~\u002Fnotas-mias\u002F\n",[17,414,415],{},"Le preguntas algo:",[334,417,419],{"className":336,"code":418,"language":338,"meta":196,"style":196},"gbrain query \"qué temas aparecen en mis notas?\"\n",[340,420,421],{"__ignoreMap":196},[343,422,423,425,428],{"class":345,"line":346},[343,424,391],{"class":349},[343,426,427],{"class":353}," query",[343,429,430],{"class":353}," \"qué temas aparecen en mis notas?\"\n",[17,432,433],{},"Listo. Brain funcionando en tu máquina en 2 minutos.",[255,435,437,444,451,525],{"number":264,"title":436},"Con Claude Code · si ya lo usas a diario",[17,438,439,440,443],{},"Conecta GBrain como ",[23,441,442],{},"MCP server",". Esto le da a Claude Code acceso directo al brain en cada sesión.",[17,445,446,447,450],{},"Crea o edita ",[340,448,449],{},"~\u002F.claude\u002Fserver.json",":",[334,452,456],{"className":453,"code":454,"language":455,"meta":196,"style":196},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"gbrain\": {\n      \"command\": \"gbrain\",\n      \"args\": [\"serve\"]\n    }\n  }\n}\n","json",[340,457,458,463,471,478,492,507,513,519],{"__ignoreMap":196},[343,459,460],{"class":345,"line":346},[343,461,462],{"class":360},"{\n",[343,464,465,468],{"class":345,"line":371},[343,466,467],{"class":364},"  \"mcpServers\"",[343,469,470],{"class":360},": {\n",[343,472,473,476],{"class":345,"line":380},[343,474,475],{"class":364},"    \"gbrain\"",[343,477,470],{"class":360},[343,479,480,483,486,489],{"class":345,"line":388},[343,481,482],{"class":364},"      \"command\"",[343,484,485],{"class":360},": ",[343,487,488],{"class":353},"\"gbrain\"",[343,490,491],{"class":360},",\n",[343,493,495,498,501,504],{"class":345,"line":494},5,[343,496,497],{"class":364},"      \"args\"",[343,499,500],{"class":360},": [",[343,502,503],{"class":353},"\"serve\"",[343,505,506],{"class":360},"]\n",[343,508,510],{"class":345,"line":509},6,[343,511,512],{"class":360},"    }\n",[343,514,516],{"class":345,"line":515},7,[343,517,518],{"class":360},"  }\n",[343,520,522],{"class":345,"line":521},8,[343,523,524],{"class":360},"}\n",[17,526,527],{},"Reinicia Claude Code. Ya está conectado. En cada sesión Claude puede consultar el brain sin que se lo pidas.",[255,529,531,534,590],{"number":271,"title":530},"Con Claude.ai web · si trabajas en el navegador",[17,532,533],{},"Esto es más avanzado. Necesita exponer GBrain a internet con OAuth.",[334,535,537],{"className":336,"code":536,"language":338,"meta":196,"style":196},"gbrain serve --http --port 3131\nngrok http 3131 --url tu-brain.ngrok.app\ngbrain serve --http --port 3131 --public-url https:\u002F\u002Ftu-brain.ngrok.app\n",[340,538,539,555,572],{"__ignoreMap":196},[343,540,541,543,546,549,552],{"class":345,"line":346},[343,542,391],{"class":349},[343,544,545],{"class":353}," serve",[343,547,548],{"class":364}," --http",[343,550,551],{"class":364}," --port",[343,553,554],{"class":364}," 3131\n",[343,556,557,560,563,566,569],{"class":345,"line":371},[343,558,559],{"class":349},"ngrok",[343,561,562],{"class":353}," http",[343,564,565],{"class":364}," 3131",[343,567,568],{"class":364}," --url",[343,570,571],{"class":353}," tu-brain.ngrok.app\n",[343,573,574,576,578,580,582,584,587],{"class":345,"line":380},[343,575,391],{"class":349},[343,577,545],{"class":353},[343,579,548],{"class":364},[343,581,551],{"class":364},[343,583,565],{"class":364},[343,585,586],{"class":364}," --public-url",[343,588,589],{"class":353}," https:\u002F\u002Ftu-brain.ngrok.app\n",[17,591,592],{},"Después en Claude.ai conectas la URL como custom integration. Mismo brain, ahora accesible desde la web.",[255,594,596,599,607],{"number":282,"title":595},"Con un agente que te instale todo · si no quieres pelear con CLI",[17,597,598],{},"Si Claude Code o Cursor ya están en tu computador, pégales esto:",[334,600,605],{"className":601,"code":603,"language":604},[602],"language-text","Sigue las instrucciones acá:\nhttps:\u002F\u002Fraw.githubusercontent.com\u002Fgarrytan\u002Fgbrain\u002Fmaster\u002FINSTALL_FOR_AGENTS.md\n","text",[340,606,603],{"__ignoreMap":196},[17,608,609,610,59],{},"El agente clona, instala dependencias, configura los 34 skills built-in. Tiempo: ",[23,611,612],{},"~30 minutos sin que tengas que escribir un comando",[12,614,617,622,636],{"title":615,"type":616},"Cuidado con estos comandos","danger",[17,618,619],{},[23,620,621],{},"NO hagas:",[76,623,624,630],{},[79,625,626,629],{},[340,627,628],{},"bun install -g github:garrytan\u002Fgbrain"," → rompe el postinstall",[79,631,632,635],{},[340,633,634],{},"npm install -g gbrain"," → instala un paquete falso de otro autor",[17,637,638,639,642],{},"Siempre usa ",[340,640,641],{},"git clone"," directo o el agente. Lo dice el propio README de GBrain.",[119,644],{},[49,646,648],{"id":647},"cuándo-te-sirve-y-cuándo-no","¿Cuándo te sirve y cuándo no?",[189,650,653,672],{"bad-label":651,"good-label":652},"SÁLTATELO POR AHORA","VALE LA PENA",[194,654,655],{"v-slot:bad":196},[76,656,657,660,663,666,669],{},[79,658,659],{},"Usas Claude 1 o 2 veces por semana, casual",[79,661,662],{},"Tus preguntas son aisladas, no parte de un proyecto continuo",[79,664,665],{},"Tu vault de notas tiene menos de 50 archivos",[79,667,668],{},"Te bajas de la curva si te pasa algo técnico",[79,670,671],{},"No te molesta repetir contexto cada sesión",[194,673,674,677,680,683,686],{"v-slot:good":196},[79,675,676],{},"Abres Claude 5+ veces al día",[79,678,679],{},"Tienes proyectos en curso que duran semanas o meses",[79,681,682],{},"Ya tomas notas en algún sistema (Obsidian, Notion, archivos sueltos)",[79,684,685],{},"Te cansaste de pegar el mismo contexto en cada chat",[79,687,688],{},"Quieres usar el mismo brain en Claude Code + Claude.ai + Cursor",[119,690],{},[49,692,694],{"id":693},"cómo-se-complementa-con-lo-que-ya-usas","Cómo se complementa con lo que ya usas",[17,696,697,698],{},"Esta es la parte que casi nadie cuenta bien. ",[23,699,700],{},"GBrain no compite con tus notas. Trabaja al lado.",[255,702,705,716],{"number":703,"title":704},"A","Si ya usas Obsidian, Notion, Logseq o markdown",[17,706,707,708,711,712,715],{},"GBrain tiene un comando ",[340,709,710],{},"gbrain migrate"," que ",[23,713,714],{},"importa todo lo que ya tienes",". No te pide migrar. Solo lee tu carpeta y la indexa.",[17,717,718],{},"Sigues escribiendo notas en tu sistema. GBrain las refresca y se las pasa a Claude cuando hace falta.",[255,720,723],{"number":721,"title":722},"B","Si no usas ningún sistema de notas",[17,724,725],{},"GBrain mismo puede ser tu primer sistema. Le hablas a Claude, Claude le pasa lo importante al brain, y poco a poco se arma una memoria propia sin que estés escribiendo notas a mano.",[255,727,730],{"number":728,"title":729},"C","Si trabajas en equipo",[17,731,732],{},"Por ahora GBrain está pensado para uso personal. Multi-máquina existe pero es manual. Si necesitas memoria compartida en tiempo real entre 3 personas, todavía no es la mejor opción.",[119,734],{},[49,736,738],{"id":737},"mi-honestidad","Mi honestidad",[12,740,742,749,759],{"title":741,"type":32},"Yo todavía no lo instalo · te cuento por qué",[17,743,744,745,748],{},"Tengo mi propio sistema personal de memoria que armé desde antes (se llama ",[23,746,747],{},"JARVIS",", próximamente saco guía dedicada). Para mí, GBrain hoy es redundante.",[17,750,751,754,755,758],{},[23,752,753],{},"Eso no significa que no sirva."," Significa que ",[23,756,757],{},"mi caso ya está cubierto por otro camino",". La diferencia para ti puede ser enorme:",[76,760,761,764,767],{},[79,762,763],{},"Si vas a empezar de cero → GBrain te ahorra meses de armar un sistema propio.",[79,765,766],{},"Si ya tienes un sistema → mira si GBrain te complementa antes de migrarte.",[79,768,769],{},"Si no sabes qué quieres → empieza por la opción 1 (CLI standalone) y juega 2 horas. Esa es la mejor prueba.",[119,771],{},[49,773,775],{"id":774},"cierre","Cierre",[12,777,780],{"title":778,"type":779},"Lo que tienes que recordar","success",[781,782,783,789,795,801],"ol",{},[79,784,785,788],{},[23,786,787],{},"Claude olvida por diseño."," No es un bug. Es así.",[79,790,791,794],{},[23,792,793],{},"GBrain es la libreta que Claude no tiene."," No reemplaza nada. Suma.",[79,796,797,800],{},[23,798,799],{},"Empieza por la opción 1."," CLI standalone, sin compromiso. Si te enamora, sigues a las opciones 2-4.",[79,802,803,806],{},[23,804,805],{},"Open source · gratis · mantenido."," Si Garry Tan lo usa todos los días, vale al menos una tarde de prueba.",[17,808,809,810,815],{},"Si lo pruebas y te quedan dudas reales (cómo lo configuraste, qué te tropezó, qué resultados estás viendo), escríbeme en ",[37,811,814],{"href":812,"rel":813},"https:\u002F\u002Finstagram.com\u002Fsantaia.lab",[41],"@santaia.lab",". Esas dudas son material para la próxima guía.",[817,818,819],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":196,"searchDepth":371,"depth":371,"links":821},[822,825,826,827,828,829,830,831,832,833],{"id":51,"depth":371,"text":52,"children":823},[824],{"id":98,"depth":380,"text":99},{"id":123,"depth":371,"text":124},{"id":157,"depth":371,"text":158},{"id":183,"depth":371,"text":184},{"id":246,"depth":371,"text":247},{"id":319,"depth":371,"text":320},{"id":647,"depth":371,"text":648},{"id":693,"depth":371,"text":694},{"id":737,"depth":371,"text":738},{"id":774,"depth":371,"text":775},null,"Claude es brillante pero olvida todo entre sesiones. GBrain le pone una libreta persistente sin pedirte que cambies tu sistema. Open source, gratis, hecho por Garry Tan (Y Combinator).","md",{},true,"\u002Fbiblioteca\u002Fgbrain-memoria-persistente-claude","2026-05-14",{"title":6,"description":835},"biblioteca\u002Fgbrain-memoria-persistente-claude",[15,844,845,846,847],"memoria","agentes","intermedio","mcp","1l9tDcFY-Tr6dNzDJ1qR-_zFQuZoxfn2eneIsiRUqb0",{"id":850,"title":851,"author":7,"body":852,"cover":834,"description":1914,"extension":836,"meta":1915,"navigation":838,"path":1916,"publishedAt":1917,"seo":1918,"stem":1919,"tags":1920,"__hash__":1926},"biblioteca\u002Fbiblioteca\u002Fguarda-tus-tokens-sin-filtrarlos.md","No uses .env, tu computador ya tiene caja fuerte",{"type":9,"value":853,"toc":1897},[854,866,870,881,913,916,920,927,930,933,942,946,960,963,966,972,975,977,979,986,993,998,1000,1004,1007,1038,1040,1044,1054,1057,1060,1073,1075,1079,1086,1133,1194,1220,1229,1231,1235,1245,1269,1338,1344,1346,1353,1360,1406,1448,1494,1496,1500,1503,1578,1580,1584,1591,1597,1615,1668,1679,1700,1702,1706,1709,1712,1744,1854,1860,1862,1864,1887,1894],[12,855,856,858,863],{"title":14,"type":15},[17,857,19],{},[17,859,860],{},[23,861,862],{},"\"Resúmeme esta guía y dime exactamente qué tengo que hacer hoy con mis API keys.\"",[17,864,865],{},"En 30 segundos tienes lo importante. Si te interesa profundo, te devuelves a la sección que te llame.",[49,867,869],{"id":868},"primero-qué-es-un-token-y-por-qué-tanto-cuidado","Primero · ¿Qué es un token y por qué tanto cuidado?",[17,871,872,873,876,877,880],{},"Si acabas de empezar a programar con IA, probablemente escuchaste la palabra ",[23,874,875],{},"\"token\""," o ",[23,878,879],{},"\"API key\""," y todavía no te queda del todo claro qué es. Vamos por ahí.",[12,882,883,893],{"title":68,"type":32},[17,884,885,886,889,890,59],{},"Un ",[23,887,888],{},"token"," es como la ",[23,891,892],{},"llave magnética de un hotel",[76,894,895,898,901,907],{},[79,896,897],{},"Te identifica frente a un servicio (OpenAI, Stripe, Anthropic, etc.).",[79,899,900],{},"Te abre el acceso a usar ese servicio.",[79,902,903,904,59],{},"Mientras la llave esté activa, ",[23,905,906],{},"cualquiera que la tenga puede usarla como si fuera tú",[79,908,909,910,59],{},"Y cualquier consumo se cobra a ",[23,911,912],{},"tu cuenta",[17,914,915],{},"Por eso importa guardarla bien. No es paranoia. Es responsabilidad básica.",[96,917,919],{"id":918},"lo-que-pasa-cuando-una-llave-se-filtra","Lo que pasa cuando una llave se filtra",[17,921,922,923,926],{},"Esto no es teoría. Son números de un reporte público de ",[23,924,925],{},"GitGuardian"," (empresa de ciberseguridad que escanea GitHub a diario):",[133,928],{":items":929},"[{\"value\":\"12,7M\",\"label\":\"secretos filtrados\",\"caption\":\"en GitHub público durante 2023\",\"accent\":true},{\"value\":\"+28%\",\"label\":\"crecimiento anual\",\"caption\":\"se multiplican cada año\"},{\"value\":\"1.212×\",\"label\":\"API keys de OpenAI\",\"caption\":\"crecimiento en un solo año (2022→2023)\"}]",[17,931,932],{},"Y este es el dato que más asusta:",[12,934,936],{"title":935,"type":616},"90% de las llaves filtradas siguen activas 5 días después",[17,937,938,939,59],{},"Es decir, el dueño ni siquiera se enteró que estaba expuesta. Los bots automáticos sí. Y mientras tanto, ",[23,940,941],{},"alguien usa tu cuenta a tu cuenta",[96,943,945],{"id":944},"caso-real-toyota-5-años-expuesto","Caso real · Toyota, 5 años expuesto",[17,947,948,949,952,953,956,957,59],{},"En ",[23,950,951],{},"octubre de 2022, Toyota"," admitió públicamente que un token de acceso a su sistema ",[23,954,955],{},"T-Connect"," (su plataforma conectada de autos) había estado ",[23,958,959],{},"expuesto en GitHub durante 5 años",[17,961,962],{},"Lo había subido por error un subcontratista en un repositorio público. Nadie revisó. Estuvo ahí 1.825 días.",[133,964],{":items":965},"[{\"value\":\"5 años\",\"label\":\"duración de la fuga\",\"caption\":\"entre 2017 y 2022\"},{\"value\":\"296.019\",\"label\":\"clientes afectados\",\"caption\":\"emails + números de cliente expuestos\",\"accent\":true},{\"value\":\"$0\",\"label\":\"valor de un .env\",\"caption\":\"como herramienta de seguridad\"}]",[17,967,968,971],{},[23,969,970],{},"Si le pasa a Toyota, te puede pasar a ti."," La diferencia es que tu llave de OpenAI no es defendida por un equipo de ciberseguridad. Es solo tuya. Si se filtra, tú pagas la cuenta.",[17,973,974],{},"Por eso esta guía existe.",[119,976],{},[49,978,158],{"id":157},[17,980,981,982,985],{},"Tu Mac, Windows o Linux ya viene con una ",[23,983,984],{},"caja fuerte cifrada",". Está ahí desde el día uno. Casi nadie la usa.",[17,987,988,989,992],{},"En cambio, mucha gente guarda sus llaves de OpenAI, Stripe o Anthropic en un archivo de texto plano llamado ",[340,990,991],{},".env",". Y un buen día se les filtra.",[17,994,995],{},[23,996,997],{},"No vamos a hablar de \"cuándo usar .env\". Vamos a hablar de cómo dejar de usarlo.",[119,999],{},[49,1001,1003],{"id":1002},"_1-las-tres-zonas-donde-puede-vivir-tu-llave","1 · Las tres zonas donde puede vivir tu llave",[1005,1006],"diagram-donde-viven-llaves",{},[12,1008,1010,1035],{"title":1009,"type":234},"La regla es simple",[76,1011,1012,1022,1029],{},[79,1013,1014,1015,1018,1019,1021],{},"Nunca la ",[23,1016,1017],{},"opción 1"," (archivo ",[340,1020,991],{}," con valores reales)",[79,1023,1024,1025,1028],{},"Siempre la ",[23,1026,1027],{},"opción 2"," para trabajar en tu máquina",[79,1030,1024,1031,1034],{},[23,1032,1033],{},"opción 3"," para producción",[17,1036,1037],{},"Lo demás son detalles.",[119,1039],{},[49,1041,1043],{"id":1042},"_2-por-qué-un-env-es-peligroso-por-defecto","2 · Por qué un .env es peligroso por defecto",[17,1045,1046,1047,1049,1050,1053],{},"Un archivo ",[340,1048,991],{}," es ",[23,1051,1052],{},"texto plano",". Sin cifrar. Cualquiera con acceso a tu disco lo lee.",[17,1055,1056],{},"Pero el riesgo real no es ese. El riesgo real es esta cadena:",[1058,1059],"diagram-flujo-fuga",{},[12,1061,1063],{"title":1062,"type":616},"Lo importante de entender",[17,1064,1065,1066,1068,1069,1072],{},"Aunque borres el ",[340,1067,991],{}," del repositorio después, ",[23,1070,1071],{},"la llave queda en el historial de git para siempre",". Y los bots que escanean GitHub la encuentran en minutos. No en días.",[119,1074],{},[49,1076,1078],{"id":1077},"_3-mac-tu-keychain-ya-está-ahí","3 · Mac · Tu Keychain ya está ahí",[17,1080,1081,1082,1085],{},"macOS viene con ",[23,1083,1084],{},"Keychain Access",". Una caja fuerte cifrada con tu contraseña de usuario. La abre tu sistema cuando inicias sesión.",[255,1087,1089],{"number":257,"title":1088},"Guardar una llave",[334,1090,1092],{"className":336,"code":1091,"language":338,"meta":196,"style":196},"security add-generic-password \\\n  -a \"santaia\" \\\n  -s \"santaia:openai-key\" \\\n  -w \"sk-proj-tu-llave-real\"\n",[340,1093,1094,1105,1115,1125],{"__ignoreMap":196},[343,1095,1096,1099,1102],{"class":345,"line":346},[343,1097,1098],{"class":349},"security",[343,1100,1101],{"class":353}," add-generic-password",[343,1103,1104],{"class":364}," \\\n",[343,1106,1107,1110,1113],{"class":345,"line":371},[343,1108,1109],{"class":364},"  -a",[343,1111,1112],{"class":353}," \"santaia\"",[343,1114,1104],{"class":364},[343,1116,1117,1120,1123],{"class":345,"line":380},[343,1118,1119],{"class":364},"  -s",[343,1121,1122],{"class":353}," \"santaia:openai-key\"",[343,1124,1104],{"class":364},[343,1126,1127,1130],{"class":345,"line":388},[343,1128,1129],{"class":364},"  -w",[343,1131,1132],{"class":353}," \"sk-proj-tu-llave-real\"\n",[255,1134,1136],{"number":264,"title":1135},"Leerla desde tu código",[334,1137,1141],{"className":1138,"code":1139,"language":1140,"meta":196,"style":196},"language-python shiki shiki-themes github-light github-dark","import subprocess\n\ndef get_secret(name: str) -> str:\n    return subprocess.run(\n        [\"security\", \"find-generic-password\",\n         \"-s\", name, \"-a\", \"santaia\", \"-w\"],\n        capture_output=True, text=True, check=True\n    ).stdout.strip()\n\nopenai_key = get_secret(\"santaia:openai-key\")\n","python",[340,1142,1143,1148,1153,1158,1163,1168,1173,1178,1183,1188],{"__ignoreMap":196},[343,1144,1145],{"class":345,"line":346},[343,1146,1147],{},"import subprocess\n",[343,1149,1150],{"class":345,"line":371},[343,1151,1152],{"emptyLinePlaceholder":838},"\n",[343,1154,1155],{"class":345,"line":380},[343,1156,1157],{},"def get_secret(name: str) -> str:\n",[343,1159,1160],{"class":345,"line":388},[343,1161,1162],{},"    return subprocess.run(\n",[343,1164,1165],{"class":345,"line":494},[343,1166,1167],{},"        [\"security\", \"find-generic-password\",\n",[343,1169,1170],{"class":345,"line":509},[343,1171,1172],{},"         \"-s\", name, \"-a\", \"santaia\", \"-w\"],\n",[343,1174,1175],{"class":345,"line":515},[343,1176,1177],{},"        capture_output=True, text=True, check=True\n",[343,1179,1180],{"class":345,"line":521},[343,1181,1182],{},"    ).stdout.strip()\n",[343,1184,1186],{"class":345,"line":1185},9,[343,1187,1152],{"emptyLinePlaceholder":838},[343,1189,1191],{"class":345,"line":1190},10,[343,1192,1193],{},"openai_key = get_secret(\"santaia:openai-key\")\n",[255,1195,1197],{"number":271,"title":1196},"Borrarla si la rotaste",[334,1198,1200],{"className":336,"code":1199,"language":338,"meta":196,"style":196},"security delete-generic-password -s \"santaia:openai-key\" -a \"santaia\"\n",[340,1201,1202],{"__ignoreMap":196},[343,1203,1204,1206,1209,1212,1214,1217],{"class":345,"line":346},[343,1205,1098],{"class":349},[343,1207,1208],{"class":353}," delete-generic-password",[343,1210,1211],{"class":364}," -s",[343,1213,1122],{"class":353},[343,1215,1216],{"class":364}," -a",[343,1218,1219],{"class":353}," \"santaia\"\n",[12,1221,1223],{"title":1222,"type":779},"Listo",[17,1224,1225,1226],{},"Tu llave vive en una caja fuerte cifrada. Tu código la lee solo cuando la necesita. ",[23,1227,1228],{},"Nada en disco como texto plano.",[119,1230],{},[49,1232,1234],{"id":1233},"_4-windows-credential-manager","4 · Windows · Credential Manager",[17,1236,1237,1238,1241,1242,59],{},"Windows también lo tiene. Se llama ",[23,1239,1240],{},"Credential Manager"," y se maneja desde PowerShell con ",[340,1243,1244],{},"cmdkey",[255,1246,1247],{"number":257,"title":1088},[334,1248,1252],{"className":1249,"code":1250,"language":1251,"meta":196,"style":196},"language-powershell shiki shiki-themes github-light github-dark","cmdkey \u002Fgeneric:\"santaia:openai-key\" `\n       \u002Fuser:\"santaia\" `\n       \u002Fpass:\"sk-proj-tu-llave-real\"\n","powershell",[340,1253,1254,1259,1264],{"__ignoreMap":196},[343,1255,1256],{"class":345,"line":346},[343,1257,1258],{},"cmdkey \u002Fgeneric:\"santaia:openai-key\" `\n",[343,1260,1261],{"class":345,"line":371},[343,1262,1263],{},"       \u002Fuser:\"santaia\" `\n",[343,1265,1266],{"class":345,"line":380},[343,1267,1268],{},"       \u002Fpass:\"sk-proj-tu-llave-real\"\n",[255,1270,1271,1278,1287,1290],{"number":264,"title":1135},[17,1272,1273,1274,1277],{},"Necesitas el módulo ",[340,1275,1276],{},"CredentialManager"," (una sola vez):",[334,1279,1281],{"className":1249,"code":1280,"language":1251,"meta":196,"style":196},"Install-Module -Name CredentialManager -Scope CurrentUser\n",[340,1282,1283],{"__ignoreMap":196},[343,1284,1285],{"class":345,"line":346},[343,1286,1280],{},[17,1288,1289],{},"Después desde Python:",[334,1291,1293],{"className":1138,"code":1292,"language":1140,"meta":196,"style":196},"import subprocess\n\ndef get_secret(target: str) -> str:\n    ps = f'(Get-StoredCredential -Target \"{target}\").GetNetworkCredential().Password'\n    return subprocess.run(\n        [\"powershell\", \"-Command\", ps],\n        capture_output=True, text=True, check=True\n    ).stdout.strip()\n\nopenai_key = get_secret(\"santaia:openai-key\")\n",[340,1294,1295,1299,1303,1308,1313,1317,1322,1326,1330,1334],{"__ignoreMap":196},[343,1296,1297],{"class":345,"line":346},[343,1298,1147],{},[343,1300,1301],{"class":345,"line":371},[343,1302,1152],{"emptyLinePlaceholder":838},[343,1304,1305],{"class":345,"line":380},[343,1306,1307],{},"def get_secret(target: str) -> str:\n",[343,1309,1310],{"class":345,"line":388},[343,1311,1312],{},"    ps = f'(Get-StoredCredential -Target \"{target}\").GetNetworkCredential().Password'\n",[343,1314,1315],{"class":345,"line":494},[343,1316,1162],{},[343,1318,1319],{"class":345,"line":509},[343,1320,1321],{},"        [\"powershell\", \"-Command\", ps],\n",[343,1323,1324],{"class":345,"line":515},[343,1325,1177],{},[343,1327,1328],{"class":345,"line":521},[343,1329,1182],{},[343,1331,1332],{"class":345,"line":1185},[343,1333,1152],{"emptyLinePlaceholder":838},[343,1335,1336],{"class":345,"line":1190},[343,1337,1193],{},[12,1339,1341],{"title":1340,"type":32},"Si usas WSL",[17,1342,1343],{},"Si en Windows trabajas dentro de WSL (Linux dentro de Windows), salta a la siguiente sección. Te aplica esa.",[119,1345],{},[49,1347,1349,1350],{"id":1348},"_5-linux-secret-tool","5 · Linux · ",[340,1351,1352],{},"secret-tool",[17,1354,1355,1356,1359],{},"Linux usa ",[23,1357,1358],{},"libsecret"," como API estándar. Instala la CLI una vez:",[334,1361,1363],{"className":336,"code":1362,"language":338,"meta":196,"style":196},"# Debian \u002F Ubuntu\nsudo apt install libsecret-tools\n\n# Fedora\nsudo dnf install libsecret\n",[340,1364,1365,1371,1385,1389,1394],{"__ignoreMap":196},[343,1366,1367],{"class":345,"line":346},[343,1368,1370],{"class":1369},"sJ8bj","# Debian \u002F Ubuntu\n",[343,1372,1373,1376,1379,1382],{"class":345,"line":371},[343,1374,1375],{"class":349},"sudo",[343,1377,1378],{"class":353}," apt",[343,1380,1381],{"class":353}," install",[343,1383,1384],{"class":353}," libsecret-tools\n",[343,1386,1387],{"class":345,"line":380},[343,1388,1152],{"emptyLinePlaceholder":838},[343,1390,1391],{"class":345,"line":388},[343,1392,1393],{"class":1369},"# Fedora\n",[343,1395,1396,1398,1401,1403],{"class":345,"line":494},[343,1397,1375],{"class":349},[343,1399,1400],{"class":353}," dnf",[343,1402,1381],{"class":353},[343,1404,1405],{"class":353}," libsecret\n",[255,1407,1408,1445],{"number":257,"title":1088},[334,1409,1411],{"className":336,"code":1410,"language":338,"meta":196,"style":196},"secret-tool store --label=\"OpenAI · santaia\" \\\n  service \"santaia\" \\\n  key \"openai-key\"\n",[340,1412,1413,1428,1437],{"__ignoreMap":196},[343,1414,1415,1417,1420,1423,1426],{"class":345,"line":346},[343,1416,1352],{"class":349},[343,1418,1419],{"class":353}," store",[343,1421,1422],{"class":364}," --label=",[343,1424,1425],{"class":353},"\"OpenAI · santaia\"",[343,1427,1104],{"class":364},[343,1429,1430,1433,1435],{"class":345,"line":371},[343,1431,1432],{"class":353},"  service",[343,1434,1112],{"class":353},[343,1436,1104],{"class":364},[343,1438,1439,1442],{"class":345,"line":380},[343,1440,1441],{"class":353},"  key",[343,1443,1444],{"class":353}," \"openai-key\"\n",[17,1446,1447],{},"Te pregunta el valor de la llave en interactivo. No queda en tu historial de bash.",[255,1449,1450],{"number":264,"title":1135},[334,1451,1453],{"className":1138,"code":1452,"language":1140,"meta":196,"style":196},"import subprocess\n\ndef get_secret(service: str, key: str) -> str:\n    return subprocess.run(\n        [\"secret-tool\", \"lookup\", \"service\", service, \"key\", key],\n        capture_output=True, text=True, check=True\n    ).stdout.strip()\n\nopenai_key = get_secret(\"santaia\", \"openai-key\")\n",[340,1454,1455,1459,1463,1468,1472,1477,1481,1485,1489],{"__ignoreMap":196},[343,1456,1457],{"class":345,"line":346},[343,1458,1147],{},[343,1460,1461],{"class":345,"line":371},[343,1462,1152],{"emptyLinePlaceholder":838},[343,1464,1465],{"class":345,"line":380},[343,1466,1467],{},"def get_secret(service: str, key: str) -> str:\n",[343,1469,1470],{"class":345,"line":388},[343,1471,1162],{},[343,1473,1474],{"class":345,"line":494},[343,1475,1476],{},"        [\"secret-tool\", \"lookup\", \"service\", service, \"key\", key],\n",[343,1478,1479],{"class":345,"line":509},[343,1480,1177],{},[343,1482,1483],{"class":345,"line":515},[343,1484,1182],{},[343,1486,1487],{"class":345,"line":521},[343,1488,1152],{"emptyLinePlaceholder":838},[343,1490,1491],{"class":345,"line":1185},[343,1492,1493],{},"openai_key = get_secret(\"santaia\", \"openai-key\")\n",[119,1495],{},[49,1497,1499],{"id":1498},"_6-mi-convención-de-naming","6 · Mi convención de naming",[17,1501,1502],{},"Cuando llevas 30+ llaves entre varios proyectos, sin convención no encuentras nada. Esta es la que uso:",[189,1504,1509,1534],{"bad-label":1505,"bad-title":1506,"good-label":1507,"good-title":1508},"Para llaves globales","patrón: servicio-contexto","Para llaves de un proyecto","patrón: proyecto:servicio",[194,1510,1511,1528],{"v-slot:bad":196},[76,1512,1513,1518,1523],{},[79,1514,1515],{},[340,1516,1517],{},"gitlab-terracomerce",[79,1519,1520],{},[340,1521,1522],{},"gitlab-personal",[79,1524,1525],{},[340,1526,1527],{},"anthropic-personal",[17,1529,1530,1531,59],{},"Llaves que usas en varios proyectos. El sufijo dice ",[23,1532,1533],{},"para qué cuenta",[194,1535,1536,1553,1556],{"v-slot:good":196},[76,1537,1538,1543,1548],{},[79,1539,1540],{},[340,1541,1542],{},"santaia:openai-key",[79,1544,1545],{},[340,1546,1547],{},"santaia:elevenlabs-key",[79,1549,1550],{},[340,1551,1552],{},"santaia:gemini-key",[17,1554,1555],{},"Llaves específicas de un proyecto. Los dos puntos separan el proyecto del servicio. Fácil de filtrar:",[334,1557,1559],{"className":336,"code":1558,"language":338,"meta":196,"style":196},"security dump-keychain | grep santaia\n",[340,1560,1561],{"__ignoreMap":196},[343,1562,1563,1565,1568,1572,1575],{"class":345,"line":346},[343,1564,1098],{"class":349},[343,1566,1567],{"class":353}," dump-keychain",[343,1569,1571],{"class":1570},"szBVR"," |",[343,1573,1574],{"class":349}," grep",[343,1576,1577],{"class":353}," santaia\n",[119,1579],{},[49,1581,1583],{"id":1582},"_7-producción-nunca-en-tu-máquina","7 · Producción · Nunca en tu máquina",[17,1585,1586,1587,1590],{},"Tu computador personal ",[23,1588,1589],{},"nunca"," debe tener llaves de producción. Punto.",[17,1592,1593,1594,59],{},"Las llaves de producción viven en el panel del proveedor donde despliegas. Se inyectan ",[23,1595,1596],{},"solo cuando se ejecuta el build",[255,1598,1600,1606,1609],{"number":257,"title":1599},"Cloudflare Pages",[17,1601,1602,1605],{},[23,1603,1604],{},"Ruta:"," Settings → Environment variables → Add",[17,1607,1608],{},"Pones nombre + valor + ambiente (Production \u002F Preview). Guardas y redeploy. La variable solo existe durante el build.",[17,1610,1611,1612,59],{},"Es lo que uso yo para ",[340,1613,1614],{},"santa-ia.com",[255,1616,1618,1623,1629],{"number":264,"title":1617},"GitHub Actions",[17,1619,1620,1622],{},[23,1621,1604],{}," Settings → Secrets and variables → Actions → New repository secret",[17,1624,1625,1626,450],{},"En tu workflow lo lees con ",[340,1627,1628],{},"secrets.NOMBRE",[334,1630,1634],{"className":1631,"code":1632,"language":1633,"meta":196,"style":196},"language-yaml shiki shiki-themes github-light github-dark","- env:\n    OPENAI_KEY: ${{ secrets.OPENAI_KEY }}\n  run: npm run deploy\n","yaml",[340,1635,1636,1648,1658],{"__ignoreMap":196},[343,1637,1638,1641,1645],{"class":345,"line":346},[343,1639,1640],{"class":360},"- ",[343,1642,1644],{"class":1643},"s9eBZ","env",[343,1646,1647],{"class":360},":\n",[343,1649,1650,1653,1655],{"class":345,"line":371},[343,1651,1652],{"class":1643},"    OPENAI_KEY",[343,1654,485],{"class":360},[343,1656,1657],{"class":353},"${{ secrets.OPENAI_KEY }}\n",[343,1659,1660,1663,1665],{"class":345,"line":380},[343,1661,1662],{"class":1643},"  run",[343,1664,485],{"class":360},[343,1666,1667],{"class":353},"npm run deploy\n",[255,1669,1671,1676],{"number":271,"title":1670},"Vercel",[17,1672,1673,1675],{},[23,1674,1604],{}," Settings → Environment Variables",[17,1677,1678],{},"Misma idea que Cloudflare: nombre + valor + ambiente. Inyección automática durante el build.",[255,1680,1682,1687],{"number":282,"title":1681},"Railway",[17,1683,1684,1686],{},[23,1685,1604],{}," pestaña Variables de cada servicio",[17,1688,1689,1690,1692,1693,1696,1697,1699],{},"Puedes importar de un ",[340,1691,991],{}," local en bloque. Esa es la ",[23,1694,1695],{},"única vez"," que un ",[340,1698,991],{}," tiene sentido: importarlo a Railway una vez y nunca más.",[119,1701],{},[49,1703,1705],{"id":1704},"_8-y-si-ya-filtré-algo","8 · ¿Y si ya filtré algo?",[17,1707,1708],{},"Te puede pasar. Si pasó, no entres en pánico. Tres pasos en orden:",[1710,1711],"diagram-rotacion-llave",{},[255,1713,1715,1721,1741],{"number":257,"title":1714},"Rota la llave en el servicio",[17,1716,1717,1720],{},[23,1718,1719],{},"Esto primero."," Mientras la llave vieja siga activa, el daño sigue creciendo.",[76,1722,1723,1729,1735],{},[79,1724,1725,1728],{},[23,1726,1727],{},"OpenAI:"," Dashboard → API Keys → Revoke → crea nueva",[79,1730,1731,1734],{},[23,1732,1733],{},"Stripe:"," Dashboard → Developers → API keys → Roll",[79,1736,1737,1740],{},[23,1738,1739],{},"AWS:"," IAM → Access Keys → Deactivate + Delete + Create new",[17,1742,1743],{},"Cualquier servicio serio tiene un botón de \"rotate\" o \"revoke\" en su panel.",[255,1745,1747,1750,1802,1808,1848],{"number":264,"title":1746},"Limpia el historial de git",[17,1748,1749],{},"Para repos privados y recientes, basta con:",[334,1751,1753],{"className":336,"code":1752,"language":338,"meta":196,"style":196},"git rm --cached .env\necho \".env\" >> .gitignore\ngit commit -m \"chore: remove .env from tracking\"\ngit push\n",[340,1754,1755,1768,1782,1795],{"__ignoreMap":196},[343,1756,1757,1759,1762,1765],{"class":345,"line":346},[343,1758,350],{"class":349},[343,1760,1761],{"class":353}," rm",[343,1763,1764],{"class":364}," --cached",[343,1766,1767],{"class":353}," .env\n",[343,1769,1770,1773,1776,1779],{"class":345,"line":371},[343,1771,1772],{"class":364},"echo",[343,1774,1775],{"class":353}," \".env\"",[343,1777,1778],{"class":1570}," >>",[343,1780,1781],{"class":353}," .gitignore\n",[343,1783,1784,1786,1789,1792],{"class":345,"line":380},[343,1785,350],{"class":349},[343,1787,1788],{"class":353}," commit",[343,1790,1791],{"class":364}," -m",[343,1793,1794],{"class":353}," \"chore: remove .env from tracking\"\n",[343,1796,1797,1799],{"class":345,"line":388},[343,1798,350],{"class":349},[343,1800,1801],{"class":353}," push\n",[17,1803,1804,1805,450],{},"Para repos públicos o historiales largos, usa ",[340,1806,1807],{},"git-filter-repo",[334,1809,1811],{"className":336,"code":1810,"language":338,"meta":196,"style":196},"pip install git-filter-repo\ngit filter-repo --invert-paths --path .env\ngit push --force\n",[340,1812,1813,1823,1838],{"__ignoreMap":196},[343,1814,1815,1818,1820],{"class":345,"line":346},[343,1816,1817],{"class":349},"pip",[343,1819,1381],{"class":353},[343,1821,1822],{"class":353}," git-filter-repo\n",[343,1824,1825,1827,1830,1833,1836],{"class":345,"line":371},[343,1826,350],{"class":349},[343,1828,1829],{"class":353}," filter-repo",[343,1831,1832],{"class":364}," --invert-paths",[343,1834,1835],{"class":364}," --path",[343,1837,1767],{"class":353},[343,1839,1840,1842,1845],{"class":345,"line":380},[343,1841,350],{"class":349},[343,1843,1844],{"class":353}," push",[343,1846,1847],{"class":364}," --force\n",[12,1849,1851],{"title":1850,"type":234},"Avisa a tu equipo antes del --force",[17,1852,1853],{},"Todos los que tengan el repo clonado van a tener que re-clonarlo. Coordina antes, no después.",[255,1855,1857],{"number":271,"title":1856},"Anota qué pasó",[17,1858,1859],{},"En el README o tu sistema de notas: qué llave se filtró, qué hiciste, qué falló en tu proceso. Sin esto, el segundo incidente cae igual.",[119,1861],{},[49,1863,775],{"id":774},[12,1865,1867],{"title":1866,"type":779},"Las 3 reglas que tienes que recordar",[781,1868,1869,1875,1881],{},[79,1870,1871,1874],{},[23,1872,1873],{},"Nunca llaves reales en .env."," Es texto plano. Se filtra fácil.",[79,1876,1877,1880],{},[23,1878,1879],{},"Local en el gestor del sistema."," Mac → Keychain. Windows → Credential Manager. Linux → libsecret.",[79,1882,1883,1886],{},[23,1884,1885],{},"Producción en el panel del proveedor."," Tu máquina no las conoce.",[17,1888,1889,1890,1893],{},"Si pruebas esto en algún proyecto tuyo y se te traba algo, escríbeme en ",[37,1891,814],{"href":812,"rel":1892},[41],". Las dudas reales son el material del próximo artículo.",[817,1895,1896],{},"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":196,"searchDepth":371,"depth":371,"links":1898},[1899,1903,1904,1905,1906,1907,1908,1910,1911,1912,1913],{"id":868,"depth":371,"text":869,"children":1900},[1901,1902],{"id":918,"depth":380,"text":919},{"id":944,"depth":380,"text":945},{"id":157,"depth":371,"text":158},{"id":1002,"depth":371,"text":1003},{"id":1042,"depth":371,"text":1043},{"id":1077,"depth":371,"text":1078},{"id":1233,"depth":371,"text":1234},{"id":1348,"depth":371,"text":1909},"5 · Linux · secret-tool",{"id":1498,"depth":371,"text":1499},{"id":1582,"depth":371,"text":1583},{"id":1704,"depth":371,"text":1705},{"id":774,"depth":371,"text":775},"Tu sistema operativo ya viene con un gestor de claves cifrado. La mayoría no lo usa y arriesga sus API keys en un .env. Te muestro cómo cambiar el hábito en 5 minutos.",{},"\u002Fbiblioteca\u002Fguarda-tus-tokens-sin-filtrarlos","2026-05-13",{"title":851,"description":1914},"biblioteca\u002Fguarda-tus-tokens-sin-filtrarlos",[1921,1922,1923,1644,1924,1925],"seguridad","tokens","keychain","secretos","básico","Vhk-C7mJEnfIj5EBYg0LZe-M_084L77ltbw9ViH2fco",{"id":1928,"title":1929,"author":7,"body":1930,"cover":834,"description":3646,"extension":836,"meta":3647,"navigation":838,"path":3648,"publishedAt":3649,"seo":3650,"stem":3651,"tags":3652,"__hash__":3656},"biblioteca\u002Fbiblioteca\u002Fguia-claude-code-completa.md","Guía completa de Claude Code en español",{"type":9,"value":1931,"toc":3609},[1932,1945,1949,1952,1955,1958,1960,1964,1971,1974,1984,2003,2009,2012,2016,2023,2059,2066,2070,2076,2133,2136,2149,2158,2162,2165,2168,2170,2174,2181,2184,2226,2230,2233,2240,2243,2247,2254,2264,2267,2380,2384,2390,2400,2418,2420,2424,2427,2431,2438,2441,2536,2548,2552,2562,2565,2604,2621,2625,2628,2636,2646,2651,2658,2661,2665,2668,2675,2678,2724,2728,2739,2749,2762,2779,2811,2813,2817,2820,2823,2826,2832,2835,2841,2847,2852,2857,2861,2871,2875,2885,2891,2905,2927,2929,2933,2936,2973,2977,2984,3007,3014,3019,3038,3042,3049,3052,3111,3128,3132,3139,3173,3176,3182,3188,3191,3195,3198,3210,3252,3258,3264,3270,3272,3276,3279,3286,3291,3294,3298,3304,3310,3316,3322,3328,3332,3391,3394,3441,3443,3447,3454,3460,3466,3472,3478,3484,3490,3505,3528,3530,3534,3537,3540,3545,3549,3553,3557,3561,3565,3569,3573,3586,3588,3590,3597,3600,3606],[12,1933,1934,1937,1942],{"title":14,"type":15},[17,1935,1936],{},"Copia el link de esta página y pégalo en Claude (claude.ai, el escritorio o la app). Le pides algo así:",[17,1938,1939],{},[23,1940,1941],{},"\"Resúmeme esta guía en los 5 puntos clave y dime qué debería aplicar primero según mi nivel.\"",[17,1943,1944],{},"En 30 segundos tienes el resumen ajustado a ti. Si después te interesa profundo, te devuelves a leer la sección que te llame. Funciona porque la página es pública y Claude la lee entera.",[49,1946,1948],{"id":1947},"por-qué-esta-guía-existe","Por qué esta guía existe",[17,1950,1951],{},"Llevo meses usando Claude Code para todo. Para escribir esta landing. Para hacer scripts. Para investigar. Para mover proyectos.",[17,1953,1954],{},"La mayoría de tutoriales que encontré tratan a Claude Code como un chatbot con esteroides. No lo es. Es un agente que tiene acceso a tu computadora. Esa diferencia lo cambia todo.",[17,1956,1957],{},"Esta guía va al grano. Cero teoría, cero relleno. Te llevo desde \"lo acabo de instalar\" hasta \"lo uso con proceso de equipo\".",[119,1959],{},[49,1961,1963],{"id":1962},"_1-claude-code-no-es-un-chatbot","1 · Claude Code no es un chatbot",[17,1965,1966,1967,1970],{},"Es un ",[23,1968,1969],{},"agente con acceso a tu máquina",". Hace tres cosas que un chat no hace:",[1972,1973],"diagram-agente-vs-chatbot",{},[255,1975,1977],{"number":257,"title":1976},"Lee, crea, modifica y borra archivos",[17,1978,1979,1980,1983],{},"Le dices \"crea una carpeta ",[340,1981,1982],{},"landing\u002F"," con un Vue básico\" y lo hace. No te muestra el código para que tú lo copies. Lo escribe directo en tu disco.",[255,1985,1987],{"number":264,"title":1986},"Ejecuta comandos en tu terminal",[17,1988,1989,1992,1993,1992,1996,1992,1999,2002],{},[340,1990,1991],{},"npm install",", ",[340,1994,1995],{},"git commit",[340,1997,1998],{},"mv",[340,2000,2001],{},"curl",". Lo que tú escribirías a mano, él lo lanza. Con permiso o sin permiso (eso lo decides tú al configurar).",[255,2004,2006],{"number":271,"title":2005},"Abre el navegador y extrae información",[17,2007,2008],{},"Con MCP de Chrome DevTools entra a una web, toma screenshot, extrae datos. Te lo trae a la conversación.",[17,2010,2011],{},"Entender esto es el 80% del trabajo. Si lo tratas como un chat, vas a frustrarte. Si lo tratas como un junior que sabe pegado y obedece bien, le sacas el jugo.",[96,2013,2015],{"id":2014},"dónde-lo-uso-yo","Dónde lo uso yo",[17,2017,2018,2019,2022],{},"Te ahorro la decisión: ",[23,2020,2021],{},"VS Code con la terminal integrada",". Ahí adentro corro Claude Code directo y tengo el editor al lado para ver lo que está pasando con mis ojos.",[189,2024,2029,2045],{"bad-label":2025,"good-label":2026,"bad-title":2027,"good-title":2028},"Solo extensión gráfica","Terminal dentro del editor","Modo pasivo","Cómo lo uso yo",[194,2030,2031],{"v-slot:bad":196},[76,2032,2033,2036,2039,2042],{},[79,2034,2035],{},"Botones que esconden lo que pasa",[79,2037,2038],{},"Tú interpretas lo que la UI muestra",[79,2040,2041],{},"Difícil ver el flujo real de comandos",[79,2043,2044],{},"Limitado a lo que el plugin expone",[194,2046,2047,2050,2053,2056],{"v-slot:good":196},[79,2048,2049],{},"Claude Code en la terminal integrada de VS Code",[79,2051,2052],{},"Ves cada comando que ejecuta",[79,2054,2055],{},"Editas archivos en paralelo",[79,2057,2058],{},"Abres varias terminales para sesiones distintas",[17,2060,2061,2062,2065],{},"¿Necesitas Warp, iTerm2, o un terminal especial? ",[23,2063,2064],{},"No."," El que viene con tu sistema operativo está bien. La diferencia la hace tu cabeza, no la app.",[96,2067,2069],{"id":2068},"instalación-y-configuración-mínima","Instalación y configuración mínima",[17,2071,2072,2073,450],{},"Después de instalar Claude Code, agrega esto a tu ",[340,2074,2075],{},"~\u002F.zshrc",[334,2077,2079],{"className":336,"code":2078,"language":338,"meta":196,"style":196},"# ── Claude Code ─────────────────\nalias claude='claude --dangerously-skip-permissions'\n\n# ── shortcuts ────────────────────\nalias cc='claude'\nalias ccr='claude --resume'\n",[340,2080,2081,2086,2100,2104,2109,2121],{"__ignoreMap":196},[343,2082,2083],{"class":345,"line":346},[343,2084,2085],{"class":1369},"# ── Claude Code ─────────────────\n",[343,2087,2088,2091,2094,2097],{"class":345,"line":371},[343,2089,2090],{"class":1570},"alias",[343,2092,2093],{"class":360}," claude",[343,2095,2096],{"class":1570},"=",[343,2098,2099],{"class":353},"'claude --dangerously-skip-permissions'\n",[343,2101,2102],{"class":345,"line":380},[343,2103,1152],{"emptyLinePlaceholder":838},[343,2105,2106],{"class":345,"line":388},[343,2107,2108],{"class":1369},"# ── shortcuts ────────────────────\n",[343,2110,2111,2113,2116,2118],{"class":345,"line":494},[343,2112,2090],{"class":1570},[343,2114,2115],{"class":360}," cc",[343,2117,2096],{"class":1570},[343,2119,2120],{"class":353},"'claude'\n",[343,2122,2123,2125,2128,2130],{"class":345,"line":509},[343,2124,2090],{"class":1570},[343,2126,2127],{"class":360}," ccr",[343,2129,2096],{"class":1570},[343,2131,2132],{"class":353},"'claude --resume'\n",[17,2134,2135],{},"Aplica los cambios:",[334,2137,2139],{"className":336,"code":2138,"language":338,"meta":196,"style":196},"source ~\u002F.zshrc\n",[340,2140,2141],{"__ignoreMap":196},[343,2142,2143,2146],{"class":345,"line":346},[343,2144,2145],{"class":364},"source",[343,2147,2148],{"class":353}," ~\u002F.zshrc\n",[12,2150,2152,2155],{"title":2151,"type":234},"Sobre `--dangerously-skip-permissions`",[17,2153,2154],{},"Este flag salta la confirmación de cada acción. Suena peligroso. En la práctica, llevo más de 6 meses con bypass activo y nunca he tenido un borrado accidental serio. ¿Probabilidad cero? No. ¿Probabilidad alta? Tampoco.",[17,2156,2157],{},"Si trabajas en código crítico de cliente, no lo actives. Si estás explorando tus propios proyectos, te ahorra cientos de confirmaciones tontas al día.",[96,2159,2161],{"id":2160},"cuánto-cuesta","Cuánto cuesta",[133,2163],{":items":2164},"[{\"value\":\"$20\",\"label\":\"Pro \u002F mes\",\"caption\":\"Para empezar y aprender\"},{\"value\":\"$100\",\"label\":\"Max 5x \u002F mes\",\"caption\":\"El sweet spot para la mayoría\",\"accent\":true},{\"value\":\"$200\",\"label\":\"Max 20x \u002F mes\",\"caption\":\"Múltiples proyectos paralelos\"}]",[17,2166,2167],{},"Si hicieras estas mismas tareas vía API directa, sale fácil $500 USD\u002Fmes. La suscripción Max es 5× más barata que pagar por token. Y como Anthropic la subsidia, mientras dure, hay que aprovecharla.",[119,2169],{},[49,2171,2173],{"id":2172},"_2-claudemd-tu-memoria-entre-sesiones","2 · CLAUDE.md, tu memoria entre sesiones",[17,2175,2176,2177,2180],{},"Cada sesión nueva de Claude Code arranca ",[23,2178,2179],{},"en blanco",". No sabe nada de tu proyecto, tus reglas, tus preferencias. Tiene que descubrirlo escaneando archivos.",[17,2182,2183],{},"Esto cuesta tokens. Muchos.",[189,2185,2188,2208],{"bad-label":2186,"good-label":2187},"Sin CLAUDE.md","Con CLAUDE.md",[194,2189,2190],{"v-slot:bad":196},[76,2191,2192,2195,2202,2205],{},[79,2193,2194],{},"Escanea 47 archivos al abrir",[79,2196,2197,2198,2201],{},"Gasta ",[23,2199,2200],{},"33.000 tokens"," solo en leer",[79,2203,2204],{},"Aún no ha respondido tu primera pregunta",[79,2206,2207],{},"Repite esto cada sesión nueva",[194,2209,2210,2213,2218,2221],{"v-slot:good":196},[79,2211,2212],{},"Carga 86 líneas en segundos",[79,2214,2197,2215],{},[23,2216,2217],{},"1.200 tokens",[79,2219,2220],{},"Ya tiene el mapa del proyecto",[79,2222,2223],{},[23,2224,2225],{},"27× más barato por sesión",[96,2227,2229],{"id":2228},"cómo-lo-creas","Cómo lo creas",[17,2231,2232],{},"Dentro del proyecto, en una sesión de Claude Code:",[2234,2235,2237],"terminal",{"title":2236},"setup CLAUDE.md",[17,2238,2239],{},"❯ \u002Finit\n⠋ Analizando estructura del proyecto...\n✓ Created: CLAUDE.md (86 líneas)",[17,2241,2242],{},"Claude lee tu repo, identifica el stack, las carpetas clave, y escribe la primera versión. La revisas y la ajustas a mano.",[96,2244,2246],{"id":2245},"qué-debe-contener","Qué debe contener",[17,2248,2249,2250,2253],{},"Solo lo que el agente necesita ",[23,2251,2252],{},"en CADA sesión",". Nada más.",[12,2255,2257],{"title":2256,"type":307},"Regla de oro",[17,2258,2259,2260,2263],{},"CLAUDE.md tiene que estar ",[23,2261,2262],{},"por debajo de 500 líneas",". Si pasa de ahí, está cargando tareas o información temporal que no debería estar ahí.",[17,2265,2266],{},"Estructura mínima que funciona:",[334,2268,2272],{"className":2269,"code":2270,"language":2271,"meta":196,"style":196},"language-markdown shiki shiki-themes github-light github-dark","# Mi Proyecto\n\n## Qué es\n[Una frase. La que le dirías a un amigo.]\n\n## Stack\n- Frontend: Nuxt 4 + Tailwind v4\n- Hosting: Cloudflare Pages\n- Lenguaje: TypeScript\n\n## Reglas duras\n- Conventional Commits siempre\n- Nunca `--no-verify` ni `--force`\n- Secretos en macOS Keychain, no en .env\n\n## Estructura\n├── app\u002F         ← código fuente\n├── content\u002F     ← markdown\n├── public\u002F      ← assets\n└── nuxt.config.ts\n","markdown",[340,2273,2274,2279,2283,2288,2293,2297,2302,2307,2312,2317,2321,2327,2333,2339,2345,2350,2356,2362,2368,2374],{"__ignoreMap":196},[343,2275,2276],{"class":345,"line":346},[343,2277,2278],{},"# Mi Proyecto\n",[343,2280,2281],{"class":345,"line":371},[343,2282,1152],{"emptyLinePlaceholder":838},[343,2284,2285],{"class":345,"line":380},[343,2286,2287],{},"## Qué es\n",[343,2289,2290],{"class":345,"line":388},[343,2291,2292],{},"[Una frase. La que le dirías a un amigo.]\n",[343,2294,2295],{"class":345,"line":494},[343,2296,1152],{"emptyLinePlaceholder":838},[343,2298,2299],{"class":345,"line":509},[343,2300,2301],{},"## Stack\n",[343,2303,2304],{"class":345,"line":515},[343,2305,2306],{},"- Frontend: Nuxt 4 + Tailwind v4\n",[343,2308,2309],{"class":345,"line":521},[343,2310,2311],{},"- Hosting: Cloudflare Pages\n",[343,2313,2314],{"class":345,"line":1185},[343,2315,2316],{},"- Lenguaje: TypeScript\n",[343,2318,2319],{"class":345,"line":1190},[343,2320,1152],{"emptyLinePlaceholder":838},[343,2322,2324],{"class":345,"line":2323},11,[343,2325,2326],{},"## Reglas duras\n",[343,2328,2330],{"class":345,"line":2329},12,[343,2331,2332],{},"- Conventional Commits siempre\n",[343,2334,2336],{"class":345,"line":2335},13,[343,2337,2338],{},"- Nunca `--no-verify` ni `--force`\n",[343,2340,2342],{"class":345,"line":2341},14,[343,2343,2344],{},"- Secretos en macOS Keychain, no en .env\n",[343,2346,2348],{"class":345,"line":2347},15,[343,2349,1152],{"emptyLinePlaceholder":838},[343,2351,2353],{"class":345,"line":2352},16,[343,2354,2355],{},"## Estructura\n",[343,2357,2359],{"class":345,"line":2358},17,[343,2360,2361],{},"├── app\u002F         ← código fuente\n",[343,2363,2365],{"class":345,"line":2364},18,[343,2366,2367],{},"├── content\u002F     ← markdown\n",[343,2369,2371],{"class":345,"line":2370},19,[343,2372,2373],{},"├── public\u002F      ← assets\n",[343,2375,2377],{"class":345,"line":2376},20,[343,2378,2379],{},"└── nuxt.config.ts\n",[96,2381,2383],{"id":2382},"las-3-reglas-de-oro-del-contexto","Las 3 reglas de oro del contexto",[255,2385,2387],{"number":257,"title":2386},"CLAUDE.md por debajo de 500 líneas",[17,2388,2389],{},"Si crece más, parte el contenido. Información de proyecto en CLAUDE.md, información de tarea en el mensaje de inicio.",[255,2391,2393],{"number":264,"title":2392},"1 tarea = 1 sesión",[17,2394,2395,2396,2399],{},"Cuando termines una tarea, escribe ",[340,2397,2398],{},"\u002Fclear"," y arranca otra. No reutilices la misma sesión para 5 cosas distintas. El contexto se contamina.",[255,2401,2403],{"number":271,"title":2402},"Herramientas por proyecto, no globalmente",[17,2404,2405,2406,2409,2410,2413,2414,2417],{},"Solo lo que usas ",[23,2407,2408],{},"en todo"," va a ",[340,2411,2412],{},"--scope user",". El resto va a ",[340,2415,2416],{},"--scope project",". Tener 20 MCPs globales infla cada sesión sin que te des cuenta.",[119,2419],{},[49,2421,2423],{"id":2422},"_3-mcp-skills-y-subagentes","3 · MCP, Skills y Subagentes",[17,2425,2426],{},"Tres palabras que confunden. Las pongo en orden cronológico para que las entiendas de una.",[96,2428,2430],{"id":2429},"mcp-dale-superpoderes-al-agente","MCP: dale superpoderes al agente",[17,2432,2433,2434,2437],{},"MCP es un ",[23,2435,2436],{},"catálogo de acciones"," que Claude puede ejecutar. Ejemplo: el MCP de Chrome DevTools le permite abrir pestañas, tomar screenshots, inspeccionar elementos.",[17,2439,2440],{},"Instalarlo es directo:",[334,2442,2444],{"className":336,"code":2443,"language":338,"meta":196,"style":196},"# Global (solo si lo usas SIEMPRE):\nclaude mcp add chrome-devtools \\\n  --scope user \\\n  npx @anthropic\u002Fchrome-devtools-mcp\n\n# Por proyecto (lo normal):\nclaude mcp add supabase \\\n  --scope project \\\n  npx supabase-mcp\n\n# Verificar:\n\u002Fmcp\n",[340,2445,2446,2451,2466,2476,2484,2488,2493,2506,2515,2522,2526,2531],{"__ignoreMap":196},[343,2447,2448],{"class":345,"line":346},[343,2449,2450],{"class":1369},"# Global (solo si lo usas SIEMPRE):\n",[343,2452,2453,2455,2458,2461,2464],{"class":345,"line":371},[343,2454,15],{"class":349},[343,2456,2457],{"class":353}," mcp",[343,2459,2460],{"class":353}," add",[343,2462,2463],{"class":353}," chrome-devtools",[343,2465,1104],{"class":364},[343,2467,2468,2471,2474],{"class":345,"line":380},[343,2469,2470],{"class":364},"  --scope",[343,2472,2473],{"class":353}," user",[343,2475,1104],{"class":364},[343,2477,2478,2481],{"class":345,"line":388},[343,2479,2480],{"class":353},"  npx",[343,2482,2483],{"class":353}," @anthropic\u002Fchrome-devtools-mcp\n",[343,2485,2486],{"class":345,"line":494},[343,2487,1152],{"emptyLinePlaceholder":838},[343,2489,2490],{"class":345,"line":509},[343,2491,2492],{"class":1369},"# Por proyecto (lo normal):\n",[343,2494,2495,2497,2499,2501,2504],{"class":345,"line":515},[343,2496,15],{"class":349},[343,2498,2457],{"class":353},[343,2500,2460],{"class":353},[343,2502,2503],{"class":353}," supabase",[343,2505,1104],{"class":364},[343,2507,2508,2510,2513],{"class":345,"line":521},[343,2509,2470],{"class":364},[343,2511,2512],{"class":353}," project",[343,2514,1104],{"class":364},[343,2516,2517,2519],{"class":345,"line":1185},[343,2518,2480],{"class":353},[343,2520,2521],{"class":353}," supabase-mcp\n",[343,2523,2524],{"class":345,"line":1190},[343,2525,1152],{"emptyLinePlaceholder":838},[343,2527,2528],{"class":345,"line":2323},[343,2529,2530],{"class":1369},"# Verificar:\n",[343,2532,2533],{"class":345,"line":2329},[343,2534,2535],{"class":349},"\u002Fmcp\n",[12,2537,2539,2545],{"title":2538,"type":234},"El problema de los MCP",[17,2540,2541,2542,59],{},"Inflán el contexto. Cada MCP carga su documentación entera en la ventana del agente, hayas usado o no esas acciones. Un par de MCPs grandes y ya quemaste 10.000 tokens ",[23,2543,2544],{},"antes de pedir algo",[17,2546,2547],{},"Por eso aparecieron los Skills.",[96,2549,2551],{"id":2550},"skills-la-evolución-de-los-mcp","Skills: la evolución de los MCP",[17,2553,2554,2555,2558,2559,59],{},"Un Skill es una ",[23,2556,2557],{},"carpeta con instrucciones y helpers",". Solo el header (nombre + descripción de una línea) vive en contexto. El resto se carga ",[23,2560,2561],{},"cuando lo necesitas",[2563,2564],"diagram-skills-vs-mcp",{},[189,2566,2571,2590],{"bad-label":2567,"good-label":2568,"bad-title":2569,"good-title":2570},"MCP","Skills","Modelo viejo","Modelo nuevo",[194,2572,2573],{"v-slot:bad":196},[76,2574,2575,2578,2581,2584],{},[79,2576,2577],{},"Todos los endpoints cargados desde el inicio",[79,2579,2580],{},"Escenarios fijos, no editables",[79,2582,2583],{},"Difícil de combinar varios",[79,2585,2586,2589],{},[23,2587,2588],{},"~5.000 a 11.000 tokens"," por MCP",[194,2591,2592,2595,2598,2601],{"v-slot:good":196},[79,2593,2594],{},"Solo header en contexto (~50 tokens)",[79,2596,2597],{},"Se carga bajo demanda",[79,2599,2600],{},"Editables y combinables",[79,2602,2603],{},"Cualquier API puede ser un skill",[17,2605,2606,2609,2610,2613,2614,2617,2618,59],{},[23,2607,2608],{},"Caso real:"," para crear esta landing, Claude cargó 2 skills (",[340,2611,2612],{},"ui-ux-pro-max"," + ",[340,2615,2616],{},"chrome-devtools",") que sumaron ~300 tokens en contexto. La misma capacidad como MCP habría gastado 11.000+ tokens. ",[23,2619,2620],{},"30× menos",[96,2622,2624],{"id":2623},"dónde-conseguir-skills","Dónde conseguir skills",[17,2626,2627],{},"Hay marketplaces públicos con cientos de skills disponibles. Funcionan, pero tienen dos problemas para quien arranca:",[781,2629,2630,2633],{},[79,2631,2632],{},"Muchos están escritos para gente técnica que sabe leer markdown crudo y entender qué hace cada bloque.",[79,2634,2635],{},"No vienen revisados. Cualquiera publica una skill. Y como una skill es código + instrucciones que tu agente va a ejecutar en tu máquina, eso importa.",[12,2637,2639],{"title":2638,"type":234},"Cuidado con descargar skills sin revisar",[17,2640,2641,2642,2645],{},"Una skill puede leer tus archivos, ejecutar comandos en tu terminal y conectarse a internet. Si descargas una de una fuente desconocida sin leerla, le estás dando esos permisos a un extraño. ",[23,2643,2644],{},"Próximamente sacamos una guía completa de cómo auditar una skill antes de instalarla"," y qué señales miro yo para confiar o rechazar.",[17,2647,2648],{},[23,2649,2650],{},"Lo que estamos haciendo en santa-ia:",[17,2652,2653,2654,2657],{},"Aquí en la biblioteca vamos a ir publicando las skills que yo uso, ",[23,2655,2656],{},"revisadas, probadas, y con su modo de uso explicado en español para personas que no son ingenieras",". No te paso un link al markdown crudo. Te traduzco qué hace, cuándo la usas, qué cosas evita que tengas que pensar.",[17,2659,2660],{},"Vuelve a esta biblioteca seguido. Cada semana va a haber una skill nueva con su guía propia.",[96,2662,2664],{"id":2663},"subagentes-trabajo-en-paralelo","Subagentes: trabajo en paralelo",[17,2666,2667],{},"El problema base: una sola sesión de Claude tiene contexto finito. Si le pides 3 cosas grandes seguidas, se le llena la cabeza y empieza a olvidar.",[17,2669,2670,2671,2674],{},"La solución: ",[23,2672,2673],{},"subagentes",". Cada uno tiene su propia ventana de contexto, corren en paralelo, te devuelven el resultado sin contaminar la sesión principal.",[2676,2677],"diagram-subagentes",{},[189,2679,2682,2703],{"bad-label":2680,"good-label":2681},"Secuencial","Paralelo con subagentes",[194,2683,2684],{"v-slot:bad":196},[76,2685,2686,2689,2692,2695,2700],{},[79,2687,2688],{},"Landing v1: 5 min · 100K tokens",[79,2690,2691],{},"Landing v2: 5 min · 100K tokens",[79,2693,2694],{},"Landing v3: 5 min · 100K tokens",[79,2696,2697],{},[23,2698,2699],{},"Total: 15 min · 300K en contexto principal",[79,2701,2702],{},"Sesión desbordada ☠",[194,2704,2705,2708,2711,2714,2719],{"v-slot:good":196},[79,2706,2707],{},"Sub 1 → v1: 5 min (aislado)",[79,2709,2710],{},"Sub 2 → v2: 5 min (aislado)",[79,2712,2713],{},"Sub 3 → v3: 5 min (aislado)",[79,2715,2716],{},[23,2717,2718],{},"Total: 5 min · 50K en contexto principal",[79,2720,2721],{},[23,2722,2723],{},"3× más rápido · 6× más barato",[96,2725,2727],{"id":2726},"dos-formas-de-lanzar-subagentes","Dos formas de lanzar subagentes",[17,2729,2730,2733,2734,2738],{},[23,2731,2732],{},"Al vuelo",", en cualquier sesión: le dices a Claude ",[2735,2736,2737],"em",{},"\"lanza 3 subagentes en paralelo, cada uno hace una versión distinta del componente X\"",". Y los lanza.",[17,2740,2741,2744,2745,2748],{},[23,2742,2743],{},"Pre-definidos",", en archivos dentro de ",[340,2746,2747],{},".claude\u002Fagents\u002F",". Cada uno con su nombre, modelo y skills asignados. Cuando un agente está documentado, sabes qué hace y lo invocas por nombre.",[12,2750,2752],{"title":2751,"type":32},"Honestidad sobre mi setup",[17,2753,2754,2755,2757,2758,2761],{},"Yo todavía no tengo subagentes pre-definidos en mi ",[340,2756,2747],{},". Los lanzo al vuelo cuando los necesito. ",[23,2759,2760],{},"Voy a empezar a pre-definir los recurrentes"," (uno para review de UI, uno para investigar en JARVIS, uno para humanizar copy). Cuando lo tenga listo, lo cuento en otra guía.",[17,2763,2764,2765,2768,2769,1992,2772,1992,2775,2778],{},"Si quieres empezar tú: archivo ",[340,2766,2767],{},".claude\u002Fagents\u002Fmi-primer-agente.md"," con frontmatter ",[340,2770,2771],{},"name",[340,2773,2774],{},"model",[340,2776,2777],{},"skills",". La primera vez son 5 minutos de prueba y error.",[12,2780,2782,2802,2808],{"title":2781,"type":32},"Modelos de Anthropic disponibles",[76,2783,2784,2790,2796],{},[79,2785,2786,2789],{},[23,2787,2788],{},"Opus"," → planes complejos, decisiones arquitectónicas",[79,2791,2792,2795],{},[23,2793,2794],{},"Sonnet"," → el caballo de batalla, escribe código con buen plan",[79,2797,2798,2801],{},[23,2799,2800],{},"Haiku"," → tareas de lectura, búsquedas rápidas",[17,2803,2804,2805],{},"Frase a tatuar: ",[23,2806,2807],{},"Opus sin plan es Ferrari en terracería. Sonnet con buen plan es tiro al centro.",[17,2809,2810],{},"(Y un dato extra: para tareas con mucho output JSON, otros modelos como DeepSeek-V3 pueden salir 70× más baratos que Sonnet. Lo cuento en otra guía sobre routing de modelos.)",[119,2812],{},[49,2814,2816],{"id":2815},"_4-manejo-de-contexto","4 · Manejo de contexto",[17,2818,2819],{},"El contexto es el \"espacio mental\" del agente en una sesión. Tiene un techo. Cuando se acerca, el agente empieza a olvidar y a inventar.",[2821,2822],"diagram-contexto",{},[17,2824,2825],{},"Mira tu status line. Tiene que verse algo así:",[2234,2827,2829],{"title":2828},"status line",[17,2830,2831],{},"❯ ~\u002Fsanta-ia · opus-4 · 1M ctx · 67% ■■■■■■░░",[17,2833,2834],{},"Ese 67% es lo que llevas usado. Tradúcelo así:",[2836,2837],"progress-line",{":percent":2838,"label":2839,"tone":779,"caption":2840},"35","0 - 50% · Trabajo efectivo","El agente está fresco. Respuestas precisas.",[2836,2842],{":percent":2843,"label":2844,"tone":2845,"caption":2846},"62","50 - 70% · Cuidado","accent","Empieza a olvidar detalles. Refresca con un \u002Fclear pronto.",[2836,2848],{":percent":2849,"label":2850,"tone":234,"caption":2851},"78","70 - 85% · Degradación","Respuestas inconsistentes. Cierra la tarea, abre sesión nueva.",[2836,2853],{":percent":2854,"label":2855,"tone":616,"caption":2856},"92","85%+ · Auto-compact","Pérdida contextual severa. Vas a recibir alucinaciones.",[96,2858,2860],{"id":2859},"regla-operativa","Regla operativa",[17,2862,2863,2864,2870],{},"Cuando ves 70%, ",[23,2865,2866,2867,2869],{},"cierra lo que estás haciendo, ejecuta ",[340,2868,2398],{}," y abre sesión nueva",". No te aferres a una sesión larga por sentimentalismo. El agente no se acuerda de ti igual.",[96,2872,2874],{"id":2873},"tres-comandos-que-te-salvan-la-sesión","Tres comandos que te salvan la sesión",[255,2876,2878],{"number":257,"title":2877},"\u002Fclear · arrancar de cero",[17,2879,2880,2881,2884],{},"Borra toda la memoria de la sesión actual. Útil cuando terminaste una tarea y vas a empezar otra distinta. ",[23,2882,2883],{},"Es el que más uso."," Ahorra tokens y evita contaminación entre temas que no tienen relación.",[255,2886,2888],{"number":264,"title":2887},"\u002Fcompact · resumir lo importante",[17,2889,2890],{},"En vez de borrar todo, Claude hace un resumen condensado de la conversación hasta ahora y arranca con ese resumen. Útil cuando llevabas un hilo largo que necesitas mantener pero el contexto se te está llenando. Pierdes detalle, mantienes la dirección.",[255,2892,2894],{"number":271,"title":2893},"\u002Frewind · volver atrás",[17,2895,2896,2897,2900,2901,2904],{},"Te deja regresar a un punto anterior de la conversación. Si Claude tomó un camino que no querías o rompió algo, ",[23,2898,2899],{},"devuelves la sesión al momento antes del error"," sin perder lo bueno que pasó antes. Como ",[340,2902,2903],{},"Ctrl+Z"," pero para tu chat completo.",[12,2906,2908],{"title":2907,"type":307},"Mi regla mental",[76,2909,2910,2915,2921],{},[79,2911,2912,2913],{},"Cambio de tarea → ",[340,2914,2398],{},[79,2916,2917,2918],{},"Misma tarea, contexto lleno → ",[340,2919,2920],{},"\u002Fcompact",[79,2922,2923,2924],{},"Se equivocó feo → ",[340,2925,2926],{},"\u002Frewind",[119,2928],{},[49,2930,2932],{"id":2931},"_5-sacar-tu-código-al-mundo","5 · Sacar tu código al mundo",[17,2934,2935],{},"Hay dos perfiles claros acá. No uso las etiquetas \"vibe coder vs developer pro\" porque me suenan despectivas. Lo digo más directo:",[189,2937,2940,2959],{"bad-label":2938,"good-label":2939},"Versión local","Versión publicada",[194,2941,2942],{"v-slot:bad":196},[76,2943,2944,2950,2953,2956],{},[79,2945,2946,2947],{},"Tu app solo corre en ",[340,2948,2949],{},"localhost:3000",[79,2951,2952],{},"Cuando cierras la terminal, se cae",[79,2954,2955],{},"No la puedes compartir con nadie",[79,2957,2958],{},"Si pierdes el disco, perdiste el proyecto",[194,2960,2961,2964,2967,2970],{"v-slot:good":196},[79,2962,2963],{},"Tu app vive en un dominio real",[79,2965,2966],{},"Sigue corriendo aunque tu máquina esté apagada",[79,2968,2969],{},"La puedes mandar por WhatsApp",[79,2971,2972],{},"Git la respalda en GitHub o GitLab",[96,2974,2976],{"id":2975},"cómo-publico-yo-cloudflare-pages","Cómo publico yo: Cloudflare Pages",[17,2978,2979,2980,2983],{},"Esta landing que estás leyendo vive en Cloudflare Pages. ",[23,2981,2982],{},"Free tier, deploy automático con cada push a la rama, dominio propio en minutos."," Para sitios estáticos (Nuxt SSG, Vue puro, Astro) es lo más rápido y gratis que conozco.",[2234,2985,2987],{"title":2986},"conectar repo a Cloudflare Pages",[781,2988,2989,2992,2995,2998,3001,3004],{},[79,2990,2991],{},"Login en dash.cloudflare.com → Workers & Pages",[79,2993,2994],{},"Create application → Pages → Connect to Git",[79,2996,2997],{},"Selecciona el repo (GitHub o GitLab)",[79,2999,3000],{},"Build command: npm run generate",[79,3002,3003],{},"Output directory: .output\u002Fpublic",[79,3005,3006],{},"Deploy",[17,3008,3009,3010,3013],{},"En 60 segundos tu URL ",[340,3011,3012],{},".pages.dev"," está viva.",[17,3015,3016],{},[23,3017,3018],{},"Otras opciones según el caso:",[76,3020,3021,3026,3032],{},[79,3022,3023,3025],{},[23,3024,1670],{}," → más rápido si tu stack es Next.js. Misma idea, otro proveedor.",[79,3027,3028,3031],{},[23,3029,3030],{},"Railway \u002F Render"," → cuando tienes backend Python con base de datos. Vercel no sirve para FastAPI.",[79,3033,3034,3037],{},[23,3035,3036],{},"Self-hosted (Docker en VPS)"," → cuando necesitas control total.",[96,3039,3041],{"id":3040},"git-el-cinturón-de-seguridad","Git: el cinturón de seguridad",[17,3043,3044,3045,3048],{},"Si vas a publicar algo, ",[23,3046,3047],{},"siempre con Git",". Te salva de los borrones a mitad de noche, te deja volver atrás, te deja experimentar sin miedo.",[17,3050,3051],{},"Lo mínimo:",[334,3053,3055],{"className":336,"code":3054,"language":338,"meta":196,"style":196},"git init\ngit add app\u002F content\u002F public\u002F\ngit commit -m \"feat: primera versión de la landing\"\n\n# Para experimentar sin romper:\ngit checkout -b feature\u002Fdiseno-v2\n",[340,3056,3057,3063,3078,3089,3093,3098],{"__ignoreMap":196},[343,3058,3059,3061],{"class":345,"line":346},[343,3060,350],{"class":349},[343,3062,394],{"class":353},[343,3064,3065,3067,3069,3072,3075],{"class":345,"line":371},[343,3066,350],{"class":349},[343,3068,2460],{"class":353},[343,3070,3071],{"class":353}," app\u002F",[343,3073,3074],{"class":353}," content\u002F",[343,3076,3077],{"class":353}," public\u002F\n",[343,3079,3080,3082,3084,3086],{"class":345,"line":380},[343,3081,350],{"class":349},[343,3083,1788],{"class":353},[343,3085,1791],{"class":364},[343,3087,3088],{"class":353}," \"feat: primera versión de la landing\"\n",[343,3090,3091],{"class":345,"line":388},[343,3092,1152],{"emptyLinePlaceholder":838},[343,3094,3095],{"class":345,"line":494},[343,3096,3097],{"class":1369},"# Para experimentar sin romper:\n",[343,3099,3100,3102,3105,3108],{"class":345,"line":509},[343,3101,350],{"class":349},[343,3103,3104],{"class":353}," checkout",[343,3106,3107],{"class":364}," -b",[343,3109,3110],{"class":353}," feature\u002Fdiseno-v2\n",[12,3112,3114],{"title":3113,"type":234},"Nunca `git add .` a ciegas",[17,3115,3116,3117,3119,3120,3123,3124,3127],{},"Puedes terminar subiendo un ",[340,3118,991],{},", una carpeta ",[340,3121,3122],{},"node_modules\u002F",", o un dump de base de datos. Configura un ",[340,3125,3126],{},".gitignore"," desde el día uno y agrega archivos por nombre cuando puedas.",[96,3129,3131],{"id":3130},"git-worktree-dos-claudes-a-la-vez","Git Worktree: dos Claudes a la vez",[17,3133,3134,3135,3138],{},"Mi truco favorito. Te deja tener ",[23,3136,3137],{},"dos versiones del mismo proyecto"," en carpetas físicas distintas:",[334,3140,3142],{"className":336,"code":3141,"language":338,"meta":196,"style":196},"git worktree add .\u002Fworktrees\u002Fv2 feature\u002Flanding-v2\ngit worktree add .\u002Fworktrees\u002Fv3 feature\u002Flanding-v3\n",[340,3143,3144,3159],{"__ignoreMap":196},[343,3145,3146,3148,3151,3153,3156],{"class":345,"line":346},[343,3147,350],{"class":349},[343,3149,3150],{"class":353}," worktree",[343,3152,2460],{"class":353},[343,3154,3155],{"class":353}," .\u002Fworktrees\u002Fv2",[343,3157,3158],{"class":353}," feature\u002Flanding-v2\n",[343,3160,3161,3163,3165,3167,3170],{"class":345,"line":371},[343,3162,350],{"class":349},[343,3164,3150],{"class":353},[343,3166,2460],{"class":353},[343,3168,3169],{"class":353}," .\u002Fworktrees\u002Fv3",[343,3171,3172],{"class":353}," feature\u002Flanding-v3\n",[17,3174,3175],{},"Ahora abres dos terminales:",[2234,3177,3179],{"title":3178},"terminal 1",[17,3180,3181],{},"~\u002Fworktrees\u002Fv2 ❯ claude",[2234,3183,3185],{"title":3184},"terminal 2",[17,3186,3187],{},"~\u002Fworktrees\u002Fv3 ❯ claude",[17,3189,3190],{},"Dos Claudes trabajando en paralelo, en versiones distintas, sin tropezarse. Cuando te decides por una, mergeas y borras la otra.",[96,3192,3194],{"id":3193},"secretos-nunca-en-código","Secretos: nunca en código",[17,3196,3197],{},"Tres reglas duras que aplico en todo proyecto:",[255,3199,3201],{"number":257,"title":3200},"Nada de API keys en .env del repo",[17,3202,3203,3204,3206,3207,3209],{},"Si commiteas un ",[340,3205,991],{}," aunque sea una vez, la llave queda en el historial de git para siempre. Aunque la borres después, sigue ahí. Mejor: ni los archivos ",[340,3208,991],{}," viven en mi máquina local con valores reales.",[255,3211,3213,3249],{"number":264,"title":3212},"Local: todo en el gestor de claves del sistema",[76,3214,3215,3231,3240],{},[79,3216,3217,3220,3221,3224,3225,1992,3227,1992,3229,59],{},[23,3218,3219],{},"macOS:"," Keychain (mi caso). Convención de naming: ",[340,3222,3223],{},"[servicio]-[contexto]",". Ej: ",[340,3226,1517],{},[340,3228,1552],{},[340,3230,1547],{},[79,3232,3233,3236,3237,3239],{},[23,3234,3235],{},"Windows:"," Credential Manager con la misma idea (",[340,3238,1244],{}," en CLI).",[79,3241,3242,3245,3246,3248],{},[23,3243,3244],{},"Linux:"," ",[340,3247,1352],{}," (libsecret) o KWallet.",[17,3250,3251],{},"El código consulta el gestor en runtime. La llave nunca toca el disco como texto plano.",[255,3253,3255],{"number":271,"title":3254},"Producción: variables del proveedor",[17,3256,3257],{},"GitHub Actions Secrets, Cloudflare Pages env vars, Railway secrets. Las inyecta el CI\u002FCD. Tu máquina personal jamás conoce las llaves de producción.",[12,3259,3261],{"title":3260,"type":307},"Próximamente: guía dedicada a secretos",[17,3262,3263],{},"Esto da para un artículo entero: wrappers en Python que leen del Keychain, equivalentes en Windows, manejo en CI\u002FCD, rotación de llaves. Lo dejo apuntado para una próxima guía.",[17,3265,3266,3269],{},[23,3267,3268],{},"Mi regla personal:"," llaves de producción en mi máquina local no es pregunta de \"si\" se filtran. Es pregunta de \"cuándo\". Por eso vivo todo en macOS Keychain.",[119,3271],{},[49,3273,3275],{"id":3274},"_6-el-proceso-vence-al-modelo","6 · El proceso vence al modelo",[17,3277,3278],{},"Esto es lo que más cuesta entender. Y es lo que más rinde cuando lo agarras.",[17,3280,3281,3282,3285],{},"El DORA Report 2025 dijo algo claro: ",[23,3283,3284],{},"los equipos fuertes con IA se hacen más fuertes. Los débiles descubren más problemas."," El ROI no viene de la herramienta. Viene del proceso.",[17,3287,3288],{},[23,3289,3290],{},"Caos rápido sigue siendo caos.",[3292,3293],"diagram-pipeline",{},[96,3295,3297],{"id":3296},"el-pipeline-mínimo","El pipeline mínimo",[255,3299,3301],{"number":257,"title":3300},"Planificación",[17,3302,3303],{},"El agente propone cómo atacar la tarea. No escribe código todavía.",[255,3305,3307],{"number":264,"title":3306},"Revisión del plan",[17,3308,3309],{},"Tú lees el plan, lo ajustas, agregas restricciones. Acá decides si vale la pena.",[255,3311,3313],{"number":271,"title":3312},"Descomposición",[17,3314,3315],{},"El plan se parte en tareas ejecutables. Cada una con su entregable claro.",[255,3317,3319],{"number":282,"title":3318},"Implementación vía subagentes",[17,3320,3321],{},"Las tareas corren aisladas y paralelizadas. Cada subagente entrega lo suyo.",[255,3323,3325],{"number":292,"title":3324},"Code review",[17,3326,3327],{},"Revisión explícita antes de merge. Otro pase del agente o tú a mano.",[96,3329,3331],{"id":3330},"el-mismo-modelo-dos-resultados","El mismo modelo, dos resultados",[189,3333,3336,3364],{"bad-label":3334,"good-label":3335},"Sin proceso","Con proceso",[194,3337,3338,3344,3347],{"v-slot:bad":196},[17,3339,3340,3343],{},[23,3341,3342],{},"Petición:"," \"Constrúyeme una app\"",[17,3345,3346],{},"Resultado:",[76,3348,3349,3352,3355,3358,3361],{},[79,3350,3351],{},"300K tokens después...",[79,3353,3354],{},"Contexto desbordado ✗",[79,3356,3357],{},"Código no compila ✗",[79,3359,3360],{},"Tests no existen ✗",[79,3362,3363],{},"A empezar de cero ✗",[194,3365,3366,3371,3373],{"v-slot:good":196},[17,3367,3368,3370],{},[23,3369,3342],{}," plan → revisar → partir → ejecutar → review",[17,3372,3346],{},[76,3374,3375,3380,3385,3388],{},[79,3376,3377],{},[23,3378,3379],{},"9 tareas completadas",[79,3381,3382],{},[23,3383,3384],{},"9% de contexto usado",[79,3386,3387],{},"Tests pasando ✓",[79,3389,3390],{},"Commit listo ✓",[17,3392,3393],{},"Misma versión de Claude. Mismo prompt original. La diferencia fue el proceso.",[12,3395,3397,3400,3435],{"title":3396,"type":307},"Mi flujo personal",[17,3398,3399],{},"Lo que yo uso cada día con Claude Code:",[781,3401,3402,3411,3417,3423,3429],{},[79,3403,3404,3407,3408],{},[23,3405,3406],{},"JARVIS primero."," Antes de empezar, le pido que lea mi knowledge base personal para que no parta en blanco. ",[2735,3409,3410],{},"(JARVIS es mi segundo cerebro: vault donde guardo proyectos, decisiones, aprendizajes y reglas. Pronto sale una guía dedicada solo a JARVIS y cómo armar el tuyo.)",[79,3412,3413,3416],{},[23,3414,3415],{},"Plan."," Le pido el plan antes de tocar código. Lo discutimos.",[79,3418,3419,3422],{},[23,3420,3421],{},"Implementar."," Solo después.",[79,3424,3425,3428],{},[23,3426,3427],{},"humanizer."," Todo copy público pasa por mi skill que detecta lenguaje de IA y lo corrige.",[79,3430,3431,3434],{},[23,3432,3433],{},"\u002Fcommit."," Mi propio slash command para commits con Conventional Commits, sin atribución de IA.",[17,3436,3437,3438],{},"Cada uno de estos amerita su artículo. Por ahora quédate con la idea: ",[23,3439,3440],{},"siempre hay proceso. Nunca improvisas en frío.",[119,3442],{},[49,3444,3446],{"id":3445},"_7-el-kit-que-yo-sí-uso","7 · El kit que yo sí uso",[17,3448,3449,3450,3453],{},"Cada herramienta de esta lista se ganó su puesto porque la ",[23,3451,3452],{},"investigué, la probé, y me ahorra tiempo real cada semana",". No son las \"top 10\" recopiladas de internet. Son las que yo abro casi todos los días en mi Claude Code.",[255,3455,3457],{"number":257,"title":3456},"humanizer (skill propio)",[17,3458,3459],{},"Detecta 29 patrones de prosa generada por IA (em-dashes, \"desbloquea\", \"potencia\", construcciones tipo \"no solo X sino también Y\"). Lo corre antes de publicar cualquier copy. Sin esto, todo lo que escribo suena a marketing genérico. Con esto, suena a mí.",[255,3461,3463],{"number":264,"title":3462},"ui-ux-pro-max (skill)",[17,3464,3465],{},"67 estilos visuales, 161 paletas curadas, 57 pares tipográficos. Cuando le digo \"hazme una landing bonita\", esto se encarga del criterio. Esta página está construida con esa skill guiando cada decisión.",[255,3467,3469],{"number":271,"title":3468},"chrome-devtools MCP",[17,3470,3471],{},"Automatización del browser. Toma screenshots, llena formularios, ejecuta JavaScript en la página, lee el DOM. Lo uso para validar que lo que Claude genera se ve bien antes de declarar la tarea cerrada.",[255,3473,3475],{"number":282,"title":3474},"start-project (skill propio)",[17,3476,3477],{},"Mi punto de partida en cada proyecto nuevo. Lee mi knowledge base, crea estructura estándar (Python + SQLite + Vue 3 + Tailwind), registra el proyecto en JARVIS. 3 minutos en vez de 30.",[255,3479,3481],{"number":292,"title":3480},"context-engineering + sequential-thinking",[17,3482,3483],{},"Dos skills para problemas duros. La primera ayuda a estructurar contextos complejos. La segunda obliga al agente a razonar paso a paso antes de actuar. Cuando algo se atraganta, las invoco.",[255,3485,3487],{"number":299,"title":3486},"code-review (skill)",[17,3488,3489],{},"Antes de cerrar una tarea grande, le pido que se revise él mismo. Encuentra bugs, lógica frágil, problemas de seguridad. Un segundo par de ojos que no cobra.",[255,3491,3494],{"number":3492,"title":3493},"7","\u002Fcommit (mi slash command)",[17,3495,3496,3497,3500,3501,3504],{},"Mi propio comando para commits. Conventional Commits, sin ",[340,3498,3499],{},"--no-verify",", sin ",[340,3502,3503],{},"--force",", sin atribución de IA en el mensaje. Aplica reglas duras automáticamente. Después de probarlo, no quieres commits sin él.",[12,3506,3508,3511,3525],{"title":3507,"type":32},"Pronto las traemos a la biblioteca",[17,3509,3510],{},"Cada una de estas skills va a tener su propia entrada acá en la biblioteca con:",[76,3512,3513,3516,3519,3522],{},[79,3514,3515],{},"Qué problema resuelve, en una frase.",[79,3517,3518],{},"Cuándo la uso yo y cuándo no.",[79,3520,3521],{},"Cómo se instala paso a paso.",[79,3523,3524],{},"Ejemplos reales de uso con su antes y después.",[17,3526,3527],{},"Mantente atento a la biblioteca, voy publicando una nueva cada semana. Si quieres que la próxima sea sobre una skill específica, escríbeme.",[119,3529],{},[49,3531,3533],{"id":3532},"_8-tu-ruta-de-0-a-avanzado","8 · Tu ruta de 0 a avanzado",[17,3535,3536],{},"Esto no se aprende todo en un día. La progresión sana se ve así:",[3538,3539],"diagram-roadmap",{},[2836,3541],{":percent":3542,"label":3543,"tone":3544},"10","Nivel 0 · Entender que agente ≠ chatbot","neutral",[2836,3546],{":percent":3547,"label":3548,"tone":3544},"20","Nivel 1 · Instalar Claude Code + alias en .zshrc",[2836,3550],{":percent":3551,"label":3552,"tone":3544},"30","Nivel 2 · CLAUDE.md (ahorro de tokens desde el día uno)",[2836,3554],{":percent":3555,"label":3556,"tone":2845},"45","Nivel 3 · MCP → Skills → Subagentes",[2836,3558],{":percent":3559,"label":3560,"tone":2845},"60","Nivel 4 · Monitorear contexto en cada sesión",[2836,3562],{":percent":3563,"label":3564,"tone":2845},"75","Nivel 5 · Deploy: Cloudflare Pages o Vercel",[2836,3566],{":percent":3567,"label":3568,"tone":779},"88","Nivel 6 · Git, worktree y trabajos paralelos",[2836,3570],{":percent":3571,"label":3572,"tone":779},"100","Nivel 7 · Proceso completo (plan → review)",[12,3574,3576,3583],{"title":3575,"type":307},"No hay nivel secreto",[17,3577,3578,3579,3582],{},"Si alguien te vende un atajo, está vendiendo. La diferencia entre el que rinde y el que no rinde es: ",[23,3580,3581],{},"estudia enfoques, no herramientas",". Si Claude Code desaparece mañana, el que aprendió proceso mueve su proceso a la siguiente herramienta. El que aprendió botones empieza de cero.",[17,3584,3585],{},"No es carrera de fondo. Es carrera de resistencia.",[119,3587],{},[49,3589,775],{"id":774},[17,3591,3592,3593,3596],{},"Si llegaste hasta acá, ya sabes más que el 90% de gente que dice usar Claude Code. Lo que sigue no es leer otra guía. Es abrir tu próximo proyecto y aplicar ",[23,3594,3595],{},"una sola cosa"," de las que viste.",[17,3598,3599],{},"Mi recomendación: empieza por CLAUDE.md. Es lo de menor esfuerzo y mayor retorno. Tres minutos de inversión y todas tus sesiones siguientes te lo agradecen.",[17,3601,3602,3603,1893],{},"¿Lo aplicaste y te funcionó? ¿Te trabaste en algo? Cuéntame en ",[37,3604,814],{"href":812,"rel":3605},[41],[817,3607,3608],{},"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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":196,"searchDepth":371,"depth":371,"links":3610},[3611,3612,3617,3622,3629,3633,3639,3643,3644,3645],{"id":1947,"depth":371,"text":1948},{"id":1962,"depth":371,"text":1963,"children":3613},[3614,3615,3616],{"id":2014,"depth":380,"text":2015},{"id":2068,"depth":380,"text":2069},{"id":2160,"depth":380,"text":2161},{"id":2172,"depth":371,"text":2173,"children":3618},[3619,3620,3621],{"id":2228,"depth":380,"text":2229},{"id":2245,"depth":380,"text":2246},{"id":2382,"depth":380,"text":2383},{"id":2422,"depth":371,"text":2423,"children":3623},[3624,3625,3626,3627,3628],{"id":2429,"depth":380,"text":2430},{"id":2550,"depth":380,"text":2551},{"id":2623,"depth":380,"text":2624},{"id":2663,"depth":380,"text":2664},{"id":2726,"depth":380,"text":2727},{"id":2815,"depth":371,"text":2816,"children":3630},[3631,3632],{"id":2859,"depth":380,"text":2860},{"id":2873,"depth":380,"text":2874},{"id":2931,"depth":371,"text":2932,"children":3634},[3635,3636,3637,3638],{"id":2975,"depth":380,"text":2976},{"id":3040,"depth":380,"text":3041},{"id":3130,"depth":380,"text":3131},{"id":3193,"depth":380,"text":3194},{"id":3274,"depth":371,"text":3275,"children":3640},[3641,3642],{"id":3296,"depth":380,"text":3297},{"id":3330,"depth":380,"text":3331},{"id":3445,"depth":371,"text":3446},{"id":3532,"depth":371,"text":3533},{"id":774,"depth":371,"text":775},"Cómo trabajar con Claude Code de verdad. Configuración, contexto, skills, subagentes, deploy y proceso. Todo lo que necesitas en un solo lugar.",{},"\u002Fbiblioteca\u002Fguia-claude-code-completa","2026-05-12",{"title":1929,"description":3646},"biblioteca\u002Fguia-claude-code-completa",[3653,845,2234,3654,3655],"claude-code","productividad","completo","7sTNA3__P7anZMI_SG2AbQ-r9BqmqRuEQripmKY8IEU",1778713225227]