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 --- ![212 Battery St](https://cdn.hackclub.com/019d7486-19f0-7da7-a8fc-155b50463c6c/212_battery_st.png) 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(); ---