skip to content
Video cover art for AI Image Generation with Dev Agrawal
Video

AI Image Generation with Dev Agrawal

Dev Agrawal joins Anthony Campolo to explore AI image generation, SolidJS 2.0 updates, and personal coding projects.

Open .md

Episode Description

Dev Agrawal and Anthony Campolo discuss SolidJS 2.0, AI image generation APIs, LeetCode debates, prompt engineering tips, and app authentication strategies.

Episode Summary

In this episode, Anthony Campolo welcomes back Dev Agrawal to discuss a wide range of web development topics. Dev shares updates on his new role doing product ownership for an internal AI tool that emerged from a company hackathon, then breaks down the headline features of SolidJS 2.0's experimental release, particularly async signals that eliminate undefined checks without blocking rendering. The conversation shifts to a revisited debate around LeetCode's usefulness in software engineering, referencing Dev's viral tweet from 2022 that attracted responses from prominent developers like ThePrimeagen and Theo. The core of the episode focuses on AI image generation, where Anthony walks through a blog post he had Claude 3.7 write comparing three image APIs — DALL-E, Stability AI, and Black Forest Labs — using raw Node.js fetch calls without dependencies. They compare outputs from each model and discuss prompt engineering strategies for both images and text, including how DALL-E rewrites short prompts into detailed descriptions behind the scenes. The episode wraps with a practical discussion about implementing authentication for Anthony's AutoShow project, where Dev recommends keeping user management on the front end with a simple API key protecting the back end, and teases upcoming projects including a "Ryan GPT" chatbot built from hundreds of hours of Ryan Carniato's streams.

Chapters

00:00:00 - Catching Up and Dev's New Role

Anthony and Dev open the show with some light banter about weather and SolidJS merch before Dev shares an update on his professional life. His previous consulting contract ended in January, and after participating in a company hackathon in February, his idea gained traction and became an internal project he now leads.

This marks Dev's first experience with product ownership under a company umbrella, which he contrasts with his earlier volunteer and side project leadership attempts. Anthony encourages him, noting that leadership skills, much like coding skills, are developed through repeated failure and iteration rather than overnight success.

00:05:20 - SolidJS 2.0 Experimental Release

Dev breaks down the big news around SolidJS 2.0 hitting experimental status. The headline feature is async signals, which allow developers to fetch data in components without dealing with undefined checks or blocking the rendering process — a combination that Dev says no other framework currently offers.

He explains how this differs from React's approach, where async operations halt rendering and cause rerenders. The discussion touches on the ecosystem implications of breaking changes in a major version, the meaning of semantic versioning, and famous regrets from language creators like Tony Hoare's billion-dollar mistake with null references. Dev also shares that he contributed significant design input to 2.0 after spending over two years absorbing knowledge in the SolidJS community.

00:13:49 - The LeetCode Debate Revisited

The conversation turns to LeetCode's resurgence in online discourse, anchored by Dev's viral September 2022 tweet featuring a graph showing that algorithmic skill becomes less practically useful as problem difficulty increases. Both ThePrimeagen and Theo engaged with the tweet, eventually largely agreeing with its premise.

Anthony and Dev discuss how Google popularized whiteboard-style algorithm interviews, the diminishing relevance of hardcore DSA skills for most day-to-day software work, and new tools that enable cheating on remote coding assessments. Dev also shares his experience in an IT program versus a traditional CS curriculum, noting that his university education focused more on applied development with older tools than on algorithms and data structures.

00:21:17 - AI Image Generation for Conference Talks

Dev walks through his process of generating images for conference slide decks using ChatGPT, showing examples from a talk he gave about single-page apps and web streaming. He discusses the iterative prompting process, including asking for specific aspect ratios and requesting the removal of misspelled text that AI image generators commonly produce.

Anthony points out the ChatGPT image editing feature that allows selecting portions of an image for modification, which wasn't available when Dev originally created his slides. They discuss how quickly standards have risen for AI-generated visuals and the phenomenon of people dismissing high-quality generated images as "AI slop" despite the significant effort they would require if created manually.

00:33:18 - Comparing Image APIs with Node.js Scripts

Anthony demonstrates a blog post he had Claude 3.7 generate, walking through Node.js scripts that hit the DALL-E, Stability AI, and Black Forest Labs image generation APIs using only native Node.js modules with no dependencies. He explains how Claude got two of three APIs working on the first attempt, with Black Forest Labs requiring additional prompting due to its two-step generation and retrieval process.

They run comparison prompts through all three APIs, observing that Black Forest Labs produces the most photorealistic output, DALL-E creates more painterly artistic images, and Stability falls somewhere in between. Anthony also explains how DALL-E silently rewrites short prompts into detailed descriptions, and they experiment with feeding the expanded prompt back in to test the system's behavior with already-detailed inputs.

00:49:06 - Prompt Engineering Tips and AI Coding Workflows

Anthony shares practical prompt engineering advice, recommending that developers write example outputs showing the desired structure and tone rather than relying solely on instructions. Dev relates this to his own work using the Vercel AI SDK's structured outputs with Zod schemas, and they discuss how examples help calibrate language quality within predefined structures.

The conversation evolves into a broader discussion of AI-assisted coding workflows. Anthony describes his preference for having AI generate code in a chat window that he then manually applies to his project, contrasting this with Cursor's more automated approach. Dev pushes back gently, explaining that Cursor does show diffs before applying changes, while both acknowledge the tradeoffs between speed and maintaining awareness of code changes.

01:09:07 - Authentication Architecture for AutoShow

Dev and Anthony work through a practical architecture question about implementing authentication for Anthony's AutoShow project, which currently consists of a Fastify back end and an Astro front end. Dev recommends keeping user management on the Astro front end using Clerk, while protecting the Fastify API with a simple API key rather than full user authentication.

They discuss whether Anthony should continue with his current dual-stack setup or migrate to a full-stack meta framework like Astro or SolidStart, which would simplify the auth story. Dev advises that the user object should remain isolated from application logic, with show notes referencing a user ID rather than maintaining a separate relational user model.

01:20:35 - React Server Components, Ryan GPT, and Closing

Dev teases an upcoming video explaining why he's no longer excited about React Server Components, noting that prominent developers including Theo, Ryan Carniato, and Ryan Florence have all moved through similar disillusionment. He also mentions that TanStack Router now supports SolidJS and shares his work porting a Trello clone demo to use it.

Anthony reveals he's nearly finished processing around 500 hours of Ryan Carniato's streams through AutoShow to create "Ryan GPT," a chatbot that can answer questions about SolidJS based on embedded transcripts. They discuss how Whisper transcription can infer speaker identity from context even without explicit labels, and Dev expresses enthusiasm about collaborating on porting AutoShow to SolidJS.

Transcript

00:00:03 - Anthony Campolo

And we're live. Welcome back, everyone, to another episode of AJC and the Web Devs. We got longtime returning guest Dev Agarwal with us here. How you doing, buddy?

00:00:16 - Dev Agrawal

I'm doing great. It's so nice to be able to go out and experience the sun again after one or two weeks of just extreme snow, cold, and negative temperatures.

00:00:30 - Anthony Campolo

I feel you. We live fairly close geographically, so we tend to experience the same weather patterns, I would guess. Just yesterday, me and my wife went for a walk outside. We were like, "Oh, the sun is shining."

00:00:47 - Dev Agrawal

That's it. And I got my new favorite shirt.

00:00:50 - Anthony Campolo

Oh, got signals. That's funny. Is that an official SolidJS merch shirt?

00:00:58 - Dev Agrawal

It is.

00:01:00 - Anthony Campolo

We got a problem linked to that SolidJS merch store.

00:01:06 - Anthony Campolo

I searched SolidJS merch and it took me to the docs and stores.

00:01:10 - Dev Agrawal

Which is

00:01:11 - Anthony Campolo

not correct.

00:01:14 - Dev Agrawal

It's all a scam. Good try. There you go.

00:01:17 - Anthony Campolo

You almost got there. Big

00:01:21 - Dev Agrawal

store. There you go. Solid store. "Store" is kind of an overloaded word in the realm of SolidJS. I think there are stores that you use for state management, then there's a store that you use for buying these awesome shirts.

00:01:39 - Anthony Campolo

Yeah, totally cool, man. So what you been up to recently? How's the world of Dev?

00:01:47 - Dev Agrawal

It's pretty fun, actually. January was my last month with the company I was contracting with, or data consulting for. Smart Data is employing me, but through Smart Data, I was working for a different company. That was that.

00:02:05 - Anthony Campolo

The app you were talking about last time?

00:02:08 - Dev Agrawal

Yes. Yeah.

00:02:09 - Anthony Campolo

Okay. Cool. Yeah, yeah.

00:02:11 - Dev Agrawal

Yeah, January was the last month. Since basically this month, I've kind of been working on an internal tool. There was a hackathon at the beginning of February for everyone who doesn't have a client company assigned. I came up with an idea, and people really liked that idea after the hackathon. So now that's kind of become an internal effort.

00:02:36 - Anthony Campolo

Ah.

00:02:38 - Anthony Campolo

In general terms, can you speak about what the app does? You don't need to go too much into detail, but I'm kind of curious.

00:02:44 - Dev Agrawal

I don't know how much I can speak, but it's an AI thing. It's like another, I don't know, I don't know if I want to call it a GPT wrapper. Some people might call it a GPT wrapper, but it is actually wrapping a lot of things, not just GPT, I think.

00:03:03 - Anthony Campolo

But let's talk about that real quick. The term GPT wrapper is so silly to me. I call it using an API. Why is this a denigrated thing? To use AI APIs and be like, "You're not building something real because you're using an AI." I think that is so silly.

00:03:21 - Dev Agrawal

Yeah, it's like every app is a database wrapper. It's like everyone's building a Postgres wrapper.

00:03:26 - Anthony Campolo

Yeah. Exactly. I don't know, I find that really silly. I did like that the conversation kind of switched about a month ago because you had DeepSeek come out, and a lot of different models are kind of percolating. And people are saying now GPT wrappers are actually the moat, not the models.

00:03:44 - Dev Agrawal

Yeah, yeah. So that's kind of what I've been working on. It's nice because I get to work on an idea that I came up with that I am excited about, and I get to do the product ownership stuff, which is fun.

00:04:06 - Anthony Campolo

Yeah, that's probably.

00:04:08 - Dev Agrawal

Yeah. It's like the first time I'm doing some sort of product ownership under a company. So far it's just been random side projects or volunteer projects that I've kind of been in charge of. But this is the first time that a company comes to me, "Hey, I like this idea. Go work on this, and here's a team for you."

00:04:30 - Anthony Campolo

Well, that's awesome, man. I always pegged you for leadership. You got the leadership gene in you. Seriously.

00:04:37 - Dev Agrawal

And I've had the opposite experience. I have a

00:04:42 - Anthony Campolo

You need time to percolate.

00:04:43 - Dev Agrawal

That's possible. Yeah. I have a reflection journal article on my website where I talk about a couple leadership things that I tried to do when I was back in college, and how most of them failed horribly.

00:05:00 - Anthony Campolo

I would say the way people learn leadership is usually by failing many times. Similar to software development, you learn to build code by writing a lot of code that breaks. Leadership feels higher stakes because you're working with other people, and it's more embarrassing when you fail. But it's just life, man. You gotta fall down and get back up.

00:05:20 - Dev Agrawal

Yeah. So that's been going really well. Other than that, Solid 2.0 hit experimental recently, which means more people can start playing with it and providing input. There was a whole, let me actually find the GitHub discussion on it.

00:05:45 - Anthony Campolo

That's awesome. This is

00:05:46 - Dev Agrawal

I got here.

00:05:47 - Anthony Campolo

a Solid core member here. I gotta ask, can you give me the high-level on 2.0? Why should people care about it? What's the big headline news with it?

00:05:58 - Dev Agrawal

Definitely. Yeah. I think the biggest headline with Solid 2.0 is async signals. Basically, every time you fetch data in your components, usually what you would do is have some sort of hook, like a query, like create, use query, use async, anything like that. What it would return is a variable that could be undefined when the data isn't there, which is pretty normal. Like, you write use query and then you get back data, and that could be either data or it could be undefined. If you're fetching a user object, your user object could be user or undefined. That means that everywhere in your UI you need to do a bunch of undefined checks, like if user then show the user data, if not then show some sort of loading state or something like that. This gets completely eliminated with the new SolidJS stuff, and React already kind of achieved that.

[00:06:57] But this adds on top where fetching data doesn't block rendering your component, which is a big problem with React. As soon as you do something async, it immediately stops, goes back, and then once it's done, it tries to rerender again, which causes all sorts.

00:07:12 - Anthony Campolo

Of like an island, right?

00:07:16 - Dev Agrawal

I would, this is still meant for like if the entire, you could, you would use this regardless of islands or not. It's mostly just that because it's a signal, you don't, I don't know, it's a little difficult to explain. I still have to wrap my head around how to explain this to people who are not already deep in SolidJS.

00:07:43 - Anthony Campolo

Yeah, sure.

00:07:44 - Dev Agrawal

Yeah. So, like, right.

00:07:44 - Anthony Campolo

Now it sounds like, you know, so you say it doesn't block rendering. That's like the main thing.

00:07:49 - Dev Agrawal

Mhm.

00:07:50 - Anthony Campolo

Yeah. So then

00:07:51 - Dev Agrawal

it doesn't block rendering. At the same time, you don't have to have undefined checks. If you fetch the user object or if you fetch user data, the variable that you get back is a user object. It's not user or undefined, it's user. So you don't have a bunch of undefined checks, but it also does it in a way that doesn't block, which no one else really has this capability. On top of that, there's a bunch more changes that we are still trying to figure out how we are going to talk about these in the broader sense. A lot of these things are things that other people and other frameworks are also trying to catch up with. Svelte has some of this, or they're trying to build some of this themselves as well. Overall, it's just like taking a lot of ways that people were using SolidJS already and building some of those patterns within the core system so that overall everything just feels more ergonomic.

00:08:58 - Anthony Campolo

Interesting. Has Ryan done a stream about this yet, or is he going to?

00:09:02 - Dev Agrawal

Yeah. So the last stream that he did two weeks ago was at the same time that he published this discussion, The Road to 2.0. That's where he kind of showed the big highlight features of Solid 2.0.

00:09:19 - Anthony Campolo

Yeah. Signals 2.0. Feature of signals. Great.

00:09:22 - Dev Agrawal

Yes. Yeah. It's experimental, which means there's way too many things that are not there. Obviously, there are some breaking changes as well, which means the ecosystem is going to have to go through some major updates before they can be used with the new version of Solid.

00:09:49 - Anthony Campolo

Well, that's

00:09:49 - Dev Agrawal

that's

00:09:49 - Anthony Campolo

the point. If it's 2.0, you're supposed to expect that. But we've lost the meaning of semver.

00:09:56 - Dev Agrawal

Mhm. Yeah, exactly.

00:09:59 - Anthony Campolo

I hung out with the creator of semver many times.

00:10:02 - Dev Agrawal

Of course. Yeah.

00:10:03 - Anthony Campolo

He always complained about how bad everyone is at semver.

00:10:07 - Dev Agrawal

That's fair. Of course. Yeah. The creator always does that. I'm sure whoever created OOP, actually, I'm sure he has said it many times that calling the paradigm object-oriented was the wrong choice because it puts the focus on objects and not what it actually was supposed to be. [00:10:28] - Anthony Campolo All the other crap that actually makes up OOP.

00:10:30 - Dev Agrawal

Yeah. And obviously we've probably heard about the billion dollar mistake. The creator of null called it the billion dollar mistake.

00:10:41 - Anthony Campolo

In C, right?

00:10:44 - Dev Agrawal

Sorry.

00:10:45 - Anthony Campolo

Was it C, the language, that had that issue? I forget which specific programming language it was.

00:10:51 - Dev Agrawal

Yeah, I think so. I'm not sure; it might just be that the concept in general has caused so many problems. But yeah.

So yes, all the 2.0 has been exciting for me because I've been talking to Ryan a lot, and there's a lot in here that's me playing around with things, talking to Ryan, and then providing feedback and design input on how things could work, how things should work. It almost feels like my baby because there's a lot of input I provided in here that I'm very happy to see making it through.

00:11:32 - Anthony Campolo

No, that's cool. I'm so glad that you got deep into the actual framework work stuff because that's how I really cut my teeth. It was getting into Redwood and just being present for the conversations. You were more involved in the conversations than I was. I was kind of sitting there and soaking it all in, you know?

You get to see how these things are created, the thought processes that go into them, and you just gain such a higher-level understanding of not only the frameworks but the software development itself. And really quick, just to close the loop on it: Tony Hoare is probably how it's pronounced. He was referring to Algol when he made a reference to the null references, but I asked a follow-up question.

[00:12:24] I was like, does this relate to C? And it says, yes. Billy Donovan says the introduction of null references is highly relevant to C, even though it originated before C was created, so C uses null pointers. I've never written much C, so most of this is beyond my pay grade. But I didn't need to go too deep into that. I thought that was interesting and wanted to give people the reference on that.

00:12:51 - Dev Agrawal

Yeah, I would say that for me to reach a point where I can provide design input, there were two and a half years of just sitting and absorbing stuff. After two years of that, that's when I got to a point where I could actually start providing input. A lot of times people look at me or anyone who reaches a point where they are contributing, providing design input, or building their own things.

00:13:27 - Anthony Campolo

I think it happened overnight.

00:13:29 - Dev Agrawal

Yeah, exactly. And it often doesn't acknowledge the two years, three years, four years of just sitting and absorbing things. So I just wanted to make sure that is also mentioned.

00:13:40 - Anthony Campolo

Yeah, totally. This is another famous quote about that, that every overnight sensation was ten years in the making or something like that. Yeah.

00:13:48 - Dev Agrawal

Pretty much, yeah.

00:13:49 - Anthony Campolo

Okay, cool. But there was one thing that I also wanted to talk about before we dive too deep into the code. LeetCode is back in the news. And you said that you had a viral LeetCode tweet back in September 2022. The ones today are like, let's be honest, because you're referring to someone else to grind: LeetCode is the single most important skill you can develop. I saw that tweet as well, and my thought was exactly what you said. And then Aiden posted this thing about a way to cheat on LeetCode questions. So have you actually tried this or did you just retweet it?

00:14:35 - Dev Agrawal

I have not, no. I just retweeted it immediately as soon as I saw it. Obviously this exists, and obviously this is going to get bigger and better over time because if people can find a way to cheat the system, they will. Which is why LeetCode was bad in the first place, because it allows cheating the system.

00:14:57 - Anthony Campolo

Yeah, but it was much harder to cheat back in the day, especially when you actually had to do interviews in person because they could look at your screen. It's a little bit different now that it's remote. But I also thought this is interesting because you and I, I think, are coming at it from different starting places in the sense that it's easy to say fuck leetcode when you can't solve leetcode, which I can't. You actually have a CS degree, and I'll be willing to bet easy or medium LeetCode problems you could probably do without much difficulty, right?

00:15:31 - Dev Agrawal

Easy ones? Probably not. There was a difference between the CS program and the IT program in my university. The CS program, yes. A lot of those people would be pretty good at easy to medium problems like these. In the IT program, we never really got exposed to hardcore CS concepts, data structures, algorithms like this.

00:15:56 - Anthony Campolo

So like a boot camp where you actually worked with frameworks and built software.

00:16:02 - Dev Agrawal

It was.

00:16:04 - Anthony Campolo

It was like.

00:16:05 - Dev Agrawal

Kind of. That extended over four years, but also a lot more shitty because it's college and not a real boot camp. It's a pretty old curriculum.

00:16:16 - Anthony Campolo

When you're doing your actual assignments, what were you actually writing?

00:16:21 - Dev Agrawal

Java and Proton. Very super old IDEs for Java. Some .NET Visual Studio. A little bit of JavaScript here and there using NetBeans.

00:16:38 - Anthony Campolo

So interesting. Yeah, that's really the issue. It's not even that you don't learn the right stuff in academia; it's that you use ten-year-old tools. Yeah. Why are we teaching Java? It's just crazy.

00:16:52 - Dev Agrawal

Yeah, I mean, I can probably justify teaching Java. I don't know if I can justify teaching Java using a 15-year-old IDE. That's the part where Java is still highly used.

00:17:08 - Anthony Campolo

Our bootcamp let you choose whether to do Java or JavaScript. And I, like an idiot, chose to do Java because I was like, I already know a little bit, I know it. I'll learn some Java. The worst decision ever.

00:17:23 - Dev Agrawal

Yeah, Java. It's like React is reaching that same level, honestly, slowly. You probably just need to learn this or that, and you're more hirable. But other than that, you probably shouldn't. Right now, it's still the dominant hot tech, but that's kind of the WordPress, the Java. That's the status it's approaching. But yeah. Anyways, LeetCode, I didn't actually get to do much.

00:17:51 - Anthony Campolo

LeetCode created algo skill versus usefulness in software engineering. I could tell this is back when you're watching a lot of Theo. The fact that you created this.

00:18:02 - Dev Agrawal

Exactly. Yeah. And this is Excalibur, which I stopped using. I haven't used it in the last two years or so.

00:18:10 - Anthony Campolo

Yeah. So what this is saying is that usefulness, or how often you will use it, decreases as the problems get harder and harder.

00:18:23 - Dev Agrawal

Exactly.

00:18:24 - Anthony Campolo

The graph is saying. So you have LeetCode hard over here at the end on the x axis, and every day all the way at the top on the y axis. And this is always my point about why people who overindex on LeetCode and basically only get really good at that. If you say, okay, build me a CRUD API that accesses a database, then people will be like, I don't know how to do it because they don't even know how to install the tools to do it. But they can be like, oh, but I can write you this sweet data structure or algorithm thing.

I also think Google is to blame a lot for this, because Google really invented this whole style of whiteboarding interviews where they might not even ask you to code it. They'll be like, here's an algo problem, write it on a whiteboard and then tell me the big O complexity of the solution you use or something like that, you know, which is just cool if you can do that.

[00:19:25] But I just don't know how useful it is at the end of the day, especially now we have LLMs that can optimize your code for you.

00:19:33 - Dev Agrawal

Yeah, exactly. And I think if you looked at the comments, both Prime and Theo show up and eventually agree with this.

00:19:40 - Anthony Campolo

I typically use DSA all the time. Once you get past UI dev and go to library, DSA becomes immediately useful. Seems like he's kind of pushing back.

00:19:49 - Dev Agrawal

Yeah, he initially was pushing back, but I think most of the pushback I received was because I didn't expect this to blow up like it did. Thank you, Theo, for retweeting it. But if I knew that it was going to be blowing up, I would have probably put a little more thought into those labels to make it more agreeable to the general.

00:20:11 - Anthony Campolo

Theo saying, here, I feel like this is semantics. He says you should change it to percentage of devs who need to use this regularly, which is the same as usefulness. That's kind of splitting hairs.

00:20:20 - Dev Agrawal

Yeah.

00:20:21 - Anthony Campolo

And then Prime agrees. Good way to think of it. Good.

00:20:27 - Dev Agrawal

Yeah.

00:20:28 - Anthony Campolo

Fire extinguishers are useless until they're completely useful. It's like a fire extinguisher. See, I don't like that metaphor because an unoptimized algorithm will not burn your house down. It's more like a cluttered house where you have to crawl over some stuff. It's a bit more obnoxious. It may take more time for you to navigate it, but it won't burn the house. It won't collapse the whole house.

00:20:55 - Dev Agrawal

I mean, some people could think of it as setting the server on fire or setting the RAM on fire, or the CPU. You could overclock and overheat it. So, I don't know, there's always different analogies that you can pull, but yeah, a cleaning crew would probably be a good way.

00:21:12 - Anthony Campolo

Just buy more RAM.

00:21:14 - Dev Agrawal

Yeah, buy more RAM. Download more RAM.

00:21:17 - Anthony Campolo

Okay, cool. So what I wanted to get into now, let's talk about the image API stuff. So we'd originally chatted about this at the end of our last episode, and you just kind of said offhand you'd like to learn more about generating images with AI. And I was also like, hey, that's something I could kind of learn more about as well, even though I know a little bit about it. So let's just talk about that. Do you generate AI images? Do you have a certain use case for it?

00:21:52 - Dev Agrawal

My biggest use case so far has been slideshows for my conference talks, just putting kind of random visuals. Let me actually share what kind of images I use or I try to generate. This is my Canva, which is okay. I probably should find something else. Let's look at this one. So this is the talk that I gave. Oh, that's the wrong tab. Sorry. I should just share my screen because it opens tabs.

00:22:32 - Anthony Campolo

Opening tabs is a nightmare on StreamYard.

00:22:38 - Dev Agrawal

Yeah.

00:22:41 - Anthony Campolo

So this is for conference talks and meetups and things like that. Yeah.

00:22:45 - Dev Agrawal

Yeah. So this is the talk that I gave at Star Trek last year and then at an internal lunch and learn. This background here I generated. I think most images that you see here are generated, other than the visuals, obviously.

00:23:10 - Anthony Campolo

Something you used, and you're using ChatGPT, I would guess.

00:23:14 - Dev Agrawal

Yeah.

00:23:15 - Anthony Campolo

Yeah, yeah. And I can tell because I've generated a lot of images. That's a good one. I like that one. But this one actually, or I was going to say the on-fire one and then the kind of chrome-looking one. But scroll up to your first couple ones.

00:23:31 - Dev Agrawal

Mhm. So like.

00:23:33 - Anthony Campolo

That one, yeah. The Ajax one. So all three of those, they all have a similar kind of look to them. And I find that that's kind of where learning how to prompt them is really useful. Because it's a little bit like how people can tell when they're reading something generated by ChatGPT, that even though it's extremely high quality and it would have taken an actual writer or image artist a long time to do it, people are already so used to it that they're kind of like, ah, this is, they call it slop. You know, AI slop.

And some people will look at these slides and they'll be like, ah, we got these AI slop images in this thing. But I don't think that's the right way to look because I actually think if you start from first principles, these images are really great. Like if someone actually had to sit down and create all these from scratch, that would be really hard.

[00:24:26] So it's amazing how fast our standards have risen because of AI. We just expect these extremely high-quality, intricate images on all of our stuff. That's a good one. I like that one. So that's like water streaming out. So when you were creating these, what was your thought process? How were you prompting it? Were you explaining that you were giving a talk, or did you just talk out each image by itself? I think this is important, the actual how people prompt to create the images.

00:25:02 - Dev Agrawal

Yeah. Let me try to find the conversation. I did give it a decent bit of context about what my talk is about. I think I gave it a description of the talk in general. Then I was just talking it through, specific images that I wanted. And this is the slide. This is kind of what I want to show. Let's see. I think some of them are really obvious. Like here, when I tell it about GraphQL, it knows that it calls a purple color, and even though that's not the logo, it at least tried with the color.

00:25:47 - Anthony Campolo

Should that be connected to each other, connected to one single endpoint? Kind of, yeah.

00:25:55 - Dev Agrawal

Yeah. Let's see. There's been so many freaking conversations that I have to scroll down way too much to find that.

00:26:04 - Anthony Campolo

No, actually, my wife and I used to share a ChatGPT account, and then I got her really into it. So now I have my own separate account, and we both have all these long-running conversations with it. Have you started using deep research, by the way?

00:26:18 - Dev Agrawal

Deep research. What is that?

00:26:20 - Anthony Campolo

Okay. So you're probably not on the 200 plan. You're probably on the 20 plan. So you just got access to deep research and you should use this. It's basically like using a reasoning model where it's a long-running query. You'll kind of tell it what you want and then it'll ask you some follow-up questions, which ChatGPT has never done before unless you prompted it to.

Then it will basically go off and do a 30-minute-long query where it will search hundreds of websites to actually answer your question and spend a long time. It'll write you like 5,000 to 10,000-word answers, a really long, meaty, well-researched answer. I've been using it because I'm on the 200 plan, but people just got access to it on the 20 plan. I highly recommend it. When you think of some random topic or thing you want to research, throw it in deep research and see what it gives you. I think you'll be pretty impressed.

00:27:19 - Dev Agrawal

Okay, how can I deep research? Yeah, I should look into that. That's going to be very helpful, especially for my girlfriend who's going to college right now.

00:27:30 - Anthony Campolo

Yeah, totally.

00:27:33 - Dev Agrawal

Yeah. So I think this is where I started. I guess I probably didn't give it the entire context of the slides. There's probably a different conversation that generated the title image. Awesome.

00:27:49 - Anthony Campolo

Hello to my Cavalier hanging out in the chat.

00:27:52 - Dev Agrawal

How's it going?

00:27:53 - Anthony Campolo

You keep going. I'm going to be off screen, but I'll be listening. I'll be back in just a couple minutes, okay?

00:27:58 - Dev Agrawal

Yeah. So this was kind of my process to generate these images. It gave me something that I said was too robotic, so give me something that's more contemporary. Then it came up with this, which I think was nice. I believe this is the single page apps are awesome. So honestly, the only reason I had the slide in the first place is because there's way too many HTML people in the community these days who are like, no, SPAs are bad. We should just do things on the server.

00:28:33 - Anthony Campolo

More talk from me.

00:28:35 - Dev Agrawal

This talk was May of last year. But honestly, this only gets more relevant by the day, trying to convince people that, hey, single page apps are still good. So, yeah.

And I think this is how I was trying to get it to do the title slide, showing a stream and a waterfall separately. So it gave me this, and then I wanted it to give the correct aspect ratio. It by default comes with square-ish images, so I always have to tell it that I want this in this specific resolution. Then it gave me this bigger one.

Then I guess it just gave me waterfalls with a bunch of lines. And then I said, okay, just add some more browsers and just throw in some more techy stuff, more webby stuff in there. [00:29:35] - Anthony Campolo So like a saying here: space rock, don't hype. Yeah, 100%.

The aspect ratio thing, that's a good thing. You just brought that up because once we get into the code, working with the APIs, you can specify the exact resolution that you want. If you want it to be square, if you want it to be widescreen, you know.

00:29:59 - Dev Agrawal

Yeah. So that's what finally gave me this. Then I guess I was talking about Ajax. Maybe didn't fully understand what Ajax was initially, or maybe did, I don't know. Yeah, it just gave me that.

00:30:14 - Anthony Campolo

Spelled it right, at least. A huge issue with these things is that they can't spell words, usually.

00:30:21 - Dev Agrawal

Yeah. Oh, there's a bunch of these where it gives me an image with a bunch of text. Then I prompted, "Hey, please remove the text. It's not spelled correctly. I'll just add text on my own," but it's not able to do that. So then I have to start a whole new chat with a whole new prompt and try.

00:30:38 - Anthony Campolo

Well, if you click an image, like that Ajax image, real quick. So at the top you can select portions of the image to edit. So click Select. If you want to get rid of Ajax, you could circle that.

00:30:53 - Dev Agrawal

Right.

00:30:53 - Anthony Campolo

And then say modify.

00:30:56 - Dev Agrawal

Was this their, like, last year? Was this new?

00:30:59 - Anthony Campolo

It would likely not have been there when you originally did this, as you say, if this was about a year ago. But it's not new in the sense that it's been there for six to nine to twelve months, some amount of months, I'm not really sure. But it's been there for a while. Yeah.

00:31:14 - Dev Agrawal

Mhm.

00:31:15 - Anthony Campolo

Yeah.

00:31:16 - Dev Agrawal

Yeah. Hey, I probably didn't understand what Ajax is, but the best I could come up with was a globe. This one was pretty straightforward, I guess. People like shooting themselves in the foot with it.

00:31:30 - Anthony Campolo

It was with Ajax that, in the image, it's picked as a tool so powerful. I'm sorry. A little bit that people are shooting themselves in the foot. Okay. It's a foot gun.

00:31:38 - Dev Agrawal

Yeah, exactly.

00:31:40 - Anthony Campolo

Now I see. Okay. I thought he was stepping on an exploding thing. I wasn't entirely sure what was happening. Now it's a foot gun. Yeah.

00:31:50 - Dev Agrawal

I think maybe that's supposed to be the gun. It's possible. I don't know. Or maybe that's supposed to be a fire extinguisher.

00:31:58 - Anthony Campolo

Guns? They're talking about shooting themselves in the foot, but most people would think of a foot that is a gun. They're not the same thing. Yeah. Hey, we got Danny Thompson in the chat. What's up, buddy?

00:32:11 - Dev Agrawal

How's it going, Danny? What's up? We're talking about AI images. Oh, yeah. It's been a geddon. It gave me this colorful version. I said these don't really look like loading spinners. They just look like... It looks like the Chrome logo.

00:32:28 - Anthony Campolo

Yeah, exactly.

00:32:30 - Dev Agrawal

So then it gave me this, which was the frustrated man, which really adds to what I'm trying to show. So, yeah, this is what it's just been. I just gave it the term composability. And this one, sometimes it's just one-shots, exactly what I was looking for.

00:32:48 - Anthony Campolo

Okay, it does look pretty good.

00:32:51 - Dev Agrawal

Mhm.

00:32:52 - Anthony Campolo

Because it's the blocks that Lego bricks people always talk about when they talk about composability.

00:32:57 - Dev Agrawal

Yeah. That time, it doesn't really have... It just has the composability weirdly spelled out. But other than that, it's just the same image. Okay, I guess. I do like all the clutter and the multi-monitor setups. Windows. This is cute.

00:33:20 - Anthony Campolo

So Mike is saying the quality has improved a bunch since I last played with it. Assuming you're talking about DALL-E, which is the image thing kind of built into ChatGPT. Not quite as sharp as SD, which I would guess he means Stable Diffusion, which is another AI image.

Let us know what you're referring to. He's saying right here, which is good because it's one of the three image APIs we'll be looking at today. Let's go.

So I want to do a similar thing that you just did. I want to walk through my clogs. I wanted to try out Claude 3.7, which is the new hotness, and I'm keeping an eye on the comments. Let me know if they're coming in, because I won't necessarily be able to pull them up since I'm looking at my screen.

Sure. But I asked it to write me a Node.js script for generating images with the top three image generation APIs currently available now.

[00:34:18] It made an interesting decision in that it picked DALL-E, Stable Diffusion, but then also Midjourney. There's an issue with that, though. Midjourney does not have an official public API, so there are these weird third-party things that interface with it in some way.

The same thing with Suno, which is this really cool song generation thing. It really bugs me. I wish these companies would just ship a freaking API. I don't know what they're waiting for.

Then I told it not to use Midjourney, as in Black Forest Labs, which is the other kind of top player in this space, right? I also told it, which is what I always have to tell it, don't use require, use ESM imports, and don't put semicolons in my damn JavaScript. What are you doing? And then also that it uses Axios instead of fetch.

So with that I got pretty much exactly what I wanted. But then I had to tell it to put it in a blog format.

[00:35:22] So I gave it some instructions. How I like my blog posts written. I like to kind of have it start from the very scratch, build you up the project structure and all that. So then it kind of rewrote the thing. It gave me all the instructions, and then I went through it and I'm like, all right, let me run these commands just based on the one shot. And without providing any docs, even, it got two out of three perfect.

So the DALL-E one worked and the Stable Diffusion one worked. I got an error on Black Forest Labs, and that's not really Claude's fault. It's because Black Forest Labs stuff is complicated. They have you generate an image, and then instead of giving you the image back, they give you an ID, which you then need to append to a certain URL and then hit again to get the response back. So I had to explain that to it and have it work through that.

00:36:18 - Dev Agrawal

That makes sense. It's like, yeah, they generate it and store it on cloud somewhere. And here you go. Go download it whenever you want.

00:36:26 - Anthony Campolo

Yeah, exactly. Which is kind of nice because the other ones only save them ephemerally. So I get why they're making that decision. It makes sense. But it's an extra layer of complication to work with the API.

But one other thing that it was doing is that it was crapping out at the end because I was asking it to generate so much code. So I told it to, let's see.

00:36:55 - Dev Agrawal

It stopped at the console error.

00:36:58 - Anthony Campolo

I was doing a thing where you give me the entire blog post and artifacts, and then you try to rewrite your response. Don't do that. Just give me the artifact and your messages say, "Here you go, Broseph." And then it did.

So this gave me the one-shot blog post that we're going to go through now. Okay.

00:37:18 - Dev Agrawal

Yeah. Any Cavalier respectfully disagrees about semicolons.

00:37:26 - Anthony Campolo

Okay. Well, we're not going to get into that.

00:37:30 - Dev Agrawal

Danny says he's been using 3.7 all day and it's been pretty decent. The only thing I wish for is that AI tools start using a better naming convention. Yeah, 3.7 is a great name.

00:37:41 - Anthony Campolo

Yeah. I explained this to my wife before I went on stream. It's the stupidest crap ever. They released 3.5, which was an improvement on version three. Then they released a new version of 3.5 that they did not rename, but people who knew that a new version was shipped started calling it 3.6.

So 3.6 was an unofficial community-branded name for the new upgraded version of 3.5 that they did not feel the need to rename. And then when they released a new one, they said, okay, we're going to call it 3.7 because everyone knew 3.5 upgraded was actually 3.6. What are these people doing? What the hell?

00:38:29 - Dev Agrawal

Oh my God. It reminds me of S5 and S6.

00:38:34 - Anthony Campolo

Yeah. No, it's absolutely insane. It's like how ChatGPT went from 3.5 to 4 to then o1 and then to o3 because o2 was copyrighted. Like, yeah, it's absolutely ridiculous. Okay.

00:38:57 - Dev Agrawal

Naming is hard.

00:38:58 - Anthony Campolo

Yeah, naming is hard. So here's the code that Claude wrote. It has a utility here to generate a unique file name because, when I, this is another thing that kind of had to work out with it in the prompting, is that the first thing it did is that every time you generate an image, it just gave you a placeholder name. So if you were generating multiple images, which the tutorial shows you how to do, they would overwrite each other. So this basically just makes sure that there's a unique name for every image. Cool.

Okay. So then we have three scripts, one for DALL-E, which is using OpenAI's image generation endpoint and basically just hits it and then gets a response back and then writes it to a file. So this is pretty standard Node.js scripting, which is what I really like. I always try to encourage it. So I don't think we have a single dependency in this project right now, which is pretty cool.

00:40:02 - Dev Agrawal

Wait, I thought you were using Axios instead of fetch?

00:40:05 - Anthony Campolo

No. So the first response it gave back was Axios and then...

00:40:10 - Dev Agrawal

Oh, okay.

00:40:11 - Anthony Campolo

I asked it to rewrite it using Node.js.

00:40:16 - Dev Agrawal

I'll use fetch instead of Axios. Okay. Yeah, I read that the other way around. Sorry.

00:40:21 - Anthony Campolo

Yeah, because the first thing it did included Axios. And this is part of because they're trained on code from like the 2020 to 2023, you know. So they're not as aware of how far Node.js has come, especially in the last like two or three versions. So Node 20 and 22 let you do essentially everything dependency-free, which is really cool, but you always kind of have to tell it, "Hey, don't give me the Node of the 2010s. Give me the Node of the 2020s, bro."

00:40:56 - Dev Agrawal

Yeah. It's like when Devin was asked to create a to-do app, it installed like 500kB of dependencies with React, Chakra UI, and, I don't know, CSS modules. So much stuff for a simple app.

00:41:12 - Anthony Campolo

Yeah. So we got none of that where we're importing from native Node utilities, which is really cool. So the Stability API is going to be pretty similar.

If you look at kind of what we were actually sending in the fetch here for DALL-E, we tell it the model and then we include the prompt, the size, quality, and then response format. And the prompt gets fed in through the CLI command, which we'll see. And that's basically a similar thing to what's happening here. We give it a prompt. I'm not sure what wait is. And then let's see. This stuff's coming. Oh, here we...

00:41:58 - Dev Agrawal

Go.

00:41:58 - Anthony Campolo

Right here. So both of them are kind of generating, I think, basically square images, 1024 by 1024. The Black Forest Lab one is set to 1024 by 678, so that's slightly different.

So again, this is all stuff Claude figured out without me giving it any docs at all, which is pretty awesome.

00:42:23 - Dev Agrawal

Nice.

00:42:25 - Anthony Campolo

Okay, so now let's run.

00:42:26 - Dev Agrawal

And this is the third-party Black Forest API, right? Because I don't have an official one.

00:42:33 - Anthony Campolo

Yeah. So that was Midjourney. Which?

00:42:35 - Dev Agrawal

Midjourney. Sorry. Okay.

00:42:37 - Anthony Campolo

Yeah. When I was explaining this first part, this is all the stuff I had to kind of correct. So I said use Black Forest Lab instead of Midjourney because I want to be able to use official APIs, because if you're using someone's unofficial API, they're going to be deprecated.

00:42:52 - Dev Agrawal

It could break.

00:42:52 - Anthony Campolo

Yeah, they're going to break super quickly. I don't think it's a good idea to use any of those, honestly. So I would recommend against it.

00:43:02 - Dev Agrawal

People, these things move fast.

00:43:04 - Anthony Campolo

Yeah, totally. So I only use the official APIs. This is also why I like having it write the code like this. I'm not even depending on their SDKs because you have OpenAI, they have an SDK or they have an SDK in general, which I'm sure includes image capabilities.

I really like working with the raw APIs for these companies because you get a good sense of what are the different parameters you can pass, what are the different things you can tweak, and you really learn how these things work to a much greater degree than you would just using their SDKs, which are nice. I'm not saying you shouldn't use them, but you should start with their APIs and then kind of build from there if you feel like their SDK is a good thing. Okay.

00:43:53 - Dev Agrawal

Yeah. There's also the Vercel AI SDK has an experimental image generation API.

00:44:00 - Anthony Campolo

Yeah. And that's the next level of abstraction. It's like, you know, you got the frameworks, the meta frameworks. I have been using it for its aging capability. I wrote a blog post about this that's being edited right now for Semaphore. It was a great experience.

I will say that the Vercel AI SDK so far, I got nothing but good things to say about it. [00:44:25] - Dev Agrawal Yeah, they are working on it.

00:44:26 - Anthony Campolo

From a learning standpoint, you should still learn how to do things at least one time before using that. Then you can at least be like, hey, you want to build your React to-do list before you build a Next to-do list, kind of thing.

00:44:42 - Dev Agrawal

Yeah. It's like you want to learn how to roll your own auth before using Click.

00:44:46 - Anthony Campolo

Sure. Yeah. That's what I'm doing right now, actually, and literally in the process of doing that.

00:44:53 - Dev Agrawal

Yeah, I definitely agree that working with raw APIs is good to get a full handle on the full capabilities of the model and understand the trade-offs between when and why you would want to pick a certain model over the other. But for the project that I'm working on, something like an SDK makes a lot more sense because we want to invest the minimum amount of time and support all the models that we can possibly do. And it's the best way to achieve that. They are working really hard on making it actually usable, providing all the capabilities, and expanding their use case into everything.

00:45:43 - Anthony Campolo

Totally. Yeah. I think that's a great point you're making: if you're not doing it as your way to learn as much as you can about AI and you need to ship something in minimal time and effort, it does make a lot of sense. And I will say that's what people used to say LangChain was for two years ago, and LangChain was complicated as hell. AI SDK is so much better than LangChain. I really do not recommend people use LangChain. They pioneered a lot of stuff and they're great. I want to talk about what they built, their people, but I just have to say do not use it. It's not good.

00:46:22 - Dev Agrawal

Yeah. Say what you want about Purcell and their business tactics. Whatever, they know how to do it. Developer experience is for sale. It's made better.

00:46:33 - Anthony Campolo

Always been a fan.

00:46:34 - Dev Agrawal

Yeah.

00:46:34 - Anthony Campolo

Okay, so here's our first image.

00:46:37 - Dev Agrawal

Nice.

00:46:38 - Anthony Campolo

The prompt that we fed was a futuristic city with flying cars and neon lights. Now, something that a lot of people probably don't actually know if they just use these things casually is that anytime you give a prompt to Dall-E or ChatGPT, it actually rewrites it and then feeds it this much longer prompt of what is actually telling it to create. So it says, create an image illustrating a futuristic cityscape at night. It should include a sparkling sea of neon lights and flood the streets and buildings. It gets this long whole paragraph kind of description. So I find that just kind of interesting and something that people don't necessarily realize.

00:47:15 - Dev Agrawal

I like that. Yeah.

00:47:18 - Dev Agrawal

And if you give it an already detailed prompt that has all those details, does it make it even bigger, or does it have some sort of limit?

00:47:27 - Anthony Campolo

Let's find out.

00:47:28 - Anthony Campolo

Let's run the exact prompt it just gave us and see what it says.

00:47:37 - Dev Agrawal

Yeah. I'm curious.

00:47:41 - Anthony Campolo

It's probably going to get back a similar prompt of a similar length. It might rewrite a couple words. Let's see.

00:47:49 - Dev Agrawal

Yeah. It's basically the same size, similar.

00:47:52 - Anthony Campolo

But it's not exactly the same. It ends with "reflect the city's vibrant, dynamic energy" versus "portraying the lively atmosphere of the city." It's very similar, but not identical.

00:48:03 - Dev Agrawal

So it's looking for a threshold. If your prompt is smaller than a certain size, it's going to make it more detailed and add more details on its own. But if you give it a detailed prompt itself, then it doesn't. It just needs to rephrase it.

00:48:18 - Anthony Campolo

Yeah.

00:48:19 - Dev Agrawal

That's good. But yeah, I think it also makes it much easier to understand how to work with it better. Like, hey, here's the more detailed prompt, and once I see it, next time I go to prompt it, I know that this is kind of the starting point. A lot of prompt engineering is like the first time you go into it, you have to think very hard to figure out all the details that you want in there. Nice.

00:48:53 - Anthony Campolo

It made one of us. Check.

00:48:56 - Dev Agrawal

Perfect.

00:48:57 - Anthony Campolo

Cool. Great. All right. Do you have anything else to say on prompt engineering?

00:49:06 - Dev Agrawal

Yeah. The prompt engineering. I need to get more into it. Even for the app that we are building right now, there's a lot of prompt optimization that can be done to get better results out of it. It's just that in my head, I keep pushing it down because I feel a little intimidated going into that loop of how to refine a prompt over and over. Sure.

00:49:41 - Anthony Campolo

I mean, I can give you some tips. I've spent a lot of time writing prompts for auto shows. This is something I've actually spent a decent amount of time thinking about and doing.

00:49:48 - Dev Agrawal

Perfect.

00:49:48 - Anthony Campolo

Yeah. First, are we talking about images? Are we talking about text? Are we talking about both text in terms of your output text? Okay, great. So with text, I would say the best 80/20 advice I could give, a simple thing you can do that will highly improve your output, is tell it what you want in plain English like you're just talking to a person, and then literally write an example of what the output you're looking like should look like. So for me, I want a markdown file that has an H2 that says episode summary and then text for the summary, and then H2 says chapters, then H3 for each chapter. So I have a structure in mind of what it should look like. And I also have a certain idea of how long certain things should be, so I tell it this part should be roughly this many words. But if you just say that, because they're not great at math and stuff like that, they might not always quite understand what you're actually asking for.

[00:50:50] Better and better models are getting better at actually following straight instructions. But if you write out what you think it should look like and the kind of language you want it to sound like, then that will drastically improve your output. So that would be the biggest thing I'd recommend.

00:51:05 - Dev Agrawal

Right. Okay. So we are using structured outputs. We're not using OpenAI structured outputs. We're using AI SDKs like generate object, which you can give a Zod schema.

00:51:21 - Anthony Campolo

So you already know the structure of what it wants. That's right. Then that helps a lot. Yeah.

00:51:28 - Dev Agrawal

I think, yeah, maybe I could come up with, like, here's the input and here's an output. And I would say, yeah, some examples.

00:51:39 - Anthony Campolo

One output object. Not necessarily so it knows the structure, but so it knows how the language should be written within each of them, because I'm sure sometimes you're probably getting a wide range of output. Some are good, some are bad. So try and think about what it is about the good outputs that you can capture in a single example object. You could show it.

00:51:59 - Dev Agrawal

Mm.

00:52:00 - Anthony Campolo

Yeah.

00:52:01 - Dev Agrawal

Yeah. Thanks for hanging out, Cavalier. This is great. Gotta run. Great stuff. So since it already has the structure, maybe the next thing to optimize would be the logic, in which case I need specific inputs and outputs. Okay. So what did Stability come up with, right.

00:52:25 - Anthony Campolo

So this is, it gives you, it doesn't look like the result at least is rewriting the prompt at all. It just gives you a success seed number and then the path to what we're writing. So that's pretty cool. That looks nice. Black Forest was the one that had a little bit more complicated stuff. So it's saying here that it provides a two-step process where it gives you the generation task and you receive a task ID, and then you pull the server until the image is ready. So we'll see that in the console logs as well.

00:53:01 - Dev Agrawal

Oh, you have to pull it, like it doesn't tell you when it's done.

00:53:05 - Anthony Campolo

Apparently not.

00:53:07 - Dev Agrawal

Wow. I don't think so.

00:53:10 - Anthony Campolo

What you could do is probably just have it wait for a certain amount of time because it didn't take that long. But yeah, so you see here we actually have a whole image URL. Yeah. But then this is the output.

00:53:22 - Dev Agrawal

Nice. That's awesome. I love that there's a compare command. I was just going to ask that. Can we compare?

00:53:31 - Anthony Campolo

So that's what I really like about what it did. I don't even think I specifically asked you to do this, even though I would have if it didn't. So now it gives you a single command that's going to run all three, and that's this combined generator, which is really good. They made this smart, composable. Each image generator is its own function. Then they pull them all in and have them all hit a single prompt, which is really cool.

00:53:57 - Dev Agrawal

So this one, there we go.

00:53:59 - Anthony Campolo

We asked for an astronaut riding a horse on Mars with cinematic lighting. So here's Black Forest, there's Dolly, and there's Stability. Okay, so Black Forest.

00:54:14 - Dev Agrawal

I think I like Dolly and Black Forest the most.

00:54:17 - Anthony Campolo

Yeah, Black Forest looks the most realistic for sure. Dolly looks the most kind of like drawn. It doesn't actually look real, but it looks artistic. Stability is kind of somewhere in the middle.

00:54:32 - Dev Agrawal

It's right.

00:54:33 - Anthony Campolo

It's not as realistic as Black Forest. It's a bit more realistic than Dolly. Yeah. That's cool.

00:54:40 - Dev Agrawal

Yeah. The Dolly looks like a painting.

00:54:44 - Anthony Campolo

Give me another prompt. What do we want? Okay.

00:54:48 - Dev Agrawal

Let me find something from my slides. I think I gave a talk about that web framework from the future. That was one of my talks, meet the web framework from the future. So maybe a visualization of what a futuristic web framework would look like.

00:55:20 - Anthony Campolo

Right.

00:55:22 - Dev Agrawal

Maybe. Okay. Yeah.

00:55:24 - Anthony Campolo

Yeah, let's keep it vague. Let's see what they come up with. That's vague enough. It's not describing a scene. So I feel like all three might be more different because we didn't write what to do.

00:55:37 - Dev Agrawal

Mm.

00:55:37 - Anthony Campolo

This reminds me of Dall-E.

00:55:40 - Dev Agrawal

I mean, we can add some more details.

00:55:43 - Anthony Campolo

Dall-E also, screen slope stability is a bit more interesting. Yeah.

00:55:49 - Dev Agrawal

This is vague enough.

00:55:50 - Anthony Campolo

When you give it a vague prompt, it always just generates Minority Report, like am I right? Don't these just look like Minority Report? Have you seen that film?

00:56:00 - Dev Agrawal

Basically, yeah. I've not seen the film, but I kind of have. The images are similar.

00:56:07 - Anthony Campolo

It's really famous because one of the opening scenes is Tom Cruise in front of all these futuristic, like, he has a screen that's part projection, part real screen. He's scrolling and looking at all these things, but it's all in front of him. So it looks like stuff like that. Yeah. Okay, so let's try to refine this a bit. What should we say instead? [00:58:26] - Dev Agrawal

00:58:27 - Anthony Campolo

So we have our own characters, and we'll basically explain the characters, then we'll put some sort of scene or some sort of thing. So, yeah. That's terrible. This is much better. This is cool. Yeah. It's super cute, right? You've got a parakeet, you've got a porcupine. It kind of has a vibe.

00:58:48 - Dev Agrawal

A Pixar movie.

00:58:49 - Anthony Campolo

This one's cool too. Yeah. So this is one of the things I generate a lot of images like this. We can create our own kind of storybook, narrating the first year of our marriage, like this. So, yeah. That's a fun thing that I do with ChatGPT.

It's not something that's productive. It's literally just something that I find to be a cool way to express myself in a visual way that I could not have done without these tools, because I can't draw for crap. I've been a musician. I've been a podcaster, an audio editor. I've done a lot of audio type stuff, and I've never been a visual person. So I really like being able to create this kind of stuff. It's just a really fun thing that I do.

00:59:35 - Dev Agrawal

Man, I am 100% in the same boat. I cannot draw for shit, but so many things that I do don't require visualizations. Any sort of visual is a great reference or a good thing to accompany whatever I'm trying to say, even if it's not a technical diagram, even if it's just an eye candy image. It kind of helps.

So, yeah, I think I do need the idea of characters in a story, in a scene. I do like that. Maybe that's a good way to explain technical concepts as well. Like, yeah.

01:00:24 - Anthony Campolo

Yeah. If you have characters who are working through something, who has Socrates over you.

01:00:31 - Dev Agrawal

You know, it's like a parrot trying to build a website. I don't know. This is nice, like super abstract art.

01:00:39 - Anthony Campolo

Yeah. I asked it to create an intricate, epic DMG geometric trip. This is the type of stuff it's really good at. It's highly detailed, complex geometric type imagery. This is cool because it's kind of like a moon, and it's got some planet-like stuff. So this is a little bit different.

So you see here, like Dolly and Stability, they look almost identical. This is because they both, I think, honed in on the DMT part. So when you do DMT, from what I've heard from people who've talked about it, you blast off up into space and then see all these geometric images kind of around you. So this is what both these look like, essentially. But then this is a little bit different, a little bit more artistic.

01:01:28 - Dev Agrawal

Nice. Uh-oh. It looks like I got a view bot.

01:01:33 - Anthony Campolo

Excellent.

01:01:34 - Dev Agrawal

A view bot. Salesperson. Sales bot for a view bot.

[01:01:40] - Dev Agrawal split?

01:01:41 - Dev Agrawal

Yeah. This is really cool. I definitely need to branch out of OpenAI and start using these other models more, but yeah. I never thought about Claude. Just generate some code for me that I can use to generate images.

01:01:58 - Anthony Campolo

Totally.

01:01:59 - Dev Agrawal

I love how AI can feed into itself, if you can come up with these workflows.

01:02:03 - Anthony Campolo

Yeah, and this is really how I've built out Auto Show over the last year. It's that I first used it to create the MVP workflow, which, by now, is: I first take a video, strip the audio, run transcription, give it a prompt, feed the prompt and the transcription to the thing, which then gives you back the output. So I first just had ChatGPT and Claude help me code out that workflow.

And then every time I got a new idea for a feature, what's the next thing I want to add, what's the next CLI flag, I just give it back my code and then explain, like using Cursor. Also, Cursor has a chat with Copilot, but yeah, I'm just having so much fun using AI to build AI and constantly expanding my own palette of things I can do. I also do this now when I have certain repetitive tasks that I want to write a script for.

[01:02:57] In the past, I didn't really have the chops to just sit down and bang out a Node script to do something, even something simple, like take a bunch of file names and strip out the whitespace and lowercase them. It can write scripts like that really, really well. So as you get to more complicated things like implementing auth, it kind of chokes on that.

But these atomic scripting workflows where you're like, I want this one thing I want it to accomplish, and I want to do it with Node.js and with built-in modules, it's awesome at doing that. It gives you really useful scripts, actually, if you know how to prompt it. Right?

01:03:38 - Dev Agrawal

Yeah, for sure. I've been using it a bit recently with my girlfriend because she is working on some data analytics projects. So, like, hey, ChatGPT, give me some Python code to merge a bunch of CSV files, or remove a bunch of columns from it. Or, yeah, let's do some basic stuff.

01:03:58 - Anthony Campolo

Yeah.

01:04:00 - Dev Agrawal

Yeah. And I don't fully, I don't. If I had to write those scripts myself, I don't think I could because I don't understand Python that well. But I do understand it well enough that if you give me the code, I can make some tweaks to it, and I can run it and do whatever we need to. And it's been super helpful for that.

01:04:18 - Anthony Campolo

Yeah. And you could take any of those scripts and say, write this in Node.js instead of Python, and it'll do it. If you start giving it more obscure languages, it's going to start choking. But it's trained on so much Python and Node code, especially those two languages in particular. That's why I feel more comfortable generating lots and lots of code using AI, because I know it's actually trained on enough of that code that it's going to give you fairly robust stuff.

Especially if you also additionally prompt it, saying, hey, make sure you get your error handling. Just tell it to think about edge cases, and it will all of a sudden think about edge cases. Little stuff like that can also really improve the quality of your scripts. And doing a couple back and forths, you want to explain what you want, have it give you some code, and then explain a couple of things you want to tweak about it. But you want to also be careful because if you do too many back and forths, it starts to get confused, and you want to start a new one.

[01:05:15] So sometimes if I do that, I do a couple back and forths and I get some code that I like, but I still want to change more. I will then start a new session where I say, here's all this code, here's what I want to do. And this is also like, again, Cursor could do all this. I haven't really made that switch yet to doing everything through my editor.

I'm still kind of having conversations with a chatbot and giving it code. I don't know why. It's kind of like that process more. I like having to think about what I'm doing and explain it more. I have to decide what code I want to give it.

[01:05:46] - Dev Agrawal

01:05:48 - Anthony Campolo

Yeah, I'll probably eventually make the switch and just do all this crap in Cursor.

01:05:52 - Dev Agrawal

Yeah. That's fair. I probably just need to bite the bullet and pay for Cursor at this point. I paid for some OpenAI credits. I thought I could just use those, but is it called Composer? Like, whatever's the feature of Cursor that directly can make changes to the code. Yeah.

01:06:13 - Anthony Campolo

And that's why I don't do that. It's also why I think I like my workflow more. Because I don't like having the AI actually change my code. I like having it give me code that then I change, and then I look at the diffs, and then I'll run it, and I'll kind of see what happens.

And then if I get errors, I kind of feed them back into it, because then I feel like that keeps me only partially vibe coding. You know, you've heard this term now, vibe coding, where people just have Cursor make huge thousand-line changes to their code, and they're just praying that it works. You know? That is what I do. I think that's why I haven't made the jump yet, and why I can still kind of make a semi-coherent position for my workflow. It forces me to be more aware about the code changes that are happening. Because even though the AI is writing the code for me, I am making the actual change in my project in a way where I have to see the diff and do a commit, and actually have somewhat of an understanding of what it's doing.

01:07:15 - Dev Agrawal

Yeah, so Cursor is pretty good with that. When Cursor comes up with some changes to the code, obviously you see all the new code in the chat window, but when you hit apply, it doesn't make those changes. It shows you the diff in your editor. Like, here's the old code, here's the new code that Cursor wants to apply.

And then for each section that it's trying to change, you can say, okay, apply these changes. Apply these changes.

01:07:42 - Anthony Campolo

Like how many people just spam. Yeah.

01:07:46 - Dev Agrawal

Yeah. You can.

01:07:46 - Anthony Campolo

Yeah.

01:07:47 - Dev Agrawal

Obviously you can keep spamming it, but it does give you the ability to look at exactly what's being changed in every section. And I think this is one of the reasons why they're not just a VSCode extension, because you can't really do that within VSCode. And I don't think Copilot can do this either right now. Copilot will do it.

01:08:06 - Anthony Campolo

On individual diffs, it will. When you have an error, you can say, fix with Copilot, and it will give you a specific diff to try and address that error. It's good with simple type errors and stuff. So it does actually work fairly well for some stuff.

But if the error is something that requires a fix in a different code file, then all of a sudden it craps out, and that's what Cursor does. Cursor is aware of your other files. Yeah.

01:08:34 - Dev Agrawal

Yeah, yeah, I think you would really enjoy Cursor. I've used it.

01:08:40 - Anthony Campolo

It's that I'm not, right? I haven't switched to making that my main way of writing code. I've tried it a couple times and I see the benefit of it, but I'm really comfortable with my current workflow. You know how it is. You get comfortable doing the hard switch.

But I would say you need to tell your job to pay for this crap. You're employed. If they're not giving you some sort of budget for tools, there's no reason you should have to pay for that yourself.

01:09:07 - Dev Agrawal

Yeah, there's some AI policies that I have to keep in mind, and we have Google Workspace, which means our first preference is always using Gemini. Even right now, we're thinking, okay, how do we deploy and make this available, or have everyone use it. Up until now we're using OpenAI, and today we talked about okay, we probably want to use Gemini for this because we are on Google Workspace.

And we want to make sure that we use their offerings first because we are paying for it already. And that probably means that Cursor is, we want to talk. We should talk about Cursor. But even outside of that, I probably want to pay for it anyway because there's a lot of different things. Conference demos are honestly so much of my AI use case. It's towards conferences, like images. I want them for conference talks.

[01:10:08] Cursor. I want it so that I can quickly build up more complicated, non-trivial demos for showcasing certain things around whenever I'm talking about this. So, like the last talk that I gave in January, it was not a simple to-do app that I built for demo. And I think most of that was generated by Cursor, if I remember correctly. Yeah. And that was a pretty smooth experience.

So the part where it starts shedding is if I start using Cursor for the SolidJS codebase, then it gives me something that's vague, not necessarily even large, but something that's very, very complicated. It's a reactivity system with a scheduler and a renderer. And there are a lot of different moving parts. It's the internals of a really complicated front-end framework.

01:11:03 - Anthony Campolo

And it's probably fairly large. If it was all in a single file, how many lines of code do you think it would be? How many lines of code do you think it would be?

01:11:11 - Dev Agrawal

So I think I'm talking about the Solid 2.0 codebase, which is relatively small right now. It's only the reactivity system. The renderer is not in there. There's no server-side rendering. Actually, there's no rendering at all. So it's probably 1,000, 2,000 maybe.

01:11:33 - Dev Agrawal split?

Okay. That's actually pretty small, then. That's impressive.

01:11:38 - Anthony Campolo

But I would say, yeah, once you get to multiple thousands of lines of code is when it starts to crap out.

01:11:44 - Dev Agrawal

For sure. Yeah. Yeah.

01:11:47 - Anthony Campolo

It's incredible how long that is. Thousand lines of code. I had to go read through that code.

01:11:51 - Dev Agrawal

Might be more than that. Yeah. It's also, again, very experimental. The new version, the current version, is probably much bigger than that.

But Ryan optimizing bundle sizes is something that most front-end frameworks now put a lot of effort into. It's probably more than a couple thousand. Yeah. But yeah, actually, yeah. Tell me more about Auto Show. How's that going?

01:12:19 - Anthony Campolo

It's good. Well, I'm kind of stuck in the weeds right now.

01:12:26 - Dev Agrawal

So just use Clerk.

01:12:29 - Anthony Campolo

That's what I'm trying to do. Yeah. I'll be totally honest. I have never actually implemented auth in a serious app before, beginning to end. I've only worked on apps that already had it, or just some stupid simple demo app and my bootcamp, which is not even real auth. Just store your username and password in a database and then read it back, because that's all.

So I guess I have one question for you that would really help me out if you could answer this. I'm working with a Postgres database where the only thing you have is just your show notes object that has a bunch of different fields with text. It's all very simple. So do I want a separate user model that references the show notes, or do I want each show note to have a single user ID field that associates each show note with a user?

01:13:37 - Dev Agrawal

Definitely the second one.

01:13:39 - Dev Agrawal split?

Okay.

01:13:40 - Anthony Campolo

And that's kind of what I was seeing as I worked this out, and how Claude made it seem. And that's actually good because that's a lot simpler than what I thought I was going to have to do, which is have a user model with relations. So I don't need to do that, is what you're saying?

01:13:57 - Dev Agrawal

Yeah. No. You can think of it like this: the user object should not know about what the rest of your application does. That's the best way to keep it simple and isolated in its own thing and just have everything else refer to a user ID. I mean, that's basically how providers like Clerk work. They don't know that you're doing auto show notes. Instead, you have show notes that say user ID. It's just that the user ID belongs within their database instead of your own database. So that's a good way to isolate them from each other.

01:14:37 - Dev Agrawal split?

Okay. Yeah.

01:14:38 - Anthony Campolo

And we also talked about this just a little bit last time you were on. The way my current app is set up, it's a Fastify server and an Astro app that is hitting the server. And you're saying I should implement auth on the front end, not the back end. I should have the Astro part be aware of a user and then the server doesn't really need to do the auth, is what you were saying last time.

[01:15:07] - Dev Agrawal split?

01:15:07 - Dev Agrawal

If your Fastify server is not exposed to the public internet, then yeah, it doesn't need to have auth. Where do you, are you just running it locally right now or are you deploying it somewhere?

01:15:24 - Anthony Campolo

Yeah. So I have the back end deployed. The front end is not. So I figured I had to get the back end deployed as a Docker container on Railway, and it is just exposed to the internet. Right.

And the way I kind of locked it down is that it doesn't have the API keys for things like OpenAI and stuff like that. So that's some other kind of higher-level things I still need to figure out. But in terms of having a user session that is logged in and interacts with that back end, that is something that should happen on the front end, not the back end.

01:16:00 - Dev Agrawal

So the back end should definitely have some sort of auth. Either the back end has the username/password auth, whatever you're building, or just an API key that any request to the back end needs. And if the API key is incorrect, then it's a JWT.

01:16:18 - Anthony Campolo

It would be one way to do this, right?

01:16:21 - Dev Agrawal

The API key. [01:16:22] - Anthony Campolo You mean a JWT, right? In terms of having the specific user session.

01:16:28 - Dev Agrawal

For the user session, a JWT would be a good idea. What's like the front end is probably a better place for the user auth to live, and then the back end is just like a simple API key present. It's just a random string, and if it doesn't have the correct API key, then it gets rejected. That's probably the simplest way to do auth on the API side.

On the Astro side, you would have your actual user management. Once the user is logged in, then you can make the request to your back end with the correct API key. So your user auth lives in the front end, and your back end is just a simple API key. That would be an ideal way to do it. That's how I would approach it. But I'd also probably just eliminate the back end and do everything in Astro in the first place. If you have.

01:17:25 - Anthony Campolo

Honestly, yeah. That's part of why I hesitated to do that. I did a quick run through of trying to migrate the whole thing to SolidStart actually, and got pretty far. I got most of the back end ported to SolidStart.

So I'm kind of at this point now where I'm like, do I want to stick with my current stack and make Clerk work with the current stack, or do I want to rewrite it in a meta framework that has a back end built in, like Astro or SolidStart or something like that? That's kind of a more important question that I need to answer first. I can make it work in this current thing, but as you're saying, I think what I really want is a meta framework. I want a full stack meta framework, obviously.

01:18:07 - Dev Agrawal

Yeah.

01:18:08 - Anthony Campolo

Of course I would want a full stack meta framework.

01:18:11 - Dev Agrawal

Yeah. I mean, it looks like there's, yeah, Clerk has an Astro SDK. It has an SDK.

01:18:20 - Anthony Campolo

It has an integration with, yeah, but this is the problem. I don't want to use two of their integrations. That doesn't make any sense. I want one integration that actually works throughout my whole product. And that's why what I was trying to do was really complicated, because they have a Fast AI thing and they have an Astro thing, and it only makes sense for me to use both of them.

01:18:40 - Dev Agrawal

I mean, you could use both of them as well.

01:18:45 - Anthony Campolo

A lot more complicated.

01:18:46 - Dev Agrawal

Yeah.

01:18:47 - Anthony Campolo

Yeah.

01:18:48 - Dev Agrawal

I mean, it would be a little more complicated, but it would also be like, I want to say future proof, but it's such a weird, such a taboo thing to say these days. Like, why are you caring so much about the future? Just like.

01:19:10 - Anthony Campolo

No, I care.

01:19:11 - Dev Agrawal

About things. Simple things right now.

01:19:12 - Anthony Campolo

What makes that more future proof than just having a thing? Because I would assume that just using a single Clerk plugin would be easier than having to have two that speak to each other.

01:19:21 - Dev Agrawal

Yeah. The thing is, your back end is probably very like, eventually you might want to do things like credits. Like, does a user have enough credits to make this request? Right.

01:19:33 - Anthony Campolo

And that's gonna be the next thing I need to figure out as soon as I get the login figured out. Then the payment system, the credit system, yeah.

01:19:39 - Dev Agrawal

Yeah, exactly. Do you want people to access the API separately from outside of your front end, or should it only be like you go through the front end? That's it. You don't access it through the API directly?

01:19:53 - Anthony Campolo

Yeah. I mean, some amount of the app is going to be available as an open source thing if someone wants to create their own version of the back end and host it themselves. But I'm not exposing an API. I'm not going to have API docs. It's going to be an app that people use.

01:20:13 - Dev Agrawal

Yeah. Okay. Then you can skip the Fastify stuff. You can just have a very simple API key for accessing the back end, and then do all the user management on the front end.

01:20:26 - Anthony Campolo

Okay. That's super helpful. Thank you for running through that with me. That was in the back of my head, something I wanted to ask you about, so I'm really glad we hit that. But I.

01:20:35 - Dev Agrawal

Was happy to talk about auth.

01:20:37 - Anthony Campolo

Yeah, for sure. I'm not going to ask you about it because you already said you can't say more, but I really want to know about the AI app you're building. We can talk about it more often, but that's just kind of where my mind went.

Is there anything else to talk about either like Solid or your own streaming? You just did a stream not too long ago. What did you do?

01:21:01 - Dev Agrawal

So my stream, I think I was, oh yeah, TanStack Router now supports SolidJS, and eventually TanStack Start is also going to support SolidJS. That's been one of the big pieces of news from last week.

So my stream was taking the, you might remember from actually last year, you weren't kind of around, but last year there was kind of a Trello clone hype, thanks to Ryan Florence, who built a Trello clone using Remix and showed a bunch of nice optimistic updates, features, form actions, things like that. There's actually a bunch of other communities.

01:21:43 - Anthony Campolo

You're correct. I did miss that, and I actually was building a Trello clone at the exact same time, completely unrelated. Nice.

01:21:52 - Dev Agrawal

Yeah. So a bunch of different framework authors or communities were trying to build a similar demo, show similar features from their framework. Obviously the SolidStart community built one.

We built our own actually a while after the hype happened. It took us a while, but what I was doing in my stream last week was taking that demo and building that with TanStack Router instead of SolidStart. That was one part. And then the other part was recording my video on server components. Last year or two years ago, yeah, 2023, I made a video on why I am excited about React Server Components. Right now I'm working on a video on why I am no longer excited about React Server Components. So that's the video that I was recording on stream.

01:22:46 - Anthony Campolo

I feel like React Server is like the five stages of grief with people, I swear to God.

01:22:54 - Dev Agrawal

Very much, yes. Even Theo right now, he's in the process of moving completely off server components for the chat. So, yeah, it's that trajectory. Different people are at different points in that trajectory. Even people like Ryan Cano, Ryan Flores, they have been through that trajectory and reached the point where they're no longer super excited about it. I am slightly behind them. Theo is a little more behind them because for a while he was paid.

01:23:26 - Anthony Campolo

Well, I.

01:23:26 - Dev Agrawal

Can say.

01:23:27 - Anthony Campolo

I stopped being excited about this in 2023 because I was excited about it in 2021. So once again, ahead of the game.

01:23:36 - Dev Agrawal

Yeah, for sure. Yeah.

01:23:37 - Anthony Campolo

That's awesome.

01:23:39 - Dev Agrawal

I think Redwood is still, it feels like it's all in on server components. I don't know where that's going exactly.

01:23:44 - Anthony Campolo

That's one of the reasons I kind of fell out. It's not the reason, but there are many reasons. I kind of stopped being as involved with Redwood, and it was partly because they kept picking up all these React trends two years too late. I was like, guys, I was telling you about React in 2021. Now you're doing 2024, and you're way behind the curve. Why didn't you listen to me?

01:24:07 - Dev Agrawal

Yeah. Shopify was probably the first ones to go through the entire curve and then come out the other side. And then, you know what? We're just going to use Remix Hydrogen.

01:24:17 - Anthony Campolo

I was the first person to get Josh from Hydrogen on a podcast talking about Hydrogen, my first ever podcast interview about Hydrogen, because I was paying so close attention to React Server Components. But yeah, I'll stop bragging.

01:24:33 - Dev Agrawal

Yeah. So, I guess be on the watch out for that video later this week.

01:24:39 - Anthony Campolo

Yeah. Last thing I was going to tell you. I'm almost done with Ryan GPT. Remember we talked about, um, we.

01:24:46 - Dev Agrawal

Need.

01:24:46 - Anthony Campolo

That AutoShow to do all of the Ryan streams? It's taken me almost a month because it's like 100 episodes that are each five hours, so it's like 500 hours worth of stuff to transcribe. I'm almost done.

I've done some initial embeddings generation and then asking it questions to see kind of stuff it spits out. It's pretty cool. So once I'm done with all these episodes and I have embeddings created for all of it, I'm going to drop it in the Solid Discord and be like, here, now you can chat with the Ryan Oracle.

01:25:25 - Dev Agrawal

Yes, please. And make sure you tag me because I don't often pay attention to a lot of the channels in the Discord, and I really want to see this.

01:25:34 - Anthony Campolo

Yeah, it's exciting. I'm very excited about it. It's one of the reasons why I was thinking about porting Salt AutoShow to Solid entirely, because I'd be like, here's the Ryan GPT and here's the tool I use to create it, which isn't Solid. I didn't quite get there, but I might go back and try again. We'll see.

01:25:51 - Dev Agrawal

Yeah. I mean, if you want to find some time and pay it on it, I would love to do that.

01:25:57 - Anthony Campolo

Cool. Yeah. That'd be super fun. Well.

01:26:01 - Dev Agrawal

I was curious about a lot of Ryan streams. He brings on a guest. In the transcript, does it show that this is Ryan talking or there's someone else talking?

01:26:14 - Anthony Campolo

So the way AutoShow is set up, you can use Deepgram or AssemblyAI to get speaker labels. You have to use an API key, so it costs a couple dollars. But the way I have it done with Whisper, it just gives you the straight text.

Now, I will say that when you get a five hour transcript and a chunk, even if the speakers are not identified because you're giving it to an LLM, it kind of figures it out. Actually, in a pretty good way it can tell there's multiple speakers. Usually if there's more than two people, it can get confused, like who's saying what when. If there's just two speakers, it will be able to tell just by reading the text when one person is saying something versus another, which is incredible. This is one of the first things I discovered by using Whisper, that you didn't need the speaker labels if you were going to throw the transcript out at the end.

01:27:10 - Dev Agrawal

That's fantastic. Yeah, if it can do that across all of them.

01:27:17 - Anthony Campolo

It will know who Ryan is across all of them. It won't be able to give you the fine grained, like this specific guest said this thing in this episode, although it would probably if, because I also give the front matter, it can read titles. So if the guest name is in the title, yeah, it would then have information. Or if Ryan is saying the person's name multiple times, it can tell things by context. So if there's more context, if Ryan happens to say his name a couple times and Ryan never says the guest name, then it will never know who that guest is. It really kind of comes down to that.

01:27:52 - Dev Agrawal

Yeah, yeah. Now, Ryan usually does a proper introduction, like this is why this person is here, this is who we are going to bring on, or like, okay, it's time. It's time to bring on Anthony Campolo. So yeah, it's going to be pretty good. Ryan's literally just prompting on his stream, like every single thing.

01:28:16 - Anthony Campolo

Okay, awesome.

01:28:17 - Dev Agrawal

That's awesome. I'm looking forward to it.

01:28:19 - Anthony Campolo

Hit the viewers with your Twitter or wherever you want to draw people. Maybe your YouTube. Twitter.

01:28:28 - Dev Agrawal

Yeah, Twitter is probably the best. I tried using Blue Sky for a little bit here and there. Not great results, so I'm now back full time on Twitter.

01:28:41 - Anthony Campolo

It makes me happy to hear. Yeah, I've got a Blue Sky, but for me it's hard to migrate. I've built a lot of time on the tweets.

01:28:55 - Dev Agrawal

Uh, they're.

01:28:56 - Anthony Campolo

Cool. All right. Oh, nine. Is that when you. What does oh nine remind me?

01:29:03 - Dev Agrawal

I forget that's my date of birth. It's the ninth. May it. That's been my username for like 15 years now.

01:29:14 - Anthony Campolo

That's cool. Yeah. I used to have EightCampoloFive because when I first made an email it was Anthony55555 because my dad was like, what's your favorite number? And I was like, five. I don't know why five was my favorite number. But then Anthony5 was taken, then 5 was taken, then 55, then 555, so we got to 55555. I still have that Gmail, even though I've spent two years trying to migrate from it. I know how that is, having a random number for no reason.

01:29:50 - Dev Agrawal

Yeah, my earliest days on the internet, I was trying. I was like creating an email account and I think at that time Rediffmail was popular. That's why I created my first email. And it was this, or, yeah, this, they were zero nine at Mail.com was my very first one. I don't have access to that anymore. Someone in high school decided or found out a way, like some loopholes that allowed them access to my account. Then they changed everything, and my Facebook was linked to it, so they also changed everything on my Facebook. Then I lost access to both.

01:30:26 - Anthony Campolo

Oh, no. I've never been hacked like that. That's probably traumatized, I would imagine.

01:30:34 - Dev Agrawal

I don't know. It is, yeah, probably a little bit, but it used to, it happened to a lot of people.

01:30:40 - Anthony Campolo

You feel like you've been violated?

01:30:43 - Dev Agrawal

Yeah. It's fine. I've done a decent bit of that myself, so can't really be too traumatized. My friend and I went in our high school computer lab. We installed keyloggers on every computer. So if anyone went in there, logged into their Facebook account, we had their credentials.

01:31:10 - Anthony Campolo

Yikes. That's incredible. It doesn't surprise me that you can pull that off because who's going to be in charge of security at a random school, you know? Yeah.

01:31:21 - Dev Agrawal

Pretty much.

01:31:22 - Anthony Campolo

Yeah. That's fun. All right, man, let's call it here. Just stay on after we end the stream so we can book another time, hopefully. Yeah, man, always love streaming with you. Super fun. Anything you want to say before we close out?

On this pageJump to section