Episode

Hammerstone · Sep 10, 2021

2 Jobs, Stabilizers, and Torchlight Clients

2 Jobs, Stabilizers, and Torchlight Clients
Show notes

<div>Sean is feeling the weight of his many jobs, Aaron tries to say "stabilizers" as much as possible in one episode, and we talk about new Torchlight clients.</div>

Transcript
00:01

Aaron

Okay. Hello, friends. Hello. So, Sean, do you wanna start and give us a kind of a status update with the Vue stuff?

00:11

Sean

Yeah. The Vues the Vue stuff. So that's pretty straightforward. All I managed last weekend was to re understand how the hell the Vue stuff works. So it's from there.

00:21

I did like a few code changes and then yeah. So I just got my head wrapped around it again and got a few code changers. The view thing is really cool looking at it again. It's like, it does like, cause it has a lot of different modes. So it's not just the query builder.

00:36

You can also do static queries without a blueprint. So you can just like write Vue components and it builds a blueprint for you. And then, of course, it's all completely separated out, so you can build whatever UI you want on top of it with completely renderless components. So it's really turns out it's really, really, really complicated for but of course, all I need to do for this first, you know, release that we're doing is get it to work in, like, builder mode. So that's what I'm trying to just focus on.

01:05

But I had 1st to get to where I could even focus on that, I had to remember, like, how does it work?

01:11

Aaron

Yeah. You feel like you got there?

01:13

Sean

Yeah. Yeah. I remember now. And I remember like our so, like, we started using Tailwind UI components since I haven't looked at this probably in, like, 6, 7 months, something like that since we started on the the client project. And in the interim, they introduced JavaScript piece, like renderless components to go along with the tailwind UI components.

01:40

Aaron

Is that the headless UI stuff?

01:42

Sean

Yeah. And I basically had implemented my own version of that for a couple of them. And one of them is hard. Like, a selection drop down

01:54

Aaron

is

01:54

Sean

very hard to do, to be accessible, to have, like, 2 choices, multi select or not, etcetera, etcetera. Like, it's just a very complicated dealie. And then ours is both a renderless and tailwind component. So that's what I'm doing now is the option select. So, like, you know, a condition you could select one of many things, like a hat that has potential 3 like, 4 or 5 potential colors.

02:17

So, like, you can choose brown, red, blue hats out of a list. So it's like a multi select option for a query builder, and that is is you know, we already have that working in the the back end, but, like, to make it work on the

02:32

Aaron

Right.

02:33

Sean

The drop down, which is totally custom, like beautiful, nice looking, you know Without

02:38

Aaron

pulling in component. Some janky third party component.

02:42

Sean

Yeah. Exactly. And that was the choice that I made way back then was like, okay. I'm just gonna write my own because I looked around, and it was like, I don't like I don't like any of these, and this is a pretty important part of our thing, but I'd also pulled in a big scope of work with that. So that's where it's stuck right now is is that basically.

03:00

Aaron

So Well, if it makes you feel better, none of that is wasted because headless UI only supports Vue 3.

03:08

Sean

Oh, okay.

03:09

Aaron

So and and React. But as far as Vue goes, it's only Vue 3. So it's not like, oh, dang. I coulda just pulled in headless UI, because we're supporting Vue 2. So we're good there.

03:20

Okay. I mean, good in that you still have to write it, but at least it's not, you know, it's not a waste. Cool. Nice. Anything else on your side?

03:39

Sean

That's it. Other than it's struggle to find the time and enter well, it's not really to find the time, it's to find the energy to do it right now.

03:47

Aaron

Yeah. You seem pretty maxed out.

03:50

Sean

I am maxed out. I'm like right. So I just got promoted, and then I have 2 jobs to do for now, because we're a small company, so it's not really

04:01

Aaron

I still Two jobs at the job, at the one job.

04:04

Sean

Yeah. And I'm doing kind of, you know, as you'd expect, a crappy job of both at the moment. You know, I was, like, focused on the new gig a little bit, which then called the other thing to fall behind, and people are like, no. This is like you really gotta focus on this. What have you been even doing?

04:20

You know? And I'm like Oh, no. So I gotta get back to focusing on that stuff.

04:25

Aaron

What are the 2 jobs?

04:25

Sean

The context switching costs is high. The 2 jobs, it's like I'm doing product, so I'm like the director of product, and then also I'm still the front end developer. We have Gosh. Another front end developer part time, but it's basically just mean there's parts of this stuff that I'm the only person that can really has the technical skills to do for this other part of the product, so I have to. And it's similar situation actually to our select drop down where it's like, we have this really important input type for time entry, and I can't just put some drop in thing, and I gotta solve it for all of our different clients and customers and

05:06

Aaron

Mhmm.

05:06

Sean

All their different devices that they use. And everybody's like, why is time entry so hard? And I'm like, it's very Let

05:14

Aaron

me let me tell you about time.

05:15

Sean

Intricate and difficult. And yeah. But then and then this the context switching right now is just killing me. It's killing me.

05:26

Aaron

Yeah. Those are very different contexts.

05:29

Sean

Yeah. I got that. And then I'm meanwhile trying to, like, plan the next chunk of work for our team and get that squared away. That's like step like, the first thing that I wanna do in my product role is, like, get any kind of process whatsoever. Well, because that way today, I was like, why am I even working on this time entry thing?

05:48

And they're like, because I couldn't even remember. It's like, why are we doing this? Why is this work important? And, like, it would help me decide what to work on or not work on. So I'm trying to fix that problem, and that's important because that's what we do.

06:01

We just like jump back and forth, you know, in priorities without really having a plan. And that's what I'm gonna fix, except I have to do it, like, in the middle of everything is very urgent on the, you know, developer work that I have to do too. So it's exhausting and frustrating, and I hate not doing a good job. I hate that. You know, that bothers me.

06:25

So you

06:26

Aaron

know that you're not doing a good job? Like, have other people said that?

06:30

Sean

I wasn't. Yeah. The time input thing, they were definitely like, why is this taking so long? Hurry up. Go faster.

06:35

I mean, I'm doing what I can, and they definitely could've gone faster, if I've been more focused on it. But yeah. And I can also just tell everybody's, like, frustrated that it's just been hanging out for weeks weeks now, which I'm like, I get. Yeah. But I I don't I like being more aligned with, like, where people it it doesn't matter.

06:58

I know that's not, my fault, but it I still like doing a good job.

07:02

Aaron

Yeah. Yeah. That's not a fun spot to be in. I didn't realize you had 2 jobs at the one job. I knew that it was more, like, I knew that from your promotion, it was gonna be more, like, I guess, intense or whatever because you have more responsibilities and you switched to, 5 days.

07:21

But didn't realize you were kind of still hanging out in both spots.

07:26

Sean

Yeah. That's yeah. Exactly. And there's still enough work for full time front end dev, to be honest. But the thing is, like, what I have to do is figure out once we figure out our priorities because like the whole my whole job, my other job is to one of the main goals is for me to improve developer velocity, you know?

07:48

So what's developer velocity? That's a great question. To me, it means like how it it doesn't matter how fast you write code if the thing you write, none of our clients or customers care about and it provides no benefit to the business at all. So, like, if there's so many high value things we could work on that even if I'm not that efficient at it and we don't get as many things done as we possibly could, like, who cares? Because Mhmm.

08:15

Before we would have been wasting our time on stuff that didn't really matter. So that's why I'm like, I really wanna focus on the prioritization piece and get us set up for that, even though it sucks that, like, not much is getting done, you know, for me, development wise, because I'm really focused on that. But once it does, then it doesn't I won't need to spend 40 hours a week on the front end stuff. I doubt it. And if if it does come down to that where we have enough projects that, like, we need that, well, we'd hire a contractor for temporarily to, like, bump up the front end time or whatever.

08:44

So I that but it can't do any of that until I do the prioritization, but then everybody wants me to focus on the code stuff. It's just a stupid awkward phase where I just like, the solution is to work more for a couple weeks.

08:58

Aaron

Yeah.

09:00

Sean

I mean, there's another solution which is prioritize with my boss, but right now he would prioritize time input because we got this very noisy client who would prefer that get done ASAP. So, you know Is the other stuff

09:16

Aaron

urgent? It sounds like the time input stuff is urgent. Is the sprint planning, prioritization, all of that urgent?

09:23

Sean

No. It's important. Yeah. But not urgent. Right?

09:25

So But

09:26

Aaron

not urgent.

09:26

Sean

But if we did it, we wouldn't end up in these, like, urgent urgent urgent situations. That's why I'm trying to, like, remove this from the yeah. Yeah. So I'm I'm a little exhausted of of that right now. Like, I just feel like I'm just working all the time.

09:44

So then it's time to go work on hammer some stuff on the weekends, and I'm like

09:48

Aaron

Punch me in the face.

09:49

Sure.

09:49

Sean

Yeah, exactly. Yeah. But but it sucks too because I really want to work on the hammerstone stuff cause I'm excited about that. Just like, come on, energy. Come to me.

10:02

And so I can work on it. It doesn't help that I'm doing this sleep restriction thing, like, right in the middle of it, which is coming together and getting better.

10:08

Aaron

I don't know that.

10:09

Sean

But, like, I'm still not sleeping. I'm definitely sleep deprived, which doesn't help at all. There's no good time to do that. So it is what it is.

10:23

Aaron

Oh, man. That's a lot.

10:27

Sean

Yeah. So my my grumpiness levels are a little higher than normal. Colleen, to answer your question from before the podcast started recording, I don't think that I'm normally like this. I think my grumpiness levels are higher than normal.

10:38

Aaron

Yeah. For the record, she did not

10:40

say grumpy.

10:43

Sean

I'm calling myself grumpy. I'm definitely grumpy. I think it always helps for people to know, like, when somebody's grumpy and it's not them. Because it's a little bit less you're like Yeah.

10:51

Aaron

When it's a situation

10:51

Sean

angry at me. Like, yeah. I'm not. Absolutely. I'm really not.

10:56

I'm just grumpy in general.

10:58

Aaron

Honestly, any kind of sleep deprivation is just the worst. So, you know, layering that with your new work responsibilities and and your other stressors, like, that's a lot.

11:10

Sean

Yeah. It's all the good stress. Right?

11:12

Aaron

Mhmm.

11:12

Sean

Which is fantastic. I'm super happy about where the career is at at the moment, with everything going on, but it's too much. I sometimes am like Yeah. Should I just quit everything and go like, I got my old job is available. I could probably go back to this, like, you know, it's this like, I don't know, I probably work 30 hours a week.

11:31

I just go into the office. Now it's mostly remote, so it's like you get paid way more than I'm getting paid now to, like, hardly do anything checkout. Back when I did that, I was like I did that for a few years. For for like a first couple years, I was trying to start a company on the side, you know, as per usual, my usual MO. I'm always doing this.

11:52

But then for a couple years, I actually decided to just take a break. It was awesome. I was like, I lost £30. I spent, like, 15 hours a week on my bike. I was, like, racing bikes and super fit and relaxed, and I'm, like, maybe I I wanna do that again someday.

12:09

Aaron

Man, I totally think about that sometimes. I totally I totally think, like, I'm spending a ton of time on side, like, side project stuff outside of work. What if I just what if I just worked like a normal like a normie? And then when it wasn't work time, I, like, did stuff. I've thought about that, but I keep, like, I keep coming back personally.

12:36

I keep coming back to, like, no. I really, like, I really wanna do my own thing. But it's really it's really tempting to be, like, nope, 5 o'clock, laptop shut, and it stays in the shed, and I go in and just, like, I don't know. I don't even know what I would do.

12:51

What would you do with all that time?

12:53

I have no idea. I have no idea. I have no idea. Like, I guess I could get into Legos or something. I love Legos.

12:59

Haven't done that in 20 years. But I really I really have no idea.

13:05

Sean

You get so bored. That's what happened to me. And I started that's why I like, okay, can I just oh, just gonna do some exercise? No. Of course, I can't just do exercise.

13:14

I have to be riding my bike Yeah. 15 hours a week, like, it's a part time job

13:18

Aaron

Training for something.

13:20

Sean

Doing high level races and, like, getting injured and stuff, like Yeah. I don't know. Maybe when I don't know. I don't I don't know if it's I'm capable of not doing that. Colleen Diefer.

13:33

What they would do.

13:34

Aaron

Oh, so this is, like, our ongoing family joke. So the other day, I said to my husband, maybe I'll just sell SimpleFile upload because maybe you saw, like, the multiples are insane right now for small sasses. And then, you know, I'll just take a year off. And he looked at me, and he was like, you will never take a year off. You were supposed to have that 4 day a week job where you had Fridays off.

13:55

Never took Fridays off ever. Like, I just don't want to. Yeah. I don't know. I think my situation's a little different though because I spent 5 years not working when I was staying home with the kids.

14:06

And, of course, that's incredibly busy, but, also kind of incredibly boring. Like, it's great, but boring. And so I've done kind of the lowers well, it's not lower stress. I don't mean to say it is. But

14:20

Different stress.

14:21

Different kind of stressors. I wouldn't know what to do with myself. Like, really. I I don't know. I told you, Aaron, I started, like, baking bread and, like, doing all kinds of weird, like, intense things, kinda like you were saying, Sean.

14:32

Like, I was, like, training for this thing and that thing, and I was, like, arbitrarily, you know, putting restrictions on, like, well, we're not gonna eat processed foods for 5 months. Like because I was just I'm crazy

14:44

like that. Something something to work on.

14:46

I have something to achieve. Right? Like, I just couldn't let it go and chill out like a normal person. Couldn't do it. So, yeah.

14:53

Okay. Good. We're all in good company here. Well, Sean, I'm sorry that it's so much. I did not realize that the the work work was so much.

15:06

That sounds that sounds really stressful.

15:09

Sean

Oh, that's crappy. Yeah. And I guess I gotta add into it. It's like also because Isaac started the school year this year and we decided I mean, I think it's a good choice, but it's a it's a huge draw like, a huge pain for us, but we decided to keep him at the school he's at, which is I spend 2 hours a day driving him right now. So I have to just, like, devote 2 hours a day.

15:30

It's only for this year. We're not doing that forever, but it sucks. Yeah. So I'm like, I end my wrap. I have to I have to finish.

15:38

I start. So now I'm waking up at 6, kinda get him ready, and then I start at, like, 6:30, 7. And then I work until 3:30, 3:45, and then I gotta go drive him. I don't get home till, like, 5:30, and then I make dinner, then he goes to bed, and then it's like I have to be real focused with my time too. Like, it just doesn't feel like there's enough time to go around.

16:03

Brutal.

16:04

Aaron

Yeah.

16:05

Sean

Yeah. It's gonna be a stressful year. Yeah. Just gonna be a stressful year.

16:10

Aaron

K. Well, if if you wanna drop off now, you can. That's alright. Okay. Colleen, what's going on with you?

16:22

Who's the client?

16:24

Oh, well, I started lifting weights again, and so

16:27

Oh, you did?

16:29

Yeah. He said, what's going on with you? That's what's going on with me. So that's great. So personal.

16:35

That's good. Client is good. There's a lot. There's a lot just a lot of stuff, which is good. Right?

16:40

Like, lots of lots of stuff to work on. So I'm just keep on keep on in there. Nothing really exciting.

16:50

Okay. Yeah. You said lifting weights again. Have you been super into lifting weights before?

16:56

Like, pre pandemic. So I was super into lifting weights, like, pre pandemic, and then, obviously, the gym's all shut down. So then I had that trainer that came to my house, but you couldn't get real weights. I mean, you couldn't find them to save your life. So we had I had my little dumbbells, which was cool.

17:14

Anyway, so I found a new gym, and and I'm getting back into that. So that's been

17:18

fun. Nice. Yeah. That's great.

17:21

Totally.

17:22

And I think I mentioned this in Slack, but you said we should hold off. So should we still hold off on the 5 levels of relationships? Haven't gotten through yet.

17:30

Haven't figured it out yet.

17:32

Great.

17:32

For some reason, you know, walking through that recursion is hard. Like, it's just like when you're trying to walk through it.

17:39

It's very hard.

17:41

So for some reason, it gets it gets 3 levels deep, and then it's throwing off my base query. Not my initial query. When I say base, I mean, like, the lowest level that's actually, like, where this thing is this thing. So it's almost there. I think it might be something, in the way I'm unwrapping them based on because in none of our tests do we test multiple level of, like, children trees, children relationship trees of different kinds of relationships.

18:09

Because all the specs pass. All the tests pass. So anyway, so I wrote a test for it, and I'm sorting it out. But it's a it's an interesting challenging problem. So

18:21

So it's like a has one, then a has many, then a belongs to, then a has one, then a

18:26

has many. Yeah. Exactly. And I think that, you know, it's the double nested remember the pending relationship subquery data structure we built up,

18:34

Sean

which

18:34

Aaron

I need to review? It's the 2nd level child in that data structure that's having the problem. So I don't know if it's because when I'm unwrapping a children when I'm unwrapping, like, the children

18:46

Going back out?

18:47

Yeah. Back out, I lose 1. And I don't know why I'm losing 1. So I'm not sure if I'm overwriting it because I didn't account for I don't know what's happening, but I'll I'll figure it out. So I don't really have anything exciting to share.

18:59

I don't know. That's pretty exciting. I I love I loved that. I don't think anyone else followed it, but I loved that.

19:07

I mean Great. The part of the problem, I think, is I don't like, I need to map out the ideal tree structure for the pending relationship subquery data structure.

19:17

Mhmm.

19:18

And just kind of like a tree. Right? Like, walk, basically, walk the nodes of the tree to make sure I'm hitting them where I think I'm hitting them. And so that's what I'm gonna do today and hopefully figure out where it's getting lost. There's some, like, oddities to the data structure, because I decided to change the way I was building it.

19:37

Not the structure itself, but, like, the way it, like, would auto populate the values and the key value pairs. Because, like, in Laravel, you were just randomly making nested keys. Yep. You can't do that.

19:49

Random is a strong word, but, yes, I I was making nested keys.

19:53

So I can make nested keys, but I can't for example, if if hash a doesn't have a value, I can't just go hash a with a key a and then that with a key of b because a is nil. So it's like, oh, you can't do so there's a way around that, which is what I'm using, which is cool, but it might be introducing other subtle bugs. Anyway

20:16

Yep.

20:17

I'm working that out. But Yep.

20:18

That makes sense to me.

20:20

What I'm doing. Okay.

20:22

Cool. Yeah. We have, we have a helper that does that for us. So you can set a dotb.c. And if a and b aren't there, it'll, like, you know, populate them or something like that.

20:33

So I I get that. Yeah. And you've got you've got a you've got a deadline coming up. Right? You said you needed to have filters working and ready by, you know, this event that they have.

20:45

When is that?

20:46

End of the month.

20:48

End of the month.

20:49

It's kind of a self imposed deadline. No one was like, we absolutely must have this by then, but I feel like it would be good to have it by then. So it is an option. So that is my goal. Yeah.

21:00

Honestly, this one is just this is the most complicated one. So once I get this, it's all gonna fall into place. Like, I really feel that way, because this is, like, as we discussed, 5 level deep relationship, multi mixing of relationships, etcetera, etcetera.

21:15

Which this is not our realm. They shouldn't I don't know. Five levels away. I feel like there's gotta be a better data structure for them to be using.

21:27

We can we can talk about this I mean, I don't I don't know that I agree with that. I think that

21:31

There's no other way to do it?

21:32

I I mean, I'm sure there is, but the reason they're doing it the way they're doing it makes perfect sense to me. Like, it really does. I think that you can always right? You can the problem is there's so yes. You could obviously change the data structure so you wouldn't have to do that.

21:48

Mhmm. But there's so many things they wanna be able to do that I think it's smarter to make it work this way, or else you're greatly modifying. Like, you'd have to be more specific in what you want, and I don't know that the

22:04

Oh, I see. So this preserves flexibility.

22:07

That's, yes, that's what I'm trying to say. Yeah. Okay. Well, you're the expert on that.

22:12

Yeah. So So It's making sense. Someday.

22:16

Sean

You know how like in the front end we have Apollo and we have GraphQL, so you can, like, have this middle layer of a graph database in between your back end and your front end. So that way you can do kind of arbitrary queries on the graph database with like an API that the front end has. I wonder if there's something there for us, you know, longer term of having like a middle layer, supporting a middle layer, which would support faster queries on stuff like this without them having to do, you know, recursive stuff. This is obviously not a small thing whatsoever, but just like if we're we're focused so much on these query things, I wonder if that makes sense for one day

23:02

Aaron

for us to consider

23:02

Sean

doing, like actually denormalizing data and pulling things into like a middle layer or enabling that at least.

23:09

Aaron

That seems super interesting. And you'll have to explain to me at some other time what Apollo actually is, but that sounds fascinating to me.

23:19

Sean

Yeah. Like Apollo solves the problem of front end needs some bit of data from the back end. The back end would have to then write a special API endpoint for that data, write the queries, etcetera. With Apollo, the front end can say, okay, so the back end you've already defined, like, here's all of the data, here's the structure, and it's in this graph database structure. Then the front end can go and say, Okay.

23:48

I just need this swath of data with these criteria. Go get it for me. And it goes and gets it from the graph database. If the data is not already there, the middle layer that you write for Apollo goes and gets it from your database and your RDBMS and then populates it into your graph database and then the front end pulls it in. So it's just like this middle layer, which enables almost arbitrary queries from the front end on the data.

24:18

Aaron

It seems pretty cool. Mhmm.

24:21

Sean

Yeah. It just dawned on me. It's like, oh, maybe that's that's an interesting pattern, which might apply to us at some point. Yeah. Because some queries are just gonna be freaking slow if you're going through 5 different levels and joins and Yeah.

24:39

Aaron

Yep. Yep. That's what I'm afraid of. But Colleen, you'll tell us when it happens. We'll sort it out.

24:48

Report back. Yeah.

24:49

Yep. We'll make it work. Be good

24:52

learning. Yeah. For real. I think Mike, you know, obligatory Mike Buckbee reference. He said we got the deal of the century by having you work on Hammerstone for the client, because we're learning just just a massive amount of stuff, and it's pretty amazing.

25:11

Okay. Shall we move to something else? Anything else, Colleen?

25:16

Nope. Okay.

25:20

Let's see. Staying on Hammerstone, I don't know how much I think, Colleen, you haven't started really diving into the stabilizers too much because you've been working on the other stuff. But I spent a bunch of time over the weekend working on the Laravel stabilizers. So just as reference for everyone else, stabilization is the process by which a filter turns into a reproducible string. So, like, you can put it in your URL, you can put it in your database, or whatever, and then that string can turn back into a filter.

26:01

So it's, like, for sharing filters, saving them, that kind of thing. I got all of the Laravel ones set up with prefixes, so now every stabilizer every stabilizer has a unique prefix. So if somebody's using database stabilization in one spot in their app, and URL stabilization in another spot in their app, then the refine library can correctly differentiate which stable ID goes with which stabilizer. Right? So when you call from stable ID, refine will be able to know, oh, this stable ID, I need to run through the URL encoded 1, and this stable ID, I need to run through the database encoded one.

26:51

Right? Because if we're giving stable IDs to users and saying, like, alright. This one this one's URL, this one's database, and then they come back with a stable ID, we need to be able to tell which stabilizer it came from. Does that make sense?

27:07

Yeah. Makes total sense. So, basically, you're never calling from stable ID on one of the child classes, like URL encoded stable ID or database stable ID?

27:17

Exactly. So I'm always calling filter filter from stable ID, and then the filter inspects the stable ID that it was given and does the differentiation as to how to unstabilize it, how to turn it back into a filter.

27:34

And you're doing that just you're just pulling the string off the front. Right?

27:39

Yeah. So each filter now requires a prefix. So it's just like just like UE for URL encoded and DB for database. So the the stable ID is now 2 characters longer, and we just pull those off the front, instantiate the right class, and then give the stable ID to that class, and it can do its

28:03

Sean

thing. That makes sense.

28:06

Aaron

So I committed that, and, Collin, whenever you get to stabilize, no rush at all. We can talk through it again, and it'll it'll make more sense when your head space is there.

28:16

I mean, I think it makes total sense. You're literally just doing a string like a like you said, a prefix string. But you're doing that to help the just to kinda help the developer not have to remember which they've analyzed, or they're uncoding, encoding, unencoding?

28:33

Yes. To help the developer, but also to solve for the situation when so like if it's a tight loop and it's like controller, view, controller, view, we know which stabilizer we're working with because it's the one that we are using in that controller or whatever. Yeah. But in the case where, in the case where we may not know where this stable ID came from, we need to be able to unencode it regardless of where it came from. Don't we always know?

29:10

We don't always know, Because we have I think maybe in the client, we might always know. In in the client you're working on, we might always know. But we have the concept of automatic stabilization, so every filter that gets run returns a stable ID, and that's kind of what we put in the URL bar. Right? And then we have the concept of, manual stabilization, and that's where you would, like, click the save button and name it, like, Colleen's scrape filter.

29:40

Right? And those 2 can be separate stabilizers. Right? So the automatic is probably URL encoded, so we're not, you know, plugging up the database. And the, manual is probably database so that it stays around forever, and we have a record of it.

29:57

Right? So then you've got 2 different stable IDs, and how the user ends up using those is kinda up to them. Right? Or somewhere else in the app, we could take in a stable ID and not know which one of those 2 it came from. Yeah.

30:18

That'll make sense. He seemed quizzical.

30:21

Sean

I always wondered why why do we even have a database stable ID? Like the stable ID and the URL encoded one contains all of like the entire filter. So why, why do we need anything else? Like we have you, we, why can't we just give developers, here's the stable ID. Save it to a database if you want.

30:41

Aaron

Okay. Let me see if I understood that correctly. So why why do we give them a database stabilizer versus giving them just a stabilizer and saying do whatever you want with it?

30:53

Sean

No stabilizer. Just like, hey. Give me the ID for this for the I don't know. Call it I wouldn't even call it an ID. Call it, like, the compressed Right.

31:03

Aaron

Data Serialize

31:04

Sean

filter. The filter. Serialize. Yeah. Serialized this filter for me.

31:08

And that's the thing that we give them back that goes into the URL because that contains by necessity, everything it needs in order to reproduce the filter. Why do we need anything else other than that? Why I'm not I'm genuinely curious, like, the use cases. Like because, hey, we got this, we got this value, contains everything you need. Why don't we just expose only that to developers and then you decide what you want to do with it?

31:31

Save it to the database column, put it in a URL, whatever.

31:36

Aaron

Yes. So, okay. So I understand the question. One is developer experience, developer convenience. I mean, giving the to and from like, somebody's gonna have to write that plumbing.

31:51

Right? So somebody's gonna have to write the unserialized d c or serialized deserialized part. And so if we can write it for them like, the way that we do it is we take the entire state, encode it, compress it, and URL encode it, and then we run it backwards when it comes back. So that's a nice thing that we can do for our clients, our consumers. And then it's really nice in terms of, like, why don't we just give them that URL?

32:25

Because we can put on the filter itself, like, automatically stabilize this through the URL encoder, or automatically stabilize this through the database encoder, and it handles all of that plumbing at that level for them. So they can just have a database encoder and say it's this model with this column, and put the team and user ID on it as well, And then automatically, like, it's a first class citizen that we have built in, so that they don't have to, in a controller, in a command line, in a whatever, they don't have to do that themselves.

32:59

Sean

I always felt like the stabilizer was this unnecessary noun. I mean, cause I get what you're saying that we want to make it, we want to save them the trouble of having to put together the boilerplate of connecting and saving to a database column. Mhmm. Right? But how much do we actually save them by having the database stabilizer class?

33:23

You still have to write the code that says, get the ID or get the serialized version of the filter, save it to a column. Like that I don't

33:32

Aaron

have to write that. That's what the database stabilizer does.

33:36

Sean

Oh, so they don't have to specify the table that it's going to be saved in. They don't have to No. All of that. So should we ship with a stabilizer that you can use that then automatically connects to the database and has in rails as the migrations that we need to add the table and like all that stuff? Yep.

33:55

Got it. That makes sense.

33:57

Aaron

Yep. And if they want to change it, they can extend it and like, you know, change the column name and they don't have to write the whole class. They can just say, you know, I just want to override this one method. So yeah, we ship with all of that.

34:10

Sean

That's a good idea. I got it.

34:15

Aaron

Yeah. So did a bunch of work on that this weekend. I think they're better now. Rewrote some docs and I'm much more pleased with it. And I have the huge benefit of nobody has Laravel stable IDs out in the wild, so I don't have to worry about breaking anything.

34:31

So it's not what I did is not backwards compatible and it doesn't matter. So I'm super thrilled about that.

34:41

Yeah. They're doing Oh.

34:42

Go ahead.

34:43

I was gonna say they're doing something with stable IDs, which I didn't really see coming, is every Oh. Everyone has to have a stable ID. So, basically, if you don't if you haven't defined a filter, they make you kind of a a default example filter, give it a stable ID, and give it to you. So it's it's kind of a because it's in your initial form. Like your initial you're creating a new thing.

35:08

They give you our filter and if you don't select anything, they just give you a default. But you're required, then the the model is required to that instance has a stable ID.

35:24

Okay. Why do they I don't know if I fully understand, but why do they do that?

35:33

Sean

It's like a it's both just the way it's integrated in bullet train, I think.

35:37

Aaron

Yeah. I think, it's cool though. Like, it's neat. I actually I think it's cool. It kinda threw me off at first.

35:42

I was like, why are they doing this? But I think it's it's kind of a neat way to use it because they always have, like, a default you're basically showing the user, here's how you could use this filter. It's like, here's a default filter. So I think it's cool, but it it's So,

35:58

Sean

like, in bullet train, you could scaffold a model. So okay. Bullet train scaffolding means, bullet train takes when you're like generating a model in Laravel and Rails, probably the same thing, similar thing where you have to like spit out all the SQL to create it and do all this stuff. So bullet train adds special fields that you can add to the model outside of rails, the rails framework. And in this case, it adds a filter field.

36:26

So you could add a filter field to your contacts table, for example, which then when somebody goes to edit the, a contact or sorry, the contacts table. So when you're in that index view, you can add a filter, which then is shared across all contacts. I think. So the idea would be like there's you can you could create product specific filters, which then and you can edit them in the sort of like basic admin CRUD app, and then it would be available everywhere. So it's tied to the table.

37:03

Aaron

It's cool.

37:04

Man, this bullet train stuff, It's cool. I haven't, I'm not a rails developer, so I like haven't dived into it all, but I think this is gonna be a huge win for us being bullet train compatible and or, you know, first and a half party bullet train.

37:26

Sean

Yeah. It depends on what Andrew does with it.

37:28

Aaron

Yeah. Totally agree. Exactly. Exactly. One other thing.

37:35

Let's see. I got us set up on ConvertKit.

37:39

Yay.

37:39

Yeah. So I don't know. Yeah. I don't know how the teams work. I may just share my password.

37:45

I don't really know. But I got to set up on, there with like a proper account. Did the d k I m thing on our domain so we can send and not get, you know, blacklisted or whatever.

37:56

Yeah.

37:56

Because we've got, like, 370 people on the torchlight email list.

38:01

That's amazing, Aaron. I

38:03

know. Wow. People just yeah. So I had been sending them out, you know, manually, the early access stuff manually from Gmail. And finally, I was like, I have got to get because there are things I wanna update them on, like stuff I've added to the API and new clients we've created.

38:18

And it's like, oh, I can't just keep sending it from Gmail. That feels bad. So we've got everybody imported into ConvertKit, and we weirdly have, like, 10 or 11 people signed up for the refine early access list, because I added, I added a link and a form to the home the Hammerstone home page. So now you can go to Hammerstone, and it's like, hey. This isn't released yet, but you can go sign up, and 10 or 12 people have already signed up.

38:46

So once we start, like

38:48

Awesome.

38:48

Yeah. Once we start putting like little teasers out there, I'm going to point people more to the refine, early access list and we'll get, we'll get all of those people too.

38:59

Sean

So it may be too late for this cause it's already kind of a sunk cost, but it might not have made sense to go with ConvertKit.

39:06

Aaron

Tell me.

39:06

Sean

For what we're doing. Because, well, ConvertKit's expensive relative to I mean, it's it's if you are making money with your mailing list, it's not expensive at all. It's a no brainer if you're doing email automation. So if you're building email campaigns, courses David Dobrin:

39:26

Aaron

For green funnels.

39:27

Sean

David Dobrin: funnels, all of this stuff, then ConvertKit pays for itself more than enough. But then if you're not doing any of that and you're just like sending broadcast emails, it's a waste of money. K. So what's better? Has for this, just a broadcast email, Mailchimp has like a free tier for up to some number of emails, which we could probably use for a while.

39:54

And then it's also a lot easier. Well, it was. I haven't looked at ConvertKit for a few years. ConvertKit is not,

39:59

Aaron

not my favorite, so I'm not, I'm not really married to it. It's not super

40:05

Sean

easy to use. Yeah. Yeah. For just a simple broadcast email? No.

40:11

Aaron

It's not. Yeah. Kind of sucks. Mhmm. Okay.

40:15

I can move us to Mailchimp. I mean, I don't know that we've actually paid yet. I think we're still maybe within the 7 day. I did upgrade to, like, the $29 a month plan, but I don't think we've actually paid. So I can move us over to Mailchimp.

40:28

I don't

40:28

really have a problem

40:29

with Yeah.

40:29

Sean

If we're just doing broadcasts and from my perspective, I can't see us doing a ton of email marketing with this for a while at least at this number.

40:39

Aaron

Nothing beyond broadcast, I think. Yeah.

40:41

Sean

Yeah. So like, I don't know. So like I've right in the old list, I have 20,000 people there, and that's in ConvertKit, and that's over $200 a month. Yeesh. Sucks because I'm like

40:54

Aaron

Then you don't you don't send them anything.

40:56

Sean

No. Exactly. Well, there's still people signing up. So they go through my whole automated sequence and randomly from time to time I get a sale. So it kinda almost pays for itself.

41:06

It's it was, like, a $100 shy of paying for itself last year. But the but that's just, like, this absolutely tiny trickle of sales that I have at this point from not thinking about that side of the business for, like, 4 years. So that and then now I'm now that I'm paying that, I'm kinda stuck because I'm like, okay. Do I Mhmm. I have to do the work to rip it out, to do something simpler, which is going to take me probably a couple of days.

41:39

And then I'm like, I could do that or pay $200. And I make that decision basically every month.

41:45

Aaron

Yeah.

41:46

Sean

So, yeah. That's what you said ConvertKit. And I was like,

41:50

Aaron

no. Yeah. I kinda just stuck

41:53

Sean

in there again.

41:54

Aaron

Made the decision and because I didn't wanna bother anyone and just, like, get it done. But I can move it to Mailchimp. That's fine.

42:01

Sean

Yeah. It's not like it's the end of the world either way because cause we're just using it for broadcast. But, yeah, it gets expensive fast to add emails to ConvertKit, and it's by email address.

42:09

Aaron

Yeah. That's silly to me. So it looks like Mailchimp has a free plan up to 2,000 contacts. But they have branding. They keep the Mailchimp branding on it.

42:20

And for the to remove the branding and have up to 500 contacts, which is how many we have, it would be $10 a month with Mailchimp. So I kinda wanna go with the custom brand, the no Mailchimp branding, and pay $10.

42:37

Sean

That's fine.

42:38

Aaron

Feel good about that? Agree.

42:39

Totally. Okay.

42:40

I'll switch this over.

42:41

Hey. Speaking speaking of the success of Torchlight, how's that going? Didn't you hire didn't we hire someone to build it out on the rail side? Because I totally want it. I'm like, when do I get to use this?

42:54

Yeah.

42:55

So Andrew has put me in touch with his guy that does a bunch of bullet train stuff. Okay. And we're gonna we're gonna I'm writing something up for him so he knows, like, what to do and how to do it, and then we will have it on the rails side. So, yeah, that is that is coming. It's waiting on me to write, like, the specs and stuff, but then I forget what his name is, but then he'll take over.

43:18

So it's coming. I'm thrilled that you won it. That makes me super super great.

43:23

It's so how does it work? Is it if I now if I spin up a Laravel app, do I just add, like, a JS snippet you provide me, and then that lets

43:31

me cut you off? JavaScript.

43:33

What?

43:34

Yeah. It's all server side clients. So, on, let's say, the Laravel side, it so, like, as the request, it gives you a custom component on the Laravel side. So instead

43:57

Okay.

43:59

And so you would use that. Torchlight captures the contents of that tag.

44:04

Okay.

44:05

And, like, leaves a placeholder. So it goes through the page, captures all the contents, leaves a placeholder 1234. And then on the way out, it takes all of the code and sends it out to the Torchlight API

44:20

Mhmm.

44:20

Gets it all highlighted, it comes back, and it swaps it in to the placeholders. So your response going out to the browser has fully highlighted code, fully baked HTML, and everything. So the general theory is gather all the code blocks on a page, send it out, get it back, swap in highlighted stuff, send it to the browser. Okay. So the question then is how is that performing at all?

44:48

Is that the question?

44:49

That is the question.

44:50

That is the question. So we do a couple of things. One is once we we cache the blocks based on, like, a hash, basically. So of the contents of the block, the, options that you've chosen, the theme, etcetera, we you know, all the server side clients cache it based on a hash of each block.

45:12

Okay.

45:12

So most of the time, it doesn't go out to the API at all, because we cache it for 7, 14 days, whatever. So most of the time, it never hit it just pulls it from the cache and swaps it in. Otherwise, when it does go to the API that's why we that's why we, catch them all on one page and then send it off. Because if you were to send off a request each time, you'd be hosed. Right?

45:40

So we get all the blocks and send them to the API at once. And if there are too many blocks on a page, the API itself will fan out back to itself. Right? So if there are if you send a 100 blocks to the API Mhmm. The API will look at it and say, well, that's I'm not gonna get that done in a reasonable request time.

46:01

So I'm gonna break those down into chunks of 10 and send those out to the API so that you basically fan out to 10 processes, and then it puts them back together and sends it back to

46:12

you. Okay. Cool.

46:13

So, yeah. And on that note, just real quick, we're going long, but on that note, speaking of clients, I wrote a common mark to client, which is a PHP markdown parser. Someone else reached out to me and said, hey. I'm writing a Symfony client. Is that okay with you?

46:34

Symfony is another PHP framework. And I was like, yeah. That's okay with me. Like, you're you're writing a a client for us? Like, that's amazing.

46:43

It's like, yeah. I just really want it in Symphony. So I thought I thought I would write it. And then, like, 20 minutes ago, I got a Twitter notification that said, this guy, Tim Klyersberg says, yo, Aaron, on Twitter. Yo, Aaron, you told me in your early access to tell you about things we've built.

47:03

So, yeah, I built a plugin for 11 t to easily highlight, content with Torchlight. So he just linked me to this repo where he's got an 11ty plugin, and you can just, like Oh, wow.

47:16

Can I see that? I'm gonna use it in Netlify. That'd be cool.

47:19

Yeah. For sure. I'll put it in our I'll drop it in our chat. I need to respond to him. He literally tweeted me right before we even

47:25

got on

47:25

the show. But it's like, man, we're getting all of this great, like, community support, people doing all of this really great stuff for us. And I think, like, I had hoped that this would happen, but the split between Torchlight is free for personal and open source, and then it costs money for businesses. I feel like that's a real, like, a real good way to go because then all of these people that are like, oh, I want it, you know, I want it for my blog or I want it for my docs or whatever. They're like, oh, I'll kind of, you know, spend some time and build out a client.

48:00

Yeah. Sure. That that that's fine with me. And it's like it it benefits the community and it benefits, you know, hammerstone. So I'm pretty pumped about that.

48:10

It's exciting.

48:11

Yeah. So I gotta reach out to this guy and say, man, what a legend. So we've got 2 community packages now, symphony and 11 t, and it's, like, just it's thrilling. So and and we'll get we'll get you your Ruby one as soon as we can. Okay.

48:30

I think I mean, I think that's all I had. Yep. Yep. Yep. Yep.

48:34

Yep. I'll get this moved over to Mailchimp, and then I will also I think we talked about this in Slack, but, Sean, I'll handle the packaging of the Vue client so that it people can NPM install it and stuff. So I'll handle that Yeah. Whenever everything comes out of there.

48:54

Sean

Conditions that I might be able to hand off to you. The thing about that is what that would require would be basically documentation, which I do need to do, but I don't need to do it for our first release, so I kind of feel like I should not do that because I don't think it would save me time given the amount of time that we have. Right. But other than that, the only other thing on the front end you could easily help me with would be writing some tests, which would be just like feature tests, like click on stuff and then, you know, like ingest or whatever.

49:37

Aaron

Do you have a few of those already? Because the hard

49:40

Sean

part for

49:40

Aaron

me is writing the first anything. If I can pattern it after something else, that's easier for me.

49:46

Sean

I gotta look. I know I wrote test for the renderless renderless stuff, but I can't remember if I did it for any of the tailwind components yet. I think I did a few. And then I also have I have some I have documentation, so I'm kinda writing as I go. Because basically I started as I started from, like, write the API that I would like to build, that I would like to use, and then Love it.

50:11

Implementing it. So I have that, but that plus, if I could get you one tailwind example, what you could probably run with it. And then Yeah. But that's like like the package thing will be incredibly helpful to me because I have no idea how to do it, and it would just be like this whole extra project.

50:32

Aaron

It is soul crushing. So I will handle that. Cause I've done one recently. Yeah. And if you want to get

50:41

Sean

You're soul crushed.

50:42

Aaron

Yeah. Thanks. If you wanna get the testing file set up with one test and then a bunch of to dos, that would be easy easier for me to pick up and come in and just, like, knock out some of those to dos or skip tests or whatever.

50:57

Sean

Okay. Okay.

51:00

Aaron

We good? Anything else? Okay. See y'all later.

Details
Show
Hammerstone
Date
Sep 10, 2021
Role
Host
All podcasts
Podcasts
Newsletter

Every week: the best things I've found and what I've been thinking about.