feat(astro): scaffold static Astro site for migration#82
Merged
Conversation
Provide bun in the dev shell so the upcoming Astro app (which uses bun for installs and `bun run` scripts) works inside the standard devshell without ad-hoc PATH munging. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop a fully-static Astro 6 + Cloudflare Workers app under `astro/`,
in parallel to the existing Next.js site, as phase 1 of the migration
plan. Posts now live as MDX files in a content collection rather than
the Turso DB; the existing Next.js site stays online and writable
until the Astro deploy reaches parity, at which point DNS swaps.
Public routes ported: /, /about, /posts, /posts/{[slug],food,tech,
travel}, /projects + 4 sub-pages, /resume, /rss.xml, /sitemap-index.xml.
Resume jobs become a second content collection sourced from the
existing public/jobs markdown.
Tailwind v4 via @tailwindcss/vite for parity with the Next.js styling.
Umami analytics ported into BaseHead; Google Analytics and PostHog
deferred. OG/Twitter metadata, manifest, favicon set, R2 image URLs
preserved verbatim (no asset migration this phase).
A single placeholder MDX keeps the `blog` collection non-empty so the
build is warning-clean before `npm run sync-posts -- -d astro/src/
content/blog` is run to populate real posts. Out of scope: dashboard,
journal, auth, R2 uploads, posts CRUD — all stay on Next.js.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ❌ Deployment failed View logs |
ncrmro-website | e13f8bf | May 16 2026, 01:25 PM |
There was a problem hiding this comment.
Pull request overview
Scaffolds a new fully-static Astro app (built with Bun, deployed via Cloudflare Workers) under astro/ to run in parallel with the existing Next.js site as the first phase of the migration.
Changes:
- Added Bun to the Nix devshell for local development.
- Introduced a new Astro project with Cloudflare Wrangler config, Tailwind styling, layouts/components, and content collections for blog + resume.
- Added initial migrated content/assets (jobs, posts, images) plus repo ignore/LFS adjustments.
Reviewed changes
Copilot reviewed 140 out of 150 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| flake.nix | Adds bun to the devshell toolchain. |
| astro/wrangler.jsonc | Cloudflare Workers deployment config for the Astro build. |
| astro/tsconfig.json | Astro TS config (currently references generated worker types). |
| astro/src/styles/global.css | Global Tailwind import + base font family. |
| astro/src/pages/rss.xml.js | RSS feed endpoint backed by the blog content collection. |
| astro/src/pages/resume.astro | Resume page rendering jobs collection entries. |
| astro/src/pages/projects/meze.astro | Project detail page. |
| astro/src/pages/projects/latinum.astro | Project detail page. |
| astro/src/pages/projects/keystone.astro | Project detail page. |
| astro/src/pages/projects/index.astro | Projects index page. |
| astro/src/pages/projects/catalyst.astro | Project detail page. |
| astro/src/pages/posts/travel.astro | Category page for travel posts. |
| astro/src/pages/posts/tech.astro | Category page for tech posts. |
| astro/src/pages/posts/index.astro | Posts index page. |
| astro/src/pages/posts/food.astro | Category page for food posts. |
| astro/src/pages/posts/[slug].astro | Blog post route using static paths + content rendering. |
| astro/src/pages/index.astro | Home page listing posts. |
| astro/src/pages/about.astro | About page route. |
| astro/src/layouts/ProjectLayout.astro | Shared layout for project subpages. |
| astro/src/layouts/BlogPost.astro | Starter blog layout (currently appears unused). |
| astro/src/layouts/BaseLayout.astro | Base layout wiring head metadata + navbar + slot. |
| astro/src/env.d.ts | Cloudflare runtime locals typing (currently missing Env). |
| astro/src/data/techUrls.ts | Map of tech badge labels to reference URLs. |
| astro/src/data/projects.ts | Projects metadata used by the projects index. |
| astro/src/content/jobs/2020_08_01_Merck.md | Resume job content entry. |
| astro/src/content/jobs/2019_12_01_Embold-Health.md | Resume job content entry. |
| astro/src/content/jobs/2019_01_01_Travis.md | Resume job content entry. |
| astro/src/content/jobs/2018_08_01_Shell.md | Resume job content entry. |
| astro/src/content/jobs/2018_02_01_Poetic.md | Resume job content entry. |
| astro/src/content/jobs/2017_11_01_Pycon-India.md | Resume job content entry. |
| astro/src/content/jobs/2017_05_01_Pathlight.md | Resume job content entry. |
| astro/src/content/blog/placeholder.mdx | Placeholder blog post to keep the collection non-empty. |
| astro/src/content.config.ts | Content collections + Zod schemas for blog/jobs. |
| astro/src/consts.ts | Site constants (title/description/url). |
| astro/src/components/SmallBadge.astro | Badge component for tech tags. |
| astro/src/components/PostListItem.astro | Post list item component for post indexes. |
| astro/src/components/Navbar.astro | Primary site navbar + social links. |
| astro/src/components/JobItem.astro | Resume job renderer (markdown + tech badges). |
| astro/src/components/Icons/Twitter.astro | Twitter icon component. |
| astro/src/components/Icons/Linkedin.astro | LinkedIn icon component. |
| astro/src/components/Icons/Instagram.astro | Instagram icon component. |
| astro/src/components/Icons/Github.astro | GitHub icon component. |
| astro/src/components/HeaderLink.astro | Starter header link component (active state). |
| astro/src/components/Header.astro | Starter header/navigation (currently appears unused). |
| astro/src/components/FormattedDate.astro | Date formatting component. |
| astro/src/components/Footer.astro | Starter footer (currently appears unused / placeholder). |
| astro/src/components/CategoryPosts.astro | Category post list component by tag. |
| astro/src/components/BaseHead.astro | Shared head metadata (OG/Twitter/manifest/fonts/Umami). |
| astro/src/assets/blog-placeholder-about.jpg | LFS placeholder image asset. |
| astro/src/assets/blog-placeholder-5.jpg | LFS placeholder image asset. |
| astro/src/assets/blog-placeholder-4.jpg | LFS placeholder image asset. |
| astro/src/assets/blog-placeholder-3.jpg | LFS placeholder image asset. |
| astro/src/assets/blog-placeholder-2.jpg | LFS placeholder image asset. |
| astro/src/assets/blog-placeholder-1.jpg | LFS placeholder image asset. |
| astro/README.md | Starter README for the Astro template. |
| astro/public/resume/pycon-india.jpg | Resume asset (LFS). |
| astro/public/resume/poetic.png | Resume asset (LFS). |
| astro/public/resume/pathlight.png | Resume asset (LFS). |
| astro/public/resume/embold.png | Resume asset (LFS). |
| astro/public/posts/2023_01_12_growing-out-of-tech.md | Imported post content (public/). |
| astro/public/posts/2022_12_21_choosing-the-best-multi-os-setup.md | Imported post content (public/). |
| astro/public/posts/2022_12_13_contemplating_dunning_krugger.md | Imported post content (public/). |
| astro/public/posts/2022_11_20_vo2-max-training-with-apple-watch/media/IMG_0524.jpeg | Post media (LFS). |
| astro/public/posts/2022_11_20_vo2-max-training-with-apple-watch/media/IMG_0523.jpeg | Post media (LFS). |
| astro/public/posts/2022_11_20_vo2-max-training-with-apple-watch/media/IMG_0522.jpeg | Post media (LFS). |
| astro/public/posts/2022_11_20_vo2-max-training-with-apple-watch/media/IMG_0521.jpeg | Post media (LFS). |
| astro/public/posts/2022_11_20_vo2-max-training-with-apple-watch/document.md | Imported post content (public/). |
| astro/public/posts/2022_08_10_backing-up-zfs-snapshots-remotly-without-root.md | Imported post content (public/). |
| astro/public/posts/2022_08_08_las-vegas-evo-2022.md | Imported post content (public/). |
| astro/public/posts/2022_07_27_quecent.md | Imported post content (public/). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0654.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0652.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0639.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0626.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0620.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0619.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0601.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0599.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0597.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0586.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/media/IMG_0579.jpeg | Post media (LFS). |
| astro/public/posts/2022_07_16_summertime-adventure-new-orleans/document.md | Imported post content (public/). |
| astro/public/posts/2022_06_01_kilimanjaro-1-two-weeks-before/document.md | Imported post content (public/). |
| astro/public/posts/2022_02_02_straight-forward-reusable-components/media/Screen Shot 2022-02-02 at 17.21.18.png | Post media (LFS). |
| astro/public/posts/2022_02_02_straight-forward-reusable-components/media/horizontal-rule-in-form.png | Post media (LFS). |
| astro/public/posts/2022_02_02_straight-forward-reusable-components/document.md | Imported post content (public/). |
| astro/public/posts/2021_03_24_scheduled-ci-e2e-test-failure-slack-notification/media/slack-notification-for-failed-e2e-tests.jpg | Post media (LFS). |
| astro/public/posts/2021_03_24_scheduled-ci-e2e-test-failure-slack-notification/document.md | Imported post content (public/). |
| astro/public/posts/2021_02_07_alpine-k3s.md | Imported post content (public/). |
| astro/public/posts/2021_02_06_docker_linux_workstation_development.md | Imported post content (public/). |
| astro/public/posts/2021_01_18_typescript_enum_form_stepper.md | Imported post content (public/). |
| astro/public/posts/2021_01_07_wireguard-based-vpn-intranets.md | Imported post content (public/). |
| astro/public/posts/2021_01_02_apollo-cache-overview/media/mutation_example.gif | Post media (LFS). |
| astro/public/posts/2021_01_02_apollo-cache-overview/document.md | Imported post content (public/). |
| astro/public/posts/2020_12_17_typescript-react-grid-areas.md | Imported post content (public/). |
| astro/public/posts/2020_12_04_rsync-code-directories.md | Imported post content (public/). |
| astro/public/posts/2020_08_23_scytale-automated-private-key-infrastructure.md | Imported post content (public/). |
| astro/public/posts/2020_08_14_multi-arch-docker-buildx-ci-cd.md | Imported post content (public/). |
| astro/public/posts/2020_07_22_gondola-ansible-playbook-for-emulating-raspberry-pi-os-with-kvm.md | Imported post content (public/). |
| astro/public/posts/2020_07_02_writing-a-gear-torque-calculator/media/gear_in_opencad.png | Post media (LFS). |
| astro/public/posts/2020_07_02_writing-a-gear-torque-calculator/document.md | Imported post content (public/). |
| astro/public/posts/2020_06_24_developing-on-remote-microcontroller.md | Imported post content (public/). |
| astro/public/posts/2020_06_16_driving-stepper-motors-with-microcontroller/media/working-motor.gif | Post media (LFS). |
| astro/public/posts/2020_06_16_driving-stepper-motors-with-microcontroller/media/nema-stepper-motors.jpg | Post media (LFS). |
| astro/public/posts/2020_06_16_driving-stepper-motors-with-microcontroller/media/header_image.jpeg | Post media (LFS). |
| astro/public/posts/2020_06_16_driving-stepper-motors-with-microcontroller/media/drv8833.jpeg | Post media (LFS). |
| astro/public/posts/2020_06_16_driving-stepper-motors-with-microcontroller/document.md | Imported post content (public/). |
| astro/public/posts/2020_06_15_evaluating-rust.md | Imported post content (public/). |
| astro/public/posts/2019_04_15_how-homekit-led-to-learning-about-network-security.md | Imported post content (public/). |
| astro/public/posts/2019_04_09_macos-fast-user-switching.md | Imported post content (public/). |
| astro/public/posts/2019_03_10_new-site-stack.md | Imported post content (public/). |
| astro/public/posts/2019_03_07_hello-world-2019.md | Imported post content (public/). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0155.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0144.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0142.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0138.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0137.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0135.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/PyCon_India/IMG_0133.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/IMG_0127.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/IMG_0118.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/IMG_0117.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/media/IMG_0113.jpeg | Post media (LFS). |
| astro/public/posts/2017_11_01_india-1/document.md | Imported post content (public/). |
| astro/public/manifest.json | Web app manifest for icons/name/theme. |
| astro/public/hold/2022_11_16-docker-rootless-etherium-node.md | Held/draft content. |
| astro/public/hold/2022_08_02_typescript-workspaces.md | Held/draft content. |
| astro/public/favicon.svg | Site favicon (SVG). |
| astro/public/favicon.png | Site favicon (PNG, LFS). |
| astro/public/favicon-32x32.png | Favicon size variant (LFS). |
| astro/public/favicon-16x16.png | Favicon size variant (LFS). |
| astro/public/apple-touch-icon.png | Apple touch icon (LFS). |
| astro/public/android-chrome-512x512.png | PWA icon (LFS). |
| astro/public/android-chrome-192x192.png | PWA icon (LFS). |
| astro/public/about/avatar.jpg | About avatar asset (LFS). |
| astro/public/.assetsignore | Prevents Wrangler from uploading worker routing artifacts. |
| astro/package.json | Astro app dependencies/scripts (Bun usage). |
| astro/astro.config.mjs | Astro config: site URL, integrations, Tailwind, Cloudflare adapter, fonts. |
| astro/.vscode/launch.json | VS Code launch config for astro dev. |
| astro/.vscode/extensions.json | VS Code extension recommendations. |
| astro/.gitignore | Astro project ignores. |
| .gitignore | Root ignore updates for Astro artifacts. |
| .gitattributes | LFS extensions expanded for webp/avif. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+5
to
+9
| <footer> | ||
| © {today.getFullYear()} Your name here. All rights reserved. | ||
| <div class="social-links"> | ||
| <a href="https://m.webtoo.ls/@astro" target="_blank"> | ||
| <span class="sr-only">Follow Astro on Mastodon</span> |
Comment on lines
+7
to
+10
| start: 2020-08 | ||
| end: Present | ||
| tech: Node,Typescript,GraphQL,React,Next.JS,Kubernetes,Helm,Playwright,Gitlab,CI,Backstage | ||
| --- |
Comment on lines
+13
to
+16
| - Traveled for a month in India's states of | ||
| [Rajasthan](https://en.wikipedia.org/wiki/Rajasthan) and | ||
| [Uttar Pradesh](ttps://en.wikipedia.org/wiki/Uttar_Pradesh) | ||
| - Went to wedding in [Kashmir](https://en.wikipedia.org/wiki/Kashmir) |
Comment on lines
+12
to
+16
| "strictNullChecks": true, | ||
| "types": [ | ||
| "./worker-configuration.d.ts" | ||
| ] | ||
| } |
Comment on lines
+8
to
+12
|
|
||
| type Props = CollectionEntry<'blog'>['data']; | ||
|
|
||
| const { title, description, pubDate, updatedDate, heroImage } = Astro.props; | ||
| --- |
Comment on lines
+26
to
+30
| <a href="https://www.linkedin.com/in/ncrmro/" aria-label="Linkedin profile"> | ||
| <LinkedinIcon class="fill-current text-gray-300" /> | ||
| </a> | ||
| <a href="https://github.com/ncrmro" aria-label="Github profile" rel="me"> | ||
| <GithubIcon class="fill-current text-gray-300" /> |
Pulls the markdown bodies from the static-markdown-migration branch (originally Turso post rows) into Astro's blog content collection so the deployed Astro site has real posts instead of just the placeholder. - src/content/blog/<slug>.mdx — 52 files, frontmatter transformed: date -> publish_date, slug field dropped (filename is the id), featuredImage -> heroImage. - content.config.ts — schema gains `places` (3 travel posts) and loosens `heroImage` to a plain string filename. - public/posts/ — renamed 9 date-prefixed media dirs to slug-only to match the absolute paths used in markdown image references. Stale top-level <date>_<slug>.md dumps and per-dir document.md companions removed; the content collection is now the single source. - Drops src/content/blog/placeholder.mdx. `astro build` prerenders 37 published post pages plus tag/index/RSS. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Mirrors ncrmro/plant-caravan's three-file pattern, adapted for Astro: - bun (project lockfile) instead of pnpm - `astro build` + raw `wrangler deploy` / `wrangler versions upload`, no OpenNext wrapper - working directory `astro/`; path filter `astro/**` - worker name `ncrmro-website-astro` (per astro/wrangler.jsonc) Files: - .github/actions/astro-cloudflare-deploy/action.yml — composite action, handles both `mode: deploy` (production promote) and `mode: upload` (versioned preview). Extracts the preview URL from wrangler output with three fallback regexes (alias URL → versioned URL → generic workers.dev match) so a wrangler log-format change degrades to "no comment" rather than a hard failure. - .github/workflows/astro-deploy.yml — push-to-main → production. Uses `astro-production` environment so its secrets/vars stay separate from the existing Next.js `production` environment during cutover. - .github/workflows/astro-preview.yml — PRs from the same repo only (skipped for forks to avoid leaking the Cloudflare token). Derives a DNS-safe slug from the head branch, uploads a versioned preview, then upserts a single PR comment marked with an HTML sentinel so reruns don't pile up duplicate comments. Required repo configuration before first run: - Secret: CLOUDFLARE_API_TOKEN (Workers Scripts:Edit) - Variable: CLOUDFLARE_ACCOUNT_ID - Environment: astro-production (can be empty; just for protection rules) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Rename workflows + composite action to canonical names: deploy / preview / cloudflare-deploy. The astro site is the site — no disambiguator needed. - Switch concurrency groups to `production` and `preview-<n>`, and the deploy environment to `production`. - Add validate.yml: runs `astro build` on PRs touching `astro/**`. No secrets, so it runs on fork PRs too — a green/red signal that covers the full content-collection schema + MDX parser + adapter bundling without granting deploy access. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Merges the standalone deploy-cloudflare.yml (Turso migration only) into deploy.yml so production push triggers a single job that runs migrations and then promotes the Astro worker. Migrations stay around — even with the static-export plan, the schema work might come back. - Path filter adds drizzle/** and root package-lock.json so DB-only changes still fire the workflow. - Migration step runs from repo root with npm (root package); the composite action then handles bun + astro/ on its own. - Concurrency group `production` already prevents overlap with the preview workflow. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The [slug].astro template already had `prose prose-invert max-w-none` classes but the typography plugin wasn't installed, so the classes were no-ops and post bodies rendered without heading hierarchy, list spacing, or code block styling. - Add @tailwindcss/typography devDependency. - Wire it via `@plugin "@tailwindcss/typography"` in src/styles/global.css (Tailwind 4 uses CSS-side plugin registration, not the v3 JS config). - Change wrapper from `prose prose-invert` to `prose dark:prose-invert` so light mode renders normal prose and dark mode flips invert, matching the BaseLayout's `dark:bg-gray-900 dark:text-white` scheme. - Drop the redundant `text-gray-500 dark:text-gray-400` from the wrapper; prose now owns body text color. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7 tasks
The Astro replacement (#82) is live and serving all 37 published posts. This drops the Next.js 15 + Drizzle/Turso + OpenNext stack and promotes `astro/` to the repo root so there's one obvious project. What's gone: - `src/` (Next.js App Router, components, models, auth, lib), `tests/` (Playwright), `bin/` (sync-posts CLI + helpers). - Framework configs: `next.config.js`, `open-next.config.ts`, `wrangler.jsonc` (root), `tsconfig.json` (root), `playwright.config.ts`, `playwright.fixtures.ts`, `.eslintrc.json`, `postcss.config.js`, `tailwind.config.js`, `next-env.d.ts`, `worker-configuration.d.ts` (root), `instrumentation-client.ts`. - Build artifacts in version control: root `package.json` + `package-lock.json`, `public/` (manifest, PWA, jobs, uploads). - Historical notes: `BLOG_SYNC.md`, `BUGFIX_SUMMARY.md`, `PREVIEW_TAB_FIX.md`, `TASKS.md`, `Makefile`, `.lighthouserc.js`, `.dockerignore`, `.env.example`. What's salvaged: - `src/database/schema*.ts` → `db/schema*.ts`. The runtime client (`src/database/index.ts`) is dropped — it switched dialects based on Next.js-runtime env vars and is trivial to rebuild. What's kept (DB scaffolding, intentionally inert): - `drizzle/` migrations, `drizzle.config.ts` (now pointing at `./db/schema.ts`), `bun run db:migrate` script, and the migration step in `Deploy`. No live client today; ready to wire up if schema work returns. What's flattened (~150 renames): - Everything that was under `astro/` is now at the repo root: `src/`, `public/`, `package.json`, `bun.lock`, `astro.config.mjs`, `tsconfig.json`, `wrangler.jsonc`, `README.md`, `.vscode/`. CI/meta updates: - All workflows + the composite action drop the `astro/` working-dir and `hashFiles('astro/...')` cache keys. - `deploy.yml` now runs migrations + deploy using bun (was npm+drizzle via the deleted root package). Path filter widened to the new flat layout. - `flake.nix` drops `sqld`, `concurrently`, `pnpm`; keeps `bun`, `nodejs_22`, `playwright-driver.browsers`, `claude-code`. - README.md and CLAUDE.md rewritten for the Astro project. - `.gitignore` slimmed to Astro/Cloudflare patterns. Verified locally: - `bun install` clean. - `bun run astro build` prerenders 37 posts + tag/index/RSS. - `bunx wrangler deploy --dry-run` succeeds. - `bunx drizzle-kit generate --help` loads `drizzle.config.ts`. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Phase 1 of the Next.js → Bun + Astro + Cloudflare Workers migration: a fully-static Astro 6 app under
astro/, deployed in parallel to the existing Next.js site at a staging subdomain./,/about,/posts,/posts/{[slug],food,tech,travel},/projects+ 4 sub-pages,/resume,/rss.xml,/sitemap-index.xml.astro/src/content/blog/(content collection). Resume jobs likewise via a second collection sourced frompublic/jobs/*.md.@tailwindcss/vite. Umami analytics ported intoBaseHead; OG/Twitter metadata, manifest, favicon set, R2 image URLs preserved verbatim.bunadded toflake.nix..gitattributesextended withwebp/aviffor new image authoring workflow.A single placeholder MDX keeps the blog collection non-empty so the build is warning-clean. The intended migration step (separate, by hand) is
npm run sync-posts -- -d astro/src/content/blogfollowed by.md→.mdxrename, then delete the placeholder.Out of scope for phase 1 (stays on Next.js until phase 2): dashboard, journal, auth, R2 upload API, posts CRUD UI, sync API endpoints, PWA service worker. DNS cutover to root domain is a separate later change.
Plan file:
~/.claude/plans/recursive-toasting-puddle.md.Test plan
cd astro && bun install && bun run buildproduces clean output (verified locally).bun run devrenders all routes; navbar links, RSS feed, sitemap are correct.bun run deploylands atncrmro-website-astro.workers.dev; smoke test each public URL returns 200.sync-postsdump, audit posts for stray component refs:rg '<[A-Z][a-zA-Z]+' astro/src/content/blog/.astro.ncrmro.comcustom domain in Cloudflare dashboard; verify TLS + cache.🤖 Generated with Claude Code