GitShow/remix-run/remix
remix-run

remix

Build Better Websites. Create modern, resilient user experiences with web fundamentals.

by remix-run
Star on GitHubForkWebsitenpm

TypeScript

33.2k stars2.8k forks30 contributorsActive · 10h agoSince 2020MIT

Meet the team

See all 30 on GitHub →
mjackson
mjackson2.4k contributions
brophdawg11
brophdawg11905 contributions
remix-run-bot
remix-run-bot686 contributions
ryanflorence
ryanflorence540 contributions
chaance
chaance536 contributions
pcattori
pcattori430 contributions
MichaelDeBoey
MichaelDeBoey403 contributions
mcansh
mcansh402 contributions

Languages

View on GitHub →
TypeScript99.7%
JavaScript0.2%
CSS0%
Shell0%
HTML0%
Lua0%

Commit activity

Last 12 weeks · 355 commits

Full graph →

Community health

3 of 6 standards met

Community profile →
62
✓README✓License✓Contributing○Code of Conduct○Issue Template○PR Template

Recent PRs & issues

Active · Last activity 10h ago
See all on GitHub →
brookslybrand
Remix GuidesOpenPR

Continuation of #11562 See the deployed preview: https://remix-3-guides.fly.dev/docs/ I pulled this out into a separate PR because I decided to go a bit of a different architectural direction. After trying to write docs in JSX and finding it incredibly difficult, I switched to markdown + a custom directive for loading in Remix ``s anytime I need dynamic examples or any sort of rich component. Other than that, the content is still oriented around the chapters set in #11562, and I'm just continually working through them. Chapters that have been written and reviewed by me, a human: ✅ Start Here

brookslybrand · 10h ago
ryanflorence
Fix cascading update guard diagnosticsOpenPR

The scheduler's cascading update guard used one per-turn counter for all component updates. That meant a large batch of legitimate hydration/update work could look like an infinite loop and stop later components from becoming interactive. This keeps the performance signal while making the hard guard more precise. The runtime now warns once per event-loop turn when aggregate cascading component updates cross the threshold, but only dispatches the infinite-loop error when the same component instance repeatedly updates itself. Closes #11222. Adds component-name/count diagnostics to the aggregate warning and hard error Tracks the hard error limit per component instance instead of globally Preserves the existing protection for loops during render Adds a regression for 60 component instances updating in the same event-loop turn

ryanflorence · 1d ago
sbaleno
Improve MAX_CASCADING_UPDATES guard: warn with component breakdown instead of silent failureOpenIssue

Context We're building a social feed (post cards with reactions, comments, share buttons) using . Each post uses several components. With 20 posts on the initial page, we had 92+ hydration regions and hit in the scheduler. The error fired and left most components unhydrated. No actual infinite loop — just many components hydrating in the same microtask turn. Minimal reproduction Expected: All 60 buttons hydrate and are interactive. Actual: Hydration stops at 50. Buttons 51-60 render as static HTML but clicks do nothing. Console shows . Can provide a StackBlitz if helpful. The limit is actually useful — but the DX needs work The 50 limit pushed us to optimize. We reduced from 92 to 16 hydration regions by: Converting image/avatar components from to server components with CSS fallbacks Moving share button logic from to event delegation ( attributes + global click handler) Reducing initial SSR page size from 20 to 5 posts (viewport-only, infinite scroll loads more) The guard caught a real performance issue. But the experience of discovering and diagnosing it was rough: 1. The error message is opaque. gives no component names, no counts, and no indication of whether you're at 51 or 5000. We had to read the scheduler source to understand what was happening. 2. It errors instead of warning. Hitting 50 kills hydration entirely. A at 50 would give the same signal without breaking the page. Teams would see it, investigate, and optimize — without the "why is nothing interactive?" panic. 3. No way to configure it. We had to use a pnpm patch. Something like would let teams tune for their use case. 4. Per-component tracking for the hard error. 51 different components each updating once isn't a loop. One component updating 51 times is. The hard error (infinite loop detection) would be more accurate as a per-component counter, while the global counter could remain as a warning/optimization signal. What we patched locally We ended up patching the scheduler to get better diagnostics: Warns at 50 with a component breakdown: Errors at 200** with the same breakdown in the error message Resets the warn flag each event loop turn This turned a confusing breakage into an actionable optimization signal. Proposed patch Here's the patch we're running locally via pnpm . Happy to open a PR if this direction is useful. Changes to : Reset warn flag alongside the counter: Warn at 50 with component breakdown, error at 200 with the same: Summary of suggestions Environment Guard introduced in PR #11060 (commit )

sbaleno · 2d ago

Recent fixes

View closed PRs →
sethmoon
Unable to nest components in a hydrated componentClosedIssue

When running Remix on the server, I want to be able to nest components inside my hydrated component in order to compose components together. This would prove useful for forms and UI elements like accordions. Currently, if a hydrated component is returned to the client that contains either another hydrated component or even just a plain server rendered component, a error will be thrown in the logs. Specifically, I see the following in the logs when attempting to render this component: Example: The HTML returned by the server is as follows (excluding the document for brevity): This can be easily demonstrated in the bookstore example as well if one tries to nest a component (hydrated or otherwise) in .

sethmoon · 2d ago
alexanderson1993
[component] Incorrect DOM node ordering when calling handle.update() after the app has hydratedClosedIssue

This one is a little contrived, but I've got a minimal reproduction here: https://github.com/alexanderson1993/remix/tree/renderToStream-incorrect-dom-order/demos/renderToStream-incorrect-dom-order You can run that by checking out that branch, navigating to that demo, running and then and visiting the server address. Here's the setup: You've got an app that's server-rendered with . You want to use a browser API, like IndexedDB or Geolocation, so you initialize some component state with , and then call the browser API inside . And then in the component itself, we render in the place where the data should go until hydration completes, the browser API promise resolves, and the component updates. The expected behavior is that you would see this in your browser when everything settles, where the is replaced with the newly created DOM node. The actual behavior is that the DOM node is created and appended to the end of the component, like so: I've tested this with client-only using and it behaves as expected. It's only when rendering with , , and . I'll also note that in my example, removing the guard results in the server crashing with the following error: I don't think that's relevant to this particular reproduction, since you would need to have the guard in place if you were using a browser API instead of my contrived example.

alexanderson1993 · 2d ago
aleclarson
[component] Calling queueTask during setup is brokenClosedIssue

Take this example from the docs: ⚠️ The will be aborted if a parent component rerenders, but the fetch will never retry, resulting in infinite loading state. Solution:** When calling from the "setup scope" (e.g. before the initial render), the callback should be given (aborted only on unmount) instead of an update-tied signal.

aleclarson · 2d ago
Structured data for AI agents

Repository: remix-run/remix. Description: Build Better Websites. Create modern, resilient user experiences with web fundamentals. Stars: 33153, Forks: 2781. Primary language: TypeScript. Languages: TypeScript (99.7%), JavaScript (0.2%), CSS (0%), Shell (0%), HTML (0%). License: MIT. Homepage: https://remix.run Open PRs: 33, open issues: 24. Last activity: 10h ago. Community health: 62%. Top contributors: mjackson, brophdawg11, remix-run-bot, ryanflorence, chaance, pcattori, MichaelDeBoey, mcansh, markdalgleish, github-actions[bot] and others.

·@ofershap

Replace github.com with gitshow.dev