<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Isograph Blog</title>
        <link>https://isograph.dev/blog</link>
        <description>Isograph Blog</description>
        <lastBuildDate>Sun, 14 Dec 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Isograph v0.5.0 — the one with optimistic updates, writing data from external sources, and VSCode extension DevEx improvements!]]></title>
            <link>https://isograph.dev/blog/2025/12/14/isograph-0.5.0</link>
            <guid>https://isograph.dev/blog/2025/12/14/isograph-0.5.0</guid>
            <pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Isograph is an opinionated, compiler-driven framework for building data-driven apps that are stable and performant out of the box. In Isograph, developers write components, along with the data they require, and a compiler stitches everything up for you. See also the quickstart!]]></description>
            <content:encoded><![CDATA[<div class="theme-admonition theme-admonition-note admonition_QPa_ alert alert--secondary"><div class="admonitionHeading_V3QO"><span class="admonitionIcon_rPYT"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CktG"><p>Isograph is an opinionated, compiler-driven framework for building data-driven apps that are stable and performant out of the box. In Isograph, developers write components, along with the data they require, and a compiler stitches everything up for you. See also <a href="https://isograph.dev/docs/quickstart/" target="_blank" rel="noopener noreferrer">the quickstart</a>!</p></div></div>
<p>The Isograph team is extremely proud to announce the release of Isograph v0.5.0! This release contains amazing new runtime features, massive DevEx wins, compiler performance improvements and important internal refactors. And the team is growing! The team is growing — since the last release, five new engineers have contributed to the project!</p>
<ul>
<li><strong>Optimistic updates</strong>. You can now provide an optimistic response at that time, which will be written into the store for the duration of the network request.</li>
<li><strong>Writing external data into the Isograph store</strong>. We now provide a typed interface to write arbitrary data into the Isograph store. Useful when incrementally adopting Isograph, when you don't yet have a GraphQL endpoint set up, or when you have another source of data (e.g. server-sent of events or local storage.)</li>
<li><strong>DevEx wins in the VSCode extension</strong>. Selecting a field that doesn't yet exist? There's an autofix that will create the field for you! And so much more!</li>
<li><strong>Compiler performance wins</strong>. We no longer rewrite the entire <code>__isograph</code> folder on every change, leading to massive speedups in watch mode!</li>
</ul>
<p>Let's talk about each of these, and more!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="optimistic-updates">Optimistic updates<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#optimistic-updates" class="hash-link" aria-label="Direct link to Optimistic updates" title="Direct link to Optimistic updates">​</a></h2>
<p>We now support providing an optimistic response for most network requests! Oftentimes, when you make a network request (for example, when making a mutation to increment a post's like count), you already know what the result will be if the request succeeds. In cases like this, you can now provide an <code>optimisticNetworkResponse</code>. This response will be written into the store, and later dropped when the network request completes.</p>
<p>The best part about this — this is completely statically typed! Entrypoints contain so-called raw response types, which are types that correspond to what the network response would be. When you provide an <code>optimisticNetworkResponse</code>, you must provide something of that shape. So that means that if you change what you're fetching by adding or removing fields, then the raw response type changes, and what you provide must change!</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/skWBcKZkldo?si=XciLOUD-f8z8uMbZ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>In order to implement this, we had to rewrite the store from being a single object to being a stack of objects! Writing an optimistic response is as simple as adding an object to this stack, and reverting it is simply removing it from the stack. Neat! This work also sets us up for future support for "forking" the store (i.e. a store that supports multi-version concurrency control).</p>
<p>Thank you <a href="https://github.com/PatrykWalach" target="_blank" rel="noopener noreferrer">@PatrykWalach</a> for this amazing work!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="writing-external-data">Writing external data<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#writing-external-data" class="hash-link" aria-label="Direct link to Writing external data" title="Direct link to Writing external data">​</a></h2>
<p>We now provide a typed API for writing external data into the Isograph store! You may want to do this in at least three circumstances:</p>
<ul>
<li>you're incrementally adopting Isograph,</li>
<li>you don't have a GraphQL backend, but want to enjoy the DevEx and performance wins of Isograph, or</li>
<li>you have an external source of data (e.g. some server-sent events, local storage, etc.) that you want to work with an existing Isograph app.</li>
</ul>
<p>Like with optimistic updates, these rely on the raw response type! You create an entrypoint and provide the equivalent of the network response, and that is written into the store, as if it came from the network.</p>
<p>Another win here is that writing data from an external source uses the same primitives as writing network data, so you get a bunch of awesome things for free! Just the needed components are re-rendered, the data can be garbage collected when its unused, etc.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Tl5pD54HXfg?si=lKtkuFrHZ0lKUt4Z" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>Once again, amazing work by <a href="https://github.com/PatrykWalach" target="_blank" rel="noopener noreferrer">@PatrykWalach</a>!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="vscode-extension-improvements">VSCode extension improvements<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#vscode-extension-improvements" class="hash-link" aria-label="Direct link to VSCode extension improvements" title="Direct link to VSCode extension improvements">​</a></h2>
<p>And this version of Isograph included some amazing DevEx wins! In my (admittedly biased) opinion, I think Isograph can lay a claim to being the framework that provides the best DevEx! Check out this video, where we holistically describe the developer experience of using Isograph:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/6tNWbVOjpQw?si=gaiEh17XCTIDiwoC" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>And now, we've released not only a VSCode extension, but also an Open VSIX extension, so you can get the benefits when using other editors, like VSCodium and Eclipse Theia. Thank you <a href="https://github.com/sp6370" target="_blank" rel="noopener noreferrer">@sp6370</a> for setting this up!</p>
<p>But let's also call out some specific features that shipped in v0.5.0:</p>
<ul>
<li>errors are now surfaced in VSCode!</li>
<li>autocomplete of fields now works!</li>
<li>if you select a field that doesn't exist, you will get an autofix that creates a file containing a stub of the field for you! For example, if you selected <code>Query.Header</code>, and it didn't exist, and used the autofix labeled <code>Create new @component field named `Query.Header` </code>, then it would create a file containing:</li>
</ul>
<div class="language-tsx codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-tsx codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> iso </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@iso'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">Query__Header2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">iso</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  field Query.Header @component {</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c"></span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> data </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>What a massive speedup!</p>
<p>And guess what? There are even more VSCode extension improvements coming soon!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="compiler-performance-wins">Compiler performance wins<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#compiler-performance-wins" class="hash-link" aria-label="Direct link to Compiler performance wins" title="Direct link to Compiler performance wins">​</a></h2>
<p>Another win that we shipped was an absolutely massive performance win. We previously rewrote the entire <code>__isograph</code> directory on every save. Now, we keep track of the previous file state and make only the minimal changes to the file system required.</p>
<p>Testing locally, in the pet demo, updating the graphql schema by adding a new, unused field on pet demo went from 144ms to 53ms (in a debug build on a macbook pro m1), and updating the Query.HomeRoute iso literal by adding a new field went from 125ms to 72ms. These gains are likely going to be much larger in larger projects!</p>
<p>Thank you <a href="https://github.com/lucasmachadorj" target="_blank" rel="noopener noreferrer">@lucasmachadorj</a> for this amazing work!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="internal-refactors">Internal refactors<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#internal-refactors" class="hash-link" aria-label="Direct link to Internal refactors" title="Direct link to Internal refactors">​</a></h2>
<p>We also did an absolutely monumental amount of internal refactoring, with three big goals:</p>
<ul>
<li>enable us to add additional features to the extension,</li>
<li>improve the performance of the compiler, and</li>
<li>set us up to support other network protocols (e.g. SQL, tRPC).</li>
</ul>
<p>Since these aren't user-facing, I'll focus on just one of these improvements by <a href="https://github.com/ch1ffa" target="_blank" rel="noopener noreferrer">@ch1ffa</a>. We added support for returning references from memoized functions. This is a gamechanger. Our incremental compiler is written as a series of memoized pure functions which reuse their old values if no input has changed, and therefore their return value couldn't have changed. However, one limitation was that we were restricted to returning owned object, so if a particular value went through several memoized functions, it was repeatedly cloned. Now, we support returning references, and the compiler clones objects far less!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="other-improvements">Other improvements<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#other-improvements" class="hash-link" aria-label="Direct link to Other improvements" title="Direct link to Other improvements">​</a></h2>
<ul>
<li><a href="https://github.com/Cobord" target="_blank" rel="noopener noreferrer">@Cobord</a> added tests related to the garbage collection of <code>MemoRef</code>s.</li>
<li><a href="https://github.com/corydeppen" target="_blank" rel="noopener noreferrer">@corydeppen</a> added docs about TanStack start and StrictMode.</li>
<li><a href="https://github.com/TheRealGchen" target="_blank" rel="noopener noreferrer">@TheRealGChen</a> added docs related to troubleshooting.</li>
<li><a href="https://github.com/tbezman" target="_blank" rel="noopener noreferrer">@tbezman</a> fixed broken <code>useClientSideDefer</code> types.</li>
</ul>
<p>There is a lot more! See the <a href="https://github.com/isographlabs/isograph/commit/1ce3cd25d57e8feb93e0c7b8b80aba9109b6987f" target="_blank" rel="noopener noreferrer">commit message</a> for more details.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="conclusion">Conclusion<a href="https://isograph.dev/blog/2025/12/14/isograph-0.5.0#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Getting this release out has been a monumental effort, and this blog post didn't cover even cover everything! There's never been an easier time to try out Isograph!</p>
<p>So go on, give the <a href="https://isograph.dev/docs/quickstart/" target="_blank" rel="noopener noreferrer">quickstart</a> a try! Join the <a href="https://isograph.dev/discord" target="_blank" rel="noopener noreferrer">discord</a>! Star the <a href="https://github.com/isographlabs/isograph" target="_blank" rel="noopener noreferrer">repository</a>!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Isograph v0.4.0 — the one with the VSCode extension]]></title>
            <link>https://isograph.dev/blog/2025/09/17/isograph-0.4.0</link>
            <guid>https://isograph.dev/blog/2025/09/17/isograph-0.4.0</guid>
            <pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Isograph is an opinionated, compiler-driven framework for building data-driven apps that are stable and performant out of the box. In Isograph, developers write components, along with the data they require, and a compiler stitches everything up for you. See also the quickstart!]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Isograph is an opinionated, compiler-driven framework for building data-driven apps that are stable and performant out of the box. In Isograph, developers write components, along with the data they require, and a compiler stitches everything up for you. See also <a href="https://isograph.dev/docs/quickstart/" target="_blank" rel="noopener noreferrer">the quickstart</a>!</p>
</blockquote>
<p>The Isograph team is extremely proud to announce the release of Isograph v0.4! This release contains an absolutely monumental amount of features! The team is growing — since the last release, five new engineers have contributed to the project!</p>
<ul>
<li>There's a new VSCode extension, which provides syntax highlighting, auto format, hover info and go to definition.</li>
<li>We introduced client pointers, which are functions from graph data to an ID. These allow the app developer to embed follow up queries in their isograph literals. They were the largest remaining missing primitive in Isograph.</li>
<li>We introduced typesafe updaters, which provide an absolute top-notch developer experience for updating locally cached data.</li>
<li>We introduced persisted queries. Instead of sending the entire query text, Isograph can send just a query ID, saving bandwidth and increasing security!</li>
</ul>
<p>Let's talk about each of these, and more!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="vscode-extension">VSCode extension<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#vscode-extension" class="hash-link" aria-label="Direct link to VSCode extension" title="Direct link to VSCode extension">​</a></h2>
<p>The new VSCode extension deserves an Isograph release of its own. It completely changes the experience of working with Isograph. With syntax highlighting, go to definition and hover information, it becomes much easier to create a mental model of your app and the flow of data within it. Before this extension, Isograph literals were magic strings. With the extension, Isograph literals come alive!</p>
<p>And that's just a start! We spent much of the last year refactoring the Isograph compiler (more on that later) and laying the groundwork for future extension features. So stay tuned. Follow up features, like find all references, surfacing errors, autocomplete, etc. are in the works!</p>
<iframe width="100%" height="444" src="https://www.youtube.com/embed/rw0dc3UPWto?si=WbGPwLwQUG30xk9S" title="Demonstration of the Isograph VSCode extension" frameborder="0" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="client-pointers">Client pointers<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#client-pointers" class="hash-link" aria-label="Direct link to Client pointers" title="Direct link to Client pointers">​</a></h2>
<p>Yet another feature that deserves its own release! Client pointers are functions from some graph data, which return a (you guessed it) pointer to another object, and they were the largest remaining missing primitive in Isograph.</p>
<p>This might be best explained with an example. Consider a <code>bestFriend</code> pointer, which selects a list of friends as well as the viewer's <code>closeness</code>. The <code>pointer</code> iterates over this list of friends, and returns a link to the friend with the highest closeness.</p>
<p>Now, in another isograph literal, we can select that <code>bestFriend</code> field, and off of it, select <code>name</code> (and hundreds of other fields). Great!</p>
<p>Now, when this is used, it will result in two queries. First, a query for all of the friends, their closenesses, and their IDs, and later, a follow up request for the best friend's name. Neat!</p>
<p>This allows us to avoid downloading the <code>name</code> and hundreds of other fields for each friend, only to throw out most of that data. That's a waste of bandwidth and an unnecessary cost on your server.</p>
<p>Now, there are lots of additional features that we want to ship with client pointers, but it's extremely exciting to even get version one out!</p>
<p><img loading="lazy" alt="The best friend pointer" src="https://isograph.dev/assets/images/best-friend-pointer-195191eb5a045c826126cadf1d8722ca.png" width="694" height="900" class="img_P4FA"></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="local-updates">Local updates<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#local-updates" class="hash-link" aria-label="Direct link to Local updates" title="Direct link to Local updates">​</a></h2>
<p>And a third? We really should have cut some smaller releases in the mean time!</p>
<p>Isograph now allows you to tag certain selections as <code>@updatable</code>, meaning that that client field will be passed a <code>startUpdate</code> function, in which you can just modify that field. Just look at that developer experience! Just use mutate data. And not to mention, it's typesafe and performant. If you make multiple changes, they all get batched, and only components that actually read that modified field will be re-rendered!</p>
<p>An absolutely massive thanks to Patryk Wałach for working on client pointers and optimistic updates (and 50 million other features, besides.)</p>
<p><img loading="lazy" alt="Clear debts button" src="https://isograph.dev/assets/images/clear-debts-eab6d208f8b8332a064c3ac1afa36294.png" width="982" height="900" class="img_P4FA"></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="persisted-queriestrusted-documents">Persisted queries/trusted documents<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#persisted-queriestrusted-documents" class="hash-link" aria-label="Direct link to Persisted queries/trusted documents" title="Direct link to Persisted queries/trusted documents">​</a></h2>
<p>A fourth?! Isograph now supports persisted queries. Previously, Isograph would send the full query text with every network request. This is bad — both because it requires sending the full query text twice, which is bad for bandwidth, and because this required you to expose a GraphQL endpoint.</p>
<p>Instead, with persisted queries, Isograph allows you to register these queries at build time, and send only an ID. This not only cuts down on bandwidth usage, but also allows you to not expose a GraphQL endpoint, drastically improving security!</p>
<p>See <a href="https://benjie.dev/graphql/trusted-documents" target="_blank" rel="noopener noreferrer">this article</a> for more info.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="lazy-loaded-normalization-and-reader-asts">Lazy loaded normalization and reader ASTs<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#lazy-loaded-normalization-and-reader-asts" class="hash-link" aria-label="Direct link to Lazy loaded normalization and reader ASTs" title="Direct link to Lazy loaded normalization and reader ASTs">​</a></h2>
<p>The Isograph compiler generates many files that actually materialize the user experience you want. And one of those files is called the normalization AST. It's primarily used to write a network response into the Isograph store, and it's not necessary to kick off the network request.</p>
<p>And in this version of Isograph, you can annotate an entrypoint (which is like a query root) with <code>@lazyLoad(normalization: true)</code> and have that entrypoint's normalization AST not be included as part of the parent bundle! Instead, Isograph will start fetching the normalization AST when it kicks off the request for data. Neat!</p>
<p>And if you annotate the entrypoint with <code>@lazyLoad(normalization: true, reader: true)</code>, it will <strong>also</strong> not include the reader AST, which is to say, it will also not include the JavaScript for rendering the result of the query.</p>
<p>Isograph's north star is to allow you to build the app you want with the least amount of data and JavaScript. If it's extraneous, it should not be part of the initial bundle! And this is another example of how we're pulling that off.</p>
<p>Special thanks to <a href="https://x.com/xiniha_1e88df" target="_blank" rel="noopener noreferrer">Iha Shin</a> and <a href="https://github.com/dialectician4" target="_blank" rel="noopener noreferrer">Edwin Santos</a>, two developers who worked on this feature!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="experimental-swc-plugin">Experimental SWC plugin<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#experimental-swc-plugin" class="hash-link" aria-label="Direct link to Experimental SWC plugin" title="Direct link to Experimental SWC plugin">​</a></h2>
<p>Now, hitherto, Isograph has required a babel plugin. We know that isn't ideal for everyone!</p>
<p>So today, we're extremely excited to announce that we also shipped an experimental SWC plugin! It works with NextJS v15.0.0 to v15.0.2. We'll ship SWC plugins that work for more versions of NextJS soon.</p>
<p>A special thanks to <a href="https://github.com/Pablinho" target="_blank" rel="noopener noreferrer">Pablo Crovetto</a> and <a href="https://x.com/edmondo_po" target="_blank" rel="noopener noreferrer">Edmondo Porcu</a> for working on this.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="incremental-compiler">Incremental compiler<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#incremental-compiler" class="hash-link" aria-label="Direct link to Incremental compiler" title="Direct link to Incremental compiler">​</a></h2>
<p>Last, and by no means least, I'd like to point out that the language server has been made possible by a massive rewrite of the Isograph compiler. It went from a batch mode compiler to an incremental one, where intermediate results are automatically reused.</p>
<p>Whereas in a batch compiler, any change causes the compiler to re-execute everything, in an incremental compiler, a small change (such as an update to one file), results in a small amount of work being redone (that file is reparsed, etc.) And a language server —&nbsp;that's sort of like a compiler where very little changes! For example, if you're hovering on one field and then on another, we should be able to reuse pretty much all of the work!</p>
<p>Now, one could add caching manually (for example, by file.) But that's really tough to extend and maintain, and risks opening up bugs.</p>
<p>So, we turned to a solution where functions can simply be annotated with a <code>#[memo]</code> macro, and just like that, they're smartly cached. And we found that the developer experience was great!</p>
<p>And this is all powered by a homegrown framework that we're calling Pico (a smaller, simpler <a href="https://github.com/salsa-rs/salsa" target="_blank" rel="noopener noreferrer">Salsa</a>). This merits its own blog post, but for now, it is sufficient to point out that this was an absolutely monumental effort by <a href="https://x.com/Chiffa117" target="_blank" rel="noopener noreferrer">Vadim Evseev</a> (who also shipped persisted queries).</p>
<p>The work to make the compiler incremental is ongoing, it turns out that even with a good developer experience, it's a lot of work :).</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="conclusion">Conclusion<a href="https://isograph.dev/blog/2025/09/17/isograph-0.4.0#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Getting this release out has been a monumental effort, and this blog post didn't cover even cover everything! There is a tree sitter grammar, open telemetry integration and so many cool internal features I'd love to go on about. And since v0.3, five new contributors have helped out, including <a href="https://x.com/benapatton" target="_blank" rel="noopener noreferrer">Ben Patton</a> and <a href="https://github.com/jcesarprog" target="_blank" rel="noopener noreferrer">Julio Teixeira</a>. <a href="https://boltfoundry.com/" target="_blank" rel="noopener noreferrer">Bolt Foundry</a> is all-in on Isograph, and having a great time using it. And now that the language server is out, there's never been an easier time to try out Isograph!</p>
<p>So go on, give the <a href="https://isograph.dev/docs/quickstart/" target="_blank" rel="noopener noreferrer">quickstart</a> a try! Join the <a href="https://isograph.dev/discord" target="_blank" rel="noopener noreferrer">discord</a>! Star the <a href="https://github.com/isographlabs/isograph" target="_blank" rel="noopener noreferrer">repository</a>!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Isograph v0.3.0 and v0.3.1]]></title>
            <link>https://isograph.dev/blog/2025/03/03/isograph-0.3.0</link>
            <guid>https://isograph.dev/blog/2025/03/03/isograph-0.3.0</guid>
            <pubDate>Mon, 03 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The Isograph team is super excited to announce the release of Isograph v0.3.0, and a follow-up v0.3.1! The amount of features we stuffed into these releases is just absolutely massive. If we went into depth on each one, this blog post would simply be too long — so we're only covering each item in brief!]]></description>
            <content:encoded><![CDATA[<p>The Isograph team is super excited to announce the release of Isograph v0.3.0, and a follow-up v0.3.1! The amount of features we stuffed into these releases is just absolutely massive. If we went into depth on each one, this blog post would simply be too long —&nbsp;so we're only covering each item in brief!</p>
<blockquote>
<p>Interested in trying Isograph out? Check out the <a href="https://isograph.dev/docs/quickstart/" target="_blank" rel="noopener noreferrer">quickstart</a>, join the <a href="https://discord.gg/qcHUxb6deQ" target="_blank" rel="noopener noreferrer">Discord</a> and watch the <a href="https://www.youtube.com/watch?v=sf8ac2NtwPY" target="_blank" rel="noopener noreferrer">presentation at GraphQL conf</a>.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="big-picture">Big picture<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#big-picture" class="hash-link" aria-label="Direct link to Big picture" title="Direct link to Big picture">​</a></h2>
<p>These releases improve the usability of Isograph for real-world projects. They include massive internal refactors that bring Isograph closer to a cross-platform world. And they include contributions from <strong>five new developers</strong>!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="detailed-release-notes">Detailed release notes<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#detailed-release-notes" class="hash-link" aria-label="Direct link to Detailed release notes" title="Direct link to Detailed release notes">​</a></h2>
<p>In these two releases, you'll find:</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="support-for-relay-style-connection-spec-pagination">Support for Relay-style connection spec pagination<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#support-for-relay-style-connection-spec-pagination" class="hash-link" aria-label="Direct link to Support for Relay-style connection spec pagination" title="Direct link to Support for Relay-style connection spec pagination">​</a></h3>
<p>We've added a <code>useConnectionSpecPagination</code> hook that makes working with Relay-style connections a breeze. Check out <a href="https://github.com/isographlabs/isograph/blob/9cb0ac6dbd383b1b21df5b0686273d0a02288c27/demos/github-demo/src/isograph-components/UserRepositoryList.tsx#L22" target="_blank" rel="noopener noreferrer">the GitHub demo</a> for an example of it in action.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="fetch-policies">Fetch policies<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#fetch-policies" class="hash-link" aria-label="Direct link to Fetch policies" title="Direct link to Fetch policies">​</a></h3>
<p>APIs for fetching data, such as <code>useLazyReference</code> and <code>useImperativeReference</code>, now accept a fetch policy. Using a fetch policy, you can specify that you would like to unconditionally make a network request, to make it if there isn't enough data in the store to fulfill the entire query, or to not make the network request.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="support-for-refining-to-a-concrete-type-and-unions">Support for refining to a concrete type and unions<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#support-for-refining-to-a-concrete-type-and-unions" class="hash-link" aria-label="Direct link to Support for refining to a concrete type and unions" title="Direct link to Support for refining to a concrete type and unions">​</a></h3>
<p>GraphQL unions and interfaces are now given special fields, <code>asConcreteType</code> fields, which are non-null if the union/interface has that concrete type. For example, you might select <code>asUser</code> on an object of type <code>Node</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="oncomplete-and-onerror-callbacks"><code>onComplete</code> and <code>onError</code> callbacks<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#oncomplete-and-onerror-callbacks" class="hash-link" aria-label="Direct link to oncomplete-and-onerror-callbacks" title="Direct link to oncomplete-and-onerror-callbacks">​</a></h3>
<p>APIs for fetching data, such as <code>useLazyReference</code> and <code>useImperativeReference</code>, also accept <code>onComplete</code> and <code>onError</code> callbacks. These give you the ability to execute a callback when a network request completes or errors out.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="we-lifted-the-requirement-that-ids-are-globally-unique">We lifted the requirement that IDs are globally unique<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#we-lifted-the-requirement-that-ids-are-globally-unique" class="hash-link" aria-label="Direct link to We lifted the requirement that IDs are globally unique" title="Direct link to We lifted the requirement that IDs are globally unique">​</a></h3>
<p>Isograph no longer requires IDs to be globally unique. Instead, they only must be unique within a given typename.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="link-field"><code>link</code> field<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#link-field" class="hash-link" aria-label="Direct link to link-field" title="Direct link to link-field">​</a></h3>
<p>Each object type has a magic <code>link</code> field, which acts as a pointer to that object. So, for example, in <code>node(id: "4") { asUser { link } }</code>, the <code>link</code> field would be <code>{ __typename: "User", __link: "4" }</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="compiler-watch-mode-performance-improvements">Compiler watch mode performance improvements<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#compiler-watch-mode-performance-improvements" class="hash-link" aria-label="Direct link to Compiler watch mode performance improvements" title="Direct link to Compiler watch mode performance improvements">​</a></h3>
<p>Our compiler watch mode is now more efficient, and reuses more intermediate results. This is just a taste of things to come — expect massive efficiency gains in the next release 😈.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="massively-improved-docs">Massively improved docs<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#massively-improved-docs" class="hash-link" aria-label="Direct link to Massively improved docs" title="Direct link to Massively improved docs">​</a></h3>
<p>Our docs have been overhauled. This task will never be done, but there are some serious improvements there.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="a-demo-of-using-isograph-with-vite">A demo of using Isograph with Vite<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#a-demo-of-using-isograph-with-vite" class="hash-link" aria-label="Direct link to A demo of using Isograph with Vite" title="Direct link to A demo of using Isograph with Vite">​</a></h3>
<p>Isograph can be used with any build framework, but so far, all of our demos have used NextJS. Now, we have a Vite demo.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="other-features">Other features<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#other-features" class="hash-link" aria-label="Direct link to Other features" title="Direct link to Other features">​</a></h3>
<ul>
<li>There are numerous additional validations, such as that there are no undefined or unused variables. Variables are also typechecked.</li>
<li>There are improved component prop types</li>
<li>We log when an environment is created</li>
<li>Additional Isograph config options:<!-- -->
<ul>
<li>You can use the <code>generated_file_header</code> option to specify a comment that the Isograph compiler should include in generated files. This can be used to disable auto-formatting, linting, etc.</li>
<li>The <code>module</code> option controls whether the Babel transform, when encountering entrypoints, will generate <code>require</code> calls or <code>import</code> statements.</li>
<li>The <code>include_file_extensions_in_import_statements</code> option controls whether generated files refer to other files with or without file extensions.</li>
<li>The <code>no_babel_transform</code> option can be set to true if you don't have the babel transform set up.</li>
</ul>
</li>
<li>Our demos now showcase proper error handling.</li>
<li>Isograph now has a peer dependency on React 18 or 19, and is not pinned to a specific version of React.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="bug-fixes">Bug fixes<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#bug-fixes" class="hash-link" aria-label="Direct link to Bug fixes" title="Direct link to Bug fixes">​</a></h3>
<ul>
<li>The component cache had a bug that involved components defined on interfaces and items of different types with identical IDs. (Remember, IDs are no longer required to be globally unique.)</li>
<li>We fixed a long-standing issue in which errors during SSR caused infinite suspense, instead of showing an error fallback.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="other-internal-improvements">Other internal improvements<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#other-internal-improvements" class="hash-link" aria-label="Direct link to Other internal improvements" title="Direct link to Other internal improvements">​</a></h3>
<ul>
<li>We cut down on re-renders by having Isograph re-use parts of the old read out value. To my knowledge, this is done in a cutting edge way: by using the reader AST, and (though we have no benchmarks) is potentially more performant than any other solution.</li>
<li>We did a substantial refactor that prepares Isograph to be able to generate SQL, OpenAPI, or any other type of query!</li>
<li>We added fixture tests for added stability.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="contributors">Contributors<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#contributors" class="hash-link" aria-label="Direct link to Contributors" title="Direct link to Contributors">​</a></h2>
<p>I want to thank the many contributors that helped make this release possible:</p>
<ul>
<li><a href="https://github.com/PatrykWalach" target="_blank" rel="noopener noreferrer">Patryk Wałach</a></li>
<li><a href="https://github.com/ch1ffa" target="_blank" rel="noopener noreferrer">Vadim Evseev</a></li>
<li><a href="https://github.com/edmondop" target="_blank" rel="noopener noreferrer">Edmondo Porcu</a></li>
<li><a href="https://github.com/lanesawyer" target="_blank" rel="noopener noreferrer">Lane Sawyer</a></li>
<li><a href="https://github.com/dialectician4" target="_blank" rel="noopener noreferrer">Edwin Santos</a></li>
<li><a href="https://github.com/XiNiHa" target="_blank" rel="noopener noreferrer">Iha Shin</a></li>
<li><a href="https://github.com/adrtivv" target="_blank" rel="noopener noreferrer">Adrtivv</a></li>
<li><a href="https://github.com/saminoorsyed" target="_blank" rel="noopener noreferrer">Sami Syed</a></li>
</ul>
<p>And I want to thank the following folks who provided extremely valuable feedback:</p>
<ul>
<li><a href="https://github.com/randallb" target="_blank" rel="noopener noreferrer">Randall Bennett</a></li>
<li><a href="https://github.com/tigawanna" target="_blank" rel="noopener noreferrer">Dennis Kinuthia</a></li>
</ul>
<p>The Isograph family is growing 😊</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="conclusion">Conclusion<a href="https://isograph.dev/blog/2025/03/03/isograph-0.3.0#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Whew! If you made it this far, congratulations! But I promise you — subsequent releases will be <em>even more filled with features</em>!</p>
<p>So why not give it a try? Check out the <a href="https://isograph.dev/docs/quickstart/" target="_blank" rel="noopener noreferrer">quickstart</a>, join the <a href="https://discord.gg/qcHUxb6deQ" target="_blank" rel="noopener noreferrer">Discord</a> and watch the <a href="https://www.youtube.com/watch?v=sf8ac2NtwPY" target="_blank" rel="noopener noreferrer">presentation at GraphQL conf</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deep dives]]></title>
            <link>https://isograph.dev/blog/2024/10/23/isograph-deep-dives</link>
            <guid>https://isograph.dev/blog/2024/10/23/isograph-deep-dives</guid>
            <pubDate>Wed, 23 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Want to learn more about Isograph? We recently did some deep dives into how the runtime works and how the compiler works!]]></description>
            <content:encoded><![CDATA[<p>Want to learn more about Isograph? We recently did some deep dives into how the runtime works and how the compiler works!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="runtime-deep-dive">Runtime deep dive<a href="https://isograph.dev/blog/2024/10/23/isograph-deep-dives#runtime-deep-dive" class="hash-link" aria-label="Direct link to Runtime deep dive" title="Direct link to Runtime deep dive">​</a></h2>
<p>In the <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s" target="_blank" rel="noopener noreferrer">runtime deep dive</a>, we discussed:</p>
<ul>
<li>what is a data driven app? How do changes to subcomponents affect other files? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=0s" target="_blank" rel="noopener noreferrer">0:00</a></li>
<li>debugging an Isograph app using React DevTools <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=843s" target="_blank" rel="noopener noreferrer">14:03</a></li>
<li>entrypoints and generated queries <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=1040s" target="_blank" rel="noopener noreferrer">17:20</a></li>
<li>client fields (and how Isograph reads the just data selected by a given client field) <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=1218s" target="_blank" rel="noopener noreferrer">20:18</a></li>
<li>what happens when a network request is made? How does Isograph render the entire page? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=1754s" target="_blank" rel="noopener noreferrer">29:14</a></li>
<li>adding additional logic to GraphQL queries <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=2059s" target="_blank" rel="noopener noreferrer">34:19</a></li>
<li>how do we use the Reader AST to generate the data for a given client field <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=2359s" target="_blank" rel="noopener noreferrer">39:19</a></li>
<li>what about @component client fields? what is the component cache? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=2509s" target="_blank" rel="noopener noreferrer">41:49</a></li>
<li>how does TypeScript learn about the type of the data parameter passed to client fields? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=2970s" target="_blank" rel="noopener noreferrer">49:30</a></li>
<li>Loadable fields <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=3073s" target="_blank" rel="noopener noreferrer">51:13</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="qa">Q&amp;A<a href="https://isograph.dev/blog/2024/10/23/isograph-deep-dives#qa" class="hash-link" aria-label="Direct link to Q&amp;A" title="Direct link to Q&amp;A">​</a></h3>
<ul>
<li>do we use the same store for the client component cache and the network response cache? What else might be stored in the network response cache? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=3737s" target="_blank" rel="noopener noreferrer">1:02:17</a></li>
<li>what does the roadmap look like? How generic will be Isograph in the long term? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=4119s" target="_blank" rel="noopener noreferrer">1:08:39</a></li>
<li>can we calculate client fields on the server? Benefits in terms of privacy, performance, capabilities, etc. <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=4310s" target="_blank" rel="noopener noreferrer">1:11:50</a></li>
<li>how does one migrate from Redux to Isograph? Modifications to the store? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=4517s" target="_blank" rel="noopener noreferrer">1:15:17</a></li>
<li>thoughts on a plugin architecture? Yes! <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=4676s" target="_blank" rel="noopener noreferrer">1:17:56</a></li>
<li>other ways to modify fragments <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=4887s" target="_blank" rel="noopener noreferrer">1:21:27</a></li>
<li>what about benchmarks? <a href="https://www.youtube.com/watch?v=ASIAfEHoU1s&amp;t=5044s" target="_blank" rel="noopener noreferrer">1:24:04</a></li>
</ul>
<p><a href="https://www.youtube.com/watch?v=ASIAfEHoU1s" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://img.youtube.com/vi/ASIAfEHoU1s/0.jpg" alt="Runtime deep dive" class="img_P4FA"></a></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="compiler-deep-dive">Compiler deep dive<a href="https://isograph.dev/blog/2024/10/23/isograph-deep-dives#compiler-deep-dive" class="hash-link" aria-label="Direct link to Compiler deep dive" title="Direct link to Compiler deep dive">​</a></h2>
<p>In the <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac" target="_blank" rel="noopener noreferrer">compiler deep dive</a>, we discuss:</p>
<ul>
<li>Big picture overview <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=0s" target="_blank" rel="noopener noreferrer">00:00</a></li>
<li>The future direction for the compiler: salsa architecture <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=613s" target="_blank" rel="noopener noreferrer">10:13</a></li>
<li>Most important things that we do <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=1148s" target="_blank" rel="noopener noreferrer">19:08</a></li>
<li>Parsing and processing the GraphQL schema (intro) <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=1215s" target="_blank" rel="noopener noreferrer">20:15</a></li>
<li>Parsing the GraphQL schema <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=1335s" target="_blank" rel="noopener noreferrer">22:15</a></li>
<li>Processing the parsed GraphQL schema <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=2165s" target="_blank" rel="noopener noreferrer">36:05</a></li>
<li>Parsing iso literals <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=2810s" target="_blank" rel="noopener noreferrer">46:50</a></li>
<li>Adding client field literals to the schema <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=3070s" target="_blank" rel="noopener noreferrer">51:10</a></li>
<li>Validating the Isograph schema <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=3192s" target="_blank" rel="noopener noreferrer">53:12</a></li>
<li>Generating the content of generated files <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=3670s" target="_blank" rel="noopener noreferrer">1:01:10</a></li>
<li>Writing artifacts to disk <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=4389s" target="_blank" rel="noopener noreferrer">1:13:09</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="qa-1">Q&amp;A<a href="https://isograph.dev/blog/2024/10/23/isograph-deep-dives#qa-1" class="hash-link" aria-label="Direct link to Q&amp;A" title="Direct link to Q&amp;A">​</a></h3>
<ul>
<li>How does watch mode work? <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=4457s" target="_blank" rel="noopener noreferrer">1:14:17</a></li>
<li>What is the future of the compiler? <a href="https://www.youtube.com/watch?v=w9pLztQD_Ac&amp;t=4640s" target="_blank" rel="noopener noreferrer">1:17:20</a></li>
</ul>
<p><a href="https://www.youtube.com/watch?v=w9pLztQD_Ac" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://img.youtube.com/vi/w9pLztQD_Ac/0.jpg" alt="Compiler deep dive" class="img_P4FA"></a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Isograph 0.2.0]]></title>
            <link>https://isograph.dev/blog/2024/09/11/isograph-0.2.0</link>
            <guid>https://isograph.dev/blog/2024/09/11/isograph-0.2.0</guid>
            <pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Another year, another tremendous milestone!]]></description>
            <content:encoded><![CDATA[<p>Another year, another tremendous milestone!</p>
<p>Words cannot express how excited the Isograph team is to announce the release of Isograph 0.2.0. This release is chock full of features, including:</p>
<ul>
<li>fully-featured <code>@component</code> client fields</li>
<li>automatic typing</li>
<li>compiler watch mode</li>
<li><code>@loadable</code> fields</li>
<li>pagination</li>
<li>network error handling</li>
<li>fragment variables</li>
<li>garbage collection</li>
<li>fine grained re-rendering</li>
<li>support for Windows</li>
<li>finer control over re-exposed fields</li>
</ul>
<p>Let's run through each of these in turn!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="component-client-fields"><code>@component</code> client fields<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#component-client-fields" class="hash-link" aria-label="Direct link to component-client-fields" title="Direct link to component-client-fields">​</a></h2>
<p>As of 0.1.0, Isograph <code>@component</code> client fields had to be interpolated. That's awkward! In 0.2.0, they can be used like regular components!</p>
<div class="codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-text codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token plain">export const BlogPostDisplay = iso(`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  field BlogPost.BlogPostDisplay @component {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    BlogPostHeader</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">`)(blogPost =&gt; &lt;blogPost.BlogPostHeader /&gt;)</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Much better!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="automatic-typing">Automatic typing<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#automatic-typing" class="hash-link" aria-label="Direct link to Automatic typing" title="Direct link to Automatic typing">​</a></h2>
<p>The first parameter to client fields is fully statically typed! Consider this <code>BlogPostHeader</code>:</p>
<div class="language-tsx codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-tsx codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> iso </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@iso'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">BlogPostHeader</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">iso</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  field BlogPost.BlogPostHeader @component { </span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    title</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    author</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c"></span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">blogPost</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">blogPost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">title</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">blogPost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">author</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The <code>blogPost</code> parameter will have type</p>
<div class="language-tsx codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-tsx codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">BlogPost__BlogPostHeader__param</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">undefined</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  author</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">undefined</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>and VSCode (or your IDE of choice) will know about it!</p>
<p>That's because the <code>iso</code> function is overloaded at its definition. It's a function that, if passed a string starting with <code>field BlogPost.BlogPostHeader</code>, will pass an object of type <code>BlogPost__BlogPostHeader__param</code> to the resolver function.</p>
<p>This overload is generated by the Isograph compiler, so as soon as you save, it will get updated and VSCode will learn about it!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="compiler-watch-mode">Compiler watch mode<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#compiler-watch-mode" class="hash-link" aria-label="Direct link to Compiler watch mode" title="Direct link to Compiler watch mode">​</a></h2>
<p>Speaking of "as soon as you save", the Isograph compiler now comes with a watch mode!</p>
<p>Now, if run with <code>yarn iso --watch</code>, the Isograph compiler will re-run on every save!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="loadable-fields">Loadable fields<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#loadable-fields" class="hash-link" aria-label="Direct link to Loadable fields" title="Direct link to Loadable fields">​</a></h2>
<p>If there weren't so many other huge features in this release, this would be a marquee feature on its own!</p>
<p>Isograph now ships with loadable fields, which are like entrypoints (i.e. separate queries) embedded in other queries!</p>
<p>With loadable fields, you can:</p>
<ul>
<li><code>@defer</code> data</li>
<li>paginate</li>
<li>load data in response to user actions, such as clicks</li>
</ul>
<p>Loadable fields can <strong>also</strong> be used to asynchronously load JavaScript, so they also let you do <strong>Relay entrypoints in userland</strong>.</p>
<p>So, this means we can load only the JavaScript for objects that we actually encounter (e.g. load a <code>VideoPlayer</code> component if and only if we encounter a news feed item containing a video!)</p>
<p>There's so much more to be said about this topic, so for now, see <a href="https://isograph.dev/docs/loadable-fields/">the loadable fields documentation</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="pagination">Pagination<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#pagination" class="hash-link" aria-label="Direct link to Pagination" title="Direct link to Pagination">​</a></h2>
<p>As mentioned above, loadable fields can power pagination! See <a href="https://isograph.dev/docs/pagination/">the documentation</a>.</p>
<p>The best part about this is that this is entirely doable in userland, so if you want behavior that's appropriate for your specific use case, you can implement that!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="network-error-handling">Network error handling<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#network-error-handling" class="hash-link" aria-label="Direct link to Network error handling" title="Direct link to Network error handling">​</a></h2>
<p>You can now throw if a network request errored out.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="fragment-variables">Fragment variables<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#fragment-variables" class="hash-link" aria-label="Direct link to Fragment variables" title="Direct link to Fragment variables">​</a></h2>
<p>All variables in Isograph are local now. No more confusing global variables :)</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="garbage-collection">Garbage collection<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#garbage-collection" class="hash-link" aria-label="Direct link to Garbage collection" title="Direct link to Garbage collection">​</a></h2>
<p>When fragment references are disposed (e.g. if a component that calls <code>useLazyReference</code> unmounts), the data they protect is liable to be garbage collected. This ensures that the memory usage of the Isograph store does not grow without bound over time!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="fine-grained-re-rendering">Fine-grained re-rendering<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#fine-grained-re-rendering" class="hash-link" aria-label="Direct link to Fine-grained re-rendering" title="Direct link to Fine-grained re-rendering">​</a></h2>
<p>Now, Isograph <code>@component</code> client fields will re-render if and only if the data read out by the first parameter has actually changed.</p>
<p>There should be very few unnecessary re-renders!</p>
<p>(There are still some unnecessary re-renders due to loadable fields appearing different from render-to-render, but this <a href="https://github.com/isographlabs/isograph/issues/92" target="_blank" rel="noopener noreferrer">there is an open issue</a>, and fixing this is a <a href="https://github.com/isographlabs/isograph/labels/good%20first%20issue" target="_blank" rel="noopener noreferrer">great first issue</a>!)</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="support-for-windows">Support for Windows<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#support-for-windows" class="hash-link" aria-label="Direct link to Support for Windows" title="Direct link to Support for Windows">​</a></h2>
<p>Isograph now builds on Windows! Woohoo!</p>
<p>Thank you to <a href="https://github.com/adrtivv" target="_blank" rel="noopener noreferrer">adrtivv</a> for fixing this!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="finer-control-over-re-exposed-fields">Finer control over re-exposed fields<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#finer-control-over-re-exposed-fields" class="hash-link" aria-label="Direct link to Finer control over re-exposed fields" title="Direct link to Finer control over re-exposed fields">​</a></h2>
<p>As of last year's GraphQL conf, re-exposed mutation fields were not configurable. But now they are!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="conclusion">Conclusion<a href="https://isograph.dev/blog/2024/09/11/isograph-0.2.0#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>So many of these deserve their own blog post. But the point is simply this — many patterns that were previously impossible to do in Isograph are doable now! Isograph is suitable for more projects, and the developer experience is better than ever!</p>
<p>So go ahead, follow the <a href="https://isograph.dev/docs/quickstart/">quickstart</a> and give it a try!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Video demonstration of the DevEx of using Isograph]]></title>
            <link>https://isograph.dev/blog/2024/02/15/devex-of-isograph</link>
            <guid>https://isograph.dev/blog/2024/02/15/devex-of-isograph</guid>
            <pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Please check out this video showing off the DevEx of using Isograph that I recorded with Lenny Garcia Crespo! In this video, we use Isograph to build an app powered by the GitHub GraphQL API that lists your repositories, and can be used to add and remove stars.]]></description>
            <content:encoded><![CDATA[<p>Please check out this <a href="https://www.youtube.com/watch?v=KgEbkH50GLo" target="_blank" rel="noopener noreferrer">video showing off the DevEx of using Isograph</a> that I recorded with <a href="https://twitter.com/leogcrespo" target="_blank" rel="noopener noreferrer">Lenny Garcia Crespo</a>! In this video, we use Isograph to build an app powered by the GitHub GraphQL API that lists your repositories, and can be used to add and remove stars.</p>
<p>This video follows the work done in <a href="https://www.youtube.com/watch?v=B6vYKhF99Us" target="_blank" rel="noopener noreferrer">this video</a>, in which I built an app that authenticates with the GitHub OAuth API. This video isn't necessary to watch to understand the DevEx video.</p>
<p>The repository can be found <a href="https://github.com/isographlabs/demo-2024-01-22" target="_blank" rel="noopener noreferrer">here</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Isograph 0.1.0]]></title>
            <link>https://isograph.dev/blog/2024/02/15/isograph-0.1.0</link>
            <guid>https://isograph.dev/blog/2024/02/15/isograph-0.1.0</guid>
            <pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[What a milestone! Today, the Isograph team is thrilled to announce the release of Isograph 0.1.0. Isograph is ready for use on certain projects and internal tools, and though feature incomplete, provides a great developer experience!]]></description>
            <content:encoded><![CDATA[<p>What a milestone! Today, the Isograph team is thrilled to announce the release of Isograph 0.1.0. <strong>Isograph is ready for use on certain projects and internal tools, and though feature incomplete, provides a great developer experience!</strong></p>
<p>And on top of that, we're releasing this brand new documentation website!</p>
<p>So go on! Take it for a spin. Everything you need to give Isograph a try is in the <a href="https://isograph.dev/docs/quickstart/">quickstart guide</a>.</p>
<div class="theme-admonition theme-admonition-note admonition_QPa_ alert alert--secondary"><div class="admonitionHeading_V3QO"><span class="admonitionIcon_rPYT"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CktG"><p>This is a pre-1.0 release. Most Isograph APIs are likely to evolve substantially before being finalized.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="what-is-isograph-and-how-does-it-provide-such-a-great-developer-experience">What is Isograph, and how does it provide such a great developer experience?<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#what-is-isograph-and-how-does-it-provide-such-a-great-developer-experience" class="hash-link" aria-label="Direct link to What is Isograph, and how does it provide such a great developer experience?" title="Direct link to What is Isograph, and how does it provide such a great developer experience?">​</a></h2>
<p>Isograph is a framework for building React apps that are powered by GraphQL data. It has ambitions to be a framework for building apps powered by data.</p>
<p>With Isograph, developers define components and the data they need. Isograph takes care of the rest. On every save, the Isograph compiler will generate queries containing exactly the data needed by a given view (no more and no less), and wire up your app so that all of these components receive exactly the data they asked for (no more and no less).</p>
<p>Because the compiler is doing so much for you, Isograph is able to offer an amazing developer experience, free of boilerplate. Engineers can just reason locally about the file that they are modifying, and trust that the compiler will wire up their app correctly.</p>
<p>But the benefits of that go far beyond developer experience.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="the-trilemma">The trilemma<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#the-trilemma" class="hash-link" aria-label="Direct link to The trilemma" title="Direct link to The trilemma">​</a></h3>
<p>As an engineering team grows, communication and coordination become more and more difficult. There comes a time when your app becomes unstable, because no one can reason about it end-to-end anymore, and innocuous changes start leading to downtime.</p>
<p>In response, teams can add process and manual review, sacrificing developer velocity.</p>
<p>Or, they can structure their apps so that the parts are independent, and each component fetches its own data. But this comes at a cost — many network requests for duplicate data and a chaotic loading experience. Or, query declarations can become append only. Either way, your app grows sluggish over time.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="with-isograph-theres-no-tradeoff-between-velocity-stability-and-performance">With Isograph, there's no tradeoff between velocity, stability and performance<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#with-isograph-theres-no-tradeoff-between-velocity-stability-and-performance" class="hash-link" aria-label="Direct link to With Isograph, there's no tradeoff between velocity, stability and performance" title="Direct link to With Isograph, there's no tradeoff between velocity, stability and performance">​</a></h3>
<p>The Isograph compiler allows developers to reason about just the file they're modifying, generates optimized queries on every save, and never accidentally forgets to pass data to components. So, even as your team grows, Isograph allows you to maintain iteration speed, app stability and stellar performance.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="why-now">Why now?<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#why-now" class="hash-link" aria-label="Direct link to Why now?" title="Direct link to Why now?">​</a></h2>
<p>We're releasing an alpha version of Isograph in recognition of a milestone: the most important components of the Isograph developer experience have landed. In fact, you can check out the <a href="https://isograph.dev/docs/quickstart/">quickstart guide</a> and see for yourself! You can also check out <a href="https://www.youtube.com/watch?v=KgEbkH50GLo" target="_blank" rel="noopener noreferrer">this video</a> in which Robert Balicki builds an Isograph app.</p>
<p>We encourage you to try Isograph, to <a href="https://discord.gg/qcHUxb6deQ" target="_blank" rel="noopener noreferrer">join the Discord</a> and to look at the <a href="https://github.com/isographlabs/isograph/issues" target="_blank" rel="noopener noreferrer">open issues</a> on GitHub. If you want to get involved in the early stages of a project that is pushing the boundaries of what is possible in web development, we would encourage you to get involved!</p>
<p>If you have questions or guidance about whether Isograph is appropriate for you, we're happy to answer them!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="new-features">New features<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#new-features" class="hash-link" aria-label="Direct link to New features" title="Direct link to New features">​</a></h2>
<p>Quite a few features have shipped since <a href="https://www.youtube.com/watch?v=gO65JJRqjuc" target="_blank" rel="noopener noreferrer">the talk at GraphQL Conf</a>! Let's talk through the biggest ones:</p>
<div class="theme-admonition theme-admonition-note admonition_QPa_ alert alert--secondary"><div class="admonitionHeading_V3QO"><span class="admonitionIcon_rPYT"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CktG"><p>This blog post only goes into some of the features that have landed as part of this release. See the <a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0/">release notes</a> for a complete list.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="client-defined-component-fields-can-be-used-as-react-components">Client-defined <code>@component</code> fields can be used as React components<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#client-defined-component-fields-can-be-used-as-react-components" class="hash-link" aria-label="Direct link to client-defined-component-fields-can-be-used-as-react-components" title="Direct link to client-defined-component-fields-can-be-used-as-react-components">​</a></h3>
<p>The most-requested DevEx improvement has arrived! Client-defined <code>@component</code> fields can be used directly as React components!</p>
<p>For example, if we select a <code>User.Avatar</code> client-defined <code>@component</code> field in the <code>User.UserProfile</code> field, it can be rendered as <code>&lt;props.data.Avatar /&gt;</code>!</p>
<div class="language-js codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-js codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">UserProfile</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> iso</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  field User.UserProfile @component {</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    full_name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    Avatar,</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c"></span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">UserProfile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token maybe-class-name">Hello</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">full_name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">!</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">h1</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Avatar</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Major thanks to <a href="https://twitter.com/AlecAivazis" target="_blank" rel="noopener noreferrer">Alec Aivazis</a> for explaining how this is done in <a href="https://houdinigraphql.com/" target="_blank" rel="noopener noreferrer">Houdini</a>, and to <a href="https://twitter.com/cpojer" target="_blank" rel="noopener noreferrer">Christoph Nakazawa</a> for convincing me of the importance of this feature.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="users-do-not-have-to-provide-types">Users do not have to provide types<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#users-do-not-have-to-provide-types" class="hash-link" aria-label="Direct link to Users do not have to provide types" title="Direct link to Users do not have to provide types">​</a></h3>
<p>Another absolutely groundbreaking feature that landed is that the type of the parameter to client field functions is fully typed, <strong>without the user having to do anything about it.</strong> Consider the <code>UserProfile</code> example shown previously. The <code>props</code> field is fully typed, and TypeScript knows about this!</p>
<p>How this works is that the Isograph compiler generates the <code>iso</code> function, along with its types, and TypeScript can infer that we're passing an object with shape <code>{ full_name: string, Avatar: Component }</code>!</p>
<p>Major thanks to <a href="https://twitter.com/b_ez_man" target="_blank" rel="noopener noreferrer">Terence Bezman</a> for explaining how this can be done, and to <a href="https://twitter.com/AlecAivazis" target="_blank" rel="noopener noreferrer">Alec Aivazis</a> for proving this out in <a href="https://houdinigraphql.com/" target="_blank" rel="noopener noreferrer">Houdini</a>. And a huge shoutout to <a href="https://twitter.com/edmondo_po" target="_blank" rel="noopener noreferrer">Edmondo Porcu</a> for hitting the ground running and shipping such an incredibly impactful feature!</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="installable-via-yarn">Installable via yarn<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#installable-via-yarn" class="hash-link" aria-label="Direct link to Installable via yarn" title="Direct link to Installable via yarn">​</a></h3>
<p>Everything can be installed with yarn! Add Isograph to an existing project with:</p>
<div class="language-sh codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-sh codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token plain">yarn add --dev @isograph/compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">yarn add --dev @isograph/babel-plugin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">yarn add @isograph/react</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="watch-mode">Watch mode<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#watch-mode" class="hash-link" aria-label="Direct link to Watch mode" title="Direct link to Watch mode">​</a></h3>
<p>The compiler can now be run in watch mode with <code>yarn iso --watch</code>, and even provides pretty error messages:</p>
<div class="codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-text codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token plain">Starting to compile.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error when compiling.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error when validating schema, resolvers and fetch declarations.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">In the resolver `Actor.UserLink`, the field `Actor.foo` is selected, but that field does not exist on `Actor`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/Users/rbalicki/code/isograph/demos/github-demo/src/isograph-components/UserLink.tsx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  field Actor.UserLink @component {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    login,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    foo,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ^^^</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Compilation took 139ms.</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="babel-plugin">Babel plugin<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#babel-plugin" class="hash-link" aria-label="Direct link to Babel plugin" title="Direct link to Babel plugin">​</a></h3>
<p>In a huge DevEx win, Isograph now comes with a Babel plugin that replaces calls to <code>iso(`entrypoint Type.Field`)</code> with require calls to the generated entrypoint artifact. (SWC support coming soon!)</p>
<p>Now that this and the automatically-supplied types feature have landed, there is (currently) no reason for users to import any generated artifacts or types (except <code>iso</code>.)</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="entrypoints">Entrypoints<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#entrypoints" class="hash-link" aria-label="Direct link to Entrypoints" title="Direct link to Entrypoints">​</a></h3>
<p>Goodbye <code>@fetchable</code> client-defined fields, hello entrypoints! The Isograph mental model has been substantially simplified.</p>
<p>When the Isograph compiler encounters an Isograph literal of the form <code>iso(`entrypoint Query.field`)</code>, it will generate a query text for that field. This entrypoint can be passed to <code>useLazyReference</code>, which will make the network request during the initial render of a component.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="configurable-magic-mutation-fields">Configurable magic mutation fields<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#configurable-magic-mutation-fields" class="hash-link" aria-label="Direct link to Configurable magic mutation fields" title="Direct link to Configurable magic mutation fields">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_QPa_ alert alert--secondary"><div class="admonitionHeading_V3QO"><span class="admonitionIcon_rPYT"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CktG"><p>These are no longer called magic mutation fields.</p></div></div>
<p>Magic mutation fields are fields that are added to certain types. When read out, these fields are functions that trigger mutations. For example, you might configure a <code>User.set_name</code> field to call the <code>Mutation.set_name</code> mutation.</p>
<p>These are now configurable in schema extensions via the <code>@exposeField</code> directive. See the <a href="https://isograph.dev/docs/expose-field-directives/">documentation</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_oswe" id="a-brand-new-isographdev">A brand-new <a href="https://isograph.dev/" target="_blank" rel="noopener noreferrer"><code>isograph.dev</code></a><a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#a-brand-new-isographdev" class="hash-link" aria-label="Direct link to a-brand-new-isographdev" title="Direct link to a-brand-new-isographdev">​</a></h3>
<p>You're looking at it now!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="thanks">Thanks<a href="https://isograph.dev/blog/2024/02/15/isograph-0.1.0#thanks" class="hash-link" aria-label="Direct link to Thanks" title="Direct link to Thanks">​</a></h2>
<p>Isograph isn't a one-person job! I want to thank <a href="https://twitter.com/edmondo_po" target="_blank" rel="noopener noreferrer">Edmondo Porcu</a>, <a href="https://twitter.com/saminoorsyed" target="_blank" rel="noopener noreferrer">Sami Syed</a> and <a href="https://twitter.com/slightlycode" target="_blank" rel="noopener noreferrer">Marais Rossouw</a> for contributing to Isograph, and <a href="https://github.com/adrtivv" target="_blank" rel="noopener noreferrer">Adrtivv</a> for a surprise, last minute PR that didn't make it into this release! I want to thank <a href="https://twitter.com/leogcrespo" target="_blank" rel="noopener noreferrer">Lenny Crespo Garcia</a> for providing incredibly valuable feedback and recording videos with me. I want to thank <a href="https://twitter.com/mahoneymattj" target="_blank" rel="noopener noreferrer">Matt Mahoney</a>, Jens Neuse, Predrag Gruevski, Randall Bennett, Reed Harmeyer, Gabriel Nordeborn, Benjie Gillam, Terence Bezman, Alec Aivazis, Zack Jackson, Kerry Imai, Dennis Cahillane, Nicholas Shook and John Maguire for providing valuable feedback.</p>
<p>I'm sure I'm forgetting others, so I apologize in advance!</p>
<p>Isograph would not be as far along or as polished without you.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Isograph v0.1.0 release notes]]></title>
            <link>https://isograph.dev/blog/2024/02/15/release-notes-0.1.0</link>
            <guid>https://isograph.dev/blog/2024/02/15/release-notes-0.1.0</guid>
            <pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[This release is jam-packed full of amazing features and DevEx improvements!]]></description>
            <content:encoded><![CDATA[<p>This release is jam-packed full of amazing features and DevEx improvements!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="client-defined-component-fields-can-be-used-as-react-components">Client-defined <code>@component</code> fields can be used as React components<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#client-defined-component-fields-can-be-used-as-react-components" class="hash-link" aria-label="Direct link to client-defined-component-fields-can-be-used-as-react-components" title="Direct link to client-defined-component-fields-can-be-used-as-react-components">​</a></h2>
<p>The most-requested DevEx improvement has arrived! Client-defined <code>@component</code> fields can be used directly as React components!</p>
<p>For example, if we select a <code>User.Avatar</code> client-defined <code>@component</code> field in the <code>User.UserProfile</code> field, it can be rendered as <code>&lt;props.data.Avatar /&gt;</code>!</p>
<div class="language-js codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-js codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">UserProfile</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> iso</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  field User.UserProfile @component {</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    full_name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    Avatar,</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c"></span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">UserProfile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token maybe-class-name">Hello</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">full_name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">!</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">h1</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Avatar</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Major thanks to <a href="https://twitter.com/AlecAivazis" target="_blank" rel="noopener noreferrer">Alec Aivazis</a> for explaining how this is done in <a href="https://houdinigraphql.com/" target="_blank" rel="noopener noreferrer">Houdini</a>, and to <a href="https://twitter.com/cpojer" target="_blank" rel="noopener noreferrer">Christoph Nakazawa</a> for convincing me of the importance of this feature.</p>
<p><a href="https://github.com/isographlabs/isograph/commit/0c5816b09394ab6d7326b9ed1409fde81c60ca87" target="_blank" rel="noopener noreferrer">Commit</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="users-do-not-have-to-provide-types">Users do not have to provide types<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#users-do-not-have-to-provide-types" class="hash-link" aria-label="Direct link to Users do not have to provide types" title="Direct link to Users do not have to provide types">​</a></h2>
<p>Another absolutely groundbreaking feature! Users no longer have to provide any type parameters to the <code>iso</code> function. Instead, those types generated by the compiler, and thus come automatically to the developer.</p>
<p>Major thanks to <a href="https://twitter.com/b_ez_man" target="_blank" rel="noopener noreferrer">Terence Bezman</a> for explaining how this can be done, and to <a href="https://twitter.com/AlecAivazis" target="_blank" rel="noopener noreferrer">Alec Aivazis</a> for proving this out in <a href="https://houdinigraphql.com/" target="_blank" rel="noopener noreferrer">Houdini</a>. And a huge shoutout to <a href="https://twitter.com/edmondo_po" target="_blank" rel="noopener noreferrer">Edmondo Porcu</a> for hitting it out of the park with the implementation of this feature!</p>
<p><a href="https://github.com/isographlabs/isograph/commit/58a1b6bfe44e44404e165cbebe9be4e65174cec0" target="_blank" rel="noopener noreferrer">Commit</a></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="installable-via-yarn">Installable via yarn<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#installable-via-yarn" class="hash-link" aria-label="Direct link to Installable via yarn" title="Direct link to Installable via yarn">​</a></h2>
<p>Everything can be installed with yarn! Add Isograph to an existing project with:</p>
<div class="language-sh codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-sh codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token plain">yarn add --dev @isograph/compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">yarn add --dev @isograph/babel-plugin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">yarn add @isograph/react</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="watch-mode">Watch mode<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#watch-mode" class="hash-link" aria-label="Direct link to Watch mode" title="Direct link to Watch mode">​</a></h2>
<p>The compiler can now be run in watch mode with <code>yarn iso --watch</code>, and even provides pretty error messages:</p>
<div class="codeBlockContainer_lu84 theme-code-block" style="--prism-color:#393A34;--prism-background-color:rgba(0, 0, 0, 0.02)"><div class="codeBlockContent_INw3"><pre tabindex="0" class="prism-code language-text codeBlock_Ym9n thin-scrollbar" style="color:#393A34;background-color:rgba(0, 0, 0, 0.02)"><code class="codeBlockLines_OHym"><span class="token-line" style="color:#393A34"><span class="token plain">Starting to compile.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error when compiling.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error when validating schema, resolvers and fetch declarations.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">In the resolver `Actor.UserLink`, the field `Actor.foo` is selected, but that field does not exist on `Actor`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/Users/rbalicki/code/isograph/demos/github-demo/src/isograph-components/UserLink.tsx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  field Actor.UserLink @component {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    login,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    foo,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ^^^</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Compilation took 139ms.</span><br></span></code></pre><div class="buttonGroup_HcF6"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_mmah" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_mFKI"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_PG5H"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="a-brand-new-isographdev">A brand-new <a href="https://isograph.dev/" target="_blank" rel="noopener noreferrer"><code>isograph.dev</code></a><a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#a-brand-new-isographdev" class="hash-link" aria-label="Direct link to a-brand-new-isographdev" title="Direct link to a-brand-new-isographdev">​</a></h2>
<p>You're looking at it now!</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="babel-plugin">Babel plugin<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#babel-plugin" class="hash-link" aria-label="Direct link to Babel plugin" title="Direct link to Babel plugin">​</a></h2>
<p>In another DevEx win, Isograph now comes with a Babel plugin that replaces calls to <code>iso(`entrypoint Type.Field`)</code> with require calls to the generated entrypoint artifact.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="entrypoints">Entrypoints<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#entrypoints" class="hash-link" aria-label="Direct link to Entrypoints" title="Direct link to Entrypoints">​</a></h2>
<p>Goodbye <code>@fetchable</code> client-defined fields, hello entrypoints! The Isograph mental model has been substantially simplified.</p>
<p>When the Isograph compiler encounters an Isograph literal of the form <code>iso(`entrypoint Query.field`)</code>, it will generate a query text for that field. This entrypoint can be passed to <code>useLazyReference</code>, which will make the network request during the initial render of a component.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="configurable-magic-mutation-fields">Configurable magic mutation fields<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#configurable-magic-mutation-fields" class="hash-link" aria-label="Direct link to Configurable magic mutation fields" title="Direct link to Configurable magic mutation fields">​</a></h2>
<p>Magic mutation fields are fields that are added to certain types. When read out, these fields are functions that trigger mutations. For example, you might configure a <code>User.set_name</code> field to call the <code>Mutation.set_name</code> mutation.</p>
<p>These are now configurable in schema extensions via the <code>@exposeField</code> directive. See the <a href="https://isograph.dev/docs/expose-field-directives/">documentation</a>.</p>
<p>Commits: <a href="https://github.com/isographlabs/isograph/commit/700bc00d875cf99ab0cc1330dc29dcbdc2ee6909" target="_blank" rel="noopener noreferrer">1</a> and <a href="https://github.com/isographlabs/isograph/commit/453b8fbee869aa72373d30af872d37a599b9a03d" target="_blank" rel="noopener noreferrer">2</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="integer-literals">Integer literals<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#integer-literals" class="hash-link" aria-label="Direct link to Integer literals" title="Direct link to Integer literals">​</a></h2>
<p>Isograph now supports integer literals as parameters, in addition to variables.</p>
<p><a href="https://github.com/isographlabs/isograph/commit/1eeeb142f8c8f4523338fbdd9fbdd04e726af8fe" target="_blank" rel="noopener noreferrer">Commit</a></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="do-not-require-a-specific-const-export-name">Do not require a specific const export name<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#do-not-require-a-specific-const-export-name" class="hash-link" aria-label="Direct link to Do not require a specific const export name" title="Direct link to Do not require a specific const export name">​</a></h2>
<p>The name of the export is now arbitrary, as it is understood by the compiler.</p>
<p><a href="https://github.com/isographlabs/isograph/commit/d64c2813e0adcaa2c9db895212925244d120e071" target="_blank" rel="noopener noreferrer">Commit</a></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="iso-and-isofetch-are-combined">iso and isoFetch are combined<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#iso-and-isofetch-are-combined" class="hash-link" aria-label="Direct link to iso and isoFetch are combined" title="Direct link to iso and isoFetch are combined">​</a></h2>
<p>In a win for DevEx and simplicity, <code>isoFetch</code> has been replaced by <code>iso(`entrypoint ...`)</code>. Major thanks to <a href="https://twitter.com/edmondo_po" target="_blank" rel="noopener noreferrer">Edmondo Porcu</a> for working on this feature.</p>
<p><a href="https://github.com/isographlabs/isograph/commit/e5f4a357136fa9441f2f28d690aa20b72e1bf63d" target="_blank" rel="noopener noreferrer">Commit</a></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="full-support-for-the-graphql-schema-syntax">Full support for the GraphQL schema syntax<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#full-support-for-the-graphql-schema-syntax" class="hash-link" aria-label="Direct link to Full support for the GraphQL schema syntax" title="Direct link to Full support for the GraphQL schema syntax">​</a></h2>
<p>The rest of GraphQL schema syntax is now supported. (Please let us know if we missed anything!)</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="magic-mutation-fields-on-interface-types">Magic mutation fields on interface types<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#magic-mutation-fields-on-interface-types" class="hash-link" aria-label="Direct link to Magic mutation fields on interface types" title="Direct link to Magic mutation fields on interface types">​</a></h2>
<p>A magic mutation field defined on an interface type (e.g. <code>addLabelToLabelable</code>, where a <code>Labelable</code> is an interface) will now show up on concrete types that implement that interface (e.g. <code>repository { addLabelToLabelable }</code> is valid).</p>
<div class="theme-admonition theme-admonition-note admonition_QPa_ alert alert--secondary"><div class="admonitionHeading_V3QO"><span class="admonitionIcon_rPYT"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CktG"><p>There is a <a href="https://github.com/isographlabs/isograph/issues/18" target="_blank" rel="noopener noreferrer">great first issue</a> to do the same for client-defined fields.</p></div></div>
<p><a href="https://github.com/isographlabs/isograph/commit/34f0627415fb55cfe6d241a7cc20f6dcf0ed16d5" target="_blank" rel="noopener noreferrer">Commit</a></p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="beautiful-error-messages">Beautiful error messages<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#beautiful-error-messages" class="hash-link" aria-label="Direct link to Beautiful error messages" title="Direct link to Beautiful error messages">​</a></h2>
<p>The compiler now prints pretty error messages.</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="ci">CI<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#ci" class="hash-link" aria-label="Direct link to CI" title="Direct link to CI">​</a></h2>
<p>There is now a GitHub CI pipeline that:</p>
<ul>
<li>builds the compiler and demos</li>
<li>runs unit tests</li>
<li>ensures no changes occur after <code>yarn format</code></li>
<li>publishes the website</li>
<li>publishes new versions of the site</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="isograph-environment-is-held-in-context">Isograph environment is held in context<a href="https://isograph.dev/blog/2024/02/15/release-notes-0.1.0#isograph-environment-is-held-in-context" class="hash-link" aria-label="Direct link to Isograph environment is held in context" title="Direct link to Isograph environment is held in context">​</a></h2>
<p>The Isograph environment is held in context now, and there are associated changes to the API.</p>
<p><a href="https://github.com/isographlabs/isograph/commit/6425bd62fca85bf59ca5dc36f0af897022c7de2a" target="_blank" rel="noopener noreferrer">Commit</a>
<a href="https://github.com/isographlabs/isograph/commit/38d73d29729521337e7086b435aad13ff6180d40" target="_blank" rel="noopener noreferrer">Commit</a>
<a href="https://github.com/isographlabs/isograph/commit/c861b6cf03f5f2508fcda72266c9cd54df872351" target="_blank" rel="noopener noreferrer">Commit</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GraphQL Conf 2023]]></title>
            <link>https://isograph.dev/blog/2023/09/20/graphql-conf-posted</link>
            <guid>https://isograph.dev/blog/2023/09/20/graphql-conf-posted</guid>
            <pubDate>Wed, 20 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Please check out this presentation about Isograph at GraphQL Conf 2023. Please also see the slides.]]></description>
            <content:encoded><![CDATA[<p>Please check out this <a href="https://www.youtube.com/watch?v=gO65JJRqjuc" target="_blank" rel="noopener noreferrer">presentation about Isograph</a> at GraphQL Conf 2023. Please also see <a href="https://docs.google.com/presentation/d/1ffot9Dmy2Z5YFnr6hEjAlr_Fn4Nrzc-zEnFK54QA6Jo/edit#slide=id.g27f8644aff7_0_1" target="_blank" rel="noopener noreferrer">the slides</a>.</p>
<p>In this presentation, Robert Balicki covers:</p>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="introduction-and-motivation">Introduction and motivation<a href="https://isograph.dev/blog/2023/09/20/graphql-conf-posted#introduction-and-motivation" class="hash-link" aria-label="Direct link to Introduction and motivation" title="Direct link to Introduction and motivation">​</a></h2>
<ul>
<li>The many steps that one goes through when one extracts a child component</li>
<li>Data masking, and why it is important</li>
<li>The fundamental tension at the heart of GraphQL: it is a language for querying servers being used to provide isolation to front-end components</li>
<li>The big idea: <strong>every fragment is associated with exactly one function</strong></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="isograph">Isograph<a href="https://isograph.dev/blog/2023/09/20/graphql-conf-posted#isograph" class="hash-link" aria-label="Direct link to Isograph" title="Direct link to Isograph">​</a></h2>
<ul>
<li>The developer experience that Isograph aims to provide</li>
<li>The other big idea: <strong>resolvers are GraphQL's missing primitive</strong></li>
<li>How in Isograph, <strong>everything is a resolver</strong></li>
<li>How in Isograph, even components can be resolvers</li>
<li>How entrypoints work in Isograph</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="why-resolvers-are-the-unit-of-abstraction">Why resolvers are the unit of abstraction<a href="https://isograph.dev/blog/2023/09/20/graphql-conf-posted#why-resolvers-are-the-unit-of-abstraction" class="hash-link" aria-label="Direct link to Why resolvers are the unit of abstraction" title="Direct link to Why resolvers are the unit of abstraction">​</a></h2>
<ul>
<li>If we achieve data masking, we're already using resolvers</li>
<li>Deferring data and code together is natural</li>
<li>Resolver components let us reason about the on-screen-ness of data</li>
<li>Imperatively loaded resolvers are entrypoints</li>
<li>Server executed resolvers are regular ol' GraphQL resolvers</li>
<li>Conditionally loaded resolvers are <code>@match</code> and Relay 3D</li>
<li>Resolvers can lead to better DevTools and application-creation tools</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="a-demonstration-of-isograph-roberts-pet-list-3000">A demonstration of Isograph: Robert's Pet List 3000™<a href="https://isograph.dev/blog/2023/09/20/graphql-conf-posted#a-demonstration-of-isograph-roberts-pet-list-3000" class="hash-link" aria-label="Direct link to A demonstration of Isograph: Robert's Pet List 3000™" title="Direct link to A demonstration of Isograph: Robert's Pet List 3000™">​</a></h2>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="the-roadmap">The roadmap<a href="https://isograph.dev/blog/2023/09/20/graphql-conf-posted#the-roadmap" class="hash-link" aria-label="Direct link to The roadmap" title="Direct link to The roadmap">​</a></h2>
<h2 class="anchor anchorWithStickyNavbar_oswe" id="qa">Q&amp;A<a href="https://isograph.dev/blog/2023/09/20/graphql-conf-posted#qa" class="hash-link" aria-label="Direct link to Q&amp;A" title="Direct link to Q&amp;A">​</a></h2>
<ul>
<li>Is it worth writing your own Isograph language, instead of reusing GraphQL?</li>
<li>What is the migration path from Relay to Isograph? Can it be automated?</li>
<li>How does Isograph handle client resolver and server field name collisions?</li>
<li>Is Isograph a bundler?</li>
<li>How tied is Isograph to React, GraphQL and JavaScript?</li>
</ul>
<p>I hope you check it out!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Isograph]]></title>
            <link>https://isograph.dev/blog/introducing-isograph</link>
            <guid>https://isograph.dev/blog/introducing-isograph</guid>
            <pubDate>Tue, 20 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Please check out this Substack article announcing Isograph! This article covers the intended developer experience of Isograph, and future features, such as:]]></description>
            <content:encoded><![CDATA[<p>Please check out this <a href="https://isograph.substack.com/p/introducing-isograph" target="_blank" rel="noopener noreferrer">Substack article</a> announcing Isograph! This article covers the intended developer experience of Isograph, and future features, such as:</p>
<ul>
<li>magic mutation fields (though not called such in the article),</li>
<li>deferred resolvers,</li>
<li>entrypoints, and</li>
<li>injected analytics code.</li>
</ul>
<p>It also makes the case that Isograph will be well-suited for apps that prioritize correctness, because:</p>
<ul>
<li>type of every field is very informative (e.g. the type of a field might indicate whether the field was unfetched, errored, null or present), and</li>
<li>precise control over how to handle each state (e.g. to suspend when reading the resolver if the field is unfetched).</li>
</ul>
<p>Thank you!</p>]]></content:encoded>
        </item>
    </channel>
</rss>