diff --git a/src/components/Projects/ProjectsPage.tsx b/src/components/Projects/ProjectsPage.tsx
index 8bdf6ae69..f3d797763 100644
--- a/src/components/Projects/ProjectsPage.tsx
+++ b/src/components/Projects/ProjectsPage.tsx
@@ -1,6 +1,6 @@
import { useEffect, useMemo, useRef, useState } from 'react';
import { cn } from '../../lib/classname.ts';
-import {Box, Filter, Group, X} from 'lucide-react';
+import { Box, Filter, Group, X } from 'lucide-react';
import {
deleteUrlParam,
getUrlParams,
@@ -81,6 +81,18 @@ export function ProjectsPage(props: ProjectsPageProps) {
(group) => group.id === activeGroup,
);
+ const requiredSortOrder = [
+ 'Frontend',
+ 'Backend',
+ 'DevOps',
+ 'Full-stack',
+ 'JavaScript',
+ 'Go',
+ 'Python',
+ 'Node.js',
+ 'Java',
+ ];
+
return (
- {roadmapsProjects.map((group) => (
- {
- setActiveGroup(group.id);
- setIsFilterOpen(false);
- document?.getElementById('filter-button')?.scrollIntoView();
- setVisibleProjects(group.projects);
- setUrlParams({ g: group.id });
- }}
- category={group.title}
- selected={activeGroup === group.id}
- />
- ))}
+ {roadmapsProjects
+ .sort((a, b) => {
+ const aIndex = requiredSortOrder.indexOf(a.title);
+ const bIndex = requiredSortOrder.indexOf(b.title);
+
+ if (aIndex === -1 && bIndex === -1) {
+ return a.title.localeCompare(b.title);
+ }
+
+ if (aIndex === -1) {
+ return 1;
+ }
+
+ if (bIndex === -1) {
+ return -1;
+ }
+ return aIndex - bIndex;
+ })
+ .map((group) => (
+ {
+ setActiveGroup(group.id);
+ setIsFilterOpen(false);
+ document
+ ?.getElementById('filter-button')
+ ?.scrollIntoView();
+ setVisibleProjects(group.projects);
+ setUrlParams({ g: group.id });
+ }}
+ category={group.title}
+ selected={activeGroup === group.id}
+ />
+ ))}
diff --git a/src/pages/projects/index.astro b/src/pages/projects/index.astro
index 61acb6d81..f0cfe6774 100644
--- a/src/pages/projects/index.astro
+++ b/src/pages/projects/index.astro
@@ -11,7 +11,10 @@ const allRoadmapIds = Object.keys(roadmapProjects);
const allRoadmaps = await getRoadmapsByIds(allRoadmapIds);
const enrichedRoadmaps = allRoadmaps.map((roadmap) => {
- const projects = roadmapProjects[roadmap.id];
+ const projects = (roadmapProjects[roadmap.id] || []).sort((a, b) => {
+ return a.frontmatter.sort - b.frontmatter.sort;
+ });
+
return {
id: roadmap.id,
title: roadmap.frontmatter.briefTitle,