diff --git a/README.md b/README.md
index d9c61d8..9977807 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Slacker News
-Official news from Hack Club Slack; built with [Astro](https://astro.build); highlighting stories that matter to hackers and makers. Run by [Hack Club](https://hackclub.com).
+Official news from the Hack Club Slack; built with [Astro](https://astro.build); highlighting stories that matter to hackers and makers. Run by [Hack Club](https://hackclub.com).
## Prerequisites
diff --git a/astro.config.mjs b/astro.config.mjs
index 033e1f0..fbe3af4 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -3,5 +3,26 @@ import mdx from "@astrojs/mdx";
export default defineConfig({
site: "https://news.hackclub.com",
- integrations: [mdx()]
+ integrations: [mdx()],
+ redirects: {
+ "/3-months-at-hack-club": "/opinion/3-months-at-hack-club",
+ "/against-moderation-transparency": "/opinion/against-moderation-transparency",
+ "/better-goodbye": "/opinion/better-goodbye",
+ "/community-privacy-policy": "/news/community-privacy-policy",
+ "/confessions-new-owners": "/news/confessions-new-owners",
+ "/how-to-get-a-gap-year": "/opinion/how-to-get-a-gap-year",
+ "/introducing-mole": "/news/introducing-mole",
+ "/nasa-stardance": "/news/nasa-stardance",
+ "/new-hq": "/news/new-hq",
+ "/prometheus-distributed-care": "/news/prometheus-distributed-care",
+ "/prometheus-mole": "/opinion/prometheus-mole",
+ "/quality-integrity-manager": "/essays/quality-integrity-manager",
+ "/set-your-own-manager": "/news/set-your-own-manager",
+ "/slack-readme": "/news/slack-readme",
+ "/slack-survey": "/news/slack-survey",
+ "/three-futures-slack": "/essays/three-futures-slack",
+ "/tragedy-anticommons": "/opinion/tragedy-anticommons",
+ "/transparency-debate": "/news/transparency-debate",
+ "/welcome-to-slacker-news": "/news/welcome-to-slacker-news"
+ }
});
diff --git a/src/content/posts/quality-integrity-manager.mdx b/src/content/posts/essays/quality-integrity-manager.mdx
similarity index 99%
rename from src/content/posts/quality-integrity-manager.mdx
rename to src/content/posts/essays/quality-integrity-manager.mdx
index bf41781..4262a27 100644
--- a/src/content/posts/quality-integrity-manager.mdx
+++ b/src/content/posts/essays/quality-integrity-manager.mdx
@@ -2,7 +2,6 @@
title: What a Quality and Integrity Manager Actually Does
date: '2026-04-17'
author: '@lfd'
-category: essays
---
A month ago I started a new role at Hack Club called Quality and Integrity Manager, which sounds really fancy. What it actually means is that I spend my days reviewing other teenagers’ project submissions and deciding whether they are real submissions or low quality effort projects made just to get something in exchange.
diff --git a/src/content/posts/three-futures-slack.mdx b/src/content/posts/essays/three-futures-slack.mdx
similarity index 99%
rename from src/content/posts/three-futures-slack.mdx
rename to src/content/posts/essays/three-futures-slack.mdx
index e391348..45c8a15 100644
--- a/src/content/posts/three-futures-slack.mdx
+++ b/src/content/posts/essays/three-futures-slack.mdx
@@ -2,9 +2,8 @@
title: Three Futures for this Slack
date: '2026-03-09'
author: '@eps'
-category: essays
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
I’ve been changing the Slack, and more changes are coming, so it’s time I explained my agenda.
diff --git a/src/content/posts/community-privacy-policy.mdx b/src/content/posts/news/community-privacy-policy.mdx
similarity index 96%
rename from src/content/posts/community-privacy-policy.mdx
rename to src/content/posts/news/community-privacy-policy.mdx
index 079788e..057d983 100644
--- a/src/content/posts/community-privacy-policy.mdx
+++ b/src/content/posts/news/community-privacy-policy.mdx
@@ -1,10 +1,9 @@
---
date: 2026-04-02
author: "@eps"
-category: news
title: Write Your Own Privacy Policy
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
Our [Terms and Privacy Policy](https://hackclub.com/privacy-and-terms/) govern how we use your data. But what governs how *everyone else* uses it?
diff --git a/src/content/posts/confessions-new-owners.mdx b/src/content/posts/news/confessions-new-owners.mdx
similarity index 92%
rename from src/content/posts/confessions-new-owners.mdx
rename to src/content/posts/news/confessions-new-owners.mdx
index 29a840f..f4f997c 100644
--- a/src/content/posts/confessions-new-owners.mdx
+++ b/src/content/posts/news/confessions-new-owners.mdx
@@ -2,10 +2,9 @@
title: Confessions Splits into Two Channels
date: '2026-03-12'
author: '@eps'
-category: news
---
-import SlackChannel from "../../components/SlackChannel.astro";
-import SlackMention from "../../components/SlackMention.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
+import SlackMention from "../../../components/SlackMention.astro";
began as a place for Hack Clubbers to say genuinely difficult things that they need to get off their chest. This purpose is still written into the confession guidelines, but over the years the channel has drifted to include jokes and personal opinions. A new channel, , has been created as a space for less serious discussions. Users who make unserious posts in will be redirected to .
diff --git a/src/content/posts/introducing-mole.mdx b/src/content/posts/news/introducing-mole.mdx
similarity index 99%
rename from src/content/posts/introducing-mole.mdx
rename to src/content/posts/news/introducing-mole.mdx
index 8b39e7d..ebee63f 100644
--- a/src/content/posts/introducing-mole.mdx
+++ b/src/content/posts/news/introducing-mole.mdx
@@ -1,7 +1,6 @@
---
date: '2026-04-01 10:57:00'
author: "@neven (hex4)"
-category: news
title: Hack Club Introduces Mole
---
If you strip away all the programs, the Slack, the memes, and the code, Hack Club has always been about one thing: Making sure that the youth of today have the tools and knowledge to build on the frontier of what's possible.
diff --git a/src/content/posts/nasa-stardance.mdx b/src/content/posts/news/nasa-stardance.mdx
similarity index 96%
rename from src/content/posts/nasa-stardance.mdx
rename to src/content/posts/news/nasa-stardance.mdx
index 0e7b1ef..2a521e7 100644
--- a/src/content/posts/nasa-stardance.mdx
+++ b/src/content/posts/news/nasa-stardance.mdx
@@ -2,9 +2,8 @@
title: Stardance - a NASA x Hack Club Experience
date: 2026-04-06
author: "@eps"
-category: news
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
You may have noticed us dropping NASA-related hints lately. This is not a coincidence. This summer, Hack Club and NASA are joining forces to bring you something new: Stardance.
diff --git a/src/content/posts/new-hq.mdx b/src/content/posts/news/new-hq.mdx
similarity index 99%
rename from src/content/posts/new-hq.mdx
rename to src/content/posts/news/new-hq.mdx
index ac8e79e..7c56bd3 100644
--- a/src/content/posts/new-hq.mdx
+++ b/src/content/posts/news/new-hq.mdx
@@ -2,7 +2,6 @@
title: Hack Club Moves to New HQ
date: 2026-04-09
author: "@zrl"
-category: news
---

diff --git a/src/content/posts/prometheus-distributed-care.mdx b/src/content/posts/news/prometheus-distributed-care.mdx
similarity index 96%
rename from src/content/posts/prometheus-distributed-care.mdx
rename to src/content/posts/news/prometheus-distributed-care.mdx
index 66f6d7a..dc266e1 100644
--- a/src/content/posts/prometheus-distributed-care.mdx
+++ b/src/content/posts/news/prometheus-distributed-care.mdx
@@ -2,10 +2,9 @@
title: Prometheus Brings Users More Powers to Improve Slack
date: '2026-03-09'
author: '@Rowan'
-category: news
---
-import SlackMention from "../../components/SlackMention.astro";
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackMention from "../../../components/SlackMention.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
Right now, most community channels on Slack are nobody's responsibility. The Fire Department holds them to a minimum standard, but there's no one to actually make them really good. Keen readers may notice that this is a great example of the [Tragedy of the Commons](https://en.wikipedia.org/wiki/Tragedy_of_the_commons), when everyone has access but no one has real ownership, and channels just become noise rather than meaningful discussion.
diff --git a/src/content/posts/set-your-own-manager.mdx b/src/content/posts/news/set-your-own-manager.mdx
similarity index 90%
rename from src/content/posts/set-your-own-manager.mdx
rename to src/content/posts/news/set-your-own-manager.mdx
index 2f338ff..032f85f 100644
--- a/src/content/posts/set-your-own-manager.mdx
+++ b/src/content/posts/news/set-your-own-manager.mdx
@@ -1,7 +1,6 @@
---
date: '2026-03-12 16:09:39'
author: "@eps"
-category: news
title: Slack Users Can Now Set Their Own Manager
---
If only you could do this in real life, too.
diff --git a/src/content/posts/slack-readme.mdx b/src/content/posts/news/slack-readme.mdx
similarity index 93%
rename from src/content/posts/slack-readme.mdx
rename to src/content/posts/news/slack-readme.mdx
index be0a553..1ed2f3b 100644
--- a/src/content/posts/slack-readme.mdx
+++ b/src/content/posts/news/slack-readme.mdx
@@ -2,9 +2,8 @@
title: New Slack Readme Helps New Users
date: '2026-03-10'
author: '@Eternal'
-category: news
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
Hack Club is a massive org. And yet, there are no guides for newcomers to read. They're plopped in the Slack and left to fend for themselves.
diff --git a/src/content/posts/slack-survey.mdx b/src/content/posts/news/slack-survey.mdx
similarity index 96%
rename from src/content/posts/slack-survey.mdx
rename to src/content/posts/news/slack-survey.mdx
index 29841da..65bb8ee 100644
--- a/src/content/posts/slack-survey.mdx
+++ b/src/content/posts/news/slack-survey.mdx
@@ -1,11 +1,10 @@
---
date: '2026-03-26 10:57:00'
author: "@eps"
-category: news
title: New Slack Census
excerpt: "Next week, the Slack will conduct the first survey for highly active users. The Census will run monthly, and feature a mix of recurring questions and one-off investigations. The Census is going to a random sample of the most active users to avoid survey fatigue in the future. This time, that means anyone who was active for at least 20 out of the past 30 days at time of sample. Subjects will receive a DM from @Hack Club Census. Prizes will be given."
---
-import SlackMention from "../../components/SlackMention.astro";
+import SlackMention from "../../../components/SlackMention.astro";
Next week, the Slack will conduct the first survey for highly active users. The Census will run monthly, and feature a mix of recurring questions and one-off investigations.
diff --git a/src/content/posts/transparency-debate.mdx b/src/content/posts/news/transparency-debate.mdx
similarity index 93%
rename from src/content/posts/transparency-debate.mdx
rename to src/content/posts/news/transparency-debate.mdx
index 6d8880f..df975c7 100644
--- a/src/content/posts/transparency-debate.mdx
+++ b/src/content/posts/news/transparency-debate.mdx
@@ -1,11 +1,10 @@
---
date: '2026-03-18 10:51:00'
author: "@eps"
-category: news
title: Debate to be Held on Moderation Transparency
---
-import SlackMention from "../../components/SlackMention.astro";
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackMention from "../../../components/SlackMention.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
There will be a debate on Sunday, March 22 at 10:15 AM EDT, in , on the subject of moderation transparency in the Slack.
diff --git a/src/content/posts/welcome-to-slacker-news.mdx b/src/content/posts/news/welcome-to-slacker-news.mdx
similarity index 96%
rename from src/content/posts/welcome-to-slacker-news.mdx
rename to src/content/posts/news/welcome-to-slacker-news.mdx
index 9ae21de..87c4c88 100644
--- a/src/content/posts/welcome-to-slacker-news.mdx
+++ b/src/content/posts/news/welcome-to-slacker-news.mdx
@@ -2,9 +2,8 @@
title: Welcome to Slacker News
date: '2026-03-01'
author: '@eps'
-category: news
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
I have a lot to say on the Slack, but it often feels like I’m standing in an office building, shouting at the top of my lungs in the vain hope that I’ll be heard a hundred rooms away. I’m not the only one.
diff --git a/src/content/posts/3-months-at-hack-club.mdx b/src/content/posts/opinion/3-months-at-hack-club.mdx
similarity index 97%
rename from src/content/posts/3-months-at-hack-club.mdx
rename to src/content/posts/opinion/3-months-at-hack-club.mdx
index 0446111..8923271 100644
--- a/src/content/posts/3-months-at-hack-club.mdx
+++ b/src/content/posts/opinion/3-months-at-hack-club.mdx
@@ -1,10 +1,9 @@
---
date: 2026-04-02
author: "@eps"
-category: opinion
title: Three Months at Hack Club
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
I joined Hack Club full time on January 5th. That’s long enough to look back and take stock.
diff --git a/src/content/posts/against-moderation-transparency.mdx b/src/content/posts/opinion/against-moderation-transparency.mdx
similarity index 99%
rename from src/content/posts/against-moderation-transparency.mdx
rename to src/content/posts/opinion/against-moderation-transparency.mdx
index 667d47d..66d5294 100644
--- a/src/content/posts/against-moderation-transparency.mdx
+++ b/src/content/posts/opinion/against-moderation-transparency.mdx
@@ -1,10 +1,9 @@
---
date: '2026-03-26 10:57:00'
author: "@eps"
-category: opinion
title: Against Moderation Transparency
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
Moderation transparency was introduced to me as a conflict between the Fire Department and everyone else. But I’ve finally realized that this is really a conflict between the community and itself. The FD is simply caught in the middle.
diff --git a/src/content/posts/better-goodbye.mdx b/src/content/posts/opinion/better-goodbye.mdx
similarity index 97%
rename from src/content/posts/better-goodbye.mdx
rename to src/content/posts/opinion/better-goodbye.mdx
index 4f94406..5656931 100644
--- a/src/content/posts/better-goodbye.mdx
+++ b/src/content/posts/opinion/better-goodbye.mdx
@@ -2,9 +2,8 @@
title: Hack Club Should do Better at Saying Goodbye
date: 2026-04-13
author: "@karthik"
-category: opinion
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
Last week, I posted in about how Hack Club recognises contributors when they leave. The response surprised me. The post got 74 upvotes and no downvotes (quite rare in ), which by any measure is a pretty strong signal that this resonates with people. You can read the full thread [here](https://hackclub.slack.com/archives/C0188CY57PZ/p1775278905544579).
diff --git a/src/content/posts/how-to-get-a-gap-year.mdx b/src/content/posts/opinion/how-to-get-a-gap-year.mdx
similarity index 97%
rename from src/content/posts/how-to-get-a-gap-year.mdx
rename to src/content/posts/opinion/how-to-get-a-gap-year.mdx
index 2341a25..6931104 100644
--- a/src/content/posts/how-to-get-a-gap-year.mdx
+++ b/src/content/posts/opinion/how-to-get-a-gap-year.mdx
@@ -2,9 +2,8 @@
title: How to Get a Gap Year at Hack Club
date: '2026-03-09'
author: '@eps'
-category: opinion
---
-import SlackMention from "../../components/SlackMention.astro";
+import SlackMention from "../../../components/SlackMention.astro";
Since the [gap year applications](https://manifesto.hackclub.com/) opened, several people have asked "How do I get one?". So I asked the gap years for their advice:
diff --git a/src/content/posts/prometheus-mole.mdx b/src/content/posts/opinion/prometheus-mole.mdx
similarity index 97%
rename from src/content/posts/prometheus-mole.mdx
rename to src/content/posts/opinion/prometheus-mole.mdx
index b824ad4..6f1d417 100644
--- a/src/content/posts/prometheus-mole.mdx
+++ b/src/content/posts/opinion/prometheus-mole.mdx
@@ -1,10 +1,9 @@
---
date: '2026-04-01 10:57:00'
author: "@Rowan"
-category: opinion
title: More Power to Prometheus
---
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
One of the complex challenges of any large community is the signal-to-noise ratio. As Hack Club has grown, so too has the complexity of maintaining a space that is productive, welcoming, and above all else, positive! Public channels are the town squares of our Slack, and like any town square, they require stewardship and delicate care. After months of careful deliberation, deep reflection on the nature of community, and several very long meetings, we are proud to announce a significant evolution in how we approach that stewardship: a global automod rollout for @Prometheus!
diff --git a/src/content/posts/tragedy-anticommons.mdx b/src/content/posts/opinion/tragedy-anticommons.mdx
similarity index 96%
rename from src/content/posts/tragedy-anticommons.mdx
rename to src/content/posts/opinion/tragedy-anticommons.mdx
index 5fbd13d..bdc8499 100644
--- a/src/content/posts/tragedy-anticommons.mdx
+++ b/src/content/posts/opinion/tragedy-anticommons.mdx
@@ -2,10 +2,9 @@
title: The Tragedy of the Anticommons on the Slack
date: '2026-03-30'
author: '@eps'
-category: opinion
---
-import SlackMention from "../../components/SlackMention.astro";
-import SlackChannel from "../../components/SlackChannel.astro";
+import SlackMention from "../../../components/SlackMention.astro";
+import SlackChannel from "../../../components/SlackChannel.astro";
I got Shrouded once. For privacy, I’ll keep the details vague. In short, I was discussing a Hack Club project, and my message got reported as advertising. I deleted my message and moved on, but it was surprising. I want to respect the intent of each channel. But…what is the intent of each channel? Who is doing the intending? And, if a channel needs to change, who gets to say so?
diff --git a/src/data/acknowledgements_frontpage.json b/src/data/acknowledgements.json
similarity index 54%
rename from src/data/acknowledgements_frontpage.json
rename to src/data/acknowledgements.json
index 57a5b40..98aff16 100644
--- a/src/data/acknowledgements_frontpage.json
+++ b/src/data/acknowledgements.json
@@ -1,9 +1,13 @@
[
+ { "name": "@Elliot-entity", "slackId": "U096KJYT1PU" },
+ { "name": "@karthik", "slackId": "U04K5EPMZM1" },
{ "name": "@sahil", "slackId": "U08PUHSMW4V" },
{ "name": "@mat", "slackId": "U07VA44DNBA" },
{ "name": "@neven", "slackId": "U071JHBEJ7R" },
{ "name": "@nora", "slackId": "U06QK6AG3RD" },
{ "name": "@eternal", "slackId": "U09H9PLB6E7" },
{ "name": "@rowan", "slackId": "U080A3QP42C" },
- { "name": "@indy", "slackId": "UDK5M9Y13" }
+ { "name": "@lfd", "slackId": "U07UBCSSQH3" },
+ { "name": "@indy", "slackId": "UDK5M9Y13" },
+ { "name": "@zrl", "slackId": "U09UE480JHH" }
]
diff --git a/src/data/frontpage.json b/src/data/frontpage.json
index 7473324..0c0726e 100644
--- a/src/data/frontpage.json
+++ b/src/data/frontpage.json
@@ -1,4 +1,4 @@
{
- "headline": ["new-hq"],
- "opinion": ["better-goodbye", "3-months-at-hack-club", "tragedy-anticommons"]
+ "headline": ["news/new-hq"],
+ "opinion": ["opinion/better-goodbye", "opinion/3-months-at-hack-club", "opinion/tragedy-anticommons"]
}
diff --git a/src/data/site.json b/src/data/site.json
index 983c2b4..b950408 100644
--- a/src/data/site.json
+++ b/src/data/site.json
@@ -1,4 +1,4 @@
{
"title": "Slacker News",
- "description": "Official news from Hack Club Slack."
+ "description": "Official news from the Hack Club Slack."
}
diff --git a/src/lib/content.ts b/src/lib/content.ts
index 74cf4d1..d96b08b 100644
--- a/src/lib/content.ts
+++ b/src/lib/content.ts
@@ -2,7 +2,7 @@ import { getCollection, getEntry, type CollectionEntry } from "astro:content";
import siteData from "../data/site.json";
import frontpageData from "../data/frontpage.json";
import changelogData from "../data/changelog.json";
-import acknowledgementsData from "../data/acknowledgements_frontpage.json";
+import acknowledgementsData from "../data/acknowledgements.json";
export type SiteConfig = {
title: string;
@@ -106,13 +106,14 @@ export async function getPosts(): Promise {
.sort((a, b) => b.data.date.getTime() - a.data.date.getTime())
.map((entry) => {
const paragraphs = extractBlocks(entry.body);
+ const [category] = entry.slug.split("/", 1);
return {
slug: entry.slug,
url: `/${entry.slug}/`,
title: entry.data.title,
author: entry.data.author,
- category: entry.data.category,
+ category,
date: entry.data.date,
excerpt: toExcerpt(entry),
paragraphs,
diff --git a/src/pages/[slug].astro b/src/pages/[...slug].astro
similarity index 100%
rename from src/pages/[slug].astro
rename to src/pages/[...slug].astro
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 1364fd1..a619762 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -3,9 +3,9 @@ import BaseLayout from "../layouts/BaseLayout.astro";
import SlackMention from "../components/SlackMention.astro";
import {
getAcknowledgements,
+ getChangelogEntries,
getFrontpageData,
getPosts,
- getRecentChangelogEntries,
getSiteConfig,
truncateWords
} from "../lib/content";
@@ -39,7 +39,7 @@ const displayNews = allNews.filter((post) => post.slug !== headlineSlug).slice(0
const allEssays = posts.filter((post) => post.category === "essays");
const displayEssays = allEssays.slice(0, 4);
-const recentChangelog = await getRecentChangelogEntries(30);
+const recentChangelog = (await getChangelogEntries()).slice(0, 3);
const acknowledgements = await getAcknowledgements();
---