Skip to content
Juan Carlos Angulo

Construyo software rápido y hago que se encuentre en Google

Ingeniería de software y SEO técnico, trabajados como una sola disciplina, no por separado.

Juan Carlos Angulo, ingeniero de software y consultor SEO técnico

Who I have worked with

SEO15

money.com logo
Miami Herald logo
Holafly logo
Souma Hotel Lima logo
TheSmokyRolling logo
DSLX logo
Vallas Venezuela logo
TheSmokyBox logo
Florida Health Care Academy logo
Delta Cloudz logo
Tursi Digital Nomads logo
The Sosa Team logo
Florida Top Roofs logo
Felipe Vergara logo
Storybook app logo

Development13

Luxembourg Philharmonie Logo
Arianna Lupi logo
Apturio logo
Childrenchic logo
TuMundoSalud logo
Crédito USS logo
Wiñaypaq logo
Dr. Manuel A. Vargas Hidalgo logo
Puntada con Amor logo
Aprendoclub logo
Pro Torque Diesel Logo
Cresory Logo
Estylopia logo

Real bugs, with the commit that fixes them

Every one of these was a problem on this site, and below each is the exact change that resolved it. The repository is public, so you can open the commit and read the whole thing, not just the part I chose to show.

See the full repository

Google was getting two hreflang annotations that contradicted each other

next-intl's middleware builds its alternates from the locale prefix: it takes the pathname and puts /en in front of it. That is right for every template sharing a slug across languages, and wrong for the only one with a translated slug, /servicios against /en/services. On /servicios it advertised /en/servicios in the header, a URL that resolves but whose canonical points somewhere else, so the same response argued with itself.

src/middleware.tsts
return stripIntlAlternateLinks(intlMiddleware(request))

function stripIntlAlternateLinks(response: NextResponse): NextResponse {
  const link = response.headers.get('link')
  if (!link) return response

  const kept = link
    .split(/,\s*(?=<)/)
    .filter((entry) => !/rel="?alternate"?/i.test(entry))
    .join(', ')

  if (kept) {
    response.headers.set('link', kept)
  } else {
    response.headers.delete('link')
  }

  return response
}
23646a1

One annotation, the one in the head

The sitemap was returning 500s and an empty urlset in production

It ran five queries in Promise.all plus a sixth in sequence, up to six simultaneous connections against the direct Postgres connection, the one that does not go through the pooler. Under that pressure the whole file fell over and what got served was the empty fallback the route already had wired for exactly this case.

src/lib/sitemap-data.tsts
const getCachedSitemapEntries = unstable_cache(
  fetchSitemapEntries,
  ['sitemap-entries'],
  {
    tags: [CACHE_TAGS.posts(), CACHE_TAGS.caseStudies(), CACHE_TAGS.categories()],
    // Crawlers read the sitemap on their own schedule, so a slightly stale
    // listing costs nothing while a failed request under DB pressure costs
    // the whole file.
    revalidate: 900,
  },
)
6849e95

From 6 connections to 1 cached query

Images were served as WebP even when the browser accepted AVIF

Next's formats array listed WebP and nothing else. Next returns the first format in that list the request's Accept header allows, so with a single entry there was never anything better to pick, no matter what the browser was asking for.

next.config.mjsjs
images: {
  // AVIF first, WebP as the fallback for anything that cannot decode it.
  // Next picks the first entry the request's `Accept` header allows.
  formats: ['image/avif', 'image/webp'],
},
4f8942e

AVIF served wherever the browser takes it

I built my own SEO auditor

It's the same tool I use on my own projects and my clients', I don't sell it as a service, it's software I built and I keep running in production.

29

technical checks

5

categories

500

URLs per audit

CWV

Core Web Vitals (PageSpeed Insights)

Try the auditor (opens in a new tab)

Free tier: 1 audit per week, per verified email.

Mi enfoque en Consultoría Técnica

No veo el SEO y el desarrollo web como disciplinas aisladas. Los motores de búsqueda modernos evalúan la limpieza del código, la velocidad de carga y la arquitectura de la información, y por eso construyo sobre Next.js y CMS headless como Payload, con el SEO técnico diseñado en el código desde el primer commit en vez de parchado después con plugins genéricos sobre un WordPress estándar. Mi metodología parte de auditar antes de construir, hasta que la infraestructura técnica se vuelve el motor principal del crecimiento orgánico y tu web no solo funciona bien, sino que gana terreno real en los resultados de búsqueda.

Juan Carlos Angulo dando el taller de SEO técnico, con la diapositiva de introducción al SEO técnico detrás

SEO Técnico

Auditoría profunda de infraestructura, rendering y datos estructurados (Schema) para mejorar la visibilidad en buscadores.

Rendimiento web

Mi obsesión es el 100/100. Optimizo la ruta crítica de renderizado para que la carga se sienta prácticamente inmediata.

Arquitectura escalable

Diseño sistemas modulares y limpios sobre Next.js y CMS headless como Payload: código propio, auditable y mantenible, sin builders ni plugins de terceros, que le permite al proyecto crecer sin acumular deuda técnica.

Ingeniería de UX

Construyo interfaces adaptables y accesibles (A11Y), con un enfoque mobile-first real: no solo visual, funcional también.

We start with a technical audit

I go through crawling, indexing, rendering, Core Web Vitals and structured data against your code, not against whatever an automated report says. You get the problems ranked by impact and, next to each one, the specific fix it needs.

  • Crawling and indexing: what Google sees of your site and what it is missing
  • Rendering: what depends on JavaScript and what already ships in the HTML
  • Core Web Vitals measured in the field, not only in the lab
  • Structured data, validated against what the site actually emits
  • Every problem with its concrete fix, ranked by impact

600 USD

Full technical SEO audit

Delivered in 10 working days

If you hire me for the implementation afterwards, those 600 come off the work. The audit is not a separate product, it is where I start.

Contacto

Hablemos

¿Tienes un proyecto en mente? Cuéntame de qué se trata.

Charlemos sobre tu próximo proyecto

Disponible para consultoría en ingeniería de software y SEO técnico.

Suelo responder en menos de 48 horas.