Launch Day is in Sight

November 17, 2021

It's finally here.

Transcript

Aaron
00:00:00 – 00:00:16
Okay. We're back. Sean's having a little bit of computer issues today, so his audio is coming through his headphones instead of his mic, but it's not that bad, and we can deal with it. So speaking of issues, Sean, you've been working on bundling. How's that going?
Aaron
00:00:16 – 00:00:16
I I
Sean
00:00:16 – 00:00:18
bet that's what broke my computer.
Aaron
00:00:18 – 00:00:19
That's Probably.
Colleen
00:00:19 – 00:00:20
Definitely.
Sean
00:00:21 – 00:00:54
Yeah. So I'm I'm I'm just down to the point where I need to bundle it up into a package that we can release on NPM, and then, yeah, it's time for, you know, you and me, Aaron, to link it up, make sure that I'm speaking the same language. Like, I think that I've got the I mean, I think that my blueprints that I'm generating are what you're gonna expect. Pretty sure they're identical to what I'm generating in the rail side, so, so we'll have to get that all synced up. And I think that it would be faster for us to do that not via the package.
Sean
00:00:54 – 00:00:58
So the the package does not really hold up on us, like, doing that work, if that makes sense.
Aaron
00:00:59 – 00:00:59
Mhmm.
Sean
00:00:59 – 00:01:17
So whenever you want, you and I could team up and make sure that that that works, figure out how we wanna do that. It's also thinking of, like, maybe we want to have a separate repo, which is basically just like our 2 projects pulled together to create Mhmm. Something so that way we can run integration tests on it. You know what I mean?
Aaron
00:01:17 – 00:01:18
Yep. That makes sense.
Sean
00:01:19 – 00:01:33
Which is a little bit crazy, but kind of like maybe what we should do. Yeah. I don't know. It's worth discussing, at least, if that approach makes sense, or if there's something simpler to do that we could do. But but yeah.
Sean
00:01:33 – 00:02:06
So then so that's done. Then the the bundling is, you know, should be easy, but it's not. I, like, I don't understand why it's a hard problem for me to just only build my code and not include all the other code, you know, that I'm pulling as dependencies. I don't I mean, it it is in theory. Like, if there's directives in, in webpack for me to say, like, exclude these things, etcetera.
Sean
00:02:07 – 00:02:26
And view CLI, the live the library that I'm using to, like, just create the project, does a whole bunch of stuff for me that I don't have to configure. So that's cool. But I have it set up the way it should be, and it's excluding most of these dependencies except for 1, and it's mysteriously just hanging around. So I'm just figuring that out. And it's just this one particular library.
Sean
00:02:28 – 00:02:42
Yeah. So it's it's weird. Like, I don't understand, like first of all, this library, I'm only using 2 functions out of it. It's, like, probably would not be that much for it to just be inlined. On the other hand, probably a lot of people use it.
Sean
00:02:42 – 00:03:06
It's this, like, time library. It's sort of the canonical library that people are using for time stuff now. So it makes sense for it to be a dependency that people pull in on their own. But on the other hand, it's also, like, kinda tiny amount of code, and I'm only importing these 2 functions. And in theory, it should do this tree shaking thing, and it shouldn't it could just inline it, and it would be small a small package to include.
Sean
00:03:06 – 00:03:32
So even if I did screw up the web pack, which I have, and it was included, it would be small, but it's not. So that's not working either. So, yeah, I don't I don't know. I'll figure it out, but it's stupid and annoying, and I don't understand why it's, like, just build build the library, build the code, and then don't include don't concatenate the other libraries unless I tell you to. I mean, I don't isn't that what basically you almost always want?
Aaron
00:03:34 – 00:03:35
Yeah. Basically.
Sean
00:03:36 – 00:03:56
So I don't know. Very frustrating. And I I've just been copy pasting magic incantations in, like, for each different library to get it to not include not concatenate into the the final build. Like, seriously, like each one has had its own little special thing I have to do. There's, like, this excludes thing in webpack.
Sean
00:03:56 – 00:04:07
It seems straightforward. You just put that in there, and then that should work. But, no. I had to go change something in my babel config in order to get one of them to not be included. Like, I don't understand why.
Sean
00:04:07 – 00:04:11
That makes no sense to me. It's it's weird.
Aaron
00:04:11 – 00:04:24
I know. It's very frustrating. Hopefully, this will be one of the benefits of being open source is someone can come along and say, like, you should change all this build step. Be like, great. Please change it for me.
Sean
00:04:25 – 00:04:40
Yeah. Yeah. I mean, in the end, I don't think our setup is gonna be that complicated. It's just, I just gotta get that one last kind of piece in, and then yeah. And then we're and then we're there, and I can push that out.
Sean
00:04:40 – 00:04:46
And then, yeah, I wanna do something crazy and see if I can get it to work in the rails code that our client is running just for fun.
Aaron
00:04:46 – 00:04:49
Oh, like as a smoke test?
Sean
00:04:50 – 00:04:54
Yeah. No. Smoke test would be I just yarn at it to my own project and then run it
Aaron
00:04:55 – 00:04:55
Mhmm.
Sean
00:04:55 – 00:05:14
There, instead of running from my own code. But the like, you know, that'd be the easiest thing. Just create another view client project, and then run it with the data that I've been providing. That'll be a fast test. But, yeah, it would be fun just to see it working with with, Colleen's stuff.
Sean
00:05:15 – 00:05:19
Swap out the Hotwire thing, put in the Vue client. That's kinda neat.
Aaron
00:05:19 – 00:05:21
Mhmm. That's pretty that would be very
Sean
00:05:21 – 00:05:22
to for fun. Yeah.
Aaron
00:05:24 – 00:05:30
Yep. Yeah. That would be awesome. Well, I am off all of next week, for Thanksgiving.
Colleen
00:05:30 – 00:05:31
Me too.
Aaron
00:05:31 – 00:05:44
So if any of those days work, for you, Sean, to do some integration stuff, then I might be able to set aside, especially, Monday, Tuesday would probably be easier.
Sean
00:05:46 – 00:05:51
Okay. Yeah. Probably not, but maybe
Aaron
00:05:51 – 00:05:52
That's fine.
Sean
00:05:52 – 00:05:54
I mean, I was telling you guys about all my work stuff.
Colleen
00:05:55 – 00:05:55
Yeah. Mhmm.
Sean
00:05:56 – 00:06:25
All the non developer work stuff ate into my developer time, and then I have commitments that I have to finish up for clients to get, like, some, you know, some of our important clients to get some stuff done code wise. So we'll see. But then, you know, certainly wouldn't be unreasonable for me to take a day off next week. I'm sure quite a few of us will be doing that. So that would be that would be awesome, actually, if I could get the work stuff, like, wrapped up, buttoned up, and then get a day off to do that with you.
Sean
00:06:25 – 00:06:27
That'd be sweet, but we'll see what happens.
Aaron
00:06:28 – 00:06:37
Okay. Keep me updated. I'll be I'll be around. I mean, we're not we're not traveling. We're actually hosting Thanksgiving here, and our office is closed for the entire week.
Aaron
00:06:37 – 00:06:46
So Right. Yeah. I'll I'll be good. That's pretty big. I mean, that's pretty pretty exciting.
Sean
00:06:47 – 00:06:53
Yeah. So, like, where do you where are you at with, like, comfort level with soft launching? Like, once we just started working?
Aaron
00:06:53 – 00:07:01
Yeah. I'm ready. Let's let's integrate it, make sure that everything matches, and then Yeah. Start reaching out to people on Twitter.
Sean
00:07:02 – 00:07:05
We gotta double check on how I'm doing refinements and make sure that makes sense to you.
Aaron
00:07:05 – 00:07:07
Yeah. That's one open for me.
Sean
00:07:07 – 00:07:26
Decided I'm doing it, I think, what we decided together. And then the error data format, that's so easy to change and swap around. It's literally just, like we could just whatever makes sense, we'll just do that. But I I just put in what I thought probably was what we'd end up with.
Aaron
00:07:26 – 00:07:27
Yeah. I think that's
Sean
00:07:28 – 00:07:32
right. And then I did not do the deferred condition.
Aaron
00:07:33 – 00:07:51
That's fine. That one was very cool. I don't know if I don't know if the client has that one. And so, Collin, you may have never seen it, but it's very cool. It's like the option condition where they can say, like, you know, let's say, color is red, blue, green, purple.
Aaron
00:07:52 – 00:08:17
But it is an a like, the options are provided, via AJAX. So they can start typing. It'll hit the back end, refine will do the query based on what they've typed and send back viable options for them. So if it's an option condition of, like, you know, 10,000 options or whatever, then we don't have to send them all down. So it's very cool.
Colleen
00:08:18 – 00:08:18
Nice.
Aaron
00:08:20 – 00:08:24
Yeah. I'm I'm ready. I think that's great. So we've got getting it. Yeah.
Aaron
00:08:24 – 00:08:50
We've got the licensing portal set up through unlock.sh, which is incredible. So they will, I can set up fees and take billing and everything through there, and they handle the distribution. So everything on that side, I've got all set up. So, yeah, I think I think that's it. I think we're ready to go.
Sean
00:08:51 – 00:08:56
Mhmm. Yeah. Absolutely. So crazy. So if you know anybody that's interested.
Aaron
00:08:57 – 00:09:14
Yeah. I have a couple a couple people that have already reached out over the past, you know, whatever, 2 years, and they're ready to ready to try it. So I know. It's crazy. It's a big deal.
Sean
00:09:14 – 00:09:15
Cool, man. Yeah.
Aaron
00:09:15 – 00:09:15
Yeah.
Sean
00:09:18 – 00:09:19
They're gonna pay for it. Right?
Aaron
00:09:20 – 00:09:20
Yes.
Sean
00:09:21 – 00:09:21
Cool.
Aaron
00:09:22 – 00:09:23
Yeah.
Sean
00:09:24 – 00:09:26
Awesome. Getting that stranger money.
Colleen
00:09:26 – 00:09:28
I know. Yeah. That's great news.
Aaron
00:09:29 – 00:09:44
I know. It's gonna be great. We've we got our first license 2 years ago, and now we're ready for numbers 2, 3, and 4. You know? K.
Aaron
00:09:44 – 00:09:46
Anything else on your side?
Sean
00:09:48 – 00:10:06
Mm-mm. No. Other than yeah. It's, like, tempting to I'm not gonna do this, but, like, the React version for just doing a builder version, it's like it's a fully formed in my mind. I just need to, like, poop it out in the code.
Sean
00:10:06 – 00:10:09
Like, I could do it at any point, but it's it's
Aaron
00:10:10 – 00:10:17
On that note, someone reached out to me saying they may want us to help them with a React version of it.
Sean
00:10:18 – 00:10:18
Yeah. Okay.
Aaron
00:10:19 – 00:10:35
So let me let me see exactly what he's looking for on that, and I may send him over to you. It was it was the last DM I had. It was like, hey. We'd love to pay you guys to build this out and react for us.
Sean
00:10:35 – 00:10:39
K. So That that makes sense.
Aaron
00:10:39 – 00:10:53
All this the way that you did the view stuff was so, like, you know, advanced Vue, like, basically not Vue, it's gonna translate super easily to React because you did all the composition stuff. Right?
Sean
00:10:53 – 00:11:34
Well, so, yeah, all of that stuff is above and beyond, like, just what I need in order to do the the builder version. But also, yes to what you're saying. Like, it's so much easier for my brain to think in React, and how I would do this in React, and, like, all of the the, like, statically like, the pure front end query builder code. Like, the basically, the declarative language for, like, the sorry. Domain specific language for building queries that you can you just write components out on, you know, like, that would enable us to do, like I keep wanting to call it spec search because that's what we used to call it, faceted search.
Sean
00:11:34 – 00:12:07
You know, that stuff, put that aside. That's easy for that's easier for me to wrap my head around in React than it was for Vue. And, like, building APIs for developers with the tooling that I have in React is, again, easier for me to wrap my head around. But just building the query builder component that accepts blueprint and errors and conditions, like, that is also easy and fully loaded in my brain and, you know, should not take more than I'm not gonna say, actually, because I'm gonna jinx myself. It should be easy.
Sean
00:12:08 – 00:12:10
Like, it should be pretty easy.
Aaron
00:12:12 – 00:12:20
That's great. Well, I'll see what this most recent DM from the React guy says and see if it lines up with anything we wanna do.
Sean
00:12:20 – 00:12:35
Okay. Yeah. Like, if they have a budget that they wanna throw at us and whether it's less than what we think we would need, that's fine. Like, it would be enough to, like, just prompt me to do it then.
Aaron
00:12:35 – 00:12:36
Mhmm.
Sean
00:12:36 – 00:12:36
That makes sense.
Aaron
00:12:37 – 00:12:42
Oh, speaking of budget, did, you ever get in touch with Matthias?
Sean
00:12:43 – 00:12:55
Yeah. We just couldn't, our wires just kept crossing, I guess. So Really? We we never really connected. I tried I tried to pull them in the email because I think Twitter DMs, both of us just, like, lose them.
Aaron
00:12:56 – 00:12:57
Yeah. Same.
Sean
00:12:57 – 00:12:59
But we didn't make it there. So
Aaron
00:13:00 – 00:13:00
Pity.
Sean
00:13:02 – 00:13:04
Yeah. We'll find somebody, though.
Aaron
00:13:07 – 00:13:12
Okay. Cool. Colleen, what's going on over there in California?
Colleen
00:13:14 – 00:13:20
You know, it's 65 degrees today, so I told my children they needed to wear pants because now that's cold for us.
Aaron
00:13:20 – 00:13:22
Mhmm. It's winter. It's the dead of winter.
Colleen
00:13:22 – 00:13:51
Basically winter. So we have fully acclimated when we decided it was cold. So yesterday was a big day on the client side. I spent hours, hours, the majority of my work day yesterday, talking to the client and talking to some database experts and trying to figure out how we're gonna handle the multiple database problem. And, Aaron, you are part of that discussion.
Colleen
00:13:51 – 00:14:06
So we are going to I'm going to change a little bit the way the query is working. So it'll be interesting to see how it all how it all ends up. But I'm trying to get the We're
Aaron
00:14:06 – 00:14:16
we're we're ending up with multiple databases because they anticipate having tens of billions of rows in their events table.
Colleen
00:14:17 – 00:14:17
Right.
Aaron
00:14:17 – 00:14:33
And so they're pushing that onto a different provider than the rest of the application. And then the fun part is they want us to search through both at the same time, like be able to build filters against both sets at the same time. Right?
Colleen
00:14:33 – 00:14:50
Yep. So that'll be an adventure. I think it's good. I'm glad we have a path forward, and it's maybe not how we initially, designed it or had anticipated it being used. But I think it's gonna be fine.
Colleen
00:14:50 – 00:15:06
I think it's gonna work fine. It's a great way to prove this proof of concept that we can do this. Oh, you got this guy and this this table in Postgres and this table in MySQL? Like, we can still make that work. Do that now.
Colleen
00:15:07 – 00:15:16
So yeah. So but it was a lot it was a lot of talking to people yesterday, but I think I'm happy that we have a path forward, and I feel good about that.
Aaron
00:15:17 – 00:15:23
Yeah. It was weird for me because I I mean, at some point, I just had to say, like, I don't know.
Colleen
00:15:23 – 00:15:24
Like, I've
Aaron
00:15:24 – 00:15:29
I've never dealt with tens of 1,000,000,000 of records. So I real I really don't know.
Colleen
00:15:29 – 00:15:29
Like, I can
Aaron
00:15:29 – 00:15:31
tell you the theory, but I don't know.
Colleen
00:15:31 – 00:15:57
Like and I've talked I talked to a couple other people. Like, I have a friend who's really who's an super senior rails developer and a super senior database guy, and there's no answer. I mean, that's what I'm finding, right? Like, there's no one definitive this is the best way because there are so many factors in play here. And, you know, I spent an hour on the phone with him trying to, like, tease out, like, what is the best path forward?
Colleen
00:15:58 – 00:16:19
And no one really knows. So we have 5 different people that we, you know, that I talked to yesterday who have different set of experience and, you know, different stacks and different database, Postgres, MySQL, like, different database expertise. Mhmm. And the answer is no one is quite sure. And so this will not break.
Colleen
00:16:19 – 00:16:29
This might not be as fast as we were hoping or is our our initial design was gonna be lightning fast. Right?
Aaron
00:16:29 – 00:16:29
Mhmm.
Colleen
00:16:29 – 00:16:42
So we don't really know, but you don't know until you do it. That's kind of where I think we are. We know it's not gonna break. We know it's gonna work. And so we just gotta stop talking about it and do it because
Aaron
00:16:42 – 00:16:42
Right.
Colleen
00:16:42 – 00:16:44
We're not gonna know until we test it.
Aaron
00:16:45 – 00:16:51
And it it like, everything with databases, it depends so much on the shape of your data.
Colleen
00:16:51 – 00:16:52
Right.
Aaron
00:16:52 – 00:16:57
So you could have the same setup with 10 different data shapes, and it worked 10 different ways.
Colleen
00:16:58 – 00:16:58
Right.
Aaron
00:16:58 – 00:17:11
And so that makes it really, really tough. Did your database expert friend have anything, like, insightful that we weren't thinking about? Because that would be helpful for me to know.
Colleen
00:17:12 – 00:17:29
I don't think so. I mean, he talked a lot about with this level with this number of rows and this level of complexity, you really need to you really need to optimize it at the application level. Like, so I was trying to optimize it at the query level, and his point was you really need to optimize it at the application level.
Aaron
00:17:29 – 00:17:31
And so Explain the difference there.
Colleen
00:17:31 – 00:17:45
So I'm trying to say what is the best, the smartest, most performant query. And he said, you need to go back to your events table and said, what data do I need? When do I have like, do I have the right information on the events table indexed correctly?
Aaron
00:17:45 – 00:17:46
Oh, I see.
Colleen
00:17:46 – 00:17:57
That kind of stuff. Like, how can you can you So do a limit offset? Like, what can you do in real time when you're serving the data to make it appear quick.
Aaron
00:17:58 – 00:18:06
Gotcha. So put a lot of effort into the ingestion and storage of the events such that the querying can be efficient.
Colleen
00:18:06 – 00:18:11
So your query yes. So your query events table as efficiently as possible the way you build that table.
Aaron
00:18:11 – 00:18:12
Mhmm.
Sean
00:18:14 – 00:18:43
And then, like, build into your application logic, like, UI patterns, etcetera, that help to mitigate that that's not, like, a super fast query. And then probably also trying to figure out how to not blow up your memory stack, like because wouldn't it doesn't seem like that's a risk trying to do stuff at the application layer? Like, we we run a query on events, and it comes back with, like, a million rows.
Aaron
00:18:43 – 00:18:44
Mhmm.
Colleen
00:18:44 – 00:18:44
Yeah. You
Sean
00:18:44 – 00:18:45
know what I mean?
Colleen
00:18:45 – 00:19:00
And so talking to, you know, talking to my friend, that was kind of hit. I don't wanna say that was his point, but he was like, do you really need a 1000000 records at one time? Like, why would you do you really need to execute that query? Like, can you do, you know
Sean
00:19:00 – 00:19:01
With limits, I think.
Colleen
00:19:01 – 00:19:19
Limits. That's what he was talking about. He was saying, do you really need to pull a 1000000 records through at a time? Like, what's the purpose of that? And so that's more of a client specific question, but I think once we build it, we can then work with them to iron out those details.
Colleen
00:19:19 – 00:19:44
What he does, he has an, analytics he's a CTO of an analytics company, and they do partitions. So they do table partitions in Postgres every 30 days. And so they, you know yeah. So so that was what he was talking a lot about how they use they partition their data. So point being, like, depends on what we depends on what database we use, but there will be strategies, I think, to make it work.
Aaron
00:19:45 – 00:20:05
Yeah. The every 30 days partition is pretty good. Because I would imagine most people, most end users are gonna wanna see stuff that's relatively recent. I mean, even if it's in the past year or whatever, you can still, after a while, drop off stuff that's older than a year.
Sean
00:20:05 – 00:20:05
So
Colleen
00:20:05 – 00:20:12
what yeah. What they do is they roll it up. So, like, after a year, then they roll all the data up so they don't keep, you know, the full events table.
Aaron
00:20:12 – 00:20:14
Oh, they don't even keep it.
Colleen
00:20:14 – 00:20:20
Yeah. They don't keep it past I don't I think he said a year. So then they roll it up because people but that works for his use case. Right?
Aaron
00:20:20 – 00:20:20
Sure.
Sean
00:20:20 – 00:20:20
Yeah.
Colleen
00:20:20 – 00:20:45
Because people wanna see stats going back x number of years, but they don't want contacts who viewed their page a year ago. Yeah. So I don't know exactly our client if if we are that flexible. But I do think if we think a little more, we being the client about what they really need, we can work to optimize it more, help them. But we gotta give them something to work with.
Aaron
00:20:46 – 00:20:59
Yeah. Yeah. I like the I like the partitions. I really I really think partitioning is a good way to go because it's managed by the database itself and not by us, which seems nice.
Sean
00:21:00 – 00:21:00
Mhmm.
Aaron
00:21:01 – 00:21:12
And the database can know I need to go to this one partition, and I can avoid these 10 others and not even, like, not even look there. It doesn't even matter because it won't be there. That's pretty awesome.
Colleen
00:21:12 – 00:21:13
Mhmm.
Aaron
00:21:14 – 00:21:17
Yeah. Yeah. Big day.
Colleen
00:21:17 – 00:21:28
Yeah. It was it was a big day. So it's all good things. It's just, you know, a change from, what we're originally trying to do.
Sean
00:21:30 – 00:21:35
So how's it gonna work with the query builder? So we're gonna allow them their users are gonna build queries.
Colleen
00:21:36 – 00:21:36
Yeah.
Sean
00:21:36 – 00:21:59
And then we're but their queries are gonna be so it's gonna be significant change under the hood, because we'll have to know, like, this particular clause or refinement, I guess, most likely, is gonna go through the events table, so then it's a separate query. Is that kinda how it's gonna work?
Colleen
00:21:59 – 00:22:00
Yeah. That's kinda how it's gonna work.
Sean
00:22:00 – 00:22:08
And then we give them, hey, look. You set it up with multiple tables. So then here's your query object. You figure out how to run it. Like No.
Sean
00:22:08 – 00:22:13
I mean, of course, we're gonna do the integration because that's what we're doing for them. So No. We figured out. But
Colleen
00:22:13 – 00:22:45
The plan and I'm still working on adding in these static filters. So I'm not I haven't worked on it yet today. But the plan is so right now, when we go through, you know, I want, oh, events with products that are red and products that are blue, and I want a contact with first name Colleen. Instead of returning the query, we will return a list of IDs of products that are red. So, it will be like select all events product IDs that match this list of IDs.
Colleen
00:22:45 – 00:22:56
So we'll execute we we, Hammerstone Refine, will execute the query, return the IDs, and then feed those IDs into the parent query.
Aaron
00:22:58 – 00:23:05
So we could end up executing, you know, 6 different queries in an attempt to execute the one user intention.
Colleen
00:23:06 – 00:23:06
Right.
Aaron
00:23:08 – 00:23:50
So anytime we cross a database boundary so we'll be inspecting the models as we go, and the models the Rails models have their connection settings on them. And anytime we notice, okay, this interior query that, traditionally would have been run as a subquery by the by the database. This interior query is run on a separate database than this exterior query, so we need to execute the interior query and get a list of just Scalar IDs, and then that becomes the where in. Instead of a where in subquery, it's where in list. And we just do that all the way out.
Aaron
00:23:51 – 00:23:56
Different, execute, different, execute, like bouncing back and forth between databases.
Sean
00:24:00 – 00:24:00
Yeah.
Aaron
00:24:02 – 00:24:03
Indeed.
Sean
00:24:04 – 00:24:17
Yeah. I mean, it's it's fine. Yeah. I just wonder if there's gonna be queries that they're gonna end up users will end up creating, which will be super duper duper slow. Like, that's gonna happen.
Sean
00:24:17 – 00:24:30
So then it's a matter of kinda like, if we're automatically letting them if we're automatically running all these queries. Yeah, that's that's a fun fun problem.
Aaron
00:24:31 – 00:24:32
Yeah. That'll be a problem.
Colleen
00:24:32 – 00:24:33
That's why
Sean
00:24:33 – 00:24:35
What's tell me about the static queries.
Colleen
00:24:36 – 00:24:54
Oh, that by static queries, I meant the nested queries. So, basically, I'm trying to add in a query like a refinement. I think we talked about it a couple weeks ago. So you know how you add refinements to, like, the inner the inner query? The subquery?
Colleen
00:24:55 – 00:25:05
So I want to add additional filter queries to that subquery, which sounds complicated, but it's really not. I think I'm not I'm not explaining it well. So
Aaron
00:25:05 – 00:25:14
It's like when you you have a filter and a filter, and so you wanna say, show me users that have bought product, my favorite products, and my favorite products is a filter
Sean
00:25:14 – 00:25:15
Is a filter.
Aaron
00:25:15 – 00:25:19
That's super complicated that you built and then saved somewhere else.
Sean
00:25:21 – 00:25:25
Okay. Yeah. That makes sense. Alright. Does that change our blueprint?
Aaron
00:25:28 – 00:25:30
No. That'll still be just an option.
Sean
00:25:30 – 00:25:32
Fascinating. That's so cool.
Aaron
00:25:33 – 00:25:53
Yeah. Yeah. Because all all, like, all saved filters basically have an ID and a display. So it's, like, Colleen's favorite products, December 2021 is the display, and then the ID is, like, 12345. And it's just an option condition to the front end.
Sean
00:25:53 – 00:25:59
Nice. That's cool. Very cool. Yeah. I was wondering.
Sean
00:25:59 – 00:26:03
I was like, oh, do we need to coordinate on that? But no. Awesome.
Aaron
00:26:03 – 00:26:07
No. And Yeah. And no because Laravel doesn't have that. So double no.
Colleen
00:26:08 – 00:26:09
Double no.
Sean
00:26:10 – 00:26:12
Laravel doesn't have that? What do you mean? Like, it doesn't
Aaron
00:26:12 – 00:26:21
have We don't have that we don't have that ability yet. So we don't on our side on the Laravel side, we don't have the ability to say this condition is a, you know, filter in a filter condition.
Sean
00:26:22 – 00:26:23
Oh, meaning we just haven't built that out yet.
Aaron
00:26:24 – 00:26:24
Correct.
Sean
00:26:25 – 00:26:32
Yeah. Got it. No. That's I was wondering about that. Like, we, like, we know that that's a thing, that people want.
Sean
00:26:32 – 00:26:35
So it'll just be, like, the rails side just gets a little bit ahead of
Aaron
00:26:35 – 00:26:36
Exactly.
Sean
00:26:36 – 00:26:37
The Laravel side.
Aaron
00:26:37 – 00:26:37
Yeah.
Sean
00:26:37 – 00:26:37
Yeah.
Aaron
00:26:37 – 00:26:42
I'm gonna let Colleen and her giant team of designers and developers figure it all out.
Colleen
00:26:42 – 00:26:43
Figure that out.
Aaron
00:26:43 – 00:26:57
And then I'm just gonna copy it. Yeah. Because the design is the the the design is a real issue. Like, how do you build, you know, a filter in a filter? And so they'll get that sorted.
Colleen
00:26:57 – 00:27:05
Yeah. That's I think that's that'll be fun, but I think that's down the road a bit. I think the sequel is the biggest technical concern they have right now.
Aaron
00:27:05 – 00:27:06
Yeah.
Colleen
00:27:06 – 00:27:16
We actually have a vision for it, Sean, which you'll have to help me with, but probably not till not for a while. But the vision is, like, you're building out your filter, and then you have this, like, slide in.
Aaron
00:27:18 – 00:27:18
Yeah.
Colleen
00:27:18 – 00:27:37
Like like, you're saying, I wanna find all all contacts who viewed a product named red. So you'd but the the product named red is its own filter. So it would, like, slide in, and you could build it and, like, build it in line and save it. Anyway, don't worry about that. That's that's way down the
Sean
00:27:37 – 00:27:38
road. Cool.
Colleen
00:27:38 – 00:27:39
But it'd be cool. Right?
Sean
00:27:39 – 00:27:40
Yeah.
Aaron
00:27:40 – 00:27:47
Yeah. Yeah. And that's the, that's, I think, the answer to infinite refinements. Like, why are we not just, like
Sean
00:27:48 – 00:27:49
Making it filters.
Aaron
00:27:49 – 00:27:54
Making, you know, refinements and refinements and refinements. It's because this is the vision there.
Sean
00:27:55 – 00:27:56
Yep. So
Aaron
00:27:56 – 00:28:07
Yeah. That would And since since filters are stabilizable, you could then use your Colleen's favorite products anywhere you want in any other filter that you want. Yeah. And so it's kinda like you get
Sean
00:28:07 – 00:28:15
to build it once. Super, super cool. Yeah. That equals enterprise clients. Yeah.
Sean
00:28:15 – 00:28:18
Same thing with your querying multiple databases.
Aaron
00:28:19 – 00:28:26
Oh, yeah. I actually actually think querying multiple databases is gonna make it into Laravel because it's it's a thing. People do this. Yeah.
Sean
00:28:26 – 00:28:34
Yeah. Yes. Oh, man. So this is, like, very, very exciting.
Aaron
00:28:35 – 00:28:39
I know. This client was our biggest win by far.
Sean
00:28:39 – 00:28:48
Yeah. Yeah. I just could see we we're killing so many objections when talking when we're gonna, you know, if we start talking with any other enterprise clients.
Colleen
00:28:49 – 00:28:50
Oh, yeah.
Sean
00:28:51 – 00:28:57
Because we yeah. We've solved real thorny problems by the time you're done with this, Colleen. It's crazy.
Colleen
00:28:58 – 00:29:14
So it can we go back to what you just said, though, Aaron? You said it would just be an option condition. But what I'm looking at contacts that have viewed a product filter Mhmm. That's 2 options condition because viewed is its own options condition.
Aaron
00:29:16 – 00:29:19
So it's almost like a nested options condition. Condition.
Colleen
00:29:19 – 00:29:22
Maybe this is a unique case that we can talk about later.
Aaron
00:29:23 – 00:29:49
Oh, I see. So I think you can make you can control the clauses on your options filter. Right? So instead of saying so you'd say, like, contacts have viewed a product, and, like, your your I think your options clause there would be have viewed a product, and then your go ahead.
Colleen
00:29:49 – 00:29:57
We want that to be selectable. It's not just have viewed. It's have have clicked on, have whatever's in that table.
Aaron
00:29:57 – 00:30:00
And each of those are different clauses, I think.
Colleen
00:30:02 – 00:30:02
Right.
Aaron
00:30:02 – 00:30:02
Yeah.
Sean
00:30:02 – 00:30:03
I see what you're saying, Aaron.
Colleen
00:30:04 – 00:30:11
Right. Right. Right. But then you need have viewed a product. Now, I need another drop down that's like To
Aaron
00:30:11 – 00:30:12
select product?
Colleen
00:30:12 – 00:30:26
To select product filter. At least that's what I'm working on. So the product filter in this case, again, we can talk about this offline, isn't its own independent condition. It's actually tied to another condition.
Aaron
00:30:29 – 00:30:44
Okay. Will you have so I was thinking the clauses would be have viewed a product, have clicked on a product, have something a product, and then the option that they would be choosing from is the product filter.
Colleen
00:30:45 – 00:30:59
But that viewed is my through key, right, on the events table. So Mhmm. I can't I can't do that because I need to build up the I have to go through anyway, we'll look at it later.
Aaron
00:31:01 – 00:31:03
I see. That's what you're saying. Yeah.
Colleen
00:31:03 – 00:31:18
All work out, but I I was just just you said that, and I was like, wait. Did I miss that thing? I think it's actually like double option conditions. So the static I'm just gonna call it static filter, but, like, the pre created filter has to tie into that specific condition.
Aaron
00:31:18 – 00:31:20
I see. That makes sense. Yeah.
Colleen
00:31:20 – 00:31:23
But I think it'll still work fine. I think it'll be it'll be alright.
Aaron
00:31:23 – 00:31:32
Yeah. For sure. As we've learned, we we can make anything work. Yeah. I I see
Sean
00:31:32 – 00:31:32
what you're
Aaron
00:31:32 – 00:31:33
saying now.
Colleen
00:31:33 – 00:31:34
Okay. Cool.
Aaron
00:31:36 – 00:31:46
Speaking of squashing or quashing objections, we have a call with a new potential Rails client on Thursday. Right?
Colleen
00:31:46 – 00:31:46
Yeah.
Aaron
00:31:47 – 00:32:05
So this all happened publicly on Twitter, so I don't feel like we need to not talk about it. But I saw let's see. How did it happen? Oh, the auto the auto tweet from Transistor went out when I published last week's episode. Somebody replied and said, what do you guys do exactly?
Aaron
00:32:06 – 00:32:25
And then, another guy that I'm Twitter friends with replied and said this you know, I've been listening from the beginning. This is what they do. And then Jesse, right, Jesse? Jesse Henley from Bento chimed in and was like, hey. I really need a query builder, and if you can solve this for me, I'll buy it yesterday.
Aaron
00:32:25 – 00:32:31
It's like, oh, really? And he's he's bento is on bullet train. Right?
Colleen
00:32:31 – 00:32:32
Sure is.
Aaron
00:32:32 – 00:32:35
And he and Andrew he and Andrew are like best buds.
Colleen
00:32:35 – 00:32:39
Yep. So, this is great. I think this is great. Yeah.
Aaron
00:32:39 – 00:32:52
Yeah. So, I told him, I mean, publicly, all all of this, I told him, great. We are working with bullet train. We've we're working with a client that's got 1,000,000,000 of rows. Like, we're not quite there, but do you wanna talk?
Aaron
00:32:52 – 00:32:57
And he's like, yes. I can talk tomorrow. Does that work? I was like, woah. I'm I'm going out of town.
Aaron
00:32:57 – 00:33:00
I, you know, I think Colleen's asleep or something.
Colleen
00:33:00 – 00:33:01
So
Aaron
00:33:01 – 00:33:04
we're talking we're talking to him on Thursday.
Colleen
00:33:05 – 00:33:08
Yeah. So It's Thursday night our time because
Aaron
00:33:08 – 00:33:10
he's in Japan. Because he's in Japan. Okay. That's right.
Colleen
00:33:10 – 00:33:10
Yeah.
Aaron
00:33:12 – 00:33:22
So that's kind of exciting. And his deal is I think he uses the, I forget what it's called, but it's the jQuery query builder as the front end.
Colleen
00:33:22 – 00:33:23
Okay.
Aaron
00:33:23 – 00:33:34
And good news is, like, we can, you know, intercept. We can write middleware for our adapter to work or for our blueprint to work with with the jQuery front end.
Sean
00:33:35 – 00:33:40
I saw him mention something like what was it? Query builder? There's, like, a website. It was, like, query builder JSON. I think
Aaron
00:33:40 – 00:33:44
it's query builder JS, maybe, Or j s query builder.
Sean
00:33:44 – 00:33:50
Query builder JSON website. Uh-huh. Query builder dotjs.org? That thing?
Aaron
00:33:50 – 00:34:12
Yep. That's the one. Yeah. So you can see it like it's not totally dissimilar from what we're doing if a little bit, you know, more technically minded. And I actually did write I did write an adapter at one point between our blueprint and this.
Aaron
00:34:14 – 00:34:36
And it's not perfect nor is it finished, but I did I did write one. So we'll just, you know, who knows if we're in a spot where we can help him. If he needs something tomorrow, you know, probably not, but we can at least talk to him and tell him the things that we've learned and, what we're doing with with the client. So that's exciting.
Colleen
00:34:37 – 00:34:38
Yeah. That's great.
Aaron
00:34:39 – 00:34:47
And you So what's the you and him speak the same language. So I'm just I'm gonna ride along. It's gonna be your deal. I don't I don't speak bullet train.
Sean
00:34:51 – 00:35:13
So when when Jesse was talking about was trying to figure out, like, what we do, you know, with the website. He's like, I don't that didn't help me. So, obviously, we need to do our website so that it's actually useful for this. So what would, okay, so I'm gonna throw this out there. There's a new React framework called Remix coming out.
Sean
00:35:14 – 00:35:37
Okay. And it is very clearly oriented towards content based websites. And I like everything that I'm seeing so far, and I want an excuse to check it out next week. And I was thinking of banging out our marketing site with it, but that would change us from your Laravel setup. But I would just do the marketing stuff.
Aaron
00:35:37 – 00:35:52
Full support. I do not Okay. I do not have any ties to owning the marketing website. So as long as you're comfortable, like, either editing or making it able for us to edit it
Sean
00:35:53 – 00:36:06
Exactly. That was that would be like, I'm gonna go play around with it. And Mhmm. If I can't set it up so that way it's easy for anybody to make a change, then it's not gonna work. Though that is currently the problem I have with the Laravel marketing thing.
Aaron
00:36:06 – 00:36:06
Mhmm. So I'm
Sean
00:36:06 – 00:36:22
like, oh, okay. I'm gonna have to get this whole thing set up and, like, figure out enough about Laravel to to make the changes, etcetera. It's probably not hard, but it it's like the same amount of work that it would be for you guys to figure out this thing if it's not Right. Straightforward. But it has file based URLs, which, like okay.
Sean
00:36:22 – 00:37:01
So I wrote a whole Rails thing, which lets me just write a markdown file, put it in the file structure where I want it to be in the URL structure, and then it turns it into markup and then serves it at that URL. Because I wanted to just be able to open up a text editor, open up a file, write markdown, save it, git commit as I go, use that to, like, save stuff on a branch for drafts or whatever, like, use git like I normally do, and then push it, and then have it just show up at the right URL. I think that Remix lets us do that, I think. The markdown piece, I'm not exactly sure yet, but I think that's workable. So anyway
Aaron
00:37:01 – 00:37:09
We we have that ability with our documentation part, but the, like, actual home page is just HTML. I mean
Sean
00:37:09 – 00:37:10
Yeah. Right.
Aaron
00:37:10 – 00:37:15
It's served by Laravel, but it's just HTML. It's a copy from a Tailwind UI thing.
Sean
00:37:15 – 00:37:18
It's documents. Are they on a sub a subdomain? I have both.
Aaron
00:37:18 – 00:37:19
No. They're not.
Sean
00:37:21 – 00:37:21
That's alright.
Aaron
00:37:21 – 00:37:21
I can't
Sean
00:37:21 – 00:37:22
figure that out.
Aaron
00:37:22 – 00:37:34
It's on a subfolder or directory. Yeah. I'm super not precious about the marketing site. I would love to not own that, but I'm happy to continue owning it if if I need to.
Sean
00:37:35 – 00:37:35
We would
Aaron
00:37:35 – 00:37:40
need to figure out the docs thing, but that seems that seems doable.
Sean
00:37:41 – 00:37:49
Yeah. Cool. Yeah. So that's gonna launch next week, so I'll mess around with it probably next week. I was hoping that would be my, like, Thanksgiving project.
Colleen
00:37:50 – 00:37:50
Nice.
Sean
00:37:53 – 00:37:59
Or me and Aaron getting it to work with the, the Laravel piece. That's my one my priority. But
Aaron
00:38:00 – 00:38:03
Yeah. Different kinds of brain work. Yeah.
Sean
00:38:03 – 00:38:06
We can sync up. We'll do that.
Colleen
00:38:07 – 00:38:12
Cool. Aaron, how about you? You seem a little tired today.
Aaron
00:38:12 – 00:38:23
Oh, just a little bit. Good. We, you know, went to Virginia last weekend, and it was great. The kids are amazing. My parents are amazing.
Aaron
00:38:23 – 00:38:31
Jennifer's amazing. It just worked out like, it it worked out surprisingly well. However, just not a lot of sleep.
Colleen
00:38:31 – 00:38:33
Yeah. The whole excitement.
Aaron
00:38:34 – 00:38:52
Yeah. And, you know, you have, you know, Thursday night rehearsal dinner, and then Friday night wedding. And so we're out until midnight each night, and then the kids don't know that it's a wedding weekend. And, you know, they're sleeping in our room, not my parents' room.
Colleen
00:38:52 – 00:38:52
Right.
Aaron
00:38:53 – 00:39:13
So then they wake up at fortunately, it's an hour difference. So they woke up at 8 AM, which is better. But we've still gotta get up before them to prepare. And then you do the whole day, you know, of wedding activities and seeing the city. And so just and then you gotta fly home, which is miserable.
Aaron
00:39:14 – 00:39:19
We left. We actually, the flight out, Jennifer and I woke up at 3:30 Dallas time,
Sean
00:39:19 – 00:39:19
because
Aaron
00:39:19 – 00:39:43
our flight was at, like, 620 or something. And, you know, we were walking through the airport with just, like, a hysterical number of bags holding, like, a yeti full of breast milk. We've got, like, 6 gallons of breast milk and a soft yeti, and it's like, is this the best idea? So it I mean, I have no complaints. It went amazingly well.
Aaron
00:39:43 – 00:39:45
It's just it's just exhausting.
Sean
00:39:46 – 00:39:48
Traveling with kids that age is hard.
Aaron
00:39:48 – 00:39:50
It is real hard.
Colleen
00:39:50 – 00:39:51
It's so hard.
Aaron
00:39:51 – 00:40:03
It's real hard. I honestly I don't think we would have made it. We certainly wouldn't have had fun if my parents weren't there. There's just there's just no way. There's no way.
Aaron
00:40:05 – 00:40:22
So that's where I've been. Trying to think of anything that pertains to us. I got a DM from the Indie Hackers account asking me if I wanted to do an AMA. Sweet. And I was like, sure.
Sean
00:40:22 – 00:40:22
Oh, yeah.
Aaron
00:40:22 – 00:40:34
Heck, man. Sounds great. Definitely. So they I assumed it's Cortland, and could be like a community manager or somebody. DM'd me, and was like, hey, I know you're bootstrapping and working and a new parent.
Aaron
00:40:34 – 00:40:42
Do you want to do an AMA about it? And I was like, yeah, heck yeah. That sounds great. So I'll be doing that at some point, which is exciting.
Colleen
00:40:45 – 00:40:53
I was gonna say maybe after we have a marketing website, that would be kind of Maybe. I'll who knows? I know. I don't know if they want you to do it this week or if they were just like, no. Whatever.
Colleen
00:40:53 – 00:41:00
Who knows? Cool, because that'll drive a lot of traffic to our Hammerstone site.
Aaron
00:41:01 – 00:41:09
Yeah. I will look. He sent me or they sent me a Calendly, and I will look and maybe try to do it later rather than sooner.
Colleen
00:41:09 – 00:41:10
December, if you can do it. Mhmm.
Aaron
00:41:10 – 00:41:11
I don't Yeah.
Colleen
00:41:11 – 00:41:12
Just a thought.
Aaron
00:41:12 – 00:41:31
Good thought. Good thought. So that's super exciting and encouraging. And that is about it. Last night, I took my, independent pursuit time to work again on Keith's stuff and feel like I'm making good progress there.
Aaron
00:41:31 – 00:41:55
That'll probably be I'll probably spend some time next week, just finishing that up. And then, Colleen, you said you wanted to see some of that, so I may be able to show you some once I get once I get done. So, yeah, I think that's about it. I've got I've got a whole stack of new books that I can read.
Colleen
00:41:55 – 00:41:57
Oh, yay. I got mine too.
Aaron
00:41:57 – 00:42:38
All my yeah. Got all my MySQL books, and I'm just learning a freaking ton. And I think one good source of content for us on this database specific stuff is gonna be reading these books and then, like, turning these kind of academic, explanations into, like, rails and Laravel specific, like, here's how you would do it in the framework that you're using and not just, like, in theory, indexes work from left to right. It's like, well, here's how you would do it in in Rails to make it performant. Right.
Aaron
00:42:38 – 00:42:48
These things are just full of great ideas. And it's like, why is nobody reading books anymore? I already did this bit last week, so I don't need to do it again. But it's been great, and I love it, and I'm super pleased with it.
Colleen
00:42:48 – 00:43:03
That's awesome. Yeah. I'm thinking, like, as we get more into it, and we will, throughout the course of this, have to be really good at databases. So I should also get some Postgres books because I think most Rails people do Postgres. So it'll be awesome.
Colleen
00:43:03 – 00:43:06
We'll be, like, the dream team database dream team.
Aaron
00:43:06 – 00:43:07
I know. It's gonna be
Sean
00:43:07 – 00:43:09
so good. Excited that I'm not included in that.
Colleen
00:43:09 – 00:43:10
The database. Yeah.
Aaron
00:43:14 – 00:43:23
Well, I love it so much. So I'm happy. I'm happy to handle that one. If you wanna do remix or whatever, you do that. I'll read my sequel books and then we'll all be happy.
Aaron
00:43:25 – 00:43:31
So I think that's I think that's all I've got. Unless anyone has anything else, I think we can call it.
Colleen
00:43:32 – 00:43:33
I'm good.
Aaron
00:43:33 – 00:43:35
Alright. Talk to y'all later.
Colleen
00:43:35 – 00:43:36
Bye, guys.
Me

Thanks for reading! My name is Aaron and I write, make videos, and generally try really hard.

If you ever have any questions or want to chat, I'm always on Twitter.

You can find me on YouTube on my personal channel or the Try Hard Studios channel.

If you love podcasts, I got you covered. You can listen to me on Mostly Technical.