Skip to content
Merged
42 changes: 24 additions & 18 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@ const SORTED_PROJECTS = [...PROJECTS].sort((a, b) => {
return Number(b.since) - Number(a.since)
})

type Project = (typeof PROJECTS)[number]
const ACTIVE_PROJECTS = SORTED_PROJECTS.filter((p) => p.status !== "Deprecated")
const PAST_PROJECTS = SORTED_PROJECTS.filter((p) => p.status === "Deprecated")

const ProductGrid = ({ projects, className = "" }: { projects: Project[]; className?: string }) => (
<div className={className}>
{projects.map((project) => (
<ProjectCard key={project.slug} {...project} />
))}
</div>
)

export default function ReportsIndexPage() {
return (
<div className="min-h-screen bg-background">
Expand Down Expand Up @@ -97,24 +109,18 @@ export default function ReportsIndexPage() {
<h2 className="text-xl font-semibold text-foreground">Products</h2>
</div>

{/* Project cards */}
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-4">
{SORTED_PROJECTS.map((project) => (
<ProjectCard
key={project.slug}
slug={project.slug}
name={project.name}
tagline={project.tagline}
status={project.status}
since={project.since}
audience={project.audience}
contributors={project.contributors}
volunteers={project.volunteers}
highlightStat={project.highlightStat}
url={project.url}
/>
))}
</div>
{/* Active products */}
<ProductGrid projects={ACTIVE_PROJECTS} className="grid md:grid-cols-2 lg:grid-cols-3 gap-4" />

{/* Past products */}
{PAST_PROJECTS.length > 0 && (
<>
<h3 className="mt-12 text-base font-semibold text-muted-foreground mb-6">
Past products
</h3>
<ProductGrid projects={PAST_PROJECTS} className="grid md:grid-cols-2 lg:grid-cols-3 gap-4" />
</>
)}
</main>

{/* Footer */}
Expand Down
30 changes: 29 additions & 1 deletion lib/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,34 @@ export const PROJECTS: Project[] = [
},
],
},
{
slug: "chergpt",
volunteers: 4,
name: "CherGPT",
tagline: "GPT-powered teaching assistant.",
description:
"CherGPT is a GPT-powered teaching assistant built for educators and students. The project is no longer actively maintained and is kept here as a past product.",
url: "https://github.com/String-sg/chergpt-basic",
status: "Deprecated",
since: "2024",
audience: ["Teachers", "Students"],
problemSpace: ["Learning"],
contributors: [
// TODO: add real contributor names
],
highlightStat: { value: "1,000+", label: "users" },
metrics: [
{ label: "Total users", value: "1,000+" },
{ label: "Volunteers", value: "4" },
],
costPerQuarter: "$0",
updates: [
{
date: "2026",
body: "Moved to inactive status. No active feature development or maintenance.",
},
],
},
{
slug: "events",
volunteers: 10,
Expand Down Expand Up @@ -313,7 +341,7 @@ export const PROJECTS: Project[] = [
]

export const AGGREGATE = {
// Active: String (Building), Events (Building), Diagrams (Building), Bingo (Maintenance), MatCHER (Building). Remarks Co-Pilot and Whine deprecated.
// Active: String (Building), Events (Building), Diagrams (Building), Bingo (Maintenance), MatCHER (Building). Remarks Co-Pilot, Whine, and CherGPT are deprecated.
totalProjects: 5,
// Auto-computed: sum of teacherImpact across all projects.
// To update, set teacherImpact on the relevant project above.
Expand Down
Binary file added public/pr-screenshots/home-after-chergpt.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/pr-screenshots/home-after.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/pr-screenshots/home-before.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.