Skip to content

perf: make faster - #160

Merged
trueberryless merged 10 commits into
mainfrom
perf/make-fast
Jul 17, 2026
Merged

trueberryless merged 10 commits into
mainfrom
perf/make-fast

Conversation

@trueberryless

@trueberryless trueberryless commented Jul 13, 2026 •

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features
    • Added reusable “content unavailable” fallback UI.
    • Added loading skeleton components for blog, books, events, and landing sections (recent posts, reading summary, upcoming events, Bluesky).
  • Improvements
    • Prerendered key pages (home, blog, books, events, projects) with deferred content for faster initial loads.
    • Updated content loading to gracefully handle empty/error states and apply improved caching for long-lived vs degraded responses.
    • Refined navigation by simplifying breadcrumbs into a single back link.
  • Chores / Branding
    • Updated site URLs (branding, redirects, sitemap/robots, and social destinations) to the new domain.

@changeset-bot

changeset-bot Bot commented Jul 13, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 33eca6c

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@netlify

netlify Bot commented Jul 13, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for felixs-homepage ready!

Name Link
🔨 Latest commit 33eca6c
🔍 Latest deploy log https://app.netlify.com/projects/felixs-homepage/deploys/6a5a13a1284b73000838dc96
😎 Deploy Preview https://deploy-preview-160--felixs-homepage.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions github-actions Bot added 🚧 config Configuration file updates 📦 package Updates in package structure or package.json 🏯 styles Stylesheets or design updates labels Jul 13, 2026
@coderabbitai

coderabbitai Bot commented Jul 13, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The site changes its domain identity, centralizes external data fetching, moves content pages to prerendered shells with deferred rendering, adds loading and fallback states, and updates landing sections, layouts, caching, and debug data inspection.

Changes

Site data and rendering migration

Layer / File(s) Summary
Domain and runtime configuration
astro.config.mjs, package.json, public/*, src/components/utils/IntroBadge.astro
Updates the site domain, metadata, redirects, sitemap, profile links, and Astro toolchain versions.
Shared data aggregation
src/lib/cache.ts, src/lib/data.ts, src/lib/posts.ts
Adds shared cache profiles, typed GitHub/AT Protocol data fetchers, event and feed aggregation, book summaries, and post formatting/grouping helpers.
Deferred content and fallback components
src/components/blog/*, src/components/books/*, src/components/events/*, src/components/projects/*, src/components/utils/Fallback.astro
Adds deferred blog, book, event, and project content rendering with dedicated loading skeletons and unavailable-data fallbacks.
Landing widgets and loading states
src/components/landing/*, src/pages/index.astro, src/styles/global.css
Switches landing sections to centralized fetchers, explicit fallback content, dedicated skeletons, and hydration-state styling.
Prerendered pages and layouts
src/pages/{blog,books,events,projects,debug}.astro, src/layouts/*, src/components/utils/Breadcrumbs.astro
Converts content pages to prerendered shells with deferred regions, updates page layout and breadcrumbs, revises footer resize handling, and centralizes debug rendering.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Poem

I’m a rabbit with routes freshly drawn,
Hopping through caches from dusk until dawn.
Skeletons shimmer, fallbacks appear,
New data trails hop far and near.
Felix’s bright domain greets the year.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is too generic to convey the main change in this PR. Use a specific title that mentions the main change, such as the new prerendered pages and data-fetching/cache refactor.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch perf/make-fast

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/events/EventsContent.astro`:
- Around line 4-6: Import the shared Event type from `@/lib/data` in the Props
definition and change the events property from any[] to Event[]. Keep the
component aligned with the Event shape returned by fetchEvents().

In `@src/components/landing/ReadingSummary.astro`:
- Line 20: Update the LiveIndicator usage in ReadingSummary to pass
data-for="landing/reading-summary", matching the selector used by hydrate.ts.
Apply the same matching data-for values to the other landing widgets that render
LiveIndicator, using each widget’s expected hydration identifier.

In `@src/components/landing/RecentPosts.astro`:
- Around line 18-45: The landing widgets duplicate the hydrate-container and
fallback structure. Add a shared HydrateSection wrapper accepting the hydrate
name, state, rendered inner content, skeleton configuration, and fallback props,
then replace the duplicated markup in src/components/landing/RecentPosts.astro
lines 18-45 and src/components/landing/UpcomingEvents.astro lines 20-47 with it,
preserving each widget’s existing Section title, LiveIndicator, content
component, skeleton rows, and fallback copy/links.

In `@src/lib/data.ts`:
- Around line 172-188: Update the hasSignal check in fetchProjects so valid
contributedProjects are recognized by the presence of contribution data or other
populated project fields, rather than requiring stars > 0. Preserve the null
result only when both ownProjects and contributedProjects contain no meaningful
data, and return valid contribution entries unchanged.
- Around line 148-154: The external GitHub and event request paths currently use
unbounded Promise.all fan-out. Update fetchOrg(), fetchProjects(), and
fetchEvents() to process requests in bounded batches using the existing batching
approach from fetchBluesky(), while preserving their current results and error
handling.

In `@src/pages/api/blog.ts`:
- Around line 10-24: Extract the duplicated fetch-to-cached-Response flow into a
shared renderToHtml helper, preserving the 503 response for failed or empty data
and the existing HTML headers and longLivedCache behavior. Update
src/pages/api/blog.ts lines 10-24, src/pages/api/books.ts lines 9-22,
src/pages/api/events.ts lines 9-23, src/pages/api/landing/bluesky.ts lines 9-22,
and src/pages/api/landing/reading-summary.ts lines 9-23 to call renderToHtml
with each route’s component, fetch function, and props mapper; include
displayLimit in the Bluesky props and buildReadingSummary in the reading-summary
mapper.

In `@src/pages/blog.astro`:
- Around line 23-55: Extract the duplicated page-head, hydrate container,
data-content/data-fallback, and Fallback markup from src/pages/blog.astro lines
23-55 and src/pages/books.astro lines 18-44 into a shared wrapper component,
preserving each page’s content props and fallback configuration. Move the
hydrate bootstrap script from both pages into src/layouts/LayoutPage.astro so it
is included once, then remove the per-page script blocks and shared shell markup
from both pages.
- Around line 17-19: Update the fallback type in the posts destructuring ternary
to use the actual return type of groupPostsByYear for postsByYear instead of
Record<string, any[]>. Import or derive that return type from groupPostsByYear,
while preserving the existing empty years and postsByYear fallback values.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5382c9da-0cd8-4e7a-8e90-5e6c1b67a4f0

📥 Commits

Reviewing files that changed from the base of the PR and between 442df7a and ff77f17.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (56)
  • astro.config.mjs
  • package.json
  • public/_redirects
  • public/robots.txt
  • src/components/blog/BlogContent.astro
  • src/components/blog/BlogSkeleton.astro
  • src/components/blog/PostItem.astro
  • src/components/books/BooksContent.astro
  • src/components/books/BooksSkeleton.astro
  • src/components/events/EventsContent.astro
  • src/components/events/EventsSkeleton.astro
  • src/components/landing/ListSkeleton.astro
  • src/components/landing/ReadingSummary.astro
  • src/components/landing/ReadingSummaryInner.astro
  • src/components/landing/RecentBlueskyPosts.astro
  • src/components/landing/RecentBlueskyPostsInner.astro
  • src/components/landing/RecentPosts.astro
  • src/components/landing/RecentPostsInner.astro
  • src/components/landing/UpcomingEvents.astro
  • src/components/landing/UpcomingEventsInner.astro
  • src/components/projects/ProjectsContent.astro
  • src/components/utils/Fallback.astro
  • src/components/utils/IntroBadge.astro
  • src/components/utils/LiveIndicator.astro
  • src/components/utils/SectionSkeleton.astro
  • src/layouts/Breadcrumbs.astro
  • src/layouts/Footer.astro
  • src/layouts/LayoutPage.astro
  • src/lib/blog.ts
  • src/lib/bluesky.ts
  • src/lib/books.ts
  • src/lib/cache.ts
  • src/lib/data.ts
  • src/lib/events.ts
  • src/lib/fetch.ts
  • src/lib/github.ts
  • src/lib/posts.ts
  • src/live.config.ts
  • src/loaders/atproto.ts
  • src/loaders/enums.ts
  • src/pages/api/blog.ts
  • src/pages/api/books.ts
  • src/pages/api/events.ts
  • src/pages/api/landing/bluesky.ts
  • src/pages/api/landing/reading-summary.ts
  • src/pages/api/landing/recent-posts.ts
  • src/pages/api/landing/upcoming-events.ts
  • src/pages/api/projects.ts
  • src/pages/blog.astro
  • src/pages/books.astro
  • src/pages/debug.astro
  • src/pages/events.astro
  • src/pages/index.astro
  • src/pages/projects.astro
  • src/scripts/hydrate.ts
  • src/styles/global.css
💤 Files with no reviewable changes (12)
  • src/layouts/Breadcrumbs.astro
  • src/loaders/enums.ts
  • src/loaders/atproto.ts
  • src/lib/blog.ts
  • src/pages/api/projects.ts
  • src/live.config.ts
  • src/lib/bluesky.ts
  • src/lib/books.ts
  • src/lib/events.ts
  • src/lib/github.ts
  • src/components/utils/SectionSkeleton.astro
  • src/lib/fetch.ts

Comment thread src/components/events/EventsContent.astro Outdated
Comment thread src/components/landing/ReadingSummary.astro Outdated
Comment thread src/components/landing/RecentPosts.astro
Comment thread src/lib/data.ts Outdated
Comment thread src/lib/data.ts
Comment thread src/pages/api/blog.ts Outdated
Comment thread src/pages/blog.astro Outdated
Comment thread src/pages/blog.astro Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/layouts/Footer.astro (1)

93-102: 🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick win

Remove the scroll event listener for maxScroll.

Recalculating document.documentElement.scrollHeight - window.innerHeight on every scroll event is inefficient and can cause layout thrashing (scroll jank), especially if another script updates styles during the scroll.

The maxScroll value only changes when the viewport resizes or the document content changes. The resize event listener and the ResizeObserver already handle both of these cases efficiently.

⚡ Proposed fix
   const updateMaxScroll = () => {
     const maxScroll =
       document.documentElement.scrollHeight - window.innerHeight;
     document.documentElement.style.setProperty(
       "--max-scroll",
       `${maxScroll}px`
     );
   };
-  window.addEventListener("scroll", updateMaxScroll, { passive: true });
   window.addEventListener("resize", updateMaxScroll);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/layouts/Footer.astro` around lines 93 - 102, Remove the scroll event
listener registration for updateMaxScroll in the maxScroll setup, while
retaining the resize listener and existing ResizeObserver handling for updates.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/events/EventsContent.astro`:
- Around line 19-20: Update the upcoming-event processing near the upcoming and
past filters in EventsContent so upcoming events are ordered by ascending start
date, placing the nearest future event first. Preserve the existing past-event
filtering and ordering.

In `@src/components/landing/ReadingSummary.astro`:
- Around line 20-22: Update the date formatting in the latest summary’s
startedAt display to pass an explicit locale to toLocaleDateString(), ensuring
consistent server-rendered output across environments while preserving the
existing “Started: Unknown” fallback.

---

Outside diff comments:
In `@src/layouts/Footer.astro`:
- Around line 93-102: Remove the scroll event listener registration for
updateMaxScroll in the maxScroll setup, while retaining the resize listener and
existing ResizeObserver handling for updates.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 80a4dea8-edb5-47bb-88f9-836124d8b4d5

📥 Commits

Reviewing files that changed from the base of the PR and between ff77f17 and cdbb3db.

📒 Files selected for processing (21)
  • src/components/blog/BlogContent.astro
  • src/components/books/BooksContent.astro
  • src/components/events/EventsContent.astro
  • src/components/landing/ReadingSummary.astro
  • src/components/landing/ReadingSummarySkeleton.astro
  • src/components/landing/RecentBlueskyPosts.astro
  • src/components/landing/RecentBlueskyPostsSkeleton.astro
  • src/components/landing/RecentPosts.astro
  • src/components/landing/RecentPostsSkeleton.astro
  • src/components/landing/UpcomingEvents.astro
  • src/components/landing/UpcomingEventsSkeleton.astro
  • src/components/projects/ProjectsContent.astro
  • src/components/projects/ProjectsSkeleton.astro
  • src/components/utils/Breadcrumbs.astro
  • src/layouts/Footer.astro
  • src/lib/data.ts
  • src/pages/blog.astro
  • src/pages/books.astro
  • src/pages/events.astro
  • src/pages/index.astro
  • src/pages/projects.astro

Comment thread src/components/events/EventsContent.astro Outdated
Comment thread src/components/landing/ReadingSummary.astro

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/events/EventsContent.astro (1)

6-7: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not present an empty RSVP list as an outage.

fetchEvents() returns null both when fetching fails and when there are zero RSVPs (src/lib/data.ts). This branch therefore tells users their data is unreachable even when the account simply has no events. Distinguish empty data from errors, or use neutral empty-state copy here.

Also applies to: 43-47

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/events/EventsContent.astro` around lines 6 - 7, Update the
event-loading logic around fetchEvents and hasData so a valid empty RSVP result
is treated as an empty state rather than an outage. Distinguish fetch failures
from zero-event responses using the existing data contract, and ensure the
user-facing branch near the empty-state rendering uses neutral copy for no
events while reserving outage messaging for actual errors.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/components/events/EventsContent.astro`:
- Around line 6-7: Update the event-loading logic around fetchEvents and hasData
so a valid empty RSVP result is treated as an empty state rather than an outage.
Distinguish fetch failures from zero-event responses using the existing data
contract, and ensure the user-facing branch near the empty-state rendering uses
neutral copy for no events while reserving outage messaging for actual errors.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0a4b591c-5096-4fba-a2c8-a2ca52c78de9

📥 Commits

Reviewing files that changed from the base of the PR and between cdbb3db and fa81bf1.

📒 Files selected for processing (2)
  • src/components/events/EventsContent.astro
  • src/components/landing/ReadingSummary.astro

@trueberryless

trueberryless commented Jul 16, 2026 •

Copy link
Copy Markdown
Owner Author

@coderabbitai full review (uups, sorry for wrong ping)

@coderabbitai

coderabbitai Bot commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor

@trueberryless No worries! Kicking off the full review now.

✅ Action performed

Full review finished.


Your plan includes PR reviews subject to rate limits. More reviews will be available in 59 minutes.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor

@trueberryless No problem at all! The full review is already underway based on your earlier request — I'll post the results shortly.

✅ Action performed

Full review finished.


Your plan includes PR reviews subject to rate limits. More reviews will be available in 59 minutes.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/landing/RecentPosts.astro`:
- Around line 13-17: Update the date comparator in the RecentPosts sorting chain
to convert invalid or missing publishedAt values to a deterministic numeric
fallback instead of allowing NaN. Preserve descending chronological ordering for
valid dates and ensure the comparator always returns a number.

In `@src/layouts/Footer.astro`:
- Around line 101-104: Remove the scroll event listener that invokes
updateMaxScroll in the Footer layout initialization. Keep the resize listener,
ResizeObserver, and initial updateMaxScroll call so the CSS value is still
recalculated when layout dimensions change.

In `@src/lib/data.ts`:
- Around line 434-436: Update the date handling around startDate and endDate to
validate startsAt or createdAt and reject records without a valid start date
instead of using the current timestamp. After validating the start date, default
only a missing or invalid endsAt value to that validated start date.
- Around line 271-274: Update the rawPosts transformation before it returns
AugmentedPost values to validate each post’s publishedAt date. Exclude or
otherwise handle malformed dates according to the existing contract so invalid
values cannot reach groupPostsByYear() and produce a "NaN" year group; preserve
the current publication enrichment for valid posts.

In `@src/lib/posts.ts`:
- Around line 15-24: Update constructUrl to validate post.data.publication.url
before using it in href, allowing only HTTP or HTTPS schemes; return "#" for
missing or unsupported schemes, while preserving the existing path normalization
for valid publication URLs.

In `@src/pages/blog.astro`:
- Around line 21-33: Move the shared .page-head and nested h1 styles into
src/styles/global.css or LayoutPage.astro, then remove the duplicated blocks
from src/pages/blog.astro lines 21-33 and src/pages/books.astro lines 21-33. In
src/pages/events.astro lines 21-34, remove the common declarations while
preserving the page-specific letter-spacing: 0.05em if intended.

In `@src/pages/debug.astro`:
- Around line 94-98: Update the rejected-result rendering in the debug page to
show visitors only a generic error message instead of result.reason details. Log
the original rejection reason server-side before rendering, while preserving the
existing error-state layout and label context.
- Around line 100-105: Update the fulfilled-result empty-state condition in the
debug page to also detect arrays with zero elements, such as by checking the
array length alongside the existing falsy-value check. Keep the existing
result.value mapping behavior unchanged for non-empty arrays.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e3a4b6f8-8996-4dfd-9f73-016e6f3de555

📥 Commits

Reviewing files that changed from the base of the PR and between 442df7a and fa81bf1.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (48)
  • astro.config.mjs
  • package.json
  • public/_redirects
  • public/robots.txt
  • src/components/blog/BlogContent.astro
  • src/components/blog/BlogSkeleton.astro
  • src/components/blog/PostItem.astro
  • src/components/books/BooksContent.astro
  • src/components/books/BooksSkeleton.astro
  • src/components/events/EventsContent.astro
  • src/components/events/EventsSkeleton.astro
  • src/components/landing/ListSkeleton.astro
  • src/components/landing/ReadingSummary.astro
  • src/components/landing/ReadingSummarySkeleton.astro
  • src/components/landing/RecentBlueskyPosts.astro
  • src/components/landing/RecentBlueskyPostsSkeleton.astro
  • src/components/landing/RecentPosts.astro
  • src/components/landing/RecentPostsSkeleton.astro
  • src/components/landing/UpcomingEvents.astro
  • src/components/landing/UpcomingEventsSkeleton.astro
  • src/components/projects/Projects.astro
  • src/components/projects/ProjectsContent.astro
  • src/components/projects/ProjectsSkeleton.astro
  • src/components/utils/Breadcrumbs.astro
  • src/components/utils/Fallback.astro
  • src/components/utils/IntroBadge.astro
  • src/components/utils/SectionSkeleton.astro
  • src/layouts/Footer.astro
  • src/layouts/LayoutPage.astro
  • src/lib/blog.ts
  • src/lib/bluesky.ts
  • src/lib/books.ts
  • src/lib/data.ts
  • src/lib/events.ts
  • src/lib/fetch.ts
  • src/lib/github.ts
  • src/lib/posts.ts
  • src/live.config.ts
  • src/loaders/atproto.ts
  • src/loaders/enums.ts
  • src/pages/api/projects.ts
  • src/pages/blog.astro
  • src/pages/books.astro
  • src/pages/debug.astro
  • src/pages/events.astro
  • src/pages/index.astro
  • src/pages/projects.astro
  • src/styles/global.css
💤 Files with no reviewable changes (12)
  • src/loaders/enums.ts
  • src/components/utils/SectionSkeleton.astro
  • src/components/projects/Projects.astro
  • src/lib/fetch.ts
  • src/lib/blog.ts
  • src/live.config.ts
  • src/pages/api/projects.ts
  • src/lib/bluesky.ts
  • src/loaders/atproto.ts
  • src/lib/events.ts
  • src/lib/github.ts
  • src/lib/books.ts

Comment thread src/components/landing/RecentPosts.astro
Comment thread src/layouts/Footer.astro Outdated
Comment thread src/lib/data.ts Outdated
Comment thread src/lib/data.ts Outdated
Comment thread src/lib/posts.ts
Comment thread src/pages/blog.astro Outdated
Comment thread src/pages/debug.astro
Comment thread src/pages/debug.astro Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/components/blog/BlogContent.astro (1)

8-14: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Select cache profiles from actual data availability, not array truthiness.

Both components can cache fallback output using the long-lived success profile when their fetcher returns [].

  • src/components/blog/BlogContent.astro#L8-L14: compute hasData before applyCache() and select the profile from it.
  • src/components/events/EventsContent.astro#L7-L9: select the profile using the existing non-empty hasData condition.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/blog/BlogContent.astro` around lines 8 - 14, Use actual
non-empty data availability for cache selection: in
src/components/blog/BlogContent.astro lines 8-14, compute hasData before
applyCache and pass longLivedCache only when it is true, while preserving the
existing grouping behavior; in src/components/events/EventsContent.astro lines
7-9, update applyCache to use the existing non-empty hasData condition instead
of array truthiness.
src/pages/debug.astro (1)

11-21: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Do not expose this uncached aggregation route without access control.

Every request triggers all external fetchers—including the GitHub aggregation and its retries—while no-store prevents reuse. A public caller can repeatedly consume upstream quotas and hold server workers. Restrict this debug route to development/authenticated access, or cache/rate-limit it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/debug.astro` around lines 11 - 21, Restrict the debug page’s
uncached aggregation flow around the top-level Promise.allSettled call to
development or authenticated requests before invoking fetchPosts, fetchBooks,
fetchEvents, fetchBluesky, and fetchProjects. Otherwise add appropriate caching
or rate limiting so public callers cannot repeatedly trigger all external
fetchers and their retries.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/data.ts`:
- Around line 118-140: The rateLimited condition in the GitHub retry flow should
also treat a 403 response with a present Retry-After header as retryable. Update
the guard around retryAfter and GITHUB_MAX_RETRIES while preserving the existing
429 and x-ratelimit-remaining handling and wait calculation.

---

Outside diff comments:
In `@src/components/blog/BlogContent.astro`:
- Around line 8-14: Use actual non-empty data availability for cache selection:
in src/components/blog/BlogContent.astro lines 8-14, compute hasData before
applyCache and pass longLivedCache only when it is true, while preserving the
existing grouping behavior; in src/components/events/EventsContent.astro lines
7-9, update applyCache to use the existing non-empty hasData condition instead
of array truthiness.

In `@src/pages/debug.astro`:
- Around line 11-21: Restrict the debug page’s uncached aggregation flow around
the top-level Promise.allSettled call to development or authenticated requests
before invoking fetchPosts, fetchBooks, fetchEvents, fetchBluesky, and
fetchProjects. Otherwise add appropriate caching or rate limiting so public
callers cannot repeatedly trigger all external fetchers and their retries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 30657fb0-f27b-4380-9208-40499f9d6737

📥 Commits

Reviewing files that changed from the base of the PR and between fa81bf1 and 85410d8.

📒 Files selected for processing (17)
  • src/components/blog/BlogContent.astro
  • src/components/books/BooksContent.astro
  • src/components/events/EventsContent.astro
  • src/components/landing/ReadingSummary.astro
  • src/components/landing/RecentBlueskyPosts.astro
  • src/components/landing/RecentPosts.astro
  • src/components/landing/UpcomingEvents.astro
  • src/layouts/Footer.astro
  • src/lib/cache.ts
  • src/lib/data.ts
  • src/lib/posts.ts
  • src/pages/blog.astro
  • src/pages/books.astro
  • src/pages/debug.astro
  • src/pages/events.astro
  • src/pages/projects.astro
  • src/styles/global.css
💤 Files with no reviewable changes (3)
  • src/pages/books.astro
  • src/pages/blog.astro
  • src/layouts/Footer.astro

Comment thread src/lib/data.ts
@trueberryless

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/landing/RecentBlueskyPosts.astro`:
- Around line 24-27: Update the date comparator in RecentBlueskyPosts to provide
a numeric fallback when either createdAt value is missing or invalid, matching
the established handling in RecentPosts.astro. Preserve descending chronological
ordering for valid dates while ensuring the sort callback always returns a
number.

In `@src/components/projects/ProjectsContent.astro`:
- Around line 1-11: Update the frontmatter in ProjectsContent.astro to apply the
same shared Astro.response caching profile used by BlogContent, BooksContent,
and EventsContent before calling fetchProjects. Reuse the existing caching
symbol and placement pattern from those components; leave the fetchProjects
error handling unchanged.

In `@src/lib/data.ts`:
- Around line 349-360: Update the post filtering/mapping flow to return null
when validation removes every post, while preserving the existing mapped array
for non-empty valid results. Ensure the consuming BlogContent.astro path can
distinguish this degraded-data case from a healthy empty array.

In `@src/lib/posts.ts`:
- Around line 4-12: Update formatDate to use UTC consistently by formatting the
month with timeZone: "UTC" and deriving the day via getUTCDate(). Also update
the year-grouping logic around getFullYear() to use getUTCFullYear(), preserving
existing invalid-date and grouping behavior.

In `@src/pages/projects.astro`:
- Line 15: Update the ProjectsContent invocation in the projects page to use
server:defer, matching the other content pages. If this makes ProjectsContent a
Server Island, add the corresponding applyCache(...) handling in
ProjectsContent.astro.

In `@src/styles/global.css`:
- Around line 156-167: Remove the unused hydration visibility rules under the
“Hydration state visibility” section in global.css, including selectors
targeting data-hydrate, data-content, and data-fallback. Do not modify unrelated
styles.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3bd74e24-3a34-4fa9-9230-3bab8a72e388

📥 Commits

Reviewing files that changed from the base of the PR and between 442df7a and 85410d8.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (48)
  • astro.config.mjs
  • package.json
  • public/_redirects
  • public/robots.txt
  • src/components/blog/BlogContent.astro
  • src/components/blog/BlogSkeleton.astro
  • src/components/blog/PostItem.astro
  • src/components/books/BooksContent.astro
  • src/components/books/BooksSkeleton.astro
  • src/components/events/EventsContent.astro
  • src/components/events/EventsSkeleton.astro
  • src/components/landing/ListSkeleton.astro
  • src/components/landing/ReadingSummary.astro
  • src/components/landing/ReadingSummarySkeleton.astro
  • src/components/landing/RecentBlueskyPosts.astro
  • src/components/landing/RecentBlueskyPostsSkeleton.astro
  • src/components/landing/RecentPosts.astro
  • src/components/landing/RecentPostsSkeleton.astro
  • src/components/landing/UpcomingEvents.astro
  • src/components/landing/UpcomingEventsSkeleton.astro
  • src/components/projects/Projects.astro
  • src/components/projects/ProjectsContent.astro
  • src/components/utils/Breadcrumbs.astro
  • src/components/utils/Fallback.astro
  • src/components/utils/IntroBadge.astro
  • src/components/utils/SectionSkeleton.astro
  • src/layouts/Footer.astro
  • src/layouts/LayoutPage.astro
  • src/lib/blog.ts
  • src/lib/bluesky.ts
  • src/lib/books.ts
  • src/lib/cache.ts
  • src/lib/data.ts
  • src/lib/events.ts
  • src/lib/fetch.ts
  • src/lib/github.ts
  • src/lib/posts.ts
  • src/live.config.ts
  • src/loaders/atproto.ts
  • src/loaders/enums.ts
  • src/pages/api/projects.ts
  • src/pages/blog.astro
  • src/pages/books.astro
  • src/pages/debug.astro
  • src/pages/events.astro
  • src/pages/index.astro
  • src/pages/projects.astro
  • src/styles/global.css
💤 Files with no reviewable changes (12)
  • src/pages/api/projects.ts
  • src/components/projects/Projects.astro
  • src/components/utils/SectionSkeleton.astro
  • src/lib/blog.ts
  • src/live.config.ts
  • src/lib/bluesky.ts
  • src/loaders/enums.ts
  • src/lib/github.ts
  • src/lib/books.ts
  • src/lib/events.ts
  • src/lib/fetch.ts
  • src/loaders/atproto.ts

Comment thread src/components/landing/RecentBlueskyPosts.astro
Comment thread src/components/projects/ProjectsContent.astro
Comment thread src/lib/data.ts Outdated
Comment thread src/lib/posts.ts
Comment thread src/pages/projects.astro
Comment thread src/styles/global.css Outdated
@trueberryless

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.


Your plan includes PR reviews subject to rate limits. More reviews will be available in 45 minutes.

@trueberryless
trueberryless merged commit 09b32c1 into main Jul 17, 2026
8 checks passed
@trueberryless
trueberryless deleted the perf/make-fast branch July 17, 2026 11:37
@coderabbitai coderabbitai Bot mentioned this pull request Jul 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚧 config Configuration file updates 📦 package Updates in package structure or package.json 🏯 styles Stylesheets or design updates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant