89: Hot Takes, TanStack, and Open Source with Tanner Linsley
Tanner Linsley, Co-Founder and VP of UI/UX at Nozzle is known for creating some of the most popular open-source libraries in the tech space. These libraries keep the wheels turning by making things easier for him and many other developers in their day-to-day jobs.
Tanner has built libraries, such as React Query and React Table, that are now part of TanStack, his branded collection of tools. TanStack's other products include a router currently in beta, TanStack Query Table, TanStack Virtual, and TanStack Ranger. Tanner explains that he started building these tools while working on his SEO analytical platform, Nozzle, where they were created to solve the challenges he faced while developing the platform. It hasn’t been easy managing the expectations of users and maintaining open-source projects without major funding, but Tanner has made an impact in the community nonetheless.
In this episode, Tanner talks to Robbie and Chuck about his take on trending tech topics, his popular open-source libraries in TanStack, and his future framework plans.
- [00:24] - Introduction to Tanner Linsley.
- [01:33] - A whiskey review: MONDAY Zero Alcohol Whiskey.
- [11:55] - Tech hot takes.
- [29:14] - What is TanStack?
- [35:17] - What is a framework?
- [45:08] - Tanner’s non-tech hobbies.
[19:47] - “The ultimate UI that existed before so many other UI’s is Excel.” ~ Tanner Linsley
[24:22] - “Anytime you do anything outside of React, with state management, it’s all going to come back to use-sync-external-store.” ~ Tanner Linsley
[34:55] - “I have really big eyes for Solid right now. Even though almost everything I do is still in React. I stare at the greener grass every day, every day, for Solid.” ~ Tanner Linsley
- Tanner Linsley Twitter
- Tanner Linsley LinkedIn
- MONDAY Zero Alcohol Whiskey
- MONDAY Whiskey Sour Kit
- Saturday Night Live
- Ana de Armas
- Diet Coca Cola
- Tailwind CSS
- Ryan Carniato
- Solid JS
- Preact JS
- Astro JS
- Dominik Dorfmeister
- Adobe Creative Cloud
- React Summit
- React Rally
- Kent C. Dodds
Robbie Wagner: [00:09] What's going on, everybody? Welcome to another episode of Whiskey Web and Whatnot with myself, RobbieTheWagner, and my co-host, as always, Charles William Carpenter III. I've always got to pause and see if you're done with whatever you're doing there. Okay. Our guest today is Tanner Linsley. How's it going, Tanner?
Tanner Linsley: [00:29] Pretty good. How are you guys doing?
Robbie Wagner: [00:31] Doing well. Doing well.
Chuck Carpenter: [00:32] Excellent. Thank you.
Robbie Wagner: [00:34] Though, the listeners that have not seen you posting things on Twitter and around and whatnot, if you want to give a little intro into who you are and what you do.
Tanner Linsley: [00:42] Sure. So I'm a software engineer, primarily front end, but I'm capable of full stacking things if I need to. I spend a lot of time in open source, so over the years, I've built a lot of open source libraries. Some of them have gotten pretty popular. React Query and React Table, which are now kind of under the TanStack brand. And yeah, a couple of other TanStack libraries that we're working on. And then, most recently been a lot of chatter around a router that I'm working on. And, yeah, spend a lot of time in open source. And I also have a company with some friends called Nozzle. It's an SEO analytical platform. So we do data aggregation and gathering around marketing and SEO.
Chuck Carpenter: [01:32] Cool, nice.
Robbie Wagner: [01:33] Yeah, we'll dive a lot more into some of that stuff here in a bit, but we always start with whiskey.
Chuck Carpenter: [01:39] So today we have MONDAY's Zero Alcohol Whiskey. I know we've tried a couple of these on the show, so we decided to make a slight change here and get one of their cocktail mocktail kits. It's the whiskey sour kit. No calories, no carbs, too, so I know that's important to Robbie. Made by an award-winning whiskey maker, and then things like aging and whatnot don't quite apply in the same ways. So this one will be a whiskey sour with a bitter milk cocktail mixer, has smoked honey and other parts of the whiskey sour sour stuff, citrusy things.
Tanner Linsley: [02:18] Few calories in there for Robbie, not too many.
Chuck Carpenter: [02:21] The whiskey has no calories, but then it looks like this has 30 per ounce. Think we can live with that?
Robbie Wagner: [02:27] That's still reasonable.
Chuck Carpenter: [02:28] Yes. So we'll be mixing the smoked honey whiskey sour. We'll have 2oz of MONDAY whiskey, which I will be completely making up because I didn't bring a jigger or any measuring device. But that's okay. We just eye it.
Robbie Wagner:[02:41] Yeah, I poured a little bit of the whiskey and then a little bit of the bitter milk and then a little more whiskey. And that seems right, right.
Tanner Linsley: [02:49] I'm just going to have to go off of what you guys do. I don't know what's going on here.
Chuck Carpenter: [02:52] Yeah, well, you want to do more?
Robbie Wagner:[02:54] Mine looks like this.
Chuck Carpenter: [02:55] Of the whiskey? Yeah. I don't know. So it's basically a two-to-one, give or take. So, like, whatever you're putting in here. I have these fancy plastic cups, those that are listening and can't see. And then you'll just put half of that. As much of the other stuff. It says mix it on ice. So I've got a little cup of ice I'll mix it into.
Robbie Wagner: [03:16] Then we have these little dried fruit thingies, but they say they're best buy a couple of months ago. I'm still going to chance it and throw one in there, but.
Chuck Carpenter:[03:25] Dried fruit, I mean.
Robbie Wagner: [03:26] Don't feel obligated.
Chuck Carpenter: [03:29] I put worse things in my body for sure.
Tanner Linsley: [03:31] Can't go wrong. Right.
Chuck Carpenter: [03:32] Let's see here. Oh, actually, I was going to try the whiskey on its own. Just for fun, just for me. No one else needs to do that.
Robbie Wagner: [03:44] Just to compare to the previous one.
Chuck Carpenter: [03:46] Yeah. What's it like starting, and then how much better or worse does it get within the cocktail itself? It has kind of like a dried orange smell to it.
Robbie Wagner: [03:57] Yeah, I think this one smells much different.
Tanner Linsley: [03:59] There's a lot of orange coming off of mine.
Chuck Carpenter: [04:01] Yeah, I'm getting a lot of that. Maybe a little bit of, like, nutmeg.
Robbie Wagner: [04:07] Yeah, I get a lot of smells out of the cocktail, but.
Tanner Linsley: [04:10] Very citrusy.
Chuck Carpenter: [04:11] Yes, get a lot of citrus. Slight honey. This is just in the whiskey, so I haven't tried the cocktail quite yet. I will do that. I think I'll be having this with ice.
Robbie Wagner: [04:23] Yeah. The cocktail is quite spicy. It's like Christmasy in a glass.
Chuck Carpenter: [04:29] A slight diversion here. I don't know if anybody watches SNL. This past weekend's SNL with Ana De Armas, and they did this funny skit where they're like they're doing these, I don't know, like backup. They're not singing, but they're just like doing recording one-off things for this rapper to put into his song. And the rapper is spicy, and they're like, oh, spicy. Anybody see that? Anyway? No. Popped into my head.
Robbie Wagner: [04:57] Sounds like it'd be good, though.
Chuck Carpenter: [04:58] It was pretty funny. It's recommended even if you YouTube the clip. That's enough. All right. Yes. Very juicy. A lot of citrus.
Robbie Wagner: [05:10] I think it's very pleasant. It's maybe got a little more spice than I would want if I were having several of these, but all the flavors are very pleasing. It's like a lot of citrus. Definitely, the little garnish helps with some citrus smells. I don't know. It's good to me.
Tanner Linsley: [05:29] It's very fruity. I had no idea what to expect. And it's very sweet.
Chuck Carpenter: [05:34] Yeah.
Tanner Linsley: [05:35] Very sweet, very fruity.
Chuck Carpenter: [05:37] Slight bit of spice. So it almost makes me feel like if you have, like, a Christmas or wintertime punch, kind of.
Robbie Wagner: [05:44] Yeah. And for 30 calories, I could do this versus many drinks have many more calories than that.
Chuck Carpenter: [05:52] Right. Even as you talk about a juice, in general, juice has quite a bit more, so this is more subtle. Yeah. I mean, it stacks up decently on its own in terms of.
Tanner Linsley: [06:03] For never having anything remotely close to this or literally any alcohol in my life.
Chuck Carpenter: [06:09] No.
Tanner Linsley: [06:09] I was expecting the fake stuff to probably be a little more burny somehow. Like, fake it somehow.
Chuck Carpenter: [06:18] That would be an interesting thing. I can't imagine anyone who hasn't or doesn't drink desiring that burn.
Tanner Linsley: [06:26] No. When I got curious, though, and started researching the brand, they say to simulate it, they use capsaicin. And I don't know if they use that in this one, but there is something in there that gives a tiny tiny bit of a spicy.
Chuck Carpenter: [06:44] Yeah, like a little bit in the back of your throat. You get some spice, and I wouldn't equate it quite to the burn of alcohol, but I definitely get some of the spiciness of that. Now that you say that.
Robbie Wagner: [06:56] A little bit of the hug.
Chuck Carpenter: [06:57] Yeah.
Tanner Linsley: [06:57] It's probably hiding in the natural flavors, ingredients.
Chuck Carpenter: [07:03] Yeah. I wonder if the more you have, the more that kind of builds up with spice in general. You start to experience it more and more. So we were talking a little before we started to record about how you might want to consider and classify this. We do the fun rating system of one to eight tentacles. One being, this is terrible. I never want it again. Eight. It's amazing. Robbie and I have started categorizing things to a degree. So, I mean, you could think of this as in, like, hey, a little winter punch or social beverage that you would have with other friends in that way, maybe give it a rating one to eight, see what you think.
Tanner Linsley: [07:45] I feel like it's better than I expected, and relative expectations have a lot to do with rating systems.
Chuck Carpenter: [07:55] Indeed.
Tanner Linsley: [07:56] It's probably up there. I'd say it's like a six. I feel confident enough that if I had some of my friends come over and be like, hey, guys, want to try this random non-alcoholic thing? I'd feel confident that some of them would probably be like, it's all right. And some of them be like, hey, that's not bad. That's kind of where I sit. It's really not bad.
Robbie Wagner: [08:19] Yeah.
Tanner Linsley:[08:20] I myself am a I'm a soda drinker big time. It's a different kind of burn, but, like, really high carbonation sodas. And I just love it when they're freezing cold. So it's not super within my wheelhouse, but it's definitely not bad.
Chuck Carpenter: [08:40] Well, on the recipe card here.
Tanner Linsley: [08:41] I'll probably end up drinking all mine. Yeah, I think that's another thing, too, is, like, if it sits in front of you, are you going to end up drinking all of it? And I think I will.
Chuck Carpenter: [08:50] Well, there's a variation on the recipe card. You could do a spritz and top with soda water for effervescence. That might just take it over the top for you.
Tanner Linsley: [08:58] I saw that, and I'm sure my wife, she's like, well, I'm not super interested, but I am curious. I'm like, well, put a little bit in your diet Coke, see what you think.
Chuck Carpenter: [09:09] Okay. Yeah, that might be interesting. Yeah, I happen to have a Diet Coke here. I might have to try that combination myself.
Robbie Wagner: [09:17] Yeah, I think it would go well, personally.
Tanner Linsley: [09:19] I'm definitely addicted to Diet Coke and diet soda, so that's definitely something I'll be trying out.
Chuck Carpenter: [09:26] Nice.
Tanner Linsley: [09:27] Got a six-month egg timer on this bottle, so.
Chuck Carpenter: [09:31] You got to get to it somehow.
Tanner Linsley: [09:32] Yeah.
Chuck Carpenter: [09:34] Well, Robbie, what do you think?
Robbie Wagner: [09:36] Yeah, I think it's pretty good. I probably should try some on its own. Let me do that really fast.
Chuck Carpenter: [09:42] Okay.
Robbie Wagner: [09:42] Because we did that with the other ones, we had tried just to get a good comparison.
Chuck Carpenter: [09:46] Yeah. And while you do that, I can go ahead and speak to it since I did that. So yeah, I guess I would have two facets to my feedback, and review is that independently, as a non-alcoholic spirit, in quotes, this is by far the best one that I've had, even on its own. It has a lot of citrus notes there and a little bit of nutmeg in it, and so there's some flavor there. It goes down real easy, like a juice. But that's okay. That's kind of like what we expect out of this. Not going to really get much hug otherwise. I do feel it building up in the back of my throat, though, like you're saying. So I think that might come to be and give me that same sensation. So if I'm looking in the non-alcoholic spirits realm, this wins. And this is a solid, like, eight for me. This is very much the best one. And then the cocktail itself kind of just adds another dimension to it. And I don't know if I should be, maybe in terms of non-alcoholic social beverages or something, just something I would sip on. Like, this is pretty tasty, so I'm probably putting it up there around a Seven, six, or Seven, something like that. It's like if I was thinking of something like an Italian soda or this, I would put a little bit of soda on that, and it would even it out and make it very refreshing, I think. So I think I'm going to go seven.
Tanner Linsley: [11:01] Agreed.
Robbie Wagner: [11:01] Yeah. I'm pretty close to everything you said there, so I tried it on its own, and it is for sure the best one, the non-alcoholic ones we've had. So, yeah, I'll do an eight for that. And the cocktail. I would not be displeased if I ordered this out somewhere and paid $10 or more for it and got this flavor. It's good. So I would even go so far as to say an eight for a non-alcoholic cocktail as well, just because we haven't tried any other cocktails, and I have nothing bad to say about it, really.
Chuck Carpenter: [11:29] Well, we picked a winner here.
Robbie Wagner: [11:30] Yeah.
Chuck Carpenter: [11:31] Good for you, Tanner. You didn't get one of those gross ones. Yeah, to be fair, though, that's a gross coming from us. And the folks that tried them since they didn't really have context. It was also kind of similar circumstances, never having had alcohol before, so there was no context in comparison. They were like, this isn't bad, and we were like, this is disgusting.
Tanner Linsley: [11:49] This is great. You set the bar really high out of the gate.
Chuck Carpenter: [11:52] Yeah, absolutely. All right, let's talk about technology-like things.
Robbie Wagner: [11:59] Yeah. We've been trying to start with a little section of hot takes just to see what your opinions are on a few things. So we'll do those first.
Tanner Linsley: [12:07] Yeah.
Robbie Wagner: [12:08] So with TypeScript, do you like inferred types or explicit types?
Tanner Linsley: [12:14] I know there's a lot of hot takes out there on this topic. It's really situational for me, to be honest, but if I were just have to pick one across the board for a bullseye for people to hit, I'd just say go for inferred types as much as possible. You'll end up shooting yourself less in the foot, in my opinion.
Robbie Wagner: [12:35] Yeah.
Tanner Linsley: [12:36] If you do that. But I have my own nefarious purposes for explicit types everywhere in the stuff that I work on.
Chuck Carpenter: [12:44] Yeah, I think context-wise, there's the big disparaging difference in It, right? You're working on libraries that lots of people are using, and so you might have one opinion in that context and then working on applications specifically completely different context, just because they give versus ingestion.
Tanner Linsley: [13:05] The explicit type like that escape hatch comes in mostly when you're building libraries, and a lot of it comes down to in libraries, usually you're masking some level of magic. With everything to the outside world is going to look just super straightforward and simple and perfectly typed. So at function boundaries, if I were to rely on inference for all of my function boundaries for all of my libraries, it wouldn't give me that much value internally, and I very much could break the library, like break the types a lot because I'm changing implementation details. Whereas if I have an explicit API that I know I've designed ahead of time, and the implementation is simply that just an implementation, then I'll have my in and my out on my function signature and then everything in between in the function I'm just kind of like, okay, let's just make it work. And at the very end, yeah, sometimes I'm just like, return this thing as any. It's got to be that way. I don't do that in my apps, though, so it's a very different It's situational like I said.
Robbie Wagner: [14:20] Yeah.
Tanner Linsley: [14:21] But for most people, sticking to inference is usually the best idea.
Robbie Wagner: [14:25] Yeah, I think I agree with that. Inferred is just easier, but there are definitely times when you need to an escape hatch. Yeah, that makes sense. Okay, let's see, git rebase or get merge.
Tanner Linsley: [14:39] I used to be on Team Git Merge, but there are reasons that I guess that's bad. So lately, I've been doing a lot more rebasing just because I'm bouncing around between future branches a lot, and I got to make sure that things are coming in in order, right? So I'll do my rebases in order and handle the conflicts throughout the rebase. But recently, I've had a couple of rebases go wrong where I'm trying as hard as I can, and it just doesn't come out well. And so I will kind of just have to go back to merge, and I'll just merge everything. And after I did that, it kind of ended up the way that I wanted it to, and just had to kind of go back and check and make sure that I didn't lose anything that I would have otherwise had with a rebase. So by default, I rebase most of the time, and then if I get lazy, I'll just merge it in, call it a day, merge it in and fix it after the fact.
Chuck Carpenter: [15:40] Yeah, right.
Robbie Wagner: [15:41] I think that's fair.
Chuck Carpenter: [15:42] Yeah, that's the distinction too. Not to say that lazy is always bad, but I do think that merge is the hit-it now, and then we'll see what happens. Yeah.
Robbie Wagner: [15:51] And I wouldn't say that it's. I wouldn't call it lazy. Like the times that I would reach for it is like you go to rebase, and there are like 350 commits you need to rebase against, and I'm like, no, that one's going to be a merge, and we're going to just make that work.
Chuck Carpenter: [16:06] Like long-running branches.
Tanner Linsley: [16:08] Merge and just accept the conflicts where they are. For me, it's like, essentially, where do I want to manage the conflicts, right? Do I want to manage them where they originated, or do I want to squish them all together and manage them once?
Robbie Wagner: [16:23] Right.
Tanner Linsley: [16:23] And to me, it's kind of like you said, if there's so much stuff to rebase, you're just like, no, that's not a productivity booster at that point. Right.
Robbie Wagner: [16:33] Right. Let's see. Tailwind or Vanilla CSS.
Tanner Linsley: [16:37] Tailwind all the way. I know I'm going to get crap for that. Everybody does who says they like Tailwind. And even if, even if you say vanilla CSS, you'll get crap for that too.
Robbie Wagner: [16:46] Yes.
Tanner Linsley: [16:46] It's crap either way. But I do love Tailwind. I've been using it for a while now, and I like it. There's a couple of things that I use with it to make it scale a little bit, in my opinion. I use the class names utility a little bit here and there to do conditional classes just to make it easier to do that. And then I also use a tool called TW Merge, Tailwind Merge. And that is, essentially, I do what Tailwind tells you not to do. They say don't create components that compose classes together, right? And I'm like, well, I don't like that because, for me, I don't want to have to create abstractions on top of any of the Tailwind tokens at all. So anytime somebody's like, we'll just do a variation. Just do a variation, right, where you have this button success variation or something like that, right? They're like, oh, do a variations API. And I'm like, no, I don't like that because I just want to customize one-off things and override them. And I want to compose components together in layers to kind of get the functionality they want. And as soon as you start doing that, eventually, you'll have classes that come in, and you're like, well, order kind of matters now as you're composing these classes together, like, the ones you pass in later should override the ones you gave earlier. That's not how CSS and classes work. So this little Tailwind utility, TW Merge, will take the classes in in the order that you give it, and left to right, the ones on the right will have higher precedent. And it's smart. It has an internal mapping system to say, okay, you passed in P2, and it knows that any of the other classes before they came in in the padding channel are going to get overwritten by this one. Right? So it's smart about the way that it composes the classes together instead of just, like, concatenating them on. It will actually remove ones from the earlier ones if you overwrite them.
Chuck Carpenter:[18:53] Interesting.
Tanner Linsley: [18:54] It's really cool. Yeah, it works just like the class names utility. I highly suggest checking it out.
Robbie Wagner: [18:59] Yeah, I'll have to check that out. I hadn't heard of that.
Tanner Linsley: [19:01] Yeah, it's nice.
Chuck Carpenter: [19:01] Cool tips. So, all right, we have one more hot take. What do you think about signals?
Tanner Linsley: [19:07] Love them. Signals are fantastic. I'm pretty tight with Ryan Carniato, and I've been talking to him about signals. He's been talking to me about signals for four years, five years now, I think. And I loved him from the beginning. Tried really hard to bring him to React. Couldn't do it on my own. But I think just signals as a data computation architecture and as a change detection architecture, they just fit the bill for so many things that I want to do. And the way that I like to equate it is like the ultimate UI that existed before so many other UIs is Excel. Excel is so flipping powerful. You can do so much stuff in Excel, and it has VBA-like programming to it. But at the core of it, it's just this signal. Kind of a setup, right? Every cell is like a signal. And that's kind of how our apps are ending up now, too, right? You've got computed things, and everything's relying on each other. It's this directed graph of information. Signals are great. I just think that the more time I spend with immutability, the less I enjoy it. I like it for some things, like where I need assurances of unique copies and things like that, but I think in the React ecosystem as it is, it used to not matter so much, but it's become the primary means of reactivity in the React ecosystem. And it just doesn't scale very far at all into powerful and advanced use cases. I built React Table, TanStack Table, and I had to go through great links, jump through a lot of hoops to get the Immutable change detection, to not blow people's apps up with TanStack Table if you forget to memorize one thing with that library, then it's just going to kind of spin out of control. So compare that to signals and it's kind of like, hey, everything is mutable, which we've heard is a bad idea, but that's because we kind of lacked the tools and we lacked the architectures and the systems to keep it in check. Right. So on top of that, when we talk about signals, especially like Solid signals, even though it's mutable most of the time, and this is where I think good signals are still separate reads and writes, so it's not two-way data binding. It's still separate to read and to write, and you still have transactions and very safe ways to track where you're changing values and how to track that down. But themselves, just having them as like the reactive primitive for everything, simplifies so many things and allows you to do some really powerful things, very performant things. I know that if we had React Table, if we had TanStack Table built to use signals, like just to be built on top of signals, we could probably make it ten times faster than it is today, but we just can't do that right now. Love signals.
Chuck Carpenter: [22:25] Yeah, because, as you mentioned, so was React Table rebranded as TanStack, as some of the libraries have been? Because they support more than just React. And I guess that's a whole different ideology too.
Tanner Linsley: [22:37] Yeah. And most of the time, we're still doing things Immutably just because that's how it's been done. So TanStack Table still has an Immutable API, but the adapters that are taking it into Solid and taking it into Vue. They are doing kind of some migration, if you will, between immutable data and immutable change detection, reactivity to the mutable signal observable style and that you pay the cost. Anytime that you kind of bridge the gap between one or the other, going from mutable to immutable reactivity systems, you kind of have to pay a cost when you cross that bridge. Something that me and Ryan Carniato figured out the hard way recently. We tried to move all of the TanStack, just state management itself, like non-framework level stuff, just the core state management. We tried to move it all to signals. It didn't have anything to do with Solid. It was just this signal technology that it had. But then we found out that even though we did that, we still had to convert it back to Immutable APIs for the React framework adapter and Preact, and it just ended up not being worth it. You actually paid the same cost to cross the gap coming back.
Chuck Carpenter: [23:59] But wait.
Tanner Linsley: [23:59] It's kind of sad we're still working on that.
Chuck Carpenter: [24:01] But wait, React is just a view layer.
Tanner Linsley: [24:04] Yeah.
Chuck Carpenter: [24:05] Remember that original? Yeah, it was at one time, and then got blown up so much more.
Tanner Linsley: [24:11] Yeah, it is.
Chuck Carpenter: [24:11] And I think that's the flaw.
Tanner Linsley: [24:13] Unfortunately, it is just the view layer. But there have become a lot more rules to how it works. Right? So we ended up basically anytime you do anything outside of React with state management, it's all going to come back to useSync external store. And useSync external Store is a great little hook, but it just is totally at odds with reactive mutable state management. So it uses snapshotting and immutable diffing and a bunch of things to keep track of when it should update.
Chuck Carpenter: [24:48] Okay, that particular hook, what was the class component? Similar.
Robbie Wagner: [24:54] Equivalent.
Chuck Carpenter: [24:55] Yeah. API. What would that have been?
Tanner Linsley: [24:59] I don't think they had like a class equivalent. You basically would have been like a higher order component that would implement something similar to what React Redux was doing with its connect, where you would have to set up like this dot set state or this dot rerender to fire off on a subscription-like pub-sub setup. So you'd have to subscribe to the store in a granular way, and then whenever the store updated, you would have to check and make sure that your piece of state had changed, and if it did, manually rerender the component. And then back in the day with classes, it was really scary because then it got into like, okay, how do we batch this? How do we make sure that it's performant? And it was really weird. Nowadays, it's much easier just to useSync external store. Then you don't have to do any of that. You just kind of consume. It's still a pub sub-like action. Like in the useSync external store. You still subscribe to the store and fire off a callback anytime something changes, and you're still comparing things. But it's just done in a React-safe way, I guess. Sorry, I'm quoting my fingers as I say that.
Chuck Carpenter: [26:14] I think it's good to make that distinction that you mean that when you make that statement, you just almost wonder. I know there's a lot of, like, well, I mean, early criticism of React was around having to hand do so many things right to create an actual app with it. But now, conversely, if you think about it, especially like say you want to work in an opinionated React framework like NextJS, and you want the React component layer to be a lot more simple and maybe come up with your own app-wide, both local and the entire app itself, like state management. Maybe that would have been easier, actually stripping out some of the helpers and making React more just the view layer and saying, I don't need some of these other things, and now I just want to manage this to a degree. I don't know. I mean, it was pretty far down this path now, so who could regress to that degree?
Tanner Linsley: [27:11] But, yeah, it's a big digression now, but I think you're right. So much of React nowadays depends on data flow. And right now, React kind of makes the assumption that data is tree-like and hierarchical. That's usually just not the case. Your app just kind of is all over the place. It's more of like a directed graph of computations. And I believe there's a bit of a cadence mismatch between React and it's like hierarchical state paradigm where for them, for React itself, if you use use state and use reducer and keep everything inside of use state, it seems everything's just going to be fine. Right. It's like, oh, everything works great, and it's super performing concurrent and all this stuff, but the minute you go out of React's kind of blessed APIs is when you run into trouble. It's disappointing, but I mean, you can't please everybody. So I think as long as there's still a priority for the core team and for React itself to bridge the gap with external state management, we're going to be okay. And I know they still offer a lot of caveats where, well, you're using something outside of React, well, be careful about over-updating or be careful about tearing, and there's so many warnings around that, but honestly, every time that I've used it, it's been just fine. It works great.
Chuck Carpenter: [28:43] Yeah. They're just saying, just in case, if we do a thing that we need to do for our own purposes because bearing in mind it is corporate-backed, then so be it. That'll be the ultimate decision if need be.
Tanner Linsley: [28:55] Yeah. It's hard to tell the difference between, hey, we're covering our butts, and this really, really is a bad idea. And I think a lot of the time it's just kind of preemptively, hey, just in case you run into trouble, we told you so.
Chuck Carpenter: [29:09] Right, right. Yeah. Which kind of makes sense.
Tanner Linsley: [29:12] Yeah.
Chuck Carpenter: [29:12] CYA in general. So, yeah, I think we should talk about TanStack a little more. What do you think, Robbie?
Robbie Wagner: [29:19] Yeah, give us the elevator pitch. What is TanStack? What do you use it for?
Tanner Linsley: [29:23] TanStack. Recently rebranded to TanStack. It used to just be a bunch of open-source libraries, just kind of under my personal name. But more recently, I decided to kind of bring it all together and brand it a little bit, maybe hopefully make some money off of it too, on the side, help sustain it all. So that's kind of where we landed. TanStack.com is the website, and I know if you already know me, then you've probably heard the story about the name, but if you haven't, I think it's worth saying, just so everybody knows, I'm not some egotistical maniac. Back when I had all these libraries, I was at a couple of conferences. A lot of my friends at these conferences kind of started teasing me when I said, hey, I want to brand it. I want to rename. And they're like, well, you should call it the TanStack. And I said, no way. It was originally Sean Wang who was kind of teasing me about this. He told a bunch of people, I think, and it just kind of started to become a joke, but it also kind of stuck. And I got really honest feedback from a lot of people, and they said, no, I actually like that. I think it has a good ring. I was convinced when I did the SEO research into it and found out that there was very little competition going on Google for anything in the space. I figured, let's go with it, let's lean into it, and as long as we just kind of keep it kind of funny and whatnot, it'll be fine. And this turned out great. So we went with TanStack and rebranded the website and kind of brought all the tools together. People still say React Query, and so do I. Like, I've already said it three times on this. I've said React Table, too, so it's kind of hard to change after you've been calling it something for a long time.
Chuck Carpenter: [31:13] Right.
Tanner Linsley: [31:13] But right now, under the umbrella, we've got TanStack Query Table Router, which is currently in beta. TanStack Start, which is coming soon. That's, like, going to be our framework. There's TanStack Virtual, which is a headless UI for virtualizing large element lists. I have a React charts library, so just a React charting library. There's TanStack Ranger, which is headless range and multirange slider utilities. So little range sliders. You can do multi-sliders and then a loaders and actions library that kind of goes hand in hand with the router and then possibly a new one coming in the next few months for forms. Yeah, it's mostly just a collection of tools that I believe are important because I use them where I work at Nozzle. So, in fact, basically, all of these tools were created because we ran into problems or challenges working on Nozzle.
Chuck Carpenter: [32:15] Okay, that kind of makes sense. I can definitely understand finding a common branding to pull them all together into as your toolbox. I wasn't sure, just because some of them have become not agnostic to frameworks, but they support some additional frameworks. And so I didn't know if your intent over time is to make more or all of them at some point be not React tools, but actually, like, front-end development tools.
Tanner Linsley: [32:41] Absolutely. TanStack Query is kind of already there. It has adapters for all the major frameworks. Maybe not Svelte. Actually, no, there is a Svelte Query.
Chuck Carpenter: [32:51] Yeah.
Tanner Linsley: [32:52] Hey, take that back. Table is okay. It doesn't have all of the adapters and router. Some of these, it just kind of depends on the tool. The router started as an agnostic router, but after a lot of experience with it, I've decided to dial it back for just React, mostly because the routing space is weird for almost every other framework. There's kind of just the router that you use except for React in the early days because it was just more implementation detail in React. Kind of bring your own, whatever. That's changing a little bit. And it's very bound to the framework that you use now, your meta-framework. So if you use Next, you're not really going to use another router. If you use Remix right? You're not going to use another router. Right. So it just made sense to just kind of hyper-focus it back on React and then things like React Charts. React Charts is probably never going to become agnostic. In fact, I might be sunsetting it in the next year or two just because I've found better tools for data visualization. But there are things like React Ranger that are headless, and they're actually really simple to make cross-framework. One of my contributors, Robert Kalinsky, is working on making React Ranger, TanStack Ranger so totally agnostic, and just it'll have a bunch of framework adapters. So it really depends on the library what's capable based on the API. The more headless it is and the less it has to do with rendering and markup and Reactivity, then the more framework agnostic it can be. But that's definitely a goal where it's possible we want to go there.
Robbie Wagner: [34:37] Yeah, makes sense. I think there's definitely a lot of competition heating up in the framework wars these days.
Tanner Linsley: [34:45] Yeah.
Robbie Wagner: [34:46] React is still obviously number one and maybe forever. We don't know. But Solid is looking pretty good.
Tanner Linsley: [34:53] Yeah, I have really big eyes for Solid right now, even though most everything I do is still in React. It's kind of just I stare at the greener grass over the fence every day with Solid, and I know it's not perfect. It also has its gotchas and whatnot, but for the things that I'm working on, Solid just seems like it would be a great fit.
Chuck Carpenter: [35:16] Yeah, that's interesting. And actually, I wonder if that's something you'll look at with the TanStack Start-like meta framework setup. I think it's interesting that you have Astro as part of it, too. Out of the box.
Tanner Linsley: [35:29] Yeah. So TanStack Start. So I talk about this with Ryan Carniato a lot. Actually, we talk about what is a framework. Right. And we've talked about that a lot in the last month or two. And I've kind of landed on three major things that kind of makeup, like what a framework is, and the first one is the router. You can't have a meta framework without having really tight integration on the router. And then the second thing is deployment. You have to have a really good story around deployment. It should be able to go everywhere and work everywhere. And there's a lot of considerations around deployment, too, because usually, meta frameworks are there to offer. Hey, you can do a static site. You can do a long-running server, or you can do serverless. You can do client side only. You can do server-rendered server components. There's a lot of these different flavors, and that's kind of where that deployment architecture comes into play as well. And then the last piece that I landed on was it's the code extraction and the abstractions around automatic things with your code. So automatically separating server and client code, automatically creating routes with file system routing. And that piece is kind of the Bling piece if you've heard anything about Bling. So if you put those together, we have TanStack router, and then Astro is what we're going to be building it on. So we get all the deployment story. And then Bling is the Vite-powered code extraction utility that we have that's going to power all of the how do you write a server component in TanStack Start? You use Bling. How do you do server-only RPCs? You do that with Bling? Can you create islands? That's with Bling. So all of kind of this meta code generation stuff is going to happen through Bling.
Chuck Carpenter: [37:44] Interesting. Yeah. I'm not very familiar with Bling. I did notice that there and I was like, oh, he just misspelled Bing. That's his favorite search engine. That's what I was thinking.
Tanner Linsley: [37:55] Yeah.
Chuck Carpenter: [37:56] Or the last name of your favorite friend.
Tanner Linsley: [37:58] Yeah, the name came because as I was tossing the idea around with Ryan Carniato, we were doing like server dollar sign like he was doing in Solid Start, which is also very similar to Quick, how they do a lot of their code splitting and whatnot. And we were doing server dollar sign and function dollar sign to kind of signify to the compiler that this is a special function boundary. And we saw the dollar signs, and we were like, wow, it's blingy, right? Ryan said it's really blingy. And I'm like, that's what we should call it.
Chuck Carpenter: [38:33] There you go.
Tanner Linsley: [38:34] The plan is that Solid Start and TanStack Start are both going to utilize almost the exact same Bling setup. So you'll be able to transfer your knowledge between the two on how to write server components and how to do islands and server code extraction. And then they're building Solid Start on Astro as well. They're going to be migrating to Astro too.
Robbie Wagner: [39:00] Nice.
Chuck Carpenter: [39:01] Yeah. Ryan didn't tell us this.
Tanner Linsley: [39:03] The first plan I know he's working on it right now. He recently just barely got it all moved over to Astro. Working so you can run Solid Start with Astro. It actually just takes a few changes in your package dot JSON and then moving your build system away from Vite to Astro, and it just works. It's really cool. Once he gets everything moved over to Astro, then we're going to be talking more about the router and Bling and how that all kind of hooks up. At the end of the day, I think the hope would be that the Solid router and TanStack router kind of end up being similar. We want to share notes, and I want to help them improve their types. And he's going to help me improve some of the server component architecture and islands architecture. Yeah, it's fun.
Chuck Carpenter: [39:47] Yeah, that is cool. And then reduce complexity, cast a wider net of folks solving the similar challenges. And then, like what you said, conversely, is learning about one isn't starting over coming into another?
Tanner Linsley: [40:01] Yeah, we just see that there's a lot of opportunity right now to share and just work together. But it seems like every meta-framework that comes out doesn't want to do that. If you want to write your own meta framework today, you're going to be met with, well, I have to kind of build a CLI and have my own compiler, and I have to have my own router, and I have to maintain all my framework adapters to all the cloud providers. In contrast, Ryan he's deleting all of his framework adapters, all of his framework adapter code because Astro has it, and he will get to share the same Start and Bling code for both TanStack Start and Solid Start. So I just think we believe that there's a lot more room for collaboration that isn't being done right now just because people want to be competitive. I mean, there's a lot of money involved. All the major frameworks the meta frameworks have, like Vercel, is tightly coupled to Next. They have big responsibilities to make sure that Next is being a great lead generator for Vercel. Right. And Remix and Shopify are kind of like Remix was purchased by Shopify, and they've got their little they're way less of an agenda, I think. But there's just a lot of money behind some of these projects, and we don't have a lot of money. So we're like or developers. Right. I don't know how many developers are working on Next right now or Remix, but I know that it's way more than we have.
Chuck Carpenter: [41:41] Right. Yeah. Because as we see on Twitter all the time, people keep announcing having been hired at these places, right? Which good for them in a tough job market, so there's that. But conversely, like, Vercel is seeking out individuals and trying to soak up the right talent to either, oh, perhaps as a competitor, or we want some of your best ideas, but we want it to go into our secret sauce.
Tanner Linsley: [42:07] Right.
Chuck Carpenter: [42:08] Not necessarily out to the group of open source. So I don't know. So you're saying you're not trying to get some Netlify money?
Tanner Linsley: [42:16] No, I don't know. The thing is TanStack right now, it's pretty self-sustaining, at least as far as I know. We get a good portion of money coming in on sponsorships and ads and marketing deals and courses and stuff like that. And all of my core maintainers and contributors for each of my projects, I try and make sure that they're getting what they need or want, or maybe more than that, to make sure that it's worth it for them. Like TkDodo or Dominick Dorfmeister. He is an amazing maintainer. I got super lucky with him. But he maintains TanStack Query, and he's so great. Right. I don't think it takes a whole lot to maintain great open-source libraries. It just takes a couple of skilled individuals, and I would rather pay a couple of people larger sums of money and make it worth their time rather than try and distribute out a lot of this to hundreds of people and possibly let things stagnate or just not have high quality. Right. I think one of the themes around TanStack, though, is that a lot of these tools are being used in applications that matter. Like, Dom uses TanStack Query every day at work, and I know a lot of Kevin Vandy uses TanStack Table to build his stuff. And it seems like everybody who ends up contributing is somebody who relies on it for something that they do at their job or on a project, like every day. So there's a lot of motivation there to make sure that all this stuff is working there is for me, too. Because you go to TanStack.com, you're basically looking at the front-end stack for Nozzle. Right. And just recently, I became a solo front-end team at my own company. I see we have 15 employees, and none of them are mine. I've had front-end people before, but right now, it just so happened that I'm solo again. So I've got to get a lot done with just myself. And leaning on these libraries definitely helps. Maybe that's the pitch for TanStack. Right. Do the work of ten developers by yourself by relying on great libraries.
Chuck Carpenter: [44:46] That's not a bad one.
Tanner Linsley: [44:47] Yeah, that's how I feel. Yeah. And by outsourcing a lot of the front-end stack, you have a lot of people who are now making my product better. If they find bugs and.
Chuck Carpenter: [44:58] They're dedicated to its quality.
Tanner Linsley: [44:59] And it'd be easy to hire, too. When it is time to hire a Nozzle, I know where to go.
Chuck Carpenter:[45:07] That's great.
Robbie Wagner: [45:08] So let's move into a little bit about you personally. So I don't know much about you other than your technical side. I think GitHub said you were a swimmer. Is that the case?
Tanner Linsley: [45:21] No.
Robbie Wagner: [45:21] I did see that.
Tanner Linsley: [45:24] I probably need to take that off, actually. I'm going to check that out right now because I wonder how that's totally funny. So I actually have a library called Swimmer. I'm going to put Swimmer JS on there.
Chuck Carpenter: [45:39] There we go.
Robbie Wagner: [45:40] Did it say maybe I read it wrong?
Tanner Linsley: [45:41] Yeah, I'm putting Swimmer JS on there just because I need to. I have no idea why it's on there. I totally need to redo my personal profile, but I had a library called Swimmer that was for doing async pooling and async task pooling. And I was like, oh, pool, pool, swimmer.
Chuck Carpenter: [45:59] No, it makes sense.
Tanner Linsley: [46:00] Yeah.
Chuck Carpenter: [46:00] Clever.
Tanner Linsley: [46:01] Yeah.
Chuck Carpenter: [46:02] So, do you have any non-tech hobbies, then?
Tanner Linsley:[46:04] I'm not a swimmer. I used to have a lot more. I used to be really into music, like making music, so I grew up playing all sorts of instruments. I have one of everything unless it's, like, a band instrument. I have an album on Spotify that I did with a friend. I went to school to be an audio engineer for two or three years.
Chuck Carpenter: [46:29] Very cool.
Tanner Linsley: [46:30] I did a year and a half of film school. I have, like, three partial degrees, basically. Probably like, a lot of software engineers too, but.
Robbie Wagner: [46:38] Yeah, Chuck can speak to that.
Chuck Carpenter: [46:40] Yeah. I went to film school for a year, also for fun. And I took a bunch of photography classes for quite some time. Got into photography school, but then that didn't pan out.
Tanner Linsley: [46:50] Yeah.
Chuck Carpenter: [46:51] Hopefully, this gig does, though.
Tanner Linsley: [46:53] Absolutely. And I kind of found my love for programming through the software world. I was really into the tools, so I loved Photoshop and Premiere and Final Cut and Illustrator, and then I got into audio engineering tools. I just loved Reason and Logic and Ableton and eventually found out that I really just loved the programming part of it. Maybe not so much the other parts, but yeah, I struggled creatively with music, but I don't struggle with that at all with programming. Yeah. So I used to do a lot of that, and open source, for better or worse, has replaced a lot of that. So I do still really enjoy just coding for fun, doing open source, but when I'm not coding or programming or doing any of that, most of my time is spent with my family. We do like to travel a lot. I have two small children, a two and a four-year-old. And we like to travel, so just to different places when we can. We haven't been anywhere, like, super crazy, but we've been to Europe a few times. Just been around here. Canada, Mexico, Hawaii. I am a vacationer, so any excuse I can find to just kind of disappear for a week or two that's my hobby. And if I can't do it right this second, then my hobby is figuring out a way to do it as soon as possible.
Chuck Carpenter: [48:24] That's great.
Tanner Linsley:[48:25] Yeah.
Chuck Carpenter: [48:25] I'd say that's definitely something. And I would say with a two and a four-year-old, some would consider some of those destinations adventurous and perhaps a little crazy. So I can certainly.
Tanner Linsley: [48:37] Oh, absolutely. We just went to Puerto Rico with our two and four-year-old just two weeks ago. Beautiful place. Love it there.
Chuck Carpenter: [48:45] How's their Spanish?
Tanner Linsley: [48:46] My Spanish is not great. I used to know Portuguese very fluently, nine out of ten. And then, over the years, I can listen to Spanish and get percentages of it here and there speaking it. I'm terrible, but I just love being around it though. I love being around different cultures, especially different languages. Like, culture shock, to me, is a hobby. I kind of chase after that. It's a lot of fun. Speaking is a little bit of a hobby when I want it to be. Like, 2022 was a big speaking year. I did a couple of talks at some big conferences. It's fun. It's a lot of pressure. I did a talk last year at Jamstack Conf. I like the pressure momentarily. It's fun to get out of your comfort zone and stress out a little bit about something and then deliver and do a really good job with something. This year I have just kind of mellowed out a little, and I'm like, I don't want to do too many talks, so I'm going to be on a panel at Reactathon, which is a lot less stress, I think. I'm giving a talk at React Summit in New York in November. My name is on the website.
Chuck Carpenter:[50:00] Hopefully, someone asked you.
Tanner Linsley: [50:02] Yeah, I'm pretty sure they did. And it was a long time ago, and I'm probably like, oh yeah, sure, let's do it. So, yeah, I hope I can come up with something decent to talk about.
Chuck Carpenter: [50:11] Okay, so those are the two you're doing this year?
Tanner Linsley: [50:14] I think so, yeah. I'm going to try and just attend a couple of conferences around here in Utah. I particularly really like, React Rally. That's probably one of the best conferences. Not even because it's about React, but it's just a great crew really good conference. And Remix is here locally, too, in Utah. I could probably find an excuse to go to that one as well. Also just kind of a lot of people I know are probably going to be there, so it'd be fun to just kind of sit and chat. I'm a hallway track person, so I rarely listen to the talks when I go to a conference. I mean, I do later. I go back home, and then I just binge them.
Chuck Carpenter: [50:57] Yea.
Tanner Linsley: [50:58] But on like 2x speed. Right. But when I'm at the conference, I want nothing to do with the talks. I'm out. Just want to talk to people and hang out.
Chuck Carpenter: [51:06] That makes a lot of sense. And Kent lives in Utah, too, right?
Tanner Linsley: [51:11] Yeah, he's probably about an hour south of me.
Chuck Carpenter: [51:14] Yeah. Okay.
Tanner Linsley: [51:15] And Ryan Florence is also here. And Tyler McGinnis is also here. He's in southern Utah, though.
Chuck Carpenter: [51:22] Okay. Is Provo south?
Tanner Linsley: [51:23] Provo is south of me. Yeah.
Chuck Carpenter: [51:26] Okay.
Tanner Linsley: [51:27] Yeah. In fact, most of us live north of Provo in some aspect other than Tyler McGinnis lives in southern Utah, where it's a lot warmer.
Chuck Carpenter: [51:37] We're not too far away. I mean, I'm in Phoenix, so not too bad.
Tanner Linsley: [51:42] Last time I went to Phoenix, it was sweltering.
Chuck Carpenter: [51:46] Hopefully, it wasn't July. That's not a good time to be here.
Tanner Linsley: [51:49] It was probably in the summer. It was.
Chuck Carpenter: [51:50] Yeah.
Tanner Linsley: [51:51] Scorpions at night.
Chuck Carpenter: [51:53] Oh, jeez. You were out there.
Tanner Linsley: [51:55] The ground never cools down. Like, I remember walking out at, like, one in the morning, and it's just like, why is the ground so hot?
Chuck Carpenter: [52:01] Because it was 120 today, and it's 95 at night, and there's no humidity to give it to bring in some cool or whatever. So, yeah, it just kind of stays that way. But in December, it's an amazing place.
Tanner Linsley: [52:15] Oh, absolutely. Great golfing, I hear.
Chuck Carpenter: [52:18] Yeah. If you're into that. There is that. I tried that once. It's not for me, but it's pretty.
Robbie Wagner: [52:25] Yeah, the golf courses are nice. The actual golfing is hard, but.
Chuck Carpenter: [52:29]The 48 balls that I lost was nice. I'm certain it had to be, like, that many.
Tanner Linsley: [52:35] It's a mental game, right? And usually, one that is, like you're fighting against the urge to just smash things.
Chuck Carpenter:[52:42] Right.
Chuck Carpenter: [52:43] Yes, a losing urge for some of us.
Tanner Linsley: [52:47]Yeah.
Robbie Wagner: [52:49] All right, so we're about at time here. Is there anything we missed? Anything you want to plug before we end?
Tanner Linsley:[52:55] Plug? Like shameless plugs? No, sure, whatever. Yeah, anything kind of plugged everything that I should. I don't know if anybody listening is into SEO. You should come check out Nozzle. Nozzle.io is the website. We're doing some pretty cool stuff with SEO data, and then yeah, you heard plenty about TanStack, so there's nothing left there. I don't really think I have anything else to plug other than just come follow me on Twitter, and maybe we'll chat and have some fun.
Chuck Carpenter: [53:26] Find you in the hallway of your favorite conference.
Tanner Linsley: [53:29] Yeah, absolutely. Don't be shy.
Robbie Wagner: [53:31] All right, cool. Thanks, everybody, for listening. If you liked it, please subscribe. Leave us some ratings and reviews. We really appreciate it, and we will catch you next time.
Chuck Carpenter: [53:43] Thanks for listening to Whiskey Web and whatnot. This podcast is brought to you by Ship Shape and produced by Podcast Royale. If you like this episode, consider sharing it with a friend or two and leave us a rating, maybe a review, as long as it's good.
Robbie Wagner: [53:59] You can subscribe to future episodes on Apple, Spotify, or wherever you get your podcasts. For more info about Ship Shape and this show, check out our website at ship shape.io.