{"id":499,"date":"2026-03-09T13:23:48","date_gmt":"2026-03-09T13:23:48","guid":{"rendered":"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/webassembly-in-2026-where-it-actually-makes-sense\/"},"modified":"2026-03-18T22:31:21","modified_gmt":"2026-03-18T22:31:21","slug":"webassembly-in-2026-where-it-actually-makes-sense","status":"publish","type":"post","link":"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/webassembly-in-2026-where-it-actually-makes-sense\/","title":{"rendered":"WebAssembly en 2026: D\u00f3nde Realmente Tiene Sentido Reemplazar JavaScript"},"content":{"rendered":"<p>Llevo ignorando WebAssembly desde m\u00e1s o menos 2022. No porque pensara que era mala tecnolog\u00eda \u2014 era m\u00e1s que cada vez que lo intentaba, el dolor de la toolchain superaba los beneficios reales que obten\u00eda. Lo prob\u00e9 con Emscripten para portar una librer\u00eda de C++, pas\u00e9 dos d\u00edas configurando y al final el bundle pesaba 4MB y el startup time era horrible. Lo dej\u00e9 estar.<\/p>\n<p>Pero algo cambi\u00f3 este enero.<\/p>\n<p>Estaba trabajando en un proyecto de procesamiento de im\u00e1genes para un cliente \u2014 una web app que necesitaba aplicar filtros y transformaciones complejas <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/claude-vs-gpt-4o-vs-gemini-20-qu-modelo-de-ia-usar\/\" title=\"en el\">en el<\/a> cliente, sin enviar datos al servidor por razones de privacidad. El equipo \u00e9ramos tres personas. <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/redis-vs-valkey-in-2026-why-the-license-change-for\/\" title=\"y Por\">Y por<\/a> primera vez en a\u00f1os, WASM no solo tuvo sentido sino que fue claramente la decisi\u00f3n correcta. Pas\u00e9 <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/tcnicas-avanzadas-de-prompt-engineering-chain-of-t\/\" title=\"dos semanas\">dos semanas<\/a> yendo y viniendo entre implementaciones en JavaScript puro y Rust compilado a WASM, y <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/langchain-vs-llamaindex-vs-haystack-building-produ\/\" title=\"Lo que\">lo que<\/a> encontr\u00e9 cambi\u00f3 bastante c\u00f3mo pienso en todo esto.<\/p>\n<hr \/>\n<h2>Los n\u00fameros que me convencieron (y los que no tanto)<\/h2>\n<p>Empec\u00e9 con algo concreto: un filtro de convoluci\u00f3n 5\u00d75 aplicado a im\u00e1genes de 4K. Nada del otro mundo algor\u00edtmicamente, pero computacionalmente intenso si lo haces en JavaScript puro iterando sobre ImageData.<\/p>\n<p>La implementaci\u00f3n en JS, optimizada razonablemente con TypedArrays y sin objetos intermedios:<\/p>\n<pre><code class=\"language-javascript\">\/\/ JS puro \u2014 sin librer\u00edas, TypedArrays directos\nfunction convolve5x5(data, width, height, kernel) {\n  const output = new Uint8ClampedArray(data.length);\n  const offset = 2; \/\/ Math.floor(5 \/ 2)\n\n  for (let y = offset; y &lt; height - offset; y++) {\n    for (let x = offset; x &lt; width - offset; x++) {\n      let r = 0, g = 0, b = 0;\n      for (let ky = 0; ky &lt; 5; ky++) {\n        for (let kx = 0; kx &lt; 5; kx++) {\n          const px = ((y + ky - offset) * width + (x + kx - offset)) * 4;\n          const kv = kernel[ky * 5 + kx];\n          r += data[px]     * kv;\n          g += data[px + 1] * kv;\n          b += data[px + 2] * kv;\n        }\n      }\n      const out = (y * width + x) * 4;\n      output[out]     = Math.min(255, Math.max(0, r));\n      output[out + 1] = Math.min(255, Math.max(0, g));\n      output[out + 2] = Math.min(255, Math.max(0, b));\n      output[out + 3] = data[out + 3]; \/\/ preservar alpha\n    }\n  }\n  return output;\n}\n<\/code><\/pre>\n<p>Resultado promedio en Chrome 133, imagen de 3840\u00d72160: <strong>~820ms<\/strong>.<\/p>\n<p>La misma l\u00f3gica en Rust, compilada con wasm-pack 0.13.1 y <code>wasm-opt -O3<\/code>:<\/p>\n<pre><code class=\"language-rust\">\/\/ Rust \u2014 wasm-bindgen genera el glue de JS autom\u00e1ticamente\nuse wasm_bindgen::prelude::*;\n\n#[wasm_bindgen]\npub fn convolve_5x5(\n    data: &amp;[u8],\n    width: usize,\n    height: usize,\n    kernel: &amp;[f32],\n) -&gt; Vec&lt;u8&gt; {\n    let mut output = vec![0u8; data.len()];\n    let offset = 2usize;\n\n    for y in offset..(height - offset) {\n        for x in offset..(width - offset) {\n            let (mut r, mut g, mut b) = (0f32, 0f32, 0f32);\n            for ky in 0..5usize {\n                for kx in 0..5usize {\n                    let px = ((y + ky - offset) * width + (x + kx - offset)) * 4;\n                    let kv = kernel[ky * 5 + kx];\n                    r += data[px]     as f32 * kv;\n                    g += data[px + 1] as f32 * kv;\n                    b += data[px + 2] as f32 * kv;\n                }\n            }\n            let out = (y * width + x) * 4;\n            output[out]     = r.clamp(0.0, 255.0) as u8;\n            output[out + 1] = g.clamp(0.0, 255.0) as u8;\n            output[out + 2] = b.clamp(0.0, 255.0) as u8;\n            output[out + 3] = data[out + 3];\n        }\n    }\n    output\n}\n<\/code><\/pre>\n<p>Resultado: <strong>~95ms<\/strong>. Casi 9\u00d7 m\u00e1s r\u00e1pido.<\/p>\n<p>Ese n\u00famero hay que tomarlo con contexto. El m\u00f3dulo WASM pesa 180KB gzippeado y tiene un overhead de instanciaci\u00f3n de 15-40ms la primera vez en Chrome. Para una operaci\u00f3n que el usuario dispara una sola vez en toda la sesi\u00f3n, ese costo inicial puede importar. Para algo que se repite \u2014 y en este proyecto se repet\u00eda constantemente \u2014 se amortiza r\u00e1pido.<\/p>\n<p>Lo que no esperaba: en Firefox 134 el salto fue de solo ~5.5\u00d7 con los mismos datos. No encontr\u00e9 una explicaci\u00f3n definitiva. Sospecho que tiene que ver con c\u00f3mo el JIT de Firefox optimiza bucles num\u00e9ricos densos sobre TypedArrays, que quiz\u00e1s ya los vectoriza mejor que Chrome internamente. Tu kilometraje puede variar.<\/p>\n<hr \/>\n<h2>Los tres casos donde WASM gana de forma consistente<\/h2>\n<p>Despu\u00e9s de las <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/tcnicas-avanzadas-de-prompt-engineering-chain-of-t\/\" title=\"dos semanas\">dos semanas<\/a>, y de hablar con un par de personas del equipo que hab\u00edan experimentado cosas similares, llegu\u00e9 a tres categor\u00edas donde lo usar\u00eda sin pensarlo dos veces.<\/p>\n<p><strong>Procesamiento de medios <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/claude-vs-gpt-4o-vs-gemini-20-qu-modelo-de-ia-usar\/\" title=\"en el\">en el<\/a> cliente.<\/strong> Este fue exactamente el caso del proyecto de privacidad \u2014 transformaciones de imagen, codificaci\u00f3n de audio, muxing de video, cualquier cosa que implique iterar sobre millones de bytes con operaciones aritm\u00e9ticas. ffmpeg.wasm <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/turborepo-vs-nx-which-monorepo-tool-wont-drive-you\/\" title=\"en 2026\">en 2026<\/a> ya no es el desastre de startup que era en 2023; el tiempo de instanciaci\u00f3n baj\u00f3 considerablemente con las mejoras en compilaci\u00f3n streaming. Sigue sin ser trivial de integrar, pero al menos ya no me hace querer tirar el laptop.<\/p>\n<p><strong>Criptograf\u00eda computacionalmente costosa.<\/strong> Los n\u00fameros aqu\u00ed son brutales. Argon2id en JavaScript es pr\u00e1cticamente inutilizable con par\u00e1metros de seguridad reales \u2014 en un proyecto de notas cifradas end-to-end que termin\u00e9 en noviembre, medir argon2 con <code>memory_cost=65536<\/code> e <code>iterations=3<\/code> daba ~4500ms en JS puro. Con WASM: ~280ms, mismos par\u00e1metros. La diferencia entre &#8220;el usuario espera casi cinco segundos&#8221; y &#8220;el usuario no nota nada&#8221; <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/08\/benchmarks-de-asistentes-de-cdigo-ia-pruebas-de-re\/\" title=\"es lo que\">es lo que<\/a> decide si un feature existe o no.<\/p>\n<p><strong>Portar librer\u00edas probadas de otros lenguajes.<\/strong> Si ya existe c\u00f3digo de C\/C++\/Rust con a\u00f1os de tests y auditor\u00edas, reescribirlo en JS es tiempo, riesgo de bugs de compatibilidad y potenciales regresiones de seguridad. Aqu\u00ed Emscripten 3.1.x ha madurado bastante \u2014 sigue siendo m\u00e1s verboso que wasm-pack para c\u00f3digo Rust nuevo, pero para bindings de librer\u00edas existentes es la opci\u00f3n pragm\u00e1tica. No me pagan por reescribir c\u00f3digo que ya funciona.<\/p>\n<hr \/>\n<h2>El problema del boundary <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/08\/alternativas-a-github-copilot-en-2026-cursor-codei\/\" title=\"que descubr\u00ed\">que descubr\u00ed<\/a> de la peor manera<\/h2>\n<p>Aqu\u00ed viene la parte donde pens\u00e9 que entend\u00eda WASM y result\u00f3 que no.<\/p>\n<p>Estaba seguro de que si WASM era 9\u00d7 m\u00e1s r\u00e1pido <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/claude-vs-gpt-4o-vs-gemini-20-qu-modelo-de-ia-usar\/\" title=\"en el\">en el<\/a> benchmark aislado, tambi\u00e9n optimizar\u00eda la detecci\u00f3n de bordes que hac\u00eda frame a frame sobre un canvas de 720p a 30fps. La l\u00f3gica parec\u00eda s\u00f3lida: operaci\u00f3n intensa, muchas multiplicaciones, candidato perfecto.<\/p>\n<p>Lo implement\u00e9. Lo med\u00ed. Era <strong>m\u00e1s lento<\/strong> que JavaScript.<\/p>\n<p>Pas\u00e9 un d\u00eda entero convencido de que hab\u00eda un bug en mi Rust. No hab\u00eda bug.<\/p>\n<p>El problema era el boundary crossing. Cada vez que JavaScript llama a una funci\u00f3n WASM y le pasa datos, hay un overhead de copia de memoria \u2014 el linear memory de WASM y el heap de JS son espacios separados, no hay zero-copy por defecto. Para el filtro de convoluci\u00f3n, pasaba el buffer de imagen una vez, procesaba todo internamente y devolv\u00eda el resultado. El overhead del boundary era insignificante comparado con <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/claude-vs-gpt-4o-vs-gemini-20-qu-modelo-de-ia-usar\/\" title=\"el Trabajo\">el trabajo<\/a> real.<\/p>\n<p>Para el detector de bordes por frames, estaba llamando a la funci\u00f3n WASM 30 veces por segundo, cada vez copiando un buffer de ~3.3MB (1280\u00d7720\u00d74 bytes). Esa copia era m\u00e1s costosa que simplemente ejecutar el algoritmo en JS. La funci\u00f3n WASM era r\u00e1pida. El problema era que la llamaba demasiadas veces con datos demasiado grandes.<\/p>\n<p>La soluci\u00f3n fue mover el bucle de frames tambi\u00e9n dentro de WASM, pasar los frames por SharedArrayBuffer desde un Worker, y dejar que WASM manejara la acumulaci\u00f3n por completo. Funcion\u00f3, pero la complejidad de setup subi\u00f3 bastante. Y honestamente, en retrospectiva, para ese caso espec\u00edfico WebGPU hubiera sido m\u00e1s directo.<\/p>\n<p>Esto <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/08\/benchmarks-de-asistentes-de-cdigo-ia-pruebas-de-re\/\" title=\"es lo que\">es lo que<\/a> m\u00e1s me cambi\u00f3 el criterio: la granularidad de las llamadas importa tanto como el volumen total de c\u00f3mputo. Una sola llamada que procesa 10MB de golpe es completamente diferente a 300 llamadas que procesan 33KB cada una.<\/p>\n<hr \/>\n<h2>El stack que uso actualmente<\/h2>\n<p>Para proyectos donde WASM tiene sentido, mi configuraci\u00f3n <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/turborepo-vs-nx-which-monorepo-tool-wont-drive-you\/\" title=\"en 2026\">en 2026<\/a>:<\/p>\n<ul>\n<li><strong>Rust + wasm-bindgen + wasm-pack 0.13.x<\/strong> para el m\u00f3dulo. wasm-bindgen genera autom\u00e1ticamente el glue code de JS y los tipos TypeScript, lo cual en un equipo peque\u00f1o vale mucho \u2014 no quiero mantener bindings a mano.<\/li>\n<li><strong>wasm-opt -O3<\/strong> <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/claude-vs-gpt-4o-vs-gemini-20-qu-modelo-de-ia-usar\/\" title=\"en el\">en el<\/a> pipeline de CI. El <code>.wasm<\/code> sin optimizar puede ser 2-3\u00d7 m\u00e1s grande. No lo saltes nunca.<\/li>\n<li><strong>Web Workers<\/strong> para el m\u00f3dulo WASM. Si el c\u00f3mputo tarda m\u00e1s de ~50ms, no puede estar en el hilo principal. Esto no es negociable si te importa el tiempo de respuesta de la UI.<\/li>\n<li><strong>Lazy loading<\/strong> con <code>await import()<\/code>. El m\u00f3dulo WASM no va en el bundle principal \u2014 se carga solo cuando el usuario necesita esa funcionalidad por primera vez.<\/li>\n<\/ul>\n<p>Lo que no uso: AssemblyScript. Lo intent\u00e9 en 2024 para un proyecto interno y la experiencia fue extra\u00f1a \u2014 el lenguaje se siente como TypeScript pero las restricciones de memoria te obligan a pensar de formas que se sienten artificiales para el tipo de problemas que estaba resolviendo. WasmGC ya est\u00e1 en todos los browsers principales desde mediados de 2024, y eso te\u00f3ricamente mejora la situaci\u00f3n para AssemblyScript y para lenguajes como Kotlin\/Dart. Pero yo ya estaba en Rust para estas cosas y no he tenido una raz\u00f3n convincente para cambiar.<\/p>\n<p>Mira, que Dart\/Flutter Web est\u00e9 usando WasmGC <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/typescript-5x-in-2026-features-that-actually-matte\/\" title=\"en Producci\u00f3n\">en producci\u00f3n<\/a> es interesante <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/serverless-vs-containers-in-2026-a-practical-decis\/\" title=\"para Equipos de\">para equipos de<\/a> ese ecosistema. Para m\u00ed, haciendo proyectos web-first, no ha cambiado el d\u00eda a d\u00eda.<\/p>\n<hr \/>\n<h2>D\u00f3nde no lo usar\u00eda aunque me pagaran<\/h2>\n<p>WASM no tiene acceso directo al DOM. Cada operaci\u00f3n sobre el \u00e1rbol de elementos pasa por el bridge de JS. Si tu cuello de botella est\u00e1 en manipulaci\u00f3n del DOM, WASM no resuelve nada y a\u00f1ade capas de complejidad innecesarias. Revisa batching de actualizaciones, CSS containment, o simplemente perfila antes de sacar conclusiones.<\/p>\n<p>Las aplicaciones CRUD normales \u2014 fetch, JSON, validaci\u00f3n de formularios, gesti\u00f3n de estado \u2014 no son computacionalmente intensas de formas que WASM resuelva. He visto propuestas de &#8220;vamos a reescribir todo en Rust\/WASM&#8221; y en los casos que he podido ver de cerca, el resultado fue m\u00e1s lento de desarrollar y el rendimiento percibido no mejor\u00f3 porque el cuello de botella real era el servidor, la red, o el tiempo de renderizado \u2014 no el cliente.<\/p>\n<p>El debugging tambi\u00e9n es una raz\u00f3n pr\u00e1ctica para pensar bien si tu equipo est\u00e1 listo. Las source maps funcionan, las herramientas de Chrome DevTools han mejorado desde 2023, pero un panic en Rust o una violaci\u00f3n de memoria en C++ <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/typescript-5x-in-2026-features-that-actually-matte\/\" title=\"en Producci\u00f3n\">en producci\u00f3n<\/a> <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/setting-up-github-actions-for-python-applications\/\" title=\"a las\">a las<\/a> 2am sigue siendo una experiencia muy diferente a depurar JavaScript. Lo s\u00e9 porque <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/kubernetes-vs-docker-swarm-vs-nomad-container-orch\/\" title=\"un Viernes\">un viernes<\/a> <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/setting-up-github-actions-for-python-applications\/\" title=\"a las\">a las<\/a> 6pm tuve que depurar un lifetime issue en Rust con el cliente en la llamada esperando un hotfix. No fue divertido.<\/p>\n<hr \/>\n<p>Despu\u00e9s de todo esto, mi criterio es bastante concreto: WASM <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/05\/copilot-vs-cursor-vs-codeium\/\" title=\"Vale la Pena\">vale la pena<\/a> cuando tienes una operaci\u00f3n bien delimitada que procesa grandes bloques <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/postgresql-performance-tuning-what-i-learned-optim\/\" title=\"de Datos\">de datos<\/a> en pocas llamadas y el c\u00f3mputo es el cuello de botella real \u2014 procesamiento de medios, criptograf\u00eda pesada, simulaciones num\u00e9ricas, parsers de formatos binarios. Ah\u00ed la ganancia justifica el overhead de toolchain, la complejidad de debugging, y la curva de aprendizaje si tu equipo no viene de lenguajes de sistemas.<\/p>\n<p>Para todo lo dem\u00e1s, JavaScript <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/turborepo-vs-nx-which-monorepo-tool-wont-drive-you\/\" title=\"en 2026\">en 2026<\/a> es m\u00e1s que suficiente. S\u00e9 que no es la respuesta emocionante, pero la madurez del ecosistema JS sigue siendo inalcanzable y el gap <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/postgresql-performance-tuning-what-i-learned-optim\/\" title=\"de Rendimiento\">de rendimiento<\/a> para trabajo web normal es bastante menor de <a href=\"https:\/\/blog.rebalai.com\/es\/2026\/03\/09\/langchain-vs-llamaindex-vs-haystack-building-produ\/\" title=\"Lo que\">lo que<\/a> sugieren los benchmarks que circulan por Twitter.<\/p>\n<p><!-- Reviewed: 2026-03-09 | Status: ready_to_publish | Changes: varied paragraph intros in \"tres casos\" section to break parallel structure; added personal voice to criptograf\u00eda and porting cases; rewrote closing conclusion to be less formulaic\/summary-style; minor voice tweaks throughout --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Llevo ignorando WebAssembly desde m\u00e1s o menos 2022.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-499","post","type-post","status-publish","format-standard","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/posts\/499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/comments?post=499"}],"version-history":[{"count":11,"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/posts\/499\/revisions"}],"predecessor-version":[{"id":770,"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/posts\/499\/revisions\/770"}],"wp:attachment":[{"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/media?parent=499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/categories?post=499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rebalai.com\/es\/wp-json\/wp\/v2\/tags?post=499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}