Tu web va lenta o se ha quedado vieja: la arreglo o te la hago nueva

Primero la reviso gratis y te digo qué le pasa. Si tiene arreglo, te paso un presupuesto cerrado. Si sale mejor hacerla nueva, la rehago con uno de los planes, paso tu contenido y mantengo tus visitas de Google sin coste extra.

Para quién es

  • Webs que tardan en cargar y pierden visitas por ello
  • Webs donde actualizar un plugin da miedo
  • Quien ha perdido posiciones en Google desde el último cambio

Para quién no es

  • Webs recién hechas cuyo problema es el contenido y no el código
  • Tiendas con lógica compleja de WooCommerce: para eso está el desarrollo a medida

Cómo lo hago

Lo que cambio cuando reviso una web.

Siete ejemplos del tipo de cambio que sale de una revisión. A la izquierda lo que suele haber; a la derecha lo que dejo. El código es de ejemplo: los problemas son los de siempre.

Elige un arreglo
Rendimiento3
Accesibilidad2
Seguridad2
Tema del editor
index.htmlcss/listado.csssrc/lib/listado.tspartials/menu.htmlcontacto.htmlwp-content/themes/casa/tarjeta.phpsrc/pages/api/contacto.ts
Antes y después de index.html
                     <!-- Portada: la imagen es lo primero que se pinta. --> <section class="hero grid gap-6 py-24">-  <img src="portada.jpg" class="w-full rounded-xl">+  <img src="portada.avif" class="w-full rounded-xl"+       width="1600" height="900" decoding="async"+       fetchpriority="high" alt="Cocina en Chamberí">   <h1 class="text-5xl font-semibold tracking-tight">     Reformas integrales en Madrid, sin sorpresas   </h1>   <p class="max-w-prose text-lg text-neutral-400">     Presupuesto cerrado en 48 horas laborables.   </p>   <a href="/contacto" class="btn">Pedir presupuesto</a> </section>
                  
Antes y después de css/listado.css
                     .listado { display: grid; gap: 1rem; } -/* Tres saltos, y ninguno sabe cuánto sitio hay. */+/* La tarjeta mide su hueco, no la ventana. */-.tarjeta { padding: 16px; font-size: 18px; }+.listado { container-type: inline-size; }-+-@media (max-width: 900px) {+.tarjeta {-  .tarjeta { padding: 12px; font-size: 16px; }+  padding: clamp(0.5rem, 2cqi, 1rem);-}+  font-size: clamp(0.875rem, 1.6cqi, 1.125rem);-+  border-radius: clamp(0.25rem, 1cqi, 0.75rem);-@media (max-width: 600px) {+}-  .tarjeta { padding: 8px; font-size: 14px; }+-}+@container (min-width: 30rem) {+  .tarjeta { grid-template-columns: 8rem 1fr; }+}
                  
Antes y después de src/lib/listado.ts
                     export async function cargarListado() {   const items = await db.producto.findMany({     where: { activo: true },+    // La categoría entra en la misma ida.+    include: { categoria: true },   }); -  // Una consulta, y luego otra por item.-  for (const item of items) {-    item.categoria = await db.categoria-      .findUnique({ id: item.categoriaId });-  }    return items; }
                  
Antes y después de partials/menu.html
                    -<div class="menu__abrir"+<button class="menu__abrir"-     onclick="abrirMenu()">+        type="button"+        aria-expanded="false"+        aria-controls="menu">+  <span class="sr-only">Abrir el menú</span>   <span></span>   <span></span>-</div>+</button>  <nav id="menu" class="menu">   <a href="/servicios">Servicios</a>   <a href="/proyectos">Proyectos</a>   <a href="/precios">Precios</a>   <a href="/contacto">Contacto</a> </nav>
                  
Antes y después de contacto.html
                     <form method="post" action="/contacto">   <label for="email">Correo</label>-  <input id="email" type="email"+  <input id="email" type="email"-         name="email">+         name="email"+         aria-invalid="true"+         aria-describedby="email-error"> -  <span class="error">+  <span class="error" id="email-error"+        role="alert">     Escribe un correo válido   </span>    <button type="submit">Enviar</button> </form>
                  
Antes y después de wp-content/themes/casa/tarjeta.php
                     <section class="listado"> <?php foreach ( $productos as $p ) : ?> <article class="tarjeta">-  <img src="<?php echo $p['imagen']; ?>" alt="">+  <img src="<?php echo esc_url( $p['imagen'] ); ?>"-  <h2><?php echo $p['nombre']; ?></h2>+       alt="<?php echo esc_attr( $p['nombre'] ); ?>">-  <p><?php echo $p['descripcion']; ?></p>+  <h2><?php echo esc_html( $p['nombre'] ); ?></h2>-  <a href="<?php echo $p['url']; ?>">+  <p><?php echo wp_kses_post( $p['descripcion'] ); ?></p>-    Ver ficha de <?php echo $p['nombre']; ?>+  <a href="<?php echo esc_url( $p['url'] ); ?>">-  </a>+    Ver ficha de <?php echo esc_html( $p['nombre'] ); ?>+  </a> </article> <?php endforeach; ?> </section>
                  
Antes y después de src/pages/api/contacto.ts
                     // El esquema estaba escrito y no lo miraba nadie. const Lead = z.object({   nombre: z.string().min(2).max(80),   email: z.email(),   mensaje: z.string().min(10).max(2000), });  export async function POST({ request }) {-  const datos = await request.json();+  const lead = Lead.safeParse(await request.json());-  await guardarLead(datos);+  if (!lead.success) {+    return new Response(null, { status: 422 });+  }+  await guardarLead(lead.data);   return new Response(null, { status: 204 }); }
                  

Por dónde empezar

  1. Primero

    Radiografía de tu web

    gratis

    Te miro la web y en menos de 48 horas laborables te digo qué le pasa y qué arreglaría primero.

    Pedir radiografía
  2. Después

    Rehacer tu web vieja

    590 €desde

    Si la tuya no tiene arreglo, la rehago con uno de los planes. Paso tu contenido y mantengo tus visitas de Google sin coste extra.

    Pedir presupuesto gratis
  3. Para que dure

    Mantenimiento continuo

    49 €al mes

    Copias, actualizaciones, seguridad y aviso si la web se cae, desde el primer mes. Tres tramos, según cuánto quieras cambiar cada mes.

    Ver precios

Para leer antes de decidir

¿Hablamos de tu proyecto?

Cuéntame qué necesitas y te doy una primera valoración en menos de 24 horas laborables.

Respuesta en 24 h laborables

O escríbeme por el formulario