chore: added rel=me df61fae3
Steve Simkins · 2026-07-20 22:41 3 file(s) · +22 −3
src/components/layout/BaseHead.astro +3 −0
63 63
<link rel="alternate" type="application/rss+xml" title={siteConfig.title} href={new URL("rss.xml", Astro.site)}
64 64
 />
65 65
66 +
<!-- Webmention endpoint -->
67 +
<link rel="webmention" href={new URL("api/webmention", Astro.site)} />
68 +
66 69
<!-- Standard.site document verification -->
67 70
{atUri && <link rel="site.standard.document" href={atUri} />}
68 71
<link rel="site.standard.publication" href="at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.publication/3mbykzswhqc2x" />
src/data/constants.ts +7 −0
118 118
	name: string;
119 119
	href: string;
120 120
	external?: boolean;
121 +
	// rel="me" for IndieWeb identity verification on profile links
122 +
	me?: boolean;
121 123
	icon: string;
122 124
};
123 125
134 136
		key: "email",
135 137
		name: "Email",
136 138
		href: "mailto:contact@stevedylan.dev",
139 +
		me: true,
137 140
		icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 256 256"><path fill="currentColor" d="M224 48H32a8 8 0 0 0-8 8v136a16 16 0 0 0 16 16h176a16 16 0 0 0 16-16V56a8 8 0 0 0-8-8m-96 85.15L52.57 64h150.86ZM98.71 128L40 181.81V74.19Zm11.84 10.85l12 11.05a8 8 0 0 0 10.82 0l12-11.05l58 53.15H52.57ZM157.29 128L216 74.18v107.64Z"/></svg>`,
138 141
	},
139 142
	{
162 165
		name: "ATProto",
163 166
		href: `https://pdsls.dev/at://${OWNER_DID}`,
164 167
		external: true,
168 +
		me: true,
165 169
		icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 256 256"><path fill="currentColor" d="M128 24a104 104 0 0 0 0 208c21.51 0 44.1-6.48 60.43-17.33a8 8 0 0 0-8.86-13.33C166 210.38 146.21 216 128 216a88 88 0 1 1 88-88c0 26.45-10.88 32-20 32s-20-5.55-20-32V88a8 8 0 0 0-16 0v4.26a48 48 0 1 0 5.93 65.1c6 12 16.35 18.64 30.07 18.64c22.54 0 36-17.94 36-48A104.11 104.11 0 0 0 128 24m0 136a32 32 0 1 1 32-32a32 32 0 0 1-32 32"/></svg>`,
166 170
	},
167 171
	{
169 173
		name: "GitHub",
170 174
		href: "https://github.com/stevedylandev",
171 175
		external: true,
176 +
		me: true,
172 177
		icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 256 256"><path fill="currentColor" d="M208.31 75.68A59.78 59.78 0 0 0 202.93 28a8 8 0 0 0-6.93-4a59.75 59.75 0 0 0-48 24h-24a59.75 59.75 0 0 0-48-24a8 8 0 0 0-6.93 4a59.78 59.78 0 0 0-5.38 47.68A58.14 58.14 0 0 0 56 104v8a56.06 56.06 0 0 0 48.44 55.47A39.8 39.8 0 0 0 96 192v8H72a24 24 0 0 1-24-24a40 40 0 0 0-40-40a8 8 0 0 0 0 16a24 24 0 0 1 24 24a40 40 0 0 0 40 40h24v16a8 8 0 0 0 16 0v-40a24 24 0 0 1 48 0v40a8 8 0 0 0 16 0v-40a39.8 39.8 0 0 0-8.44-24.53A56.06 56.06 0 0 0 216 112v-8a58.14 58.14 0 0 0-7.69-28.32M200 112a40 40 0 0 1-40 40h-48a40 40 0 0 1-40-40v-8a41.74 41.74 0 0 1 6.9-22.48a8 8 0 0 0 1.1-7.69a43.8 43.8 0 0 1 .79-33.58a43.88 43.88 0 0 1 32.32 20.06a8 8 0 0 0 6.71 3.69h32.35a8 8 0 0 0 6.74-3.69a43.87 43.87 0 0 1 32.32-20.06a43.8 43.8 0 0 1 .77 33.58a8.09 8.09 0 0 0 1 7.65a41.7 41.7 0 0 1 7 22.52Z"/></svg>`,
173 178
	},
174 179
	{
176 181
		name: "LinkedIn",
177 182
		href: "https://www.linkedin.com/in/steve-simkins/",
178 183
		external: true,
184 +
		me: true,
179 185
		icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 256 256"><path fill="currentColor" d="M216 24H40a16 16 0 0 0-16 16v176a16 16 0 0 0 16 16h176a16 16 0 0 0 16-16V40a16 16 0 0 0-16-16m0 192H40V40h176zM96 112v64a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0m88 28v36a8 8 0 0 1-16 0v-36a20 20 0 0 0-40 0v36a8 8 0 0 1-16 0v-64a8 8 0 0 1 15.79-1.78A36 36 0 0 1 184 140m-84-56a12 12 0 1 1-12-12a12 12 0 0 1 12 12"/></svg>`,
180 186
	},
181 187
	// {
196 202
		key: "photos",
197 203
		name: "Photos",
198 204
		href: "https://steve.photo",
205 +
		me: true,
199 206
		icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 256 256"><path fill="currentColor" d="M216 40H40a16 16 0 0 0-16 16v144a16 16 0 0 0 16 16h176a16 16 0 0 0 16-16V56a16 16 0 0 0-16-16m0 16v102.75l-26.07-26.06a16 16 0 0 0-22.63 0l-20 20l-44-44a16 16 0 0 0-22.62 0L40 149.37V56ZM40 172l52-52l80 80H40Zm176 28h-21.37l-36-36l20-20L216 181.38zm-72-100a12 12 0 1 1 12 12a12 12 0 0 1-12-12"/></svg>`,
200 207
	},
201 208
];
src/pages/links.astro +12 −3
13 13
    <h1 class="title mb-6">/links</h1>
14 14
    <ul class="flex flex-col items-start gap-x-4 sm:flex-initial">
15 15
      {
16 -
        SOCIAL_ITEMS.map((link) => (
16 +
        SOCIAL_ITEMS.map((link) => {
17 +
          const rel = [
18 +
            link.external && "noopener",
19 +
            link.external && "noreferrer",
20 +
            link.me && "me",
21 +
          ]
22 +
            .filter(Boolean)
23 +
            .join(" ");
24 +
          return (
17 25
          <li>
18 26
            <a
19 27
              class="flex items-center gap-4 p-2 sm:hover:text-link"
20 28
              href={link.href}
21 29
              target={link.external ? "_blank" : undefined}
22 -
              rel={link.external ? "noopener noreferrer" : undefined}
30 +
              rel={rel || undefined}
23 31
            >
24 32
              <Fragment set:html={link.icon} />
25 33
              {link.name}
26 34
              <span class="sr-only">{link.name}</span>
27 35
            </a>
28 36
          </li>
29 -
        ))
37 +
          );
38 +
        })
30 39
      }
31 40
    </ul>
32 41
  </div>