Textos propios con fecha de publicación y de actualización, escritos por quien mantiene el sitio: extensiones de CodeBeat, PWAs, herramientas web, apps de código abierto y cómo cotizo trabajo freelance desde Guatemala. Ninguno es una copia de la documentación de un tercero.
Cómo instalar una extensión desde una URL en CodeBeat
CodeBeat no es un catálogo cerrado. Cualquier persona puede escribir una extensión y otra puede instalarla sin que yo la revise antes. Ese es el punto, pero también es el riesgo, así que conviene saber exactamente qué hace el botón «Importar desde URL» antes de pulsarlo.
Qué es realmente una extensión
Una extensión de CodeBeat es un archivo JavaScript empaquetado (un .js de un solo módulo, con metadatos de nombre, versión y manifiesto). No es un APK y no tiene permisos de sistema: corre dentro del motor del reproductor, que expone un conjunto fijo de utilidades de red, de reproducción y de almacenamiento. Lo que la extensión no puede hacer es salirse de ese puente, así que la superficie de ataque es mucho menor que la de una app nativa, pero sigue existiendo: una extensión con acceso a red puede descargar lo que quiera y pedirte que lo instales.
Qué mira el cliente antes de instalar
Descarga el archivo desde la URL que le diste y verifica que el manifiesto sea válido (nombre, versión, punto de entrada).
Lee la origen declarada: el catálogo de CodeHub publica solo extensiones cuyo código está en un repositorio público. Si la URL apunta a un archivo suelto sin repo detrás, el sello será «Externo».
Compara la versión local con la remota. Si la remota es menor que la instalada, no la sustituye: evitar el downgrade automático es una decisión deliberada.
Por qué a veces falla una extensión aunque el enlace sea válido
El motivo más común es que el servicio que aloja el archivo bloquee la petición del cliente por no ser un navegador. Algunos proveedores de video responden 403 cuando detectan un agente de usuario desconocido o cuando exigen un token de reproducción. CodeBeat no disimula ese error: te devuelve la ruta exacta que falló y el código HTTP, para que sepas si el problema está en la extensión, en el origen o en tu conexión.
Hay extensiones que están marcadas como experimentales precisamente por eso: funcionan hoy con un cliente concreto de ese servicio y dejarán de funcionar cuando el servicio cambie su API privada. Instalar una de esas es una apuesta consciente, no un bug del reproductor.
Cómo actualizar o desinstalar
Cada extensión instalada muestra su versión y su canal de actualización. CodeBeat comprueba la fuente declarada y te avisa cuando aparece una versión nueva; también puedes forzar la comprobación desde los ajustes. La desinstalación borra la extensión y sus datos de sesión locales, pero no toca tus credenciales del navegador ni nada fuera de la app.
Si una extensión te pide iniciar sesión en un servicio de terceros, esa sesión vive en el almacenamiento local del dispositivo y se elimina al desinstalar. No la compartas: el almacenamiento de CodeBeat no está cifrado a nivel de archivo y un dispositivo desbloqueado con acceso físico puede leerlo.
· publicado · Web · lectura 5 min
PWA: qué se instala de verdad en tu teléfono
Cuando un sitio te ofrece «Agregar a pantalla de inicio» no te está instalando una app en el sentido de la Play Store. Es una Progressive Web App, y lo que ocurre por debajo depende del navegador y del sistema operativo. Vale la pena entenderlo, porque la diferencia decide qué esperar del comportamiento offline y de las notificaciones.
El manifiesto y el service worker
Una PWA necesita dos piezas. El manifiesto es un JSON con el nombre, los iconos y el modo de visualización. El service worker es un script que el navegador registra y que queda vivo en segundo plano: intercepta las peticiones de red y puede responder desde una caché cuando no hay conexión.
En Chrome sobre Android, si el sitio cumple los criterios de instalabilidad, el sistema crea una WebAPK: un APK generado localmente que se ve en el cajón de aplicaciones como cualquier otra app. No viene de la tienda, no tiene firma del desarrollador original y no pasa por Play Protect, pero se comporta casi igual: icono propio, pantalla completa, ventana independiente.
Qué significa «funciona sin conexión»
Es mentira y verdad a la vez. Lo que realmente pasa es esto:
Recursos precacheados (HTML, CSS, JS, iconos): sí se cargan sin red, porque el service worker los guardó al abrir el sitio por primera vez.
Datos en vivo (clima, noticias, catálogo): no. Si son peticiones a una API, sin red no hay datos, y un service worker bien escrito debe mostrar un estado honesto de «sin conexión», no una página vieja fingiendo estar actualizada.
Lo que el usuario ya tenía en caché: depende de la política del sitio. Purgar la caché del navegador borra el precache y la próxima visita vuelve a requerir red.
El error clásico: cachear una página que cambia
El fallo más frecuente al escribir un service worker es cachear en modo only-if-cached o con una estrategia de caché primero para todo, incluidas respuestas que cambian a cada segundo. El resultado es que el usuario ve un precio viejo, un marcador viejo o un catálogo desactualizado, y no hay forma de distinguirlo a simple vista. La regla que uso: shell de la app en caché, datos siempre de red, y cuando no hay red, un aviso explícito.
CodeHub se instala como PWA y precachea su propio shell (CSS, JS e iconos), pero cualquier petición a su backend se resuelve contra la red y degrada a un mensaje de sin conexión en lugar de servir contenido viejo.
Cómo desinstalarla por completo
Arrastrar el icono a la papelera no siempre borra todo. En Android, además de quitar el acceso directo, conviene borrar el almacenamiento de la app desde los ajustes del sistema, porque la WebAPK conserva su propio perfil de almacenamiento local y de service worker. Desde el navegador, chrome://serviceworker-internals (o el panel de Aplicaciones en DevTools) deja ver y dar de baja los workers registrados.
· actualizado · /tools · lectura 4 min
Qué corre en tu navegador y qué no
La página de herramientas de CodeHub mezcla dos tipos de utilidades. Conviene saber cuál es cuál antes de pegar un secreto, y también antes de asumir que «es local» significa algo más de lo que significa.
Locales: el cálculo nunca sale de la pestaña
Generador y verificador de contraseñas, codificador y decodificador de Base64, generador de UUID, hashes SHA-256, formateador y validador de JSON, probador de expresiones regulares, temporizador pomodoro y conversor de unidades. En todos esos, el JavaScript se ejecuta en el hilo de la pestaña y no se hace ninguna petición de red con el dato que introduces.
Puedes comprobarlo tú mismo: abre las herramientas de red del navegador, marca «Preserve log», y ve el listado mientras escribes. En las herramientas locales no verás ninguna petición saliente con tu contenido. Esa verificación es la única razón por la que confío en ellas para un borrador.
Con red: lo que viaja y quién lo recibe
Clima, consulta de IP, resolución DNS, traducción, generación de imágenes y el chat WIL.E sí salen de la pestaña. Algunas van a APIs públicas y otras a nuestro backend. Traducir un texto implica que ese texto llegue a un tercero; generar una imagen implica que el prompt lo procese un modelo remoto.
No pongas tokens de cliente, cookies de sesión, documentos privados ni credenciales en esos campos. No porque el sitio las robe, sino porque el proveedor de la función las ve por definición.
Lo que «local» no garantiza
No ofrezco privacidad absoluta. El navegador sigue siendo un entorno donde pueden estar instaladas extensiones, y una extensión con permisos de lectura en la página puede ver lo que escribes en un campo. Para un secreto de producción uso un gestor de contraseñas con bloqueo biométrico, no un generador web, aunque el mío sea local. La herramienta sirve para un borrador rápido o para enseñar cómo se ve una cadena aleatoria de veinte caracteres, no para custodiar una clave maestra.
Si una utilidad pide un permiso del sistema (ubicación para el clima, por ejemplo), es el navegador quien hace la pregunta y quien revoca. CodeHub no instala un servicio oculto ni guarda el resultado. El detalle de cookies y de terceros está en la política de privacidad, y la parte importante es la tabla de proveedores: cada uno con su finalidad y su duración.
· actualizado · Servicios · Guatemala · lectura 4 min
Qué pido cuando cotizo un sitio en Guatemala
Trabajo freelance desde Ciudad de Guatemala, remoto o presencial según el proyecto. Un mensaje útil no es «¿cuánto cuesta una página?»: esa pregunta solo admite una respuesta honesta, que es «depende», y no ayuda a nadie. Necesito alcance para poder dar un número al que puedas aferrarte.
Las cinco preguntas que desbloquean un rango
¿Es una landing, una tienda, un panel interno o un portfolio?
¿Hay marca, textos y fotos, o hay que producirlos desde cero?
¿Quién hospeda y quién pone el dominio? ¿O ya están comprados?
¿Hace falta cobrar en línea, conectar WhatsApp o solo un formulario?
¿Hay fecha de evento o de campaña que no se puede mover?
Con eso armo un rango y te digo qué lo mueve hacia arriba o hacia abajo. El precio sube cuando el contenido llega a destiempo, cuando hay que integrar un ERP o una pasarela con conciliación, o cuando la «fecha» es en tres semanas y el alcance es el de un proyecto de dos meses.
Qué incluye una entrega
No entrego «plantillas infinitas». Entrego un sitio que puedas editar sin llamarme por cada coma: estructura de contenido clara, HTTPS activo, dominio bien apuntado, analítica configurada y un canal de soporte acotado. Ajustes menores después de la entrega sí; rediseño eterno no, porque eso no es soporte, es otro proyecto.
Dónde suele fricción el proceso
En tres puntos, siempre los mismos. Primero, el contenido: el diseño no avanza si los textos y las fotos no llegan, y esa espera se cobra después en prisa. Segundo, las decisiones de marca tardías: cambiar el color principal en la semana de pruebas arrastra retoques en todo el sitio. Tercero, el acceso: sin credenciales del dominio o del hospedaje a tiempo, la publicación se retrasa aunque el desarrollo esté listo.
Contacto por el formulario de la home, por wilson.e360labs@gmail.com o por WhatsApp. El detalle de paquetes y lo que incluye cada uno está en Servicios.
· actualizado · Catálogo /opensource · lectura 5 min
Cómo elijo apps Android de GitHub Releases
El catálogo de CodeHub no es una tienda. Cada ficha apunta al repositorio que yo pude abrir y contrastar: nombre del paquete, actividad reciente, licencia visible y que el APK salga de los Releases del mismo usuario u organización, no de un acortador ni de un archivo anónimo en un servicio de nube.
Por qué instalar fuera de Play implica un riesgo asumido
Android permite instalar APKs de terceros, y eso es útil: hay proyectos de código abierto que jamás entrarían en la tienda por sus políticas, y hay apps útiles cuyo autor no quiere depender de una cuenta de desarrollador. Pero el precio es que no hay revisión previa. Play Protect hace un análisis limitado, y en muchos dispositivos ni siquiera se ejecuta sobre APKs sideloaded.
Por eso filtro sin excepción: mods, apps con «premium desbloqueado», APKs reempaquetados con otro nombre y compilarciones que no coinciden con su README. Si el texto del repositorio y el artefacto del Release no cuadran, no entra en el catálogo.
Lista corta antes de instalar
El dominio de descarga es github.com/…/releases, no un acortador ni un espejo de terceros.
Si el proyecto publica firma o checksum, lo verificas. Un SHA-256 publicado y que no coincide es una señal de alarma, no de un error tuyo.
Los permisos del manifiesto tienen sentido para lo que hace la app: una linterna no necesita contactos.
Hay commits o issues recientes, o al menos una nota del autor de que el proyecto está en mantenimiento mínimo.
El paquete declarado en el manifiesto es el del proyecto original.
Sobre las VPN de la lista
Son clientes de código abierto, y esa es toda la recomendación: puedes leer el código y elegir tú mismo a qué servidor te conectas. No vendo túneles ni prometo que «te vuelves invisible». Una VPN mal configurada, o un servidor gestionado por un tercero, sigue viendo tu tráfico y en muchos casos lo registra. Si necesitas una VPN comercial con jurisdicción y política de registros clara, eso es otra compra aparte: CodeHub no la intermedia.
Windows Enhance, mismo criterio
En la misma sección hay un recuento de herramientas de recuperación de Windows con enlaces a sus repositorios. Tampoco alojamos ejecutables: solo enlazamos la fuente y explicamos para qué sirve cada una.
· actualizado · Seguridad práctica · lectura 5 min
Contraseñas que sí resisten un dump filtrado
La longitud gana a los «símbolos raros» cuando el atacante tiene el hash y puede probar combinaciones. Doce caracteres aleatorios de un alfabeto amplio suelen ser suficientes para una cuenta personal; dieciséis o más para el correo y para lo bancario. Pero el problema real no es la fuerza de una clave individual: es la reutilización.
El escenario real: no es que te «adivinen»
Casi nadie intenta adivinar tu contraseña a mano. Lo que ocurre es que un servicio sufre un filtrado, los hashes terminan en un foro, y alguien ejecuta una lista contra todos ellos. Esa misma clave reutilizada abre tu correo, y con el correo recuperas el resto. Una clave «fea» de ocho caracteres pero única en cada servicio te protege mejor que una clave compleja y repetida en diez sitios.
Qué hago yo, en orden
Genero la clave con el generador de CodeHub o con el del gestor, nunca de memoria.
La copio una vez y va al gestor. No queda en un chat, en una nota del escritorio ni en una captura.
Activo segundo factor donde exista, preferindo una app autenticadora por sobre SMS, que puede ser suplantado por un intercambio de SIM.
Reviso las cuentas viejas y cierro las que ya no uso. Una cuenta abandonada es un vector que no te acuerdas de defender.
Sobre el «verificador de fuerza»
El del sitio estima entropía a ojo: mayúsculas, números, longitud. No detecta si escribiste tu fecha de nacimiento ni si la clave aparece en un filtrado conocido. Úsalo como recordatorio visual, no como auditoría. Si quieres una comprobación real, un buen gestor te avisa cuáles de tus claves aparecieron en incidentes conocidos, sin que tengas que pegarlas en ningún sitio web.
Y una regla sin excepción: nunca pegas una contraseña real en el chat de WIL.E ni en el traductor. Esos textos pueden pasar por un proveedor de IA ajeno al sitio, y una clave pegada por traducción deja de ser tuya.
· actualizado · Comunidad CodeHub · lectura 4 min
Comunidad viva: verificación, avisos y seguridad responsable
CodeHub no busca una audiencia pasiva. Un catálogo de apps que nadie cuestiona es un catálogo en el que cualquiera puede colar algo. Esto es lo que significa tener un espacio comunitario útil sin inflarlo con ruido.
Catálogo verificado: qué promete y qué no
Verificado: la ficha apunta al repositorio oficial, la licencia está visible y el release está enlazado. Significa «comprobé hoy que el enlace, la licencia y el artefacto son del mismo proyecto».
Revisado: el origen y el checksum parcial coinciden, pero todavía falta control manual. Puede cambiar de estado entre revisiones.
Externo: el proyecto se lista por transparencia, y tú terminas la comprobación.
Ninguno de los tres sellos dice «segura para todo el mundo». Dicen qué pude comprobar y cuándo.
La tabla completa de criterios y sus limitaciones está en Comunidad. El punto que más insisto: el sello no sustituye una auditoría de seguridad del código, y quien instala un APK de terceros asume ese riesgo aunque el catálogo lo haya revisado.
Avisos sin spam
Las novedades relevantes se publican como releases. El ritmo recomendado es un anuncio por lanzamiento importante o una nota por incidente. La comunidad no espera cadencia diaria: espera señales de que el sitio sigue mantenida y de que los cambios tienen documentos detrás.
Prioridad alta: seguridad, descarga incorrecta, regresión de la PWA.
Prioridad media: nueva guía, nueva app en el catálogo o mejora visual pública.
Prioridad baja: cambios internos que no afectan a quien lee o instala.
Seguridad corresponsable
Si encuentras una vulnerabilidad, envía el resumen, la página o endpoint afectado y el impacto real a wilson.e360labs@gmail.com. No hará falta lanzar ataques ni automatizar escaneo masivo para validar el problema; con la reproducción mínima basta.
La respuesta no es inmediata porque el proyecto se mantiene junto con otros servicios, pero el reporte debe ser claro y humano: zona afectada, versión visible y pasos reproducibles. Un reporte sin eso obliga a adivinar, y adivinar cuesta días.
· actualizado · CSS · /flexbox-labs · lectura 3 min
Flexbox: un eje, no un grid
Flexbox alinea hijos en una fila o una columna, y esa es toda su fuerza: resuelve con poco código las barras de navegación, los chips, los grupos de botones y los centrados que en la tabla de propiedades antiguas costaban tres declaraciones y un comment de resignación.
Cuándo flex y cuándo grid
Cuando el diseño se piensa en un eje (empujar algo a la derecha, apilar en columna, repartir con el mismo hueco), flex. Cuando el diseño es una matriz de celdas (galería, un panel de doce columnas, cualquier cosa que describas como «n filas de m elementos»), grid ahorra anidaciones y evita que el HTML termine lleno de contenedores de relleno que no significan nada.
En CodeHub incrusto Flexbox Labs (MIT, prazzon) para que puedas mover sliders y ver el CSS generado. Ese playground no lo escribí yo: si el iframe no carga, usa el enlace de abrir en pestaña nueva. Lo que sí es mío es cuándo recomiendo cada uno — flex en el encabezado y en el menú, grid en el listado de tarjetas.
El error que más veo: min-width: 0
Un hijo de flex o grid tiene min-width: auto por defecto, lo que significa que no puede encogerse por debajo de su contenido. Si dentro hay texto largo, una tabla, un pre o un code sin espacios, el elemento empuja el layout y aparece el scroll horizontal de toda la página.
Ese minmax(0, 1fr) y ese min-width: 0 son la diferencia entre un grid que se adapta y uno que se desborda. Es la regla que sigo en todo el sitio, y es la razón por la que las tablas y los bloques de código no rompen la vista en pantallas angostas.