feat: payload cms and monorepo#54
Conversation
There was a problem hiding this comment.
Pull request overview
This PR restructures Slacker News into a Turborepo monorepo with two main apps: a Payload CMS (Next.js) “newsroom” backend and an Astro-based “web” frontend that consumes CMS content headlessly, alongside new Docker/CI plumbing.
Changes:
- Introduce Turborepo workspaces and move the Astro site into
apps/web. - Add a new
apps/cmsPayload CMS (Next.js) app with auth, admin UI customizations, and testing scaffolding. - Add Docker Compose + CI Postgres service wiring to support CMS builds and local orchestration.
Reviewed changes
Copilot reviewed 217 out of 296 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| turbo.json | Adds Turbo task pipeline for monorepo builds/dev/lint/check. |
| README.md | Documents a Docker Compose command for rebuilding/rerunning the CMS service. |
| package.json | Converts repo to Bun + workspaces and delegates scripts to Turbo. |
| Dockerfile | Removes the legacy root Dockerfile (now app-specific Dockerfiles exist). |
| docker-compose.yml | Adds local orchestration for Postgres + CMS + web + cloudflared. |
| .dockerignore | Adds monorepo-focused Docker build ignore rules. |
| .gitignore | Expands ignores for Payload media, Playwright artifacts, and Next.js types. |
| .github/workflows/build.yml | Adds Postgres service + CMS env vars for CI build step. |
| packages/types/package.json | Introduces a private internal @slacker-news/types workspace package. |
| packages/types/src/index.ts | Placeholder for shared types entrypoint. |
| packages/payload-client/package.json | Introduces a private internal @slacker-news/payload-client workspace package. |
| packages/payload-client/src/index.ts | Placeholder for shared client entrypoint. |
| apps/web/package.json | Defines the Astro web app dependencies/scripts in its own workspace. |
| apps/web/tsconfig.json | Adds strict Astro TS config for the web app. |
| apps/web/Dockerfile | Adds container build/runtime for the Astro server output. |
| apps/web/astro.config.mjs | Switches Astro to server output with Node adapter + keeps redirects. |
| apps/web/public/robots.txt | Adds robots rules (currently blocks all crawling). |
| apps/web/src/lib/cms.ts | Adds a CMS fetch client for posts used by the Astro frontend. |
| apps/web/src/lib/content.ts | Adds CMS→Astro content processing (excerpt/reading time/relations, etc.). |
| apps/web/src/lib/abacus.ts | Adds Abacus view-counter URL/key helpers. |
| apps/web/src/layouts/PageLayout.astro | Adds a reusable page layout wrapper around BaseLayout. |
| apps/web/src/pages/404.astro | Adds a basic 404 page using BaseLayout. |
| apps/web/src/pages/about.astro | Adds an about page that renders MDX from the pages collection. |
| apps/web/src/pages/submissions.astro | Adds submission guidelines page rendering MDX content. |
| apps/web/src/pages/news.astro | Adds a “News” archive page filtered by category. |
| apps/web/src/pages/opinion.astro | Adds an “Opinion” archive page filtered by category. |
| apps/web/src/pages/essays.astro | Adds an “Essays” archive page filtered by category. |
| apps/web/src/pages/changelogs.astro | Adds a changelog archive page supporting short + long entries. |
| apps/web/src/pages/changelogs/[slug].astro | Adjusts long changelog routing behavior (redirect on missing slug). |
| apps/web/src/pages/acknowledgements.astro | Adds acknowledgements page rendering JSON acknowledgements list. |
| apps/web/src/pages/feed.xml.js | Adds RSS feed generation (posts + long changelogs). |
| apps/web/src/data/site.json | Adds site metadata JSON used by the web app. |
| apps/web/src/data/changelog.json | Adds short changelog entries JSON. |
| apps/web/src/data/acknowledgements.json | Adds acknowledgements JSON with optional Slack IDs. |
| apps/web/src/data/legacy-redirects.mjs | Adds legacy path mapping for redirects + RSS link resolution. |
| apps/web/src/components/SlackMention.astro | Adds Slack user mention link component. |
| apps/web/src/components/SlackChannel.astro | Adds Slack channel link component. |
| apps/web/src/components/HorizontalRule.astro | Adds styled horizontal rule component. |
| apps/web/src/components/AuthorList.astro | Adds author list rendering with optional Slack IDs. |
| apps/web/src/components/AbacusCounter.astro | Adds client-side Abacus counter “hit” behavior. |
| apps/web/src/content.config.ts | Updates Astro content collections (removes posts collection definition). |
| apps/web/src/content/pages/about.mdx | Adds MDX content entry for About. |
| apps/web/src/content/pages/submissions.mdx | Adds MDX content entry for Submissions. |
| apps/web/src/content/posts/opinion/what-is-meta-for.mdx | Adds opinion post content. |
| apps/web/src/content/posts/opinion/prometheus-mole.mdx | Adds opinion post content. |
| apps/web/src/content/posts/opinion/better-goodbye.mdx | Adds opinion post content. |
| apps/web/src/content/posts/news/welcome-to-slacker-news.mdx | Adds news post content. |
| apps/web/src/content/posts/news/transparency-debate.mdx | Adds news post content. |
| apps/web/src/content/posts/news/slack-survey.mdx | Adds news post content. |
| apps/web/src/content/posts/news/slack-readme.mdx | Adds news post content. |
| apps/web/src/content/posts/news/set-your-own-manager.mdx | Adds news post content. |
| apps/web/src/content/posts/news/red-teams.mdx | Adds news post content. |
| apps/web/src/content/posts/news/new-ysws-channel.mdx | Adds news post content. |
| apps/web/src/content/posts/news/nasa-stardance.mdx | Adds news post content. |
| apps/web/src/content/posts/news/confessions-new-owners.mdx | Adds news post content. |
| apps/web/src/content/posts/news/community-privacy-policy.mdx | Adds news post content. |
| apps/web/src/content/posts/changelogs/responses-and-followups.mdx | Adds long changelog MDX entry. |
| apps/web/_posts/post template.md | Adds a post frontmatter template file. |
| apps/cms/package.json | Adds Payload CMS app package (Next.js + Payload dependencies). |
| apps/cms/Dockerfile | Adds multi-stage container build for the CMS app. |
| apps/cms/tsconfig.json | Adds strict TS config and path aliases for CMS. |
| apps/cms/next.config.ts | Adds Next.js config for monorepo + Payload integration. |
| apps/cms/next-sitemap.config.cjs | Adds sitemap/robots generation config for CMS frontend. |
| apps/cms/redirects.ts | Adds Next.js redirects (IE incompatibility redirect). |
| apps/cms/playwright.config.ts | Adds Playwright config for CMS e2e tests. |
| apps/cms/vitest.config.mts | Adds Vitest config for integration tests. |
| apps/cms/vitest.setup.ts | Adds Vitest setup (dotenv). |
| apps/cms/tests/int/api.int.spec.ts | Adds an integration test scaffold for Payload API. |
| apps/cms/tests/helpers/login.ts | Adds Playwright login helper for admin auth. |
| apps/cms/tests/helpers/seedUser.ts | Adds helper to seed/cleanup a test user. |
| apps/cms/tests/e2e/admin.e2e.spec.ts | Adds admin-panel e2e navigation coverage. |
| apps/cms/tests/e2e/frontend.e2e.spec.ts | Adds a basic frontend page-load e2e test. |
| apps/cms/eslint.config.mjs | Adds ESLint flat config for CMS. |
| apps/cms/postcss.config.js | Adds PostCSS config (Tailwind 4 plugin). |
| apps/cms/tailwind.config.mjs | Adds Tailwind config with typography customizations. |
| apps/cms/components.json | Adds shadcn/ui config for CMS components. |
| apps/cms/.env.example | Adds CMS env template (DB, secrets, OIDC, preview, etc.). |
| apps/cms/.gitignore | Adds CMS-specific ignores (media, Next build, Playwright, etc.). |
| apps/cms/.npmrc | Adds pnpm-related npm config for CMS workspace. |
| apps/cms/.prettierrc.json | Adds Prettier config for CMS workspace. |
| apps/cms/.prettierignore | Adds Prettier ignore rules for generated/build artifacts. |
| apps/cms/.editorconfig | Adds EditorConfig settings for CMS workspace. |
| apps/cms/.vscode/settings.json | Adds workspace editor settings (format/lint on save). |
| apps/cms/.vscode/launch.json | Adds Next.js debugging launch configuration. |
| apps/cms/.vscode/extensions.json | Recommends ESLint + Prettier extensions. |
| apps/cms/src/providers/Theme/index.tsx | Adds theme context/provider (currently broken provider usage). |
| apps/cms/src/providers/HeaderTheme/index.tsx | Adds header-theme context/provider (currently broken provider usage). |
| apps/cms/src/providers/index.tsx | Adds shared Providers wrapper for CMS frontend. |
| apps/cms/src/providers/Theme/shared.ts | Adds theme shared constants and implicit preference detection. |
| apps/cms/src/providers/Theme/types.ts | Adds theme types + runtime validator. |
| apps/cms/src/providers/Theme/ThemeSelector/index.tsx | Adds theme selector UI for CMS frontend. |
| apps/cms/src/providers/Theme/ThemeSelector/types.ts | Adds theme selector constants/types. |
| apps/cms/src/providers/Theme/InitTheme/index.tsx | Adds inline script to initialize theme before hydration. |
| apps/cms/src/utilities/deepMerge.ts | Adds deep merge utility (currently null-handling bug). |
| apps/cms/src/utilities/ui.ts | Adds shadcn cn() helper (clsx + tailwind-merge). |
| apps/cms/src/utilities/useDebounce.ts | Adds debounce hook used by search UI. |
| apps/cms/src/heros/HighImpact/index.tsx | Adds “high impact” hero component (effect dependency issue). |
| apps/cms/src/heros/MediumImpact/index.tsx | Adds “medium impact” hero component. |
| apps/cms/src/heros/LowImpact/index.tsx | Adds “low impact” hero component. |
| apps/cms/src/heros/RenderHero.tsx | Adds hero renderer dispatching by hero type. |
| apps/cms/src/heros/config.ts | Adds Payload field config for hero selection/content. |
| apps/cms/src/Header/config.ts | Adds Payload global config for header nav. |
| apps/cms/src/Header/Component.tsx | Adds header server component fetching cached global. |
| apps/cms/src/Header/Component.client.tsx | Adds header client component (theme + navigation). |
| apps/cms/src/Header/Nav/index.tsx | Adds header nav rendering + search link. |
| apps/cms/src/Header/RowLabel.tsx | Adds custom row label for header nav array items. |
| apps/cms/src/Header/hooks/revalidateHeader.ts | Adds revalidation hook for header global changes. |
| apps/cms/src/Footer/config.ts | Adds Payload global config for footer nav. |
| apps/cms/src/Footer/Component.tsx | Adds footer server component fetching cached global. |
| apps/cms/src/Footer/RowLabel.tsx | Adds custom row label for footer nav array items. |
| apps/cms/src/Footer/hooks/revalidateFooter.ts | Adds revalidation hook for footer global changes. |
| apps/cms/src/hooks/revalidateRedirects.ts | Adds revalidation hook for redirects changes. |
| apps/cms/src/hooks/populatePublishedAt.ts | Adds hook to populate publishedAt if missing. |
| apps/cms/src/search/Component.tsx | Adds client-side search input that pushes query to router. |
| apps/cms/src/search/fieldOverrides.ts | Adds plugin-search field overrides for searchable docs. |
| apps/cms/src/search/beforeSync.ts | Adds beforeSync hook to populate search docs (categories/meta). |
| apps/cms/src/collections/Users/index.ts | Adds Users collection with approval gating + OIDC fields. |
| apps/cms/src/collections/Users/hooks/approveFirstUser.ts | Adds hook to auto-approve the first created user. |
| apps/cms/src/collections/Posts/hooks/revalidatePost.ts | Adds ISR revalidation for posts on change/delete. |
| apps/cms/src/collections/Posts/hooks/populateAuthors.ts | Adds authors population hook to protect user privacy. |
| apps/cms/src/collections/Pages/hooks/revalidatePage.ts | Adds ISR revalidation for pages on change/delete. |
| apps/cms/src/collections/Media.ts | Adds Media collection and upload/image sizing settings. |
| apps/cms/src/collections/Categories.ts | Adds Categories collection with slug field. |
| apps/cms/src/components/ui/button.tsx | Adds shadcn button component. |
| apps/cms/src/components/ui/card.tsx | Adds shadcn card component. |
| apps/cms/src/components/ui/checkbox.tsx | Adds shadcn checkbox component. |
| apps/cms/src/components/ui/input.tsx | Adds shadcn input component. |
| apps/cms/src/components/ui/label.tsx | Adds shadcn label component. |
| apps/cms/src/components/ui/textarea.tsx | Adds shadcn textarea component. |
| apps/cms/src/components/AdminBar/index.tsx | Adds Payload admin bar integration for preview/edit links. |
| apps/cms/src/components/AdminBar/index.scss | Adds responsive CSS for admin bar display. |
| apps/cms/src/components/BeforeLogin/index.tsx | Adds pre-login UI to enforce Hack Club OIDC-only login. |
| apps/cms/src/components/BeforeDashboard/index.tsx | Adds “before dashboard” onboarding + seeding UI. |
| apps/cms/src/components/BeforeDashboard/index.scss | Adds styles for dashboard onboarding component. |
| apps/cms/src/components/BeforeDashboard/SeedButton/index.tsx | Adds DB seeding button with toast feedback. |
| apps/cms/src/components/BeforeDashboard/SeedButton/index.scss | Adds styles for seed button. |
| apps/cms/src/components/CmsLogo.tsx | Adds CMS logo component. |
| apps/cms/src/components/CmsIcon.tsx | Adds CMS icon component. |
| apps/cms/src/components/CollectionArchive/index.tsx | Adds archive grid rendering using Card component. |
| apps/cms/src/components/LivePreviewListener/index.tsx | Adds Payload live preview listener wiring. |
| apps/cms/src/components/Link/index.tsx | Adds CMSLink component (buttons/inline + refs/custom URLs). |
| apps/cms/src/components/Media/index.tsx | Adds media rendering wrapper for image/video. |
| apps/cms/src/components/Media/types.ts | Adds media component props/types. |
| apps/cms/src/components/Media/VideoMedia/index.tsx | Adds video rendering for Payload media resources. |
| apps/cms/src/components/PageRange/index.tsx | Adds search/page-range display component. |
| apps/cms/src/components/PayloadRedirects/index.tsx | Adds server-side redirect handling using Payload redirects. |
| apps/cms/src/blocks/RenderBlocks.tsx | Adds renderer mapping Payload layout blocks to components. |
| apps/cms/src/blocks/ArchiveBlock/config.ts | Adds archive block schema for Payload pages. |
| apps/cms/src/blocks/ArchiveBlock/Component.tsx | Adds archive block server component fetching posts. |
| apps/cms/src/blocks/Banner/config.ts | Adds banner block schema. |
| apps/cms/src/blocks/Banner/Component.tsx | Adds banner block rendering component. |
| apps/cms/src/blocks/CallToAction/config.ts | Adds CTA block schema. |
| apps/cms/src/blocks/CallToAction/Component.tsx | Adds CTA block rendering component. |
| apps/cms/src/blocks/Code/config.ts | Adds code block schema. |
| apps/cms/src/blocks/Code/Component.tsx | Adds code block server wrapper. |
| apps/cms/src/blocks/Code/Component.client.tsx | Adds code block client renderer (Prism) + copy button. |
| apps/cms/src/blocks/Code/CopyButton.tsx | Adds copy-to-clipboard UI for code blocks. |
| apps/cms/src/blocks/Content/config.ts | Adds content block schema (columns + rich text + link). |
| apps/cms/src/blocks/Content/Component.tsx | Adds content block rendering component. |
| apps/cms/src/blocks/Form/config.ts | Adds form block schema (form builder integration). |
| apps/cms/src/blocks/Form/fields.tsx | Adds field component registry for form rendering. |
| apps/cms/src/blocks/Form/Error/index.tsx | Adds RHF error display component. |
| apps/cms/src/blocks/Form/Width/index.tsx | Adds layout wrapper for form field widths. |
| apps/cms/src/blocks/Form/Text/index.tsx | Adds text field renderer. |
| apps/cms/src/blocks/Form/Textarea/index.tsx | Adds textarea field renderer. |
| apps/cms/src/blocks/Form/Email/index.tsx | Adds email field renderer. |
| apps/cms/src/blocks/Form/Number/index.tsx | Adds number field renderer. |
| apps/cms/src/blocks/Form/Select/index.tsx | Adds select field renderer. |
| apps/cms/src/blocks/Form/State/index.tsx | Adds US state selector field renderer. |
| apps/cms/src/blocks/Form/Country/index.tsx | Adds country selector field renderer. |
| apps/cms/src/blocks/Form/Checkbox/index.tsx | Adds checkbox field renderer. |
| apps/cms/src/blocks/Form/Message/index.tsx | Adds message-only rich text renderer. |
| apps/cms/src/blocks/MediaBlock/config.ts | Adds media block schema. |
| apps/cms/src/blocks/MediaBlock/Component.tsx | Adds media block rendering component. |
| apps/cms/src/blocks/RelatedPosts/Component.tsx | Adds related posts grid rendering block. |
| apps/cms/src/fields/defaultLexical.ts | Adds default lexical editor config for rich text fields. |
| apps/cms/src/fields/linkGroup.ts | Adds link group field generator using deepMerge utility. |
| apps/cms/src/endpoints/seed/home-static.ts | Adds seed content for a non-empty homepage. |
| apps/cms/src/endpoints/seed/contact-page.ts | Adds seed content for a contact page + form block. |
| apps/cms/src/endpoints/seed/image-hero-1.ts | Adds seed media metadata object. |
| apps/cms/src/endpoints/seed/image-1.ts | Adds seed media metadata object. |
| apps/cms/src/endpoints/seed/image-2.ts | Adds seed media metadata object. |
| apps/cms/src/app/(payload)/layout.tsx | Adds generated Payload admin root layout wiring. |
| apps/cms/src/app/(payload)/api/[...slug]/route.ts | Adds generated Payload REST route handlers. |
| apps/cms/src/app/(payload)/api/graphql/route.ts | Adds generated GraphQL route handler. |
| apps/cms/src/app/(payload)/api/graphql-playground/route.ts | Adds generated GraphQL playground route handler. |
| apps/cms/src/app/(payload)/admin/[[...segments]]/page.tsx | Adds generated Payload admin page entrypoint. |
| apps/cms/src/app/(payload)/admin/[[...segments]]/not-found.tsx | Adds generated Payload admin not-found handler. |
| apps/cms/src/app/(payload)/admin/auth/hackclub/start/route.ts | Adds Hack Club OIDC auth start route (sets state/nonce cookies). |
| apps/cms/src/app/(frontend)/layout.tsx | Adds CMS “frontend” app layout (Header/Footer/AdminBar/Providers). |
| apps/cms/src/app/(frontend)/page.tsx | Adds frontend index route delegating to [slug] template. |
| apps/cms/src/app/(frontend)/not-found.tsx | Adds frontend not-found page. |
| apps/cms/src/app/(frontend)/search/page.tsx | Adds CMS search page backed by Payload search collection. |
| apps/cms/src/app/(frontend)/search/page.client.tsx | Adds client hook to set header theme for search page. |
| apps/cms/src/app/(frontend)/posts/page.tsx | Adds posts index page listing published posts with pagination. |
| apps/cms/src/app/(frontend)/posts/page.client.tsx | Adds client hook to set header theme for posts page. |
| apps/cms/src/app/(frontend)/posts/page/[pageNumber]/page.tsx | Adds paginated posts route with validation + pagination controls. |
| apps/cms/src/app/(frontend)/posts/page/[pageNumber]/page.client.tsx | Adds client hook to set header theme for paginated posts page. |
| apps/cms/src/app/(frontend)/posts/[slug]/page.client.tsx | Adds client hook to set header theme for post detail page. |
| apps/cms/src/app/(frontend)/next/seed/route.ts | Adds authenticated seed endpoint to populate database. |
| apps/cms/src/app/(frontend)/next/preview/route.ts | Adds preview endpoint enforcing PREVIEW_SECRET + auth. |
| apps/cms/src/app/(frontend)/next/exit-preview/route.ts | Adds endpoint to disable draft mode. |
| apps/cms/src/app/(frontend)/(sitemaps)/pages-sitemap.xml/route.ts | Adds server-side sitemap route for pages. |
| apps/cms/src/app/(frontend)/(sitemaps)/posts-sitemap.xml/route.ts | Adds server-side sitemap route for posts. |
| apps/cms/src/access/anyone.ts | Adds open read access helper. |
| apps/cms/src/access/authenticated.ts | Adds authenticated access helper. |
| apps/cms/src/access/authenticatedOrPublished.ts | Adds access helper for published-or-authenticated reads. |
| apps/cms/src/environment.d.ts | Adds env var typings for CMS runtime configuration. |
| apps/cms/scripts/seed-categories.mjs | Adds script to seed default categories in CMS DB. |
| apps/cms/test.env | Adds Node options for tests. |
| apps/cms/dev-entry.sh | Adds dev helper to auto-confirm schema push prompt. |
| apps/cms/src/utilities/getURL.ts | Adds server/client URL helpers. |
| apps/cms/src/utilities/getRedirects.ts | Adds redirect fetching + cached redirect accessor. |
| apps/cms/src/utilities/getGlobals.ts | Adds globals fetching + cached global accessor. |
| apps/cms/src/utilities/getDocument.ts | Adds document lookup + cached document accessor. |
| apps/cms/src/utilities/getMediaUrl.ts | Adds media URL normalization helper. |
| apps/cms/src/utilities/getMeUser.ts | Adds current-user fetch helper based on payload-token cookie. |
| apps/cms/src/utilities/generatePreviewPath.ts | Adds helper to generate preview URLs with secret param. |
| apps/cms/src/utilities/generateMeta.ts | Adds helper to build Next metadata from Payload docs. |
| apps/cms/src/utilities/mergeOpenGraph.ts | Adds helper to merge OpenGraph defaults with overrides. |
| apps/cms/src/utilities/formatDateTime.ts | Adds date formatting helper. |
| apps/cms/src/utilities/formatAuthors.ts | Adds helper to format authors array into human-readable string. |
| apps/cms/src/utilities/toKebabCase.ts | Adds kebab-case utility. |
| apps/cms/src/utilities/canUseDOM.ts | Adds DOM presence checker used by client/server utilities. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| setThemeState(themeToSet) | ||
| }, []) | ||
|
|
||
| return <HeaderThemeContext value={{ headerTheme, setHeaderTheme }}>{children}</HeaderThemeContext> |
| export function isObject(item: unknown): item is object { | ||
| return typeof item === 'object' && !Array.isArray(item) | ||
| } |
| typescript: { | ||
| ignoreBuildErrors: true, | ||
| }, |
| environment: | ||
| DATABASE_URL: postgres://sn_cms:sn_cms@postgres:5432/sn_cms | ||
| NEXT_PUBLIC_SERVER_URL: ${NEXT_PUBLIC_SERVER_URL:-https://newsroom.matmanna.dev} | ||
| PAYLOAD_SECRET: ${PAYLOAD_SECRET:-6995edc626d1895603aaa92c} |
| webServer: { | ||
| command: 'pnpm dev', | ||
| reuseExistingServer: true, | ||
| url: 'http://localhost:3000', | ||
| }, |
| let page: Page | ||
|
|
||
| test.beforeAll(async ({ browser }, testInfo) => { | ||
| const context = await browser.newContext() | ||
| page = await context.newPage() | ||
| }) |
| const { setTheme } = useTheme() | ||
| const [value, setValue] = useState('') | ||
|
|
||
| const onThemeChange = (themeToSet: Theme & 'auto') => { |
| useEffect(() => { | ||
| setHeaderTheme('dark') | ||
| }) |
…ds, reduce build memory
…start loop in CMD
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
…le-level side effects
summary
this pr adds a key distinction in the codebase between the content and the source code. in the next version of slacker-news, content will be published and controlled from a new admin panel - the newsroom(.hackclub.com). then, using payload's headless mode, the new-old astro frontend (news.hackclub.com) will not change its functionality much in the immediate.
demo
(hosted on nest and deployed using cloudflared)
roadmap