Dominic Gannaway's Avatar

Dominic Gannaway

@trueadm.dev

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

2,207
Followers
129
Following
215
Posts
02.11.2024
Joined
Posts Following

Latest posts by Dominic Gannaway @trueadm.dev

it would be good to capture what that is too, it's good for the Solid community to know the organic growth numbers and understand the numbers to know where to prioritize efforts.

23.02.2026 22:03 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

How much of that is coming from TanStack DevTools wrapping Solid as a dependency?

23.02.2026 18:58 πŸ‘ 7 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

We’re so happy to have Thomas here at Attio!

03.02.2026 22:54 πŸ‘ 5 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Totally agree, I just push people to use WhatsApp, also notifications don’t seem to reliably work. Speaking of DMs, did you get the one I sent you last week?

31.01.2026 23:51 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 1
Preview
Web Infrastructure Engineer Help shape the web infrastructure that powers Attio’s product

We're still looking for a web infrastructure engineer to join my team at Attio.

If anyone is from the UK/EU and is interested and you love JS/TS performance, tweaking and building frameworks/libraries that enable other engineers to move faster – check out the spec:

attio.com/careers/web-....

06.01.2026 14:39 πŸ‘ 12 πŸ” 3 πŸ’¬ 1 πŸ“Œ 0

Maybe DM me to find more, I really hate the character limits, it stagnates conversation and information and is literally terrible. To the point where I'm not really on this platform – also because 90% of converstation seems to occur on Twitter.

07.12.2025 21:39 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

contentEditable is a state mayhem where thing need to happen in a certain order, or things break. It's the most stateful part of the the entire DOM spec. There is literally no way to make it controlled unless you don't want a good UX (see Slate).

07.12.2025 21:37 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Content editable is a messy place where you can’t control it - as everything around it just mutates it directly. Sometimes without firing an event to tell you why! So it can never really be controlled for that reason. IME is a good example - its a temporary mode where the content is changing

07.12.2025 15:19 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

At the end of the day the most important facet people have is loading and reading the editor data format that exists in their database. So the requirements largely come from people’s existing system requirements, thus it being value based. Although lexical doesn’t hold you to that contract

07.12.2025 15:16 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

I'm not going to lie. I love monorepos, but I also hate them when things go wrong or things are slow. I'm so conflicted right now.

10.11.2025 23:08 πŸ‘ 12 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0

Sorry? I’m not sure what you mean

05.11.2025 00:23 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

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

03.11.2025 18:53 πŸ‘ 34 πŸ” 1 πŸ’¬ 3 πŸ“Œ 0

@anthonyshort.bsky.social hey I’m the author of RippleJS. Would you be up for a chat to help the team resolve the GitHub issue around transferring the org? Thank you!

28.10.2025 21:59 πŸ‘ 4 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Sounds like a plan

01.10.2025 20:57 πŸ‘ 3 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
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>
}

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> }

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

01.10.2025 20:09 πŸ‘ 38 πŸ” 0 πŸ’¬ 3 πŸ“Œ 2

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.

19.09.2025 22:03 πŸ‘ 24 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

A reverse journey in some ways

18.09.2025 23:42 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

The team behind RippleJS has heard the feedback around the $ prefixed reactivity and we agree – the design wasn't quite there. So we've proposed an alternative.

github.com/trueadm/ripp...

17.09.2025 20:48 πŸ‘ 15 πŸ” 1 πŸ’¬ 2 πŸ“Œ 1

I did that to start with but it’s not practical. You need to differentiate what expressions get rendered vs things you don’t want rendering.

12.09.2025 12:49 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

I did. I turned it off as it was always getting in my way.

03.09.2025 08:50 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

I also use GitHub. Ripple is open source. Getting it to fix Prettier plugins issues is another thing though

02.09.2025 23:46 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

I wish it could solve more, but the amount of aversion has been insane. It makes so much doubt as to whether or not continue this

02.09.2025 23:30 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

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.

02.09.2025 22:58 πŸ‘ 13 πŸ” 1 πŸ’¬ 2 πŸ“Œ 0

Any designers out that would like help create a great logo?

github.com/trueadm/ripp...

What we have now isn't great, but a great logo makes a big difference.

02.09.2025 21:24 πŸ‘ 4 πŸ” 2 πŸ’¬ 0 πŸ“Œ 0

They already work, just haven't documented them. See the github issue about async :) expect bugs too!

02.09.2025 15:43 πŸ‘ 1 πŸ” 0 πŸ’¬ 2 πŸ“Œ 0

I can't seem to repro on my MacBook for FF. Can you help me out by maybe disabling the blackground CSS animations and seeing if that helps improve performance for you?

02.09.2025 13:08 πŸ‘ 0 πŸ” 0 πŸ’¬ 2 πŸ“Œ 0

Okay thanks. I’ll look into it :)

02.09.2025 09:52 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

It's probably from the typewriter effect, does it go away once typed out?

02.09.2025 08:25 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Yeah the plan is to have it support different outputs, the next being server JS and then supporting different custom outputs for native

02.09.2025 08:21 πŸ‘ 6 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Thanks, there was a bug in the Prettier plugin that was causing this. Fixed now :)

02.09.2025 08:20 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0