{"id":9332,"date":"2025-10-13T14:49:17","date_gmt":"2025-10-13T14:49:17","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=9332"},"modified":"2025-10-13T14:49:17","modified_gmt":"2025-10-13T14:49:17","slug":"thoughts-on-remix-3-frantic-im","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/9332\/","title":{"rendered":"Thoughts on Remix 3 \/ frantic.im"},"content":{"rendered":"\n<\/p>\n<div>\n<p><a target=\"_blank\" href=\"https:\/\/remix.run\/\">Remix<\/a> is a web framework by <s>React underdogs<\/s> authors of the most popular React package. Few days ago at <a target=\"_blank\" href=\"https:\/\/remix.run\/jam\/2025\">Remix Jam 2025<\/a>, Ryan and Michael shared a sneak peak of Remix v3. There\u2019s no official blog post or documentation yet. Here\u2019s my attempt at explaining what it is about.<\/p>\n<p>Remix v1 was a React framework that managed data loading and server-side rendering. Its biggest achievement was the <a target=\"_blank\" href=\"https:\/\/remix.run\/\">marketing website<\/a>. Early Remix was interesting because it was viewed as the first real contender for Next.js\u2019s dominant position.<\/p>\n<p>Remix v2 struggled with its messaging and identity. One of the authors <a target=\"_blank\" href=\"https:\/\/x.com\/ryanflorence\/status\/1791479313939976313\">described it<\/a> as <em>\u201cRemix v2 is a Vite plugin that makes access to React Router v6 features more convenient through the Route Module API\u201d<\/em>. This is definitely not how you beat Vercel\u2019s marketing machine. The framework had its users, but definitely not the trajectory to make a dent in Next.js\u2019s market share.<\/p>\n<p>Remix v3 is\u2026 very different. It represents a broader shift in web development sentiment and could be worth paying attention to. To understand why, let\u2019s look at the state of modern React.<\/p>\n<h3>Modern React<\/h3>\n<p><strong>In 2025, React feels complicated.<\/strong> React Server Components introduced a more sophisticated way to render components on the server and hydrate them on client. The rules of what is allowed are nuanced: server components can be defined as <code>async<\/code> now and pass data to client components (but not all kinds data). Regular server-side functions can now be used on client via magic RPC actions. Developers need to learn <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/rsc\/use-client\"><code>\"use client\"<\/code><\/a> vs <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/rsc\/use-server\"><code>\"use server\"<\/code><\/a>.<\/p>\n<p>The speed, especially on big apps, started to be a common concern. Frameworks like Svelte introduced a way to sidestep virtual DOM diffing and produce the most efficient direct way of updating elements, while still looking reasonably declarative. So the React team opened access to the React compiler, a project that has been brewing up inside Meta for almost 8 years. It works by auto-memoizing your components and hooks. But not all components, because that could introduce subtle bugs. Now it\u2019s about <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react-compiler\/directives\/use-memo\"><code>\"use memo\"<\/code><\/a> and <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react-compiler\/directives\/use-no-memo\"><code>\"use no memo\"<\/code><\/a> (aliased as <code>\"use forget\"<\/code> and <code>\"use no forget\"<\/code> which doesn\u2019t help with the confusion).<\/p>\n<p>The core API surface of React keep growing. React has added async rendering APIs (<a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react\/Suspense\"><code>Suspense<\/code><\/a>, <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react\/startTransition\"><code>startTransition<\/code><\/a>, <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react\/useDeferredValue\"><code>useDeferredValue<\/code><\/a>, <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react\/useActionState\"><code>useActionState<\/code><\/a>) to make web apps more responsive \u2013 now user interactions can be prioritized against less urgent but expensive component tree updates, but require you to reason about \u201cactive\u201d and \u201cpending\u201d states. The other new APIs are also seen as complex and niche. Just look at the documentation for <a target=\"_blank\" href=\"https:\/\/react.dev\/reference\/react\/useEffectEvent\"><code>useEffectEvent<\/code><\/a> (but try to guess what it\u2019s doing before you click).<\/p>\n<p><strong>Nobody forces developer to use these features.<\/strong> In fact even the oldest <code>createReactClass<\/code> with mixins work just fine with the official <code>create-react-class<\/code> npm package. You can still use that style of React today, you don\u2019t have to adopt any of the new modern features.<\/p>\n<p>Except, <a target=\"_blank\" href=\"https:\/\/react.dev\/learn\/creating-a-react-app\">you kind of have to<\/a> \u2013 these features are shoved into developers\u2019 throats via <a target=\"_blank\" href=\"https:\/\/nextjs.org\/\">Next.js<\/a>. React itself gave up attempts at being a framework. It was just too much work to keep up with fast paced JS tooling, and Facebook had their own setup not worth opensourcing.<\/p>\n<p>Next.js itself went though some painful transitions (<a target=\"_blank\" href=\"https:\/\/nextjs.org\/docs\/pages\">pages router<\/a> vs <a target=\"_blank\" href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\">app router<\/a>) and left developers who live on the bleeding edge badly hurt. On top of the API churn, Next.js has a whole another layer of complexity caused by Vercel. Vercel deploys fullstack Next.js apps in its own special way \u2013 some code runs in the browser, some in AWS Lambda (with 3x markup), and some in its proprietary worker runtime (\u201cmiddleware\u201d must be one of the biggest lies that caused developer-decades of confusion and frustration).<\/p>\n<p>All this stuff is just\u2026 too much. In fact, even explaining the problems these features and frameworks are trying to fix took Dan several <a target=\"_blank\" href=\"https:\/\/overreacted.io\/react-for-two-computers\/\">conferences<\/a> and <a target=\"_blank\" href=\"https:\/\/overreacted.io\/the-two-reacts\/\">blog posts<\/a> to describe. People who get it, get it. RSC, Suspense, React Compiler are really powerful and solve real problems some companies have.<\/p>\n<p>On top of that, LLMs suck at React. When asked to build an app, they all reach for React, but the resulting components are ugly soups of <code>useEffects<\/code> and random hacks to work around subtle bugs.<\/p>\n<h3>Remix v3<\/h3>\n<p>So in this state of complexity and frustration, Remix v3 is born. You can watch the <a target=\"_blank\" href=\"https:\/\/remix.run\/jam\/2025\">Remix Jam<\/a> recording (look for timestamps in the comments) + scroll through both authors\u2019 X accounts to get a sense of it.<\/p>\n<p>On the frontend Remix still uses JSX, but there\u2019s no React runtime. It doesn\u2019t track state the way React does, but instead gives developers a <code>this.update()<\/code> function to call to tell Remix that something has changed. Instead of explicit state you can use anything, most commonly closure-captured variables:<\/p>\n<pre><code class=\"language-typescript\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title function_\">Counter<\/span>(<span class=\"hljs-params\"><span class=\"hljs-variable language_\">this<\/span>: Remix.Handle<\/span>) {\n  \n  <span class=\"hljs-keyword\">let<\/span> count = <span class=\"hljs-number\">0<\/span>;\n\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-function\">() =&gt;<\/span> (\n    <span class=\"language-xml\"><span class=\"hljs-tag\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">div<\/span>&gt;{count}<span class=\"hljs-tag\"><span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">button<\/span>\n        <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"p-2 text-green-500\"<\/span>\n        <span class=\"hljs-attr\">on<\/span>=<span class=\"hljs-string\">{dom.click((event,<\/span> <span class=\"hljs-attr\">signal<\/span>) =&gt; {\n          count++;\n          this.update();\n        })}\n      &gt;\n        Inc\n      <span class=\"hljs-tag\"><span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\"><span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  );\n}\n<\/code><\/pre>\n<p>This makes code more imperative, mechanically simpler. Do this, then do that. Transitions, instead of React\u2019s promise of <code>view = f(state)<\/code>.<\/p>\n<p>Events are first class and use web\u2019s built-in events mechanism. Instead of <code>onClick<\/code> there\u2019s a universal <code>\"on\"<\/code> prop and a library of standard <code>dom<\/code> events + developers can define their own <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/CustomEvent\"><code>CustomEvents<\/code><\/a>.<\/p>\n<p>To control async work, Remix relies on <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/AbortController\/signal\">signals<\/a>. E.g. to cancel a <code>fetch<\/code> when component unmounts the developers can do this:<\/p>\n<pre><code>function Cities(this: Remix.Handle) {\n  let list = [], isLoading = true;\n  fetch(\"https:\/\/api.remix.run\/cities.json\", { signal: this.signal })\n    .then(response =&gt; response.json())\n    .then(data =&gt; {\n      list = data;\n      isLoading = false;\n      this.update();\n    });\n\n  return () =&gt; \u2026\n}\n<\/code><\/pre>\n<p>Remix will ship with a component library. React has a wide ecosystem of components that won\u2019t work in Remix, so to stay competitive the team is working on high quality built-in components. Things like menus and forms with attention to detail and accessibility support. It also introduces subtle but nice quality-of-life improvements over React: built-in <code>css<\/code> prop, <code>class<\/code> instead of <code>className<\/code>.<\/p>\n<p>On the backend, Remix double-downs on Web Platform. The handlers take web <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Request\"><code>Request<\/code><\/a> and return <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Response\"><code>Response<\/code><\/a>. It also brings things like <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/FormData\"><code>FormData<\/code><\/a>, <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/File\"><code>File<\/code><\/a> and others to the server. This makes the server runtime an implementation detail. Node, Deno, Bun \u2013 all have either native support or adapters for these web APIs, so Remix can run anywhere.<\/p>\n<p>In v3 the framework gave up on file-based routing. Just too much trouble to capture the range of things they want to support in just the file names. Instead it introduces a TypeScript-based way of defining the routes. TypeScript guarantees all routes are implemented and URL parameters are passed to handlers and links are never broken.<\/p>\n<pre><code class=\"language-typescript\"><span class=\"hljs-keyword\">let<\/span> routes = <span class=\"hljs-title function_\">route<\/span>({\n  <span class=\"hljs-attr\">home<\/span>: <span class=\"hljs-string\">\"\/\"<\/span>,\n  <span class=\"hljs-attr\">about<\/span>: <span class=\"hljs-string\">\"\/about\"<\/span>,\n  <span class=\"hljs-attr\">books<\/span>: {\n    <span class=\"hljs-attr\">index<\/span>: { <span class=\"hljs-attr\">method<\/span>: <span class=\"hljs-string\">\"GET\"<\/span>, <span class=\"hljs-attr\">pattern<\/span>: <span class=\"hljs-string\">\"\/\"<\/span> },\n    <span class=\"hljs-attr\">create<\/span>: { <span class=\"hljs-attr\">method<\/span>: <span class=\"hljs-string\">\"POST\"<\/span>, <span class=\"hljs-attr\">pattern<\/span>: <span class=\"hljs-string\">\"\/\"<\/span> },\n    <span class=\"hljs-attr\">show<\/span>: <span class=\"hljs-string\">\"\/books\/:slug\"<\/span>,\n  },\n});\n\n\nrouter.<span class=\"hljs-title function_\">map<\/span>(routes.<span class=\"hljs-property\">books<\/span>, booksHandlers)\n\n\n<a target=\"_blank\" href=\"{routes.&lt;span\" class=\"hljs-property\">home.<span class=\"hljs-title function_\">href<\/span>()}&gt;\u2026<\/a>;\n<\/code><\/pre>\n<p>The server also comes with built-in sane things like logging and file storage.<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/www.youtube.com\/watch?v=zqhE-CepH2g\">The gap<\/a> is what happens between the client and the server. Remix v3\u2019s approach feels a lot less magical than RSC. There\u2019s no custom JSON hydration streams. Instead Remix reinvents iFrames by creating async loading boundaries and uses HTML as wire format, <a target=\"_blank\" href=\"https:\/\/htmx.org\/\">HTMX<\/a>-style. There are also hints of using <a target=\"_blank\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Web_components\">Web Components<\/a> to bring together HTML and JS.<\/p>\n<h3>Sumamry<\/h3>\n<p>Remix keeps leaning into the Web Platform and TypeScript, takes control of wider portion of the full stack, ditches nuanced parts of React for a simple <code>this.update()<\/code>, which makes the code less magical and easier to understand for humans and LLMs. Remix is the <a target=\"_blank\" href=\"https:\/\/grugbrain.dev\/\">Grug Brain<\/a> version of what Next.js should have been.<\/p>\n<p>So what happens next?<\/p>\n<p>You\u2019ll hear a lot of noise and hot takes (including this post). YouTube influencers are already recording videos and generating surprised faces for video thumbnails to try to take advantage of the next hype wave. Grumpy Hacker News will complain about yet another JS framework.<\/p>\n<p>It will seem like you have to learn Remix now and migrate all your projects to it. You don\u2019t. React is still fine (nobody got fired for choosing React) and you can keep using the good parts (seems to be a <a target=\"_blank\" href=\"https:\/\/www.amazon.com\/JavaScript-Good-Parts-Douglas-Crockford\/dp\/0596517742\">common JS thing<\/a>).<\/p>\n<p>Remix v3 is a signal of stronger <a target=\"_blank\" href=\"https:\/\/cassidoo.co\/post\/annoyed-at-react\/\">frustrations<\/a> in React community and desire for a change. The functional \u2194 imperative pendulum is starting to swing the other direction.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/frantic.im\/figma\/og_remix.png\" alt=\"\"\/><\/p>\n<\/div>\n\n<br \/><a href=\"https:\/\/frantic.im\/remix-3\/\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"Remix is a web framework by React underdogs authors of the most popular React package. Few days ago at Remix J [&hellip;]","protected":false},"author":1,"featured_media":9333,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-9332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hatena-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Thoughts on Remix 3 \/ frantic.im - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/frantic.im\/remix-3\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Thoughts on Remix 3 \/ frantic.im - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"Remix is a web framework by React underdogs authors of the most popular React package. Few days ago at Remix J [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/frantic.im\/remix-3\/\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T14:49:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/10\/og_remix.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/9332\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"Thoughts on Remix 3 \\\/ frantic.im\",\"datePublished\":\"2025-10-13T14:49:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/9332\\\/\"},\"wordCount\":1265,\"image\":{\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/og_remix.png\",\"articleSection\":[\"\u306f\u3066\u306a\u30d6\u30ed\u30b0\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/9332\\\/\",\"url\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/\",\"name\":\"Thoughts on Remix 3 \\\/ frantic.im - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/og_remix.png\",\"datePublished\":\"2025-10-13T14:49:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/frantic.im\\\/remix-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/og_remix.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/og_remix.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/frantic.im\\\/remix-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Thoughts on Remix 3 \\\/ frantic.im\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Thoughts on Remix 3 \/ frantic.im - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/frantic.im\/remix-3\/","og_locale":"ja_JP","og_type":"article","og_title":"Thoughts on Remix 3 \/ frantic.im - \u30dd\u30b1\u30b3\u30f3","og_description":"Remix is a web framework by React underdogs authors of the most popular React package. Few days ago at Remix J [&hellip;]","og_url":"https:\/\/frantic.im\/remix-3\/","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-10-13T14:49:17+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/10\/og_remix.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"7\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/frantic.im\/remix-3\/#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/9332\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"Thoughts on Remix 3 \/ frantic.im","datePublished":"2025-10-13T14:49:17+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/9332\/"},"wordCount":1265,"image":{"@id":"https:\/\/frantic.im\/remix-3\/#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/10\/og_remix.png","articleSection":["\u306f\u3066\u306a\u30d6\u30ed\u30b0"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/9332\/","url":"https:\/\/frantic.im\/remix-3\/","name":"Thoughts on Remix 3 \/ frantic.im - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/frantic.im\/remix-3\/#primaryimage"},"image":{"@id":"https:\/\/frantic.im\/remix-3\/#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/10\/og_remix.png","datePublished":"2025-10-13T14:49:17+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/frantic.im\/remix-3\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/frantic.im\/remix-3\/"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/frantic.im\/remix-3\/#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/10\/og_remix.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/10\/og_remix.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/frantic.im\/remix-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"Thoughts on Remix 3 \/ frantic.im"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/9332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=9332"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/9332\/revisions"}],"predecessor-version":[{"id":9334,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/9332\/revisions\/9334"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/9333"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=9332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=9332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=9332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}