404
+This page does not exist. / Deze pagina bestaat niet.
+ +diff --git a/astro.config.mjs b/astro.config.mjs index af91a00..c89a967 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,6 +1,7 @@ // @ts-check import { defineConfig } from 'astro/config'; import tailwindcss from '@tailwindcss/vite'; +import sitemap from '@astrojs/sitemap'; // https://astro.build/config export default defineConfig({ @@ -23,5 +24,7 @@ export default defineConfig({ routing: { prefixDefaultLocale: false }, }, + integrations: [sitemap()], + vite: { plugins: [tailwindcss()] }, }); diff --git a/package-lock.json b/package-lock.json index e018c1b..dd606a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "atproto-nl-website", "version": "0.0.1", "dependencies": { + "@astrojs/sitemap": "^3.7.3", "@atproto/api": "^0.20.41", "@atproto/oauth-client-browser": "^0.5.3", "@fontsource-variable/atkinson-hyperlegible-next": "^5.3.0", @@ -253,6 +254,17 @@ "node": ">=22.12.0" } }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.3.tgz", + "integrity": "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==", + "license": "MIT", + "dependencies": { + "sitemap": "^9.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^4.3.6" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", @@ -3028,6 +3040,24 @@ "@types/unist": "*" } }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -3225,6 +3255,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5126,6 +5162,25 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, + "node_modules/sitemap": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^24.9.2", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/esm/cli.js" + }, + "engines": { + "node": ">=20.19.5", + "npm": ">=10.8.2" + } + }, "node_modules/smol-toml": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", @@ -5171,6 +5226,12 @@ "dev": true, "license": "MIT" }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -5369,6 +5430,12 @@ "node": ">=22.19.0" } }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, "node_modules/unicode-segmenter": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz", diff --git a/package.json b/package.json index d935f8f..7e66874 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "test:a11y": "astro build && playwright test" }, "dependencies": { + "@astrojs/sitemap": "^3.7.3", "@atproto/api": "^0.20.41", "@atproto/oauth-client-browser": "^0.5.3", "@fontsource-variable/atkinson-hyperlegible-next": "^5.3.0", diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt new file mode 100644 index 0000000..f49aa1a --- /dev/null +++ b/public/.well-known/security.txt @@ -0,0 +1,5 @@ +Contact: https://tangled.org/atproto.nl/website/issues +Contact: https://mu.social/profile/atproto.nl +Expires: 2027-08-27T00:00:00.000Z +Preferred-Languages: en, nl +Canonical: https://atproto.nl/.well-known/security.txt diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..c0574c8 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,21 @@ +# atproto.nl + +> The AT Protocol community in the Netherlands. An independent, volunteer-run community for people building on and around AT Protocol, Dutch or otherwise. + +## Pages +- [Members](https://atproto.nl/members): people building on and around AT Protocol in the Netherlands +- [Events](https://atproto.nl/events): meetups and gatherings, plus organizer guides +- [Tools](https://atproto.nl/tools): AT Protocol tools made by people in the Netherlands +- [Community size](https://atproto.nl/community-size): how we estimate the size of the NL AT Protocol community +- [About](https://atproto.nl/about): what atproto.nl is and who is behind it +- [Privacy](https://atproto.nl/privacy): what the site does and does not collect +- [Terms](https://atproto.nl/terms): terms of use + +## Organizer guides +- [Organizing a hackathon](https://atproto.nl/events/hackathon) +- [Organizing a meetup](https://atproto.nl/events/meetup) +- [Organizing an unconference](https://atproto.nl/events/unconference) + +## Notes +- Source and issues: https://tangled.org/atproto.nl/website +- Independent community project. Not affiliated with, sponsored, or endorsed by Bluesky Social PBC. diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e525755 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://atproto.nl/sitemap-index.xml diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..80fee54 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,13 @@ +{ + "name": "atproto.nl", + "short_name": "atproto.nl", + "description": "The AT Protocol community in the Netherlands", + "start_url": "/", + "display": "standalone", + "background_color": "#282828", + "theme_color": "#282828", + "icons": [ + { "src": "/brand/atproto-nl-avatar-400.png", "sizes": "400x400", "type": "image/png" }, + { "src": "/brand/atproto-nl-avatar-1000.png", "sizes": "1000x1000", "type": "image/png", "purpose": "any maskable" } + ] +} diff --git a/src/components/Wordmark.astro b/src/components/Wordmark.astro index 9cdbf8f..d9b8392 100644 --- a/src/components/Wordmark.astro +++ b/src/components/Wordmark.astro @@ -7,4 +7,4 @@ interface Props { const { class: cls } = Astro.props; --- -//atproto.nl +//atproto.nl diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 758072a..59d8a10 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -11,6 +11,7 @@ export const ui = { 'site.tagline': 'The AT Protocol community in the Netherlands', 'nav.home': 'Home', 'theme.toggle': 'Toggle light/dark', + 'a11y.skip': 'Skip to content', 'hero.body': 'For everyone building on and around AT Protocol in the Netherlands (Dutch or otherwise).', 'join.heading': 'Join in', @@ -81,6 +82,7 @@ export const ui = { 'site.tagline': 'De AT Protocol-community in Nederland', 'nav.home': 'Home', 'theme.toggle': 'Licht/donker wisselen', + 'a11y.skip': 'Naar de inhoud', 'hero.body': 'Voor iedereen die in Nederland met AT Protocol bouwt (Nederlands of niet).', 'join.heading': 'Doe mee', diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index 6c386ff..995effb 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -34,6 +34,19 @@ const toNl = (p: string) => (p === '/' ? '/nl/' : p.startsWith('/nl/') || p === const enHref = lang === 'en' ? path : toEn(path); let nlHref = lang === 'nl' ? path : toNl(path); if (lang === 'en' && /^\/events\/[^/]+\/?$/.test(path)) nlHref = '/nl/events/'; + +const canonical = `${site}${path}`; +const pageTitle = title ? `${title} · ${t('site.title')}` : t('site.title'); +const description = t('site.tagline'); +const orgLd = { + '@context': 'https://schema.org', + '@type': 'Organization', + name: 'atproto.nl', + url: `${site}/`, + logo: `${site}/brand/atproto-nl-avatar-1000.png`, + description: t('site.tagline'), + sameAs: ['https://mu.social/profile/atproto.nl', 'https://tangled.org/atproto.nl/website'], +}; --- @@ -51,16 +64,30 @@ if (lang === 'en' && /^\/events\/[^/]+\/?$/.test(path)) nlHref = '/nl/events/'; } } - + + + + + -
This page does not exist. / Deze pagina bestaat niet.
+ +