From 5803dbc230e4ede2c27666c37d40c76f9aacabcb Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 18:30:58 +0500 Subject: [PATCH 1/3] fix(seo): use the www address in canonicals, sitemap and robots The bare domain redirects to www, so every canonical, sitemap entry and the robots Sitemap line pointed at an address that bounces. SITE_URL is now the www address, and the sitemap and machine-readable files use it. --- app/agent-markdown/route.ts | 16 ++++++------- app/dwosi/page.tsx | 2 +- app/links/page.tsx | 2 +- app/llms-full.txt/route.ts | 48 ++++++++++++++++++------------------- app/llms.txt/route.ts | 28 +++++++++++----------- app/sitemap.ts | 4 +++- lib/seo.ts | 3 ++- 7 files changed, 53 insertions(+), 50 deletions(-) diff --git a/app/agent-markdown/route.ts b/app/agent-markdown/route.ts index 006d297..ce351d9 100644 --- a/app/agent-markdown/route.ts +++ b/app/agent-markdown/route.ts @@ -30,18 +30,18 @@ Everything at Dev Weekends is free for the community. Our core mission is to mak ## Primary links -- Website: https://devweekends.com -- Sessions: https://devweekends.com/sessions -- Community: https://devweekends.com/community -- Mentorship: https://devweekends.com/mentorship -- Projects: https://devweekends.com/projects +- Website: https://www.devweekends.com +- Sessions: https://www.devweekends.com/sessions +- Community: https://www.devweekends.com/community +- Mentorship: https://www.devweekends.com/mentorship +- Projects: https://www.devweekends.com/projects ## Agent and machine-readable discovery - Requested path: ${sourcePath} -- llms.txt: https://devweekends.com/llms.txt -- API catalog: https://devweekends.com/.well-known/api-catalog -- Agent skills index: https://devweekends.com/.well-known/agent-skills/index.json +- llms.txt: https://www.devweekends.com/llms.txt +- API catalog: https://www.devweekends.com/.well-known/api-catalog +- Agent skills index: https://www.devweekends.com/.well-known/agent-skills/index.json ` return new NextResponse(markdown, { diff --git a/app/dwosi/page.tsx b/app/dwosi/page.tsx index 75b0550..14aa135 100644 --- a/app/dwosi/page.tsx +++ b/app/dwosi/page.tsx @@ -28,7 +28,7 @@ export const metadata: Metadata = { siteName: "Dev Weekends", title, description, - url: "https://devweekends.com/dwosi", + url: "https://www.devweekends.com/dwosi", images: [{ url: "/og-image.jpg", width: 1200, height: 630, alt: "Dev Weekends" }], }, twitter: { diff --git a/app/links/page.tsx b/app/links/page.tsx index 14aed6d..bd3be84 100644 --- a/app/links/page.tsx +++ b/app/links/page.tsx @@ -27,7 +27,7 @@ export const metadata: Metadata = { openGraph: { title: "Dev Weekends | Links", description: "Find and join the right Dev Weekends community in one tap.", - url: "https://devweekends.com/links", + url: "https://www.devweekends.com/links", images: ["/og-image.jpg"], }, } diff --git a/app/llms-full.txt/route.ts b/app/llms-full.txt/route.ts index 1a77839..cdd5d16 100644 --- a/app/llms-full.txt/route.ts +++ b/app/llms-full.txt/route.ts @@ -5,37 +5,37 @@ export function GET() { ## Organization Name: Dev Weekends -Website: https://devweekends.com +Website: https://www.devweekends.com Description: Community-driven software engineering education through weekend sessions, mentorship, project building, and tech initiatives. ## Public Website URLs -- https://devweekends.com/ -- https://devweekends.com/team -- https://devweekends.com/community -- https://devweekends.com/sessions -- https://devweekends.com/projects -- https://devweekends.com/mentorship -- https://devweekends.com/mentor -- https://devweekends.com/testimonials -- https://devweekends.com/ambassadors -- https://devweekends.com/ambassador-program -- https://devweekends.com/fellowship -- https://devweekends.com/network +- https://www.devweekends.com/ +- https://www.devweekends.com/team +- https://www.devweekends.com/community +- https://www.devweekends.com/sessions +- https://www.devweekends.com/projects +- https://www.devweekends.com/mentorship +- https://www.devweekends.com/mentor +- https://www.devweekends.com/testimonials +- https://www.devweekends.com/ambassadors +- https://www.devweekends.com/ambassador-program +- https://www.devweekends.com/fellowship +- https://www.devweekends.com/network ## Program URLs -- https://devweekends.com/dsoc -- https://devweekends.com/dsoc/projects -- https://devweekends.com/dsoc/register +- https://www.devweekends.com/dsoc +- https://www.devweekends.com/dsoc/projects +- https://www.devweekends.com/dsoc/register ## Discovery and Interoperability -- robots.txt: https://devweekends.com/robots.txt -- sitemap.xml: https://devweekends.com/sitemap.xml -- llms.txt: https://devweekends.com/llms.txt -- API Catalog: https://devweekends.com/.well-known/api-catalog -- OpenAPI: https://devweekends.com/openapi.json -- API Documentation: https://devweekends.com/api-docs -- API Health: https://devweekends.com/api/health -- Agent Skills Index: https://devweekends.com/.well-known/agent-skills/index.json +- robots.txt: https://www.devweekends.com/robots.txt +- sitemap.xml: https://www.devweekends.com/sitemap.xml +- llms.txt: https://www.devweekends.com/llms.txt +- API Catalog: https://www.devweekends.com/.well-known/api-catalog +- OpenAPI: https://www.devweekends.com/openapi.json +- API Documentation: https://www.devweekends.com/api-docs +- API Health: https://www.devweekends.com/api/health +- Agent Skills Index: https://www.devweekends.com/.well-known/agent-skills/index.json ## AI Preferences Content-Signal: ai-train=no, search=yes, ai-input=no diff --git a/app/llms.txt/route.ts b/app/llms.txt/route.ts index f134b73..0fef1f2 100644 --- a/app/llms.txt/route.ts +++ b/app/llms.txt/route.ts @@ -4,24 +4,24 @@ export function GET() { const body = `# Dev Weekends > Dev Weekends is a learning community for software engineers with events, mentorship, projects, and career growth programs. -Canonical: https://devweekends.com -Sitemap: https://devweekends.com/sitemap.xml -Robots: https://devweekends.com/robots.txt +Canonical: https://www.devweekends.com +Sitemap: https://www.devweekends.com/sitemap.xml +Robots: https://www.devweekends.com/robots.txt ## Primary Pages -- Home: https://devweekends.com/ -- Team and story: https://devweekends.com/team -- Sessions: https://devweekends.com/sessions -- Community: https://devweekends.com/community -- Links: https://devweekends.com/links -- Projects: https://devweekends.com/projects -- Mentorship: https://devweekends.com/mentorship +- Home: https://www.devweekends.com/ +- Team and story: https://www.devweekends.com/team +- Sessions: https://www.devweekends.com/sessions +- Community: https://www.devweekends.com/community +- Links: https://www.devweekends.com/links +- Projects: https://www.devweekends.com/projects +- Mentorship: https://www.devweekends.com/mentorship ## Machine-Readable Discovery -- API Catalog (RFC 9727): https://devweekends.com/.well-known/api-catalog -- OpenAPI: https://devweekends.com/openapi.json -- API Health: https://devweekends.com/api/health -- Agent Skills Index: https://devweekends.com/.well-known/agent-skills/index.json +- API Catalog (RFC 9727): https://www.devweekends.com/.well-known/api-catalog +- OpenAPI: https://www.devweekends.com/openapi.json +- API Health: https://www.devweekends.com/api/health +- Agent Skills Index: https://www.devweekends.com/.well-known/agent-skills/index.json ## Content Preferences - Content-Signal: ai-train=no, search=yes, ai-input=no diff --git a/app/sitemap.ts b/app/sitemap.ts index 96a02c0..f98202c 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -3,7 +3,9 @@ import path from 'path' import matter from 'gray-matter' import { MetadataRoute } from 'next' -const baseUrl = 'https://devweekends.com' +import { SITE_URL } from '@/lib/seo' + +const baseUrl = SITE_URL type Entry = { path: string diff --git a/lib/seo.ts b/lib/seo.ts index 565a914..3e5fd67 100644 --- a/lib/seo.ts +++ b/lib/seo.ts @@ -5,7 +5,8 @@ import type { Metadata } from 'next' -export const SITE_URL = 'https://devweekends.com' +// The live site answers on www; the bare domain redirects there +export const SITE_URL = 'https://www.devweekends.com' export const SITE_NAME = 'Dev Weekends' export const SITE_TAGLINE = 'Great engineers. Greater impact.' From a587796f835c43979183c710d2d89f38061868f8 Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 18:30:58 +0500 Subject: [PATCH 2/3] fix(seo): lead the home title with the tagline and set og:url The default title and description still said "Your Gateway to becoming a better Software Engineer". They now lead with "Great engineers. Greater impact.", the home page gets og:url through withSocial, and metadataBase reads SITE_URL. --- app/layout.tsx | 16 ++++++++-------- app/page.tsx | 11 ++++++++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index bf90253..799b5ae 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -8,7 +8,7 @@ import Script from 'next/script' import { Analytics } from "@/components/analytics" import { SiteHeader } from "@/components/site-header" import { dwosiThemeScript } from "@/app/dwosi/theme" -import { jsonLdString, siteJsonLd } from "@/lib/seo" +import { SITE_URL, jsonLdString, siteJsonLd } from "@/lib/seo" const inter = Inter({ subsets: ["latin"], display: "swap" }) @@ -16,12 +16,12 @@ const inter = Inter({ subsets: ["latin"], display: "swap" }) const gaId = process.env.NEXT_PUBLIC_GA_ID export const metadata: Metadata = { - metadataBase: new URL('https://devweekends.com'), + metadataBase: new URL(SITE_URL), title: { - default: "Dev Weekends - Your Gateway to becoming a better Software Engineer", + default: "Dev Weekends | Great engineers. Greater impact.", template: "%s | Dev Weekends" }, - description: "Join a thriving community of students and tech enthusiasts learning, building, and growing together through weekend events and bootcamps. Learn from industry experts and enhance your skills in various tech domains.", + description: "Great engineers. Greater impact. Dev Weekends is a free community of engineers with programs, mentorship, open source and partnerships that open doors to the world.", keywords: ["software engineering", "tech community", "coding bootcamp", "mentorship", "tech events", "developer community", "programming", "software development", "tech learning", "career development"], authors: [{ name: "Dev Weekends Team" }], creator: "Dev Weekends", @@ -46,14 +46,14 @@ export const metadata: Metadata = { openGraph: { type: "website", locale: "en_US", - title: "Dev Weekends - Your Gateway to becoming a better Software Engineer", - description: "Join a thriving community of students and tech enthusiasts learning, building, and growing together through weekend events and bootcamps.", + title: "Dev Weekends | Great engineers. Greater impact.", + description: "Great engineers. Greater impact. Dev Weekends is a free community of engineers with programs, mentorship, open source and partnerships that open doors to the world.", siteName: "Dev Weekends", }, twitter: { card: "summary_large_image", - title: "Dev Weekends - Your Gateway to becoming a better Software Engineer", - description: "Join a thriving community of students and tech enthusiasts learning, building, and growing together through weekend events and bootcamps.", + title: "Dev Weekends | Great engineers. Greater impact.", + description: "Great engineers. Greater impact. Dev Weekends is a free community of engineers with programs, mentorship, open source and partnerships that open doors to the world.", creator: "@devweekends", }, robots: { diff --git a/app/page.tsx b/app/page.tsx index 7f5653a..cdeead7 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,4 +1,4 @@ -import type { Metadata } from "next" +import { withSocial } from "@/lib/seo" import { Communities, Products } from "@/components/home/sections-mid" import { Partnerships, Qantara, Resources, Voices } from "@/components/home/sections-bottom" @@ -6,11 +6,16 @@ import { StartHere } from "@/components/site/start-here" import { Hero, Impact, Network, Outcomes, Reach } from "@/components/home/sections-top" import "./home.css" -export const metadata: Metadata = { +const title = "Dev Weekends | Great engineers. Greater impact." + +export const metadata = withSocial({ + title: { absolute: title }, description: "Great engineers. Greater impact. Dev Weekends is a free community of engineers with programs, mentorship, open source and partnerships that open doors to the world.", alternates: { canonical: "/" }, -} + openGraph: { title }, + twitter: { title }, +}) /** The header and footer come from the root layout, shared with every other page. */ export default function HomePage() { From d02c9e53cf8ceb54787626baf5df994fe0740883 Mon Sep 17 00:00:00 2001 From: Zeeshan Adil Date: Wed, 28 Oct 2026 18:30:59 +0500 Subject: [PATCH 3/3] fix(seo): give DSOC pages their own canonicals The DSOC pages are client components, so their metadata comes from layouts. /dsoc, /dsoc/projects and /dsoc/register each get a canonical and a full title, and the sign in page is noindex. --- app/dsoc/layout.tsx | 1 + app/dsoc/login/layout.tsx | 13 +++++++++++++ app/dsoc/projects/layout.tsx | 11 +++++++++++ app/dsoc/register/layout.tsx | 11 +++++++++++ 4 files changed, 36 insertions(+) create mode 100644 app/dsoc/login/layout.tsx create mode 100644 app/dsoc/projects/layout.tsx create mode 100644 app/dsoc/register/layout.tsx diff --git a/app/dsoc/layout.tsx b/app/dsoc/layout.tsx index 4339d85..a20b214 100644 --- a/app/dsoc/layout.tsx +++ b/app/dsoc/layout.tsx @@ -7,6 +7,7 @@ export const metadata: Metadata = { title: "DSOC: Dev Weekends Summer of Code", description: "Dev Weekends Summer of Code (DSOC) is a mentored open source program with a monthly stipend per milestone. 2026 applications are closed.", + alternates: { canonical: "/dsoc" }, } export default function DsocLayout({ children }: { children: ReactNode }) { diff --git a/app/dsoc/login/layout.tsx b/app/dsoc/login/layout.tsx new file mode 100644 index 0000000..ceeb5aa --- /dev/null +++ b/app/dsoc/login/layout.tsx @@ -0,0 +1,13 @@ +import type { Metadata } from "next" +import type { ReactNode } from "react" + +// A sign-in screen has nothing to rank for +export const metadata: Metadata = { + title: { absolute: "DSOC sign in | Dev Weekends" }, + alternates: { canonical: "/dsoc/login" }, + robots: { index: false, follow: false }, +} + +export default function DsocLoginLayout({ children }: { children: ReactNode }) { + return children +} diff --git a/app/dsoc/projects/layout.tsx b/app/dsoc/projects/layout.tsx new file mode 100644 index 0000000..658467e --- /dev/null +++ b/app/dsoc/projects/layout.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next" +import type { ReactNode } from "react" + +export const metadata: Metadata = { + title: { absolute: "DSOC projects | Dev Weekends" }, + alternates: { canonical: "/dsoc/projects" }, +} + +export default function DsocProjectsLayout({ children }: { children: ReactNode }) { + return children +} diff --git a/app/dsoc/register/layout.tsx b/app/dsoc/register/layout.tsx new file mode 100644 index 0000000..7a132c3 --- /dev/null +++ b/app/dsoc/register/layout.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next" +import type { ReactNode } from "react" + +export const metadata: Metadata = { + title: { absolute: "DSOC registration | Dev Weekends" }, + alternates: { canonical: "/dsoc/register" }, +} + +export default function DsocRegisterLayout({ children }: { children: ReactNode }) { + return children +}