diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7531feb70dd86..f8ec5f94629fa 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -38,23 +38,17 @@ docs @nodejs/nodejs-website @nodejs/web-infra SECURITY.md @nodejs/security-wg # Node.js Release Blog Posts -apps/site/pages/en/blog/release @nodejs/releasers -apps/site/pages/en/blog/announcements @nodejs/releasers +apps/site/app/en/blog/release @nodejs/releasers +apps/site/app/en/blog/announcements @nodejs/releasers # The following users DO NOT have write access, and their review is requested # via a GitHub action. -apps/site/pages/en/learn/diagnostics @nodejs/diagnostics - -apps/site/pages/en/learn/getting-started/security-best-practices.md @nodejs/security-wg - -apps/site/pages/en/learn/manipulating-files @nodejs/fs - -apps/site/pages/en/learn/test-runner @nodejs/test_runner - -apps/site/pages/en/learn/typescript @nodejs/typescript - -apps/site/pages/en/about/partners.mdx @nodejs/marketing -apps/site/pages/en/about/branding.mdx @nodejs/marketing - -apps/site/pages/en/learn/getting-started/userland-migrations.md @nodejs/userland-migrations -apps/site/pages/en/blog/migrations @nodejs/userland-migrations +apps/site/app/en/learn/diagnostics @nodejs/diagnostics +apps/site/app/en/learn/getting-started/security-best-practices/page.md @nodejs/security-wg +apps/site/app/en/learn/manipulating-files @nodejs/fs +apps/site/app/en/learn/test-runner @nodejs/test_runner +apps/site/app/en/learn/typescript @nodejs/typescript +apps/site/app/en/about/partners/page.mdx @nodejs/marketing +apps/site/app/en/about/branding/page.mdx @nodejs/marketing +apps/site/app/en/learn/getting-started/userland-migrations/page.md @nodejs/userland-migrations +apps/site/app/en/blog/migrations @nodejs/userland-migrations diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fe08f8801de6a..4007bf91cd030 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -47,13 +47,12 @@ updates: - '@shikijs/*' - '@mdx-js/*' - hast-util-* + - estree-util-* - rehype-* - remark-* - shiki - sval - unist-util-* - - vfile - - vfile-* - reading-time - twoslash orama: diff --git a/.github/workflows/translations-pr-lint.yml b/.github/workflows/translations-pr-lint.yml index 2f9529a86b96e..d892c83583b7a 100644 --- a/.github/workflows/translations-pr-lint.yml +++ b/.github/workflows/translations-pr-lint.yml @@ -9,10 +9,10 @@ on: branches: - main paths: - - 'apps/site/pages/**/*.md' - - 'apps/site/pages/**/*.mdx' - - '!apps/site/pages/en/**/*.md' - - '!apps/site/pages/en/**/*.mdx' + - 'apps/site/app/**/*.md' + - 'apps/site/app/**/*.mdx' + - "!apps/site/app/\\[en\\]/**/*.md" + - "!apps/site/app/\\[en\\]/**/*.mdx" - 'packages/i18n/src/locales/*.json' - '!packages/i18n/src/locales/en.json' - 'apps/site/snippets/**/*.bash' diff --git a/apps/site/pages/en/about/branding.mdx b/apps/site/app/[en]/about/branding/page.mdx similarity index 100% rename from apps/site/pages/en/about/branding.mdx rename to apps/site/app/[en]/about/branding/page.mdx diff --git a/apps/site/pages/en/about/eol.mdx b/apps/site/app/[en]/about/eol/page.mdx similarity index 100% rename from apps/site/pages/en/about/eol.mdx rename to apps/site/app/[en]/about/eol/page.mdx diff --git a/apps/site/pages/en/about/get-involved/collab-summit.md b/apps/site/app/[en]/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/en/about/get-involved/collab-summit.md rename to apps/site/app/[en]/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/en/about/get-involved/events.mdx b/apps/site/app/[en]/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/en/about/get-involved/events.mdx rename to apps/site/app/[en]/about/get-involved/events/page.mdx diff --git a/apps/site/pages/en/about/get-involved/index.md b/apps/site/app/[en]/about/get-involved/page.md similarity index 100% rename from apps/site/pages/en/about/get-involved/index.md rename to apps/site/app/[en]/about/get-involved/page.md diff --git a/apps/site/pages/en/about/governance.md b/apps/site/app/[en]/about/governance/page.md similarity index 100% rename from apps/site/pages/en/about/governance.md rename to apps/site/app/[en]/about/governance/page.md diff --git a/apps/site/pages/en/about/index.mdx b/apps/site/app/[en]/about/page.mdx similarity index 100% rename from apps/site/pages/en/about/index.mdx rename to apps/site/app/[en]/about/page.mdx diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/app/[en]/about/partners/page.mdx similarity index 100% rename from apps/site/pages/en/about/partners.mdx rename to apps/site/app/[en]/about/partners/page.mdx diff --git a/apps/site/pages/en/about/previous-releases.mdx b/apps/site/app/[en]/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/en/about/previous-releases.mdx rename to apps/site/app/[en]/about/previous-releases/page.mdx diff --git a/apps/site/pages/en/about/security-reporting.mdx b/apps/site/app/[en]/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/en/about/security-reporting.mdx rename to apps/site/app/[en]/about/security-reporting/page.mdx diff --git a/apps/site/app/[en]/blog/[category]/page.tsx b/apps/site/app/[en]/blog/[category]/page.tsx new file mode 100644 index 0000000000000..66f3b57a053e3 --- /dev/null +++ b/apps/site/app/[en]/blog/[category]/page.tsx @@ -0,0 +1,51 @@ +import { notFound } from 'next/navigation'; + +import { ENABLE_STATIC_EXPORT } from '#site/next.constants.mjs'; +import { blogData } from '#site/next.json.mjs'; + +import type { DynamicParams } from '#site/types/page'; +import type { FC } from 'react'; + +import BasicCategory from '../page.md'; + +// Generates all possible static paths based on the locales and environment configuration +// - Returns an empty array if static export is disabled (`ENABLE_STATIC_EXPORT` is false) +// - If `ENABLE_STATIC_EXPORT_LOCALE` is true, generates paths for all available locales +// - Otherwise, generates paths only for the default locale +// @see https://nextjs.org/docs/app/api-reference/functions/generate-static-params +export const generateStaticParams = async () => { + // Return an empty array if static export is disabled + if (!ENABLE_STATIC_EXPORT) { + return []; + } + + return blogData.categories.map(category => ({ en: 'en', category })); +}; + +type PageParams = DynamicParams<{ category: string }>; + +// This method parses the current pathname and does any sort of modifications needed on the route +// then it proceeds to retrieve the Markdown file and parse the MDX Content into a React Component +// finally it returns (if the locale and route are valid) the React Component with the relevant context +// and attached context providers for rendering the current page +const getPage: FC = async props => { + const { category } = await props.params; + + if (category in blogData.categories || category === 'all') { + return ; + } + + return notFound(); +}; + +// Enforces that this route is used as static rendering +// Except whenever on the Development mode as we want instant-refresh when making changes +// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic +export const dynamic = 'force-static'; + +// Ensures that this endpoint is invalidated and re-executed every X minutes +// so that when new deployments happen, the data is refreshed +// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate +export const revalidate = 300; + +export default getPage; diff --git a/apps/site/pages/en/blog/announcements/adjusted-release-schedule-covid.md b/apps/site/app/[en]/blog/announcements/adjusted-release-schedule-covid/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/adjusted-release-schedule-covid.md rename to apps/site/app/[en]/blog/announcements/adjusted-release-schedule-covid/page.md diff --git a/apps/site/pages/en/blog/announcements/apigee-rising-stack-yahoo.md b/apps/site/app/[en]/blog/announcements/apigee-rising-stack-yahoo/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/apigee-rising-stack-yahoo.md rename to apps/site/app/[en]/blog/announcements/apigee-rising-stack-yahoo/page.md diff --git a/apps/site/pages/en/blog/announcements/appdynamics-newrelic-opbeat-sphinx.md b/apps/site/app/[en]/blog/announcements/appdynamics-newrelic-opbeat-sphinx/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/appdynamics-newrelic-opbeat-sphinx.md rename to apps/site/app/[en]/blog/announcements/appdynamics-newrelic-opbeat-sphinx/page.md diff --git a/apps/site/pages/en/blog/announcements/cars-dynatrace.md b/apps/site/app/[en]/blog/announcements/cars-dynatrace/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/cars-dynatrace.md rename to apps/site/app/[en]/blog/announcements/cars-dynatrace/page.md diff --git a/apps/site/pages/en/blog/announcements/diving-into-the-nodejs-website-redesign.md b/apps/site/app/[en]/blog/announcements/diving-into-the-nodejs-website-redesign/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/diving-into-the-nodejs-website-redesign.md rename to apps/site/app/[en]/blog/announcements/diving-into-the-nodejs-website-redesign/page.md diff --git a/apps/site/pages/en/blog/announcements/foundation-advances-growth.md b/apps/site/app/[en]/blog/announcements/foundation-advances-growth/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/foundation-advances-growth.md rename to apps/site/app/[en]/blog/announcements/foundation-advances-growth/page.md diff --git a/apps/site/pages/en/blog/announcements/foundation-elects-board.md b/apps/site/app/[en]/blog/announcements/foundation-elects-board/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/foundation-elects-board.md rename to apps/site/app/[en]/blog/announcements/foundation-elects-board/page.md diff --git a/apps/site/pages/en/blog/announcements/foundation-express-news.md b/apps/site/app/[en]/blog/announcements/foundation-express-news/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/foundation-express-news.md rename to apps/site/app/[en]/blog/announcements/foundation-express-news/page.md diff --git a/apps/site/pages/en/blog/announcements/foundation-v4-announce.md b/apps/site/app/[en]/blog/announcements/foundation-v4-announce/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/foundation-v4-announce.md rename to apps/site/app/[en]/blog/announcements/foundation-v4-announce/page.md diff --git a/apps/site/pages/en/blog/announcements/interactive-2015-keynotes.md b/apps/site/app/[en]/blog/announcements/interactive-2015-keynotes/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/interactive-2015-keynotes.md rename to apps/site/app/[en]/blog/announcements/interactive-2015-keynotes/page.md diff --git a/apps/site/pages/en/blog/announcements/interactive-2015-programming.md b/apps/site/app/[en]/blog/announcements/interactive-2015-programming/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/interactive-2015-programming.md rename to apps/site/app/[en]/blog/announcements/interactive-2015-programming/page.md diff --git a/apps/site/pages/en/blog/announcements/interactive-2015.md b/apps/site/app/[en]/blog/announcements/interactive-2015/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/interactive-2015.md rename to apps/site/app/[en]/blog/announcements/interactive-2015/page.md diff --git a/apps/site/pages/en/blog/announcements/interactive-2016-ams.md b/apps/site/app/[en]/blog/announcements/interactive-2016-ams/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/interactive-2016-ams.md rename to apps/site/app/[en]/blog/announcements/interactive-2016-ams/page.md diff --git a/apps/site/pages/en/blog/announcements/interactive-2016-north-america-schedule.md b/apps/site/app/[en]/blog/announcements/interactive-2016-north-america-schedule/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/interactive-2016-north-america-schedule.md rename to apps/site/app/[en]/blog/announcements/interactive-2016-north-america-schedule/page.md diff --git a/apps/site/pages/en/blog/announcements/making-nodejs-downloads-reliable.md b/apps/site/app/[en]/blog/announcements/making-nodejs-downloads-reliable/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/making-nodejs-downloads-reliable.md rename to apps/site/app/[en]/blog/announcements/making-nodejs-downloads-reliable/page.md diff --git a/apps/site/pages/en/blog/announcements/mikeal.md b/apps/site/app/[en]/blog/announcements/mikeal/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/mikeal.md rename to apps/site/app/[en]/blog/announcements/mikeal/page.md diff --git a/apps/site/pages/en/blog/announcements/node-18-eol-support.md b/apps/site/app/[en]/blog/announcements/node-18-eol-support/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/node-18-eol-support.md rename to apps/site/app/[en]/blog/announcements/node-18-eol-support/page.md diff --git a/apps/site/pages/en/blog/announcements/node-js-march-17-incident.md b/apps/site/app/[en]/blog/announcements/node-js-march-17-incident/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/node-js-march-17-incident.md rename to apps/site/app/[en]/blog/announcements/node-js-march-17-incident/page.md diff --git a/apps/site/pages/en/blog/announcements/nodejs-certified-developer-program.md b/apps/site/app/[en]/blog/announcements/nodejs-certified-developer-program/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/nodejs-certified-developer-program.md rename to apps/site/app/[en]/blog/announcements/nodejs-certified-developer-program/page.md diff --git a/apps/site/pages/en/blog/announcements/nodejs-foundation-momentum-release.md b/apps/site/app/[en]/blog/announcements/nodejs-foundation-momentum-release/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/nodejs-foundation-momentum-release.md rename to apps/site/app/[en]/blog/announcements/nodejs-foundation-momentum-release/page.md diff --git a/apps/site/pages/en/blog/announcements/nodejs-foundation-survey.md b/apps/site/app/[en]/blog/announcements/nodejs-foundation-survey/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/nodejs-foundation-survey.md rename to apps/site/app/[en]/blog/announcements/nodejs-foundation-survey/page.md diff --git a/apps/site/pages/en/blog/announcements/nodejs-security-project.md b/apps/site/app/[en]/blog/announcements/nodejs-security-project/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/nodejs-security-project.md rename to apps/site/app/[en]/blog/announcements/nodejs-security-project/page.md diff --git a/apps/site/pages/en/blog/announcements/nodejs-trademarks-transferred-to-openjs-foundation.md b/apps/site/app/[en]/blog/announcements/nodejs-trademarks-transferred-to-openjs-foundation/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/nodejs-trademarks-transferred-to-openjs-foundation.md rename to apps/site/app/[en]/blog/announcements/nodejs-trademarks-transferred-to-openjs-foundation/page.md diff --git a/apps/site/pages/en/blog/announcements/nodejs16-eol.md b/apps/site/app/[en]/blog/announcements/nodejs16-eol/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/nodejs16-eol.md rename to apps/site/app/[en]/blog/announcements/nodejs16-eol/page.md diff --git a/apps/site/pages/en/blog/announcements/official-discord-launch-announcement.md b/apps/site/app/[en]/blog/announcements/official-discord-launch-announcement/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/official-discord-launch-announcement.md rename to apps/site/app/[en]/blog/announcements/official-discord-launch-announcement/page.md diff --git a/apps/site/pages/en/blog/announcements/retiring-the-node-js-community-committee.md b/apps/site/app/[en]/blog/announcements/retiring-the-node-js-community-committee/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/retiring-the-node-js-community-committee.md rename to apps/site/app/[en]/blog/announcements/retiring-the-node-js-community-committee/page.md diff --git a/apps/site/pages/en/blog/announcements/update-v8-5.4.md b/apps/site/app/[en]/blog/announcements/update-v8-5.4/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/update-v8-5.4.md rename to apps/site/app/[en]/blog/announcements/update-v8-5.4/page.md diff --git a/apps/site/pages/en/blog/announcements/v18-release-announce.md b/apps/site/app/[en]/blog/announcements/v18-release-announce/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v18-release-announce.md rename to apps/site/app/[en]/blog/announcements/v18-release-announce/page.md diff --git a/apps/site/pages/en/blog/announcements/v19-release-announce.md b/apps/site/app/[en]/blog/announcements/v19-release-announce/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v19-release-announce.md rename to apps/site/app/[en]/blog/announcements/v19-release-announce/page.md diff --git a/apps/site/pages/en/blog/announcements/v20-release-announce.md b/apps/site/app/[en]/blog/announcements/v20-release-announce/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v20-release-announce.md rename to apps/site/app/[en]/blog/announcements/v20-release-announce/page.md diff --git a/apps/site/pages/en/blog/announcements/v21-release-announce.md b/apps/site/app/[en]/blog/announcements/v21-release-announce/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v21-release-announce.md rename to apps/site/app/[en]/blog/announcements/v21-release-announce/page.md diff --git a/apps/site/pages/en/blog/announcements/v22-release-announce.md b/apps/site/app/[en]/blog/announcements/v22-release-announce/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v22-release-announce.md rename to apps/site/app/[en]/blog/announcements/v22-release-announce/page.md diff --git a/apps/site/pages/en/blog/announcements/v5-to-v7.md b/apps/site/app/[en]/blog/announcements/v5-to-v7/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v5-to-v7.md rename to apps/site/app/[en]/blog/announcements/v5-to-v7/page.md diff --git a/apps/site/pages/en/blog/announcements/v6-release.md b/apps/site/app/[en]/blog/announcements/v6-release/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/v6-release.md rename to apps/site/app/[en]/blog/announcements/v6-release/page.md diff --git a/apps/site/pages/en/blog/announcements/welcome-google.md b/apps/site/app/[en]/blog/announcements/welcome-google/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/welcome-google.md rename to apps/site/app/[en]/blog/announcements/welcome-google/page.md diff --git a/apps/site/pages/en/blog/announcements/welcome-redhat.md b/apps/site/app/[en]/blog/announcements/welcome-redhat/page.md similarity index 100% rename from apps/site/pages/en/blog/announcements/welcome-redhat.md rename to apps/site/app/[en]/blog/announcements/welcome-redhat/page.md diff --git a/apps/site/pages/en/blog/community/2017-election.md b/apps/site/app/[en]/blog/community/2017-election/page.md similarity index 100% rename from apps/site/pages/en/blog/community/2017-election.md rename to apps/site/app/[en]/blog/community/2017-election/page.md diff --git a/apps/site/pages/en/blog/community/2025-06-28-Emelia-Smith.md b/apps/site/app/[en]/blog/community/2025-06-28-Emelia-Smith/page.md similarity index 100% rename from apps/site/pages/en/blog/community/2025-06-28-Emelia-Smith.md rename to apps/site/app/[en]/blog/community/2025-06-28-Emelia-Smith/page.md diff --git a/apps/site/pages/en/blog/community/2025-pride.md b/apps/site/app/[en]/blog/community/2025-pride/page.md similarity index 97% rename from apps/site/pages/en/blog/community/2025-pride.md rename to apps/site/app/[en]/blog/community/2025-pride/page.md index f03f9c71c8679..f1002fe5cd39d 100644 --- a/apps/site/pages/en/blog/community/2025-pride.md +++ b/apps/site/app/[en]/blog/community/2025-pride/page.md @@ -60,6 +60,6 @@ June is recognized as Pride Month for those of us who have found our truths, or Happy Pride. -As part of Pride Month, the Node.js Project is launching a series of blog posts highlighting the voices and work of LGBTQ technologists. If you identify as part of the community and want to share your journey, your projects, or how your identity has shaped your perspective and contributions, we’d love to hear from you, and we invite you to [submit a PR](https://github.com/nodejs/nodejs.org/tree/main/apps/site/pages/en/blog/community) with your answer to the prompt, "how did you come to understand who you are, and what contributions have you made to open source?" +As part of Pride Month, the Node.js Project is launching a series of blog posts highlighting the voices and work of LGBTQ technologists. If you identify as part of the community and want to share your journey, your projects, or how your identity has shaped your perspective and contributions, we’d love to hear from you, and we invite you to [submit a PR](https://github.com/nodejs/nodejs.org/tree/main/apps/site/app/en/blog/community) with your answer to the prompt, "how did you come to understand who you are, and what contributions have you made to open source?" _[Carl Vitullo](https://vcarl.com/) (he/they) is a volunteer community leader for [the official Node.js Discord server](https://discord.gg/nodejs)._ diff --git a/apps/site/pages/en/blog/community/building-nodejs-together.md b/apps/site/app/[en]/blog/community/building-nodejs-together/page.md similarity index 100% rename from apps/site/pages/en/blog/community/building-nodejs-together.md rename to apps/site/app/[en]/blog/community/building-nodejs-together/page.md diff --git a/apps/site/pages/en/blog/community/domain-postmortem.md b/apps/site/app/[en]/blog/community/domain-postmortem/page.md similarity index 100% rename from apps/site/pages/en/blog/community/domain-postmortem.md rename to apps/site/app/[en]/blog/community/domain-postmortem/page.md diff --git a/apps/site/pages/en/blog/community/foundation-benefits-all.md b/apps/site/app/[en]/blog/community/foundation-benefits-all/page.md similarity index 100% rename from apps/site/pages/en/blog/community/foundation-benefits-all.md rename to apps/site/app/[en]/blog/community/foundation-benefits-all/page.md diff --git a/apps/site/pages/en/blog/community/individual-membership.md b/apps/site/app/[en]/blog/community/individual-membership/page.md similarity index 100% rename from apps/site/pages/en/blog/community/individual-membership.md rename to apps/site/app/[en]/blog/community/individual-membership/page.md diff --git a/apps/site/pages/en/blog/community/next-chapter.md b/apps/site/app/[en]/blog/community/next-chapter/page.md similarity index 100% rename from apps/site/pages/en/blog/community/next-chapter.md rename to apps/site/app/[en]/blog/community/next-chapter/page.md diff --git a/apps/site/pages/en/blog/community/node-leaders-building-open-neutral-foundation.md b/apps/site/app/[en]/blog/community/node-leaders-building-open-neutral-foundation/page.md similarity index 100% rename from apps/site/pages/en/blog/community/node-leaders-building-open-neutral-foundation.md rename to apps/site/app/[en]/blog/community/node-leaders-building-open-neutral-foundation/page.md diff --git a/apps/site/pages/en/blog/community/node-v5.md b/apps/site/app/[en]/blog/community/node-v5/page.md similarity index 100% rename from apps/site/pages/en/blog/community/node-v5.md rename to apps/site/app/[en]/blog/community/node-v5/page.md diff --git a/apps/site/pages/en/blog/community/quality-with-speed.md b/apps/site/app/[en]/blog/community/quality-with-speed/page.md similarity index 100% rename from apps/site/pages/en/blog/community/quality-with-speed.md rename to apps/site/app/[en]/blog/community/quality-with-speed/page.md diff --git a/apps/site/pages/en/blog/community/transitions.md b/apps/site/app/[en]/blog/community/transitions/page.md similarity index 100% rename from apps/site/pages/en/blog/community/transitions.md rename to apps/site/app/[en]/blog/community/transitions/page.md diff --git a/apps/site/pages/en/blog/events/collab-summit-2024-dublin.md b/apps/site/app/[en]/blog/events/collab-summit-2024-dublin/page.md similarity index 100% rename from apps/site/pages/en/blog/events/collab-summit-2024-dublin.md rename to apps/site/app/[en]/blog/events/collab-summit-2024-dublin/page.md diff --git a/apps/site/pages/en/blog/events/collab-summit-2024-london.md b/apps/site/app/[en]/blog/events/collab-summit-2024-london/page.md similarity index 100% rename from apps/site/pages/en/blog/events/collab-summit-2024-london.md rename to apps/site/app/[en]/blog/events/collab-summit-2024-london/page.md diff --git a/apps/site/pages/en/blog/events/collab-summit-2025-paris.md b/apps/site/app/[en]/blog/events/collab-summit-2025-paris/page.md similarity index 100% rename from apps/site/pages/en/blog/events/collab-summit-2025-paris.md rename to apps/site/app/[en]/blog/events/collab-summit-2025-paris/page.md diff --git a/apps/site/pages/en/blog/feature/streams2.md b/apps/site/app/[en]/blog/feature/streams2/page.md similarity index 100% rename from apps/site/pages/en/blog/feature/streams2.md rename to apps/site/app/[en]/blog/feature/streams2/page.md diff --git a/apps/site/pages/en/blog/migrations/v12-to-v14.mdx b/apps/site/app/[en]/blog/migrations/v12-to-v14/page.mdx similarity index 100% rename from apps/site/pages/en/blog/migrations/v12-to-v14.mdx rename to apps/site/app/[en]/blog/migrations/v12-to-v14/page.mdx diff --git a/apps/site/pages/en/blog/migrations/v14-to-v16.mdx b/apps/site/app/[en]/blog/migrations/v14-to-v16/page.mdx similarity index 100% rename from apps/site/pages/en/blog/migrations/v14-to-v16.mdx rename to apps/site/app/[en]/blog/migrations/v14-to-v16/page.mdx diff --git a/apps/site/pages/en/blog/migrations/v20-to-v22.mdx b/apps/site/app/[en]/blog/migrations/v20-to-v22/page.mdx similarity index 100% rename from apps/site/pages/en/blog/migrations/v20-to-v22.mdx rename to apps/site/app/[en]/blog/migrations/v20-to-v22/page.mdx diff --git a/apps/site/pages/en/blog/migrations/v22-to-v24.mdx b/apps/site/app/[en]/blog/migrations/v22-to-v24/page.mdx similarity index 100% rename from apps/site/pages/en/blog/migrations/v22-to-v24.mdx rename to apps/site/app/[en]/blog/migrations/v22-to-v24/page.mdx diff --git a/apps/site/pages/en/blog/module/multi-server-continuous-deployment-with-fleet.md b/apps/site/app/[en]/blog/module/multi-server-continuous-deployment-with-fleet/page.md similarity index 100% rename from apps/site/pages/en/blog/module/multi-server-continuous-deployment-with-fleet.md rename to apps/site/app/[en]/blog/module/multi-server-continuous-deployment-with-fleet/page.md diff --git a/apps/site/pages/en/blog/module/service-logging-in-json-with-bunyan.md b/apps/site/app/[en]/blog/module/service-logging-in-json-with-bunyan/page.md similarity index 100% rename from apps/site/pages/en/blog/module/service-logging-in-json-with-bunyan.md rename to apps/site/app/[en]/blog/module/service-logging-in-json-with-bunyan/page.md diff --git a/apps/site/pages/en/blog/npm/2013-outage-postmortem.md b/apps/site/app/[en]/blog/npm/2013-outage-postmortem/page.md similarity index 100% rename from apps/site/pages/en/blog/npm/2013-outage-postmortem.md rename to apps/site/app/[en]/blog/npm/2013-outage-postmortem/page.md diff --git a/apps/site/pages/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap.md b/apps/site/app/[en]/blog/npm/managing-node-js-dependencies-with-shrinkwrap/page.md similarity index 100% rename from apps/site/pages/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap.md rename to apps/site/app/[en]/blog/npm/managing-node-js-dependencies-with-shrinkwrap/page.md diff --git a/apps/site/pages/en/blog/npm/npm-1-0-global-vs-local-installation.md b/apps/site/app/[en]/blog/npm/npm-1-0-global-vs-local-installation/page.md similarity index 100% rename from apps/site/pages/en/blog/npm/npm-1-0-global-vs-local-installation.md rename to apps/site/app/[en]/blog/npm/npm-1-0-global-vs-local-installation/page.md diff --git a/apps/site/pages/en/blog/npm/npm-1-0-link.md b/apps/site/app/[en]/blog/npm/npm-1-0-link/page.md similarity index 100% rename from apps/site/pages/en/blog/npm/npm-1-0-link.md rename to apps/site/app/[en]/blog/npm/npm-1-0-link/page.md diff --git a/apps/site/pages/en/blog/npm/npm-1-0-released.md b/apps/site/app/[en]/blog/npm/npm-1-0-released/page.md similarity index 100% rename from apps/site/pages/en/blog/npm/npm-1-0-released.md rename to apps/site/app/[en]/blog/npm/npm-1-0-released/page.md diff --git a/apps/site/pages/en/blog/npm/npm-1-0-the-new-ls.md b/apps/site/app/[en]/blog/npm/npm-1-0-the-new-ls/page.md similarity index 100% rename from apps/site/pages/en/blog/npm/npm-1-0-the-new-ls.md rename to apps/site/app/[en]/blog/npm/npm-1-0-the-new-ls/page.md diff --git a/apps/site/pages/en/blog/npm/peer-dependencies.mdx b/apps/site/app/[en]/blog/npm/peer-dependencies/page.mdx similarity index 100% rename from apps/site/pages/en/blog/npm/peer-dependencies.mdx rename to apps/site/app/[en]/blog/npm/peer-dependencies/page.mdx diff --git a/apps/site/pages/en/blog/index.md b/apps/site/app/[en]/blog/page.md similarity index 100% rename from apps/site/pages/en/blog/index.md rename to apps/site/app/[en]/blog/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.0.md b/apps/site/app/[en]/blog/release/v0.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.0.md rename to apps/site/app/[en]/blog/release/v0.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.1.md b/apps/site/app/[en]/blog/release/v0.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.1.md rename to apps/site/app/[en]/blog/release/v0.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.10.md b/apps/site/app/[en]/blog/release/v0.10.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.10.md rename to apps/site/app/[en]/blog/release/v0.10.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.11.md b/apps/site/app/[en]/blog/release/v0.10.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.11.md rename to apps/site/app/[en]/blog/release/v0.10.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.12.md b/apps/site/app/[en]/blog/release/v0.10.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.12.md rename to apps/site/app/[en]/blog/release/v0.10.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.13.md b/apps/site/app/[en]/blog/release/v0.10.13/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.13.md rename to apps/site/app/[en]/blog/release/v0.10.13/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.14.md b/apps/site/app/[en]/blog/release/v0.10.14/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.14.md rename to apps/site/app/[en]/blog/release/v0.10.14/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.15.md b/apps/site/app/[en]/blog/release/v0.10.15/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.15.md rename to apps/site/app/[en]/blog/release/v0.10.15/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.16.md b/apps/site/app/[en]/blog/release/v0.10.16/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.16.md rename to apps/site/app/[en]/blog/release/v0.10.16/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.17.md b/apps/site/app/[en]/blog/release/v0.10.17/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.17.md rename to apps/site/app/[en]/blog/release/v0.10.17/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.18.md b/apps/site/app/[en]/blog/release/v0.10.18/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.18.md rename to apps/site/app/[en]/blog/release/v0.10.18/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.19.md b/apps/site/app/[en]/blog/release/v0.10.19/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.19.md rename to apps/site/app/[en]/blog/release/v0.10.19/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.2.md b/apps/site/app/[en]/blog/release/v0.10.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.2.md rename to apps/site/app/[en]/blog/release/v0.10.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.20.md b/apps/site/app/[en]/blog/release/v0.10.20/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.20.md rename to apps/site/app/[en]/blog/release/v0.10.20/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.21.md b/apps/site/app/[en]/blog/release/v0.10.21/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.21.md rename to apps/site/app/[en]/blog/release/v0.10.21/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.22.md b/apps/site/app/[en]/blog/release/v0.10.22/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.22.md rename to apps/site/app/[en]/blog/release/v0.10.22/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.23.md b/apps/site/app/[en]/blog/release/v0.10.23/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.23.md rename to apps/site/app/[en]/blog/release/v0.10.23/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.24.md b/apps/site/app/[en]/blog/release/v0.10.24/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.24.md rename to apps/site/app/[en]/blog/release/v0.10.24/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.25.md b/apps/site/app/[en]/blog/release/v0.10.25/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.25.md rename to apps/site/app/[en]/blog/release/v0.10.25/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.26.md b/apps/site/app/[en]/blog/release/v0.10.26/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.26.md rename to apps/site/app/[en]/blog/release/v0.10.26/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.27.md b/apps/site/app/[en]/blog/release/v0.10.27/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.27.md rename to apps/site/app/[en]/blog/release/v0.10.27/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.28.md b/apps/site/app/[en]/blog/release/v0.10.28/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.28.md rename to apps/site/app/[en]/blog/release/v0.10.28/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.29.md b/apps/site/app/[en]/blog/release/v0.10.29/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.29.md rename to apps/site/app/[en]/blog/release/v0.10.29/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.3.md b/apps/site/app/[en]/blog/release/v0.10.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.3.md rename to apps/site/app/[en]/blog/release/v0.10.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.30.md b/apps/site/app/[en]/blog/release/v0.10.30/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.30.md rename to apps/site/app/[en]/blog/release/v0.10.30/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.31.md b/apps/site/app/[en]/blog/release/v0.10.31/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.31.md rename to apps/site/app/[en]/blog/release/v0.10.31/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.32.md b/apps/site/app/[en]/blog/release/v0.10.32/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.32.md rename to apps/site/app/[en]/blog/release/v0.10.32/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.33.md b/apps/site/app/[en]/blog/release/v0.10.33/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.33.md rename to apps/site/app/[en]/blog/release/v0.10.33/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.34.md b/apps/site/app/[en]/blog/release/v0.10.34/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.34.md rename to apps/site/app/[en]/blog/release/v0.10.34/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.35.md b/apps/site/app/[en]/blog/release/v0.10.35/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.35.md rename to apps/site/app/[en]/blog/release/v0.10.35/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.36.md b/apps/site/app/[en]/blog/release/v0.10.36/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.36.md rename to apps/site/app/[en]/blog/release/v0.10.36/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.37.md b/apps/site/app/[en]/blog/release/v0.10.37/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.37.md rename to apps/site/app/[en]/blog/release/v0.10.37/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.38.md b/apps/site/app/[en]/blog/release/v0.10.38/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.38.md rename to apps/site/app/[en]/blog/release/v0.10.38/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.39.md b/apps/site/app/[en]/blog/release/v0.10.39/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.39.md rename to apps/site/app/[en]/blog/release/v0.10.39/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.4.md b/apps/site/app/[en]/blog/release/v0.10.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.4.md rename to apps/site/app/[en]/blog/release/v0.10.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.40.md b/apps/site/app/[en]/blog/release/v0.10.40/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.40.md rename to apps/site/app/[en]/blog/release/v0.10.40/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.41.md b/apps/site/app/[en]/blog/release/v0.10.41/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.41.md rename to apps/site/app/[en]/blog/release/v0.10.41/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.42.md b/apps/site/app/[en]/blog/release/v0.10.42/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.42.md rename to apps/site/app/[en]/blog/release/v0.10.42/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.43.md b/apps/site/app/[en]/blog/release/v0.10.43/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.43.md rename to apps/site/app/[en]/blog/release/v0.10.43/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.44.md b/apps/site/app/[en]/blog/release/v0.10.44/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.44.md rename to apps/site/app/[en]/blog/release/v0.10.44/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.45.md b/apps/site/app/[en]/blog/release/v0.10.45/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.45.md rename to apps/site/app/[en]/blog/release/v0.10.45/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.46.md b/apps/site/app/[en]/blog/release/v0.10.46/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.46.md rename to apps/site/app/[en]/blog/release/v0.10.46/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.47.md b/apps/site/app/[en]/blog/release/v0.10.47/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.47.md rename to apps/site/app/[en]/blog/release/v0.10.47/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.48.md b/apps/site/app/[en]/blog/release/v0.10.48/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.48.md rename to apps/site/app/[en]/blog/release/v0.10.48/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.5.md b/apps/site/app/[en]/blog/release/v0.10.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.5.md rename to apps/site/app/[en]/blog/release/v0.10.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.6.md b/apps/site/app/[en]/blog/release/v0.10.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.6.md rename to apps/site/app/[en]/blog/release/v0.10.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.7.md b/apps/site/app/[en]/blog/release/v0.10.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.7.md rename to apps/site/app/[en]/blog/release/v0.10.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.8.md b/apps/site/app/[en]/blog/release/v0.10.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.8.md rename to apps/site/app/[en]/blog/release/v0.10.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.10.9.md b/apps/site/app/[en]/blog/release/v0.10.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.10.9.md rename to apps/site/app/[en]/blog/release/v0.10.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.0.md b/apps/site/app/[en]/blog/release/v0.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.0.md rename to apps/site/app/[en]/blog/release/v0.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.1.md b/apps/site/app/[en]/blog/release/v0.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.1.md rename to apps/site/app/[en]/blog/release/v0.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.10.md b/apps/site/app/[en]/blog/release/v0.11.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.10.md rename to apps/site/app/[en]/blog/release/v0.11.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.11.md b/apps/site/app/[en]/blog/release/v0.11.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.11.md rename to apps/site/app/[en]/blog/release/v0.11.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.12.md b/apps/site/app/[en]/blog/release/v0.11.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.12.md rename to apps/site/app/[en]/blog/release/v0.11.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.14.md b/apps/site/app/[en]/blog/release/v0.11.14/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.14.md rename to apps/site/app/[en]/blog/release/v0.11.14/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.15.md b/apps/site/app/[en]/blog/release/v0.11.15/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.15.md rename to apps/site/app/[en]/blog/release/v0.11.15/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.16.md b/apps/site/app/[en]/blog/release/v0.11.16/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.16.md rename to apps/site/app/[en]/blog/release/v0.11.16/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.2.md b/apps/site/app/[en]/blog/release/v0.11.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.2.md rename to apps/site/app/[en]/blog/release/v0.11.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.3.md b/apps/site/app/[en]/blog/release/v0.11.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.3.md rename to apps/site/app/[en]/blog/release/v0.11.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.4.md b/apps/site/app/[en]/blog/release/v0.11.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.4.md rename to apps/site/app/[en]/blog/release/v0.11.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.5.md b/apps/site/app/[en]/blog/release/v0.11.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.5.md rename to apps/site/app/[en]/blog/release/v0.11.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.6.md b/apps/site/app/[en]/blog/release/v0.11.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.6.md rename to apps/site/app/[en]/blog/release/v0.11.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.7.md b/apps/site/app/[en]/blog/release/v0.11.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.7.md rename to apps/site/app/[en]/blog/release/v0.11.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.8.md b/apps/site/app/[en]/blog/release/v0.11.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.8.md rename to apps/site/app/[en]/blog/release/v0.11.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.11.9.md b/apps/site/app/[en]/blog/release/v0.11.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.11.9.md rename to apps/site/app/[en]/blog/release/v0.11.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.0.md b/apps/site/app/[en]/blog/release/v0.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.0.md rename to apps/site/app/[en]/blog/release/v0.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.1.md b/apps/site/app/[en]/blog/release/v0.12.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.1.md rename to apps/site/app/[en]/blog/release/v0.12.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.10.md b/apps/site/app/[en]/blog/release/v0.12.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.10.md rename to apps/site/app/[en]/blog/release/v0.12.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.11.md b/apps/site/app/[en]/blog/release/v0.12.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.11.md rename to apps/site/app/[en]/blog/release/v0.12.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.12.md b/apps/site/app/[en]/blog/release/v0.12.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.12.md rename to apps/site/app/[en]/blog/release/v0.12.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.13.md b/apps/site/app/[en]/blog/release/v0.12.13/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.13.md rename to apps/site/app/[en]/blog/release/v0.12.13/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.14.md b/apps/site/app/[en]/blog/release/v0.12.14/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.14.md rename to apps/site/app/[en]/blog/release/v0.12.14/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.15.md b/apps/site/app/[en]/blog/release/v0.12.15/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.15.md rename to apps/site/app/[en]/blog/release/v0.12.15/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.16.md b/apps/site/app/[en]/blog/release/v0.12.16/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.16.md rename to apps/site/app/[en]/blog/release/v0.12.16/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.17.md b/apps/site/app/[en]/blog/release/v0.12.17/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.17.md rename to apps/site/app/[en]/blog/release/v0.12.17/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.18.md b/apps/site/app/[en]/blog/release/v0.12.18/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.18.md rename to apps/site/app/[en]/blog/release/v0.12.18/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.2.md b/apps/site/app/[en]/blog/release/v0.12.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.2.md rename to apps/site/app/[en]/blog/release/v0.12.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.3.md b/apps/site/app/[en]/blog/release/v0.12.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.3.md rename to apps/site/app/[en]/blog/release/v0.12.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.4.md b/apps/site/app/[en]/blog/release/v0.12.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.4.md rename to apps/site/app/[en]/blog/release/v0.12.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.5.md b/apps/site/app/[en]/blog/release/v0.12.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.5.md rename to apps/site/app/[en]/blog/release/v0.12.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.6.md b/apps/site/app/[en]/blog/release/v0.12.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.6.md rename to apps/site/app/[en]/blog/release/v0.12.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.7.md b/apps/site/app/[en]/blog/release/v0.12.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.7.md rename to apps/site/app/[en]/blog/release/v0.12.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.8.md b/apps/site/app/[en]/blog/release/v0.12.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.8.md rename to apps/site/app/[en]/blog/release/v0.12.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.12.9.md b/apps/site/app/[en]/blog/release/v0.12.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.12.9.md rename to apps/site/app/[en]/blog/release/v0.12.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.10.md b/apps/site/app/[en]/blog/release/v0.4.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.10.md rename to apps/site/app/[en]/blog/release/v0.4.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.11.md b/apps/site/app/[en]/blog/release/v0.4.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.11.md rename to apps/site/app/[en]/blog/release/v0.4.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.12.md b/apps/site/app/[en]/blog/release/v0.4.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.12.md rename to apps/site/app/[en]/blog/release/v0.4.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.3.md b/apps/site/app/[en]/blog/release/v0.4.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.3.md rename to apps/site/app/[en]/blog/release/v0.4.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.4.md b/apps/site/app/[en]/blog/release/v0.4.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.4.md rename to apps/site/app/[en]/blog/release/v0.4.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.5.md b/apps/site/app/[en]/blog/release/v0.4.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.5.md rename to apps/site/app/[en]/blog/release/v0.4.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.6.md b/apps/site/app/[en]/blog/release/v0.4.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.6.md rename to apps/site/app/[en]/blog/release/v0.4.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.7.md b/apps/site/app/[en]/blog/release/v0.4.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.7.md rename to apps/site/app/[en]/blog/release/v0.4.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.8.md b/apps/site/app/[en]/blog/release/v0.4.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.8.md rename to apps/site/app/[en]/blog/release/v0.4.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.4.9.md b/apps/site/app/[en]/blog/release/v0.4.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.4.9.md rename to apps/site/app/[en]/blog/release/v0.4.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.0.md b/apps/site/app/[en]/blog/release/v0.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.0.md rename to apps/site/app/[en]/blog/release/v0.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.1.md b/apps/site/app/[en]/blog/release/v0.5.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.1.md rename to apps/site/app/[en]/blog/release/v0.5.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.10.md b/apps/site/app/[en]/blog/release/v0.5.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.10.md rename to apps/site/app/[en]/blog/release/v0.5.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.2.md b/apps/site/app/[en]/blog/release/v0.5.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.2.md rename to apps/site/app/[en]/blog/release/v0.5.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.3.md b/apps/site/app/[en]/blog/release/v0.5.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.3.md rename to apps/site/app/[en]/blog/release/v0.5.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.4.md b/apps/site/app/[en]/blog/release/v0.5.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.4.md rename to apps/site/app/[en]/blog/release/v0.5.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.5.md b/apps/site/app/[en]/blog/release/v0.5.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.5.md rename to apps/site/app/[en]/blog/release/v0.5.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.6.md b/apps/site/app/[en]/blog/release/v0.5.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.6.md rename to apps/site/app/[en]/blog/release/v0.5.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.7.md b/apps/site/app/[en]/blog/release/v0.5.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.7.md rename to apps/site/app/[en]/blog/release/v0.5.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.8.md b/apps/site/app/[en]/blog/release/v0.5.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.8.md rename to apps/site/app/[en]/blog/release/v0.5.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.5.9.md b/apps/site/app/[en]/blog/release/v0.5.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.5.9.md rename to apps/site/app/[en]/blog/release/v0.5.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.0.md b/apps/site/app/[en]/blog/release/v0.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.0.md rename to apps/site/app/[en]/blog/release/v0.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.1.md b/apps/site/app/[en]/blog/release/v0.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.1.md rename to apps/site/app/[en]/blog/release/v0.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.10.md b/apps/site/app/[en]/blog/release/v0.6.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.10.md rename to apps/site/app/[en]/blog/release/v0.6.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.11.md b/apps/site/app/[en]/blog/release/v0.6.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.11.md rename to apps/site/app/[en]/blog/release/v0.6.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.12.md b/apps/site/app/[en]/blog/release/v0.6.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.12.md rename to apps/site/app/[en]/blog/release/v0.6.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.13.md b/apps/site/app/[en]/blog/release/v0.6.13/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.13.md rename to apps/site/app/[en]/blog/release/v0.6.13/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.14.md b/apps/site/app/[en]/blog/release/v0.6.14/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.14.md rename to apps/site/app/[en]/blog/release/v0.6.14/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.15.md b/apps/site/app/[en]/blog/release/v0.6.15/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.15.md rename to apps/site/app/[en]/blog/release/v0.6.15/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.16.md b/apps/site/app/[en]/blog/release/v0.6.16/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.16.md rename to apps/site/app/[en]/blog/release/v0.6.16/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.17.md b/apps/site/app/[en]/blog/release/v0.6.17/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.17.md rename to apps/site/app/[en]/blog/release/v0.6.17/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.18.md b/apps/site/app/[en]/blog/release/v0.6.18/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.18.md rename to apps/site/app/[en]/blog/release/v0.6.18/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.19.md b/apps/site/app/[en]/blog/release/v0.6.19/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.19.md rename to apps/site/app/[en]/blog/release/v0.6.19/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.2.md b/apps/site/app/[en]/blog/release/v0.6.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.2.md rename to apps/site/app/[en]/blog/release/v0.6.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.20.md b/apps/site/app/[en]/blog/release/v0.6.20/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.20.md rename to apps/site/app/[en]/blog/release/v0.6.20/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.21.md b/apps/site/app/[en]/blog/release/v0.6.21/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.21.md rename to apps/site/app/[en]/blog/release/v0.6.21/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.3.md b/apps/site/app/[en]/blog/release/v0.6.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.3.md rename to apps/site/app/[en]/blog/release/v0.6.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.4.md b/apps/site/app/[en]/blog/release/v0.6.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.4.md rename to apps/site/app/[en]/blog/release/v0.6.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.5.md b/apps/site/app/[en]/blog/release/v0.6.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.5.md rename to apps/site/app/[en]/blog/release/v0.6.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.6.md b/apps/site/app/[en]/blog/release/v0.6.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.6.md rename to apps/site/app/[en]/blog/release/v0.6.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.7.md b/apps/site/app/[en]/blog/release/v0.6.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.7.md rename to apps/site/app/[en]/blog/release/v0.6.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.8.md b/apps/site/app/[en]/blog/release/v0.6.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.8.md rename to apps/site/app/[en]/blog/release/v0.6.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.6.9.md b/apps/site/app/[en]/blog/release/v0.6.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.6.9.md rename to apps/site/app/[en]/blog/release/v0.6.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.0.md b/apps/site/app/[en]/blog/release/v0.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.0.md rename to apps/site/app/[en]/blog/release/v0.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.1.md b/apps/site/app/[en]/blog/release/v0.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.1.md rename to apps/site/app/[en]/blog/release/v0.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.10.md b/apps/site/app/[en]/blog/release/v0.7.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.10.md rename to apps/site/app/[en]/blog/release/v0.7.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.11.md b/apps/site/app/[en]/blog/release/v0.7.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.11.md rename to apps/site/app/[en]/blog/release/v0.7.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.12.md b/apps/site/app/[en]/blog/release/v0.7.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.12.md rename to apps/site/app/[en]/blog/release/v0.7.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.2.md b/apps/site/app/[en]/blog/release/v0.7.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.2.md rename to apps/site/app/[en]/blog/release/v0.7.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.3.md b/apps/site/app/[en]/blog/release/v0.7.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.3.md rename to apps/site/app/[en]/blog/release/v0.7.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.4.md b/apps/site/app/[en]/blog/release/v0.7.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.4.md rename to apps/site/app/[en]/blog/release/v0.7.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.5.md b/apps/site/app/[en]/blog/release/v0.7.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.5.md rename to apps/site/app/[en]/blog/release/v0.7.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.6.md b/apps/site/app/[en]/blog/release/v0.7.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.6.md rename to apps/site/app/[en]/blog/release/v0.7.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.7.md b/apps/site/app/[en]/blog/release/v0.7.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.7.md rename to apps/site/app/[en]/blog/release/v0.7.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.8.md b/apps/site/app/[en]/blog/release/v0.7.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.8.md rename to apps/site/app/[en]/blog/release/v0.7.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.7.9.md b/apps/site/app/[en]/blog/release/v0.7.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.7.9.md rename to apps/site/app/[en]/blog/release/v0.7.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.0.md b/apps/site/app/[en]/blog/release/v0.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.0.md rename to apps/site/app/[en]/blog/release/v0.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.1.md b/apps/site/app/[en]/blog/release/v0.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.1.md rename to apps/site/app/[en]/blog/release/v0.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.10.md b/apps/site/app/[en]/blog/release/v0.8.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.10.md rename to apps/site/app/[en]/blog/release/v0.8.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.11.md b/apps/site/app/[en]/blog/release/v0.8.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.11.md rename to apps/site/app/[en]/blog/release/v0.8.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.12.md b/apps/site/app/[en]/blog/release/v0.8.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.12.md rename to apps/site/app/[en]/blog/release/v0.8.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.13.md b/apps/site/app/[en]/blog/release/v0.8.13/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.13.md rename to apps/site/app/[en]/blog/release/v0.8.13/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.14.md b/apps/site/app/[en]/blog/release/v0.8.14/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.14.md rename to apps/site/app/[en]/blog/release/v0.8.14/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.15.md b/apps/site/app/[en]/blog/release/v0.8.15/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.15.md rename to apps/site/app/[en]/blog/release/v0.8.15/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.16.md b/apps/site/app/[en]/blog/release/v0.8.16/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.16.md rename to apps/site/app/[en]/blog/release/v0.8.16/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.17.md b/apps/site/app/[en]/blog/release/v0.8.17/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.17.md rename to apps/site/app/[en]/blog/release/v0.8.17/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.18.md b/apps/site/app/[en]/blog/release/v0.8.18/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.18.md rename to apps/site/app/[en]/blog/release/v0.8.18/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.19.md b/apps/site/app/[en]/blog/release/v0.8.19/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.19.md rename to apps/site/app/[en]/blog/release/v0.8.19/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.2.md b/apps/site/app/[en]/blog/release/v0.8.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.2.md rename to apps/site/app/[en]/blog/release/v0.8.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.20.md b/apps/site/app/[en]/blog/release/v0.8.20/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.20.md rename to apps/site/app/[en]/blog/release/v0.8.20/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.21.md b/apps/site/app/[en]/blog/release/v0.8.21/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.21.md rename to apps/site/app/[en]/blog/release/v0.8.21/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.22.md b/apps/site/app/[en]/blog/release/v0.8.22/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.22.md rename to apps/site/app/[en]/blog/release/v0.8.22/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.23.md b/apps/site/app/[en]/blog/release/v0.8.23/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.23.md rename to apps/site/app/[en]/blog/release/v0.8.23/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.24.md b/apps/site/app/[en]/blog/release/v0.8.24/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.24.md rename to apps/site/app/[en]/blog/release/v0.8.24/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.25.md b/apps/site/app/[en]/blog/release/v0.8.25/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.25.md rename to apps/site/app/[en]/blog/release/v0.8.25/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.26.md b/apps/site/app/[en]/blog/release/v0.8.26/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.26.md rename to apps/site/app/[en]/blog/release/v0.8.26/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.27.md b/apps/site/app/[en]/blog/release/v0.8.27/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.27.md rename to apps/site/app/[en]/blog/release/v0.8.27/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.28.md b/apps/site/app/[en]/blog/release/v0.8.28/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.28.md rename to apps/site/app/[en]/blog/release/v0.8.28/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.3.md b/apps/site/app/[en]/blog/release/v0.8.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.3.md rename to apps/site/app/[en]/blog/release/v0.8.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.4.md b/apps/site/app/[en]/blog/release/v0.8.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.4.md rename to apps/site/app/[en]/blog/release/v0.8.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.5.md b/apps/site/app/[en]/blog/release/v0.8.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.5.md rename to apps/site/app/[en]/blog/release/v0.8.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.6.md b/apps/site/app/[en]/blog/release/v0.8.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.6.md rename to apps/site/app/[en]/blog/release/v0.8.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.7.md b/apps/site/app/[en]/blog/release/v0.8.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.7.md rename to apps/site/app/[en]/blog/release/v0.8.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.8.md b/apps/site/app/[en]/blog/release/v0.8.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.8.md rename to apps/site/app/[en]/blog/release/v0.8.8/page.md diff --git a/apps/site/pages/en/blog/release/v0.8.9.md b/apps/site/app/[en]/blog/release/v0.8.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.8.9.md rename to apps/site/app/[en]/blog/release/v0.8.9/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.0.md b/apps/site/app/[en]/blog/release/v0.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.0.md rename to apps/site/app/[en]/blog/release/v0.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.1.md b/apps/site/app/[en]/blog/release/v0.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.1.md rename to apps/site/app/[en]/blog/release/v0.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.10.md b/apps/site/app/[en]/blog/release/v0.9.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.10.md rename to apps/site/app/[en]/blog/release/v0.9.10/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.11.md b/apps/site/app/[en]/blog/release/v0.9.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.11.md rename to apps/site/app/[en]/blog/release/v0.9.11/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.12.md b/apps/site/app/[en]/blog/release/v0.9.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.12.md rename to apps/site/app/[en]/blog/release/v0.9.12/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.2.md b/apps/site/app/[en]/blog/release/v0.9.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.2.md rename to apps/site/app/[en]/blog/release/v0.9.2/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.3.md b/apps/site/app/[en]/blog/release/v0.9.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.3.md rename to apps/site/app/[en]/blog/release/v0.9.3/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.4.md b/apps/site/app/[en]/blog/release/v0.9.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.4.md rename to apps/site/app/[en]/blog/release/v0.9.4/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.5.md b/apps/site/app/[en]/blog/release/v0.9.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.5.md rename to apps/site/app/[en]/blog/release/v0.9.5/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.6.md b/apps/site/app/[en]/blog/release/v0.9.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.6.md rename to apps/site/app/[en]/blog/release/v0.9.6/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.7.md b/apps/site/app/[en]/blog/release/v0.9.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.7.md rename to apps/site/app/[en]/blog/release/v0.9.7/page.md diff --git a/apps/site/pages/en/blog/release/v0.9.8.md b/apps/site/app/[en]/blog/release/v0.9.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v0.9.8.md rename to apps/site/app/[en]/blog/release/v0.9.8/page.md diff --git a/apps/site/pages/en/blog/release/v10.0.0.md b/apps/site/app/[en]/blog/release/v10.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.0.0.md rename to apps/site/app/[en]/blog/release/v10.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.1.0.md b/apps/site/app/[en]/blog/release/v10.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.1.0.md rename to apps/site/app/[en]/blog/release/v10.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.10.0.md b/apps/site/app/[en]/blog/release/v10.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.10.0.md rename to apps/site/app/[en]/blog/release/v10.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.11.0.md b/apps/site/app/[en]/blog/release/v10.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.11.0.md rename to apps/site/app/[en]/blog/release/v10.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.12.0.md b/apps/site/app/[en]/blog/release/v10.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.12.0.md rename to apps/site/app/[en]/blog/release/v10.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.13.0.md b/apps/site/app/[en]/blog/release/v10.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.13.0.md rename to apps/site/app/[en]/blog/release/v10.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.14.0.md b/apps/site/app/[en]/blog/release/v10.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.14.0.md rename to apps/site/app/[en]/blog/release/v10.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.14.1.md b/apps/site/app/[en]/blog/release/v10.14.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.14.1.md rename to apps/site/app/[en]/blog/release/v10.14.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.14.2.md b/apps/site/app/[en]/blog/release/v10.14.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.14.2.md rename to apps/site/app/[en]/blog/release/v10.14.2/page.md diff --git a/apps/site/pages/en/blog/release/v10.15.0.md b/apps/site/app/[en]/blog/release/v10.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.15.0.md rename to apps/site/app/[en]/blog/release/v10.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.15.1.md b/apps/site/app/[en]/blog/release/v10.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.15.1.md rename to apps/site/app/[en]/blog/release/v10.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.15.2.md b/apps/site/app/[en]/blog/release/v10.15.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.15.2.md rename to apps/site/app/[en]/blog/release/v10.15.2/page.md diff --git a/apps/site/pages/en/blog/release/v10.15.3.md b/apps/site/app/[en]/blog/release/v10.15.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.15.3.md rename to apps/site/app/[en]/blog/release/v10.15.3/page.md diff --git a/apps/site/pages/en/blog/release/v10.16.0.md b/apps/site/app/[en]/blog/release/v10.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.16.0.md rename to apps/site/app/[en]/blog/release/v10.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.16.1.md b/apps/site/app/[en]/blog/release/v10.16.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.16.1.md rename to apps/site/app/[en]/blog/release/v10.16.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.16.2.md b/apps/site/app/[en]/blog/release/v10.16.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.16.2.md rename to apps/site/app/[en]/blog/release/v10.16.2/page.md diff --git a/apps/site/pages/en/blog/release/v10.16.3.md b/apps/site/app/[en]/blog/release/v10.16.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.16.3.md rename to apps/site/app/[en]/blog/release/v10.16.3/page.md diff --git a/apps/site/pages/en/blog/release/v10.17.0.md b/apps/site/app/[en]/blog/release/v10.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.17.0.md rename to apps/site/app/[en]/blog/release/v10.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.18.0.md b/apps/site/app/[en]/blog/release/v10.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.18.0.md rename to apps/site/app/[en]/blog/release/v10.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.18.1.md b/apps/site/app/[en]/blog/release/v10.18.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.18.1.md rename to apps/site/app/[en]/blog/release/v10.18.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.19.0.md b/apps/site/app/[en]/blog/release/v10.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.19.0.md rename to apps/site/app/[en]/blog/release/v10.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.2.0.md b/apps/site/app/[en]/blog/release/v10.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.2.0.md rename to apps/site/app/[en]/blog/release/v10.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.2.1.md b/apps/site/app/[en]/blog/release/v10.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.2.1.md rename to apps/site/app/[en]/blog/release/v10.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.20.0.md b/apps/site/app/[en]/blog/release/v10.20.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.20.0.md rename to apps/site/app/[en]/blog/release/v10.20.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.20.1.md b/apps/site/app/[en]/blog/release/v10.20.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.20.1.md rename to apps/site/app/[en]/blog/release/v10.20.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.21.0.md b/apps/site/app/[en]/blog/release/v10.21.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.21.0.md rename to apps/site/app/[en]/blog/release/v10.21.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.22.0.md b/apps/site/app/[en]/blog/release/v10.22.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.22.0.md rename to apps/site/app/[en]/blog/release/v10.22.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.22.1.md b/apps/site/app/[en]/blog/release/v10.22.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.22.1.md rename to apps/site/app/[en]/blog/release/v10.22.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.23.0.md b/apps/site/app/[en]/blog/release/v10.23.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.23.0.md rename to apps/site/app/[en]/blog/release/v10.23.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.23.1.md b/apps/site/app/[en]/blog/release/v10.23.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.23.1.md rename to apps/site/app/[en]/blog/release/v10.23.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.23.2.md b/apps/site/app/[en]/blog/release/v10.23.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.23.2.md rename to apps/site/app/[en]/blog/release/v10.23.2/page.md diff --git a/apps/site/pages/en/blog/release/v10.23.3.md b/apps/site/app/[en]/blog/release/v10.23.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.23.3.md rename to apps/site/app/[en]/blog/release/v10.23.3/page.md diff --git a/apps/site/pages/en/blog/release/v10.24.0.md b/apps/site/app/[en]/blog/release/v10.24.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.24.0.md rename to apps/site/app/[en]/blog/release/v10.24.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.24.1.md b/apps/site/app/[en]/blog/release/v10.24.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.24.1.md rename to apps/site/app/[en]/blog/release/v10.24.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.3.0.md b/apps/site/app/[en]/blog/release/v10.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.3.0.md rename to apps/site/app/[en]/blog/release/v10.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.4.0.md b/apps/site/app/[en]/blog/release/v10.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.4.0.md rename to apps/site/app/[en]/blog/release/v10.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.4.1.md b/apps/site/app/[en]/blog/release/v10.4.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.4.1.md rename to apps/site/app/[en]/blog/release/v10.4.1/page.md diff --git a/apps/site/pages/en/blog/release/v10.5.0.md b/apps/site/app/[en]/blog/release/v10.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.5.0.md rename to apps/site/app/[en]/blog/release/v10.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.6.0.md b/apps/site/app/[en]/blog/release/v10.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.6.0.md rename to apps/site/app/[en]/blog/release/v10.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.7.0.md b/apps/site/app/[en]/blog/release/v10.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.7.0.md rename to apps/site/app/[en]/blog/release/v10.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.8.0.md b/apps/site/app/[en]/blog/release/v10.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.8.0.md rename to apps/site/app/[en]/blog/release/v10.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v10.9.0.md b/apps/site/app/[en]/blog/release/v10.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v10.9.0.md rename to apps/site/app/[en]/blog/release/v10.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.0.0.md b/apps/site/app/[en]/blog/release/v11.0.0/page.md old mode 100755 new mode 100644 similarity index 100% rename from apps/site/pages/en/blog/release/v11.0.0.md rename to apps/site/app/[en]/blog/release/v11.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.1.0.md b/apps/site/app/[en]/blog/release/v11.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.1.0.md rename to apps/site/app/[en]/blog/release/v11.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.10.0.md b/apps/site/app/[en]/blog/release/v11.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.10.0.md rename to apps/site/app/[en]/blog/release/v11.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.10.1.md b/apps/site/app/[en]/blog/release/v11.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.10.1.md rename to apps/site/app/[en]/blog/release/v11.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v11.11.0.md b/apps/site/app/[en]/blog/release/v11.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.11.0.md rename to apps/site/app/[en]/blog/release/v11.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.12.0.md b/apps/site/app/[en]/blog/release/v11.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.12.0.md rename to apps/site/app/[en]/blog/release/v11.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.13.0.md b/apps/site/app/[en]/blog/release/v11.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.13.0.md rename to apps/site/app/[en]/blog/release/v11.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.14.0.md b/apps/site/app/[en]/blog/release/v11.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.14.0.md rename to apps/site/app/[en]/blog/release/v11.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.15.0.md b/apps/site/app/[en]/blog/release/v11.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.15.0.md rename to apps/site/app/[en]/blog/release/v11.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.2.0.md b/apps/site/app/[en]/blog/release/v11.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.2.0.md rename to apps/site/app/[en]/blog/release/v11.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.3.0.md b/apps/site/app/[en]/blog/release/v11.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.3.0.md rename to apps/site/app/[en]/blog/release/v11.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.4.0.md b/apps/site/app/[en]/blog/release/v11.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.4.0.md rename to apps/site/app/[en]/blog/release/v11.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.5.0.md b/apps/site/app/[en]/blog/release/v11.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.5.0.md rename to apps/site/app/[en]/blog/release/v11.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.6.0.md b/apps/site/app/[en]/blog/release/v11.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.6.0.md rename to apps/site/app/[en]/blog/release/v11.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.7.0.md b/apps/site/app/[en]/blog/release/v11.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.7.0.md rename to apps/site/app/[en]/blog/release/v11.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.8.0.md b/apps/site/app/[en]/blog/release/v11.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.8.0.md rename to apps/site/app/[en]/blog/release/v11.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v11.9.0.md b/apps/site/app/[en]/blog/release/v11.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v11.9.0.md rename to apps/site/app/[en]/blog/release/v11.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.0.0.md b/apps/site/app/[en]/blog/release/v12.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.0.0.md rename to apps/site/app/[en]/blog/release/v12.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.1.0.md b/apps/site/app/[en]/blog/release/v12.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.1.0.md rename to apps/site/app/[en]/blog/release/v12.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.10.0.md b/apps/site/app/[en]/blog/release/v12.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.10.0.md rename to apps/site/app/[en]/blog/release/v12.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.11.0.md b/apps/site/app/[en]/blog/release/v12.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.11.0.md rename to apps/site/app/[en]/blog/release/v12.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.11.1.md b/apps/site/app/[en]/blog/release/v12.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.11.1.md rename to apps/site/app/[en]/blog/release/v12.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.12.0.md b/apps/site/app/[en]/blog/release/v12.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.12.0.md rename to apps/site/app/[en]/blog/release/v12.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.13.0.md b/apps/site/app/[en]/blog/release/v12.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.13.0.md rename to apps/site/app/[en]/blog/release/v12.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.13.1.md b/apps/site/app/[en]/blog/release/v12.13.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.13.1.md rename to apps/site/app/[en]/blog/release/v12.13.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.14.0.md b/apps/site/app/[en]/blog/release/v12.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.14.0.md rename to apps/site/app/[en]/blog/release/v12.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.14.1.md b/apps/site/app/[en]/blog/release/v12.14.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.14.1.md rename to apps/site/app/[en]/blog/release/v12.14.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.15.0.md b/apps/site/app/[en]/blog/release/v12.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.15.0.md rename to apps/site/app/[en]/blog/release/v12.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.16.0.md b/apps/site/app/[en]/blog/release/v12.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.16.0.md rename to apps/site/app/[en]/blog/release/v12.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.16.1.md b/apps/site/app/[en]/blog/release/v12.16.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.16.1.md rename to apps/site/app/[en]/blog/release/v12.16.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.16.2.md b/apps/site/app/[en]/blog/release/v12.16.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.16.2.md rename to apps/site/app/[en]/blog/release/v12.16.2/page.md diff --git a/apps/site/pages/en/blog/release/v12.16.3.md b/apps/site/app/[en]/blog/release/v12.16.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.16.3.md rename to apps/site/app/[en]/blog/release/v12.16.3/page.md diff --git a/apps/site/pages/en/blog/release/v12.17.0.md b/apps/site/app/[en]/blog/release/v12.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.17.0.md rename to apps/site/app/[en]/blog/release/v12.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.18.0.md b/apps/site/app/[en]/blog/release/v12.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.18.0.md rename to apps/site/app/[en]/blog/release/v12.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.18.1.md b/apps/site/app/[en]/blog/release/v12.18.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.18.1.md rename to apps/site/app/[en]/blog/release/v12.18.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.18.2.md b/apps/site/app/[en]/blog/release/v12.18.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.18.2.md rename to apps/site/app/[en]/blog/release/v12.18.2/page.md diff --git a/apps/site/pages/en/blog/release/v12.18.3.md b/apps/site/app/[en]/blog/release/v12.18.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.18.3.md rename to apps/site/app/[en]/blog/release/v12.18.3/page.md diff --git a/apps/site/pages/en/blog/release/v12.18.4.md b/apps/site/app/[en]/blog/release/v12.18.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.18.4.md rename to apps/site/app/[en]/blog/release/v12.18.4/page.md diff --git a/apps/site/pages/en/blog/release/v12.19.0.md b/apps/site/app/[en]/blog/release/v12.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.19.0.md rename to apps/site/app/[en]/blog/release/v12.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.19.1.md b/apps/site/app/[en]/blog/release/v12.19.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.19.1.md rename to apps/site/app/[en]/blog/release/v12.19.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.2.0.md b/apps/site/app/[en]/blog/release/v12.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.2.0.md rename to apps/site/app/[en]/blog/release/v12.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.20.0.md b/apps/site/app/[en]/blog/release/v12.20.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.20.0.md rename to apps/site/app/[en]/blog/release/v12.20.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.20.1.md b/apps/site/app/[en]/blog/release/v12.20.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.20.1.md rename to apps/site/app/[en]/blog/release/v12.20.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.20.2.md b/apps/site/app/[en]/blog/release/v12.20.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.20.2.md rename to apps/site/app/[en]/blog/release/v12.20.2/page.md diff --git a/apps/site/pages/en/blog/release/v12.21.0.md b/apps/site/app/[en]/blog/release/v12.21.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.21.0.md rename to apps/site/app/[en]/blog/release/v12.21.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.0.md b/apps/site/app/[en]/blog/release/v12.22.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.0.md rename to apps/site/app/[en]/blog/release/v12.22.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.1.md b/apps/site/app/[en]/blog/release/v12.22.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.1.md rename to apps/site/app/[en]/blog/release/v12.22.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.10.md b/apps/site/app/[en]/blog/release/v12.22.10/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.10.md rename to apps/site/app/[en]/blog/release/v12.22.10/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.11.md b/apps/site/app/[en]/blog/release/v12.22.11/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.11.md rename to apps/site/app/[en]/blog/release/v12.22.11/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.12.md b/apps/site/app/[en]/blog/release/v12.22.12/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.12.md rename to apps/site/app/[en]/blog/release/v12.22.12/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.2.md b/apps/site/app/[en]/blog/release/v12.22.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.2.md rename to apps/site/app/[en]/blog/release/v12.22.2/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.3.md b/apps/site/app/[en]/blog/release/v12.22.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.3.md rename to apps/site/app/[en]/blog/release/v12.22.3/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.4.md b/apps/site/app/[en]/blog/release/v12.22.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.4.md rename to apps/site/app/[en]/blog/release/v12.22.4/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.5.md b/apps/site/app/[en]/blog/release/v12.22.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.5.md rename to apps/site/app/[en]/blog/release/v12.22.5/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.6.md b/apps/site/app/[en]/blog/release/v12.22.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.6.md rename to apps/site/app/[en]/blog/release/v12.22.6/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.7.md b/apps/site/app/[en]/blog/release/v12.22.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.7.md rename to apps/site/app/[en]/blog/release/v12.22.7/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.8.md b/apps/site/app/[en]/blog/release/v12.22.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.8.md rename to apps/site/app/[en]/blog/release/v12.22.8/page.md diff --git a/apps/site/pages/en/blog/release/v12.22.9.md b/apps/site/app/[en]/blog/release/v12.22.9/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.22.9.md rename to apps/site/app/[en]/blog/release/v12.22.9/page.md diff --git a/apps/site/pages/en/blog/release/v12.3.0.md b/apps/site/app/[en]/blog/release/v12.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.3.0.md rename to apps/site/app/[en]/blog/release/v12.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.3.1.md b/apps/site/app/[en]/blog/release/v12.3.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.3.1.md rename to apps/site/app/[en]/blog/release/v12.3.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.4.0.md b/apps/site/app/[en]/blog/release/v12.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.4.0.md rename to apps/site/app/[en]/blog/release/v12.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.5.0.md b/apps/site/app/[en]/blog/release/v12.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.5.0.md rename to apps/site/app/[en]/blog/release/v12.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.6.0.md b/apps/site/app/[en]/blog/release/v12.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.6.0.md rename to apps/site/app/[en]/blog/release/v12.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.7.0.md b/apps/site/app/[en]/blog/release/v12.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.7.0.md rename to apps/site/app/[en]/blog/release/v12.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.8.0.md b/apps/site/app/[en]/blog/release/v12.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.8.0.md rename to apps/site/app/[en]/blog/release/v12.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.8.1.md b/apps/site/app/[en]/blog/release/v12.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.8.1.md rename to apps/site/app/[en]/blog/release/v12.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v12.9.0.md b/apps/site/app/[en]/blog/release/v12.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.9.0.md rename to apps/site/app/[en]/blog/release/v12.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v12.9.1.md b/apps/site/app/[en]/blog/release/v12.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v12.9.1.md rename to apps/site/app/[en]/blog/release/v12.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v13.0.0.md b/apps/site/app/[en]/blog/release/v13.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.0.0.md rename to apps/site/app/[en]/blog/release/v13.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.0.1.md b/apps/site/app/[en]/blog/release/v13.0.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.0.1.md rename to apps/site/app/[en]/blog/release/v13.0.1/page.md diff --git a/apps/site/pages/en/blog/release/v13.1.0.md b/apps/site/app/[en]/blog/release/v13.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.1.0.md rename to apps/site/app/[en]/blog/release/v13.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.10.0.md b/apps/site/app/[en]/blog/release/v13.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.10.0.md rename to apps/site/app/[en]/blog/release/v13.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.10.1.md b/apps/site/app/[en]/blog/release/v13.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.10.1.md rename to apps/site/app/[en]/blog/release/v13.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v13.11.0.md b/apps/site/app/[en]/blog/release/v13.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.11.0.md rename to apps/site/app/[en]/blog/release/v13.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.12.0.md b/apps/site/app/[en]/blog/release/v13.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.12.0.md rename to apps/site/app/[en]/blog/release/v13.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.13.0.md b/apps/site/app/[en]/blog/release/v13.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.13.0.md rename to apps/site/app/[en]/blog/release/v13.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.14.0.md b/apps/site/app/[en]/blog/release/v13.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.14.0.md rename to apps/site/app/[en]/blog/release/v13.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.2.0.md b/apps/site/app/[en]/blog/release/v13.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.2.0.md rename to apps/site/app/[en]/blog/release/v13.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.3.0.md b/apps/site/app/[en]/blog/release/v13.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.3.0.md rename to apps/site/app/[en]/blog/release/v13.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.4.0.md b/apps/site/app/[en]/blog/release/v13.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.4.0.md rename to apps/site/app/[en]/blog/release/v13.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.5.0.md b/apps/site/app/[en]/blog/release/v13.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.5.0.md rename to apps/site/app/[en]/blog/release/v13.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.6.0.md b/apps/site/app/[en]/blog/release/v13.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.6.0.md rename to apps/site/app/[en]/blog/release/v13.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.7.0.md b/apps/site/app/[en]/blog/release/v13.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.7.0.md rename to apps/site/app/[en]/blog/release/v13.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.8.0.md b/apps/site/app/[en]/blog/release/v13.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.8.0.md rename to apps/site/app/[en]/blog/release/v13.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v13.9.0.md b/apps/site/app/[en]/blog/release/v13.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v13.9.0.md rename to apps/site/app/[en]/blog/release/v13.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.0.0.md b/apps/site/app/[en]/blog/release/v14.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.0.0.md rename to apps/site/app/[en]/blog/release/v14.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.1.0.md b/apps/site/app/[en]/blog/release/v14.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.1.0.md rename to apps/site/app/[en]/blog/release/v14.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.10.0.md b/apps/site/app/[en]/blog/release/v14.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.10.0.md rename to apps/site/app/[en]/blog/release/v14.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.10.1.md b/apps/site/app/[en]/blog/release/v14.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.10.1.md rename to apps/site/app/[en]/blog/release/v14.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.11.0.md b/apps/site/app/[en]/blog/release/v14.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.11.0.md rename to apps/site/app/[en]/blog/release/v14.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.12.0.md b/apps/site/app/[en]/blog/release/v14.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.12.0.md rename to apps/site/app/[en]/blog/release/v14.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.13.0.md b/apps/site/app/[en]/blog/release/v14.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.13.0.md rename to apps/site/app/[en]/blog/release/v14.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.13.1.md b/apps/site/app/[en]/blog/release/v14.13.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.13.1.md rename to apps/site/app/[en]/blog/release/v14.13.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.14.0.md b/apps/site/app/[en]/blog/release/v14.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.14.0.md rename to apps/site/app/[en]/blog/release/v14.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.15.0.md b/apps/site/app/[en]/blog/release/v14.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.15.0.md rename to apps/site/app/[en]/blog/release/v14.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.15.1.md b/apps/site/app/[en]/blog/release/v14.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.15.1.md rename to apps/site/app/[en]/blog/release/v14.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.15.2.md b/apps/site/app/[en]/blog/release/v14.15.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.15.2.md rename to apps/site/app/[en]/blog/release/v14.15.2/page.md diff --git a/apps/site/pages/en/blog/release/v14.15.3.md b/apps/site/app/[en]/blog/release/v14.15.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.15.3.md rename to apps/site/app/[en]/blog/release/v14.15.3/page.md diff --git a/apps/site/pages/en/blog/release/v14.15.4.md b/apps/site/app/[en]/blog/release/v14.15.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.15.4.md rename to apps/site/app/[en]/blog/release/v14.15.4/page.md diff --git a/apps/site/pages/en/blog/release/v14.15.5.md b/apps/site/app/[en]/blog/release/v14.15.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.15.5.md rename to apps/site/app/[en]/blog/release/v14.15.5/page.md diff --git a/apps/site/pages/en/blog/release/v14.16.0.md b/apps/site/app/[en]/blog/release/v14.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.16.0.md rename to apps/site/app/[en]/blog/release/v14.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.16.1.md b/apps/site/app/[en]/blog/release/v14.16.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.16.1.md rename to apps/site/app/[en]/blog/release/v14.16.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.0.md b/apps/site/app/[en]/blog/release/v14.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.0.md rename to apps/site/app/[en]/blog/release/v14.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.1.md b/apps/site/app/[en]/blog/release/v14.17.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.1.md rename to apps/site/app/[en]/blog/release/v14.17.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.2.md b/apps/site/app/[en]/blog/release/v14.17.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.2.md rename to apps/site/app/[en]/blog/release/v14.17.2/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.3.md b/apps/site/app/[en]/blog/release/v14.17.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.3.md rename to apps/site/app/[en]/blog/release/v14.17.3/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.4.md b/apps/site/app/[en]/blog/release/v14.17.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.4.md rename to apps/site/app/[en]/blog/release/v14.17.4/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.5.md b/apps/site/app/[en]/blog/release/v14.17.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.5.md rename to apps/site/app/[en]/blog/release/v14.17.5/page.md diff --git a/apps/site/pages/en/blog/release/v14.17.6.md b/apps/site/app/[en]/blog/release/v14.17.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.17.6.md rename to apps/site/app/[en]/blog/release/v14.17.6/page.md diff --git a/apps/site/pages/en/blog/release/v14.18.0.md b/apps/site/app/[en]/blog/release/v14.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.18.0.md rename to apps/site/app/[en]/blog/release/v14.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.18.1.md b/apps/site/app/[en]/blog/release/v14.18.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.18.1.md rename to apps/site/app/[en]/blog/release/v14.18.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.18.2.md b/apps/site/app/[en]/blog/release/v14.18.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.18.2.md rename to apps/site/app/[en]/blog/release/v14.18.2/page.md diff --git a/apps/site/pages/en/blog/release/v14.18.3.md b/apps/site/app/[en]/blog/release/v14.18.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.18.3.md rename to apps/site/app/[en]/blog/release/v14.18.3/page.md diff --git a/apps/site/pages/en/blog/release/v14.19.0.md b/apps/site/app/[en]/blog/release/v14.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.19.0.md rename to apps/site/app/[en]/blog/release/v14.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.19.1.md b/apps/site/app/[en]/blog/release/v14.19.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.19.1.md rename to apps/site/app/[en]/blog/release/v14.19.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.19.2.md b/apps/site/app/[en]/blog/release/v14.19.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.19.2.md rename to apps/site/app/[en]/blog/release/v14.19.2/page.md diff --git a/apps/site/pages/en/blog/release/v14.19.3.md b/apps/site/app/[en]/blog/release/v14.19.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.19.3.md rename to apps/site/app/[en]/blog/release/v14.19.3/page.md diff --git a/apps/site/pages/en/blog/release/v14.2.0.md b/apps/site/app/[en]/blog/release/v14.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.2.0.md rename to apps/site/app/[en]/blog/release/v14.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.20.0.md b/apps/site/app/[en]/blog/release/v14.20.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.20.0.md rename to apps/site/app/[en]/blog/release/v14.20.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.20.1.md b/apps/site/app/[en]/blog/release/v14.20.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.20.1.md rename to apps/site/app/[en]/blog/release/v14.20.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.21.0.md b/apps/site/app/[en]/blog/release/v14.21.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.21.0.md rename to apps/site/app/[en]/blog/release/v14.21.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.21.1.md b/apps/site/app/[en]/blog/release/v14.21.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.21.1.md rename to apps/site/app/[en]/blog/release/v14.21.1/page.md diff --git a/apps/site/pages/en/blog/release/v14.21.2.md b/apps/site/app/[en]/blog/release/v14.21.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.21.2.md rename to apps/site/app/[en]/blog/release/v14.21.2/page.md diff --git a/apps/site/pages/en/blog/release/v14.21.3.md b/apps/site/app/[en]/blog/release/v14.21.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.21.3.md rename to apps/site/app/[en]/blog/release/v14.21.3/page.md diff --git a/apps/site/pages/en/blog/release/v14.3.0.md b/apps/site/app/[en]/blog/release/v14.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.3.0.md rename to apps/site/app/[en]/blog/release/v14.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.4.0.md b/apps/site/app/[en]/blog/release/v14.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.4.0.md rename to apps/site/app/[en]/blog/release/v14.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.5.0.md b/apps/site/app/[en]/blog/release/v14.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.5.0.md rename to apps/site/app/[en]/blog/release/v14.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.6.0.md b/apps/site/app/[en]/blog/release/v14.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.6.0.md rename to apps/site/app/[en]/blog/release/v14.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.7.0.md b/apps/site/app/[en]/blog/release/v14.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.7.0.md rename to apps/site/app/[en]/blog/release/v14.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.8.0.md b/apps/site/app/[en]/blog/release/v14.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.8.0.md rename to apps/site/app/[en]/blog/release/v14.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v14.9.0.md b/apps/site/app/[en]/blog/release/v14.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v14.9.0.md rename to apps/site/app/[en]/blog/release/v14.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.0.0.md b/apps/site/app/[en]/blog/release/v15.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.0.0.md rename to apps/site/app/[en]/blog/release/v15.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.0.1.md b/apps/site/app/[en]/blog/release/v15.0.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.0.1.md rename to apps/site/app/[en]/blog/release/v15.0.1/page.md diff --git a/apps/site/pages/en/blog/release/v15.1.0.md b/apps/site/app/[en]/blog/release/v15.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.1.0.md rename to apps/site/app/[en]/blog/release/v15.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.10.0.md b/apps/site/app/[en]/blog/release/v15.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.10.0.md rename to apps/site/app/[en]/blog/release/v15.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.11.0.md b/apps/site/app/[en]/blog/release/v15.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.11.0.md rename to apps/site/app/[en]/blog/release/v15.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.12.0.md b/apps/site/app/[en]/blog/release/v15.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.12.0.md rename to apps/site/app/[en]/blog/release/v15.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.13.0.md b/apps/site/app/[en]/blog/release/v15.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.13.0.md rename to apps/site/app/[en]/blog/release/v15.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.14.0.md b/apps/site/app/[en]/blog/release/v15.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.14.0.md rename to apps/site/app/[en]/blog/release/v15.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.2.0.md b/apps/site/app/[en]/blog/release/v15.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.2.0.md rename to apps/site/app/[en]/blog/release/v15.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.2.1.md b/apps/site/app/[en]/blog/release/v15.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.2.1.md rename to apps/site/app/[en]/blog/release/v15.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v15.3.0.md b/apps/site/app/[en]/blog/release/v15.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.3.0.md rename to apps/site/app/[en]/blog/release/v15.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.4.0.md b/apps/site/app/[en]/blog/release/v15.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.4.0.md rename to apps/site/app/[en]/blog/release/v15.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.5.0.md b/apps/site/app/[en]/blog/release/v15.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.5.0.md rename to apps/site/app/[en]/blog/release/v15.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.5.1.md b/apps/site/app/[en]/blog/release/v15.5.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.5.1.md rename to apps/site/app/[en]/blog/release/v15.5.1/page.md diff --git a/apps/site/pages/en/blog/release/v15.6.0.md b/apps/site/app/[en]/blog/release/v15.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.6.0.md rename to apps/site/app/[en]/blog/release/v15.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.7.0.md b/apps/site/app/[en]/blog/release/v15.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.7.0.md rename to apps/site/app/[en]/blog/release/v15.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.8.0.md b/apps/site/app/[en]/blog/release/v15.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.8.0.md rename to apps/site/app/[en]/blog/release/v15.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v15.9.0.md b/apps/site/app/[en]/blog/release/v15.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v15.9.0.md rename to apps/site/app/[en]/blog/release/v15.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.0.0.md b/apps/site/app/[en]/blog/release/v16.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.0.0.md rename to apps/site/app/[en]/blog/release/v16.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.1.0.md b/apps/site/app/[en]/blog/release/v16.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.1.0.md rename to apps/site/app/[en]/blog/release/v16.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.10.0.md b/apps/site/app/[en]/blog/release/v16.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.10.0.md rename to apps/site/app/[en]/blog/release/v16.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.11.0.md b/apps/site/app/[en]/blog/release/v16.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.11.0.md rename to apps/site/app/[en]/blog/release/v16.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.11.1.md b/apps/site/app/[en]/blog/release/v16.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.11.1.md rename to apps/site/app/[en]/blog/release/v16.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.12.0.md b/apps/site/app/[en]/blog/release/v16.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.12.0.md rename to apps/site/app/[en]/blog/release/v16.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.13.0.md b/apps/site/app/[en]/blog/release/v16.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.13.0.md rename to apps/site/app/[en]/blog/release/v16.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.13.1.md b/apps/site/app/[en]/blog/release/v16.13.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.13.1.md rename to apps/site/app/[en]/blog/release/v16.13.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.13.2.md b/apps/site/app/[en]/blog/release/v16.13.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.13.2.md rename to apps/site/app/[en]/blog/release/v16.13.2/page.md diff --git a/apps/site/pages/en/blog/release/v16.14.0.md b/apps/site/app/[en]/blog/release/v16.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.14.0.md rename to apps/site/app/[en]/blog/release/v16.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.14.1.md b/apps/site/app/[en]/blog/release/v16.14.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.14.1.md rename to apps/site/app/[en]/blog/release/v16.14.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.14.2.md b/apps/site/app/[en]/blog/release/v16.14.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.14.2.md rename to apps/site/app/[en]/blog/release/v16.14.2/page.md diff --git a/apps/site/pages/en/blog/release/v16.15.0.md b/apps/site/app/[en]/blog/release/v16.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.15.0.md rename to apps/site/app/[en]/blog/release/v16.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.15.1.md b/apps/site/app/[en]/blog/release/v16.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.15.1.md rename to apps/site/app/[en]/blog/release/v16.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.16.0.md b/apps/site/app/[en]/blog/release/v16.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.16.0.md rename to apps/site/app/[en]/blog/release/v16.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.17.0.md b/apps/site/app/[en]/blog/release/v16.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.17.0.md rename to apps/site/app/[en]/blog/release/v16.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.17.1.md b/apps/site/app/[en]/blog/release/v16.17.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.17.1.md rename to apps/site/app/[en]/blog/release/v16.17.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.18.0.md b/apps/site/app/[en]/blog/release/v16.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.18.0.md rename to apps/site/app/[en]/blog/release/v16.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.18.1.md b/apps/site/app/[en]/blog/release/v16.18.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.18.1.md rename to apps/site/app/[en]/blog/release/v16.18.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.19.0.md b/apps/site/app/[en]/blog/release/v16.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.19.0.md rename to apps/site/app/[en]/blog/release/v16.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.19.1.md b/apps/site/app/[en]/blog/release/v16.19.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.19.1.md rename to apps/site/app/[en]/blog/release/v16.19.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.2.0.md b/apps/site/app/[en]/blog/release/v16.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.2.0.md rename to apps/site/app/[en]/blog/release/v16.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.20.0.md b/apps/site/app/[en]/blog/release/v16.20.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.20.0.md rename to apps/site/app/[en]/blog/release/v16.20.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.20.1.md b/apps/site/app/[en]/blog/release/v16.20.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.20.1.md rename to apps/site/app/[en]/blog/release/v16.20.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.20.2.md b/apps/site/app/[en]/blog/release/v16.20.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.20.2.md rename to apps/site/app/[en]/blog/release/v16.20.2/page.md diff --git a/apps/site/pages/en/blog/release/v16.3.0.md b/apps/site/app/[en]/blog/release/v16.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.3.0.md rename to apps/site/app/[en]/blog/release/v16.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.4.0.md b/apps/site/app/[en]/blog/release/v16.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.4.0.md rename to apps/site/app/[en]/blog/release/v16.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.4.1.md b/apps/site/app/[en]/blog/release/v16.4.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.4.1.md rename to apps/site/app/[en]/blog/release/v16.4.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.4.2.md b/apps/site/app/[en]/blog/release/v16.4.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.4.2.md rename to apps/site/app/[en]/blog/release/v16.4.2/page.md diff --git a/apps/site/pages/en/blog/release/v16.5.0.md b/apps/site/app/[en]/blog/release/v16.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.5.0.md rename to apps/site/app/[en]/blog/release/v16.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.6.0.md b/apps/site/app/[en]/blog/release/v16.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.6.0.md rename to apps/site/app/[en]/blog/release/v16.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.6.1.md b/apps/site/app/[en]/blog/release/v16.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.6.1.md rename to apps/site/app/[en]/blog/release/v16.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v16.6.2.md b/apps/site/app/[en]/blog/release/v16.6.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.6.2.md rename to apps/site/app/[en]/blog/release/v16.6.2/page.md diff --git a/apps/site/pages/en/blog/release/v16.7.0.md b/apps/site/app/[en]/blog/release/v16.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.7.0.md rename to apps/site/app/[en]/blog/release/v16.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.8.0.md b/apps/site/app/[en]/blog/release/v16.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.8.0.md rename to apps/site/app/[en]/blog/release/v16.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.9.0.md b/apps/site/app/[en]/blog/release/v16.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.9.0.md rename to apps/site/app/[en]/blog/release/v16.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v16.9.1.md b/apps/site/app/[en]/blog/release/v16.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v16.9.1.md rename to apps/site/app/[en]/blog/release/v16.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v17.0.0.md b/apps/site/app/[en]/blog/release/v17.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.0.0.md rename to apps/site/app/[en]/blog/release/v17.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.0.1.md b/apps/site/app/[en]/blog/release/v17.0.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.0.1.md rename to apps/site/app/[en]/blog/release/v17.0.1/page.md diff --git a/apps/site/pages/en/blog/release/v17.1.0.md b/apps/site/app/[en]/blog/release/v17.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.1.0.md rename to apps/site/app/[en]/blog/release/v17.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.2.0.md b/apps/site/app/[en]/blog/release/v17.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.2.0.md rename to apps/site/app/[en]/blog/release/v17.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.3.0.md b/apps/site/app/[en]/blog/release/v17.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.3.0.md rename to apps/site/app/[en]/blog/release/v17.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.3.1.md b/apps/site/app/[en]/blog/release/v17.3.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.3.1.md rename to apps/site/app/[en]/blog/release/v17.3.1/page.md diff --git a/apps/site/pages/en/blog/release/v17.4.0.md b/apps/site/app/[en]/blog/release/v17.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.4.0.md rename to apps/site/app/[en]/blog/release/v17.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.5.0.md b/apps/site/app/[en]/blog/release/v17.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.5.0.md rename to apps/site/app/[en]/blog/release/v17.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.6.0.md b/apps/site/app/[en]/blog/release/v17.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.6.0.md rename to apps/site/app/[en]/blog/release/v17.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.7.0.md b/apps/site/app/[en]/blog/release/v17.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.7.0.md rename to apps/site/app/[en]/blog/release/v17.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.7.1.md b/apps/site/app/[en]/blog/release/v17.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.7.1.md rename to apps/site/app/[en]/blog/release/v17.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v17.7.2.md b/apps/site/app/[en]/blog/release/v17.7.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.7.2.md rename to apps/site/app/[en]/blog/release/v17.7.2/page.md diff --git a/apps/site/pages/en/blog/release/v17.8.0.md b/apps/site/app/[en]/blog/release/v17.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.8.0.md rename to apps/site/app/[en]/blog/release/v17.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.9.0.md b/apps/site/app/[en]/blog/release/v17.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.9.0.md rename to apps/site/app/[en]/blog/release/v17.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v17.9.1.md b/apps/site/app/[en]/blog/release/v17.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v17.9.1.md rename to apps/site/app/[en]/blog/release/v17.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.0.0.md b/apps/site/app/[en]/blog/release/v18.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.0.0.md rename to apps/site/app/[en]/blog/release/v18.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.1.0.md b/apps/site/app/[en]/blog/release/v18.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.1.0.md rename to apps/site/app/[en]/blog/release/v18.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.10.0.md b/apps/site/app/[en]/blog/release/v18.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.10.0.md rename to apps/site/app/[en]/blog/release/v18.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.11.0.md b/apps/site/app/[en]/blog/release/v18.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.11.0.md rename to apps/site/app/[en]/blog/release/v18.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.12.0.md b/apps/site/app/[en]/blog/release/v18.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.12.0.md rename to apps/site/app/[en]/blog/release/v18.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.12.1.md b/apps/site/app/[en]/blog/release/v18.12.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.12.1.md rename to apps/site/app/[en]/blog/release/v18.12.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.13.0.md b/apps/site/app/[en]/blog/release/v18.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.13.0.md rename to apps/site/app/[en]/blog/release/v18.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.14.0.md b/apps/site/app/[en]/blog/release/v18.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.14.0.md rename to apps/site/app/[en]/blog/release/v18.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.14.1.md b/apps/site/app/[en]/blog/release/v18.14.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.14.1.md rename to apps/site/app/[en]/blog/release/v18.14.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.14.2.md b/apps/site/app/[en]/blog/release/v18.14.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.14.2.md rename to apps/site/app/[en]/blog/release/v18.14.2/page.md diff --git a/apps/site/pages/en/blog/release/v18.15.0.md b/apps/site/app/[en]/blog/release/v18.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.15.0.md rename to apps/site/app/[en]/blog/release/v18.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.16.0.md b/apps/site/app/[en]/blog/release/v18.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.16.0.md rename to apps/site/app/[en]/blog/release/v18.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.16.1.md b/apps/site/app/[en]/blog/release/v18.16.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.16.1.md rename to apps/site/app/[en]/blog/release/v18.16.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.17.0.md b/apps/site/app/[en]/blog/release/v18.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.17.0.md rename to apps/site/app/[en]/blog/release/v18.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.17.1.md b/apps/site/app/[en]/blog/release/v18.17.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.17.1.md rename to apps/site/app/[en]/blog/release/v18.17.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.18.0.md b/apps/site/app/[en]/blog/release/v18.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.18.0.md rename to apps/site/app/[en]/blog/release/v18.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.18.1.md b/apps/site/app/[en]/blog/release/v18.18.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.18.1.md rename to apps/site/app/[en]/blog/release/v18.18.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.18.2.md b/apps/site/app/[en]/blog/release/v18.18.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.18.2.md rename to apps/site/app/[en]/blog/release/v18.18.2/page.md diff --git a/apps/site/pages/en/blog/release/v18.19.0.md b/apps/site/app/[en]/blog/release/v18.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.19.0.md rename to apps/site/app/[en]/blog/release/v18.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.19.1.md b/apps/site/app/[en]/blog/release/v18.19.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.19.1.md rename to apps/site/app/[en]/blog/release/v18.19.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.2.0.md b/apps/site/app/[en]/blog/release/v18.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.2.0.md rename to apps/site/app/[en]/blog/release/v18.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.0.md b/apps/site/app/[en]/blog/release/v18.20.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.0.md rename to apps/site/app/[en]/blog/release/v18.20.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.1.md b/apps/site/app/[en]/blog/release/v18.20.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.1.md rename to apps/site/app/[en]/blog/release/v18.20.1/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.2.md b/apps/site/app/[en]/blog/release/v18.20.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.2.md rename to apps/site/app/[en]/blog/release/v18.20.2/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.3.md b/apps/site/app/[en]/blog/release/v18.20.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.3.md rename to apps/site/app/[en]/blog/release/v18.20.3/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.4.md b/apps/site/app/[en]/blog/release/v18.20.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.4.md rename to apps/site/app/[en]/blog/release/v18.20.4/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.5.md b/apps/site/app/[en]/blog/release/v18.20.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.5.md rename to apps/site/app/[en]/blog/release/v18.20.5/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.6.md b/apps/site/app/[en]/blog/release/v18.20.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.6.md rename to apps/site/app/[en]/blog/release/v18.20.6/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.7.md b/apps/site/app/[en]/blog/release/v18.20.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.7.md rename to apps/site/app/[en]/blog/release/v18.20.7/page.md diff --git a/apps/site/pages/en/blog/release/v18.20.8.md b/apps/site/app/[en]/blog/release/v18.20.8/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.20.8.md rename to apps/site/app/[en]/blog/release/v18.20.8/page.md diff --git a/apps/site/pages/en/blog/release/v18.3.0.md b/apps/site/app/[en]/blog/release/v18.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.3.0.md rename to apps/site/app/[en]/blog/release/v18.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.4.0.md b/apps/site/app/[en]/blog/release/v18.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.4.0.md rename to apps/site/app/[en]/blog/release/v18.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.5.0.md b/apps/site/app/[en]/blog/release/v18.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.5.0.md rename to apps/site/app/[en]/blog/release/v18.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.6.0.md b/apps/site/app/[en]/blog/release/v18.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.6.0.md rename to apps/site/app/[en]/blog/release/v18.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.7.0.md b/apps/site/app/[en]/blog/release/v18.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.7.0.md rename to apps/site/app/[en]/blog/release/v18.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.8.0.md b/apps/site/app/[en]/blog/release/v18.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.8.0.md rename to apps/site/app/[en]/blog/release/v18.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.9.0.md b/apps/site/app/[en]/blog/release/v18.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.9.0.md rename to apps/site/app/[en]/blog/release/v18.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v18.9.1.md b/apps/site/app/[en]/blog/release/v18.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v18.9.1.md rename to apps/site/app/[en]/blog/release/v18.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v19.0.0.md b/apps/site/app/[en]/blog/release/v19.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.0.0.md rename to apps/site/app/[en]/blog/release/v19.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.0.1.md b/apps/site/app/[en]/blog/release/v19.0.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.0.1.md rename to apps/site/app/[en]/blog/release/v19.0.1/page.md diff --git a/apps/site/pages/en/blog/release/v19.1.0.md b/apps/site/app/[en]/blog/release/v19.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.1.0.md rename to apps/site/app/[en]/blog/release/v19.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.2.0.md b/apps/site/app/[en]/blog/release/v19.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.2.0.md rename to apps/site/app/[en]/blog/release/v19.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.3.0.md b/apps/site/app/[en]/blog/release/v19.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.3.0.md rename to apps/site/app/[en]/blog/release/v19.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.4.0.md b/apps/site/app/[en]/blog/release/v19.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.4.0.md rename to apps/site/app/[en]/blog/release/v19.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.5.0.md b/apps/site/app/[en]/blog/release/v19.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.5.0.md rename to apps/site/app/[en]/blog/release/v19.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.6.0.md b/apps/site/app/[en]/blog/release/v19.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.6.0.md rename to apps/site/app/[en]/blog/release/v19.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.6.1.md b/apps/site/app/[en]/blog/release/v19.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.6.1.md rename to apps/site/app/[en]/blog/release/v19.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v19.7.0.md b/apps/site/app/[en]/blog/release/v19.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.7.0.md rename to apps/site/app/[en]/blog/release/v19.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.8.0.md b/apps/site/app/[en]/blog/release/v19.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.8.0.md rename to apps/site/app/[en]/blog/release/v19.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v19.8.1.md b/apps/site/app/[en]/blog/release/v19.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.8.1.md rename to apps/site/app/[en]/blog/release/v19.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v19.9.0.md b/apps/site/app/[en]/blog/release/v19.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v19.9.0.md rename to apps/site/app/[en]/blog/release/v19.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.0.0.md b/apps/site/app/[en]/blog/release/v20.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.0.0.md rename to apps/site/app/[en]/blog/release/v20.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.1.0.md b/apps/site/app/[en]/blog/release/v20.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.1.0.md rename to apps/site/app/[en]/blog/release/v20.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.10.0.md b/apps/site/app/[en]/blog/release/v20.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.10.0.md rename to apps/site/app/[en]/blog/release/v20.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.11.0.md b/apps/site/app/[en]/blog/release/v20.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.11.0.md rename to apps/site/app/[en]/blog/release/v20.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.11.1.md b/apps/site/app/[en]/blog/release/v20.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.11.1.md rename to apps/site/app/[en]/blog/release/v20.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.12.0.md b/apps/site/app/[en]/blog/release/v20.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.12.0.md rename to apps/site/app/[en]/blog/release/v20.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.12.1.md b/apps/site/app/[en]/blog/release/v20.12.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.12.1.md rename to apps/site/app/[en]/blog/release/v20.12.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.12.2.md b/apps/site/app/[en]/blog/release/v20.12.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.12.2.md rename to apps/site/app/[en]/blog/release/v20.12.2/page.md diff --git a/apps/site/pages/en/blog/release/v20.13.0.md b/apps/site/app/[en]/blog/release/v20.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.13.0.md rename to apps/site/app/[en]/blog/release/v20.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.13.1.md b/apps/site/app/[en]/blog/release/v20.13.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.13.1.md rename to apps/site/app/[en]/blog/release/v20.13.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.14.0.md b/apps/site/app/[en]/blog/release/v20.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.14.0.md rename to apps/site/app/[en]/blog/release/v20.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.15.0.md b/apps/site/app/[en]/blog/release/v20.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.15.0.md rename to apps/site/app/[en]/blog/release/v20.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.15.1.md b/apps/site/app/[en]/blog/release/v20.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.15.1.md rename to apps/site/app/[en]/blog/release/v20.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.16.0.md b/apps/site/app/[en]/blog/release/v20.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.16.0.md rename to apps/site/app/[en]/blog/release/v20.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.17.0.md b/apps/site/app/[en]/blog/release/v20.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.17.0.md rename to apps/site/app/[en]/blog/release/v20.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.18.0.md b/apps/site/app/[en]/blog/release/v20.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.18.0.md rename to apps/site/app/[en]/blog/release/v20.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.18.1.md b/apps/site/app/[en]/blog/release/v20.18.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.18.1.md rename to apps/site/app/[en]/blog/release/v20.18.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.18.2.md b/apps/site/app/[en]/blog/release/v20.18.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.18.2.md rename to apps/site/app/[en]/blog/release/v20.18.2/page.md diff --git a/apps/site/pages/en/blog/release/v20.18.3.md b/apps/site/app/[en]/blog/release/v20.18.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.18.3.md rename to apps/site/app/[en]/blog/release/v20.18.3/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.0.md b/apps/site/app/[en]/blog/release/v20.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.0.md rename to apps/site/app/[en]/blog/release/v20.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.1.md b/apps/site/app/[en]/blog/release/v20.19.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.1.md rename to apps/site/app/[en]/blog/release/v20.19.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.2.md b/apps/site/app/[en]/blog/release/v20.19.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.2.md rename to apps/site/app/[en]/blog/release/v20.19.2/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.3.md b/apps/site/app/[en]/blog/release/v20.19.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.3.md rename to apps/site/app/[en]/blog/release/v20.19.3/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.4.md b/apps/site/app/[en]/blog/release/v20.19.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.4.md rename to apps/site/app/[en]/blog/release/v20.19.4/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.5.md b/apps/site/app/[en]/blog/release/v20.19.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.5.md rename to apps/site/app/[en]/blog/release/v20.19.5/page.md diff --git a/apps/site/pages/en/blog/release/v20.19.6.md b/apps/site/app/[en]/blog/release/v20.19.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.19.6.md rename to apps/site/app/[en]/blog/release/v20.19.6/page.md diff --git a/apps/site/pages/en/blog/release/v20.2.0.md b/apps/site/app/[en]/blog/release/v20.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.2.0.md rename to apps/site/app/[en]/blog/release/v20.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.3.0.md b/apps/site/app/[en]/blog/release/v20.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.3.0.md rename to apps/site/app/[en]/blog/release/v20.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.3.1.md b/apps/site/app/[en]/blog/release/v20.3.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.3.1.md rename to apps/site/app/[en]/blog/release/v20.3.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.4.0.md b/apps/site/app/[en]/blog/release/v20.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.4.0.md rename to apps/site/app/[en]/blog/release/v20.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.5.0.md b/apps/site/app/[en]/blog/release/v20.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.5.0.md rename to apps/site/app/[en]/blog/release/v20.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.5.1.md b/apps/site/app/[en]/blog/release/v20.5.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.5.1.md rename to apps/site/app/[en]/blog/release/v20.5.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.6.0.md b/apps/site/app/[en]/blog/release/v20.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.6.0.md rename to apps/site/app/[en]/blog/release/v20.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.6.1.md b/apps/site/app/[en]/blog/release/v20.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.6.1.md rename to apps/site/app/[en]/blog/release/v20.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.7.0.md b/apps/site/app/[en]/blog/release/v20.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.7.0.md rename to apps/site/app/[en]/blog/release/v20.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.8.0.md b/apps/site/app/[en]/blog/release/v20.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.8.0.md rename to apps/site/app/[en]/blog/release/v20.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v20.8.1.md b/apps/site/app/[en]/blog/release/v20.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.8.1.md rename to apps/site/app/[en]/blog/release/v20.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v20.9.0.md b/apps/site/app/[en]/blog/release/v20.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v20.9.0.md rename to apps/site/app/[en]/blog/release/v20.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.0.0.md b/apps/site/app/[en]/blog/release/v21.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.0.0.md rename to apps/site/app/[en]/blog/release/v21.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.1.0.md b/apps/site/app/[en]/blog/release/v21.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.1.0.md rename to apps/site/app/[en]/blog/release/v21.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.2.0.md b/apps/site/app/[en]/blog/release/v21.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.2.0.md rename to apps/site/app/[en]/blog/release/v21.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.3.0.md b/apps/site/app/[en]/blog/release/v21.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.3.0.md rename to apps/site/app/[en]/blog/release/v21.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.4.0.md b/apps/site/app/[en]/blog/release/v21.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.4.0.md rename to apps/site/app/[en]/blog/release/v21.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.5.0.md b/apps/site/app/[en]/blog/release/v21.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.5.0.md rename to apps/site/app/[en]/blog/release/v21.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.6.0.md b/apps/site/app/[en]/blog/release/v21.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.6.0.md rename to apps/site/app/[en]/blog/release/v21.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.6.1.md b/apps/site/app/[en]/blog/release/v21.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.6.1.md rename to apps/site/app/[en]/blog/release/v21.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v21.6.2.md b/apps/site/app/[en]/blog/release/v21.6.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.6.2.md rename to apps/site/app/[en]/blog/release/v21.6.2/page.md diff --git a/apps/site/pages/en/blog/release/v21.7.0.md b/apps/site/app/[en]/blog/release/v21.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.7.0.md rename to apps/site/app/[en]/blog/release/v21.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v21.7.1.md b/apps/site/app/[en]/blog/release/v21.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.7.1.md rename to apps/site/app/[en]/blog/release/v21.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v21.7.2.md b/apps/site/app/[en]/blog/release/v21.7.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.7.2.md rename to apps/site/app/[en]/blog/release/v21.7.2/page.md diff --git a/apps/site/pages/en/blog/release/v21.7.3.md b/apps/site/app/[en]/blog/release/v21.7.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v21.7.3.md rename to apps/site/app/[en]/blog/release/v21.7.3/page.md diff --git a/apps/site/pages/en/blog/release/v22.0.0.md b/apps/site/app/[en]/blog/release/v22.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.0.0.md rename to apps/site/app/[en]/blog/release/v22.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.1.0.md b/apps/site/app/[en]/blog/release/v22.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.1.0.md rename to apps/site/app/[en]/blog/release/v22.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.10.0.md b/apps/site/app/[en]/blog/release/v22.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.10.0.md rename to apps/site/app/[en]/blog/release/v22.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.11.0.md b/apps/site/app/[en]/blog/release/v22.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.11.0.md rename to apps/site/app/[en]/blog/release/v22.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.12.0.md b/apps/site/app/[en]/blog/release/v22.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.12.0.md rename to apps/site/app/[en]/blog/release/v22.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.13.0.md b/apps/site/app/[en]/blog/release/v22.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.13.0.md rename to apps/site/app/[en]/blog/release/v22.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.13.1.md b/apps/site/app/[en]/blog/release/v22.13.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.13.1.md rename to apps/site/app/[en]/blog/release/v22.13.1/page.md diff --git a/apps/site/pages/en/blog/release/v22.14.0.md b/apps/site/app/[en]/blog/release/v22.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.14.0.md rename to apps/site/app/[en]/blog/release/v22.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.15.0.md b/apps/site/app/[en]/blog/release/v22.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.15.0.md rename to apps/site/app/[en]/blog/release/v22.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.15.1.md b/apps/site/app/[en]/blog/release/v22.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.15.1.md rename to apps/site/app/[en]/blog/release/v22.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v22.16.0.md b/apps/site/app/[en]/blog/release/v22.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.16.0.md rename to apps/site/app/[en]/blog/release/v22.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.17.0.md b/apps/site/app/[en]/blog/release/v22.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.17.0.md rename to apps/site/app/[en]/blog/release/v22.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.17.1.md b/apps/site/app/[en]/blog/release/v22.17.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.17.1.md rename to apps/site/app/[en]/blog/release/v22.17.1/page.md diff --git a/apps/site/pages/en/blog/release/v22.18.0.md b/apps/site/app/[en]/blog/release/v22.18.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.18.0.md rename to apps/site/app/[en]/blog/release/v22.18.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.19.0.md b/apps/site/app/[en]/blog/release/v22.19.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.19.0.md rename to apps/site/app/[en]/blog/release/v22.19.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.2.0.md b/apps/site/app/[en]/blog/release/v22.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.2.0.md rename to apps/site/app/[en]/blog/release/v22.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.20.0.md b/apps/site/app/[en]/blog/release/v22.20.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.20.0.md rename to apps/site/app/[en]/blog/release/v22.20.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.21.0.md b/apps/site/app/[en]/blog/release/v22.21.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.21.0.md rename to apps/site/app/[en]/blog/release/v22.21.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.21.1.md b/apps/site/app/[en]/blog/release/v22.21.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.21.1.md rename to apps/site/app/[en]/blog/release/v22.21.1/page.md diff --git a/apps/site/pages/en/blog/release/v22.3.0.md b/apps/site/app/[en]/blog/release/v22.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.3.0.md rename to apps/site/app/[en]/blog/release/v22.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.4.0.md b/apps/site/app/[en]/blog/release/v22.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.4.0.md rename to apps/site/app/[en]/blog/release/v22.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.4.1.md b/apps/site/app/[en]/blog/release/v22.4.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.4.1.md rename to apps/site/app/[en]/blog/release/v22.4.1/page.md diff --git a/apps/site/pages/en/blog/release/v22.5.0.md b/apps/site/app/[en]/blog/release/v22.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.5.0.md rename to apps/site/app/[en]/blog/release/v22.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.5.1.md b/apps/site/app/[en]/blog/release/v22.5.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.5.1.md rename to apps/site/app/[en]/blog/release/v22.5.1/page.md diff --git a/apps/site/pages/en/blog/release/v22.6.0.md b/apps/site/app/[en]/blog/release/v22.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.6.0.md rename to apps/site/app/[en]/blog/release/v22.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.7.0.md b/apps/site/app/[en]/blog/release/v22.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.7.0.md rename to apps/site/app/[en]/blog/release/v22.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.8.0.md b/apps/site/app/[en]/blog/release/v22.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.8.0.md rename to apps/site/app/[en]/blog/release/v22.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v22.9.0.md b/apps/site/app/[en]/blog/release/v22.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v22.9.0.md rename to apps/site/app/[en]/blog/release/v22.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.0.0.md b/apps/site/app/[en]/blog/release/v23.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.0.0.md rename to apps/site/app/[en]/blog/release/v23.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.1.0.md b/apps/site/app/[en]/blog/release/v23.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.1.0.md rename to apps/site/app/[en]/blog/release/v23.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.10.0.md b/apps/site/app/[en]/blog/release/v23.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.10.0.md rename to apps/site/app/[en]/blog/release/v23.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.11.0.md b/apps/site/app/[en]/blog/release/v23.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.11.0.md rename to apps/site/app/[en]/blog/release/v23.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.11.1.md b/apps/site/app/[en]/blog/release/v23.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.11.1.md rename to apps/site/app/[en]/blog/release/v23.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v23.2.0.md b/apps/site/app/[en]/blog/release/v23.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.2.0.md rename to apps/site/app/[en]/blog/release/v23.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.3.0.md b/apps/site/app/[en]/blog/release/v23.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.3.0.md rename to apps/site/app/[en]/blog/release/v23.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.4.0.md b/apps/site/app/[en]/blog/release/v23.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.4.0.md rename to apps/site/app/[en]/blog/release/v23.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.5.0.md b/apps/site/app/[en]/blog/release/v23.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.5.0.md rename to apps/site/app/[en]/blog/release/v23.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.6.0.md b/apps/site/app/[en]/blog/release/v23.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.6.0.md rename to apps/site/app/[en]/blog/release/v23.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.6.1.md b/apps/site/app/[en]/blog/release/v23.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.6.1.md rename to apps/site/app/[en]/blog/release/v23.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v23.7.0.md b/apps/site/app/[en]/blog/release/v23.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.7.0.md rename to apps/site/app/[en]/blog/release/v23.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.8.0.md b/apps/site/app/[en]/blog/release/v23.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.8.0.md rename to apps/site/app/[en]/blog/release/v23.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v23.9.0.md b/apps/site/app/[en]/blog/release/v23.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v23.9.0.md rename to apps/site/app/[en]/blog/release/v23.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.0.0.md b/apps/site/app/[en]/blog/release/v24.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.0.0.md rename to apps/site/app/[en]/blog/release/v24.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.0.1.md b/apps/site/app/[en]/blog/release/v24.0.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.0.1.md rename to apps/site/app/[en]/blog/release/v24.0.1/page.md diff --git a/apps/site/pages/en/blog/release/v24.0.2.md b/apps/site/app/[en]/blog/release/v24.0.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.0.2.md rename to apps/site/app/[en]/blog/release/v24.0.2/page.md diff --git a/apps/site/pages/en/blog/release/v24.1.0.md b/apps/site/app/[en]/blog/release/v24.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.1.0.md rename to apps/site/app/[en]/blog/release/v24.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.10.0.md b/apps/site/app/[en]/blog/release/v24.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.10.0.md rename to apps/site/app/[en]/blog/release/v24.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.11.0.md b/apps/site/app/[en]/blog/release/v24.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.11.0.md rename to apps/site/app/[en]/blog/release/v24.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.11.1.md b/apps/site/app/[en]/blog/release/v24.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.11.1.md rename to apps/site/app/[en]/blog/release/v24.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v24.12.0.md b/apps/site/app/[en]/blog/release/v24.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.12.0.md rename to apps/site/app/[en]/blog/release/v24.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.2.0.md b/apps/site/app/[en]/blog/release/v24.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.2.0.md rename to apps/site/app/[en]/blog/release/v24.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.3.0.md b/apps/site/app/[en]/blog/release/v24.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.3.0.md rename to apps/site/app/[en]/blog/release/v24.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.4.0.md b/apps/site/app/[en]/blog/release/v24.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.4.0.md rename to apps/site/app/[en]/blog/release/v24.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.4.1.md b/apps/site/app/[en]/blog/release/v24.4.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.4.1.md rename to apps/site/app/[en]/blog/release/v24.4.1/page.md diff --git a/apps/site/pages/en/blog/release/v24.5.0.md b/apps/site/app/[en]/blog/release/v24.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.5.0.md rename to apps/site/app/[en]/blog/release/v24.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.6.0.md b/apps/site/app/[en]/blog/release/v24.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.6.0.md rename to apps/site/app/[en]/blog/release/v24.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.7.0.md b/apps/site/app/[en]/blog/release/v24.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.7.0.md rename to apps/site/app/[en]/blog/release/v24.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.8.0.md b/apps/site/app/[en]/blog/release/v24.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.8.0.md rename to apps/site/app/[en]/blog/release/v24.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v24.9.0.md b/apps/site/app/[en]/blog/release/v24.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v24.9.0.md rename to apps/site/app/[en]/blog/release/v24.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v25.0.0.md b/apps/site/app/[en]/blog/release/v25.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v25.0.0.md rename to apps/site/app/[en]/blog/release/v25.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v25.1.0.md b/apps/site/app/[en]/blog/release/v25.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v25.1.0.md rename to apps/site/app/[en]/blog/release/v25.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v25.2.0.md b/apps/site/app/[en]/blog/release/v25.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v25.2.0.md rename to apps/site/app/[en]/blog/release/v25.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v25.2.1.md b/apps/site/app/[en]/blog/release/v25.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v25.2.1.md rename to apps/site/app/[en]/blog/release/v25.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.0.0.md b/apps/site/app/[en]/blog/release/v4.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.0.0.md rename to apps/site/app/[en]/blog/release/v4.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.1.0.md b/apps/site/app/[en]/blog/release/v4.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.1.0.md rename to apps/site/app/[en]/blog/release/v4.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.1.1.md b/apps/site/app/[en]/blog/release/v4.1.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.1.1.md rename to apps/site/app/[en]/blog/release/v4.1.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.1.2.md b/apps/site/app/[en]/blog/release/v4.1.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.1.2.md rename to apps/site/app/[en]/blog/release/v4.1.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.0.md b/apps/site/app/[en]/blog/release/v4.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.0.md rename to apps/site/app/[en]/blog/release/v4.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.1.md b/apps/site/app/[en]/blog/release/v4.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.1.md rename to apps/site/app/[en]/blog/release/v4.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.2.md b/apps/site/app/[en]/blog/release/v4.2.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.2.md rename to apps/site/app/[en]/blog/release/v4.2.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.3.md b/apps/site/app/[en]/blog/release/v4.2.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.3.md rename to apps/site/app/[en]/blog/release/v4.2.3/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.4.md b/apps/site/app/[en]/blog/release/v4.2.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.4.md rename to apps/site/app/[en]/blog/release/v4.2.4/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.5.md b/apps/site/app/[en]/blog/release/v4.2.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.5.md rename to apps/site/app/[en]/blog/release/v4.2.5/page.md diff --git a/apps/site/pages/en/blog/release/v4.2.6.md b/apps/site/app/[en]/blog/release/v4.2.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.2.6.md rename to apps/site/app/[en]/blog/release/v4.2.6/page.md diff --git a/apps/site/pages/en/blog/release/v4.3.0.md b/apps/site/app/[en]/blog/release/v4.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.3.0.md rename to apps/site/app/[en]/blog/release/v4.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.3.1.md b/apps/site/app/[en]/blog/release/v4.3.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.3.1.md rename to apps/site/app/[en]/blog/release/v4.3.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.3.2.md b/apps/site/app/[en]/blog/release/v4.3.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.3.2.md rename to apps/site/app/[en]/blog/release/v4.3.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.0.md b/apps/site/app/[en]/blog/release/v4.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.0.md rename to apps/site/app/[en]/blog/release/v4.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.1.md b/apps/site/app/[en]/blog/release/v4.4.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.1.md rename to apps/site/app/[en]/blog/release/v4.4.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.2.md b/apps/site/app/[en]/blog/release/v4.4.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.2.md rename to apps/site/app/[en]/blog/release/v4.4.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.3.md b/apps/site/app/[en]/blog/release/v4.4.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.3.md rename to apps/site/app/[en]/blog/release/v4.4.3/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.4.md b/apps/site/app/[en]/blog/release/v4.4.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.4.md rename to apps/site/app/[en]/blog/release/v4.4.4/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.5.md b/apps/site/app/[en]/blog/release/v4.4.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.5.md rename to apps/site/app/[en]/blog/release/v4.4.5/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.6.md b/apps/site/app/[en]/blog/release/v4.4.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.6.md rename to apps/site/app/[en]/blog/release/v4.4.6/page.md diff --git a/apps/site/pages/en/blog/release/v4.4.7.md b/apps/site/app/[en]/blog/release/v4.4.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.4.7.md rename to apps/site/app/[en]/blog/release/v4.4.7/page.md diff --git a/apps/site/pages/en/blog/release/v4.5.0.md b/apps/site/app/[en]/blog/release/v4.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.5.0.md rename to apps/site/app/[en]/blog/release/v4.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.6.0.md b/apps/site/app/[en]/blog/release/v4.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.6.0.md rename to apps/site/app/[en]/blog/release/v4.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.6.1.md b/apps/site/app/[en]/blog/release/v4.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.6.1.md rename to apps/site/app/[en]/blog/release/v4.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.6.2.md b/apps/site/app/[en]/blog/release/v4.6.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.6.2.md rename to apps/site/app/[en]/blog/release/v4.6.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.7.0.md b/apps/site/app/[en]/blog/release/v4.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.7.0.md rename to apps/site/app/[en]/blog/release/v4.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.7.1.md b/apps/site/app/[en]/blog/release/v4.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.7.1.md rename to apps/site/app/[en]/blog/release/v4.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.7.2.md b/apps/site/app/[en]/blog/release/v4.7.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.7.2.md rename to apps/site/app/[en]/blog/release/v4.7.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.7.3.md b/apps/site/app/[en]/blog/release/v4.7.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.7.3.md rename to apps/site/app/[en]/blog/release/v4.7.3/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.0.md b/apps/site/app/[en]/blog/release/v4.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.0.md rename to apps/site/app/[en]/blog/release/v4.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.1.md b/apps/site/app/[en]/blog/release/v4.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.1.md rename to apps/site/app/[en]/blog/release/v4.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.2.md b/apps/site/app/[en]/blog/release/v4.8.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.2.md rename to apps/site/app/[en]/blog/release/v4.8.2/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.3.md b/apps/site/app/[en]/blog/release/v4.8.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.3.md rename to apps/site/app/[en]/blog/release/v4.8.3/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.4.md b/apps/site/app/[en]/blog/release/v4.8.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.4.md rename to apps/site/app/[en]/blog/release/v4.8.4/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.5.md b/apps/site/app/[en]/blog/release/v4.8.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.5.md rename to apps/site/app/[en]/blog/release/v4.8.5/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.6.md b/apps/site/app/[en]/blog/release/v4.8.6/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.6.md rename to apps/site/app/[en]/blog/release/v4.8.6/page.md diff --git a/apps/site/pages/en/blog/release/v4.8.7.md b/apps/site/app/[en]/blog/release/v4.8.7/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.8.7.md rename to apps/site/app/[en]/blog/release/v4.8.7/page.md diff --git a/apps/site/pages/en/blog/release/v4.9.0.md b/apps/site/app/[en]/blog/release/v4.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.9.0.md rename to apps/site/app/[en]/blog/release/v4.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v4.9.1.md b/apps/site/app/[en]/blog/release/v4.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v4.9.1.md rename to apps/site/app/[en]/blog/release/v4.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v5.0.0.md b/apps/site/app/[en]/blog/release/v5.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.0.0.md rename to apps/site/app/[en]/blog/release/v5.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.1.0.md b/apps/site/app/[en]/blog/release/v5.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.1.0.md rename to apps/site/app/[en]/blog/release/v5.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.1.1.md b/apps/site/app/[en]/blog/release/v5.1.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.1.1.md rename to apps/site/app/[en]/blog/release/v5.1.1/page.md diff --git a/apps/site/pages/en/blog/release/v5.10.0.md b/apps/site/app/[en]/blog/release/v5.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.10.0.md rename to apps/site/app/[en]/blog/release/v5.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.10.1.md b/apps/site/app/[en]/blog/release/v5.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.10.1.md rename to apps/site/app/[en]/blog/release/v5.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v5.11.0.md b/apps/site/app/[en]/blog/release/v5.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.11.0.md rename to apps/site/app/[en]/blog/release/v5.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.11.1.md b/apps/site/app/[en]/blog/release/v5.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.11.1.md rename to apps/site/app/[en]/blog/release/v5.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v5.12.0.md b/apps/site/app/[en]/blog/release/v5.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.12.0.md rename to apps/site/app/[en]/blog/release/v5.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.2.0.md b/apps/site/app/[en]/blog/release/v5.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.2.0.md rename to apps/site/app/[en]/blog/release/v5.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.3.0.md b/apps/site/app/[en]/blog/release/v5.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.3.0.md rename to apps/site/app/[en]/blog/release/v5.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.4.0.md b/apps/site/app/[en]/blog/release/v5.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.4.0.md rename to apps/site/app/[en]/blog/release/v5.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.4.1.md b/apps/site/app/[en]/blog/release/v5.4.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.4.1.md rename to apps/site/app/[en]/blog/release/v5.4.1/page.md diff --git a/apps/site/pages/en/blog/release/v5.5.0.md b/apps/site/app/[en]/blog/release/v5.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.5.0.md rename to apps/site/app/[en]/blog/release/v5.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.6.0.md b/apps/site/app/[en]/blog/release/v5.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.6.0.md rename to apps/site/app/[en]/blog/release/v5.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.7.0.md b/apps/site/app/[en]/blog/release/v5.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.7.0.md rename to apps/site/app/[en]/blog/release/v5.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.7.1.md b/apps/site/app/[en]/blog/release/v5.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.7.1.md rename to apps/site/app/[en]/blog/release/v5.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v5.8.0.md b/apps/site/app/[en]/blog/release/v5.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.8.0.md rename to apps/site/app/[en]/blog/release/v5.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.9.0.md b/apps/site/app/[en]/blog/release/v5.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.9.0.md rename to apps/site/app/[en]/blog/release/v5.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v5.9.1.md b/apps/site/app/[en]/blog/release/v5.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v5.9.1.md rename to apps/site/app/[en]/blog/release/v5.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.0.0.md b/apps/site/app/[en]/blog/release/v6.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.0.0.md rename to apps/site/app/[en]/blog/release/v6.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.1.0.md b/apps/site/app/[en]/blog/release/v6.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.1.0.md rename to apps/site/app/[en]/blog/release/v6.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.10.0.md b/apps/site/app/[en]/blog/release/v6.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.10.0.md rename to apps/site/app/[en]/blog/release/v6.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.10.1.md b/apps/site/app/[en]/blog/release/v6.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.10.1.md rename to apps/site/app/[en]/blog/release/v6.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.10.2.md b/apps/site/app/[en]/blog/release/v6.10.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.10.2.md rename to apps/site/app/[en]/blog/release/v6.10.2/page.md diff --git a/apps/site/pages/en/blog/release/v6.10.3.md b/apps/site/app/[en]/blog/release/v6.10.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.10.3.md rename to apps/site/app/[en]/blog/release/v6.10.3/page.md diff --git a/apps/site/pages/en/blog/release/v6.11.0.md b/apps/site/app/[en]/blog/release/v6.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.11.0.md rename to apps/site/app/[en]/blog/release/v6.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.11.1.md b/apps/site/app/[en]/blog/release/v6.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.11.1.md rename to apps/site/app/[en]/blog/release/v6.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.11.2.md b/apps/site/app/[en]/blog/release/v6.11.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.11.2.md rename to apps/site/app/[en]/blog/release/v6.11.2/page.md diff --git a/apps/site/pages/en/blog/release/v6.11.3.md b/apps/site/app/[en]/blog/release/v6.11.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.11.3.md rename to apps/site/app/[en]/blog/release/v6.11.3/page.md diff --git a/apps/site/pages/en/blog/release/v6.11.4.md b/apps/site/app/[en]/blog/release/v6.11.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.11.4.md rename to apps/site/app/[en]/blog/release/v6.11.4/page.md diff --git a/apps/site/pages/en/blog/release/v6.11.5.md b/apps/site/app/[en]/blog/release/v6.11.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.11.5.md rename to apps/site/app/[en]/blog/release/v6.11.5/page.md diff --git a/apps/site/pages/en/blog/release/v6.12.0.md b/apps/site/app/[en]/blog/release/v6.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.12.0.md rename to apps/site/app/[en]/blog/release/v6.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.12.1.md b/apps/site/app/[en]/blog/release/v6.12.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.12.1.md rename to apps/site/app/[en]/blog/release/v6.12.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.12.2.md b/apps/site/app/[en]/blog/release/v6.12.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.12.2.md rename to apps/site/app/[en]/blog/release/v6.12.2/page.md diff --git a/apps/site/pages/en/blog/release/v6.12.3.md b/apps/site/app/[en]/blog/release/v6.12.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.12.3.md rename to apps/site/app/[en]/blog/release/v6.12.3/page.md diff --git a/apps/site/pages/en/blog/release/v6.13.0.md b/apps/site/app/[en]/blog/release/v6.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.13.0.md rename to apps/site/app/[en]/blog/release/v6.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.13.1.md b/apps/site/app/[en]/blog/release/v6.13.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.13.1.md rename to apps/site/app/[en]/blog/release/v6.13.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.14.0.md b/apps/site/app/[en]/blog/release/v6.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.14.0.md rename to apps/site/app/[en]/blog/release/v6.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.14.1.md b/apps/site/app/[en]/blog/release/v6.14.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.14.1.md rename to apps/site/app/[en]/blog/release/v6.14.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.14.2.md b/apps/site/app/[en]/blog/release/v6.14.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.14.2.md rename to apps/site/app/[en]/blog/release/v6.14.2/page.md diff --git a/apps/site/pages/en/blog/release/v6.14.3.md b/apps/site/app/[en]/blog/release/v6.14.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.14.3.md rename to apps/site/app/[en]/blog/release/v6.14.3/page.md diff --git a/apps/site/pages/en/blog/release/v6.14.4.md b/apps/site/app/[en]/blog/release/v6.14.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.14.4.md rename to apps/site/app/[en]/blog/release/v6.14.4/page.md diff --git a/apps/site/pages/en/blog/release/v6.15.0.md b/apps/site/app/[en]/blog/release/v6.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.15.0.md rename to apps/site/app/[en]/blog/release/v6.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.15.1.md b/apps/site/app/[en]/blog/release/v6.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.15.1.md rename to apps/site/app/[en]/blog/release/v6.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.16.0.md b/apps/site/app/[en]/blog/release/v6.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.16.0.md rename to apps/site/app/[en]/blog/release/v6.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.17.0.md b/apps/site/app/[en]/blog/release/v6.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.17.0.md rename to apps/site/app/[en]/blog/release/v6.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.17.1.md b/apps/site/app/[en]/blog/release/v6.17.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.17.1.md rename to apps/site/app/[en]/blog/release/v6.17.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.2.0.md b/apps/site/app/[en]/blog/release/v6.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.2.0.md rename to apps/site/app/[en]/blog/release/v6.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.2.1.md b/apps/site/app/[en]/blog/release/v6.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.2.1.md rename to apps/site/app/[en]/blog/release/v6.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.2.2.md b/apps/site/app/[en]/blog/release/v6.2.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.2.2.md rename to apps/site/app/[en]/blog/release/v6.2.2/page.md diff --git a/apps/site/pages/en/blog/release/v6.3.0.md b/apps/site/app/[en]/blog/release/v6.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.3.0.md rename to apps/site/app/[en]/blog/release/v6.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.3.1.md b/apps/site/app/[en]/blog/release/v6.3.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.3.1.md rename to apps/site/app/[en]/blog/release/v6.3.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.4.0.md b/apps/site/app/[en]/blog/release/v6.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.4.0.md rename to apps/site/app/[en]/blog/release/v6.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.5.0.md b/apps/site/app/[en]/blog/release/v6.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.5.0.md rename to apps/site/app/[en]/blog/release/v6.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.6.0.md b/apps/site/app/[en]/blog/release/v6.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.6.0.md rename to apps/site/app/[en]/blog/release/v6.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.7.0.md b/apps/site/app/[en]/blog/release/v6.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.7.0.md rename to apps/site/app/[en]/blog/release/v6.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.8.0.md b/apps/site/app/[en]/blog/release/v6.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.8.0.md rename to apps/site/app/[en]/blog/release/v6.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.8.1.md b/apps/site/app/[en]/blog/release/v6.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.8.1.md rename to apps/site/app/[en]/blog/release/v6.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.9.0.md b/apps/site/app/[en]/blog/release/v6.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.9.0.md rename to apps/site/app/[en]/blog/release/v6.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v6.9.1.md b/apps/site/app/[en]/blog/release/v6.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.9.1.md rename to apps/site/app/[en]/blog/release/v6.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v6.9.2.md b/apps/site/app/[en]/blog/release/v6.9.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.9.2.md rename to apps/site/app/[en]/blog/release/v6.9.2/page.md diff --git a/apps/site/pages/en/blog/release/v6.9.3.md b/apps/site/app/[en]/blog/release/v6.9.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.9.3.md rename to apps/site/app/[en]/blog/release/v6.9.3/page.md diff --git a/apps/site/pages/en/blog/release/v6.9.4.md b/apps/site/app/[en]/blog/release/v6.9.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.9.4.md rename to apps/site/app/[en]/blog/release/v6.9.4/page.md diff --git a/apps/site/pages/en/blog/release/v6.9.5.md b/apps/site/app/[en]/blog/release/v6.9.5/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v6.9.5.md rename to apps/site/app/[en]/blog/release/v6.9.5/page.md diff --git a/apps/site/pages/en/blog/release/v7.0.0.md b/apps/site/app/[en]/blog/release/v7.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.0.0.md rename to apps/site/app/[en]/blog/release/v7.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.1.0.md b/apps/site/app/[en]/blog/release/v7.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.1.0.md rename to apps/site/app/[en]/blog/release/v7.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.10.0.md b/apps/site/app/[en]/blog/release/v7.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.10.0.md rename to apps/site/app/[en]/blog/release/v7.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.10.1.md b/apps/site/app/[en]/blog/release/v7.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.10.1.md rename to apps/site/app/[en]/blog/release/v7.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v7.2.0.md b/apps/site/app/[en]/blog/release/v7.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.2.0.md rename to apps/site/app/[en]/blog/release/v7.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.2.1.md b/apps/site/app/[en]/blog/release/v7.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.2.1.md rename to apps/site/app/[en]/blog/release/v7.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v7.3.0.md b/apps/site/app/[en]/blog/release/v7.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.3.0.md rename to apps/site/app/[en]/blog/release/v7.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.4.0.md b/apps/site/app/[en]/blog/release/v7.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.4.0.md rename to apps/site/app/[en]/blog/release/v7.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.5.0.md b/apps/site/app/[en]/blog/release/v7.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.5.0.md rename to apps/site/app/[en]/blog/release/v7.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.6.0.md b/apps/site/app/[en]/blog/release/v7.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.6.0.md rename to apps/site/app/[en]/blog/release/v7.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.7.0.md b/apps/site/app/[en]/blog/release/v7.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.7.0.md rename to apps/site/app/[en]/blog/release/v7.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.7.1.md b/apps/site/app/[en]/blog/release/v7.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.7.1.md rename to apps/site/app/[en]/blog/release/v7.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v7.7.2.md b/apps/site/app/[en]/blog/release/v7.7.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.7.2.md rename to apps/site/app/[en]/blog/release/v7.7.2/page.md diff --git a/apps/site/pages/en/blog/release/v7.7.3.md b/apps/site/app/[en]/blog/release/v7.7.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.7.3.md rename to apps/site/app/[en]/blog/release/v7.7.3/page.md diff --git a/apps/site/pages/en/blog/release/v7.7.4.md b/apps/site/app/[en]/blog/release/v7.7.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.7.4.md rename to apps/site/app/[en]/blog/release/v7.7.4/page.md diff --git a/apps/site/pages/en/blog/release/v7.8.0.md b/apps/site/app/[en]/blog/release/v7.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.8.0.md rename to apps/site/app/[en]/blog/release/v7.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v7.9.0.md b/apps/site/app/[en]/blog/release/v7.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v7.9.0.md rename to apps/site/app/[en]/blog/release/v7.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.0.0.md b/apps/site/app/[en]/blog/release/v8.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.0.0.md rename to apps/site/app/[en]/blog/release/v8.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.1.0.md b/apps/site/app/[en]/blog/release/v8.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.1.0.md rename to apps/site/app/[en]/blog/release/v8.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.1.1.md b/apps/site/app/[en]/blog/release/v8.1.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.1.1.md rename to apps/site/app/[en]/blog/release/v8.1.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.1.2.md b/apps/site/app/[en]/blog/release/v8.1.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.1.2.md rename to apps/site/app/[en]/blog/release/v8.1.2/page.md diff --git a/apps/site/pages/en/blog/release/v8.1.3.md b/apps/site/app/[en]/blog/release/v8.1.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.1.3.md rename to apps/site/app/[en]/blog/release/v8.1.3/page.md diff --git a/apps/site/pages/en/blog/release/v8.1.4.md b/apps/site/app/[en]/blog/release/v8.1.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.1.4.md rename to apps/site/app/[en]/blog/release/v8.1.4/page.md diff --git a/apps/site/pages/en/blog/release/v8.10.0.md b/apps/site/app/[en]/blog/release/v8.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.10.0.md rename to apps/site/app/[en]/blog/release/v8.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.11.0.md b/apps/site/app/[en]/blog/release/v8.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.11.0.md rename to apps/site/app/[en]/blog/release/v8.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.11.1.md b/apps/site/app/[en]/blog/release/v8.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.11.1.md rename to apps/site/app/[en]/blog/release/v8.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.11.2.md b/apps/site/app/[en]/blog/release/v8.11.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.11.2.md rename to apps/site/app/[en]/blog/release/v8.11.2/page.md diff --git a/apps/site/pages/en/blog/release/v8.11.3.md b/apps/site/app/[en]/blog/release/v8.11.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.11.3.md rename to apps/site/app/[en]/blog/release/v8.11.3/page.md diff --git a/apps/site/pages/en/blog/release/v8.11.4.md b/apps/site/app/[en]/blog/release/v8.11.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.11.4.md rename to apps/site/app/[en]/blog/release/v8.11.4/page.md diff --git a/apps/site/pages/en/blog/release/v8.12.0.md b/apps/site/app/[en]/blog/release/v8.12.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.12.0.md rename to apps/site/app/[en]/blog/release/v8.12.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.13.0.md b/apps/site/app/[en]/blog/release/v8.13.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.13.0.md rename to apps/site/app/[en]/blog/release/v8.13.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.14.0.md b/apps/site/app/[en]/blog/release/v8.14.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.14.0.md rename to apps/site/app/[en]/blog/release/v8.14.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.14.1.md b/apps/site/app/[en]/blog/release/v8.14.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.14.1.md rename to apps/site/app/[en]/blog/release/v8.14.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.15.0.md b/apps/site/app/[en]/blog/release/v8.15.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.15.0.md rename to apps/site/app/[en]/blog/release/v8.15.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.15.1.md b/apps/site/app/[en]/blog/release/v8.15.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.15.1.md rename to apps/site/app/[en]/blog/release/v8.15.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.16.0.md b/apps/site/app/[en]/blog/release/v8.16.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.16.0.md rename to apps/site/app/[en]/blog/release/v8.16.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.16.1.md b/apps/site/app/[en]/blog/release/v8.16.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.16.1.md rename to apps/site/app/[en]/blog/release/v8.16.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.16.2.md b/apps/site/app/[en]/blog/release/v8.16.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.16.2.md rename to apps/site/app/[en]/blog/release/v8.16.2/page.md diff --git a/apps/site/pages/en/blog/release/v8.17.0.md b/apps/site/app/[en]/blog/release/v8.17.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.17.0.md rename to apps/site/app/[en]/blog/release/v8.17.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.2.0.md b/apps/site/app/[en]/blog/release/v8.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.2.0.md rename to apps/site/app/[en]/blog/release/v8.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.2.1.md b/apps/site/app/[en]/blog/release/v8.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.2.1.md rename to apps/site/app/[en]/blog/release/v8.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.3.0.md b/apps/site/app/[en]/blog/release/v8.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.3.0.md rename to apps/site/app/[en]/blog/release/v8.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.4.0.md b/apps/site/app/[en]/blog/release/v8.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.4.0.md rename to apps/site/app/[en]/blog/release/v8.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.5.0.md b/apps/site/app/[en]/blog/release/v8.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.5.0.md rename to apps/site/app/[en]/blog/release/v8.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.6.0.md b/apps/site/app/[en]/blog/release/v8.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.6.0.md rename to apps/site/app/[en]/blog/release/v8.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.7.0.md b/apps/site/app/[en]/blog/release/v8.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.7.0.md rename to apps/site/app/[en]/blog/release/v8.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.8.0.md b/apps/site/app/[en]/blog/release/v8.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.8.0.md rename to apps/site/app/[en]/blog/release/v8.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.8.1.md b/apps/site/app/[en]/blog/release/v8.8.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.8.1.md rename to apps/site/app/[en]/blog/release/v8.8.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.9.0.md b/apps/site/app/[en]/blog/release/v8.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.9.0.md rename to apps/site/app/[en]/blog/release/v8.9.0/page.md diff --git a/apps/site/pages/en/blog/release/v8.9.1.md b/apps/site/app/[en]/blog/release/v8.9.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.9.1.md rename to apps/site/app/[en]/blog/release/v8.9.1/page.md diff --git a/apps/site/pages/en/blog/release/v8.9.2.md b/apps/site/app/[en]/blog/release/v8.9.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.9.2.md rename to apps/site/app/[en]/blog/release/v8.9.2/page.md diff --git a/apps/site/pages/en/blog/release/v8.9.3.md b/apps/site/app/[en]/blog/release/v8.9.3/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.9.3.md rename to apps/site/app/[en]/blog/release/v8.9.3/page.md diff --git a/apps/site/pages/en/blog/release/v8.9.4.md b/apps/site/app/[en]/blog/release/v8.9.4/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v8.9.4.md rename to apps/site/app/[en]/blog/release/v8.9.4/page.md diff --git a/apps/site/pages/en/blog/release/v9.0.0.md b/apps/site/app/[en]/blog/release/v9.0.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.0.0.md rename to apps/site/app/[en]/blog/release/v9.0.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.1.0.md b/apps/site/app/[en]/blog/release/v9.1.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.1.0.md rename to apps/site/app/[en]/blog/release/v9.1.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.10.0.md b/apps/site/app/[en]/blog/release/v9.10.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.10.0.md rename to apps/site/app/[en]/blog/release/v9.10.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.10.1.md b/apps/site/app/[en]/blog/release/v9.10.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.10.1.md rename to apps/site/app/[en]/blog/release/v9.10.1/page.md diff --git a/apps/site/pages/en/blog/release/v9.11.0.md b/apps/site/app/[en]/blog/release/v9.11.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.11.0.md rename to apps/site/app/[en]/blog/release/v9.11.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.11.1.md b/apps/site/app/[en]/blog/release/v9.11.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.11.1.md rename to apps/site/app/[en]/blog/release/v9.11.1/page.md diff --git a/apps/site/pages/en/blog/release/v9.11.2.md b/apps/site/app/[en]/blog/release/v9.11.2/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.11.2.md rename to apps/site/app/[en]/blog/release/v9.11.2/page.md diff --git a/apps/site/pages/en/blog/release/v9.2.0.md b/apps/site/app/[en]/blog/release/v9.2.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.2.0.md rename to apps/site/app/[en]/blog/release/v9.2.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.2.1.md b/apps/site/app/[en]/blog/release/v9.2.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.2.1.md rename to apps/site/app/[en]/blog/release/v9.2.1/page.md diff --git a/apps/site/pages/en/blog/release/v9.3.0.md b/apps/site/app/[en]/blog/release/v9.3.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.3.0.md rename to apps/site/app/[en]/blog/release/v9.3.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.4.0.md b/apps/site/app/[en]/blog/release/v9.4.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.4.0.md rename to apps/site/app/[en]/blog/release/v9.4.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.5.0.md b/apps/site/app/[en]/blog/release/v9.5.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.5.0.md rename to apps/site/app/[en]/blog/release/v9.5.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.6.0.md b/apps/site/app/[en]/blog/release/v9.6.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.6.0.md rename to apps/site/app/[en]/blog/release/v9.6.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.6.1.md b/apps/site/app/[en]/blog/release/v9.6.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.6.1.md rename to apps/site/app/[en]/blog/release/v9.6.1/page.md diff --git a/apps/site/pages/en/blog/release/v9.7.0.md b/apps/site/app/[en]/blog/release/v9.7.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.7.0.md rename to apps/site/app/[en]/blog/release/v9.7.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.7.1.md b/apps/site/app/[en]/blog/release/v9.7.1/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.7.1.md rename to apps/site/app/[en]/blog/release/v9.7.1/page.md diff --git a/apps/site/pages/en/blog/release/v9.8.0.md b/apps/site/app/[en]/blog/release/v9.8.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.8.0.md rename to apps/site/app/[en]/blog/release/v9.8.0/page.md diff --git a/apps/site/pages/en/blog/release/v9.9.0.md b/apps/site/app/[en]/blog/release/v9.9.0/page.md similarity index 100% rename from apps/site/pages/en/blog/release/v9.9.0.md rename to apps/site/app/[en]/blog/release/v9.9.0/page.md diff --git a/apps/site/pages/en/blog/uncategorized/10-lts-to-12-lts.md b/apps/site/app/[en]/blog/uncategorized/10-lts-to-12-lts/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/10-lts-to-12-lts.md rename to apps/site/app/[en]/blog/uncategorized/10-lts-to-12-lts/page.md diff --git a/apps/site/pages/en/blog/uncategorized/an-easy-way-to-build-scalable-network-programs.md b/apps/site/app/[en]/blog/uncategorized/an-easy-way-to-build-scalable-network-programs/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/an-easy-way-to-build-scalable-network-programs.md rename to apps/site/app/[en]/blog/uncategorized/an-easy-way-to-build-scalable-network-programs/page.md diff --git a/apps/site/pages/en/blog/uncategorized/bnoordhuis-departure.md b/apps/site/app/[en]/blog/uncategorized/bnoordhuis-departure/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/bnoordhuis-departure.md rename to apps/site/app/[en]/blog/uncategorized/bnoordhuis-departure/page.md diff --git a/apps/site/pages/en/blog/uncategorized/development-environment.md b/apps/site/app/[en]/blog/uncategorized/development-environment/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/development-environment.md rename to apps/site/app/[en]/blog/uncategorized/development-environment/page.md diff --git a/apps/site/pages/en/blog/uncategorized/evolving-the-node-js-brand.md b/apps/site/app/[en]/blog/uncategorized/evolving-the-node-js-brand/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/evolving-the-node-js-brand.md rename to apps/site/app/[en]/blog/uncategorized/evolving-the-node-js-brand/page.md diff --git a/apps/site/pages/en/blog/uncategorized/growing-up.md b/apps/site/app/[en]/blog/uncategorized/growing-up/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/growing-up.md rename to apps/site/app/[en]/blog/uncategorized/growing-up/page.md diff --git a/apps/site/pages/en/blog/uncategorized/jobs-nodejs-org.md b/apps/site/app/[en]/blog/uncategorized/jobs-nodejs-org/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/jobs-nodejs-org.md rename to apps/site/app/[en]/blog/uncategorized/jobs-nodejs-org/page.md diff --git a/apps/site/pages/en/blog/uncategorized/ldapjs-a-reprise-of-ldap.md b/apps/site/app/[en]/blog/uncategorized/ldapjs-a-reprise-of-ldap/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/ldapjs-a-reprise-of-ldap.md rename to apps/site/app/[en]/blog/uncategorized/ldapjs-a-reprise-of-ldap/page.md diff --git a/apps/site/pages/en/blog/uncategorized/libuv-status-report.md b/apps/site/app/[en]/blog/uncategorized/libuv-status-report/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/libuv-status-report.md rename to apps/site/app/[en]/blog/uncategorized/libuv-status-report/page.md diff --git a/apps/site/pages/en/blog/uncategorized/node-interactive-convince-boss.md b/apps/site/app/[en]/blog/uncategorized/node-interactive-convince-boss/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/node-interactive-convince-boss.md rename to apps/site/app/[en]/blog/uncategorized/node-interactive-convince-boss/page.md diff --git a/apps/site/pages/en/blog/uncategorized/node-meetup-this-thursday.md b/apps/site/app/[en]/blog/uncategorized/node-meetup-this-thursday/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/node-meetup-this-thursday.md rename to apps/site/app/[en]/blog/uncategorized/node-meetup-this-thursday/page.md diff --git a/apps/site/pages/en/blog/uncategorized/node-office-hours-cut-short.md b/apps/site/app/[en]/blog/uncategorized/node-office-hours-cut-short/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/node-office-hours-cut-short.md rename to apps/site/app/[en]/blog/uncategorized/node-office-hours-cut-short/page.md diff --git a/apps/site/pages/en/blog/uncategorized/notes-from-the-road.md b/apps/site/app/[en]/blog/uncategorized/notes-from-the-road/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/notes-from-the-road.md rename to apps/site/app/[en]/blog/uncategorized/notes-from-the-road/page.md diff --git a/apps/site/pages/en/blog/uncategorized/office-hours.md b/apps/site/app/[en]/blog/uncategorized/office-hours/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/office-hours.md rename to apps/site/app/[en]/blog/uncategorized/office-hours/page.md diff --git a/apps/site/pages/en/blog/uncategorized/porting-node-to-windows-with-microsofts-help.md b/apps/site/app/[en]/blog/uncategorized/porting-node-to-windows-with-microsofts-help/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/porting-node-to-windows-with-microsofts-help.md rename to apps/site/app/[en]/blog/uncategorized/porting-node-to-windows-with-microsofts-help/page.md diff --git a/apps/site/pages/en/blog/uncategorized/profiling-node-js.md b/apps/site/app/[en]/blog/uncategorized/profiling-node-js/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/profiling-node-js.md rename to apps/site/app/[en]/blog/uncategorized/profiling-node-js/page.md diff --git a/apps/site/pages/en/blog/uncategorized/some-new-node-projects.md b/apps/site/app/[en]/blog/uncategorized/some-new-node-projects/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/some-new-node-projects.md rename to apps/site/app/[en]/blog/uncategorized/some-new-node-projects/page.md diff --git a/apps/site/pages/en/blog/uncategorized/the-videos-from-node-meetup.md b/apps/site/app/[en]/blog/uncategorized/the-videos-from-node-meetup/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/the-videos-from-node-meetup.md rename to apps/site/app/[en]/blog/uncategorized/the-videos-from-node-meetup/page.md diff --git a/apps/site/pages/en/blog/uncategorized/tj-fontaine-new-node-lead.md b/apps/site/app/[en]/blog/uncategorized/tj-fontaine-new-node-lead/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/tj-fontaine-new-node-lead.md rename to apps/site/app/[en]/blog/uncategorized/tj-fontaine-new-node-lead/page.md diff --git a/apps/site/pages/en/blog/uncategorized/trademark.md b/apps/site/app/[en]/blog/uncategorized/trademark/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/trademark.md rename to apps/site/app/[en]/blog/uncategorized/trademark/page.md diff --git a/apps/site/pages/en/blog/uncategorized/version-0-6.md b/apps/site/app/[en]/blog/uncategorized/version-0-6/page.md similarity index 100% rename from apps/site/pages/en/blog/uncategorized/version-0-6.md rename to apps/site/app/[en]/blog/uncategorized/version-0-6/page.md diff --git a/apps/site/pages/en/blog/video/bert-belder-libuv-lxjs-2012.md b/apps/site/app/[en]/blog/video/bert-belder-libuv-lxjs-2012/page.md similarity index 100% rename from apps/site/pages/en/blog/video/bert-belder-libuv-lxjs-2012.md rename to apps/site/app/[en]/blog/video/bert-belder-libuv-lxjs-2012/page.md diff --git a/apps/site/pages/en/blog/video/bryan-cantrill-instrumenting-the-real-time-web.md b/apps/site/app/[en]/blog/video/bryan-cantrill-instrumenting-the-real-time-web/page.md similarity index 100% rename from apps/site/pages/en/blog/video/bryan-cantrill-instrumenting-the-real-time-web.md rename to apps/site/app/[en]/blog/video/bryan-cantrill-instrumenting-the-real-time-web/page.md diff --git a/apps/site/pages/en/blog/video/welcome-to-the-node-blog.md b/apps/site/app/[en]/blog/video/welcome-to-the-node-blog/page.md similarity index 100% rename from apps/site/pages/en/blog/video/welcome-to-the-node-blog.md rename to apps/site/app/[en]/blog/video/welcome-to-the-node-blog/page.md diff --git a/apps/site/pages/en/blog/vulnerability/april-2020-openssl-updates.md b/apps/site/app/[en]/blog/vulnerability/april-2020-openssl-updates/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/april-2020-openssl-updates.md rename to apps/site/app/[en]/blog/vulnerability/april-2020-openssl-updates/page.md diff --git a/apps/site/pages/en/blog/vulnerability/april-2021-security-releases.md b/apps/site/app/[en]/blog/vulnerability/april-2021-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/april-2021-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/april-2021-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/april-2024-security-releases-2.md b/apps/site/app/[en]/blog/vulnerability/april-2024-security-releases-2/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/april-2024-security-releases-2.md rename to apps/site/app/[en]/blog/vulnerability/april-2024-security-releases-2/page.md diff --git a/apps/site/pages/en/blog/vulnerability/april-2024-security-releases.md b/apps/site/app/[en]/blog/vulnerability/april-2024-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/april-2024-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/april-2024-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/aug-2019-security-releases.md b/apps/site/app/[en]/blog/vulnerability/aug-2019-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/aug-2019-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/aug-2019-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/aug-2021-security-releases.md b/apps/site/app/[en]/blog/vulnerability/aug-2021-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/aug-2021-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/aug-2021-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/aug-2021-security-releases2.md b/apps/site/app/[en]/blog/vulnerability/aug-2021-security-releases2/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/aug-2021-security-releases2.md rename to apps/site/app/[en]/blog/vulnerability/aug-2021-security-releases2/page.md diff --git a/apps/site/pages/en/blog/vulnerability/august-2018-security-releases.md b/apps/site/app/[en]/blog/vulnerability/august-2018-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/august-2018-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/august-2018-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/august-2023-security-releases.md b/apps/site/app/[en]/blog/vulnerability/august-2023-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/august-2023-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/august-2023-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/cve-2015-8027_cve-2015-6764.md b/apps/site/app/[en]/blog/vulnerability/cve-2015-8027_cve-2015-6764/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/cve-2015-8027_cve-2015-6764.md rename to apps/site/app/[en]/blog/vulnerability/cve-2015-8027_cve-2015-6764/page.md diff --git a/apps/site/pages/en/blog/vulnerability/december-2015-security-release-update.md b/apps/site/app/[en]/blog/vulnerability/december-2015-security-release-update/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/december-2015-security-release-update.md rename to apps/site/app/[en]/blog/vulnerability/december-2015-security-release-update/page.md diff --git a/apps/site/pages/en/blog/vulnerability/december-2015-security-releases.md b/apps/site/app/[en]/blog/vulnerability/december-2015-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/december-2015-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/december-2015-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/december-2017-security-releases.md b/apps/site/app/[en]/blog/vulnerability/december-2017-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/december-2017-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/december-2017-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/december-2019-security-releases.md b/apps/site/app/[en]/blog/vulnerability/december-2019-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/december-2019-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/december-2019-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/december-2025-security-releases.md b/apps/site/app/[en]/blog/vulnerability/december-2025-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/december-2025-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/december-2025-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/february-2016-security-releases.md b/apps/site/app/[en]/blog/vulnerability/february-2016-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/february-2016-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/february-2016-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/february-2019-security-releases.md b/apps/site/app/[en]/blog/vulnerability/february-2019-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/february-2019-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/february-2019-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/february-2020-security-releases.md b/apps/site/app/[en]/blog/vulnerability/february-2020-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/february-2020-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/february-2020-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/february-2021-security-releases.md b/apps/site/app/[en]/blog/vulnerability/february-2021-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/february-2021-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/february-2021-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/february-2023-security-releases.md b/apps/site/app/[en]/blog/vulnerability/february-2023-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/february-2023-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/february-2023-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/february-2024-security-releases.md b/apps/site/app/[en]/blog/vulnerability/february-2024-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/february-2024-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/february-2024-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/http-server-pipeline-flood-dos.md b/apps/site/app/[en]/blog/vulnerability/http-server-pipeline-flood-dos/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/http-server-pipeline-flood-dos.md rename to apps/site/app/[en]/blog/vulnerability/http-server-pipeline-flood-dos/page.md diff --git a/apps/site/pages/en/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md b/apps/site/app/[en]/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md rename to apps/site/app/[en]/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17/page.md diff --git a/apps/site/pages/en/blog/vulnerability/jan-2018-spectre-meltdown.md b/apps/site/app/[en]/blog/vulnerability/jan-2018-spectre-meltdown/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/jan-2018-spectre-meltdown.md rename to apps/site/app/[en]/blog/vulnerability/jan-2018-spectre-meltdown/page.md diff --git a/apps/site/pages/en/blog/vulnerability/jan-2022-security-releases.md b/apps/site/app/[en]/blog/vulnerability/jan-2022-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/jan-2022-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/jan-2022-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/january-2021-security-releases.md b/apps/site/app/[en]/blog/vulnerability/january-2021-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/january-2021-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/january-2021-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/january-2025-security-releases.md b/apps/site/app/[en]/blog/vulnerability/january-2025-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/january-2025-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/january-2025-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/july-2017-security-releases.md b/apps/site/app/[en]/blog/vulnerability/july-2017-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/july-2017-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/july-2017-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/july-2021-security-releases-2.md b/apps/site/app/[en]/blog/vulnerability/july-2021-security-releases-2/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/july-2021-security-releases-2.md rename to apps/site/app/[en]/blog/vulnerability/july-2021-security-releases-2/page.md diff --git a/apps/site/pages/en/blog/vulnerability/july-2021-security-releases.md b/apps/site/app/[en]/blog/vulnerability/july-2021-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/july-2021-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/july-2021-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/july-2022-security-releases.md b/apps/site/app/[en]/blog/vulnerability/july-2022-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/july-2022-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/july-2022-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/july-2024-security-releases.md b/apps/site/app/[en]/blog/vulnerability/july-2024-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/july-2024-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/july-2024-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/july-2025-security-releases.md b/apps/site/app/[en]/blog/vulnerability/july-2025-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/july-2025-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/july-2025-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/june-2016-security-releases.md b/apps/site/app/[en]/blog/vulnerability/june-2016-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/june-2016-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/june-2016-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/june-2018-security-releases.md b/apps/site/app/[en]/blog/vulnerability/june-2018-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/june-2018-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/june-2018-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/june-2020-security-releases.md b/apps/site/app/[en]/blog/vulnerability/june-2020-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/june-2020-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/june-2020-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/june-2023-security-releases.md b/apps/site/app/[en]/blog/vulnerability/june-2023-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/june-2023-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/june-2023-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/mar-2022-security-releases.md b/apps/site/app/[en]/blog/vulnerability/mar-2022-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/mar-2022-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/mar-2022-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/march-2018-security-releases.md b/apps/site/app/[en]/blog/vulnerability/march-2018-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/march-2018-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/march-2018-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/march-2025-ci-incident.md b/apps/site/app/[en]/blog/vulnerability/march-2025-ci-incident/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/march-2025-ci-incident.md rename to apps/site/app/[en]/blog/vulnerability/march-2025-ci-incident/page.md diff --git a/apps/site/pages/en/blog/vulnerability/may-2025-security-releases.md b/apps/site/app/[en]/blog/vulnerability/may-2025-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/may-2025-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/may-2025-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/november-2018-security-releases.md b/apps/site/app/[en]/blog/vulnerability/november-2018-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/november-2018-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/november-2018-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/november-2020-security-releases.md b/apps/site/app/[en]/blog/vulnerability/november-2020-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/november-2020-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/november-2020-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/november-2022-security-releases.md b/apps/site/app/[en]/blog/vulnerability/november-2022-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/november-2022-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/november-2022-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/npm-tokens-leak-march-2016.md b/apps/site/app/[en]/blog/vulnerability/npm-tokens-leak-march-2016/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/npm-tokens-leak-march-2016.md rename to apps/site/app/[en]/blog/vulnerability/npm-tokens-leak-march-2016/page.md diff --git a/apps/site/pages/en/blog/vulnerability/oct-2017-dos.md b/apps/site/app/[en]/blog/vulnerability/oct-2017-dos/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/oct-2017-dos.md rename to apps/site/app/[en]/blog/vulnerability/oct-2017-dos/page.md diff --git a/apps/site/pages/en/blog/vulnerability/oct-2021-security-releases.md b/apps/site/app/[en]/blog/vulnerability/oct-2021-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/oct-2021-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/oct-2021-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/october-2016-security-releases.md b/apps/site/app/[en]/blog/vulnerability/october-2016-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/october-2016-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/october-2016-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/october-2023-security-releases.md b/apps/site/app/[en]/blog/vulnerability/october-2023-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/october-2023-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/october-2023-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-and-low-severity-fixes-jan-2016.md b/apps/site/app/[en]/blog/vulnerability/openssl-and-low-severity-fixes-jan-2016/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-and-low-severity-fixes-jan-2016.md rename to apps/site/app/[en]/blog/vulnerability/openssl-and-low-severity-fixes-jan-2016/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-and-utf8.md b/apps/site/app/[en]/blog/vulnerability/openssl-and-utf8/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-and-utf8.md rename to apps/site/app/[en]/blog/vulnerability/openssl-and-utf8/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-and-zlib-vulnerability-assessment.md b/apps/site/app/[en]/blog/vulnerability/openssl-and-zlib-vulnerability-assessment/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-and-zlib-vulnerability-assessment.md rename to apps/site/app/[en]/blog/vulnerability/openssl-and-zlib-vulnerability-assessment/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-dec2022.md b/apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-dec2022/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-dec2022.md rename to apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-dec2022/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-jun2022.md b/apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-jun2022/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-jun2022.md rename to apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-jun2022/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-may2022.md b/apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-may2022/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-may2022.md rename to apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-may2022/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-oct2023.md b/apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-oct2023/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-fixes-in-regular-releases-oct2023.md rename to apps/site/app/[en]/blog/vulnerability/openssl-fixes-in-regular-releases-oct2023/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-january-2017.md b/apps/site/app/[en]/blog/vulnerability/openssl-january-2017/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-january-2017.md rename to apps/site/app/[en]/blog/vulnerability/openssl-january-2017/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-march-2016.md b/apps/site/app/[en]/blog/vulnerability/openssl-march-2016/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-march-2016.md rename to apps/site/app/[en]/blog/vulnerability/openssl-march-2016/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-may-2016.md b/apps/site/app/[en]/blog/vulnerability/openssl-may-2016/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-may-2016.md rename to apps/site/app/[en]/blog/vulnerability/openssl-may-2016/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-november-2017.md b/apps/site/app/[en]/blog/vulnerability/openssl-november-2017/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-november-2017.md rename to apps/site/app/[en]/blog/vulnerability/openssl-november-2017/page.md diff --git a/apps/site/pages/en/blog/vulnerability/openssl-november-2022.md b/apps/site/app/[en]/blog/vulnerability/openssl-november-2022/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/openssl-november-2022.md rename to apps/site/app/[en]/blog/vulnerability/openssl-november-2022/page.md diff --git a/apps/site/pages/en/blog/vulnerability/september-2016-security-releases.md b/apps/site/app/[en]/blog/vulnerability/september-2016-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/september-2016-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/september-2016-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/september-2017-path-validation.md b/apps/site/app/[en]/blog/vulnerability/september-2017-path-validation/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/september-2017-path-validation.md rename to apps/site/app/[en]/blog/vulnerability/september-2017-path-validation/page.md diff --git a/apps/site/pages/en/blog/vulnerability/september-2019-openssl-no-updates.md b/apps/site/app/[en]/blog/vulnerability/september-2019-openssl-no-updates/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/september-2019-openssl-no-updates.md rename to apps/site/app/[en]/blog/vulnerability/september-2019-openssl-no-updates/page.md diff --git a/apps/site/pages/en/blog/vulnerability/september-2019-openssl-updates.md b/apps/site/app/[en]/blog/vulnerability/september-2019-openssl-updates/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/september-2019-openssl-updates.md rename to apps/site/app/[en]/blog/vulnerability/september-2019-openssl-updates/page.md diff --git a/apps/site/pages/en/blog/vulnerability/september-2020-security-releases.md b/apps/site/app/[en]/blog/vulnerability/september-2020-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/september-2020-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/september-2020-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/september-2022-security-releases.md b/apps/site/app/[en]/blog/vulnerability/september-2022-security-releases/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/september-2022-security-releases.md rename to apps/site/app/[en]/blog/vulnerability/september-2022-security-releases/page.md diff --git a/apps/site/pages/en/blog/vulnerability/upcoming-cve-for-eol-versions.md b/apps/site/app/[en]/blog/vulnerability/upcoming-cve-for-eol-versions/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/upcoming-cve-for-eol-versions.md rename to apps/site/app/[en]/blog/vulnerability/upcoming-cve-for-eol-versions/page.md diff --git a/apps/site/pages/en/blog/vulnerability/updates-cve-for-end-of-life.md b/apps/site/app/[en]/blog/vulnerability/updates-cve-for-end-of-life/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/updates-cve-for-end-of-life.md rename to apps/site/app/[en]/blog/vulnerability/updates-cve-for-end-of-life/page.md diff --git a/apps/site/pages/en/blog/vulnerability/v8-memory-corruption-stack-overflow.md b/apps/site/app/[en]/blog/vulnerability/v8-memory-corruption-stack-overflow/page.md similarity index 100% rename from apps/site/pages/en/blog/vulnerability/v8-memory-corruption-stack-overflow.md rename to apps/site/app/[en]/blog/vulnerability/v8-memory-corruption-stack-overflow/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-02-06.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-02-06/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-02-06.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-02-06/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-02-13.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-02-13/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-02-13.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-02-13/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-02-20.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-02-20/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-02-20.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-02-20/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-02-27.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-02-27/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-02-27.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-02-27/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-03-06.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-03-06/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-03-06.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-03-06/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-03-13.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-03-13/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-03-13.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-03-13/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-03-20.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-03-20/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-03-20.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-03-20/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-03-27.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-03-27/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-03-27.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-03-27/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-04-03.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-04-03/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-04-03.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-04-03/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-04-10.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-04-10/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-04-10.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-04-10/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-04-17.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-04-17/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-04-17.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-04-17/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-04-24.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-04-24/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-04-24.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-04-24/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-05-01.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-05-01/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-05-01.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-05-01/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-05-08.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-05-08/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-05-08.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-05-08/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-05-15.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-05-15/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-05-15.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-05-15/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-05-22.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-05-22/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-05-22.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-05-22/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-05-29.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-05-29/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-05-29.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-05-29/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-06-05.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-06-05/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-06-05.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-06-05/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-06-12.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-06-12/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-06-12.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-06-12/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-06-19.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-06-19/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-06-19.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-06-19/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-06-26.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-06-26/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-06-26.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-06-26/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-07-03.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-07-03/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-07-03.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-07-03/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-07-10.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-07-10/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-07-10.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-07-10/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-07-17.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-07-17/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-07-17.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-07-17/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-07-24.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-07-24/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-07-24.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-07-24/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-07-31.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-07-31/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-07-31.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-07-31/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-08-07.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-08-07/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-08-07.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-08-07/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-08-14.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-08-14/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-08-14.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-08-14/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-08-21.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-08-21/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-08-21.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-08-21/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-08-28.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-08-28/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-08-28.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-08-28/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-09-04.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-09-04/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-09-04.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-09-04/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-09-11.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-09-11/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-09-11.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-09-11/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-09-18.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-09-18/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-09-18.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-09-18/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-10-02.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-10-02/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-10-02.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-10-02/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-10-09.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-10-09/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-10-09.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-10-09/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-10-16.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-10-16/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-10-16.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-10-16/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-10-23.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-10-23/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-10-23.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-10-23/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-10-30.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-10-30/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-10-30.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-10-30/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-11-06.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-11-06/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-11-06.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-11-06/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-11-13.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-11-13/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-11-13.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-11-13/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-11-20.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-11-20/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-11-20.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-11-20/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-11-27.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-11-27/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-11-27.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-11-27/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-12-04.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-12-04/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-12-04.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-12-04/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2015-12-11.md b/apps/site/app/[en]/blog/weekly/weekly-update.2015-12-11/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2015-12-11.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2015-12-11/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-01-01.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-01-01/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-01-01.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-01-01/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-01-11.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-01-11/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-01-11.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-01-11/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-01-18.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-01-18/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-01-18.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-01-18/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-01-22.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-01-22/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-01-22.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-01-22/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-01-29.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-01-29/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-01-29.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-01-29/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-02-08.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-02-08/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-02-08.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-02-08/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-02-15.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-02-15/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-02-15.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-02-15/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-02-22.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-02-22/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-02-22.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-02-22/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-03-01.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-03-01/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-03-01.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-03-01/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-03-07.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-03-07/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-03-07.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-03-07/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-03-14.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-03-14/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-03-14.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-03-14/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-04-17.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-04-17/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-04-17.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-04-17/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-04-23.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-04-23/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-04-23.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-04-23/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-04-29.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-04-29/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-04-29.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-04-29/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-05-30.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-05-30/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-05-30.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-05-30/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-06-16.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-06-16/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-06-16.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-06-16/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-06-26.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-06-26/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-06-26.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-06-26/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-07-08.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-07-08/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-07-08.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-07-08/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-07-16.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-07-16/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-07-16.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-07-16/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-07-22.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-07-22/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-07-22.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-07-22/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-08-15.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-08-15/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-08-15.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-08-15/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-10-28.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-10-28/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-10-28.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-10-28/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-11-04.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-11-04/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-11-04.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-11-04/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-11-11.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-11-11/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-11-11.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-11-11/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-11-24.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-11-24/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-11-24.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-11-24/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-12-02.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-12-02/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-12-02.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-12-02/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2016-12-25.md b/apps/site/app/[en]/blog/weekly/weekly-update.2016-12-25/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2016-12-25.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2016-12-25/page.md diff --git a/apps/site/pages/en/blog/weekly/weekly-update.2017-02-10.md b/apps/site/app/[en]/blog/weekly/weekly-update.2017-02-10/page.md similarity index 100% rename from apps/site/pages/en/blog/weekly/weekly-update.2017-02-10.md rename to apps/site/app/[en]/blog/weekly/weekly-update.2017-02-10/page.md diff --git a/apps/site/pages/en/blog/wg/diag-wg-update-2017-02.md b/apps/site/app/[en]/blog/wg/diag-wg-update-2017-02/page.md similarity index 100% rename from apps/site/pages/en/blog/wg/diag-wg-update-2017-02.md rename to apps/site/app/[en]/blog/wg/diag-wg-update-2017-02/page.md diff --git a/apps/site/pages/en/download/archive/index.mdx b/apps/site/app/[en]/download/archive/page.mdx similarity index 100% rename from apps/site/pages/en/download/archive/index.mdx rename to apps/site/app/[en]/download/archive/page.mdx diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/app/[en]/download/current/page.mdx similarity index 100% rename from apps/site/pages/en/download/current.mdx rename to apps/site/app/[en]/download/current/page.mdx diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/app/[en]/download/page.mdx similarity index 100% rename from apps/site/pages/en/download/index.mdx rename to apps/site/app/[en]/download/page.mdx diff --git a/apps/site/pages/en/learn/asynchronous-work/asynchronous-flow-control.md b/apps/site/app/[en]/learn/asynchronous-work/asynchronous-flow-control/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/asynchronous-flow-control.md rename to apps/site/app/[en]/learn/asynchronous-work/asynchronous-flow-control/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/discover-javascript-timers.md b/apps/site/app/[en]/learn/asynchronous-work/discover-javascript-timers/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/discover-javascript-timers.md rename to apps/site/app/[en]/learn/asynchronous-work/discover-javascript-timers/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/discover-promises-in-nodejs.md b/apps/site/app/[en]/learn/asynchronous-work/discover-promises-in-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/discover-promises-in-nodejs.md rename to apps/site/app/[en]/learn/asynchronous-work/discover-promises-in-nodejs/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/dont-block-the-event-loop.md b/apps/site/app/[en]/learn/asynchronous-work/dont-block-the-event-loop/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/dont-block-the-event-loop.md rename to apps/site/app/[en]/learn/asynchronous-work/dont-block-the-event-loop/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/event-loop-timers-and-nexttick.md b/apps/site/app/[en]/learn/asynchronous-work/event-loop-timers-and-nexttick/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/event-loop-timers-and-nexttick.md rename to apps/site/app/[en]/learn/asynchronous-work/event-loop-timers-and-nexttick/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks.md b/apps/site/app/[en]/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks.md rename to apps/site/app/[en]/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/overview-of-blocking-vs-non-blocking.md b/apps/site/app/[en]/learn/asynchronous-work/overview-of-blocking-vs-non-blocking/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/overview-of-blocking-vs-non-blocking.md rename to apps/site/app/[en]/learn/asynchronous-work/overview-of-blocking-vs-non-blocking/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/the-nodejs-event-emitter.md b/apps/site/app/[en]/learn/asynchronous-work/the-nodejs-event-emitter/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/the-nodejs-event-emitter.md rename to apps/site/app/[en]/learn/asynchronous-work/the-nodejs-event-emitter/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/understanding-processnexttick.md b/apps/site/app/[en]/learn/asynchronous-work/understanding-processnexttick/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/understanding-processnexttick.md rename to apps/site/app/[en]/learn/asynchronous-work/understanding-processnexttick/page.md diff --git a/apps/site/pages/en/learn/asynchronous-work/understanding-setimmediate.md b/apps/site/app/[en]/learn/asynchronous-work/understanding-setimmediate/page.md similarity index 100% rename from apps/site/pages/en/learn/asynchronous-work/understanding-setimmediate.md rename to apps/site/app/[en]/learn/asynchronous-work/understanding-setimmediate/page.md diff --git a/apps/site/pages/en/learn/command-line/accept-input-from-the-command-line-in-nodejs.md b/apps/site/app/[en]/learn/command-line/accept-input-from-the-command-line-in-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/command-line/accept-input-from-the-command-line-in-nodejs.md rename to apps/site/app/[en]/learn/command-line/accept-input-from-the-command-line-in-nodejs/page.md diff --git a/apps/site/pages/en/learn/command-line/how-to-read-environment-variables-from-nodejs.md b/apps/site/app/[en]/learn/command-line/how-to-read-environment-variables-from-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/command-line/how-to-read-environment-variables-from-nodejs.md rename to apps/site/app/[en]/learn/command-line/how-to-read-environment-variables-from-nodejs/page.md diff --git a/apps/site/pages/en/learn/command-line/how-to-use-the-nodejs-repl.md b/apps/site/app/[en]/learn/command-line/how-to-use-the-nodejs-repl/page.md similarity index 100% rename from apps/site/pages/en/learn/command-line/how-to-use-the-nodejs-repl.md rename to apps/site/app/[en]/learn/command-line/how-to-use-the-nodejs-repl/page.md diff --git a/apps/site/pages/en/learn/command-line/output-to-the-command-line-using-nodejs.md b/apps/site/app/[en]/learn/command-line/output-to-the-command-line-using-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/command-line/output-to-the-command-line-using-nodejs.md rename to apps/site/app/[en]/learn/command-line/output-to-the-command-line-using-nodejs/page.md diff --git a/apps/site/pages/en/learn/command-line/run-nodejs-scripts-from-the-command-line.md b/apps/site/app/[en]/learn/command-line/run-nodejs-scripts-from-the-command-line/page.md similarity index 100% rename from apps/site/pages/en/learn/command-line/run-nodejs-scripts-from-the-command-line.md rename to apps/site/app/[en]/learn/command-line/run-nodejs-scripts-from-the-command-line/page.md diff --git a/apps/site/pages/en/learn/diagnostics/flame-graphs.md b/apps/site/app/[en]/learn/diagnostics/flame-graphs/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/flame-graphs.md rename to apps/site/app/[en]/learn/diagnostics/flame-graphs/page.md diff --git a/apps/site/pages/en/learn/diagnostics/live-debugging/index.md b/apps/site/app/[en]/learn/diagnostics/live-debugging/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/live-debugging/index.md rename to apps/site/app/[en]/learn/diagnostics/live-debugging/page.md diff --git a/apps/site/pages/en/learn/diagnostics/live-debugging/using-inspector.md b/apps/site/app/[en]/learn/diagnostics/live-debugging/using-inspector/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/live-debugging/using-inspector.md rename to apps/site/app/[en]/learn/diagnostics/live-debugging/using-inspector/page.md diff --git a/apps/site/pages/en/learn/diagnostics/memory/index.md b/apps/site/app/[en]/learn/diagnostics/memory/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/memory/index.md rename to apps/site/app/[en]/learn/diagnostics/memory/page.md diff --git a/apps/site/pages/en/learn/diagnostics/memory/understanding-and-tuning-memory.md b/apps/site/app/[en]/learn/diagnostics/memory/understanding-and-tuning-memory/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/memory/understanding-and-tuning-memory.md rename to apps/site/app/[en]/learn/diagnostics/memory/understanding-and-tuning-memory/page.md diff --git a/apps/site/pages/en/learn/diagnostics/memory/using-gc-traces.md b/apps/site/app/[en]/learn/diagnostics/memory/using-gc-traces/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/memory/using-gc-traces.md rename to apps/site/app/[en]/learn/diagnostics/memory/using-gc-traces/page.md diff --git a/apps/site/pages/en/learn/diagnostics/memory/using-heap-profiler.md b/apps/site/app/[en]/learn/diagnostics/memory/using-heap-profiler/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/memory/using-heap-profiler.md rename to apps/site/app/[en]/learn/diagnostics/memory/using-heap-profiler/page.md diff --git a/apps/site/pages/en/learn/diagnostics/memory/using-heap-snapshot.md b/apps/site/app/[en]/learn/diagnostics/memory/using-heap-snapshot/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/memory/using-heap-snapshot.md rename to apps/site/app/[en]/learn/diagnostics/memory/using-heap-snapshot/page.md diff --git a/apps/site/pages/en/learn/diagnostics/poor-performance/index.md b/apps/site/app/[en]/learn/diagnostics/poor-performance/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/poor-performance/index.md rename to apps/site/app/[en]/learn/diagnostics/poor-performance/page.md diff --git a/apps/site/pages/en/learn/diagnostics/poor-performance/using-linux-perf.md b/apps/site/app/[en]/learn/diagnostics/poor-performance/using-linux-perf/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/poor-performance/using-linux-perf.md rename to apps/site/app/[en]/learn/diagnostics/poor-performance/using-linux-perf/page.md diff --git a/apps/site/pages/en/learn/diagnostics/user-journey.md b/apps/site/app/[en]/learn/diagnostics/user-journey/page.md similarity index 100% rename from apps/site/pages/en/learn/diagnostics/user-journey.md rename to apps/site/app/[en]/learn/diagnostics/user-journey/page.md diff --git a/apps/site/pages/en/learn/getting-started/an-introduction-to-the-npm-package-manager.md b/apps/site/app/[en]/learn/getting-started/an-introduction-to-the-npm-package-manager/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/an-introduction-to-the-npm-package-manager.md rename to apps/site/app/[en]/learn/getting-started/an-introduction-to-the-npm-package-manager/page.md diff --git a/apps/site/pages/en/learn/getting-started/debugging.md b/apps/site/app/[en]/learn/getting-started/debugging/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/debugging.md rename to apps/site/app/[en]/learn/getting-started/debugging/page.md diff --git a/apps/site/pages/en/learn/getting-started/differences-between-nodejs-and-the-browser.md b/apps/site/app/[en]/learn/getting-started/differences-between-nodejs-and-the-browser/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/differences-between-nodejs-and-the-browser.md rename to apps/site/app/[en]/learn/getting-started/differences-between-nodejs-and-the-browser/page.md diff --git a/apps/site/pages/en/learn/getting-started/ecmascript-2015-es6-and-beyond.md b/apps/site/app/[en]/learn/getting-started/ecmascript-2015-es6-and-beyond/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/ecmascript-2015-es6-and-beyond.md rename to apps/site/app/[en]/learn/getting-started/ecmascript-2015-es6-and-beyond/page.md diff --git a/apps/site/pages/en/learn/getting-started/fetch.md b/apps/site/app/[en]/learn/getting-started/fetch/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/fetch.md rename to apps/site/app/[en]/learn/getting-started/fetch/page.md diff --git a/apps/site/pages/en/learn/getting-started/how-much-javascript-do-you-need-to-know-to-use-nodejs.md b/apps/site/app/[en]/learn/getting-started/how-much-javascript-do-you-need-to-know-to-use-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/how-much-javascript-do-you-need-to-know-to-use-nodejs.md rename to apps/site/app/[en]/learn/getting-started/how-much-javascript-do-you-need-to-know-to-use-nodejs/page.md diff --git a/apps/site/pages/en/learn/getting-started/introduction-to-nodejs.md b/apps/site/app/[en]/learn/getting-started/introduction-to-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/introduction-to-nodejs.md rename to apps/site/app/[en]/learn/getting-started/introduction-to-nodejs/page.md diff --git a/apps/site/pages/en/learn/getting-started/nodejs-the-difference-between-development-and-production.md b/apps/site/app/[en]/learn/getting-started/nodejs-the-difference-between-development-and-production/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/nodejs-the-difference-between-development-and-production.md rename to apps/site/app/[en]/learn/getting-started/nodejs-the-difference-between-development-and-production/page.md diff --git a/apps/site/pages/en/learn/getting-started/nodejs-with-webassembly.md b/apps/site/app/[en]/learn/getting-started/nodejs-with-webassembly/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/nodejs-with-webassembly.md rename to apps/site/app/[en]/learn/getting-started/nodejs-with-webassembly/page.md diff --git a/apps/site/pages/en/learn/getting-started/profiling.md b/apps/site/app/[en]/learn/getting-started/profiling/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/profiling.md rename to apps/site/app/[en]/learn/getting-started/profiling/page.md diff --git a/apps/site/pages/en/learn/getting-started/security-best-practices.md b/apps/site/app/[en]/learn/getting-started/security-best-practices/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/security-best-practices.md rename to apps/site/app/[en]/learn/getting-started/security-best-practices/page.md diff --git a/apps/site/pages/en/learn/getting-started/the-v8-javascript-engine.md b/apps/site/app/[en]/learn/getting-started/the-v8-javascript-engine/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/the-v8-javascript-engine.md rename to apps/site/app/[en]/learn/getting-started/the-v8-javascript-engine/page.md diff --git a/apps/site/pages/en/learn/getting-started/userland-migrations.md b/apps/site/app/[en]/learn/getting-started/userland-migrations/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/userland-migrations.md rename to apps/site/app/[en]/learn/getting-started/userland-migrations/page.md diff --git a/apps/site/pages/en/learn/getting-started/websocket.md b/apps/site/app/[en]/learn/getting-started/websocket/page.md similarity index 100% rename from apps/site/pages/en/learn/getting-started/websocket.md rename to apps/site/app/[en]/learn/getting-started/websocket/page.md diff --git a/apps/site/pages/en/learn/http/anatomy-of-an-http-transaction.md b/apps/site/app/[en]/learn/http/anatomy-of-an-http-transaction/page.md similarity index 100% rename from apps/site/pages/en/learn/http/anatomy-of-an-http-transaction.md rename to apps/site/app/[en]/learn/http/anatomy-of-an-http-transaction/page.md diff --git a/apps/site/pages/en/learn/http/enterprise-network-configuration.md b/apps/site/app/[en]/learn/http/enterprise-network-configuration/page.md similarity index 100% rename from apps/site/pages/en/learn/http/enterprise-network-configuration.md rename to apps/site/app/[en]/learn/http/enterprise-network-configuration/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/nodejs-file-paths.md b/apps/site/app/[en]/learn/manipulating-files/nodejs-file-paths/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/nodejs-file-paths.md rename to apps/site/app/[en]/learn/manipulating-files/nodejs-file-paths/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/nodejs-file-stats.md b/apps/site/app/[en]/learn/manipulating-files/nodejs-file-stats/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/nodejs-file-stats.md rename to apps/site/app/[en]/learn/manipulating-files/nodejs-file-stats/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/reading-files-with-nodejs.md b/apps/site/app/[en]/learn/manipulating-files/reading-files-with-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/reading-files-with-nodejs.md rename to apps/site/app/[en]/learn/manipulating-files/reading-files-with-nodejs/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/working-with-different-filesystems.md b/apps/site/app/[en]/learn/manipulating-files/working-with-different-filesystems/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/working-with-different-filesystems.md rename to apps/site/app/[en]/learn/manipulating-files/working-with-different-filesystems/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/working-with-file-descriptors-in-nodejs.md b/apps/site/app/[en]/learn/manipulating-files/working-with-file-descriptors-in-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/working-with-file-descriptors-in-nodejs.md rename to apps/site/app/[en]/learn/manipulating-files/working-with-file-descriptors-in-nodejs/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/working-with-folders-in-nodejs.md b/apps/site/app/[en]/learn/manipulating-files/working-with-folders-in-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/working-with-folders-in-nodejs.md rename to apps/site/app/[en]/learn/manipulating-files/working-with-folders-in-nodejs/page.md diff --git a/apps/site/pages/en/learn/manipulating-files/writing-files-with-nodejs.md b/apps/site/app/[en]/learn/manipulating-files/writing-files-with-nodejs/page.md similarity index 100% rename from apps/site/pages/en/learn/manipulating-files/writing-files-with-nodejs.md rename to apps/site/app/[en]/learn/manipulating-files/writing-files-with-nodejs/page.md diff --git a/apps/site/pages/en/learn/modules/abi-stability.md b/apps/site/app/[en]/learn/modules/abi-stability/page.md similarity index 100% rename from apps/site/pages/en/learn/modules/abi-stability.md rename to apps/site/app/[en]/learn/modules/abi-stability/page.md diff --git a/apps/site/pages/en/learn/modules/backpressuring-in-streams.md b/apps/site/app/[en]/learn/modules/backpressuring-in-streams/page.md similarity index 100% rename from apps/site/pages/en/learn/modules/backpressuring-in-streams.md rename to apps/site/app/[en]/learn/modules/backpressuring-in-streams/page.md diff --git a/apps/site/pages/en/learn/modules/how-to-use-streams.md b/apps/site/app/[en]/learn/modules/how-to-use-streams/page.md similarity index 100% rename from apps/site/pages/en/learn/modules/how-to-use-streams.md rename to apps/site/app/[en]/learn/modules/how-to-use-streams/page.md diff --git a/apps/site/pages/en/learn/modules/publishing-a-package.mdx b/apps/site/app/[en]/learn/modules/publishing-a-package/page.mdx similarity index 100% rename from apps/site/pages/en/learn/modules/publishing-a-package.mdx rename to apps/site/app/[en]/learn/modules/publishing-a-package/page.mdx diff --git a/apps/site/pages/en/learn/modules/publishing-node-api-modules.md b/apps/site/app/[en]/learn/modules/publishing-node-api-modules/page.md similarity index 100% rename from apps/site/pages/en/learn/modules/publishing-node-api-modules.md rename to apps/site/app/[en]/learn/modules/publishing-node-api-modules/page.md diff --git a/apps/site/pages/en/learn/test-runner/collecting-code-coverage.md b/apps/site/app/[en]/learn/test-runner/collecting-code-coverage/page.md similarity index 100% rename from apps/site/pages/en/learn/test-runner/collecting-code-coverage.md rename to apps/site/app/[en]/learn/test-runner/collecting-code-coverage/page.md diff --git a/apps/site/pages/en/learn/test-runner/introduction.md b/apps/site/app/[en]/learn/test-runner/introduction/page.md similarity index 100% rename from apps/site/pages/en/learn/test-runner/introduction.md rename to apps/site/app/[en]/learn/test-runner/introduction/page.md diff --git a/apps/site/pages/en/learn/test-runner/mocking.md b/apps/site/app/[en]/learn/test-runner/mocking/page.md similarity index 100% rename from apps/site/pages/en/learn/test-runner/mocking.md rename to apps/site/app/[en]/learn/test-runner/mocking/page.md diff --git a/apps/site/pages/en/learn/test-runner/using-test-runner.md b/apps/site/app/[en]/learn/test-runner/using-test-runner/page.md similarity index 100% rename from apps/site/pages/en/learn/test-runner/using-test-runner.md rename to apps/site/app/[en]/learn/test-runner/using-test-runner/page.md diff --git a/apps/site/pages/en/learn/typescript/introduction.md b/apps/site/app/[en]/learn/typescript/introduction/page.md similarity index 100% rename from apps/site/pages/en/learn/typescript/introduction.md rename to apps/site/app/[en]/learn/typescript/introduction/page.md diff --git a/apps/site/pages/en/learn/typescript/publishing-a-ts-package.md b/apps/site/app/[en]/learn/typescript/publishing-a-ts-package/page.md similarity index 100% rename from apps/site/pages/en/learn/typescript/publishing-a-ts-package.md rename to apps/site/app/[en]/learn/typescript/publishing-a-ts-package/page.md diff --git a/apps/site/pages/en/learn/typescript/run-natively.md b/apps/site/app/[en]/learn/typescript/run-natively/page.md similarity index 100% rename from apps/site/pages/en/learn/typescript/run-natively.md rename to apps/site/app/[en]/learn/typescript/run-natively/page.md diff --git a/apps/site/pages/en/learn/typescript/run.md b/apps/site/app/[en]/learn/typescript/run/page.md similarity index 100% rename from apps/site/pages/en/learn/typescript/run.md rename to apps/site/app/[en]/learn/typescript/run/page.md diff --git a/apps/site/pages/en/learn/typescript/transpile.md b/apps/site/app/[en]/learn/typescript/transpile/page.md similarity index 100% rename from apps/site/pages/en/learn/typescript/transpile.md rename to apps/site/app/[en]/learn/typescript/transpile/page.md diff --git a/apps/site/app/[locale]/[...path]/page.tsx b/apps/site/app/[locale]/[...path]/page.tsx deleted file mode 100644 index aecb38f3da63f..0000000000000 --- a/apps/site/app/[locale]/[...path]/page.tsx +++ /dev/null @@ -1,97 +0,0 @@ -/** - * This file extends on the `page.tsx` file, which is the default file that is used to render - * the entry points for each locale and then also reused within the [...path] route to render the - * and contains all logic for rendering our dynamic and static routes within the Node.js Website. - * - * Note: that each `page.tsx` should have its own `generateStaticParams` to prevent clash of - * dynamic params, which will lead on static export errors and other sort of issues. - */ - -import { availableLocaleCodes, defaultLocale } from '@node-core/website-i18n'; -import { notFound } from 'next/navigation'; - -import { ENABLE_STATIC_EXPORT } from '#site/next.constants.mjs'; -import { ENABLE_STATIC_EXPORT_LOCALE } from '#site/next.constants.mjs'; -import { dynamicRouter } from '#site/next.dynamic.mjs'; -import * as basePage from '#site/next.dynamic.page.mjs'; - -import type { DynamicParams } from '#site/types'; -import type { FC } from 'react'; - -type PageParams = DynamicParams<{ path: Array }>; - -// This is the default Viewport Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-viewport#generateviewport-function -export const generateViewport = basePage.generateViewport; - -// This generates each page's HTML Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-metadata -export const generateMetadata = basePage.generateMetadata; - -// Generates all possible static paths based on the locales and environment configuration -// - Returns an empty array if static export is disabled (`ENABLE_STATIC_EXPORT` is false) -// - If `ENABLE_STATIC_EXPORT_LOCALE` is true, generates paths for all available locales -// - Otherwise, generates paths only for the default locale -// @see https://nextjs.org/docs/app/api-reference/functions/generate-static-params -export const generateStaticParams = async () => { - // Return an empty array if static export is disabled - if (!ENABLE_STATIC_EXPORT) { - return []; - } - - const routes = await dynamicRouter.getAllRoutes(); - - // Helper function to fetch and map routes for a specific locale - const getRoutesForLocale = async (l: string) => - routes.map(pathname => dynamicRouter.mapPathToRoute(l, pathname)); - - // Determine which locales to include in the static export - const locales = ENABLE_STATIC_EXPORT_LOCALE - ? availableLocaleCodes - : [defaultLocale.code]; - - // Generates all possible routes for all available locales - const routesWithLocales = await Promise.all(locales.map(getRoutesForLocale)); - - return routesWithLocales.flat().sort(); -}; - -// This method parses the current pathname and does any sort of modifications needed on the route -// then it proceeds to retrieve the Markdown file and parse the MDX Content into a React Component -// finally it returns (if the locale and route are valid) the React Component with the relevant context -// and attached context providers for rendering the current page -const getPage: FC = async props => { - const { path, locale: routeLocale } = await props.params; - - // Gets the current full pathname for a given path - const [locale, pathname] = basePage.getLocaleAndPath(path, routeLocale); - - // Gets the Markdown content and context - const [content, context] = await basePage.getMarkdownContext({ - locale, - pathname, - }); - - // If we have a filename and layout then we have a page - if (context.filename && context.frontmatter.layout) { - return basePage.renderPage({ - content, - layout: context.frontmatter.layout, - context, - }); - } - - return notFound(); -}; - -// Enforces that this route is used as static rendering -// Except whenever on the Development mode as we want instant-refresh when making changes -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -export const dynamic = 'force-static'; - -// Ensures that this endpoint is invalidated and re-executed every X minutes -// so that when new deployments happen, the data is refreshed -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate -export const revalidate = 300; - -export default getPage; diff --git a/apps/site/app/[locale]/blog/[...path]/page.tsx b/apps/site/app/[locale]/blog/[...path]/page.tsx deleted file mode 100644 index 2a11e65becc46..0000000000000 --- a/apps/site/app/[locale]/blog/[...path]/page.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { defaultLocale } from '@node-core/website-i18n'; -import { notFound } from 'next/navigation'; - -import { ENABLE_STATIC_EXPORT } from '#site/next.constants.mjs'; -import { BLOG_DYNAMIC_ROUTES } from '#site/next.dynamic.constants.mjs'; -import * as basePage from '#site/next.dynamic.page.mjs'; - -import type { DynamicParams } from '#site/types'; -import type { FC } from 'react'; - -type PageParams = DynamicParams<{ path: Array }>; - -// This is the default Viewport Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-viewport#generateviewport-function -export const generateViewport = basePage.generateViewport; - -// This generates each page's HTML Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-metadata -export const generateMetadata = ({ params }: PageParams) => - basePage.generateMetadata({ params, prefix: 'blog' }); - -// Generates all possible static paths based on the locales and environment configuration -// - Returns an empty array if static export is disabled (`ENABLE_STATIC_EXPORT` is false) -// - If `ENABLE_STATIC_EXPORT_LOCALE` is true, generates paths for all available locales -// - Otherwise, generates paths only for the default locale -// @see https://nextjs.org/docs/app/api-reference/functions/generate-static-params -export const generateStaticParams = async () => { - // Return an empty array if static export is disabled - if (!ENABLE_STATIC_EXPORT) { - return []; - } - - return BLOG_DYNAMIC_ROUTES.map(pathname => ({ - locale: defaultLocale.code, - path: pathname.split('/'), - })); -}; - -// This method parses the current pathname and does any sort of modifications needed on the route -// then it proceeds to retrieve the Markdown file and parse the MDX Content into a React Component -// finally it returns (if the locale and route are valid) the React Component with the relevant context -// and attached context providers for rendering the current page -const getPage: FC = async props => { - const { path, locale: routeLocale } = await props.params; - - // Gets the current full pathname for a given path - const [locale, pathname] = basePage.getLocaleAndPath(path, routeLocale); - - // Verifies if the current route is a dynamic route - const isDynamicRoute = BLOG_DYNAMIC_ROUTES.some(r => r.includes(pathname)); - - // Gets the Markdown content and context for Blog pages - // otherwise this is likely a blog-category or a blog post - const [content, context] = await basePage.getMarkdownContext({ - locale, - pathname: `blog/${pathname}`, - }); - - // If this isn't a valid dynamic route for blog post or there's no markdown file - // for this, then we fail as not found as there's nothing we can do. - if (isDynamicRoute || context.filename) { - return basePage.renderPage({ - content, - layout: context.frontmatter.layout ?? 'blog-category', - context: { ...context, pathname: `/blog/${pathname}` }, - }); - } - - return notFound(); -}; - -// Enforces that this route is used as static rendering -// Except whenever on the Development mode as we want instant-refresh when making changes -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -export const dynamic = 'force-static'; - -// Ensures that this endpoint is invalidated and re-executed every X minutes -// so that when new deployments happen, the data is refreshed -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate -export const revalidate = 300; - -export default getPage; diff --git a/apps/site/app/[locale]/download/archive/[version]/page.tsx b/apps/site/app/[locale]/download/archive/[version]/page.tsx deleted file mode 100644 index 1cc23837ccdf1..0000000000000 --- a/apps/site/app/[locale]/download/archive/[version]/page.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { defaultLocale } from '@node-core/website-i18n'; -import { notFound, redirect } from 'next/navigation'; - -import provideReleaseData from '#site/next-data/providers/releaseData'; -import provideReleaseVersions from '#site/next-data/providers/releaseVersions'; -import { ENABLE_STATIC_EXPORT } from '#site/next.constants.mjs'; -import * as basePage from '#site/next.dynamic.page.mjs'; - -import type { DynamicParams } from '#site/types'; -import type { FC } from 'react'; - -type PageParams = DynamicParams<{ version: string }>; - -// This is the default Viewport Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-viewport#generateviewport-function -export const generateViewport = basePage.generateViewport; - -// This generates each page's HTML Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-metadata -export const generateMetadata = basePage.generateMetadata; - -// Generates all possible static paths based on the locales and environment configuration -// - Returns an empty array if static export is disabled (`ENABLE_STATIC_EXPORT` is false) -// - If `ENABLE_STATIC_EXPORT_LOCALE` is true, generates paths for all available locales -// - Otherwise, generates paths only for the default locale -// @see https://nextjs.org/docs/app/api-reference/functions/generate-static-params -export const generateStaticParams = async () => { - // Return an empty array if static export is disabled - if (!ENABLE_STATIC_EXPORT) { - return []; - } - - const versions = await provideReleaseVersions(); - - return versions.map(version => ({ - locale: defaultLocale.code, - version, - })); -}; - -// This method parses the current pathname and does any sort of modifications needed on the route -// then it proceeds to retrieve the Markdown file and parse the MDX Content into a React Component -// finally it returns (if the locale and route are valid) the React Component with the relevant context -// and attached context providers for rendering the current page -const getPage: FC = async props => { - const { version, locale: routeLocale } = await props.params; - - // Gets the current full pathname for a given path - const [locale, pathname] = basePage.getLocaleAndPath(version, routeLocale); - - if (version === 'current') { - const releaseData = await provideReleaseData(); - - const release = releaseData.find(release => release.status === 'Current'); - - redirect(`/${locale}/download/archive/${release?.versionWithPrefix}`); - } - - const versions = await provideReleaseVersions(); - - // Verifies if the current route is a dynamic route - const isDynamicRoute = versions.some(r => r.includes(pathname)); - - // Gets the Markdown content and context for Download Archive pages - const [content, context] = await basePage.getMarkdownContext({ - locale, - pathname: 'download/archive', - }); - - // If this isn't a valid dynamic route for archive version or there's no markdown - // file for this, then we fail as not found as there's nothing we can do. - if (isDynamicRoute && context.filename) { - return basePage.renderPage({ - content, - layout: context.frontmatter.layout!, - context: { ...context, pathname: `/download/archive/${pathname}` }, - }); - } - - return notFound(); -}; - -// Enforces that this route is used as static rendering -// Except whenever on the Development mode as we want instant-refresh when making changes -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -export const dynamic = 'force-static'; - -// Ensures that this endpoint is invalidated and re-executed every X minutes -// so that when new deployments happen, the data is refreshed -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate -export const revalidate = 300; - -export default getPage; diff --git a/apps/site/app/[locale]/feed/[feed]/route.ts b/apps/site/app/[locale]/feed/[feed]/route.ts deleted file mode 100644 index c70c0b63f9b3d..0000000000000 --- a/apps/site/app/[locale]/feed/[feed]/route.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { defaultLocale } from '@node-core/website-i18n'; -import { NextResponse } from 'next/server'; - -import { siteConfig } from '#site/next.json.mjs'; -import { getFeeds } from '#site/util/feeds'; - -type DynamicStaticPaths = { locale: string; feed: string }; -type StaticParams = { params: Promise }; - -// This is the Route Handler for the `GET` method which handles the request -// for the Node.js Website Blog Feeds (RSS) -// @see https://nextjs.org/docs/app/building-your-application/routing/router-handlers -export const GET = async (_: Request, props: StaticParams) => { - const params = await props.params; - - // Generate the Feed for the given feed type (blog, releases, etc) - const websiteFeed = getFeeds(params.feed); - - return new NextResponse(websiteFeed, { - headers: { 'Content-Type': 'application/xml' }, - status: websiteFeed !== undefined ? 200 : 404, - }); -}; - -// This function generates the static paths that come from the dynamic segments -// `[locale]/feeds/[feed]` and returns an array of all available static paths -// This is used for ISR static validation and generation -export const generateStaticParams = async () => - siteConfig.rssFeeds.map(feed => ({ - locale: defaultLocale.code, - feed: feed.file, - })); - -// Enforces that only the paths from `generateStaticParams` are allowed, giving 404 on the contrary -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamicparams -export const dynamicParams = false; - -// Enforces that this route is cached and static as much as possible -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -export const dynamic = 'force-static'; - -// Ensures that this endpoint is invalidated and re-executed every X minutes -// so that when new deployments happen, the data is refreshed -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate -export const revalidate = 300; diff --git a/apps/site/app/[locale]/next-data/og/[category]/[title]/route.tsx b/apps/site/app/[locale]/next-data/og/[category]/[title]/route.tsx deleted file mode 100644 index edd24873a9e89..0000000000000 --- a/apps/site/app/[locale]/next-data/og/[category]/[title]/route.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import HexagonGrid from '@node-core/ui-components/Icons/HexagonGrid'; -import JsWhiteIcon from '@node-core/ui-components/Icons/Logos/JsWhite'; -import { defaultLocale } from '@node-core/website-i18n'; -import { ImageResponse } from 'next/og'; - -import { DEFAULT_CATEGORY_OG_TYPE } from '#site/next.constants.mjs'; - -// TODO: use CSS variables instead of absolute values -const CATEGORY_TO_THEME_COLOUR_MAP = { - announcement: 'rgb(26, 63, 29)', - release: 'rgb(12, 123, 179)', - vulnerability: 'rgb(174, 95, 0)', -}; - -type StaticParams = { - params: Promise<{ - locale: string; - category: keyof typeof CATEGORY_TO_THEME_COLOUR_MAP; - title: string; - }>; -}; - -// This is the Route Handler for the `GET` method which handles the request -// for generating OpenGraph images for Blog Posts and Pages -// @see https://nextjs.org/docs/app/building-your-application/routing/router-handlers -export const GET = async (_: Request, props: StaticParams) => { - const params = await props.params; - - const categoryColour = - params.category in CATEGORY_TO_THEME_COLOUR_MAP - ? CATEGORY_TO_THEME_COLOUR_MAP[params.category] - : CATEGORY_TO_THEME_COLOUR_MAP[DEFAULT_CATEGORY_OG_TYPE]; - - const gridBackground = `radial-gradient(circle, ${categoryColour}, transparent)`; - - return new ImageResponse( -
- - -
- - -

{params.title.slice(0, 100)}

-
-
, - { width: 1200, height: 600 } - ); -}; - -// This function generates the static paths that come from the dynamic segments -// `[locale]/next-data/og/[category]/[title]` this will return a default value as we don't want to -// statically generate this route as it is compute-expensive. -// Hence we generate a "fake" OG image during build just to satisfy Next.js requirements. -export const generateStaticParams = async () => [ - { - locale: defaultLocale.code, - category: 'announcement', - title: 'Run JavaScript Everywhere', - }, -]; - -// Enforces that this route is cached and static as much as possible -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -export const dynamic = 'force-static'; diff --git a/apps/site/app/[locale]/page.tsx b/apps/site/app/[locale]/page.tsx deleted file mode 100644 index 711e785a9a8fb..0000000000000 --- a/apps/site/app/[locale]/page.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { defaultLocale, availableLocaleCodes } from '@node-core/website-i18n'; -import { notFound } from 'next/navigation'; - -import { ENABLE_STATIC_EXPORT } from '#site/next.constants.mjs'; -import { ENABLE_STATIC_EXPORT_LOCALE } from '#site/next.constants.mjs'; -import * as basePage from '#site/next.dynamic.page.mjs'; - -import type { DynamicParams } from '#site/types'; -import type { FC } from 'react'; - -type PageParams = DynamicParams<{ path: Array }>; - -// This is the default Viewport Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-viewport#generateviewport-function -export const generateViewport = basePage.generateViewport; - -// This generates each page's HTML Metadata -// @see https://nextjs.org/docs/app/api-reference/functions/generate-metadata -export const generateMetadata = basePage.generateMetadata; - -/** - * Generates all possible static paths based on the locales and environment configuration - * - Returns an empty array if static export is disabled (`ENABLE_STATIC_EXPORT` is false) - * - If `ENABLE_STATIC_EXPORT_LOCALE` is true, generates paths for all available locales - * - Otherwise, generates paths only for the default locale - * - * @see https://nextjs.org/docs/app/api-reference/functions/generate-static-params - */ -export const generateStaticParams = async () => { - // Return an empty array if static export is disabled - if (!ENABLE_STATIC_EXPORT) { - return []; - } - - // Determine which locales to include in the static export - const locales = ENABLE_STATIC_EXPORT_LOCALE - ? availableLocaleCodes - : [defaultLocale.code]; - - const routes = await Promise.all( - // Gets all mapped routes to the Next.js Routing Engine by Locale - locales.map(locale => ({ locale })) - ); - - return routes.flat().sort(); -}; - -// This method parses the current pathname and does any sort of modifications needed on the route -// then it proceeds to retrieve the Markdown file and parse the MDX Content into a React Component -// finally it returns (if the locale and route are valid) the React Component with the relevant context -// and attached context providers for rendering the current page -const getPage: FC = async props => { - const { path, locale: routeLocale } = await props.params; - - // Gets the current full pathname for a given path - const [locale, pathname] = basePage.getLocaleAndPath(path, routeLocale); - - // Gets the Markdown content and context - const [content, context] = await basePage.getMarkdownContext({ - locale, - pathname, - }); - - // If we have a filename and layout then we have a page - if (context.filename && context.frontmatter.layout) { - return basePage.renderPage({ - content, - layout: context.frontmatter.layout, - context, - }); - } - - return notFound(); -}; - -// Enforces that this route is used as static rendering -// Except whenever on the Development mode as we want instant-refresh when making changes -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#dynamic -export const dynamic = 'force-static'; - -// Ensures that this endpoint is invalidated and re-executed every X minutes -// so that when new deployments happen, the data is refreshed -// @see https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config#revalidate -export const revalidate = 300; - -export default getPage; diff --git a/apps/site/pages/en/index.mdx b/apps/site/app/en/page.mdx similarity index 95% rename from apps/site/pages/en/index.mdx rename to apps/site/app/en/page.mdx index 4e48630d02bad..0e4c264ae7b2f 100644 --- a/apps/site/pages/en/index.mdx +++ b/apps/site/app/en/page.mdx @@ -3,6 +3,11 @@ title: Run JavaScript Everywhere layout: home --- +{ +// The `/en/page.mdx` file has to exist for localization (See https://github.com/vercel/next.js/discussions/87976) +// TODO(@avivkeller): Create a minimal reproduction +} +
diff --git a/apps/site/app/[locale]/error.tsx b/apps/site/app/error.tsx similarity index 100% rename from apps/site/app/[locale]/error.tsx rename to apps/site/app/error.tsx diff --git a/apps/site/pages/es/about/branding.mdx b/apps/site/app/es/about/branding/page.mdx similarity index 100% rename from apps/site/pages/es/about/branding.mdx rename to apps/site/app/es/about/branding/page.mdx diff --git a/apps/site/pages/es/about/eol.mdx b/apps/site/app/es/about/eol/page.mdx similarity index 100% rename from apps/site/pages/es/about/eol.mdx rename to apps/site/app/es/about/eol/page.mdx diff --git a/apps/site/pages/es/about/get-involved/collab-summit.md b/apps/site/app/es/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/es/about/get-involved/collab-summit.md rename to apps/site/app/es/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/es/about/get-involved/events.mdx b/apps/site/app/es/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/es/about/get-involved/events.mdx rename to apps/site/app/es/about/get-involved/events/page.mdx diff --git a/apps/site/pages/es/about/get-involved/index.md b/apps/site/app/es/about/get-involved/page.md similarity index 100% rename from apps/site/pages/es/about/get-involved/index.md rename to apps/site/app/es/about/get-involved/page.md diff --git a/apps/site/pages/es/about/governance.md b/apps/site/app/es/about/governance/page.md similarity index 100% rename from apps/site/pages/es/about/governance.md rename to apps/site/app/es/about/governance/page.md diff --git a/apps/site/pages/es/about/index.mdx b/apps/site/app/es/about/page.mdx similarity index 100% rename from apps/site/pages/es/about/index.mdx rename to apps/site/app/es/about/page.mdx diff --git a/apps/site/pages/es/about/previous-releases.mdx b/apps/site/app/es/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/es/about/previous-releases.mdx rename to apps/site/app/es/about/previous-releases/page.mdx diff --git a/apps/site/pages/es/about/security-reporting.mdx b/apps/site/app/es/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/es/about/security-reporting.mdx rename to apps/site/app/es/about/security-reporting/page.mdx diff --git a/apps/site/pages/es/download/current.mdx b/apps/site/app/es/download/current/page.mdx similarity index 100% rename from apps/site/pages/es/download/current.mdx rename to apps/site/app/es/download/current/page.mdx diff --git a/apps/site/pages/es/download/package-manager/all.md b/apps/site/app/es/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/es/download/package-manager/all.md rename to apps/site/app/es/download/package-manager/all/page.md diff --git a/apps/site/pages/es/download/index.mdx b/apps/site/app/es/download/page.mdx similarity index 100% rename from apps/site/pages/es/download/index.mdx rename to apps/site/app/es/download/page.mdx diff --git a/apps/site/pages/fa/about/branding.mdx b/apps/site/app/fa/about/branding/page.mdx similarity index 100% rename from apps/site/pages/fa/about/branding.mdx rename to apps/site/app/fa/about/branding/page.mdx diff --git a/apps/site/pages/fa/about/get-involved/collab-summit.md b/apps/site/app/fa/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/fa/about/get-involved/collab-summit.md rename to apps/site/app/fa/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/fa/about/get-involved/contribute.md b/apps/site/app/fa/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/fa/about/get-involved/contribute.md rename to apps/site/app/fa/about/get-involved/contribute/page.md diff --git a/apps/site/pages/fa/about/get-involved/events.mdx b/apps/site/app/fa/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/fa/about/get-involved/events.mdx rename to apps/site/app/fa/about/get-involved/events/page.mdx diff --git a/apps/site/pages/fa/about/governance.md b/apps/site/app/fa/about/governance/page.md similarity index 100% rename from apps/site/pages/fa/about/governance.md rename to apps/site/app/fa/about/governance/page.md diff --git a/apps/site/pages/fa/about/index.mdx b/apps/site/app/fa/about/page.mdx similarity index 100% rename from apps/site/pages/fa/about/index.mdx rename to apps/site/app/fa/about/page.mdx diff --git a/apps/site/pages/fa/about/security-reporting.mdx b/apps/site/app/fa/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/fa/about/security-reporting.mdx rename to apps/site/app/fa/about/security-reporting/page.mdx diff --git a/apps/site/pages/fa/download/package-manager/all.md b/apps/site/app/fa/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/fa/download/package-manager/all.md rename to apps/site/app/fa/download/package-manager/all/page.md diff --git a/apps/site/pages/fr/about/branding.mdx b/apps/site/app/fr/about/branding/page.mdx similarity index 100% rename from apps/site/pages/fr/about/branding.mdx rename to apps/site/app/fr/about/branding/page.mdx diff --git a/apps/site/pages/fr/about/eol.mdx b/apps/site/app/fr/about/eol/page.mdx similarity index 100% rename from apps/site/pages/fr/about/eol.mdx rename to apps/site/app/fr/about/eol/page.mdx diff --git a/apps/site/pages/fr/about/get-involved/collab-summit.md b/apps/site/app/fr/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/fr/about/get-involved/collab-summit.md rename to apps/site/app/fr/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/fr/about/get-involved/contribute.md b/apps/site/app/fr/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/fr/about/get-involved/contribute.md rename to apps/site/app/fr/about/get-involved/contribute/page.md diff --git a/apps/site/pages/fr/about/get-involved/events.mdx b/apps/site/app/fr/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/fr/about/get-involved/events.mdx rename to apps/site/app/fr/about/get-involved/events/page.mdx diff --git a/apps/site/pages/fr/about/get-involved/index.md b/apps/site/app/fr/about/get-involved/page.md similarity index 100% rename from apps/site/pages/fr/about/get-involved/index.md rename to apps/site/app/fr/about/get-involved/page.md diff --git a/apps/site/pages/fr/about/governance.md b/apps/site/app/fr/about/governance/page.md similarity index 100% rename from apps/site/pages/fr/about/governance.md rename to apps/site/app/fr/about/governance/page.md diff --git a/apps/site/pages/fr/about/index.mdx b/apps/site/app/fr/about/page.mdx similarity index 100% rename from apps/site/pages/fr/about/index.mdx rename to apps/site/app/fr/about/page.mdx diff --git a/apps/site/pages/fr/about/partners.mdx b/apps/site/app/fr/about/partners/page.mdx similarity index 100% rename from apps/site/pages/fr/about/partners.mdx rename to apps/site/app/fr/about/partners/page.mdx diff --git a/apps/site/pages/fr/about/previous-releases.mdx b/apps/site/app/fr/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/fr/about/previous-releases.mdx rename to apps/site/app/fr/about/previous-releases/page.mdx diff --git a/apps/site/pages/fr/about/security-reporting.mdx b/apps/site/app/fr/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/fr/about/security-reporting.mdx rename to apps/site/app/fr/about/security-reporting/page.mdx diff --git a/apps/site/pages/fr/download/archive/index.mdx b/apps/site/app/fr/download/archive/page.mdx similarity index 100% rename from apps/site/pages/fr/download/archive/index.mdx rename to apps/site/app/fr/download/archive/page.mdx diff --git a/apps/site/pages/fr/download/current.mdx b/apps/site/app/fr/download/current/page.mdx similarity index 100% rename from apps/site/pages/fr/download/current.mdx rename to apps/site/app/fr/download/current/page.mdx diff --git a/apps/site/pages/fr/download/package-manager/all.md b/apps/site/app/fr/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/fr/download/package-manager/all.md rename to apps/site/app/fr/download/package-manager/all/page.md diff --git a/apps/site/pages/fr/download/index.mdx b/apps/site/app/fr/download/page.mdx similarity index 100% rename from apps/site/pages/fr/download/index.mdx rename to apps/site/app/fr/download/page.mdx diff --git a/apps/site/pages/fr/eol.mdx b/apps/site/app/fr/eol/page.mdx similarity index 100% rename from apps/site/pages/fr/eol.mdx rename to apps/site/app/fr/eol/page.mdx diff --git a/apps/site/pages/fr/index.mdx b/apps/site/app/fr/page.mdx similarity index 100% rename from apps/site/pages/fr/index.mdx rename to apps/site/app/fr/page.mdx diff --git a/apps/site/pages/id/about/branding.mdx b/apps/site/app/id/about/branding/page.mdx similarity index 100% rename from apps/site/pages/id/about/branding.mdx rename to apps/site/app/id/about/branding/page.mdx diff --git a/apps/site/pages/id/about/eol.mdx b/apps/site/app/id/about/eol/page.mdx similarity index 100% rename from apps/site/pages/id/about/eol.mdx rename to apps/site/app/id/about/eol/page.mdx diff --git a/apps/site/pages/id/about/get-involved/collab-summit.md b/apps/site/app/id/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/id/about/get-involved/collab-summit.md rename to apps/site/app/id/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/id/about/get-involved/contribute.md b/apps/site/app/id/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/id/about/get-involved/contribute.md rename to apps/site/app/id/about/get-involved/contribute/page.md diff --git a/apps/site/pages/id/about/get-involved/events.mdx b/apps/site/app/id/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/id/about/get-involved/events.mdx rename to apps/site/app/id/about/get-involved/events/page.mdx diff --git a/apps/site/pages/id/about/get-involved/index.md b/apps/site/app/id/about/get-involved/page.md similarity index 100% rename from apps/site/pages/id/about/get-involved/index.md rename to apps/site/app/id/about/get-involved/page.md diff --git a/apps/site/pages/id/about/governance.md b/apps/site/app/id/about/governance/page.md similarity index 100% rename from apps/site/pages/id/about/governance.md rename to apps/site/app/id/about/governance/page.md diff --git a/apps/site/pages/id/about/index.mdx b/apps/site/app/id/about/page.mdx similarity index 100% rename from apps/site/pages/id/about/index.mdx rename to apps/site/app/id/about/page.mdx diff --git a/apps/site/pages/id/about/partners.mdx b/apps/site/app/id/about/partners/page.mdx similarity index 100% rename from apps/site/pages/id/about/partners.mdx rename to apps/site/app/id/about/partners/page.mdx diff --git a/apps/site/pages/id/about/previous-releases.mdx b/apps/site/app/id/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/id/about/previous-releases.mdx rename to apps/site/app/id/about/previous-releases/page.mdx diff --git a/apps/site/pages/id/about/security-reporting.mdx b/apps/site/app/id/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/id/about/security-reporting.mdx rename to apps/site/app/id/about/security-reporting/page.mdx diff --git a/apps/site/pages/id/download/archive/index.mdx b/apps/site/app/id/download/archive/page.mdx similarity index 100% rename from apps/site/pages/id/download/archive/index.mdx rename to apps/site/app/id/download/archive/page.mdx diff --git a/apps/site/pages/id/download/current.mdx b/apps/site/app/id/download/current/page.mdx similarity index 100% rename from apps/site/pages/id/download/current.mdx rename to apps/site/app/id/download/current/page.mdx diff --git a/apps/site/pages/id/download/package-manager/all.md b/apps/site/app/id/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/id/download/package-manager/all.md rename to apps/site/app/id/download/package-manager/all/page.md diff --git a/apps/site/pages/id/download/index.mdx b/apps/site/app/id/download/page.mdx similarity index 100% rename from apps/site/pages/id/download/index.mdx rename to apps/site/app/id/download/page.mdx diff --git a/apps/site/pages/id/index.mdx b/apps/site/app/id/page.mdx similarity index 100% rename from apps/site/pages/id/index.mdx rename to apps/site/app/id/page.mdx diff --git a/apps/site/pages/ja/about/branding.mdx b/apps/site/app/ja/about/branding/page.mdx similarity index 100% rename from apps/site/pages/ja/about/branding.mdx rename to apps/site/app/ja/about/branding/page.mdx diff --git a/apps/site/pages/ja/about/eol.mdx b/apps/site/app/ja/about/eol/page.mdx similarity index 100% rename from apps/site/pages/ja/about/eol.mdx rename to apps/site/app/ja/about/eol/page.mdx diff --git a/apps/site/pages/ja/about/get-involved/collab-summit.md b/apps/site/app/ja/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/ja/about/get-involved/collab-summit.md rename to apps/site/app/ja/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/ja/about/get-involved/events.mdx b/apps/site/app/ja/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/ja/about/get-involved/events.mdx rename to apps/site/app/ja/about/get-involved/events/page.mdx diff --git a/apps/site/pages/ja/about/get-involved/index.md b/apps/site/app/ja/about/get-involved/page.md similarity index 100% rename from apps/site/pages/ja/about/get-involved/index.md rename to apps/site/app/ja/about/get-involved/page.md diff --git a/apps/site/pages/ja/about/governance.md b/apps/site/app/ja/about/governance/page.md similarity index 100% rename from apps/site/pages/ja/about/governance.md rename to apps/site/app/ja/about/governance/page.md diff --git a/apps/site/pages/ja/about/index.mdx b/apps/site/app/ja/about/page.mdx similarity index 100% rename from apps/site/pages/ja/about/index.mdx rename to apps/site/app/ja/about/page.mdx diff --git a/apps/site/pages/ja/about/partners.mdx b/apps/site/app/ja/about/partners/page.mdx similarity index 100% rename from apps/site/pages/ja/about/partners.mdx rename to apps/site/app/ja/about/partners/page.mdx diff --git a/apps/site/pages/ja/about/previous-releases.mdx b/apps/site/app/ja/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/ja/about/previous-releases.mdx rename to apps/site/app/ja/about/previous-releases/page.mdx diff --git a/apps/site/pages/ja/about/security-reporting.mdx b/apps/site/app/ja/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/ja/about/security-reporting.mdx rename to apps/site/app/ja/about/security-reporting/page.mdx diff --git a/apps/site/pages/ja/download/archive/index.mdx b/apps/site/app/ja/download/archive/page.mdx similarity index 100% rename from apps/site/pages/ja/download/archive/index.mdx rename to apps/site/app/ja/download/archive/page.mdx diff --git a/apps/site/pages/ja/download/current.mdx b/apps/site/app/ja/download/current/page.mdx similarity index 100% rename from apps/site/pages/ja/download/current.mdx rename to apps/site/app/ja/download/current/page.mdx diff --git a/apps/site/pages/ja/download/package-manager/all.md b/apps/site/app/ja/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/ja/download/package-manager/all.md rename to apps/site/app/ja/download/package-manager/all/page.md diff --git a/apps/site/pages/ja/download/index.mdx b/apps/site/app/ja/download/page.mdx similarity index 100% rename from apps/site/pages/ja/download/index.mdx rename to apps/site/app/ja/download/page.mdx diff --git a/apps/site/pages/ja/eol.mdx b/apps/site/app/ja/eol/page.mdx similarity index 100% rename from apps/site/pages/ja/eol.mdx rename to apps/site/app/ja/eol/page.mdx diff --git a/apps/site/pages/ja/index.mdx b/apps/site/app/ja/page.mdx similarity index 100% rename from apps/site/pages/ja/index.mdx rename to apps/site/app/ja/page.mdx diff --git a/apps/site/pages/ko/about/branding.mdx b/apps/site/app/ko/about/branding/page.mdx similarity index 100% rename from apps/site/pages/ko/about/branding.mdx rename to apps/site/app/ko/about/branding/page.mdx diff --git a/apps/site/pages/ko/about/get-involved/collab-summit.md b/apps/site/app/ko/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/ko/about/get-involved/collab-summit.md rename to apps/site/app/ko/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/ko/about/get-involved/events.mdx b/apps/site/app/ko/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/ko/about/get-involved/events.mdx rename to apps/site/app/ko/about/get-involved/events/page.mdx diff --git a/apps/site/pages/ko/about/governance.md b/apps/site/app/ko/about/governance/page.md similarity index 100% rename from apps/site/pages/ko/about/governance.md rename to apps/site/app/ko/about/governance/page.md diff --git a/apps/site/pages/ko/about/index.mdx b/apps/site/app/ko/about/page.mdx similarity index 100% rename from apps/site/pages/ko/about/index.mdx rename to apps/site/app/ko/about/page.mdx diff --git a/apps/site/pages/ko/about/security-reporting.mdx b/apps/site/app/ko/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/ko/about/security-reporting.mdx rename to apps/site/app/ko/about/security-reporting/page.mdx diff --git a/apps/site/pages/ko/download/current.mdx b/apps/site/app/ko/download/current/page.mdx similarity index 100% rename from apps/site/pages/ko/download/current.mdx rename to apps/site/app/ko/download/current/page.mdx diff --git a/apps/site/pages/ko/download/package-manager/all.md b/apps/site/app/ko/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/ko/download/package-manager/all.md rename to apps/site/app/ko/download/package-manager/all/page.md diff --git a/apps/site/pages/ko/download/index.mdx b/apps/site/app/ko/download/page.mdx similarity index 100% rename from apps/site/pages/ko/download/index.mdx rename to apps/site/app/ko/download/page.mdx diff --git a/apps/site/app/[locale]/layout.tsx b/apps/site/app/layout.tsx similarity index 77% rename from apps/site/app/[locale]/layout.tsx rename to apps/site/app/layout.tsx index 5e1e440c5b974..2d0f710569a3c 100644 --- a/apps/site/app/[locale]/layout.tsx +++ b/apps/site/app/layout.tsx @@ -1,8 +1,9 @@ -import { availableLocales, defaultLocale } from '@node-core/website-i18n'; +import { availableLocales } from '@node-core/website-i18n'; import { Analytics } from '@vercel/analytics/react'; import { SpeedInsights } from '@vercel/speed-insights/next'; import classNames from 'classnames'; import { NextIntlClientProvider } from 'next-intl'; +import { getLocale } from 'next-intl/server'; import BaseLayout from '#site/layouts/Base'; import { VERCEL_ENV } from '#site/next.constants.mjs'; @@ -15,15 +16,10 @@ import '#site/styles/index.css'; const fontClasses = classNames(IBM_PLEX_MONO.variable, OPEN_SANS.variable); -type RootLayoutProps = PropsWithChildren<{ - params: Promise<{ locale: string }>; -}>; +const RootLayout: FC = async ({ children }) => { + const locale = await getLocale(); -const RootLayout: FC = async ({ children, params }) => { - const { locale } = await params; - - const { langDir, hrefLang } = - availableLocales.find(l => l.code === locale) || defaultLocale; + const { langDir, hrefLang } = availableLocales.find(l => l.code === locale)!; return ( ) => // This allows us to generate a `sitemap.xml` file dynamically based on the needs of the Node.js Website const sitemap = async (): Promise => { - // Gets a list of all statically available routes - const routes = await dynamicRouter.getAllRoutes(); + const routes = await getAllRoutes(); const currentDate = new Date().toISOString(); const getSitemapEntry = (r: string, locales: Array = []) => ({ - url: `${baseUrlAndPath}/${defaultLocale.code}/${r}`, + url: `${baseUrlAndPath}/${defaultLocale.code}${r}`, lastModified: currentDate, changeFrequency: 'always' as const, alternates: { languages: getAlternatePath(r, locales) }, }); const staticPaths = routes.map(r => getSitemapEntry(r, nonDefaultLocales)); - const blogPaths = BLOG_DYNAMIC_ROUTES.map(r => getSitemapEntry(`blog/${r}`)); + const blogPaths = getBlogSitemapData().map(r => getSitemapEntry(`blog/${r}`)); const externalPaths = EXTERNAL_LINKS_SITEMAP.map(r => getSitemapEntry(r)); return [...staticPaths, ...blogPaths, ...externalPaths]; diff --git a/apps/site/pages/tr/about/branding.mdx b/apps/site/app/tr/about/branding/page.mdx similarity index 100% rename from apps/site/pages/tr/about/branding.mdx rename to apps/site/app/tr/about/branding/page.mdx diff --git a/apps/site/pages/tr/about/get-involved/collab-summit.md b/apps/site/app/tr/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/tr/about/get-involved/collab-summit.md rename to apps/site/app/tr/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/tr/about/get-involved/contribute.md b/apps/site/app/tr/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/tr/about/get-involved/contribute.md rename to apps/site/app/tr/about/get-involved/contribute/page.md diff --git a/apps/site/pages/tr/about/get-involved/events.mdx b/apps/site/app/tr/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/tr/about/get-involved/events.mdx rename to apps/site/app/tr/about/get-involved/events/page.mdx diff --git a/apps/site/pages/tr/about/governance.md b/apps/site/app/tr/about/governance/page.md similarity index 100% rename from apps/site/pages/tr/about/governance.md rename to apps/site/app/tr/about/governance/page.md diff --git a/apps/site/pages/tr/about/index.mdx b/apps/site/app/tr/about/page.mdx similarity index 100% rename from apps/site/pages/tr/about/index.mdx rename to apps/site/app/tr/about/page.mdx diff --git a/apps/site/pages/tr/about/security-reporting.mdx b/apps/site/app/tr/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/tr/about/security-reporting.mdx rename to apps/site/app/tr/about/security-reporting/page.mdx diff --git a/apps/site/pages/tr/download/package-manager/all.md b/apps/site/app/tr/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/tr/download/package-manager/all.md rename to apps/site/app/tr/download/package-manager/all/page.md diff --git a/apps/site/pages/tr/download/index.mdx b/apps/site/app/tr/download/page.mdx similarity index 100% rename from apps/site/pages/tr/download/index.mdx rename to apps/site/app/tr/download/page.mdx diff --git a/apps/site/pages/uk/about/branding.mdx b/apps/site/app/uk/about/branding/page.mdx similarity index 100% rename from apps/site/pages/uk/about/branding.mdx rename to apps/site/app/uk/about/branding/page.mdx diff --git a/apps/site/pages/uk/about/eol.mdx b/apps/site/app/uk/about/eol/page.mdx similarity index 100% rename from apps/site/pages/uk/about/eol.mdx rename to apps/site/app/uk/about/eol/page.mdx diff --git a/apps/site/pages/uk/about/get-involved/collab-summit.md b/apps/site/app/uk/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/uk/about/get-involved/collab-summit.md rename to apps/site/app/uk/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/uk/about/get-involved/contribute.md b/apps/site/app/uk/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/uk/about/get-involved/contribute.md rename to apps/site/app/uk/about/get-involved/contribute/page.md diff --git a/apps/site/pages/uk/about/get-involved/events.mdx b/apps/site/app/uk/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/uk/about/get-involved/events.mdx rename to apps/site/app/uk/about/get-involved/events/page.mdx diff --git a/apps/site/pages/uk/about/get-involved/index.md b/apps/site/app/uk/about/get-involved/page.md similarity index 100% rename from apps/site/pages/uk/about/get-involved/index.md rename to apps/site/app/uk/about/get-involved/page.md diff --git a/apps/site/pages/uk/about/governance.md b/apps/site/app/uk/about/governance/page.md similarity index 100% rename from apps/site/pages/uk/about/governance.md rename to apps/site/app/uk/about/governance/page.md diff --git a/apps/site/pages/uk/about/index.mdx b/apps/site/app/uk/about/page.mdx similarity index 100% rename from apps/site/pages/uk/about/index.mdx rename to apps/site/app/uk/about/page.mdx diff --git a/apps/site/pages/uk/about/partners.mdx b/apps/site/app/uk/about/partners/page.mdx similarity index 100% rename from apps/site/pages/uk/about/partners.mdx rename to apps/site/app/uk/about/partners/page.mdx diff --git a/apps/site/pages/uk/about/previous-releases.mdx b/apps/site/app/uk/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/uk/about/previous-releases.mdx rename to apps/site/app/uk/about/previous-releases/page.mdx diff --git a/apps/site/pages/uk/about/security-reporting.mdx b/apps/site/app/uk/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/uk/about/security-reporting.mdx rename to apps/site/app/uk/about/security-reporting/page.mdx diff --git a/apps/site/pages/uk/download/archive/index.mdx b/apps/site/app/uk/download/archive/page.mdx similarity index 100% rename from apps/site/pages/uk/download/archive/index.mdx rename to apps/site/app/uk/download/archive/page.mdx diff --git a/apps/site/pages/uk/download/current.mdx b/apps/site/app/uk/download/current/page.mdx similarity index 100% rename from apps/site/pages/uk/download/current.mdx rename to apps/site/app/uk/download/current/page.mdx diff --git a/apps/site/pages/uk/download/package-manager/all.md b/apps/site/app/uk/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/uk/download/package-manager/all.md rename to apps/site/app/uk/download/package-manager/all/page.md diff --git a/apps/site/pages/uk/download/index.mdx b/apps/site/app/uk/download/page.mdx similarity index 100% rename from apps/site/pages/uk/download/index.mdx rename to apps/site/app/uk/download/page.mdx diff --git a/apps/site/pages/uk/eol.mdx b/apps/site/app/uk/eol/page.mdx similarity index 100% rename from apps/site/pages/uk/eol.mdx rename to apps/site/app/uk/eol/page.mdx diff --git a/apps/site/pages/uk/index.mdx b/apps/site/app/uk/page.mdx similarity index 100% rename from apps/site/pages/uk/index.mdx rename to apps/site/app/uk/page.mdx diff --git a/apps/site/pages/zh-cn/about/branding.mdx b/apps/site/app/zh-cn/about/branding/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/about/branding.mdx rename to apps/site/app/zh-cn/about/branding/page.mdx diff --git a/apps/site/pages/zh-cn/about/get-involved/collab-summit.md b/apps/site/app/zh-cn/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/zh-cn/about/get-involved/collab-summit.md rename to apps/site/app/zh-cn/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/zh-cn/about/get-involved/contribute.md b/apps/site/app/zh-cn/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/zh-cn/about/get-involved/contribute.md rename to apps/site/app/zh-cn/about/get-involved/contribute/page.md diff --git a/apps/site/pages/zh-cn/about/get-involved/events.mdx b/apps/site/app/zh-cn/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/about/get-involved/events.mdx rename to apps/site/app/zh-cn/about/get-involved/events/page.mdx diff --git a/apps/site/pages/zh-cn/about/get-involved/index.md b/apps/site/app/zh-cn/about/get-involved/page.md similarity index 100% rename from apps/site/pages/zh-cn/about/get-involved/index.md rename to apps/site/app/zh-cn/about/get-involved/page.md diff --git a/apps/site/pages/zh-cn/about/governance.md b/apps/site/app/zh-cn/about/governance/page.md similarity index 100% rename from apps/site/pages/zh-cn/about/governance.md rename to apps/site/app/zh-cn/about/governance/page.md diff --git a/apps/site/pages/zh-cn/about/index.mdx b/apps/site/app/zh-cn/about/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/about/index.mdx rename to apps/site/app/zh-cn/about/page.mdx diff --git a/apps/site/pages/zh-cn/about/previous-releases.mdx b/apps/site/app/zh-cn/about/previous-releases/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/about/previous-releases.mdx rename to apps/site/app/zh-cn/about/previous-releases/page.mdx diff --git a/apps/site/pages/zh-cn/about/security-reporting.mdx b/apps/site/app/zh-cn/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/about/security-reporting.mdx rename to apps/site/app/zh-cn/about/security-reporting/page.mdx diff --git a/apps/site/pages/zh-cn/download/archive/index.mdx b/apps/site/app/zh-cn/download/archive/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/download/archive/index.mdx rename to apps/site/app/zh-cn/download/archive/page.mdx diff --git a/apps/site/pages/zh-cn/download/current.mdx b/apps/site/app/zh-cn/download/current/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/download/current.mdx rename to apps/site/app/zh-cn/download/current/page.mdx diff --git a/apps/site/pages/zh-cn/download/package-manager/all.md b/apps/site/app/zh-cn/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/zh-cn/download/package-manager/all.md rename to apps/site/app/zh-cn/download/package-manager/all/page.md diff --git a/apps/site/pages/zh-cn/download/index.mdx b/apps/site/app/zh-cn/download/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/download/index.mdx rename to apps/site/app/zh-cn/download/page.mdx diff --git a/apps/site/pages/zh-cn/index.mdx b/apps/site/app/zh-cn/page.mdx similarity index 100% rename from apps/site/pages/zh-cn/index.mdx rename to apps/site/app/zh-cn/page.mdx diff --git a/apps/site/pages/zh-tw/about/branding.mdx b/apps/site/app/zh-tw/about/branding/page.mdx similarity index 100% rename from apps/site/pages/zh-tw/about/branding.mdx rename to apps/site/app/zh-tw/about/branding/page.mdx diff --git a/apps/site/pages/zh-tw/about/get-involved/collab-summit.md b/apps/site/app/zh-tw/about/get-involved/collab-summit/page.md similarity index 100% rename from apps/site/pages/zh-tw/about/get-involved/collab-summit.md rename to apps/site/app/zh-tw/about/get-involved/collab-summit/page.md diff --git a/apps/site/pages/zh-tw/about/get-involved/contribute.md b/apps/site/app/zh-tw/about/get-involved/contribute/page.md similarity index 100% rename from apps/site/pages/zh-tw/about/get-involved/contribute.md rename to apps/site/app/zh-tw/about/get-involved/contribute/page.md diff --git a/apps/site/pages/zh-tw/about/get-involved/events.mdx b/apps/site/app/zh-tw/about/get-involved/events/page.mdx similarity index 100% rename from apps/site/pages/zh-tw/about/get-involved/events.mdx rename to apps/site/app/zh-tw/about/get-involved/events/page.mdx diff --git a/apps/site/pages/zh-tw/about/get-involved/index.md b/apps/site/app/zh-tw/about/get-involved/page.md similarity index 100% rename from apps/site/pages/zh-tw/about/get-involved/index.md rename to apps/site/app/zh-tw/about/get-involved/page.md diff --git a/apps/site/pages/zh-tw/about/governance.md b/apps/site/app/zh-tw/about/governance/page.md similarity index 100% rename from apps/site/pages/zh-tw/about/governance.md rename to apps/site/app/zh-tw/about/governance/page.md diff --git a/apps/site/pages/zh-tw/about/index.mdx b/apps/site/app/zh-tw/about/page.mdx similarity index 100% rename from apps/site/pages/zh-tw/about/index.mdx rename to apps/site/app/zh-tw/about/page.mdx diff --git a/apps/site/pages/zh-tw/about/security-reporting.mdx b/apps/site/app/zh-tw/about/security-reporting/page.mdx similarity index 100% rename from apps/site/pages/zh-tw/about/security-reporting.mdx rename to apps/site/app/zh-tw/about/security-reporting/page.mdx diff --git a/apps/site/pages/zh-tw/download/current.mdx b/apps/site/app/zh-tw/download/current/page.mdx similarity index 100% rename from apps/site/pages/zh-tw/download/current.mdx rename to apps/site/app/zh-tw/download/current/page.mdx diff --git a/apps/site/pages/zh-tw/download/package-manager/all.md b/apps/site/app/zh-tw/download/package-manager/all/page.md similarity index 100% rename from apps/site/pages/zh-tw/download/package-manager/all.md rename to apps/site/app/zh-tw/download/package-manager/all/page.md diff --git a/apps/site/pages/zh-tw/download/index.mdx b/apps/site/app/zh-tw/download/page.mdx similarity index 100% rename from apps/site/pages/zh-tw/download/index.mdx rename to apps/site/app/zh-tw/download/page.mdx diff --git a/apps/site/components/MDX/LayoutInjector/index.tsx b/apps/site/components/MDX/LayoutInjector/index.tsx new file mode 100644 index 0000000000000..d834e989dd1f5 --- /dev/null +++ b/apps/site/components/MDX/LayoutInjector/index.tsx @@ -0,0 +1,34 @@ +import { setClientContext } from '#site/client-context'; +import WithLayout from '#site/components/withLayout'; +import { MatterProvider } from '#site/providers/matterProvider'; + +import type { MarkdownContext } from '#site/types'; +import type { FC, PropsWithChildren } from 'react'; + +type MarkdownLayoutInjectorProps = MarkdownContext & { + params: unknown; + // We don't care about this + searchParams: unknown; +}; + +const MDXLayoutInjector: FC< + PropsWithChildren + /* eslint-disable @typescript-eslint/no-unused-vars */ +> = async ({ children, params, searchParams, ...props }) => { + // Defines a shared Server Context for the Client-Side + // That is shared for all pages under the dynamic router + setClientContext(props); + + // The Matter Provider allows Client-Side injection of the data + // to a shared React Client Provider even though the page is rendered + // within a server-side context + return ( + + + {children} + + + ); +}; + +export default MDXLayoutInjector; diff --git a/apps/site/components/withLayout.tsx b/apps/site/components/withLayout.tsx index 8e72c26249a3f..ba6c1890c164f 100644 --- a/apps/site/components/withLayout.tsx +++ b/apps/site/components/withLayout.tsx @@ -21,14 +21,24 @@ const layouts = { download: DownloadLayout, 'download-archive': DownloadArchiveLayout, article: ArticlePageLayout, -} satisfies Record; +} satisfies Record>; -type WithLayoutProps = PropsWithChildren<{ layout: L }>; +export type LayoutComponentProps = PropsWithChildren<{ + params: unknown; +}>; -const WithLayout: FC> = ({ layout, children }) => { - const LayoutComponent = layouts[layout] ?? DefaultLayout; +type WithLayoutProps = LayoutComponentProps & { + layout?: L; +}; + +const WithLayout: FC> = ({ + layout, + children, + ...props +}) => { + const LayoutComponent = layouts[layout as Layouts] ?? DefaultLayout; - return {children}; + return {children}; }; export default WithLayout; diff --git a/apps/site/eslint.config.js b/apps/site/eslint.config.js index 6b40fcaa52dc5..66686506ce2ab 100644 --- a/apps/site/eslint.config.js +++ b/apps/site/eslint.config.js @@ -7,7 +7,11 @@ import baseConfig from '../../eslint.config.js'; export default baseConfig.concat([ { - ignores: ['pages/en/blog/**/*.{md,mdx}/**', 'public', 'next-env.d.ts'], + ignores: [ + 'app/\\[en\\]/blog/**/page.{md,mdx}/**', + 'public', + 'next-env.d.ts', + ], }, react.configs.flat['jsx-runtime'], @@ -57,7 +61,7 @@ export default baseConfig.concat([ ...mdx.flat.rules, 'no-irregular-whitespace': 'off', '@next/next/no-img-element': 'off', - '@next/next/no-html-link-for-pages': ['error', 'apps/site/pages/'], + '@next/next/no-html-link-for-pages': ['error', 'apps/site/app'], }, }, ]); diff --git a/apps/site/layouts/Blog.tsx b/apps/site/layouts/Blog.tsx index 216e793bebb12..e86286490637b 100644 --- a/apps/site/layouts/Blog.tsx +++ b/apps/site/layouts/Blog.tsx @@ -1,32 +1,24 @@ import { useTranslations } from 'next-intl'; -import { getClientContext } from '#site/client-context'; import BlogHeader from '#site/components/Blog/BlogHeader'; import WithBlogCategories from '#site/components/withBlogCategories'; import WithFooter from '#site/components/withFooter'; import WithNavBar from '#site/components/withNavBar'; import { getBlogData } from '#site/util/blog'; +import type { LayoutComponentProps } from '#site/components/withLayout.js'; import type { BlogCategory } from '#site/types'; import type { FC } from 'react'; import styles from './layouts.module.css'; -const getBlogCategory = (pathname: string) => { - // pathname format can either be: /en/blog/{category} - // or /en/blog/{category}/page/{page} - // hence we attempt to interpolate the full /en/blog/{category}/page/{page} - // and in case of course no page argument is provided we define it to 1 - // note that malformed routes can't happen as they are all statically generated - const [, , category = 'all', , page = 1] = pathname.split('/') as [ - unknown, - unknown, - BlogCategory, - unknown, - number, - ]; +type Params = { category: string; page: string }; - const { posts, pagination } = getBlogData(category, Number(page)); +const getBlogCategory = ({ category = 'all', page }: Params) => { + const { posts, pagination } = getBlogData( + category as BlogCategory, + Number(page) + ); return { category, @@ -36,9 +28,8 @@ const getBlogCategory = (pathname: string) => { }; }; -const BlogLayout: FC = () => { +const BlogLayout: FC = ({ params }) => { const t = useTranslations(); - const { pathname } = getClientContext(); const mapCategoriesToTabs = (categories: Array) => categories.map(category => ({ @@ -47,7 +38,7 @@ const BlogLayout: FC = () => { link: `/blog/${category}`, })); - const blogData = getBlogCategory(pathname); + const blogData = getBlogCategory(params as Params); return ( <> diff --git a/apps/site/mdx/components.mjs b/apps/site/mdx-components.tsx similarity index 96% rename from apps/site/mdx/components.mjs rename to apps/site/mdx-components.tsx index 46db7dc2afe11..3dfbaeb24d6ad 100644 --- a/apps/site/mdx/components.mjs +++ b/apps/site/mdx-components.tsx @@ -43,12 +43,11 @@ import WithReleaseSelect from '#site/components/withReleaseSelect'; import WithSupporters from '#site/components/withSupporters'; import { ReleaseProvider } from '#site/providers/releaseProvider'; -/** - * A full list of React Components that we want to pass through to MDX - * - * @satisfies {import('mdx/types').MDXComponents} - */ -export default { +import MDXLayoutInjector from './components/MDX/LayoutInjector'; + +export const useMDXComponents = () => ({ + // WithLayout wrapper + MDXLayoutInjector, // HTML overrides a: Link, blockquote: Blockquote, @@ -102,4 +101,4 @@ export default { Button, Link, LinkWithArrow, -}; +}); diff --git a/apps/site/mdx/compiler.mjs b/apps/site/mdx/compiler.mjs deleted file mode 100644 index 630ba814eb73d..0000000000000 --- a/apps/site/mdx/compiler.mjs +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -import { compile as mdxCompile } from '@mdx-js/mdx'; -import { Fragment, jsx, jsxs } from 'react/jsx-runtime'; -import { matter } from 'vfile-matter'; - -import { rehypePlugins, remarkPlugins } from './plugins.mjs'; -import { createGitHubSlugger } from '../util/github'; -import createInterpreter from '../util/interpreter'; - -// Defines a JSX Fragment and JSX Runtime for the MDX Compiler -const reactRuntime = { Fragment, jsx, jsxs }; - -/** - * This is our custom simple MDX Compiler that is used to compile Markdown and MDX - * this returns a serializable VFile as a string that then gets passed to our MDX Provider - * - * @param {import('vfile').VFile} source The source Markdown/MDX content - * @param {'md' | 'mdx'} fileExtension If it should use the MDX or a plain Markdown parser/compiler - * @param {import('mdx/types').MDXComponents} components The MDX Components to be used in the MDX Provider - * @param {Record} props Extra optional React props for the MDX Provider - * - * @returns {Promise<{ - * content: import('react').ReactElement; - * headings: Array; - * frontmatter: Record; - * readingTime: import('reading-time').ReadTimeResults; - * }>} - */ -export default async function compile( - source, - fileExtension, - components = {}, - props = {} -) { - // Parses the Frontmatter to the VFile and removes from the original source - // cleaning the frontmatter to the source that is going to be parsed by the MDX Compiler - matter(source, { strip: true }); - - // Creates a GitHub slugger to generate the same slugs as GitHub - const slugger = createGitHubSlugger(); - - // Compiles the MDX/Markdown source into a serializable VFile - const compiled = await mdxCompile(source, { - rehypePlugins, - remarkPlugins, - format: fileExtension, - }); - - const interpreter = createInterpreter({ - ...components, - 'react/jsx-runtime': reactRuntime, - }); - - // Run the compiled JavaScript code from MDX - interpreter.run(compiled.toString()); - - // Retrieve the default export from the compiled MDX - const MDXContent = interpreter.exports.default; - - // Render the MDX content directly from the compiler - const content = ; - - // Retrieve some parsed data from the VFile metadata - // such as frontmatter and Markdown headings - const { headings = [], matter: frontmatter, readingTime } = source.data; - - headings.forEach(heading => { - // we re-sluggify the links to match the GitHub slugger - // since some also do not come with sluggifed links - heading.data = { ...heading.data, id: slugger(heading.value) }; - }); - - return { content, headings, frontmatter, readingTime }; -} diff --git a/apps/site/mdx/plugins.mjs b/apps/site/mdx/plugins.mjs index 02166643aaf26..0abb0d57643a5 100644 --- a/apps/site/mdx/plugins.mjs +++ b/apps/site/mdx/plugins.mjs @@ -1,45 +1,20 @@ 'use strict'; -import rehypeShikiji from '@node-core/rehype-shiki/plugin'; -import remarkHeadings from '@vcarl/remark-headings'; -import rehypeAutolinkHeadings from 'rehype-autolink-headings'; -import rehypeSlug from 'rehype-slug'; -import remarkGfm from 'remark-gfm'; -import readingTime from 'remark-reading-time'; +import { createRequire } from 'node:module'; -import remarkTableTitles from '../util/table'; - -// TODO(@avivkeller): When available, use `OPEN_NEXT_CLOUDFLARE` environment -// variable for detection instead of current method, which will enable better -// tree-shaking. -// Reference: https://github.com/nodejs/nodejs.org/pull/7896#issuecomment-3009480615 -const OPEN_NEXT_CLOUDFLARE = 'Cloudflare' in global; - -// Shiki is created out here to avoid an async rehype plugin -const singletonShiki = await rehypeShikiji({ - // We use the faster WASM engine on the server instead of the web-optimized version. - // - // Currently we fall back to the JavaScript RegEx engine - // on Cloudflare workers because `shiki/wasm` requires loading via - // `WebAssembly.instantiate` with custom imports, which Cloudflare doesn't support - // for security reasons. - wasm: !OPEN_NEXT_CLOUDFLARE, - - // TODO(@avivkeller): Find a way to enable Twoslash w/ a VFS on Cloudflare - twoslash: !OPEN_NEXT_CLOUDFLARE, -}); +const require = createRequire(import.meta.url); /** * Provides all our Rehype Plugins that are used within MDX */ export const rehypePlugins = [ // Generates `id` attributes for headings (H1, ...) - rehypeSlug, + 'rehype-slug', // Automatically add anchor links to headings (H1, ...) - [rehypeAutolinkHeadings, { behavior: 'wrap' }], + ['rehype-autolink-headings', { behavior: 'wrap' }], // Transforms sequential code elements into code tabs and // adds our syntax highlighter (Shikiji) to Codeboxes - () => singletonShiki, + require.resolve('./plugins/shiki.mjs'), ]; /** @@ -47,10 +22,17 @@ export const rehypePlugins = [ */ export const remarkPlugins = [ // Support GFM syntax to be used within Markdown - remarkGfm, + 'remark-gfm', + // Frontmatter + 'remark-frontmatter', + 'remark-mdx-frontmatter', // Generates metadata regarding headings - remarkHeadings, + '@vcarl/remark-headings', // Calculates the reading time of the content - readingTime, - remarkTableTitles, + 'remark-reading-time', + 'remark-reading-time/mdx', + // Tables + require.resolve('./plugins/table.mjs'), + // MDX Layout Injector + require.resolve('./plugins/layout.mjs'), ]; diff --git a/apps/site/mdx/plugins/layout.mjs b/apps/site/mdx/plugins/layout.mjs new file mode 100644 index 0000000000000..8353dde15a8d6 --- /dev/null +++ b/apps/site/mdx/plugins/layout.mjs @@ -0,0 +1,101 @@ +import { relative, sep } from 'node:path'; +import { join as posixJoin } from 'node:path/posix'; + +import { valueToEstree } from 'estree-util-value-to-estree'; + +import { APP_ROOT } from '#site/util/router.mjs'; + +const createAttribute = (name, value) => ({ + type: 'JSXAttribute', + name: { + type: 'JSXIdentifier', + name, + }, + value: { + type: 'JSXExpressionContainer', + expression: valueToEstree(value), + }, +}); + +const getAdditionalAttributes = ({ history: [fullPath], data }) => { + const rel = relative(APP_ROOT, fullPath).replaceAll(sep, '/'); + + // Filename is the locale-less filepath + const filename = rel.substring(rel.indexOf('/')); + + // Derive a URL-like pathnam + let pathname = posixJoin(filename, '..'); + + return [ + createAttribute('filename', filename), + createAttribute('pathname', pathname), + createAttribute('headings', data.headings), + ]; +}; + +/** + * Workaround for https://github.com/vercel/next.js/discussions/87990 + */ +export default () => (tree, vfile) => { + tree.children.unshift({ + type: 'mdxjsEsm', + data: { + estree: { + type: 'Program', + sourceType: 'module', + body: [ + { + type: 'ExportDefaultDeclaration', + declaration: { + type: 'ArrowFunctionExpression', + params: [ + { + type: 'Identifier', + name: 'props', + }, + ], + body: { + type: 'JSXElement', + openingElement: { + type: 'JSXOpeningElement', + attributes: [ + // These plugins already export their content on the MDX file directly, + ...['frontmatter', 'readingTime'].map(name => ({ + type: 'JSXAttribute', + name: { + type: 'JSXIdentifier', + name, + }, + value: { + type: 'JSXExpressionContainer', + expression: { + type: 'JSXIdentifier', + name, + }, + }, + })), + ...getAdditionalAttributes(vfile), + // The children + { + type: 'JSXSpreadAttribute', + argument: { + type: 'Identifier', + name: 'props', + }, + }, + ], + name: { + type: 'JSXIdentifier', + name: 'MDXLayoutInjector', + }, + selfClosing: true, + }, + children: [], + }, + }, + }, + ], + }, + }, + }); +}; diff --git a/apps/site/mdx/plugins/shiki.mjs b/apps/site/mdx/plugins/shiki.mjs new file mode 100644 index 0000000000000..1bc4af848752b --- /dev/null +++ b/apps/site/mdx/plugins/shiki.mjs @@ -0,0 +1,23 @@ +import rehypeShikiji from '@node-core/rehype-shiki/plugin'; + +// TODO(@avivkeller): When available, use `OPEN_NEXT_CLOUDFLARE` environment +// variable for detection instead of current method, which will enable better +// tree-shaking. +// Reference: https://github.com/nodejs/nodejs.org/pull/7896#issuecomment-3009480615 +const OPEN_NEXT_CLOUDFLARE = 'Cloudflare' in global; + +// Shiki is created out here to avoid an async rehype plugin +const shiki = await rehypeShikiji({ + // We use the faster WASM engine on the server instead of the web-optimized version. + // + // Currently we fall back to the JavaScript RegEx engine + // on Cloudflare workers because `shiki/wasm` requires loading via + // `WebAssembly.instantiate` with custom imports, which Cloudflare doesn't support + // for security reasons. + wasm: !OPEN_NEXT_CLOUDFLARE, + + // TODO(@avivkeller): Find a way to enable Twoslash w/ a VFS on Cloudflare + twoslash: !OPEN_NEXT_CLOUDFLARE, +}); + +export default () => shiki; diff --git a/apps/site/mdx/plugins/table.mjs b/apps/site/mdx/plugins/table.mjs new file mode 100644 index 0000000000000..d36063e2da6a6 --- /dev/null +++ b/apps/site/mdx/plugins/table.mjs @@ -0,0 +1,44 @@ +import { toString } from 'mdast-util-to-string'; +import { visit } from 'unist-util-visit'; + +/** + * Remark plugin that adds data-label attributes to table cells (td) + * based on their corresponding table headers (th). + */ +export default () => tree => { + visit(tree, 'table', table => { + // Ensure table has at least a header row and one data row + if (table.children.length < 2) { + return; + } + + const [headerRow, ...dataRows] = table.children; + + if (headerRow.children.length <= 1) { + table.data ??= {}; + + table.data.hProperties = { + 'data-cards': 'false', + }; + } + + // Extract header labels from the first row + const headerLabels = headerRow.children.map(headerCell => + toString(headerCell.children) + ); + + // Assign data-label to each cell in data rows + dataRows.forEach(row => { + row.children.forEach((cell, idx) => { + if (idx > headerLabels.length - 1) { + return; + } + cell.data ??= {}; + + cell.data.hProperties = { + 'data-label': headerLabels[idx], + }; + }); + }); + }); +}; diff --git a/apps/site/middleware.ts b/apps/site/middleware.ts index 1f2b0955b6f13..17d1729af437f 100644 --- a/apps/site/middleware.ts +++ b/apps/site/middleware.ts @@ -10,12 +10,8 @@ export default createMiddleware({ // Always use a Locale as a prefix for routing localePrefix: 'always', - - // We already have our own way of providing alternate links - // generated on `next.dynamic.mjs` - alternateLinks: false, }); // We only want the middleware to run on the `/` route // to redirect users to their preferred locale -export const config = { matcher: ['/'] }; +export const config = { matcher: '/((?!api|trpc|_next|_vercel|.*\\..*).*)' }; diff --git a/apps/site/next-env.d.ts b/apps/site/next-env.d.ts index c05d9f7d66f17..20e7bcfb03965 100644 --- a/apps/site/next-env.d.ts +++ b/apps/site/next-env.d.ts @@ -1,7 +1,6 @@ /// /// -/// -import './.next/types/routes.d.ts'; +import './.next/dev/types/routes.d.ts'; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/site/next.config.mjs b/apps/site/next.config.mjs index 40d1f89e87cd3..39a5c466f3d1d 100644 --- a/apps/site/next.config.mjs +++ b/apps/site/next.config.mjs @@ -1,6 +1,9 @@ 'use strict'; + +import createMDX from '@next/mdx'; import createNextIntlPlugin from 'next-intl/plugin'; +import { rehypePlugins, remarkPlugins } from './mdx/plugins.mjs'; import { OPEN_NEXT_CLOUDFLARE } from './next.constants.cloudflare.mjs'; import { BASE_PATH, ENABLE_STATIC_EXPORT } from './next.constants.mjs'; import { getImagesConfig } from './next.image.config.mjs'; @@ -20,6 +23,8 @@ const getDeploymentId = async () => { /** @type {import('next').NextConfig} */ const nextConfig = { + // We need to include _all_ our page extensions here + pageExtensions: ['md', 'mdx', 'ts', 'tsx'], // Full Support of React 18 SSR and Streaming reactCompiler: true, // We don't want to redirect with trailing slashes @@ -85,4 +90,12 @@ const nextConfig = { }; const withNextIntl = createNextIntlPlugin('./i18n.tsx'); -export default withNextIntl(nextConfig); +const withMDX = createMDX({ + extension: /\.mdx?$/, + options: { + remarkPlugins, + rehypePlugins, + }, +}); + +export default withNextIntl(withMDX(nextConfig)); diff --git a/apps/site/next.dynamic.constants.mjs b/apps/site/next.dynamic.constants.mjs deleted file mode 100644 index 0aa3afbbb071e..0000000000000 --- a/apps/site/next.dynamic.constants.mjs +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -import { blogData } from '#site/next.json.mjs'; - -import { BASE_PATH, BASE_URL } from './next.constants.mjs'; -import { siteConfig } from './next.json.mjs'; -import { getBlogPosts } from './util/blog'; - -/** - * This constant is used to create static routes on-the-fly that do not have a file-system - * counterpart route. This is useful for providing routes with matching Layout Names - * but that do not have Markdown content and a matching file for the route - * - * @type {Array} A Map of pathname and Layout Name - */ -export const BLOG_DYNAMIC_ROUTES = [ - // Provides Routes for all Blog Categories - ...blogData.categories, - // Provides Routes for all Blog Categories w/ Pagination - ...blogData.categories - // retrieves the amount of pages for each blog category - .map(c => [c, getBlogPosts(c).pagination.pages]) - // creates a numeric array for each page and define a pathname for - // each page for a category (i.e. blog/all/page/1) - .map(([c, t]) => [...Array(t).keys()].map(p => `${c}/page/${p + 1}`)) - // flattens the array since we have a .map inside another .map - .flat(), -]; - -/** - * This is the default Next.js Page Metadata for all pages - * - * @type {import('next').Metadata} - */ -export const PAGE_METADATA = { - metadataBase: new URL(`${BASE_URL}${BASE_PATH}`), - title: siteConfig.title, - description: siteConfig.description, - robots: { index: true, follow: true }, - twitter: { - card: siteConfig.twitter.card, - title: siteConfig.twitter.title, - creator: siteConfig.twitter.username, - images: { - url: siteConfig.twitter.img, - alt: siteConfig.twitter.imgAlt, - }, - }, - alternates: { - canonical: '', - languages: { 'x-default': '' }, - types: { - 'application/rss+xml': `${BASE_URL}${BASE_PATH}/en/feed/blog.xml`, - }, - }, - icons: { icon: siteConfig.favicon }, - openGraph: { images: siteConfig.twitter.img }, -}; - -/** - * This is the default Next.js Viewport Metadata for all pages - * - * @return {import('next').Viewport} - */ -export const PAGE_VIEWPORT = { - themeColor: [ - { - color: siteConfig.lightAccentColor, - media: '(prefers-color-scheme: light)', - }, - { - color: siteConfig.darkAccentColor, - media: '(prefers-color-scheme: dark)', - }, - ], - width: 'device-width', - initialScale: 1, - maximumScale: 2, -}; diff --git a/apps/site/next.dynamic.mjs b/apps/site/next.dynamic.mjs deleted file mode 100644 index 6dfea0d82f56a..0000000000000 --- a/apps/site/next.dynamic.mjs +++ /dev/null @@ -1,274 +0,0 @@ -'use strict'; - -import { readFile } from 'node:fs/promises'; -import { join, normalize, sep } from 'node:path'; - -import { availableLocaleCodes, defaultLocale } from '@node-core/website-i18n'; -import matter from 'gray-matter'; -import { cache } from 'react'; -import { VFile } from 'vfile'; - -import compile from './mdx/compiler.mjs'; -import mdxComponents from './mdx/components.mjs'; -import { BASE_PATH } from './next.constants.mjs'; -import { BASE_URL } from './next.constants.mjs'; -import { DEFAULT_CATEGORY_OG_TYPE } from './next.constants.mjs'; -import { ENABLE_STATIC_EXPORT } from './next.constants.mjs'; -import { IS_DEV_ENV } from './next.constants.mjs'; -import { PAGE_METADATA } from './next.dynamic.constants.mjs'; -import { getMarkdownFiles } from './next.helpers.mjs'; -import { siteConfig } from './next.json.mjs'; - -// This is the combination of the Application Base URL and Base PATH -const baseUrlAndPath = `${BASE_URL}${BASE_PATH}`; - -// This is a small utility that allows us to quickly separate locale from the remaining pathname -const getPathname = (path = []) => - Array.isArray(path) ? path.join('/') : path; - -// This maps a pathname into an actual route object that can be used -// we use a platform-specific separator to split the pathname -// since we're using filepaths here and not URL paths -const mapPathToRoute = (locale = defaultLocale.code, path = '') => ({ - locale, - path: path.split(sep), -}); - -// Provides an in-memory Map that lasts the whole build process -// and disabled when on development mode (stubbed) -const createCachedMarkdownCache = () => { - if (IS_DEV_ENV) { - return { - has: () => false, - set: () => {}, - get: () => null, - }; - } - - return new Map(); -}; - -const getDynamicRouter = async () => { - // Creates a Cache System that is disabled during development mode - const cachedMarkdownFiles = createCachedMarkdownCache(); - - // Keeps the map of pathnames to filenames - const pathnameToFilename = new Map(); - - const websitePages = await getMarkdownFiles( - process.cwd(), - `pages/${defaultLocale.code}` - ); - - websitePages.forEach(filename => { - // This Regular Expression is used to remove the `index.md(x)` suffix - // of a name and to remove the `.md(x)` extensions of a filename. - let pathname = filename.replace(/((\/)?(index))?\.mdx?$/i, ''); - - if (pathname.length > 1 && pathname.endsWith(sep)) { - pathname = pathname.substring(0, pathname.length - 1); - } - - pathname = normalize(pathname).replace('.', ''); - - // We map the pathname to the filename to be able to quickly - // resolve the filename for a given pathname - pathnameToFilename.set(pathname, filename); - }); - - /** - * This method returns a list of all routes that exist - * Note: It will only match routes that have at least one pathname. - - * @returns {Promise>} - */ - const getAllRoutes = async () => - [...pathnameToFilename.keys()].filter(pathname => pathname.length); - - /** - * This method attempts to retrieve either a localized Markdown file - * or the English version of the Markdown file if no localized version exists - * and then returns the contents of the file and the name of the file (not the path) - * - * @param {string} locale - * @param {string} pathname - * @returns {Promise<{ source: string; filename: string }>} - */ - const _getMarkdownFile = async (locale = '', pathname = '') => { - const normalizedPathname = normalize(pathname).replace('.', ''); - - // This verifies if the given pathname actually exists on our Map - // meaning that the route exists on the website and can be rendered - if (pathnameToFilename.has(normalizedPathname)) { - const filename = pathnameToFilename.get(normalizedPathname); - const filepath = join(process.cwd(), 'pages', locale, filename); - - // We verify if our Markdown cache already has a cache entry for a localized - // version of this file, because if not, it means that either - // we did not cache this file yet or there is no localized version of this file - if (cachedMarkdownFiles.has(`${locale}${normalizedPathname}`)) { - const fileContent = cachedMarkdownFiles.get( - `${locale}${normalizedPathname}` - ); - - return { source: fileContent, filename }; - } - - // Attempts to read a file or simply (and silently) fail, as the file might - // simply not exist or whatever other reason that might cause the file to not be read - const fileLanguageContent = await readFile(filepath, 'utf8').catch( - () => undefined - ); - - // No cache hit exists, so we check if the localized file actually - // exists within our file system and if it does we set it on the cache - // and return the current fetched result; - if (fileLanguageContent && typeof fileLanguageContent === 'string') { - cachedMarkdownFiles.set( - `${locale}${normalizedPathname}`, - fileLanguageContent - ); - - return { source: fileLanguageContent, filename }; - } - - // Prevent infinite loops as if at this point the file does not exist with the default locale - // then there must be an issue on the file system or there's an error on the mapping of paths to files - if (locale === defaultLocale.code) { - return { filename: '', source: '' }; - } - - // We attempt to retrieve the source version (defaultLocale) of the file as there is no localised version - // of the file and we set it on the cache to prevent future checks of the same locale for this file - const { source: fileContent } = await _getMarkdownFile( - defaultLocale.code, - pathname - ); - - // We set the source file on the localized cache to prevent future checks - // of the same locale for this file and improve read performance - cachedMarkdownFiles.set(`${locale}${normalizedPathname}`, fileContent); - - return { source: fileContent, filename }; - } - - return { filename: '', source: '' }; - }; - - // Creates a Cached Version of the Markdown File Resolver - const getMarkdownFile = cache(async (locale, pathname) => { - return await _getMarkdownFile(locale, pathname); - }); - - /** - * This method runs the MDX compiler on the server-side and returns the - * parsed JSX ready to be rendered on a page as a React Component - * - * @param {string} source - * @param {string} filename - */ - const _getMDXContent = async (source = '', filename = '') => { - // We create a VFile (Virtual File) to be able to access some contextual - // data post serialization (compilation) of the source Markdown into MDX - const sourceAsVirtualFile = new VFile(source); - - // Gets the file extension of the file, to determine which parser and plugins to use - const fileExtension = filename.endsWith('.mdx') ? 'mdx' : 'md'; - - // This compiles our MDX source (VFile) into a final MDX-parsed VFile - // that then is passed as a string to the MDXProvider which will run the MDX Code - return compile(sourceAsVirtualFile, fileExtension, mdxComponents); - }; - - // Creates a Cached Version of the MDX Compiler - const getMDXContent = cache(async (source, filename) => { - return await _getMDXContent(source, filename); - }); - - /** - * This method generates the Next.js App Router Metadata - * that can be used for each page to provide metadata - * - * @param {string} locale - * @param {string} path - * @returns {Promise} - */ - const _getPageMetadata = async (locale = defaultLocale.code, path = '') => { - const pageMetadata = { ...PAGE_METADATA }; - - const { source = '' } = await getMarkdownFile(locale, path); - - const { data } = matter(source); - - const getUrlForPathname = (l, p) => - `${baseUrlAndPath}/${l}${p ? `/${p}` : ''}`; - - // Default Title for the page - pageMetadata.title = data.title - ? `${siteConfig.title} — ${data.title}` - : siteConfig.title; - - pageMetadata.description = data.description - ? data.description - : siteConfig.description; - - // Default Twitter Title for the page - pageMetadata.twitter.title = pageMetadata.title; - - // Default Open Graph Image for the page - pageMetadata.openGraph.images = [ - ENABLE_STATIC_EXPORT - ? `${defaultLocale.code}/next-data/og/announcement/Run JavaScript Everywhere` - : `${defaultLocale.code}/next-data/og/${data.category ?? DEFAULT_CATEGORY_OG_TYPE}/${pageMetadata.title}`, - ]; - - // Default canonical URL for the page - pageMetadata.alternates.canonical = - data.canonical ?? getUrlForPathname(locale, path); - - // Default alternate URL for the page in the default locale - pageMetadata.alternates.languages['x-default'] = getUrlForPathname( - defaultLocale.code, - path - ); - - // Retrieves a matching blog feed for the category of the blog post - // If no matching blog feed is found, we simply fallback to the default blog feed - const matchingBlogFeed = siteConfig.rssFeeds.find( - feed => feed.category === data.category - ); - - // Adds the RSS Feed URL to the page metadata, if a matching feed is found - // otherwise, we fallback to the default blog feed - pageMetadata.alternates.types['application/rss+xml'] = getUrlForPathname( - locale, - `feed/${matchingBlogFeed?.file ?? 'blog.xml'}` - ); - - // Iterate all languages to generate alternate URLs for each language - availableLocaleCodes.forEach(currentLocale => { - pageMetadata.alternates.languages[currentLocale] = getUrlForPathname( - currentLocale, - path - ); - }); - - return pageMetadata; - }; - - // Creates a Cached Version of the Page Metadata Context - const getPageMetadata = cache(async (locale, path) => { - return await _getPageMetadata(locale, path); - }); - - return { - mapPathToRoute, - getPathname, - getAllRoutes, - getMDXContent, - getMarkdownFile, - getPageMetadata, - }; -}; - -export const dynamicRouter = await getDynamicRouter(); diff --git a/apps/site/next.dynamic.page.mjs b/apps/site/next.dynamic.page.mjs deleted file mode 100644 index 08cd8f6118c3f..0000000000000 --- a/apps/site/next.dynamic.page.mjs +++ /dev/null @@ -1,127 +0,0 @@ -import { join } from 'node:path'; - -import { - allLocaleCodes, - defaultLocale, - availableLocaleCodes, -} from '@node-core/website-i18n'; -import { notFound, redirect } from 'next/navigation'; -import { setRequestLocale } from 'next-intl/server'; - -import { setClientContext } from '#site/client-context'; -import WithLayout from '#site/components/withLayout'; -import { PAGE_VIEWPORT } from '#site/next.dynamic.constants.mjs'; -import { dynamicRouter } from '#site/next.dynamic.mjs'; -import { MatterProvider } from '#site/providers/matterProvider'; - -/** - * This is the default Viewport Metadata - * - * @see https://nextjs.org/docs/app/api-reference/functions/generate-viewport#generateviewport-function - * - * @returns {import('next').Viewport} the default viewport metadata - */ -export const generateViewport = () => ({ ...PAGE_VIEWPORT }); - -/** - * This generates each page's HTML Metadata - * - * @see https://nextjs.org/docs/app/api-reference/functions/generate-metadata - * - * @param {{ params: Promise<{ path: Array; locale: string }>, prefix?: string }} props - * @returns {Promise} the metadata for the page - */ -export const generateMetadata = async ({ params, prefix }) => { - const { path = [], locale = defaultLocale.code } = await params; - - const pathname = dynamicRouter.getPathname(path); - - return dynamicRouter.getPageMetadata( - locale, - // If there's a prefix, `join` it with the pathname - prefix ? join(prefix, pathname) : pathname - ); -}; - -/** - * This method is used for retrieving the current locale and pathname from the request - * - * @param {string|Array} path - * @param {string} locale - * @returns {[string, string]} the locale and pathname for the request - */ -export const getLocaleAndPath = (path = [], locale = defaultLocale.code) => { - if (!availableLocaleCodes.includes(locale)) { - // Forces the current locale to be the Default Locale - setRequestLocale(defaultLocale.code); - - if (!allLocaleCodes.includes(locale)) { - // when the locale is not listed in the locales, return NotFound - return notFound(); - } - - // Redirect to the default locale path - const pathname = dynamicRouter.getPathname(path); - - return redirect(`/${defaultLocale.code}/${pathname}`); - } - - // Configures the current Locale to be the given Locale of the Request - setRequestLocale(locale); - - // Gets the current full pathname for a given path - return [locale, dynamicRouter.getPathname(path)]; -}; - -/** - * This method is used for retrieving the Markdown content and context - * - * @param {{ locale: string; pathname: string }} props - * @returns {Promise<[import('react').ReactNode, import('#site/types/server').ClientSharedServerContext]>} - */ -export const getMarkdownContext = async props => { - // We retrieve the source of the Markdown file by doing an educated guess - // of what possible files could be the source of the page, since the extension - // context is lost from `getStaticProps` as a limitation of Next.js itself - const { source, filename } = await dynamicRouter.getMarkdownFile( - props.locale, - props.pathname - ); - - // This parses the source Markdown content and returns a React Component and - // relevant context from the Markdown File - const { content, frontmatter, headings, readingTime } = - await dynamicRouter.getMDXContent(source, filename); - - // Metadata and shared Context to be available through the lifecycle of the page - const context = { - frontmatter, - headings, - pathname: `/${props.pathname}`, - readingTime, - filename, - }; - - return [content, context]; -}; - -/** - * This method is used for rendering the actual page - * - * @param {{ content: import('react').ReactNode; layout: import('#site/types/layouts').Layouts; context: Partial; }} props - * @returns {import('react').ReactElement} - */ -export const renderPage = props => { - // Defines a shared Server Context for the Client-Side - // That is shared for all pages under the dynamic router - setClientContext(props.context); - - // The Matter Provider allows Client-Side injection of the data - // to a shared React Client Provider even though the page is rendered - // within a server-side context - return ( - - {props.content} - - ); -}; diff --git a/apps/site/package.json b/apps/site/package.json index f0339f01b5ba4..bf4ba3e7a6111 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -5,7 +5,7 @@ "prebuild": "node --run build:blog-data", "build": "cross-env NODE_NO_WARNINGS=1 next build", "build:blog-data": "cross-env NODE_NO_WARNINGS=1 node ./scripts/blog-data/index.mjs", - "build:blog-data:watch": "node --watch --watch-path=pages/en/blog ./scripts/blog-data/index.mjs", + "build:blog-data:watch": "node --watch --watch-path=app/en/blog ./scripts/blog-data/index.mjs", "cloudflare:build:worker": "OPEN_NEXT_CLOUDFLARE=true opennextjs-cloudflare build", "cloudflare:deploy": "opennextjs-cloudflare deploy", "cloudflare:preview": "wrangler dev", @@ -33,7 +33,8 @@ }, "dependencies": { "@heroicons/react": "~2.2.0", - "@mdx-js/mdx": "^3.1.1", + "@mdx-js/loader": "^3.1.1", + "@next/mdx": "^16.1.1", "@node-core/rehype-shiki": "workspace:*", "@node-core/ui-components": "workspace:*", "@node-core/website-i18n": "workspace:*", @@ -55,32 +56,30 @@ "@vercel/speed-insights": "~1.2.0", "classnames": "catalog:", "cross-env": "catalog:", + "estree-util-value-to-estree": "^3.5.0", "feed": "~5.1.0", "github-slugger": "~2.0.0", "gray-matter": "~4.0.3", "mdast-util-to-string": "^4.0.0", - "next": "16.0.10", + "next": "16.1.1", "next-intl": "~4.5.3", "next-themes": "~0.4.6", "postcss-calc": "~10.1.1", "react": "catalog:", "react-dom": "^19.2.3", - "reading-time": "~1.5.0", "rehype-autolink-headings": "~7.1.0", "rehype-slug": "~6.0.0", "remark-gfm": "~4.0.1", + "remark-mdx-frontmatter": "^5.2.0", "remark-reading-time": "~2.0.2", "semver": "~7.7.3", "sval": "^0.6.8", "tailwindcss": "catalog:", "twoslash": "^0.3.6", - "unist-util-visit": "^5.0.0", - "vfile": "~6.0.3", - "vfile-matter": "~5.0.1" + "unist-util-visit": "^5.0.0" }, "devDependencies": { - "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", - "@next/eslint-plugin-next": "16.0.7", + "@next/eslint-plugin-next": "16.1.1", "@node-core/remark-lint": "workspace:*", "@opennextjs/cloudflare": "^1.14.7", "@playwright/test": "^1.57.0", @@ -99,6 +98,7 @@ "jsdom": "^27.4.0", "mdast-util-from-markdown": "^2.0.2", "nock": "^14.0.10", + "reading-time": "^1.5.0", "remark-frontmatter": "^5.0.0", "stylelint": "16.26.1", "stylelint-config-standard": "39.0.1", diff --git a/apps/site/scripts/blog-data/generate.mjs b/apps/site/scripts/blog-data/generate.mjs index b7946ef3e7e5a..42655d4128a84 100644 --- a/apps/site/scripts/blog-data/generate.mjs +++ b/apps/site/scripts/blog-data/generate.mjs @@ -1,24 +1,28 @@ 'use strict'; import { createReadStream } from 'node:fs'; -import { basename, extname, join } from 'node:path'; +import { basename, join } from 'node:path'; import readline from 'node:readline'; import graymatter from 'gray-matter'; -import { getMarkdownFiles } from '#site/next.helpers.mjs'; +import { + DEFAULT_LOCALE_ROOT, + getAllPages, + pathToRoute, +} from '#site/util/router.mjs'; // gets the current blog path based on local module path -const blogPath = join(process.cwd(), 'pages/en/blog'); +const blogPath = join(DEFAULT_LOCALE_ROOT, 'blog'); /** * This method parses the source (raw) Markdown content into Frontmatter * and returns basic information for blog posts * - * @param {string} filename the filename related to the blogpost + * @param {string} route the filename related to the blogpost * @param {string} source the source markdown content of the blog post */ -const getFrontMatter = (filename, source) => { +const getFrontMatter = (route, source) => { const { title = 'Untitled', author = 'The Node.js Project', @@ -35,7 +39,7 @@ const getFrontMatter = (filename, source) => { const categories = [category, `year-${publishYear}`, 'all']; // this is the url used for the blog post it based on the category and filename - const slug = `/blog/${category}/${basename(filename, extname(filename))}`; + const slug = `/blog/${category}/${basename(route)}`; return { title, @@ -55,9 +59,9 @@ const getFrontMatter = (filename, source) => { */ const generateBlogData = async () => { // We retrieve the full pathnames of all Blog Posts to read each file individually - const filenames = await getMarkdownFiles(process.cwd(), 'pages/en/blog', [ - '**/index.md', - ]); + const filenames = await getAllPages({ + cwd: blogPath, + }); /** * This contains the metadata of all available blog categories @@ -65,49 +69,54 @@ const generateBlogData = async () => { const blogCategories = new Set(['all']); const posts = await Promise.all( - filenames.map( - filename => - new Promise(resolve => { - // We create a stream for reading a file instead of reading the files - const _stream = createReadStream(join(blogPath, filename)); - - // We create a readline interface to read the file line-by-line - const _readLine = readline.createInterface({ input: _stream }); - - let rawFrontmatter = ''; - let frontmatterSeparatorsEncountered = 0; - - // We read line by line - _readLine.on('line', line => { - rawFrontmatter += `${line}\n`; - - // We observe the frontmatter separators - if (line === '---') { - frontmatterSeparatorsEncountered++; - } - - // Once we have two separators we close the readLine and the stream - if (frontmatterSeparatorsEncountered === 2) { - _readLine.close(); - _stream.close(); - } - }); - - // Then we parse gray-matter on the frontmatter - // This allows us to only read the frontmatter part of each file - // and optimise the read-process as we have thousands of markdown files - _readLine.on('close', () => { - const frontMatterData = getFrontMatter(filename, rawFrontmatter); - - frontMatterData.categories.forEach(category => { - // we add the category to the categories set - blogCategories.add(category); + filenames + .filter(n => n !== 'page.md') + .map( + filename => + new Promise(resolve => { + // We create a stream for reading a file instead of reading the files + const _stream = createReadStream(join(blogPath, filename)); + + // We create a readline interface to read the file line-by-line + const _readLine = readline.createInterface({ input: _stream }); + + let rawFrontmatter = ''; + let frontmatterSeparatorsEncountered = 0; + + // We read line by line + _readLine.on('line', line => { + rawFrontmatter += `${line}\n`; + + // We observe the frontmatter separators + if (line === '---') { + frontmatterSeparatorsEncountered++; + } + + // Once we have two separators we close the readLine and the stream + if (frontmatterSeparatorsEncountered === 2) { + _readLine.close(); + _stream.close(); + } }); - resolve(frontMatterData); - }); - }) - ) + // Then we parse gray-matter on the frontmatter + // This allows us to only read the frontmatter part of each file + // and optimise the read-process as we have thousands of markdown files + _readLine.on('close', () => { + const frontMatterData = getFrontMatter( + pathToRoute(filename), + rawFrontmatter + ); + + frontMatterData.categories.forEach(category => { + // we add the category to the categories set + blogCategories.add(category); + }); + + resolve(frontMatterData); + }); + }) + ) ); return { diff --git a/apps/site/scripts/orama-search/get-documents.mjs b/apps/site/scripts/orama-search/get-documents.mjs index b6d4ffdf73fc2..cfebb1c80f6e8 100644 --- a/apps/site/scripts/orama-search/get-documents.mjs +++ b/apps/site/scripts/orama-search/get-documents.mjs @@ -1,8 +1,12 @@ -import { readFile, glob } from 'node:fs/promises'; -import { join, basename, posix, win32 } from 'node:path'; +import { readFile } from 'node:fs/promises'; +import { join, basename } from 'node:path'; import generateReleaseData from '#site/next-data/generators/releaseData.mjs'; -import { getRelativePath } from '#site/next.helpers.mjs'; +import { + DEFAULT_LOCALE_ROOT, + getAllPages, + pathToRoute, +} from '#site/util/router.mjs'; import { processDocument } from './process-documents.mjs'; @@ -51,23 +55,16 @@ export const getAPIDocs = async () => { * excluding blog content. */ export const getArticles = async () => { - const relativePath = getRelativePath(import.meta.url); - const root = join(relativePath, '..', '..', 'pages', 'en'); - // Find all markdown files (excluding blog) - const files = await Array.fromAsync(glob('**/*.{md,mdx}', { cwd: root })); + const files = getAllPages(); // Read content + metadata return Promise.all( files .filter(path => !path.startsWith('blog')) .map(async path => ({ - content: await readFile(join(root, path), 'utf8'), - pathname: path - // Strip the extension - .replace(/\.mdx?$/, '') - // Normalize to a POSIX path - .replaceAll(win32.sep, posix.sep), + content: await readFile(join(DEFAULT_LOCALE_ROOT, path), 'utf8'), + pathname: pathToRoute(path), })) ); }; diff --git a/apps/site/types/index.ts b/apps/site/types/index.ts index 3e0fd77eb4e11..8e8ad943a2124 100644 --- a/apps/site/types/index.ts +++ b/apps/site/types/index.ts @@ -1,7 +1,7 @@ export * from './blog'; export * from './config'; export * from './features'; -export * from './frontmatter'; +export * from './markdown'; export * from './i18n'; export * from './layouts'; export * from './navigation'; diff --git a/apps/site/types/frontmatter.ts b/apps/site/types/markdown.ts similarity index 51% rename from apps/site/types/frontmatter.ts rename to apps/site/types/markdown.ts index c625bc1d24405..32cb73672a2bd 100644 --- a/apps/site/types/frontmatter.ts +++ b/apps/site/types/markdown.ts @@ -1,4 +1,6 @@ import type { Layouts } from './layouts'; +import type { Heading } from '@vcarl/remark-headings'; +import type { ReadTimeResults } from 'reading-time'; // TODO(@avivkeller): BlogFrontmatter, LearnFrontmatter, etc export type Frontmatter = { @@ -10,4 +12,13 @@ export type Frontmatter = { authors?: string; category?: string; description?: string; + canonical?: string; +}; + +export type MarkdownContext = { + frontmatter: Frontmatter; + headings: Array; + pathname: string; + filename: string; + readingTime: ReadTimeResults; }; diff --git a/apps/site/types/server.ts b/apps/site/types/server.ts index 11f02ee74a8b6..3f117f51fd7dc 100644 --- a/apps/site/types/server.ts +++ b/apps/site/types/server.ts @@ -1,12 +1,5 @@ import type { useDetectOS } from '#site/hooks'; -import type { Frontmatter } from '#site/types/frontmatter'; -import type { Heading } from '@vcarl/remark-headings'; -import type { ReadTimeResults } from 'reading-time'; +import type { MarkdownContext } from '#site/types/markdown'; -export type ClientSharedServerContext = { - frontmatter: Frontmatter; - headings: Array; - pathname: string; - filename: string; - readingTime: ReadTimeResults; -} & ReturnType; +export type ClientSharedServerContext = MarkdownContext & + ReturnType; diff --git a/apps/site/util/__tests__/github.test.mjs b/apps/site/util/__tests__/github.test.mjs index 3d359863fc502..335d6f9f684db 100644 --- a/apps/site/util/__tests__/github.test.mjs +++ b/apps/site/util/__tests__/github.test.mjs @@ -23,7 +23,7 @@ describe('gitHubUtils', () => { it('getGitHubBlobUrl returns the correct URL', () => { const result = getGitHubBlobUrl('learn/getting-started/introduction.md'); const expected = - 'https://github.com/nodejs/nodejs.org/blob/main/apps/site/pages/en/learn/getting-started/introduction.md'; + 'https://github.com/nodejs/nodejs.org/blob/main/apps/site/app/en/learn/getting-started/introduction.md'; assert.equal(result, expected); }); @@ -40,7 +40,7 @@ describe('gitHubUtils', () => { it('should return the correct blob URL', () => { assert.ok( getGitHubBlobUrl('testfile.md').includes( - 'blob/main/apps/site/pages/en/testfile.md' + 'blob/main/apps/site/app/en/testfile.md' ) ); }); diff --git a/apps/site/util/blog.ts b/apps/site/util/blog.ts index 3702697e01ac3..f4037762261c0 100644 --- a/apps/site/util/blog.ts +++ b/apps/site/util/blog.ts @@ -78,3 +78,17 @@ export const getBlogData = (cat: BlogCategory, page?: number): BlogPostsRSC => { return page && page >= 1 ? paginateBlogPosts(posts, page) : posts; }; + +export const getBlogSitemapData = () => [ + // Provides Routes for all Blog Categories + ...blogData.categories, + // Provides Routes for all Blog Categories w/ Pagination + ...blogData.categories + // retrieves the amount of pages for each blog category + .map(c => [c, getBlogPosts(c).pagination.pages]) + // creates a numeric array for each page and define a pathname for + // each page for a category (i.e. blog/all/page/1) + .map(([c, t]) => [...Array(t).keys()].map(p => `${c}/page/${p + 1}`)) + // flattens the array since we have a .map inside another .map + .flat(), +]; diff --git a/apps/site/util/github.ts b/apps/site/util/github.ts index 3070612c3b5ce..e655dfcb966c4 100644 --- a/apps/site/util/github.ts +++ b/apps/site/util/github.ts @@ -10,4 +10,4 @@ export const createGitHubSlugger = () => { }; export const getGitHubBlobUrl = (filename: string) => - `https://github.com/nodejs/nodejs.org/blob/main/apps/site/pages/en/${filename}`; + `https://github.com/nodejs/nodejs.org/blob/main/apps/site/app/en/${filename}`; diff --git a/apps/site/util/router.mjs b/apps/site/util/router.mjs new file mode 100644 index 0000000000000..8029dcb932739 --- /dev/null +++ b/apps/site/util/router.mjs @@ -0,0 +1,28 @@ +import { glob } from 'node:fs/promises'; +import { join, relative, sep } from 'node:path'; +import { join as posixJoin } from 'node:path/posix'; + +import { defaultLocale } from '@node-core/website-i18n/index.mjs'; + +export const APP_ROOT = join(process.cwd(), 'app'); +export const DEFAULT_LOCALE_ROOT = join(APP_ROOT, `[${defaultLocale.code}]`); + +export const getAllPages = (options = {}) => + Array.fromAsync( + glob('**/page.{md,mdx}', { + cwd: DEFAULT_LOCALE_ROOT, + ...options, + }) + ); + +export const getAllRoutes = async () => (await getAllPages()).map(pathToRoute); + +export const pathToRoute = path => { + const rel = relative(APP_ROOT, path).replaceAll(sep, '/'); + + // Filename is the locale-less filepath + const filename = rel.substring(rel.indexOf('/')); + + // Derive a URL-like pathnam + return posixJoin(filename, '..'); +}; diff --git a/apps/site/wrangler.jsonc b/apps/site/wrangler.jsonc index 69afe07d5a0e2..fa79146b3dc51 100644 --- a/apps/site/wrangler.jsonc +++ b/apps/site/wrangler.jsonc @@ -24,15 +24,6 @@ "enabled": true, "head_sampling_rate": 1, }, - "build": { - "command": "wrangler-build-time-fs-assets-polyfilling --assets pages --assets snippets --assets-output-dir .open-next/assets", - }, - "alias": { - "node:fs": "./.wrangler/fs-assets-polyfilling/polyfills/node/fs.ts", - "node:fs/promises": "./.wrangler/fs-assets-polyfilling/polyfills/node/fs/promises.ts", - "fs": "./.wrangler/fs-assets-polyfilling/polyfills/node/fs.ts", - "fs/promises": "./.wrangler/fs-assets-polyfilling/polyfills/node/fs/promises.ts", - }, "r2_buckets": [ { "binding": "NEXT_INC_CACHE_R2_BUCKET", diff --git a/crowdin.yml b/crowdin.yml index 0bbdfbe0eec42..5c9d2a1d29cb4 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,31 +1,32 @@ -project_id_env: 'CROWDIN_PROJECT_ID' -api_token_env: 'CROWDIN_PERSONAL_TOKEN' +project_id_env: "CROWDIN_PROJECT_ID" +api_token_env: "CROWDIN_PERSONAL_TOKEN" append_commit_message: false # without this, crowdin will flatten all files preserve_hierarchy: true files: - - source: /apps/site/pages/en/**/*.md - translation: /apps/site/pages/%two_letters_code%/**/%original_file_name% + - source: /apps/site/app/en/**/page.md + translation: /apps/site/app/%two_letters_code%/**/%original_file_name% content_segmentation: 0 ignore: - - /apps/site/pages/en/blog/**/*.md - - /apps/site/pages/en/learn/**/*.md - - /apps/site/pages/en/download/index.md - - /apps/site/pages/en/download/current.md + - /apps/site/app/en/blog/**/page.md + - /apps/site/app/en/learn/**/page.md + # TODO + - /apps/site/app/en/download/index.md + - /apps/site/app/en/download/current.md languages_mapping: two_letters_code: es-ES: es pt-BR: pt-br zh-CN: zh-cn zh-TW: zh-tw - - source: /apps/site/pages/en/**/*.mdx - translation: /apps/site/pages/%two_letters_code%/**/%original_file_name% + - source: /apps/site/app/en/**/page.mdx + translation: /apps/site/app/%two_letters_code%/**/%original_file_name% content_segmentation: 0 ignore: - - /apps/site/pages/en/blog/**/*.mdx - - /apps/site/pages/en/learn/**/*.mdx + - /apps/site/app/en/blog/**/page.mdx + - /apps/site/app/en/learn/**/page.mdx languages_mapping: two_letters_code: es-ES: es diff --git a/docs/adding-pages.md b/docs/adding-pages.md index 72b5b9e48728b..540e002068936 100644 --- a/docs/adding-pages.md +++ b/docs/adding-pages.md @@ -41,7 +41,7 @@ This guide explains how to create new pages and content for the Node.js website. ### 1. Create the Page Content -Create a new markdown file in `apps/site/pages/en/` with the appropriate subdirectory structure. +Create a new markdown file in `apps/site/app/[en]/` with the appropriate subdirectory structure. ```markdown --- @@ -82,12 +82,12 @@ The Learn section has special requirements and structure. ### Learn Page Structure ``` -apps/site/pages/en/learn/ +apps/site/app/[en]/learn/ ├── category-name/ -│ ├── article-name.md -│ └── another-article.md +│ ├── article-name/page.md +│ └── another-article/page.md └── another-category/ - └── article.md + └── article/page.mdx ``` ### Update Learn Navigation @@ -184,7 +184,7 @@ import vm from 'node:vm'; ### Content Structure ``` -apps/site/pages/ +apps/site/app/ ├── en/ # English content (source) │ ├── learn/ # Learn section │ ├── blog/ # Blog posts @@ -204,8 +204,8 @@ apps/site/pages/ ### Translation Process -1. Create the English version first in `apps/site/pages/en/` -2. Translators will create localized versions in `apps/site/pages/{locale}/` +1. Create the English version first in `apps/site/app/en/` +2. Translators will create localized versions in `apps/site/app/{locale}/` 3. Non-translated pages automatically fall back to English content with localized navigation ### Translation Guidelines diff --git a/docs/downloads-page.md b/docs/downloads-page.md index f84769beb45d4..06e94e950f4a5 100644 --- a/docs/downloads-page.md +++ b/docs/downloads-page.md @@ -110,10 +110,10 @@ export const InstallationMethodLabel: Record = { ### 4. Create Installation Snippet -Add installation instructions in `apps/site/snippets/en/download/`: +Add installation instructions in `apps/site/snippets/[en]/download/`: ```bash -# apps/site/snippets/en/download/exampleMethod.bash +# apps/site/snippets/[en]/download/exampleMethod.bash # Install Node.js ${props.version} using Example Method curl -fsSL https://example.com/install.sh | bash -s -- ${props.version} diff --git a/docs/technologies.md b/docs/technologies.md index ff9885104c160..58e9246935bae 100644 --- a/docs/technologies.md +++ b/docs/technologies.md @@ -18,10 +18,6 @@ This document provides an overview of the technologies used in the Node.js websi - [Repository Structure](#repository-structure) - [Architecture Decisions](#architecture-decisions) - [Static Build Support](#static-build-support) - - [Custom Page Rendering](#custom-page-rendering) - - [`[...path].tsx` - Dynamic Route Handler](#pathts---dynamic-route-handler) - - [`next.dynamic.mjs` - Page Generation](#nextdynamicmjs---page-generation) - - [`next.data.mjs` - Build-time Data](#nextdatamjs---build-time-data) - [Internationalization Strategy](#internationalization-strategy) - [Why Not Next.js Built-in i18n?](#why-not-nextjs-built-in-i18n) - [Locale Detection and Routing](#locale-detection-and-routing) @@ -123,7 +119,7 @@ nodejs.org/ │ └── site/ # Main website application │ ├── components/ # Website-specific React components │ ├── layouts/ # Page layout templates -│ ├── pages/ # Content pages (Markdown/MDX) +│ ├── app/ # Content pages (Markdown/MDX) │ │ ├── en/ # English content (source) │ │ └── {locale}/ # Translated content │ ├── public/ # Static assets @@ -156,34 +152,6 @@ The website supports fully static builds to ensure independence from third-party - Content can be served without external dependencies - Maintains availability even if hosting providers change -### Custom Page Rendering - -The website uses a custom rendering system instead of Next.js default routing: - -#### `[...path].tsx` - Dynamic Route Handler - -- Catches all routes and renders them through a custom system -- Enables dynamic page generation from Markdown files -- Supports incremental static generation (ISG) - -#### `next.dynamic.mjs` - Page Generation - -This file handles: - -- Discovering all source pages in `apps/site/pages/en` -- Identifying translated pages -- Generating localized paths for untranslated content -- Creating fallback pages that show English content with translated menus and UI elements - -#### `next.data.mjs` - Build-time Data - -Responsible for: - -- Node.js release data fetching -- Blog post metadata generation -- RSS feed creation -- Build-time indexing - ### Internationalization Strategy #### Why Not Next.js Built-in i18n? @@ -191,7 +159,7 @@ Responsible for: We use a custom i18n solution because: - Need comprehensive locale and page listing capabilities -- Use subfolder content structure (`/pages/en/`, `/pages/fr/`) vs. extension-based (`file.en.md`) +- Use subfolder content structure (`/en/`, `/fr/`) vs. extension-based (`file.en.md`) - Maintain consistency with previous website structure - Ensure long-term maintainability diff --git a/packages/ui-components/src/Common/Select/index.tsx b/packages/ui-components/src/Common/Select/index.tsx index ea25eeeb65399..24b1b6ecb0d3b 100644 --- a/packages/ui-components/src/Common/Select/index.tsx +++ b/packages/ui-components/src/Common/Select/index.tsx @@ -3,7 +3,7 @@ import { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline'; import * as SelectPrimitive from '@radix-ui/react-select'; import classNames from 'classnames'; -import { useEffect, useId, useMemo, useState } from 'react'; +import { useId, useMemo, useState } from 'react'; import Skeleton from '#ui/Common/Skeleton'; import { isStringArray, isValuesArray } from '#ui/util/array'; @@ -63,8 +63,6 @@ const Select = ({ const id = useId(); const [value, setValue] = useState(defaultValue); - useEffect(() => setValue(defaultValue), [defaultValue]); - const mappedValues = useMemo(() => { let mappedValues = values; @@ -118,10 +116,7 @@ const Select = ({ ))} )); - // We explicitly want to recalculate these values only when the values themselves changed - // This is to prevent re-rendering and re-calcukating the values on every render - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(values)]); + }, [mappedValues]); // Both change the internal state and emit the change event const handleChange = (value: T) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f3b6f3dd3357..4772de4373206 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,9 +84,12 @@ importers: '@heroicons/react': specifier: ~2.2.0 version: 2.2.0(react@19.2.3) - '@mdx-js/mdx': + '@mdx-js/loader': specifier: ^3.1.1 - version: 3.1.1 + version: 3.1.1(webpack@5.104.1) + '@next/mdx': + specifier: ^16.1.1 + version: 16.1.1(@mdx-js/loader@3.1.1(webpack@5.104.1)) '@node-core/rehype-shiki': specifier: workspace:* version: link:../../packages/rehype-shiki @@ -137,19 +140,22 @@ importers: version: 0.1.0 '@vercel/analytics': specifier: ~1.5.0 - version: 1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) + version: 1.5.0(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) '@vercel/otel': specifier: ~2.1.0 version: 2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)) '@vercel/speed-insights': specifier: ~1.2.0 - version: 1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) + version: 1.2.0(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) classnames: specifier: 'catalog:' version: 2.5.1 cross-env: specifier: 'catalog:' version: 10.1.0 + estree-util-value-to-estree: + specifier: ^3.5.0 + version: 3.5.0 feed: specifier: ~5.1.0 version: 5.1.0 @@ -163,11 +169,11 @@ importers: specifier: ^4.0.0 version: 4.0.0 next: - specifier: 16.0.10 - version: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 16.1.1 + version: 16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ~4.5.3 - version: 4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + version: 4.5.8(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(typescript@5.9.3) next-themes: specifier: ~0.4.6 version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -180,9 +186,6 @@ importers: react-dom: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) - reading-time: - specifier: ~1.5.0 - version: 1.5.0 rehype-autolink-headings: specifier: ~7.1.0 version: 7.1.0 @@ -192,6 +195,9 @@ importers: remark-gfm: specifier: ~4.0.1 version: 4.0.1 + remark-mdx-frontmatter: + specifier: ^5.2.0 + version: 5.2.0 remark-reading-time: specifier: ~2.0.2 version: 2.0.2 @@ -210,25 +216,16 @@ importers: unist-util-visit: specifier: ^5.0.0 version: 5.0.0 - vfile: - specifier: ~6.0.3 - version: 6.0.3 - vfile-matter: - specifier: ~5.0.1 - version: 5.0.1 devDependencies: - '@flarelabs-net/wrangler-build-time-fs-assets-polyfilling': - specifier: ^0.0.1 - version: 0.0.1 '@next/eslint-plugin-next': - specifier: 16.0.7 - version: 16.0.7 + specifier: 16.1.1 + version: 16.1.1 '@node-core/remark-lint': specifier: workspace:* version: link:../../packages/remark-lint '@opennextjs/cloudflare': specifier: ^1.14.7 - version: 1.14.7(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(wrangler@4.54.0) + version: 1.14.7(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(wrangler@4.54.0) '@playwright/test': specifier: ^1.57.0 version: 1.57.0 @@ -277,6 +274,9 @@ importers: nock: specifier: ^14.0.10 version: 14.0.10 + reading-time: + specifier: ^1.5.0 + version: 1.5.0 remark-frontmatter: specifier: ^5.0.0 version: 5.0.0 @@ -1710,10 +1710,6 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@flarelabs-net/wrangler-build-time-fs-assets-polyfilling@0.0.1': - resolution: {integrity: sha512-uT7N77TaKZqGeb3c/KR+UlUs7xR36iU/g3uPaDflpJsXGRk8XwL2Ol2IpCNmv7ok57teModokqcbb6JT8a018Q==} - hasBin: true - '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -2053,6 +2049,14 @@ packages: '@lit/reactive-element@2.1.1': resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} + '@mdx-js/loader@3.1.1': + resolution: {integrity: sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==} + peerDependencies: + webpack: '>=5' + peerDependenciesMeta: + webpack: + optional: true + '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -2096,59 +2100,67 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} - - '@next/eslint-plugin-next@16.0.7': - resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} + '@next/env@16.1.1': + resolution: {integrity: sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==} '@next/eslint-plugin-next@16.1.1': resolution: {integrity: sha512-Ovb/6TuLKbE1UiPcg0p39Ke3puyTCIKN9hGbNItmpQsp+WX3qrjO3WaMVSi6JHr9X1NrmthqIguVHodMJbh/dw==} - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} + '@next/mdx@16.1.1': + resolution: {integrity: sha512-XvlZ28/K7kXb1vgTeZWHjjfxDx9BVz/s1bbVlsFOvPfYuSVRmlUkhaiyJTA/7mm9OdpeC57+uHR6k1fUcn5AaA==} + peerDependencies: + '@mdx-js/loader': '>=0.15.0' + '@mdx-js/react': '>=0.15.0' + peerDependenciesMeta: + '@mdx-js/loader': + optional: true + '@mdx-js/react': + optional: true + + '@next/swc-darwin-arm64@16.1.1': + resolution: {integrity: sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} + '@next/swc-darwin-x64@16.1.1': + resolution: {integrity: sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} + '@next/swc-linux-arm64-gnu@16.1.1': + resolution: {integrity: sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} + '@next/swc-linux-arm64-musl@16.1.1': + resolution: {integrity: sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} + '@next/swc-linux-x64-gnu@16.1.1': + resolution: {integrity: sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} + '@next/swc-linux-x64-musl@16.1.1': + resolution: {integrity: sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} + '@next/swc-win32-arm64-msvc@16.1.1': + resolution: {integrity: sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} + '@next/swc-win32-x64-msvc@16.1.1': + resolution: {integrity: sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -5225,8 +5237,8 @@ packages: estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - estree-util-value-to-estree@3.4.0: - resolution: {integrity: sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==} + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -6637,8 +6649,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + next@16.1.1: + resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -7482,6 +7494,9 @@ packages: remark-lint@10.0.1: resolution: {integrity: sha512-1+PYGFziOg4pH7DDf1uMd4AR3YuO2EMnds/SdIWMPGT7CAfDRSnAmpxPsJD0Ds3IKpn97h3d5KPGf1WFOg6hXQ==} + remark-mdx-frontmatter@5.2.0: + resolution: {integrity: sha512-U/hjUYTkQqNjjMRYyilJgLXSPF65qbLPdoESOkXyrwz2tVyhAnm4GUKhfXqOOS9W34M3545xEMq+aMpHgVjEeQ==} + remark-mdx@3.1.1: resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} @@ -8065,6 +8080,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} @@ -8278,6 +8296,9 @@ packages: unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-mdx-define@1.1.2: + resolution: {integrity: sha512-9ncH7i7TN5Xn7/tzX5bE3rXgz1X/u877gYVAUB3mLeTKYJmQHmqKTDBi6BTGXV7AeolBCI9ErcVsOt2qryoD0g==} + unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -8399,9 +8420,6 @@ packages: vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-matter@5.0.1: - resolution: {integrity: sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw==} - vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} @@ -10294,8 +10312,6 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@flarelabs-net/wrangler-build-time-fs-assets-polyfilling@0.0.1': {} - '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -10584,6 +10600,15 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.4.0 + '@mdx-js/loader@3.1.1(webpack@5.104.1)': + dependencies: + '@mdx-js/mdx': 3.1.1 + source-map: 0.7.6 + optionalDependencies: + webpack: 5.104.1 + transitivePeerDependencies: + - supports-color + '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.8 @@ -10660,38 +10685,40 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.0.10': {} + '@next/env@16.1.1': {} - '@next/eslint-plugin-next@16.0.7': + '@next/eslint-plugin-next@16.1.1': dependencies: fast-glob: 3.3.1 - '@next/eslint-plugin-next@16.1.1': + '@next/mdx@16.1.1(@mdx-js/loader@3.1.1(webpack@5.104.1))': dependencies: - fast-glob: 3.3.1 + source-map: 0.7.6 + optionalDependencies: + '@mdx-js/loader': 3.1.1(webpack@5.104.1) - '@next/swc-darwin-arm64@16.0.10': + '@next/swc-darwin-arm64@16.1.1': optional: true - '@next/swc-darwin-x64@16.0.10': + '@next/swc-darwin-x64@16.1.1': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': + '@next/swc-linux-arm64-gnu@16.1.1': optional: true - '@next/swc-linux-arm64-musl@16.0.10': + '@next/swc-linux-arm64-musl@16.1.1': optional: true - '@next/swc-linux-x64-gnu@16.0.10': + '@next/swc-linux-x64-gnu@16.1.1': optional: true - '@next/swc-linux-x64-musl@16.0.10': + '@next/swc-linux-x64-musl@16.1.1': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': + '@next/swc-win32-arm64-msvc@16.1.1': optional: true - '@next/swc-win32-x64-msvc@16.0.10': + '@next/swc-win32-x64-msvc@16.1.1': optional: true '@noble/ciphers@1.3.0': {} @@ -10898,7 +10925,7 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opennextjs/aws@3.9.7(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': + '@opennextjs/aws@3.9.7(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0 @@ -10914,7 +10941,7 @@ snapshots: cookie: 1.1.1 esbuild: 0.25.4 express: 5.2.1 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) path-to-regexp: 6.3.0 urlpattern-polyfill: 10.1.0 yaml: 2.8.2 @@ -10922,15 +10949,15 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.14.7(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(wrangler@4.54.0)': + '@opennextjs/cloudflare@1.14.7(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(wrangler@4.54.0)': dependencies: '@ast-grep/napi': 0.40.0 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.7(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + '@opennextjs/aws': 3.9.7(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) cloudflare: 4.5.0 enquirer: 2.4.1 glob: 12.0.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) ts-tqdm: 0.8.6 wrangler: 4.54.0 yargs: 18.0.0 @@ -12937,9 +12964,9 @@ snapshots: mdast-util-to-string: 3.2.0 unist-util-visit: 4.1.2 - '@vercel/analytics@1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': + '@vercel/analytics@1.5.0(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': optionalDependencies: - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 '@vercel/otel@2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))': @@ -12952,9 +12979,9 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@vercel/speed-insights@1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': + '@vercel/speed-insights@1.2.0(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': optionalDependencies: - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 '@vitest/expect@3.2.4': @@ -14424,7 +14451,7 @@ snapshots: astring: 1.9.0 source-map: 0.7.6 - estree-util-value-to-estree@3.4.0: + estree-util-value-to-estree@3.5.0: dependencies: '@types/estree': 1.0.8 @@ -16233,12 +16260,12 @@ snapshots: next-intl-swc-plugin-extractor@4.5.8: {} - next-intl@4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(typescript@5.9.3): + next-intl@4.5.8(next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.3 negotiator: 1.0.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl-swc-plugin-extractor: 4.5.8 po-parser: 1.0.2 react: 19.2.3 @@ -16253,24 +16280,25 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.1.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 16.0.10 + '@next/env': 16.1.1 '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.4 caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.10 - '@next/swc-darwin-x64': 16.0.10 - '@next/swc-linux-arm64-gnu': 16.0.10 - '@next/swc-linux-arm64-musl': 16.0.10 - '@next/swc-linux-x64-gnu': 16.0.10 - '@next/swc-linux-x64-musl': 16.0.10 - '@next/swc-win32-arm64-msvc': 16.0.10 - '@next/swc-win32-x64-msvc': 16.0.10 + '@next/swc-darwin-arm64': 16.1.1 + '@next/swc-darwin-x64': 16.1.1 + '@next/swc-linux-arm64-gnu': 16.1.1 + '@next/swc-linux-arm64-musl': 16.1.1 + '@next/swc-linux-x64-gnu': 16.1.1 + '@next/swc-linux-x64-musl': 16.1.1 + '@next/swc-win32-arm64-msvc': 16.1.1 + '@next/swc-win32-x64-msvc': 16.1.1 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.57.0 babel-plugin-react-compiler: 1.0.0 @@ -17367,6 +17395,15 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx-frontmatter@5.2.0: + dependencies: + '@types/mdast': 4.0.4 + estree-util-value-to-estree: 3.5.0 + toml: 3.0.0 + unified: 11.0.5 + unist-util-mdx-define: 1.1.2 + yaml: 2.8.2 + remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 @@ -17415,7 +17452,7 @@ snapshots: remark-reading-time@2.0.2: dependencies: estree-util-is-identifier-name: 2.1.0 - estree-util-value-to-estree: 3.4.0 + estree-util-value-to-estree: 3.5.0 reading-time: 1.5.0 unist-util-visit: 3.1.0 @@ -18121,6 +18158,16 @@ snapshots: optionalDependencies: '@swc/core': 1.15.3 + terser-webpack-plugin@5.3.16(webpack@5.104.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.104.1 + optional: true + terser@5.16.9: dependencies: '@jridgewell/source-map': 0.3.11 @@ -18162,6 +18209,8 @@ snapshots: toidentifier@1.0.1: {} + toml@3.0.0: {} + tough-cookie@6.0.0: dependencies: tldts: 7.0.19 @@ -18440,6 +18489,16 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-mdx-define@1.1.2: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + vfile: 6.0.3 + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.3 @@ -18598,11 +18657,6 @@ snapshots: '@types/unist': 3.0.3 vfile: 6.0.3 - vfile-matter@5.0.1: - dependencies: - vfile: 6.0.3 - yaml: 2.8.2 - vfile-message@3.1.4: dependencies: '@types/unist': 2.0.11 @@ -18685,6 +18739,39 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webpack@5.104.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(webpack@5.104.1) + watchpack: 2.5.0 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + optional: true + webpack@5.104.1(@swc/core@1.15.3): dependencies: '@types/eslint-scope': 3.7.7