Dominic Gannaway

@trueadm.dev

I'm a software engineer at OpenAI. Author of Inferno, Lexical, Ripple and Octane. Former React core team engineer, and core maintainer of Svelte.

Happy to announce Octane – the successor to Inferno. React’s programming model, compiled. Hooks, Suspense and Actions, compiled ahead of time. No virtual DOM. No Rules of Hooks. No manually maintained dependency arrays. The compiler understands what your code. octanejs.dev

// Counter.tsrx — hooks next to output, no rules of hooks
import { useState, useEffect } from 'octane';

export function Counter(props) @{
	const [count, setCount] = useState(0);

	// A hook behind a condition is fine — slots are
	// assigned by call site, not call order.
	if (!props.paused) {
		useEffect(() => {
			console.log('count is now', count);
		}); // the compiler infers [count]
	}

	<button onClick={() => setCount(count + 1)}>{'Count: ' + count}</button>
}

I'm excited to share that I’ll be joining OpenAI next month as a Member of Technical Staff. 🎉 I'll be joining the ChatGPT Web Infrastructure team in London.

TSRX now supports Vue Vapor! Plus we've extended the runtimes support to include Preact. We will soon have an MCP server for TSRX so you can plug it into your favorite AI agent. TSRX is still alpha, so we're looking for early feedback from the Vue community tsrx.dev/getting-star...

Vue + Vite
Install the Vue compiler, its Vite plugin, the Vue runtime, and the Vapor JSX plugin:

 pnpm install @tsrx/vue @tsrx/vite-plugin-vue vue vue-jsx-vapor
Then wire both plugins into your Vite config (order matters — tsrxVue first):

 import { defineConfig } from 'vite';
 import tsrxVue from '@tsrx/vite-plugin-vue';
 import vueJsxVapor from 'vue-jsx-vapor/vite';

 export default defineConfig({
   plugins: [
     tsrxVue(),
     vueJsxVapor({
       macros: true,
       compiler: { runtimeModuleName: 'vue-jsx-vapor' },
     }),
   ],
 });
@tsrx/vite-plugin-vue compiles .tsrx modules into Vue-flavoured TSX, and vue-jsx-vapor/vite performs the downstream Vapor JSX transform. For editor typechecking, set jsxImportSource: "vue-jsx-vapor" in your tsconfig.json.

Happy to announce TSRX. Think of it as the spiritual successor to JSX. We extracted it from Ripple, and made it framework agnostic. It can compile to React, Ripple and Solid, other frameworks to come soon. tsrx.dev

 export component Greeting({ name }: { name?: string }) {
   <div class="card">
     if (name) {
       <p>{`Hello, ${name}`}</p>
     } else {
       <p>{'Hello, stranger'}</p>
     }
   </div>

   <style>
     .card { padding: 1rem; }
   </style>
 }

RippleJS has changed name, and is now RippleTS! This addresses the issues we had with transferring the GitHub and npm orgs (long story), and also giving the project more identity compared to existing projects with a similar name

RippleJS has improved quite a bit! 🔥 - new reactivity syntax that uses `track` and @ - support for index and keyed for loops - `clsx` built in to class attributes - #[] and #{} shorthand for TrackedArray and TrackedObject - <head> support - many, many bug fixes

export component App() {
  // This is a tracked array using #[] syntax
  let cities = #['London', 'New York', 'Tokyo', 'Sydney'];

  // index and key syntax has shipped
  for (const city of cities; index i) {
    <div>{i + ' - ' + city}</div>
  }

  <button onClick={() => {
    cities.push(randomCity());
  }}>{"Add random city"}</button>

  <head>
    <title>{"You can also update the title!"}</title>
  </head>
}

Innovation in open source only works when you share and collaborate. Being transparent and honest is always the best policy. It might not always feel great, you’ll get a bunch of negativity but it’s often offset by positivity.

Pawel Kozlowski@pkozlowski.bsky.social · 11mo ago

I'm so happy that @trueadm.dev shares his learnings in the open. There are 2 problems very close to my hart being explored here: - reactivity / rendering dance; - modern authoring format. Some will claim that UI fwks are "solved problem". I don't agree. There is still so much room for improvement!

I've given up with VS Code Copilot. The amount of endless cycles it does has driven me mad. Claud Code has proven far better. If anyone else is having the same issues, make the change. It's night and day compared.

I've had so many folks ask now, that I had to go for it. You asked me to build that ideal Inferno X framework that I described ages ago, so I went ahead and did just that. I built something that actually works and, well, it works well. Oh, and doesn't use signals!

I’m sharing the news that after nearly 2.5 years, I’ll be leaving Vercel at the end of this week. It’s been an awesome ride, and I’ve had the privilege of working with so many great folks on a bunch of different projects.

Recently I was hacking on a new framework idea. I called it Inferno X. The big difference was that it forked JSX. Rather than being expression based, it was statement based. This meant that JavaScript control flow could be used to express the template.