1
00:00:01,000 --> 00:00:07,000
Let's go all the way. I like it. We're live, basically. I mean, not live, but you know.

2
00:00:08,000 --> 00:00:11,000
I'm not brave enough yet to live stream it.

3
00:00:12,000 --> 00:00:18,000
But that was one of the things you showed was a live stream applet, right?

4
00:00:19,000 --> 00:00:20,000
Yeah, yeah.

5
00:00:21,000 --> 00:00:26,000
So that's basically doing the same thing that zapstream is doing, but just in a napplet.

6
00:00:27,000 --> 00:00:29,000
Exactly. It's just pulling in the streaming events.

7
00:00:30,000 --> 00:00:32,000
We should explain what applets are.

8
00:00:33,000 --> 00:00:37,000
We had the most successful workshop ever in the world today.

9
00:00:38,000 --> 00:00:42,000
A dozen people at least created applets and all this kind of stuff.

10
00:00:43,000 --> 00:00:47,000
And yeah, it's really fucking cool. So first of all, congrats on that.

11
00:00:48,000 --> 00:00:49,000
Yeah, thanks.

12
00:00:50,000 --> 00:00:55,000
And after we hit the party music, I think we'll just lean in and explain.

13
00:00:56,000 --> 00:00:57,000
Yeah, sounds good.

14
00:00:57,000 --> 00:00:59,000
But first of all, how did you come up with the idea for it?

15
00:01:00,000 --> 00:01:02,000
What was the motivation behind building it up?

16
00:01:03,000 --> 00:01:05,000
It's always been on my mind.

17
00:01:06,000 --> 00:01:10,000
When I saw early Nostr, the clients weren't really that interesting to me.

18
00:01:11,000 --> 00:01:12,000
That's why I didn't really work on any.

19
00:01:13,000 --> 00:01:21,000
It seemed like the way that Nostr is designed and architected, or the lack of it,

20
00:01:22,000 --> 00:01:24,000
it demands maximum flexibility.

21
00:01:25,000 --> 00:01:34,000
A standard client is very restrictive and everything is isolated, which is the opposite of what the protocol is.

22
00:01:35,000 --> 00:01:37,000
Restrictive in what way?

23
00:01:38,000 --> 00:01:42,000
Well, because you have a team of people or a single developer building their one thing.

24
00:01:43,000 --> 00:01:46,000
And just to get it functional takes a lot of work.

25
00:01:47,000 --> 00:01:49,000
And all these people are working in a silo.

26
00:01:49,000 --> 00:01:55,000
And there's no way that even a large team could develop everything that you could possibly develop.

27
00:01:56,000 --> 00:02:00,000
So it just made sense to me that every functionality should be atomic.

28
00:02:01,000 --> 00:02:04,000
It should be switchable between one client and another.

29
00:02:05,000 --> 00:02:06,000
You should be able to compose your clients.

30
00:02:07,000 --> 00:02:12,000
I see. So in terms of complexity, you mean taking care of the keys, taking care of the signing,

31
00:02:13,000 --> 00:02:16,000
taking care of the relay connections, taking care of caching, taking care of outbox.

32
00:02:16,000 --> 00:02:18,000
So all the things that...

33
00:02:19,000 --> 00:02:23,000
I mean, that's why we have a library layer now, basically.

34
00:02:24,000 --> 00:02:26,000
We have NDK, we have Applesauce, we have other things.

35
00:02:27,000 --> 00:02:34,000
But your approach with the Nostr applets is quite different.

36
00:02:35,000 --> 00:02:36,000
It's on a different layer.

37
00:02:37,000 --> 00:02:41,000
So how did you end up with this design decision, basically?

38
00:02:42,000 --> 00:02:48,000
Well, it took some time to actually get to the point where I understood what I was thinking.

39
00:02:49,000 --> 00:02:54,000
Or what I was envisioning when I first got introduced to Nostr.

40
00:02:55,000 --> 00:02:58,000
What was the first version? If it took some time and it took some iterations,

41
00:02:59,000 --> 00:03:01,000
what did you learn along the way and how did the first version look like?

42
00:03:02,000 --> 00:03:04,000
The first version was at my friend's house in Sacramento.

43
00:03:05,000 --> 00:03:10,000
And I was getting into vibe coding a little bit.

44
00:03:11,000 --> 00:03:14,000
And I think he was really into Claude and he was like, you have to use Claude.

45
00:03:15,000 --> 00:03:16,000
So I was like, all right, I'll try Claude for you.

46
00:03:17,000 --> 00:03:18,000
So that was one and a half years ago or so, something like that?

47
00:03:19,000 --> 00:03:22,000
No, it was like... because I was using other things.

48
00:03:23,000 --> 00:03:25,000
He was really into Anthropic, I hadn't used Anthropic yet.

49
00:03:26,000 --> 00:03:28,000
It was in July, a year ago.

50
00:03:29,000 --> 00:03:32,000
And I was sitting in his living room and I was like, you know,

51
00:03:33,000 --> 00:03:36,000
like Insights had just come out and I knew there was something there,

52
00:03:37,000 --> 00:03:39,000
that there's something special with Insights.

53
00:03:40,000 --> 00:03:42,000
And so I thought of like...

54
00:03:43,000 --> 00:03:47,000
Also, I had recently gotten into the Hyperland compositor.

55
00:03:48,000 --> 00:03:55,000
So I was kind of inspired by that new fresh look at what a desktop could be.

56
00:03:56,000 --> 00:04:00,000
And I built a prototype of what I showed you today.

57
00:04:01,000 --> 00:04:03,000
How come you got into Hyperland?

58
00:04:04,000 --> 00:04:06,000
Is it where you're always a Wayland kind of guy?

59
00:04:07,000 --> 00:04:08,000
No, I mean...

60
00:04:09,000 --> 00:04:12,000
I don't want to get in the tribal fights between X11 and Wayland.

61
00:04:13,000 --> 00:04:14,000
Why not?

62
00:04:15,000 --> 00:04:18,000
No, it was more of just like, well, I should at least try it.

63
00:04:20,000 --> 00:04:23,000
So why I got into it was I was looking for a new desktop environment

64
00:04:24,000 --> 00:04:25,000
and I didn't want a desktop environment.

65
00:04:26,000 --> 00:04:27,000
I was sick of the bloat.

66
00:04:28,000 --> 00:04:29,000
I was sick of the opinionation.

67
00:04:30,000 --> 00:04:31,000
I just wanted to build my own thing.

68
00:04:32,000 --> 00:04:34,000
Sick of the opinionation, so I'm going to build my own thing.

69
00:04:35,000 --> 00:04:36,000
Exactly.

70
00:04:37,000 --> 00:04:38,000
Well, other people's opinionation, right?

71
00:04:39,000 --> 00:04:40,000
And having to live through it.

72
00:04:45,000 --> 00:04:46,000
I just tested it out.

73
00:04:47,000 --> 00:04:50,000
I was just going to rise it up and see what it was about.

74
00:04:54,000 --> 00:04:59,000
So you were in that kind of mindset when you started hacking on what is now Atlas.

75
00:05:00,000 --> 00:05:01,000
Yeah.

76
00:05:01,000 --> 00:05:02,000
And I just saw that...

77
00:05:06,000 --> 00:05:07,000
I was making a lot of end sites too.

78
00:05:08,000 --> 00:05:09,000
End sites barely worked.

79
00:05:11,000 --> 00:05:14,000
And I was finding that I was spending a lot of time

80
00:05:15,000 --> 00:05:18,000
building a lot of things over and over and over and over, right?

81
00:05:19,000 --> 00:05:21,000
I think MakeStack was just around the corner.

82
00:05:22,000 --> 00:05:25,000
But even that, you have to maintain it after you've implemented it.

83
00:05:26,000 --> 00:05:27,000
So...

84
00:05:29,000 --> 00:05:30,000
Yeah, I just built a prototype.

85
00:05:31,000 --> 00:05:32,000
And then I saw, I was like, wait.

86
00:05:34,000 --> 00:05:37,000
First of all, it's really hard to manage the memory in this

87
00:05:38,000 --> 00:05:39,000
because everything's in the main thread.

88
00:05:40,000 --> 00:05:42,000
And then I started breaking them into iframes.

89
00:05:43,000 --> 00:05:46,000
And at that point, I realized that in order to do it correctly,

90
00:05:47,000 --> 00:05:51,000
I would have to really step back from this prototype idea,

91
00:05:51,000 --> 00:05:54,000
this vision I have, and then actually figure out

92
00:05:55,000 --> 00:05:57,000
what it actually looks like to do this well.

93
00:05:58,000 --> 00:06:02,000
I found a lot of different security problems with my prototype and all this stuff.

94
00:06:03,000 --> 00:06:04,000
Iframes, just hearing iframes...

95
00:06:05,000 --> 00:06:06,000
I know, it sounds so funny.

96
00:06:07,000 --> 00:06:08,000
It sounded funny to me too.

97
00:06:09,000 --> 00:06:11,000
Did it work at all with iframes?

98
00:06:12,000 --> 00:06:16,000
Yes, but everything was, the lines were blurred.

99
00:06:17,000 --> 00:06:18,000
So because there was...

100
00:06:18,000 --> 00:06:20,000
The line between container and applet.

101
00:06:21,000 --> 00:06:24,000
Yeah, because the applet could do whatever the runtime could do.

102
00:06:25,000 --> 00:06:27,000
And so we could do things without the runtime knowing,

103
00:06:28,000 --> 00:06:29,000
without the user knowing, and it couldn't be possible

104
00:06:30,000 --> 00:06:32,000
to sort of restrict what the app was doing, right?

105
00:06:33,000 --> 00:06:34,000
At this time, it was actually called Naps.

106
00:06:35,000 --> 00:06:36,000
Okay.

107
00:06:37,000 --> 00:06:38,000
Yeah, which is kind of funny.

108
00:06:39,000 --> 00:06:40,000
Which is fitting.

109
00:06:41,000 --> 00:06:42,000
Apps can do more than applets.

110
00:06:43,000 --> 00:06:44,000
Yeah, so I moved into a Tori app.

111
00:06:45,000 --> 00:06:46,000
Nsight.run actually.

112
00:06:46,000 --> 00:06:47,000
Or no, it was Nap.run.

113
00:06:48,000 --> 00:06:50,000
And I built that pretty quick,

114
00:06:51,000 --> 00:06:53,000
but it hit the ceiling really quickly as well,

115
00:06:54,000 --> 00:06:56,000
because I couldn't, there was a bunch of stuff I couldn't do.

116
00:06:57,000 --> 00:07:00,000
And then I immediately went into forking Thorium,

117
00:07:01,000 --> 00:07:04,000
which is like a slimmed down chromium,

118
00:07:05,000 --> 00:07:08,000
but the build chain for that was insane.

119
00:07:09,000 --> 00:07:13,000
It took a huge amount of space to run the CI,

120
00:07:14,000 --> 00:07:16,000
and I just was like, I can't do this right now.

121
00:07:17,000 --> 00:07:18,000
So I stepped back further,

122
00:07:19,000 --> 00:07:21,000
and I just started with a single frame,

123
00:07:22,000 --> 00:07:25,000
and I started attacking the runtime

124
00:07:26,000 --> 00:07:27,000
from inside of the iframe.

125
00:07:28,000 --> 00:07:32,000
And progressively, I removed more and more and more features

126
00:07:33,000 --> 00:07:34,000
of what the iframe was allowed to do,

127
00:07:35,000 --> 00:07:37,000
until it got to the point where it could basically do nothing,

128
00:07:38,000 --> 00:07:39,000
except for talk over postMessage.

129
00:07:40,000 --> 00:07:41,000
Okay.

130
00:07:42,000 --> 00:07:43,000
And I wasn't very hopeful.

131
00:07:44,000 --> 00:07:45,000
I didn't think it would work,

132
00:07:46,000 --> 00:07:47,000
because to redefine,

133
00:07:48,000 --> 00:07:50,000
I found myself redefining Nostr

134
00:07:51,000 --> 00:07:54,000
inside of the sub-protocol that it has now become.

135
00:07:57,000 --> 00:07:59,000
And it took a few months,

136
00:08:00,000 --> 00:08:01,000
like four or five, six months,

137
00:08:02,000 --> 00:08:06,000
before I understood that I was approaching it entirely wrong.

138
00:08:07,000 --> 00:08:12,000
And I identified that the person making the application

139
00:08:13,000 --> 00:08:16,000
doesn't need to know as much as I originally thought.

140
00:08:17,000 --> 00:08:20,000
They don't need to know that they're uploading to Blossom.

141
00:08:21,000 --> 00:08:22,000
They don't need to know where they're uploading.

142
00:08:23,000 --> 00:08:24,000
They don't need to know about relays.

143
00:08:25,000 --> 00:08:26,000
They don't need to know about keys.

144
00:08:27,000 --> 00:08:28,000
They need to know a little bit.

145
00:08:29,000 --> 00:08:30,000
They need to understand that there are relays.

146
00:08:31,000 --> 00:08:34,000
And so once I got the security posture where it was,

147
00:08:34,000 --> 00:08:36,000
and I played with the API enough,

148
00:08:37,000 --> 00:08:41,000
I realized there was really two sets of API services

149
00:08:42,000 --> 00:08:44,000
that the run time, or sorry,

150
00:08:45,000 --> 00:08:46,000
that the NAPLIT should have,

151
00:08:47,000 --> 00:08:48,000
which is sort of like a high-level,

152
00:08:49,000 --> 00:08:51,000
helper kind of style API.

153
00:08:52,000 --> 00:08:53,000
And then escape hatches,

154
00:08:54,000 --> 00:08:55,000
so that flexibility isn't compromised,

155
00:08:56,000 --> 00:08:57,000
because if you try to do everything through helpers,

156
00:08:58,000 --> 00:09:00,000
you sort of constrain the potential experiences

157
00:09:01,000 --> 00:09:02,000
that you could create.

158
00:09:02,000 --> 00:09:04,000
What's an escape hatch in that context?

159
00:09:05,000 --> 00:09:08,000
Outbox would be the easiest way to retrieve notes,

160
00:09:09,000 --> 00:09:12,000
because you basically delegate the outbox context

161
00:09:13,000 --> 00:09:14,000
to the run time.

162
00:09:15,000 --> 00:09:17,000
But the escape hatch is a relay interface

163
00:09:18,000 --> 00:09:21,000
that allows you to have lower-level access

164
00:09:22,000 --> 00:09:23,000
to the protocol, if you need it.

165
00:09:24,000 --> 00:09:25,000
Okay, okay, okay.

166
00:09:26,000 --> 00:09:27,000
So in case something doesn't work right,

167
00:09:28,000 --> 00:09:30,000
you use the escape hatch and try to do things more directly.

168
00:09:30,000 --> 00:09:31,000
Exactly, exactly.

169
00:09:32,000 --> 00:09:33,000
Okay, I get it. I see.

170
00:09:34,000 --> 00:09:35,000
The next challenge was getting NAPLITs

171
00:09:36,000 --> 00:09:37,000
to talk to one another.

172
00:09:38,000 --> 00:09:39,000
That was very difficult.

173
00:09:40,000 --> 00:09:43,000
Actually, we only settled on it last night,

174
00:09:44,000 --> 00:09:45,000
how to fix that.

175
00:09:46,000 --> 00:09:47,000
Who is we?

176
00:09:48,000 --> 00:09:49,000
Hazard and I. We were talking about it.

177
00:09:50,000 --> 00:09:51,000
It's goddamn Hazard.

178
00:09:52,000 --> 00:09:53,000
He has his fingers in everything.

179
00:09:54,000 --> 00:09:56,000
Yeah, it took me a while to get him on board.

180
00:09:57,000 --> 00:09:58,000
Yeah, you mentioned that briefly today.

181
00:09:58,000 --> 00:09:59,000
You tried to explain it to me.

182
00:10:00,000 --> 00:10:21,680
And

183
00:10:21,680 --> 00:10:28,840
you built this awesome workshop tutorial page that I was able to point my agent to and just

184
00:10:28,840 --> 00:10:34,200
everything worked basically. I was able to build the first applet in five minutes or so.

185
00:10:34,200 --> 00:10:37,800
Yeah, it was like five or six minutes and deployed in six minutes.

186
00:10:37,800 --> 00:10:42,440
Yeah, so if someone's curious, I'll definitely link that and then you can just, you know.

187
00:10:42,440 --> 00:10:45,480
I'm going to make some improvements to it because some people had some issues.

188
00:10:45,480 --> 00:10:51,560
Yeah, I mean, you have to understand what's going on on the underlying side and it helps

189
00:10:51,560 --> 00:10:58,440
to have a proper setup. You know, like I was lucky that I just, I have Amber on my phone

190
00:10:58,440 --> 00:11:03,640
and can set up the signing for the publication flow and all this kind of stuff. And I have,

191
00:11:03,640 --> 00:11:09,000
you know, like also a proper Nostr setup and a proper signing setup on my laptop,

192
00:11:09,000 --> 00:11:14,200
on my development machine. That makes everything easier. But if you have that,

193
00:11:14,200 --> 00:11:20,280
if you do a little bit of prep work, then pointing an agent at this tutorial will just work.

194
00:11:20,280 --> 00:11:21,560
Yeah, that's awesome.

195
00:11:21,560 --> 00:11:29,240
That was the idea. And fortunately too, it's not like a lot of this, while everything is

196
00:11:29,240 --> 00:11:35,320
agent assisted, there's a lot of experience that went into it. Like it wasn't designed by AI.

197
00:11:36,280 --> 00:11:38,600
If it was designed by AI, I don't think it would work.

198
00:11:40,280 --> 00:11:42,200
It's amazing how well it works, by the way.

199
00:11:42,200 --> 00:11:44,760
Yeah, it's surprising to me too.

200
00:11:45,720 --> 00:11:51,640
But talk to me more about kind of the level of abstraction that you landed on,

201
00:11:53,080 --> 00:11:57,640
iterating on it for like almost a year. Because it's, you also mentioned briefly,

202
00:11:57,640 --> 00:12:04,040
VHF kind of hates it in the sense that it doesn't use kinds as a messaging bus and so on.

203
00:12:04,040 --> 00:12:08,920
So you chose a different level of abstraction. So explain that some more.

204
00:12:08,920 --> 00:12:13,000
Well, I wouldn't say he hates it because it inspired him when I showed him

205
00:12:13,320 --> 00:12:18,680
an early demonstration, I just sent him a screenshot and said, this can open that.

206
00:12:18,680 --> 00:12:23,240
And he was like, well, that would be a paradigm change. And it did inspire him to actually revisit

207
00:12:23,240 --> 00:12:28,360
one of his old projects that was very similar to this. But some of the design decisions I've made,

208
00:12:28,360 --> 00:12:30,200
he has been disagreeing with.

209
00:12:32,760 --> 00:12:35,880
I mean, to be fair, VHF basically hates everything on first sight.

210
00:12:35,880 --> 00:12:36,360
Of course.

211
00:12:37,560 --> 00:12:38,520
That's just how it goes.

212
00:12:40,520 --> 00:12:42,120
It's almost like a stamp of approval.

213
00:12:43,160 --> 00:12:46,680
Yeah, actually, you're probably right.

214
00:12:47,400 --> 00:12:52,280
Because if he wouldn't say he hates it, then he would just be indifferent to it and wouldn't say

215
00:12:52,280 --> 00:12:52,680
anything.

216
00:12:52,680 --> 00:12:53,560
Exactly. Yeah.

217
00:12:56,760 --> 00:13:01,880
So yeah, it took a lot of different iterations. I mean, it started with the shell, which is what

218
00:13:02,520 --> 00:13:10,360
mediates every request from like over the bus, right? Being a relay. And then the napplets were

219
00:13:10,360 --> 00:13:19,560
sending Nostr messages using NIP one. And then I was going to extend new messages. But this

220
00:13:19,560 --> 00:13:27,800
created a bunch of a huge convoluted mess because you had to arbitrarily assign a key pair from the

221
00:13:27,800 --> 00:13:35,720
runtime to the napplet, right? And this was just completely unnecessary because the runtime already

222
00:13:35,720 --> 00:13:41,560
had full control over the napplet already. So it doesn't need it to confirm it.

223
00:13:42,840 --> 00:13:47,080
And then otherwise, then you'd be sending unsigned events, which then was weird,

224
00:13:47,080 --> 00:13:51,640
because you did want to know sort of where the events were when they're being routed.

225
00:13:51,640 --> 00:13:58,760
One of the benefits the first design had was that you could tell where the event came from

226
00:13:59,480 --> 00:14:03,480
at any point in the runtime. You could always tell, oh, it came from this napplet.

227
00:14:04,040 --> 00:14:07,880
But every napplet had a key as well. That's something you mentioned, right?

228
00:14:07,880 --> 00:14:14,600
Yeah, yeah. So it did simplify certain things, but it made pretty much everything else complicated.

229
00:14:15,400 --> 00:14:22,680
And then I think I figured out, there was an aha moment when I did resource, because trying to

230
00:14:22,680 --> 00:14:32,840
load, it created a unique problem where you want to load bytes, but you can't fetch them because

231
00:14:32,840 --> 00:14:39,640
the napplet doesn't have any access to the network. And you have to stream the bytes over the bus.

232
00:14:40,360 --> 00:14:47,000
And then I'm like, okay, so how do I do YouTube videos? How do I do streams? And then it clicked

233
00:14:47,000 --> 00:14:52,680
because this is the same problem that operating systems face, and they have a media API. And so

234
00:14:52,680 --> 00:15:00,120
I just basically copied Linux, and it worked pretty much first try. And when that happened,

235
00:15:00,120 --> 00:15:05,080
I just realized I didn't have to reinvent anything. You just have to rebuild an operating

236
00:15:05,080 --> 00:15:10,360
system in a browser window, basically. Sure, yeah. And you didn't even see all of it.

237
00:15:15,800 --> 00:15:20,840
So walk me through what happens if you use the example before uploading something to a Blossom

238
00:15:20,840 --> 00:15:26,840
server. Let's say we have a napplet, very simple drag and drop upload to the user's Blossom servers,

239
00:15:26,840 --> 00:15:34,200
and then let's do the same for download. What happens on the napplet shell level,

240
00:15:34,200 --> 00:15:40,040
like on the container level? So the napplet would just, you'd probably have a drop zone.

241
00:15:40,840 --> 00:15:50,680
Maybe it would be have a listener for paste and an upload button, obviously. You'd upload the image,

242
00:15:50,760 --> 00:15:57,720
it would be in memory. You showed that today, by the way, right? You right-click copied an image,

243
00:15:57,720 --> 00:16:03,320
and you went to another napplet, and then you just pasted it, and it did an upload. So the paste

244
00:16:03,880 --> 00:16:11,400
will, of course, drop the bytes, stream the bytes into the thing. And how does it work? How does it

245
00:16:11,400 --> 00:16:16,040
figure out which Blossom server to upload and all those kinds of things? Absolutely. So it actually,

246
00:16:16,040 --> 00:16:23,320
the interface is just upload. And then the runtime is what decides what that means. And the

247
00:16:23,320 --> 00:16:29,240
runtime's target market also decides what that means. So you could have a runtime that supports,

248
00:16:29,240 --> 00:16:37,880
say, Blossom, Hashtree, let's say IPFS, just for fun. And maybe, like, let's just even say Google

249
00:16:37,880 --> 00:16:43,640
Drive. I would never do it, but you could, right? And the user has none configured, and they

250
00:16:46,040 --> 00:16:51,240
initiate an upload. The runtime detects, hey, I support these things, but none of them are

251
00:16:51,240 --> 00:16:57,080
configured. You do not have a server list for Blossom. It would then prompt them to configure

252
00:16:57,080 --> 00:17:03,160
it. If they did have one of them already configured, if they had one, maybe it would just

253
00:17:03,160 --> 00:17:08,120
automatically upload it to that source. Or if they had maybe two configured, it would ask if they

254
00:17:08,120 --> 00:17:16,840
wanted to upload to one or the other or both. Now on read, you would just pass the Blossom hash

255
00:17:16,840 --> 00:17:21,480
or whatever the resource is. So the resource, because the runtime's mediating everything,

256
00:17:21,480 --> 00:17:25,720
it knows where it's uploading. And so when you pass a resource, it knows where to look.

257
00:17:25,720 --> 00:17:31,560
Yeah. Because the runtime is mediating everything. There are obviously some gaps here.

258
00:17:32,680 --> 00:17:37,560
So for example, if you have notes on Nostr that are IPFS and the runtime doesn't support IPFS,

259
00:17:37,560 --> 00:17:44,200
then it won't work, right? There's all sorts of gaps like that. And there is ways to deal with

260
00:17:44,200 --> 00:17:49,400
that. You could just detect that in the NAPLIT, like when a resource isn't returned, you could

261
00:17:49,400 --> 00:17:56,280
do something so that it's not a bad user experience. But yeah, that's a pretty straightforward

262
00:17:57,400 --> 00:18:03,800
solution. And in terms of signing events and all those kinds of things, how does it work?

263
00:18:04,600 --> 00:18:09,960
What kind of interface do you have and how does the app itself that contains

264
00:18:10,760 --> 00:18:13,720
the applet kind of- The host.

265
00:18:13,720 --> 00:18:15,160
Yeah. The host.

266
00:18:15,160 --> 00:18:17,800
You could call it a host application. People resonate with that.

267
00:18:17,800 --> 00:18:24,040
And just to maybe mention that, you mentioned Amethyst already supports

268
00:18:24,920 --> 00:18:32,360
an earlier version. And Nostr will also support it. And so this is already working right now. And

269
00:18:32,360 --> 00:18:39,560
then you have a little applet thing, whatever, in your Nostr client, in your Nostr environment.

270
00:18:40,200 --> 00:18:46,840
And the signing, and like you said, what is my Blossom server list, for example, this is all

271
00:18:47,400 --> 00:18:55,240
handled by the host application. And so how does this get triggered and passed on? And let's say,

272
00:18:55,240 --> 00:18:59,160
you just want to post an event or even for a Blossom upload, you have to sign something.

273
00:18:59,960 --> 00:19:00,680
What happens there?

274
00:19:01,240 --> 00:19:07,240
So the signature always occurs in, by the shell. So beyond the shell, we could call it,

275
00:19:07,240 --> 00:19:13,000
we'll just use the word host. I prefer runtime for technical reasons, but I think host makes

276
00:19:13,000 --> 00:19:18,280
the most sense for people who are being introduced to it. So the host application for the applets

277
00:19:19,560 --> 00:19:26,920
is responsible for all encryption, decryption, and over the shell is always clear text.

278
00:19:27,720 --> 00:19:33,880
So if it receives encrypted text over the shell, it must reject it. That's part of the rule.

279
00:19:36,920 --> 00:19:40,200
If you're publishing, you're doing a publish, or you can do publish encrypted.

280
00:19:41,800 --> 00:19:44,200
And if you're decrypting, you can just do decrypt.

281
00:19:45,640 --> 00:19:49,160
Explain that some more with the one rule you just mentioned, that over the shell,

282
00:19:49,160 --> 00:19:51,640
it's always plain text. I don't think I understand.

283
00:19:51,640 --> 00:19:59,800
So there's a number of attacks that you can do because in order for this to work,

284
00:20:00,320 --> 00:20:07,040
Napplets have to be safe to use even when they're malicious. So like the user can't

285
00:20:07,600 --> 00:20:11,600
have to second guess the napplet, otherwise it will never work.

286
00:20:14,800 --> 00:20:20,080
There's a number of side channel attacks. So for example, you can do a sort of storage of

287
00:20:20,080 --> 00:20:27,920
decrypted data, or sorry, encrypted data. And then you can also do like heuristics in the napplet

288
00:20:27,920 --> 00:20:35,600
and store stuff in storage scopes, and then send it in an encrypted message back to yourself as the

289
00:20:35,600 --> 00:20:41,360
napplet author. So everything is required to be plain text over the message bus. Okay, okay.

290
00:20:41,360 --> 00:20:48,080
Yeah, that way the runtime can tell the user what the napplet is doing, it can log it appropriately.

291
00:20:48,080 --> 00:20:53,200
Yeah, and you as the user can be sure, have a reasonable assurance that no funny business is

292
00:20:53,200 --> 00:20:59,520
going on, right? You can inspect everything that goes back and forth. Exactly. Yeah, I see. Okay.

293
00:20:59,520 --> 00:21:05,680
And the runtime cannot protect the user from something it doesn't know about. So that's

294
00:21:05,680 --> 00:21:11,680
really important. Yeah. Yeah. Okay. Okay. I see. I see. Yeah. Fancy stuff. So there's

295
00:21:11,680 --> 00:21:16,960
quite a bit of thought. Yeah, quite a bit of thought went into that. Oh, yeah. A lot of testing.

296
00:21:16,960 --> 00:21:23,520
How did you how did you build it out in terms of, you know, like, you have quite a sophisticated

297
00:21:24,400 --> 00:21:28,000
development setup, and those kind of things and some ideas around how to

298
00:21:28,720 --> 00:21:37,280
use agents properly? Like, what did you use to build out? Yeah, the whole applet engine and everything.

299
00:21:39,760 --> 00:21:46,080
I think both. Well, they I went through phases. And I may have done a rewrite, I did a rewrite on

300
00:21:46,080 --> 00:21:54,560
NAPLIT on the NAPLIT dev tooling. And when I read did the rewrite, I use GSD. And same with KEDO,

301
00:21:54,560 --> 00:22:01,360
which is the runtime packages. So GSD is gadget done? Yeah, or it was they they had to rebrand.

302
00:22:01,360 --> 00:22:05,280
Yeah, let's let's stick with let's get it. Yeah, good name.

303
00:22:07,680 --> 00:22:13,440
And KEDO you mentioned? Yeah, it's like, it's so the name, it's actually Finnish. And there's

304
00:22:13,440 --> 00:22:18,800
actually no real reason for that. I was just looking for five letter words that hadn't been

305
00:22:18,800 --> 00:22:24,160
used on any project. Okay, and it was the only one that when translated made sense. It's Finnish for

306
00:22:24,160 --> 00:22:29,920
crib, or cradle. Okay, which kind of made sense, because it's sort of, you know, cradles NAPLIT.

307
00:22:31,200 --> 00:22:38,960
Yeah, protects the I guess the users the baby. Yeah. Yeah. And then the development runtime

308
00:22:38,960 --> 00:22:42,880
is Paja, which I just learned how to pronounce it today from my roommate.

309
00:22:44,880 --> 00:22:49,360
And that is workbench. Okay. And finish as well.

310
00:22:51,840 --> 00:22:58,960
That is can be used to build runtimes. So that includes a shell, an ACL,

311
00:23:00,560 --> 00:23:03,840
a firewall, which really only behaves like a rate limiter right now,

312
00:23:04,560 --> 00:23:12,560
to relieve pressure from the runtime. It includes services, stubs for services like notifications,

313
00:23:13,920 --> 00:23:19,920
relay pools, storage, KB storage, media handler,

314
00:23:22,480 --> 00:23:30,000
and a few other things. The NAPLIT dev tooling is about conformance. It has the shim,

315
00:23:30,640 --> 00:23:33,520
which might actually be moved to Keto because it's injected by Keto.

316
00:23:37,360 --> 00:23:46,480
It includes a SDK, some types, a boilerplate and skills and a few others.

317
00:23:48,640 --> 00:23:55,840
These are pretty tightly like the architecture of these was pretty heavily considered because

318
00:23:56,720 --> 00:24:01,600
they, first of all, there's no dependencies in any of them.

319
00:24:03,680 --> 00:24:08,960
They're lightweight by using them. No dependencies on any other NOS stuff,

320
00:24:08,960 --> 00:24:14,720
or what do you mean by no dependencies? Like it's vanilla JavaScript, except for maybe like

321
00:24:14,720 --> 00:24:22,320
the skills and the dev tooling, like the bundlers and stuff. But other than that, it is

322
00:24:22,880 --> 00:24:30,240
the without dependencies. Yeah, they're celebrating the launch of many, many NAPLITs today.

323
00:24:32,720 --> 00:24:38,720
Okay, that's quite something. No dependencies. Like that's a very pure approach. Well, it's

324
00:24:38,720 --> 00:24:45,600
intentional too. It's because... Was it security considerations? Yeah, it was. Okay.

325
00:24:45,600 --> 00:24:52,240
Yeah, it was. And also just simplicity of maintenance, because you don't need these

326
00:24:52,240 --> 00:24:58,240
packages. I mean, there's a protocol, right? So you could build all of this without any of the

327
00:24:58,240 --> 00:25:04,160
packages for sure. It would be really hard to sell anyone on it in 2026, but yeah, you could

328
00:25:04,160 --> 00:25:10,000
do it without any of the packages and create a runtime and NAPLITs without using my packages.

329
00:25:10,000 --> 00:25:16,080
Yeah, yeah. I see. I see. One of the interesting things about it is NAPLITs are single file.

330
00:25:16,640 --> 00:25:24,640
So every NAPLIT is one file. And an NAPLIT is an application that does one thing really well

331
00:25:24,640 --> 00:25:28,800
and is served by a host application as opposed to being like a standalone application.

332
00:25:29,760 --> 00:25:32,960
And by making it a single file, you sort of implicitly

333
00:25:34,480 --> 00:25:38,240
force people to sort of conform to that philosophy. Yeah, yeah, yeah. It has to be

334
00:25:38,240 --> 00:25:45,840
small. Yeah, yeah. It's quite interesting also to look at, because

335
00:25:48,160 --> 00:25:57,040
widgets were a big thing in a different era, like also operating OS level widgets,

336
00:25:57,040 --> 00:26:01,920
both on any operating system, basically. Like on the Linux side, on the Windows side,

337
00:26:01,920 --> 00:26:06,000
it was a big thing where just you have your desktop and you have all these widgets that

338
00:26:06,000 --> 00:26:14,080
you can compose and so on. And even in the early kind of Web 2.0 days, there were also

339
00:26:14,080 --> 00:26:20,720
some landing pages that were insanely widget heavy. And so it's kind of cool and kind of

340
00:26:20,720 --> 00:26:29,680
interesting to see this emerge on Nostr. And before we go deeper into the basically

341
00:26:29,680 --> 00:26:36,960
operating system you've built for it, you mentioned also that there are some

342
00:26:36,960 --> 00:26:41,200
competing projects or projects that had the same idea. Fiat Jeff had one of them.

343
00:26:41,200 --> 00:26:47,040
Yeah. Like talk me through the other projects that kind of try to do this.

344
00:26:47,920 --> 00:26:52,640
Some of them are still going. Yeah, yeah, yeah. Yeah, but just it's kind of as a comparison and

345
00:26:52,640 --> 00:26:58,640
just that, you know, like not everyone knows all this stuff. And as you know,

346
00:27:01,120 --> 00:27:06,960
philosophically, I was always a big believer and a fan of HyperNode, what Paul came up with.

347
00:27:06,960 --> 00:27:14,000
Oh, yeah. And it's kind of, it's very similar in style in some sense. Very different execution,

348
00:27:14,000 --> 00:27:21,680
very different execution, but very similar, like spiritually. So talk me through kind of the other

349
00:27:21,680 --> 00:27:26,960
projects that have been trying to do similar things. So I think if I do it in order, I guess

350
00:27:26,960 --> 00:27:32,480
it would be Fiat Jeff, which I really don't know much about. He started it before the whole Jax

351
00:27:32,480 --> 00:27:39,200
wave things in late 2022. Right. So I've only been working on Nostr. Ancient, ancient idea.

352
00:27:39,200 --> 00:27:44,880
Yes, ancient idea. And I think probably too early, you know, for that kind of idea. But clearly this

353
00:27:44,880 --> 00:27:51,360
was in his head. The next one that I'm aware of, because there could be others, that didn't

354
00:27:51,360 --> 00:27:58,400
Yaki Hone have something like a view or something? Potentially. Yes, they had some. I'm not a Yaki

355
00:27:58,400 --> 00:28:03,040
Hone user, so I don't know. Yeah, but I believe they had something similar, but it was very,

356
00:28:04,000 --> 00:28:11,760
it's very simple, which isn't a bad thing. And then I believe Soapbox has Tiles,

357
00:28:12,720 --> 00:28:16,400
which is slightly different. It's made for native. It's Lua based, which is cool.

358
00:28:16,960 --> 00:28:23,760
I've been talking to that guy a lot, and that's a really cool project. Balazs and Fiat Jeff have

359
00:28:23,760 --> 00:28:30,080
been, my project's a little bit inspired Fiat Jeff to revisit his original idea.

360
00:28:31,440 --> 00:28:36,080
So he's working with Balazs, who is, they're working on Nostr apps or Naps.

361
00:28:36,960 --> 00:28:43,440
So that's called Nostr apps, the project. Okay. Because I have to look it up later and link to it.

362
00:28:43,440 --> 00:28:48,240
That one is good. It reminds me, if I look at the commit history,

363
00:28:48,960 --> 00:28:55,440
it basically looks like my thinking from about a year ago. So, yeah, they're kind of solving

364
00:28:55,440 --> 00:28:58,800
problems in a similar order, and maybe they'll come to a different conclusion.

365
00:29:00,320 --> 00:29:04,640
That would be interesting. There's a lot of unique problems to solve, you know.

366
00:29:05,600 --> 00:29:09,440
Like, you used the operating system briefly. It was pretty fast, right?

367
00:29:10,720 --> 00:29:17,600
Yeah, it's fast. It was surprisingly fast and also surprisingly intuitive. And yeah,

368
00:29:17,600 --> 00:29:21,440
it also looks very good. Like, I like that style of window management.

369
00:29:21,440 --> 00:29:23,280
Yeah, me too. And doing things, so.

370
00:29:24,800 --> 00:29:29,920
So a lot of that is because of how it's designed. It's the security posture.

371
00:29:30,160 --> 00:29:36,400
Because of how it's designed. It's the security posture. It's the fact that they don't have web

372
00:29:36,400 --> 00:29:45,360
APIs. And it's also that, you know, the main thread is kept, really, it's solely reserved

373
00:29:45,360 --> 00:29:51,440
for rendering the DOM in the parent frame and routing messages. Pretty much everything else

374
00:29:51,440 --> 00:29:53,280
occurs in Web Workers. I see.

375
00:29:54,880 --> 00:29:59,760
And without that, CSP...

376
00:30:00,000 --> 00:30:04,640
and sandboxing iframes. It's pretty much impossible to do that. You could just

377
00:30:04,640 --> 00:30:10,720
have a napplet start calling every relay on Nostr and then no other napplet

378
00:30:10,720 --> 00:30:15,640
works and then the parent frame crashes. I see. Right, and there's no way for

379
00:30:15,640 --> 00:30:21,800
the there's no way for the parent frame to regulate the pressure of each napplet

380
00:30:21,800 --> 00:30:27,600
and control it. So that's the primary difference between some of the

381
00:30:27,600 --> 00:30:33,280
other existing projects and napplets as it is right now. Maybe that will

382
00:30:33,280 --> 00:30:38,560
change. But that's the actually the only difference right now between Nostr apps

383
00:30:38,560 --> 00:30:42,960
and napplets. Okay. They have different APIs and they have a different

384
00:30:42,960 --> 00:30:50,640
philosophy as well. What made you choose the browser as an environment to build

385
00:30:50,640 --> 00:30:56,240
all that stuff out as opposed to just doing a native desktop app or whatever?

386
00:30:56,320 --> 00:31:02,560
Because as you mentioned, the napplet system is a protocol specification like

387
00:31:02,560 --> 00:31:06,160
there's no need to do all this in the browser. You can write native code,

388
00:31:06,160 --> 00:31:14,480
whatever, like you can use Swift and build an applet browser for iOS

389
00:31:14,480 --> 00:31:18,960
and just do everything natively. So what made you do it in the

390
00:31:18,960 --> 00:31:22,920
browser? Because the OS you showed off just works in the browser.

391
00:31:23,120 --> 00:31:28,120
Yeah, which I think it's awesome. It's like it felt kind of magical to use it.

392
00:31:28,120 --> 00:31:33,640
If you go full screen you wouldn't even notice. Exactly, exactly. So a few reasons.

393
00:31:33,640 --> 00:31:41,520
So the first one is practical and also more like release strategy. The user

394
00:31:41,520 --> 00:31:46,320
doesn't have to install anything. So you can give someone a link and they can use

395
00:31:46,320 --> 00:31:51,200
it in seconds. They don't have to, like even anonymous user, the

396
00:31:51,200 --> 00:31:55,080
onboarding could include just an anonymous user. You browse as Jack and

397
00:31:55,080 --> 00:32:00,680
you're in. And just to give people an idea, that might be a good, like a lot of

398
00:32:00,680 --> 00:32:06,440
people maybe know the Synology interface for Synology NAS devices and they

399
00:32:06,440 --> 00:32:11,560
basically have their own OS, their own window manager and so on and it all runs

400
00:32:11,560 --> 00:32:14,840
in the browser as well and you can, you know, drag your windows around and just,

401
00:32:14,840 --> 00:32:17,840
you know, like right-click on stuff and the context window will pop up and so on.

402
00:32:17,880 --> 00:32:23,880
And so very similar to what you've built and from the kind of just to get

403
00:32:23,880 --> 00:32:28,600
people, to give people an idea of like what it looks. Yeah, how it looks and

404
00:32:28,600 --> 00:32:35,480
feels basically. Yeah, exactly. So the other reason too is that it's sort of

405
00:32:35,480 --> 00:32:41,200
permissionless because the runtime doesn't have any gateways like

406
00:32:41,200 --> 00:32:45,680
Insight. It resolves, the runtime resolves everything and does all the

407
00:32:45,680 --> 00:32:51,480
blob hash validation and so everything... Oh, that's an interesting thing that I

408
00:32:51,480 --> 00:32:56,640
didn't think about yet. Okay. It can be deployed as an Insight. Yeah, yeah, yeah.

409
00:32:56,640 --> 00:33:01,000
The shell basically runs locally and the bits and pieces are collected from

410
00:33:01,000 --> 00:33:04,920
whatever, like Relays, Plasma Servers, IPFS, Torrent, whatever. Exactly.

411
00:33:04,920 --> 00:33:09,400
That's very interesting, yeah. And so that... You don't need an initial

412
00:33:09,400 --> 00:33:14,840
delivery in some sense. Yeah. Okay, yeah, yeah. And I see it, so it's not the

413
00:33:14,840 --> 00:33:19,160
furthest edge, like I guess the furthest edge would be some microcontroller or

414
00:33:19,160 --> 00:33:24,920
something with like a screen and like... Yeah, sure. I mean, it literally acts like an

415
00:33:24,920 --> 00:33:28,240
operating system. Yeah. And you can boot it up and if you're, if let's say you're

416
00:33:28,240 --> 00:33:31,520
offline and it's just empty, you just can't get stuff from outside, but it still

417
00:33:31,520 --> 00:33:36,360
works. Exactly. That's how it's, yeah. Yeah, that's how it's... Yeah, interesting. Yeah, yeah,

418
00:33:36,760 --> 00:33:54,080
that's a beautiful bug. Yeah, that's very old bugs. No, no need to fix this one. So

419
00:33:54,080 --> 00:33:59,040
like, like it also sort of proves something. So it's on an edge that you

420
00:33:59,040 --> 00:34:04,480
think this wouldn't work in. So if it can work on this edge and then you, you push

421
00:34:04,520 --> 00:34:07,760
it all the way to another edge and you can get it, the protocol to work on that

422
00:34:07,760 --> 00:34:11,880
edge, that's not web, then theoretically it should work everywhere in between.

423
00:34:11,880 --> 00:34:16,880
Right? Okay. So yeah, the idea, the thinking was I do it in the browser, which

424
00:34:16,880 --> 00:34:22,560
should be impossible. Then the next logical step is a browser or a native

425
00:34:22,560 --> 00:34:28,520
app. Now, next logical step is a native app, then a browser, then an operating

426
00:34:28,520 --> 00:34:33,760
system. And then like... By browser you mean an applet explorer. Let's walk up here.

427
00:34:33,920 --> 00:34:38,800
We will be a little bit, you know, sweating and puffing and puffing, but

428
00:34:38,800 --> 00:34:46,560
it's worth it. It's a good, good spot. The next step after that would probably be

429
00:34:46,560 --> 00:34:52,760
like a custom kernel, like a microkernel, like a cyberdeck type thing, which is

430
00:34:52,760 --> 00:34:58,720
really where we should be heading. A lot of the hardware is, you know, very well

431
00:34:59,240 --> 00:35:05,280
guarded by, by the people who own them and like produce these. The hardware we

432
00:35:05,280 --> 00:35:20,560
take for granted every day. So by... Oh, yeah. So I produced a RISC-V

433
00:35:20,560 --> 00:35:25,880
microkernel that implemented some of the basic interfaces of NIP 5e.

434
00:35:25,880 --> 00:35:31,480
I didn't realize that was an applet related. I felt it was a completely

435
00:35:31,480 --> 00:35:36,360
different project. And I just implemented it to see if there was any like hiccups

436
00:35:36,360 --> 00:35:41,640
in something, a completely different environment. The harder ones like

437
00:35:41,640 --> 00:35:53,800
resource, outbox, and I implemented KB storage and one other one that's not

438
00:35:53,800 --> 00:35:58,280
coming to me right now. And I was able to get that working with the 2e that was

439
00:35:58,280 --> 00:36:06,600
in a moderately sandboxed environment. And once I could see that working, in

440
00:36:06,600 --> 00:36:12,680
theory, I went full force on the website just to get it to the public. Yeah, I see,

441
00:36:12,680 --> 00:36:19,760
I see. Yeah, no, it looks, it looks, it looks and feels really, really well. And

442
00:36:19,760 --> 00:36:28,400
yeah, it was kind of magical to see all the, like, I don't know, the hit rate was

443
00:36:28,400 --> 00:36:35,680
probably two-thirds or so of the cohort managed to create an applet. More. Oh, the

444
00:36:35,680 --> 00:36:39,440
whole cohort, yeah, two-thirds. Of the people that were at the workshop, it was

445
00:36:39,440 --> 00:36:45,200
probably like 80%. And you could just load these applets in your OS and it

446
00:36:45,200 --> 00:36:48,400
would just pop up and would just work. You could load it in a strudel, it would

447
00:36:48,400 --> 00:36:55,840
work. Yeah. Paya, it might work. There was a bug there. Amethyst. Yeah, Amethyst.

448
00:36:55,840 --> 00:36:59,600
So, yeah, I still, I still don't really know how to load them properly or how to

449
00:36:59,600 --> 00:37:04,480
view them all. But, you know, we had, we had some successes. Yeah, there were some.

450
00:37:04,480 --> 00:37:11,600
The more simple ones loaded. He hasn't chased the spec. I don't blame him. Yeah,

451
00:37:11,600 --> 00:37:16,640
you mentioned it's still evolving, right? Yeah, exactly. I'll probably have to open

452
00:37:16,640 --> 00:37:23,760
some PRs. Or it would even be better if someone from the co-work, you know, from

453
00:37:23,760 --> 00:37:30,880
the cohort opened an issue and everyone else put some thumbs up on it. We can

454
00:37:30,880 --> 00:37:34,560
do those Amethysts, no problem. Yeah.

455
00:37:36,080 --> 00:37:41,280
All right, that's the turnaround point.

456
00:37:41,600 --> 00:37:44,720
It's nice though, right? You've been here before, right? Yeah, yeah, I believe so.

457
00:37:44,880 --> 00:37:55,920
It looks familiar. My explicit goal, you see the dancing lights up there, the green and blue

458
00:37:55,920 --> 00:38:00,000
lights, there seems to be a party. That's a really nice house with like a glass,

459
00:38:02,320 --> 00:38:07,360
like glass window front. And it's right on top of the cliff and it goes straight down.

460
00:38:07,360 --> 00:38:12,720
Oh, that's beautiful. My goal in Madeira is to get to know the guy and just, you know,

461
00:38:12,720 --> 00:38:19,600
have coffee there and look down. That's one of my goals, why I'm here. I want to know who owns

462
00:38:19,600 --> 00:38:27,520
this place and just come swing by for a coffee. Look straight down like 300 meters or something,

463
00:38:27,520 --> 00:38:32,960
like it's an insane cliff. And the building goes like right over the cliff. Like it's literally,

464
00:38:32,960 --> 00:38:38,160
if you're in front of the glass, like it will feel like you're floating. Is it like that bar

465
00:38:38,160 --> 00:38:45,200
at Ponte de Sol? Oh, I don't think so. Yeah, there's like a bar and it's right over the cliff

466
00:38:45,200 --> 00:38:50,800
when you come into the city and then you turn right before you hit this tunnel. There's this

467
00:38:50,800 --> 00:38:57,360
bar on the cliff. All right, I'll have to check that out. Yeah, it's really pretty. Yeah, that's

468
00:38:57,360 --> 00:39:06,240
good. Yeah, good place, good place. All right, so we have the, or you have the basically OS in the

469
00:39:06,240 --> 00:39:12,640
browser. Yeah. In pretty good shape, I would say. What's still missing? Like what are the

470
00:39:12,640 --> 00:39:17,520
bits and pieces that you still want to implement? You know, some polish, the onboarding.

471
00:39:19,280 --> 00:39:25,200
There's still some bugs. You mentioned notifications that you mentioned. Notifications

472
00:39:25,200 --> 00:39:29,760
are not done. Inter applet communication. Tell me a little bit about that. Like,

473
00:39:29,760 --> 00:39:34,720
how are you thinking about like one applet spawning an action or spawning something in

474
00:39:34,720 --> 00:39:42,960
another app? It's a scheme. So it's like NAPLIT colon archetype slash intent parameters. So that's

475
00:39:42,960 --> 00:39:49,040
similar to like you open a deep link and an app pops up on Android or iOS and it does like,

476
00:39:49,040 --> 00:39:53,040
I don't know, like everyone kind of knows this. If you, I don't know, like you have a video or

477
00:39:53,040 --> 00:39:58,000
whatever and you go like share as a new post on Amethyst and then it will pop up and do the thing

478
00:39:58,000 --> 00:39:59,760
and so on. So similar idea. Yeah.

479
00:40:00,000 --> 00:40:05,600
And this is how the intents and all those kind of things, this is how this works as well.

480
00:40:05,600 --> 00:40:10,040
Because I found that the semantics of data alone is really hard.

481
00:40:10,040 --> 00:40:16,560
Let's go the other way, then we have a little bit of a loop going, we don't go the same

482
00:40:16,560 --> 00:40:20,200
direction, I'm just saying, switch a route.

483
00:40:20,200 --> 00:40:23,240
Alright so polish, and then you mentioned the next step would be...

484
00:40:23,240 --> 00:40:24,920
So the insert and applet communication, right.

485
00:40:24,920 --> 00:40:25,920
Oh yeah, sorry.

486
00:40:25,920 --> 00:40:26,920
It's very late, and that was a long day.

487
00:40:26,920 --> 00:40:34,080
I got to keep you on track.

488
00:40:34,080 --> 00:40:40,560
So yes, it's similar to Android and many operating systems, the semantics of the data were too

489
00:40:40,560 --> 00:40:45,420
constraining.

490
00:40:45,420 --> 00:40:49,200
So the way they're defined, so this is very experimental, this could very well not work

491
00:40:49,200 --> 00:40:51,440
at all.

492
00:40:51,440 --> 00:40:56,080
But the way we're thinking of it is that if you're going to open a profile, you're probably

493
00:40:56,240 --> 00:41:02,080
going to pass an npub or an mprofile, and we don't think that the developer that makes

494
00:41:02,080 --> 00:41:07,760
the app that talks to profile needs any specification to do that.

495
00:41:07,760 --> 00:41:14,080
We are kind of betting that people can sort of figure it out, because it's implicit, it's

496
00:41:14,080 --> 00:41:20,240
like, what else are you going to pass to a profile intent, or archetype, right?

497
00:41:20,240 --> 00:41:27,920
If it's like profile slash open, then you're going to be passing an npub, an mprofile,

498
00:41:27,920 --> 00:41:31,160
maybe a hex, if you're mean.

499
00:41:31,160 --> 00:41:32,160
Maybe an info5.

500
00:41:32,160 --> 00:41:33,160
Yeah.

501
00:41:33,160 --> 00:41:35,480
And, yeah, exactly.

502
00:41:35,480 --> 00:41:42,000
And we're going to specify this in a repo somewhere, I really don't think so, and there's

503
00:41:42,000 --> 00:41:47,720
probably, if this is successful, there will be hundreds of thousands of potential like

504
00:41:47,720 --> 00:41:51,320
wire formats.

505
00:41:51,320 --> 00:41:56,080
And we think we're going to try to figure that out later, because that is way too much

506
00:41:56,080 --> 00:42:02,080
overhead at this point, to try to design some system to manage these messages that we don't

507
00:42:02,080 --> 00:42:03,720
even know if this will exist.

508
00:42:03,720 --> 00:42:07,540
So right now they're ad hoc.

509
00:42:07,540 --> 00:42:13,600
So far it's working, Balazs made a profile in Applet today, and it worked.

510
00:42:13,600 --> 00:42:14,600
It opened.

511
00:42:14,600 --> 00:42:15,600
Yeah.

512
00:42:15,600 --> 00:42:16,600
The feed, I believe.

513
00:42:16,680 --> 00:42:17,680
Yeah.

514
00:42:17,680 --> 00:42:23,600
I think at the point where we're at, the most important thing kind of is, can your agent

515
00:42:23,600 --> 00:42:24,840
make sense of it?

516
00:42:24,840 --> 00:42:29,680
It's less than, like, is everything perfectly specified, or whatever, like for humans?

517
00:42:29,680 --> 00:42:34,040
It's just like, is it in the state so that it makes sense to the LLM?

518
00:42:34,040 --> 00:42:35,760
Yeah, exactly.

519
00:42:35,760 --> 00:42:41,400
And then also there's something magical about two developers being in two different locations,

520
00:42:41,400 --> 00:42:45,880
never talking, and just sort of being like, hey, we agree, it works.

521
00:42:45,880 --> 00:42:49,560
Or like developer A just figuring it out, like he's using developer B's Applet, and

522
00:42:49,560 --> 00:42:52,200
he's like, how do I talk to this, figures it out.

523
00:42:52,200 --> 00:42:53,440
And then he's just like, I'm going to use that.

524
00:42:53,440 --> 00:42:54,440
That makes sense.

525
00:42:54,440 --> 00:42:55,440
Yeah.

526
00:42:55,440 --> 00:42:57,080
I don't think we need to specify everything.

527
00:42:57,080 --> 00:43:04,320
Yeah, I think in the LLM world, in the agent world, over-specification is sometimes a burden.

528
00:43:04,320 --> 00:43:12,640
So under-specifying oftentimes just works better, and they'll figure it out.

529
00:43:12,640 --> 00:43:13,640
Yeah.

530
00:43:13,640 --> 00:43:14,640
Okay.

531
00:43:14,640 --> 00:43:15,640
So, no.

532
00:43:15,640 --> 00:43:16,640
Oh, yeah, that's cool.

533
00:43:16,640 --> 00:43:17,640
So that's next as well, right?

534
00:43:17,640 --> 00:43:25,760
Like you said, you're still working on that, and the inter-Applet communication isn't where

535
00:43:25,760 --> 00:43:26,760
it needs to be yet.

536
00:43:26,760 --> 00:43:27,760
No.

537
00:43:27,760 --> 00:43:28,760
Okay.

538
00:43:28,760 --> 00:43:29,760
No, it's experimental.

539
00:43:29,760 --> 00:43:30,760
We'll see what happens.

540
00:43:30,760 --> 00:43:42,280
But you mentioned probably a desktop shell, and yeah, after that, the more esoteric things

541
00:43:42,280 --> 00:43:46,080
that you just went through before.

542
00:43:46,080 --> 00:43:48,880
So how can we best help?

543
00:43:48,880 --> 00:43:55,280
If someone is excited about this, what's the best way to contribute and test it out and

544
00:43:55,280 --> 00:43:57,000
help you move things along?

545
00:43:57,240 --> 00:44:04,040
Well, I mean, the dev tooling needs polish, needs work.

546
00:44:04,040 --> 00:44:09,320
Use cases need to be explored, and questions need to be asked and answered.

547
00:44:09,320 --> 00:44:16,780
There is a danger in that, though, because it is a little bit jarring for most Nostr

548
00:44:16,780 --> 00:44:24,920
developers to understand where the boundary of the shell, like the seam between the shell

549
00:44:25,040 --> 00:44:26,760
and the Napplet is.

550
00:44:26,760 --> 00:44:28,120
And so there's this tendency...

551
00:44:28,120 --> 00:44:30,680
So it might be better if you're coming fresh?

552
00:44:30,680 --> 00:44:32,920
A little bit, yeah.

553
00:44:32,920 --> 00:44:38,360
So like a Nostr developer or anyone with a client can implement a runtime like right

554
00:44:38,360 --> 00:44:39,360
now.

555
00:44:39,360 --> 00:44:44,000
It's just a translation layer between the shell and their existing business logic.

556
00:44:44,000 --> 00:44:47,000
How long did it take Hazard to implement the shell in Nostr?

557
00:44:47,000 --> 00:44:53,640
I think it was working really fast, like kind of working in a few hours to a day.

558
00:44:53,840 --> 00:45:00,320
I think he still has work to do on it, but it doesn't have that many capabilities yet.

559
00:45:00,320 --> 00:45:03,280
But I think it was like two days or three days until stable, but I don't want to speak

560
00:45:03,280 --> 00:45:04,280
for him.

561
00:45:04,280 --> 00:45:05,280
Yeah, yeah.

562
00:45:05,280 --> 00:45:06,280
No, but that's awesome.

563
00:45:06,280 --> 00:45:07,280
At least it's not weeks, you know?

564
00:45:07,280 --> 00:45:09,800
No, I think Vitor did it in like a day.

565
00:45:09,800 --> 00:45:10,800
Yeah.

566
00:45:10,800 --> 00:45:11,800
Yeah.

567
00:45:11,800 --> 00:45:16,960
But he also had a very limited subset of capabilities.

568
00:45:16,960 --> 00:45:23,480
Any developer can make Napplets because they have very little Nostr domain knowledge requirements.

569
00:45:24,320 --> 00:45:27,360
You don't need to, like, they don't need to think about anything.

570
00:45:27,360 --> 00:45:32,320
You don't need to like deeply understand how Nostr works and need to know all the kinds

571
00:45:32,320 --> 00:45:37,840
and need to know all the, you know, intricate details of how the WebSocket connections work

572
00:45:37,840 --> 00:45:39,280
and like all this kind of stuff, right?

573
00:45:39,280 --> 00:45:40,440
Like that's the main benefit.

574
00:45:40,440 --> 00:45:44,400
You can just, you can just do stuff more easily.

575
00:45:44,400 --> 00:45:46,240
You can just build things.

576
00:45:46,240 --> 00:45:47,240
Yeah.

577
00:45:47,240 --> 00:45:48,240
Yeah.

578
00:45:48,240 --> 00:45:49,240
That's awesome.

579
00:45:49,240 --> 00:45:51,560
And you leave the security and the optimization to the runtime people.

580
00:45:51,560 --> 00:45:52,560
Awesome.

581
00:45:52,920 --> 00:46:02,560
Another cool opportunity is runtimes because I showed you like a pretty powerful runtime,

582
00:46:02,560 --> 00:46:04,560
but they don't all have to be like that.

583
00:46:04,560 --> 00:46:07,000
And they can be many different things.

584
00:46:07,000 --> 00:46:09,680
So what you're saying is a runtime can be very slim.

585
00:46:09,680 --> 00:46:10,680
Oh, yeah.

586
00:46:10,680 --> 00:46:11,680
And very minimal.

587
00:46:11,680 --> 00:46:14,320
It could also have nothing to do with social.

588
00:46:14,320 --> 00:46:21,560
So I have a game from Sec 1.

589
00:46:21,560 --> 00:46:25,880
It was pubkey land, but I changed it to npubland for obvious reasons.

590
00:46:25,880 --> 00:46:27,160
And that uses Naplitz.

591
00:46:27,160 --> 00:46:28,160
That's a runtime.

592
00:46:28,160 --> 00:46:33,000
And you can use Naplitz as a mod system for the game.

593
00:46:33,000 --> 00:46:34,000
Permissionless.

594
00:46:34,000 --> 00:46:35,000
Huh.

595
00:46:35,000 --> 00:46:36,000
Interesting.

596
00:46:37,000 --> 00:46:43,680
So in that, in that context, you can like place items on the user's land.

597
00:46:43,680 --> 00:46:46,800
And then when they go near it, you know, it pops up a Naplitz.

598
00:46:46,800 --> 00:46:48,800
That can be one of many things.

599
00:46:48,800 --> 00:46:50,480
Okay.

600
00:46:50,480 --> 00:46:53,760
Then there's also global Naplitz.

601
00:46:53,760 --> 00:46:57,560
So you could have like a radio station playing from like your own radio.

602
00:46:57,560 --> 00:46:58,560
Yeah.

603
00:46:58,560 --> 00:46:59,560
Yeah.

604
00:46:59,560 --> 00:47:00,560
That's awesome.

605
00:47:00,560 --> 00:47:01,560
Right.

606
00:47:01,560 --> 00:47:02,560
It's a small, that's like a really small example.

607
00:47:02,560 --> 00:47:06,960
Another thing would be something, nothing related to social at all, or like very loosely

608
00:47:06,960 --> 00:47:11,720
related like music collaboration or video editing collaboration.

609
00:47:11,720 --> 00:47:14,240
That's all possible as well.

610
00:47:14,240 --> 00:47:16,280
You could have plugin systems.

611
00:47:16,280 --> 00:47:22,600
You could use Naplitz as a plugin for that application.

612
00:47:22,600 --> 00:47:28,080
And it doesn't necessarily need to be social, social Naplitz at all.

613
00:47:28,080 --> 00:47:30,200
It could be very limited capabilities.

614
00:47:30,200 --> 00:47:31,200
Yeah.

615
00:47:31,360 --> 00:47:34,080
So you don't need to make use of the social aspect of Nostr.

616
00:47:34,080 --> 00:47:35,080
Yeah.

617
00:47:35,080 --> 00:47:37,280
You can just have the identities for the purpose of like sessions.

618
00:47:37,280 --> 00:47:38,280
Yeah.

619
00:47:38,280 --> 00:47:39,280
Basically.

620
00:47:39,280 --> 00:47:40,280
Yeah.

621
00:47:40,280 --> 00:47:41,280
Yeah.

622
00:47:41,280 --> 00:47:42,280
Yeah.

623
00:47:42,280 --> 00:47:43,280
I see.

624
00:47:43,280 --> 00:47:44,280
I see.

625
00:47:44,280 --> 00:47:48,080
I mean, one of the demos we saw today is the paint Naplint that Hazard I think built, right?

626
00:47:48,080 --> 00:47:49,080
Yeah.

627
00:47:49,080 --> 00:47:50,080
Yeah.

628
00:47:50,080 --> 00:47:51,080
Yeah.

629
00:47:51,080 --> 00:47:57,920
And so you, you literally have like this paint style mini app as a Naplint and like, yeah,

630
00:47:57,920 --> 00:48:01,280
you can just load that everywhere and just do your thing.

631
00:48:01,280 --> 00:48:02,280
Yeah.

632
00:48:02,280 --> 00:48:06,520
You can load that in any client and you know, it can be used for whatever.

633
00:48:06,520 --> 00:48:08,120
Like you could mark up images.

634
00:48:08,120 --> 00:48:09,760
A client can say, okay, cool.

635
00:48:09,760 --> 00:48:14,360
I want, I don't know if it has this capability right now, but you can say, Hey, load the

636
00:48:14,360 --> 00:48:20,080
image into here and then from somewhere else, yeah.

637
00:48:20,080 --> 00:48:22,520
Mark it up and then post it as a comment.

638
00:48:22,520 --> 00:48:26,080
It's a very interesting way of like decomposing.

639
00:48:26,880 --> 00:48:33,160
Let's take Amethyst as the kitchen sink, everything client, like no offense to Vitor, but everyone

640
00:48:33,160 --> 00:48:37,320
knows that it's just like, whatever is out there, Vitor will put into Amethyst.

641
00:48:37,320 --> 00:48:38,320
It's a good thing.

642
00:48:38,320 --> 00:48:39,320
It's a sandbox.

643
00:48:39,320 --> 00:48:40,320
Yeah.

644
00:48:40,320 --> 00:48:41,320
It's fun.

645
00:48:41,320 --> 00:48:49,640
And so kind of with the Naplint line of thinking, it's basically every, almost every feature

646
00:48:49,640 --> 00:48:54,840
of Amethyst or every, every screen in some sense and those kinds of things can be done

647
00:48:54,840 --> 00:49:00,920
as an applet and can then be recomposed in one of the shells.

648
00:49:00,920 --> 00:49:04,880
Like again, like it, it, it looks and feels like an operating system and it just like

649
00:49:04,880 --> 00:49:08,760
pull out these widgets and place them where you want to have them or like arrange them

650
00:49:08,760 --> 00:49:11,440
however you see fit.

651
00:49:11,440 --> 00:49:17,040
And they're very loosely coupled, like the paint application we just mentioned that we

652
00:49:17,040 --> 00:49:18,040
saw today.

653
00:49:18,040 --> 00:49:21,840
Like you paint the picture, whatever, like paint or annotate something and so on.

654
00:49:21,840 --> 00:49:27,040
And then it's literally like right click, copy image, and then you go to your like whatever

655
00:49:27,040 --> 00:49:34,640
send tweet, send post kind of thing or to your long form applet and you just paste it.

656
00:49:34,640 --> 00:49:38,640
And you know, we're back in the good old days where everything was very simple.

657
00:49:38,640 --> 00:49:39,640
So that's really cool.

658
00:49:39,640 --> 00:49:40,640
It's really exciting.

659
00:49:40,640 --> 00:49:43,040
It's fun to see what people come up with.

660
00:49:43,040 --> 00:49:44,600
It's amazing how well it works.

661
00:49:44,600 --> 00:49:49,640
Like I was blown away today how well it works and how fast everything is and kind of, again,

662
00:49:49,640 --> 00:49:55,040
like just deploying, deploying an applet, it's basically you have this one file and

663
00:49:55,040 --> 00:50:00,040
you sign it and you push it to a relay and then it's just out there and you just like

664
00:50:00,000 --> 00:50:05,440
I basically created a mini-app in like five minutes on my machine, pushed it out,

665
00:50:05,440 --> 00:50:10,920
like published it to nowhere. Like you compared it to ZapStore as well,

666
00:50:10,920 --> 00:50:15,080
right? Like with ZapStore as well, where you just push it to your

667
00:50:15,080 --> 00:50:19,960
relays, it's out there, and your operating system basically immediately

668
00:50:19,960 --> 00:50:25,040
saw it, you immediately drag and drop the thing onto your desktop, and it was there.

669
00:50:25,760 --> 00:50:31,000
It's amazing. Yeah, it really is. It was fantastic to see how well it

670
00:50:31,000 --> 00:50:35,600
works and how everything plays together. And how many different napplets

671
00:50:35,600 --> 00:50:40,640
came out, too. Almost everyone produced a napplet. There was a chess game that

672
00:50:40,640 --> 00:50:44,320
works, multiplayer, although you can make, as the player, you can make

673
00:50:44,320 --> 00:50:54,320
both moves. Yeah, Kaviadapter, you know, like, absolutely everything is alpha, including the applets.

674
00:50:54,320 --> 00:51:00,560
Yeah, of course, of course. And it's also nice to see it like go into that exact

675
00:51:00,560 --> 00:51:04,800
same napplet, go into another runtime, and it does the exact same thing. Yeah, yeah,

676
00:51:04,800 --> 00:51:09,960
yeah, really cool, really cool. Yeah, yeah, awesome. And so you got sidetracked by

677
00:51:09,960 --> 00:51:14,840
that, basically, and the whole napplet idea swallowed you whole the last 12

678
00:51:14,840 --> 00:51:19,520
months or so? Well, I wasn't working full-time on it. Yeah, I didn't have

679
00:51:19,520 --> 00:51:28,000
the energy or resources. Because you've been involved in quite some

680
00:51:28,000 --> 00:51:34,480
projects, you know, like lots of stuff on the relay side and those kind of

681
00:51:34,480 --> 00:51:42,040
things. You mentioned you had this idea very early on. Was it helpful to,

682
00:51:42,040 --> 00:51:46,440
like, talk to me a little bit about the Nostr journey you went through

683
00:51:46,440 --> 00:51:54,720
in terms of development? Because pre-napplets, I feel like you occupied

684
00:51:54,720 --> 00:51:59,040
yourself with very different ideas. Yeah, I mean, you could say

685
00:51:59,040 --> 00:52:07,200
that. It actually all builds up to this, if you look at it, right? So, like, and

686
00:52:07,200 --> 00:52:11,400
also I want to sort of correct a previous statement. I didn't

687
00:52:11,400 --> 00:52:16,880
have an exact idea of this, but it was like a feeling that I didn't really have

688
00:52:16,880 --> 00:52:22,280
words for. And I just knew that it was on the horizon, but I also knew it couldn't

689
00:52:22,280 --> 00:52:26,480
be done right then, like when I first found Nostr. I mean, my journey started

690
00:52:26,480 --> 00:52:35,520
because I was on a self-funded sabbatical in 2022 and I was kind of

691
00:52:35,520 --> 00:52:43,040
miserable. Many such cases. Yeah, and I was getting off of it and I was like,

692
00:52:43,040 --> 00:52:47,200
okay, what am I gonna do? Am I gonna go get a contract? Am I gonna get a job? And

693
00:52:47,200 --> 00:52:51,640
I was like, no, I'm gonna, like, play around a little bit. I'm tired of that

694
00:52:51,640 --> 00:52:59,040
scene. And so, I launched the Lightning Node and I installed, I was playing

695
00:52:59,040 --> 00:53:06,760
around with various open-source software. I think it was LNDG and then there was a,

696
00:53:06,760 --> 00:53:10,840
right, there was an input for a Nostr notification. I'm like, what the hell is

697
00:53:10,840 --> 00:53:16,880
Nostr? This must be related to Bitcoin. And then I clicked on it. The repo was

698
00:53:16,880 --> 00:53:23,320
already starred. A friend of mine later reminded me that we ran into it in 2020

699
00:53:23,320 --> 00:53:26,960
when all the censorship stuff was going on, but it was just like a repo. And then

700
00:53:26,960 --> 00:53:30,320
we were actually looking for something to use. We weren't looking

701
00:53:30,320 --> 00:53:36,400
for something to build at the time. But I had started, I was looking around, I

702
00:53:36,400 --> 00:53:41,600
started playing with Astral Ninja. I saw that it had activity, you know, maybe

703
00:53:41,600 --> 00:53:49,400
like the same 10 people over and over. And then I kind of just wanted to learn

704
00:53:49,400 --> 00:53:52,440
more because it seemed very interesting the way that it was laid out. I read NIP

705
00:53:52,440 --> 00:53:56,640
1 and it kind of immediately something happened in my head and it just felt

706
00:53:56,640 --> 00:53:59,440
like an explosion. Like, I don't know, it's hard to explain. Like, the whole mind

707
00:53:59,440 --> 00:54:04,440
blown. Immediately made sense. Yeah, like in a weird way. And not everything made

708
00:54:04,440 --> 00:54:10,480
sense perfectly, but something very deep lured me in. Yeah, let's maybe have a

709
00:54:10,560 --> 00:54:14,800
sip of water before we collapse and also get a bit of distance. Yeah, that would be a good idea to

710
00:54:14,800 --> 00:54:19,400
those. Yeah, you know, usually after an hour it's like your brain needs a little

711
00:54:19,400 --> 00:54:24,960
bit of water. Yeah, and like very little sleep as well. On a hot day. It was a long,

712
00:54:24,960 --> 00:54:32,440
long day. It was a long day, yeah. There you go. Yeah, it's very late. It's, you

713
00:54:32,440 --> 00:54:39,200
know, well. Oh, come on, 10-17. I've had later nights with it. You know, but I, you know, like I'm an old man, I go to

714
00:54:39,200 --> 00:54:48,320
sleep with the kids usually. This is two hours past my bedtime. All right, yeah, I

715
00:54:48,320 --> 00:54:54,880
have some more before, like, you know, stay hydrated. Where's my, where's my

716
00:54:54,880 --> 00:55:02,760
hydrometer? Yeah, I could lower my heartbeat a little bit. So I was looking for something to do

717
00:55:02,760 --> 00:55:08,600
because the, I was just curious, okay, what relays are out there? And then there was

718
00:55:08,600 --> 00:55:13,760
Nostr Relay Registry, I think it was Fiat Jaffs, maybe not, I don't remember.

719
00:55:13,760 --> 00:55:19,000
But I forked it, and then I was just, also the other thing is, is that I hadn't

720
00:55:19,000 --> 00:55:24,040
been working at a low level, as a low-level developer for many years. Like

721
00:55:24,040 --> 00:55:28,360
I'm a developer, but I was doing higher level things, and so I also sort of

722
00:55:28,360 --> 00:55:33,560
wanted to sort of reacclimate to, to development, and also I, it had been even

723
00:55:33,560 --> 00:55:40,480
longer since I was doing front-end development. So picking up the, a fork of

724
00:55:40,480 --> 00:55:44,120
Nostr Relay Registry, which was sort of hurting and barely worked. And that

725
00:55:44,120 --> 00:55:48,040
became Nostr Watch. And that became Nostr Watch. And then like I got sick, I

726
00:55:48,040 --> 00:55:53,560
got the flu, and I remember I was on my couch, I was like bedridden for three

727
00:55:53,560 --> 00:55:59,300
days, and my phone just kept vibrating, like over and over for like, for like

728
00:55:59,300 --> 00:56:04,060
hours. And eventually I could like, look at the phone, because you know, I was very

729
00:56:04,060 --> 00:56:09,500
light sensitive at the time, with the flu. And, and I'm like, it was like, like 50

730
00:56:09,500 --> 00:56:14,380
pull requests, and I'm like, what the fuck? So I like go, and I'm like, okay, people are

731
00:56:14,380 --> 00:56:18,260
adding relays. I'm like, wow, that's a lot of relays. Like this, there was I think six

732
00:56:18,260 --> 00:56:23,460
relays online, when I started the thing. And it took me about a day to figure out

733
00:56:23,460 --> 00:56:27,340
that Jack had posted it, and then other people were sending people there to add

734
00:56:27,340 --> 00:56:33,940
their relays, so that other people could find it. That became a whole thing. It's

735
00:56:33,940 --> 00:56:40,660
a, that's a mess. But I mean, it's the thing is... I still use Nostr Watch. I know, I know, I know. A lot of

736
00:56:40,660 --> 00:56:46,020
people do. It, it just, it took a lot out of me. And a lot of things happened to,

737
00:56:46,020 --> 00:56:54,420
like that year, in 2023. And it was just a pretty hard year. So yeah, a lot of those

738
00:56:54,420 --> 00:57:13,180
memories are tied in with that sort of experience. Yeah, I see, I see. And also, you know... Having a side project that kind of, you know... Like sucks it out, like you're just being basically insulted every day. It's not always good. Not, not, not, not, not every phase of your life is side project friendly. Exactly, exactly. It's, it's

739
00:57:13,180 --> 00:57:17,020
really stable now. I never touch it. I mean, there was a cross-site scripting attack a

740
00:57:17,020 --> 00:57:20,540
couple weeks ago, and I had to do an update. But other than that, it runs itself.

741
00:57:20,660 --> 00:57:50,500
It's very cheap. It's fast-ish. I mean, the client kind of sucks, but the, the infrastructure is solid. No, I still use it. I use it all the time, mostly to find like NIM50 relays and like to just kind of, you know, health check my own stuff and all kinds of things. I think it's, it's, it's very, very useful. Yeah, thanks for building that as well. Yeah, that's great. I appreciate it. I don't get, I think I've gotten more thanks recently for it. But up until a few, maybe like six months ago, it

742
00:57:50,500 --> 00:58:20,060
was definitely, I got more crap for it than, than thanks. I mean, that's always kind of disproportional. Unfortunately, on the internet, like it's, it's, if something annoys you, it's very easy to scream at the guy and like, whatever, and shit on stuff. And, and, and most of the people that are super happy with, with things are just silent. Like there's a silent majority that just, you won't hear from. That's just how it goes. But yeah, you, you ran into Ensight early on as well. And you build

743
00:58:20,060 --> 00:58:21,260
Ensight.run as well.

744
00:58:21,300 --> 00:58:23,340
Yep. Yep. Well, both Ensight.runs.

745
00:58:23,540 --> 00:58:35,020
Yeah. Fair enough. Yeah. Ensight is such a weird project. Because, you know, the guy, when was it? Was it the second, second cohort?

746
00:58:35,060 --> 00:58:35,740
Yeah, Sec2.

747
00:58:35,820 --> 00:58:43,660
And, and like the original author of Ensight, like, didn't really understand what he had with Ensight.

748
00:58:43,700 --> 00:58:43,980
Yeah.

749
00:58:43,980 --> 00:58:49,460
And so other people had to pick up the pieces and move it forward. And you were one of them and Hazard was one of them as well.

750
00:58:49,460 --> 00:58:52,220
Hazard was the big piece of it. Yeah. He took over the spec.

751
00:58:52,260 --> 00:59:05,500
Yeah. Yeah. And so, so now, now it's definitely a thing. And like, you know, half the demos we see, and like from SCC 03, 04 onward, like half the demos were deployed as Ensight.

752
00:59:05,500 --> 00:59:06,660
So that's, that's quite something.

753
00:59:06,660 --> 00:59:07,700
That's really great to see.

754
00:59:07,740 --> 00:59:12,780
So what, what made you, what made you excited about Ensight? What made you build Ensight.run at all?

755
00:59:12,780 --> 00:59:40,940
Actually, nothing to do with Ensight. To be honest, the first, I didn't have high hopes for Ensight. I mean, obviously, it's interesting to me. The reason why I did it is because I really love CLI interfaces and TUIs. And I wanted to build a TUI. And I couldn't, and Florian did a great job at doing the first, the first CLI for Ensight. But I really, I like automation. And I didn't want to put my private key in some secrets field on some random website.

756
00:59:41,660 --> 00:59:54,580
So I needed NIP 46. And so I needed a more sophisticated key management system. And I was like, I want to build a, I haven't built a beautiful CLI in over a decade. So I like, that's, that's the main reason I did it.

757
00:59:55,140 --> 00:59:55,820
That's awesome.

758
00:59:55,860 --> 00:59:59,980
And I didn't expect that when I released it, that was the first time that a lot of people.

759
01:00:00,000 --> 01:00:04,460
knew it existed. And then that kicked off people launching

760
01:00:04,460 --> 01:00:07,760
gateways and making their own CLIs and all this stuff, right?

761
01:00:07,760 --> 01:00:11,440
And people tried to use it. The first version didn't work very

762
01:00:11,440 --> 01:00:16,320
well. So I started the other end site, the end site with the

763
01:00:16,320 --> 01:00:19,040
that's spelled correctly dot runs to sort of coalesce people

764
01:00:19,040 --> 01:00:25,000
around the specification. And then over the next year, I

765
01:00:25,000 --> 01:00:29,000
think it was, Hazard slowly developed the specification,

766
01:00:29,000 --> 01:00:32,240
identified things that were wrong. I think at one point, he

767
01:00:32,240 --> 01:00:36,000
was willing to give up on it. But he pushed forward, and he

768
01:00:36,000 --> 01:00:38,640
pushed a new spec, I believe it was December of

769
01:00:42,520 --> 01:00:46,920
2025. He finally like we landed somewhere after some contention

770
01:00:46,920 --> 01:00:51,520
about how it should actually work. And nobody updated

771
01:00:51,520 --> 01:00:56,720
anything. And so I was kind of getting pissed off and fed up

772
01:00:56,720 --> 01:01:00,200
with master to be honest. And I was like, I need to take a break

773
01:01:00,200 --> 01:01:03,760
from this. But I remember like, yeah, I told you to go into the

774
01:01:03,760 --> 01:01:06,400
woods and stay there for a couple months or like, you know,

775
01:01:06,400 --> 01:01:14,280
going to so like, you didn't listen. No, I didn't. And so I

776
01:01:14,280 --> 01:01:16,640
was like, well, before I do this, this end site thing is

777
01:01:16,640 --> 01:01:21,200
pissing me off. No one's updated their stack. So I sort of just

778
01:01:21,200 --> 01:01:23,680
learned from the first time that it's just if you do it, then

779
01:01:23,680 --> 01:01:26,960
other people will follow. So I built out I basically just

780
01:01:26,960 --> 01:01:31,560
chased the spec everywhere. So I released an insight be to

781
01:01:31,560 --> 01:01:37,280
gateway blossom server for it. Not that it matters, but in a

782
01:01:37,280 --> 01:01:40,920
relay that only accepts inside events, and then I updated the

783
01:01:40,920 --> 01:01:44,040
CLI. And then I added a web deployer, so you wouldn't have

784
01:01:44,040 --> 01:01:47,160
to download anything. And you could just drop an aesthetic

785
01:01:47,160 --> 01:01:53,440
site onto the deployer. And it's actually the it was made really

786
01:01:53,440 --> 01:01:58,560
funny too, because the infrastructure is it's all edge

787
01:01:58,560 --> 01:02:03,080
scripting on bunny.net. Okay, everything, the relay, blossom

788
01:02:03,080 --> 01:02:06,680
server, like it's there's it's completely serverless and like

789
01:02:06,680 --> 01:02:09,600
has very tight constraints. That was kind of a fun problem to

790
01:02:09,600 --> 01:02:15,520
solve. And it barely works, but it's very cheap to run. And that

791
01:02:15,520 --> 01:02:17,880
was actually not intended for long term infrastructure. It was

792
01:02:17,880 --> 01:02:22,480
just to get people to update their their stack. Yeah. I'm

793
01:02:22,480 --> 01:02:29,720
actually going to take it down soon. So push that out, you

794
01:02:29,720 --> 01:02:33,760
know, made I think I shared something I pushed that out, it

795
01:02:33,760 --> 01:02:38,640
got some traction. And then I made a novel sort of proposed a

796
01:02:38,640 --> 01:02:41,840
novel idea about how you can use insights with like stealing them.

797
01:02:42,480 --> 01:02:46,680
And like, Oh, yeah, steal this insight. But and that and that

798
01:02:46,680 --> 01:02:50,160
had like a virality to it. And then that gave me the leverage

799
01:02:50,160 --> 01:02:53,040
to then like tag everyone who has infrastructure and say

800
01:02:53,080 --> 01:02:56,680
update your shit. Yeah. And then it got updated. And a week later

801
01:02:56,680 --> 01:03:01,680
it was merged. Yeah. So awesome. And you mentioned like all these

802
01:03:01,680 --> 01:03:06,320
little parts of your journey. Like, like, everything that you

803
01:03:06,320 --> 01:03:12,880
just mentioned, led to the napplet idea in some way. Yeah,

804
01:03:12,880 --> 01:03:17,760
kind of. Yeah, it did. So relays too. So hard coded relays really

805
01:03:17,760 --> 01:03:21,480
bother me. I mean, you're always going to have a bootstrap.

806
01:03:21,920 --> 01:03:24,400
That's always going to be a part. Yeah, I mean, yeah. But

807
01:03:24,400 --> 01:03:27,040
there are all there's so many different varieties of relays

808
01:03:27,040 --> 01:03:30,880
that you start to hard code relays and everything and to

809
01:03:30,880 --> 01:03:35,800
have a truly like, dynamic system. Yeah, I need to have a

810
01:03:35,800 --> 01:03:39,440
way to find them. Yeah, we need we need relay discovery. And I

811
01:03:39,440 --> 01:03:43,560
mean, that's why Pablo has been harping on, you know, outbox for

812
01:03:43,560 --> 01:03:47,280
such a long time. Because otherwise Nostr is kind of

813
01:03:48,840 --> 01:03:54,320
like, yeah, useless. Yeah. If we don't have that everything will

814
01:03:54,320 --> 01:03:58,000
centralize about one around one or two big relays. Yeah. And

815
01:03:58,000 --> 01:04:01,240
outbox solves most of it, but it doesn't solve every problem.

816
01:04:01,320 --> 01:04:04,840
Yeah. So talk to me about NIP 66. And you're Oh, gee, are you

817
01:04:04,840 --> 01:04:07,320
sure? Are you sure your audience wants to hear anything about

818
01:04:07,320 --> 01:04:13,000
NIP 66? Because it's related to all of your audience. I mean,

819
01:04:13,280 --> 01:04:15,000
I'm pretty sure they all just turned it off.

820
01:04:17,000 --> 01:04:20,080
Like, you just have to be like, we're not doing this for the

821
01:04:20,080 --> 01:04:23,800
audience. I'm doing this to pick your brain. And you just have to

822
01:04:23,800 --> 01:04:26,680
be okay, like the way it goes is like we start to walk. Yeah, we

823
01:04:26,680 --> 01:04:29,080
have like, maybe five people listening, you know, right. And

824
01:04:29,080 --> 01:04:31,680
then like, after 20 minutes, maybe it's down to three people

825
01:04:31,720 --> 01:04:35,440
after an hour, and we're an hour in now. After an hour, it's like

826
01:04:35,480 --> 01:04:38,360
one guy with half a brain listening, maybe, you know,

827
01:04:38,400 --> 01:04:40,560
sleep. Yeah, it's probably Pablo is asleep.

828
01:04:40,560 --> 01:04:46,240
Like, that's, that's how he goes. So, so, yeah, talk to me a

829
01:04:46,240 --> 01:04:49,640
little bit about, you know, like, how you think about

830
01:04:49,640 --> 01:04:53,800
outbox and and really discovery and talk to me about NIP 66 as

831
01:04:53,800 --> 01:04:54,680
well. I want to hear it all.

832
01:04:54,720 --> 01:05:00,760
Yeah. So like, so so NIP 66 is really interesting to me because

833
01:05:00,760 --> 01:05:07,440
it it it's a state is using Nostr as a state machine. And

834
01:05:07,440 --> 01:05:11,760
it's fuzzy, it's not a global state, it's relative to what the

835
01:05:11,760 --> 01:05:19,160
user trusts. The end pubs like a monitor, an observer is just an

836
01:05:19,160 --> 01:05:23,160
end pub publishing that some information about a, about a

837
01:05:23,160 --> 01:05:26,640
relay. And that can just be someone you follow, or that

838
01:05:26,640 --> 01:05:30,560
could be your web of trust, that could be anything. It's a base,

839
01:05:30,600 --> 01:05:33,680
it at first glance, it seems very arbitrary and useless

840
01:05:33,680 --> 01:05:38,320
until you actually understand the domain of relays on Nostr.

841
01:05:38,320 --> 01:05:41,520
It's actually really freaking complicated, because they're

842
01:05:41,520 --> 01:05:45,360
just fuzzy strings, they're, they're, they're not guaranteed

843
01:05:45,360 --> 01:05:51,040
unique. NIP one up until recently, didn't specify any

844
01:05:51,040 --> 01:05:55,680
rules around how relays should handle their segments or paths.

845
01:05:56,320 --> 01:05:59,960
And so damas like relay dot damas.io is the same as relay

846
01:05:59,960 --> 01:06:04,800
dot damas.io slash GG, both will respond as a relay. This

847
01:06:04,800 --> 01:06:06,960
creates all sorts of optimization problems for

848
01:06:06,960 --> 01:06:12,040
clients. And so and so this is just an example of one of the

849
01:06:12,040 --> 01:06:15,640
complexities, there's a lot of them. Most of it is garbage. I

850
01:06:15,640 --> 01:06:19,240
mean, there's like, probably like 15,000, if not 20,000

851
01:06:19,280 --> 01:06:22,840
unique strings that are relays, but most of them are either

852
01:06:22,840 --> 01:06:26,440
online, or it's just garbage. You know, some client bug seven

853
01:06:26,440 --> 01:06:29,040
months ago that still exists somewhere. Okay, interesting.

854
01:06:29,040 --> 01:06:33,520
Yeah. So that's like one problem. The other one is, is

855
01:06:33,520 --> 01:06:38,280
that, like, if you want to find out a band relay, so you want to

856
01:06:38,280 --> 01:06:42,320
find, for example, like you're saying, NIP 50, doing that in a

857
01:06:42,320 --> 01:06:44,760
web of trust will probably be difficult. There's no way to

858
01:06:44,760 --> 01:06:48,600
say, hey, I want all the NIP 50 relays in my web of trust without

859
01:06:48,600 --> 01:06:51,640
hitting every one of their NIP 11. Yeah, deduplicate,

860
01:06:51,880 --> 01:06:54,520
deduplicating the relays on client side. And you can do this

861
01:06:54,640 --> 01:07:01,320
over time, actually pretty efficiently. And, etc. But it's

862
01:07:01,320 --> 01:07:04,600
not only just discovery, because you can build data on top of it.

863
01:07:04,600 --> 01:07:09,240
So there is a NIP called trusted relay assertions.

864
01:07:09,840 --> 01:07:12,240
Yeah, I saw that recently. I still haven't wrapped my head

865
01:07:12,240 --> 01:07:13,880
around the trusted assertions.

866
01:07:14,080 --> 01:07:18,160
But yeah, it's so trusted relay assertions are the same idea as

867
01:07:18,160 --> 01:07:21,400
trusted assertions, but for relays. And that's someone

868
01:07:21,400 --> 01:07:24,640
building data on top of the liveness data. So they know

869
01:07:24,920 --> 01:07:27,760
what, because what the liveness data does is it reduces the

870
01:07:27,760 --> 01:07:30,440
amount of work someone else has to do to build on top of that,

871
01:07:30,440 --> 01:07:34,320
right? And now you can sort relays based on these, you know,

872
01:07:34,320 --> 01:07:37,360
subjective trust scores. Yeah. And there could be many of those

873
01:07:37,360 --> 01:07:40,400
and you could pick which one you support. Yeah. Okay. So then how

874
01:07:40,400 --> 01:07:41,560
does this help anything?

875
01:07:41,560 --> 01:07:44,520
Yeah. Ping, reachability, liveness, is it in your web of

876
01:07:44,520 --> 01:07:45,560
trust, all those kind of things.

877
01:07:45,560 --> 01:07:49,720
Exactly. Yeah. So then like, there's a lot of uses for this

878
01:07:49,720 --> 01:07:54,360
and some of it is contentious. And there's been some people

879
01:07:54,360 --> 01:07:56,560
that have chimed in and said that they don't like the trust

880
01:07:56,560 --> 01:08:02,040
model. But you can use this data in order to optimize your outbox

881
01:08:02,040 --> 01:08:06,920
connections to prioritize as a second layer of prioritization

882
01:08:07,560 --> 01:08:11,720
after web of trust grouping. So like you need to group the

883
01:08:11,720 --> 01:08:15,360
relays by how many of your followers are on a specific

884
01:08:15,360 --> 01:08:17,480
relay so that you get as many notes as quickly as possible,

885
01:08:17,480 --> 01:08:21,840
right? Yeah. But you can do a secondary pass on speed, you can

886
01:08:21,840 --> 01:08:25,640
do it on trust, you can do it on decentralization, you can do it

887
01:08:25,640 --> 01:08:28,120
on specific NIP support if you're looking for specific types

888
01:08:28,120 --> 01:08:31,600
of notes. Yeah. And this makes the client more responsive. I

889
01:08:31,600 --> 01:08:35,080
actually use the first thing I did in hyper in the in the

890
01:08:35,560 --> 01:08:41,440
operating system is to implement NIP 66. And it's used very

891
01:08:41,440 --> 01:08:46,400
exclusively in outbox optimizations. And to help with

892
01:08:46,400 --> 01:08:48,400
also like auto complete throughout the entire

893
01:08:48,400 --> 01:08:53,000
application and any NAPLIT really. And I found it to speed

894
01:08:53,000 --> 01:08:56,320
things up quite a bit. There has been research by someone that

895
01:08:56,320 --> 01:09:00,320
has been contentious in the past. But my findings have

896
01:09:00,320 --> 01:09:01,680
mirrored what he found as well.

897
01:09:03,760 --> 01:09:09,240
We're not gonna name names. No, it's okay. You don't have to.

898
01:09:09,600 --> 01:09:14,200
No, I like him. He's a friend of mine. But he caused some

899
01:09:14,240 --> 01:09:18,280
problems in your repo at one point. And, and there we go.

900
01:09:18,960 --> 01:09:19,680
Identified.

901
01:09:21,440 --> 01:09:25,000
It's okay. It's okay. It's okay. He's a really nice guy. One of

902
01:09:25,000 --> 01:09:31,280
the one of the sweetest people I know. So yeah, I mean, it's,

903
01:09:31,640 --> 01:09:35,280
you know, adding the ability to discover relays might seem

904
01:09:35,280 --> 01:09:38,040
arbitrary. I mean, it kind of is. There's not that many right

905
01:09:38,040 --> 01:09:43,320
now. If you include Tor and I2P, it's like 1500 after the

906
01:09:43,320 --> 01:09:46,320
duplication. There's some margin of error because I mean,

907
01:09:46,320 --> 01:09:50,840
that's more relays than users. Yeah, pretty much. Yeah. And so

908
01:09:50,840 --> 01:09:54,480
there is a lot of relays. Yeah, yeah. What the fuck?

909
01:09:57,760 --> 01:09:59,840
That's a bird. Oh, wow.

910
01:10:00,560 --> 01:10:06,800
That was the weirdest sound I've heard in a long time. I thought it was like a drone.

911
01:10:06,800 --> 01:10:13,040
Yeah, me too. I was like, where is G? Me too. That was super weird. Like that was a very weird

912
01:10:13,040 --> 01:10:20,880
sounding bird. Yeah. See? Night active birds. I really hope the microphones pick that up.

913
01:10:20,880 --> 01:10:23,120
That's so weird. That's the weirdest sound I've heard in a while.

914
01:10:23,120 --> 01:10:27,520
Holy shit. Squeaky, random squeaky bird.

915
01:10:28,480 --> 01:10:34,320
Anyways, I could go on for hours about the intricacies of relays. It's not that interesting.

916
01:10:35,360 --> 01:10:36,880
I think it's more interesting to me.

917
01:10:38,080 --> 01:10:43,440
The fact that you mentioned that you created a relay that exclusively accepts,

918
01:10:46,080 --> 01:10:51,760
in what context was it? I'm blanking now. Nsight. Nsight events. That's fascinating to me. I always

919
01:10:51,760 --> 01:11:02,640
loved Pablo's idea. Holy shit. What kind of bird is that? I think it's an alien. So strange. Anyway,

920
01:11:03,360 --> 01:11:07,760
so he did purple pages, of course. Yeah, of course. Early. Very early. Very early. Yeah.

921
01:11:10,480 --> 01:11:18,320
I'm very tempted to kind of go hard on my relays. I have a couple of relays,

922
01:11:18,640 --> 01:11:24,960
mostly Web of Trust and just Haven. I use a lot for basically personal use and backups and so on.

923
01:11:24,960 --> 01:11:30,400
And I want to do my own instance of purple pages just for profile lookups. And I want to do one,

924
01:11:30,400 --> 01:11:35,200
I want to rebuild Boris, my highlight app. And I just want to do one for highlights and long

925
01:11:35,200 --> 01:11:43,520
form stuff and so on. I really want to lean into the specialization you've hinted at.

926
01:11:43,520 --> 01:11:49,920
So how do you think about going forward, the evolution of relays and relay discovery and

927
01:11:49,920 --> 01:11:55,840
relay specialization and all those kind of things? Yeah. So Hazard and I have been bouncing

928
01:11:55,840 --> 01:12:02,240
off each other for a year and a half, I think. And we were talking in Costa Rica

929
01:12:02,880 --> 01:12:14,320
like eight months ago or so. And we settled on relay attributes. So you can add attributes to

930
01:12:14,320 --> 01:12:20,160
your NIP 11 up to nine pascal case. There's a reason for that.

931
01:12:22,240 --> 01:12:26,480
We anyone who aggregates them should truncate anything after nine.

932
01:12:27,120 --> 01:12:31,600
And that allows them to be found based on self-descriptive words about the relay,

933
01:12:32,560 --> 01:12:39,120
not technical implementations, but subjective decisions made by the relay operator or developer

934
01:12:39,120 --> 01:12:44,880
that resulted in the way the relay behaves. So an example would be like pubkey indexer,

935
01:12:44,880 --> 01:12:52,160
which would be purple pages. But we're not trying to atomize them at all. We don't want to. We think

936
01:12:53,120 --> 01:12:59,520
that people can just coalesce around words and form their own words. And it'll be messy.

937
01:12:59,520 --> 01:13:04,480
Yeah. Like hashtag clouds, whatever. Exactly. And that would allow relays to be found

938
01:13:05,360 --> 01:13:10,480
based on what they do. And in this case, like highlights, you could come up with some

939
01:13:10,480 --> 01:13:21,360
terminology and coalesce around a term with similar relays. So that is sort of the endgame

940
01:13:21,360 --> 01:13:26,320
because at that point you don't need to hard code all these relays. You can actually even allow

941
01:13:26,320 --> 01:13:31,680
users to fix it themselves. And it's intuitive. Yeah. Yeah. I think also in terms of, I think

942
01:13:31,680 --> 01:13:35,840
tagging kind of is the right approach because it's not only what kind of data do you allow?

943
01:13:35,840 --> 01:13:38,640
It's way more than that. It's like, what capabilities do you offer? Like you might

944
01:13:38,640 --> 01:13:44,480
support search NIP 50 or you don't. It might be a web of trust gated or it isn't. It might be paid

945
01:13:44,480 --> 01:13:49,680
or it's free and all those kinds of things. You have all these dimensions of relay specialization

946
01:13:50,160 --> 01:13:54,560
and yeah, or you just whatever. Geoblock, like the Japanese relays. It's like,

947
01:13:54,560 --> 01:14:03,440
if you're not from Japan, like go fuck yourself. And yeah, no. Okay. All that's fascinating.

948
01:14:04,480 --> 01:14:11,680
You can already right now without the attributes, you can already do payment filtering. So it's just

949
01:14:11,680 --> 01:14:16,960
capital R tag and then payment. And then if you want it free, like no payment, it's

950
01:14:16,960 --> 01:14:23,120
exclamation point payment due to the limitations in NIP 1. And then also the same for restricted

951
01:14:23,120 --> 01:14:29,760
rights. And then also for proof of work. So you can find proof of work, relays. You can find paid

952
01:14:29,760 --> 01:14:36,400
relays, public relays. You can find ClearNet, TorNet or Tor, I2P, soon FIPS. If someone does it,

953
01:14:36,400 --> 01:14:39,440
I'm waiting for someone else to do it. I could easily do it, but I can't do everything. It's

954
01:14:39,440 --> 01:14:44,960
like someone else needs to find the need and do it. We'll nerd snipe someone with the FIPS stuff.

955
01:14:45,440 --> 01:14:50,400
I think it'll be more important in the future. I'm being honest. And maybe there'll be a better

956
01:14:50,400 --> 01:14:55,600
way to do it in the future. It may have been a waste of time, but maybe not.

957
01:14:55,600 --> 01:15:03,280
Yeah. Last thing, last 20 minutes. That will be 20 minutes to the tunneling, something like that.

958
01:15:03,760 --> 01:15:15,520
Um, your development setup, um, that has been happening since basically SCC03 or something.

959
01:15:15,520 --> 01:15:22,080
Like when, when, when vibe coding came around, you were one of the first people that I know

960
01:15:22,080 --> 01:15:28,720
that went like, okay, like, let's just do waterfall. Like the agents are really good at waterfall. So

961
01:15:28,720 --> 01:15:34,400
write the specification, like everything that's like 30 years old is perfect. Like it's, it's,

962
01:15:34,400 --> 01:15:42,000
the LLMs have gobbled it up and internalized it and so on. And, and, um, yeah, I, I want to hear

963
01:15:42,000 --> 01:15:48,160
more about your vibe coding journey and like how it evolved and how you started. And you,

964
01:15:48,160 --> 01:15:53,040
you talked about it a little bit when you mentioned that your friend, you know, like he,

965
01:15:53,840 --> 01:15:59,200
you weren't using anything from the anthropic side and he made you like look into that and so on.

966
01:15:59,200 --> 01:16:04,320
And, um, yeah, you, you showed some of the things of today in the first workshop,

967
01:16:04,320 --> 01:16:12,400
workshop session as well with like, uh, GSD, uh, gadget done and so on. So, so, so talk to me about

968
01:16:12,960 --> 01:16:19,120
not only the evolution of your tool set, but also how you think about basically how to,

969
01:16:20,080 --> 01:16:27,440
how to properly build production ready stuff. Yeah. In the gigantic world, because I think

970
01:16:27,440 --> 01:16:31,920
you're exceptionally good at that. Like you're, we talked about the distinction today between

971
01:16:31,920 --> 01:16:36,080
prototyping and building something that's production ready and like, you know, explain

972
01:16:36,080 --> 01:16:39,360
where you're at and, and, and a little bit, talk, talk me through your journey.

973
01:16:39,360 --> 01:16:44,160
Sure. Uh, it started really early. I mean, basically right when LLMs came out, a bunch of

974
01:16:44,160 --> 01:16:49,520
nerds, you know, the first thing they try to do is make an agent. That's the very first thing. It's

975
01:16:49,520 --> 01:16:59,520
like, uh, you had two, two big projects, um, uh, auto GPT and baby AGI. Um, neither of them really

976
01:16:59,520 --> 01:17:05,840
worked. Right. I could, I could get agents to go in loops and have turns and sort of go in some

977
01:17:05,840 --> 01:17:10,800
direction. But like, imagine, you know, like when you get angry at your agent, imagine it's like

978
01:17:10,960 --> 01:17:16,720
points were like a hundred points lower. That's what it was like. Like you get angry at it for

979
01:17:16,720 --> 01:17:21,680
like writing comments somewhere and leaving a stub or to do like this thing would like write

980
01:17:21,680 --> 01:17:25,920
the same file over and over like a hundred times, like right next to each other. And then like, go

981
01:17:25,920 --> 01:17:32,320
to your root folder and just start, you know? Yeah. Um, uh, but that's where it started. Um,

982
01:17:32,320 --> 01:17:36,880
and then I tried, cause I have an experience, you know, I've, I've worked with teams. I've

983
01:17:36,880 --> 01:17:41,600
ran teams. I've been doing it since I was pretty young. Like some of my earliest projects were me

984
01:17:41,600 --> 01:17:48,320
hiring people in Eastern Europe to do projects for me. And I would learn from, you know, working

985
01:17:48,320 --> 01:17:54,080
with them, how to do things. And it was a great education, um, better than any university

986
01:17:54,080 --> 01:18:01,440
experience. So you were, you were agent babysitting before it was cool. They all had a

987
01:18:01,440 --> 01:18:07,920
Russian accent. Yeah. Usually, usually Ukrainian or Romanian. Same, same, all the same. Um,

988
01:18:09,280 --> 01:18:13,680
so I have some experience and so I would try to apply that because it seems obvious you have these,

989
01:18:16,160 --> 01:18:23,200
these beings that are non-sentient, um, but you can give them instructions and they do things.

990
01:18:23,200 --> 01:18:28,160
These entities that produce code. Yeah, exactly. So it seems obvious to me that, you know,

991
01:18:28,160 --> 01:18:31,280
this is where it was going. And every few months I would always try,

992
01:18:31,920 --> 01:18:39,280
like, see where it was at, see where it was at. And at some point in 2024, it became obvious to

993
01:18:39,280 --> 01:18:43,120
me. I think it was actually Fiat Jaff asked me about it. He's like, so how's AI doing? I'm like,

994
01:18:43,120 --> 01:18:49,040
I think we're getting close. Um, I said like a year or something. I think I was right.

995
01:18:49,040 --> 01:18:56,560
I don't remember the timeframe though. Um, and I, when was the first time I had success? It

996
01:18:56,560 --> 01:19:03,520
was the end of 2024. I was a reasoning model. I think it was the end of 2024. It could be wrong,

997
01:19:03,520 --> 01:19:08,320
but I think there were some reasoning models that finally came out and that obviously they're not

998
01:19:08,320 --> 01:19:13,040
actually reasoning, but for the first time, let's build up some space for the first time.

999
01:19:14,560 --> 01:19:19,280
I was able to give an agent and instruction and it would start to

1000
01:19:20,160 --> 01:19:27,520
inflect on its decisions. And when that happened, I noticed the abrupt change in its ability for me

1001
01:19:27,520 --> 01:19:32,400
to delegate something to it and for it to come back to me with something of value. Um, and so

1002
01:19:32,400 --> 01:19:36,080
then I started trying this more often instead of every three months, it was like every couple of

1003
01:19:36,080 --> 01:19:43,520
days. And I tried different, uh, SDLCs. So I tried agile. I tried various forms of waterfall. I tried

1004
01:19:44,000 --> 01:19:52,560
um, like just like general iterative development. I tried to do like extract characteristics of

1005
01:19:52,560 --> 01:19:59,760
agile that didn't suck and use that. I, but every time I hit waterfall, it worked really well. So

1006
01:20:00,000 --> 01:20:05,680
I would just define a high-level document, I would work with an agent, well really I would start

1007
01:20:05,680 --> 01:20:11,360
myself writing out a spec, I would sort of expand that with an agent, then compress it a little bit,

1008
01:20:11,360 --> 01:20:15,520
get rid of things that didn't make sense, and then when I could read it and when the shape

1009
01:20:15,520 --> 01:20:20,240
of the document looked right, I would feel confident and I would break that into low-level

1010
01:20:20,240 --> 01:20:25,360
design documents, and those were little chunks of context that were very specialized to a specific

1011
01:20:25,360 --> 01:20:29,680
part of the stack, and I could give that to an agent and it would come back and give it to me

1012
01:20:29,680 --> 01:20:36,160
exactly as I'd asked for. And I may have skipped some parts in there, there was definitely struggle,

1013
01:20:36,160 --> 01:20:42,240
but I don't remember all of it. What kind of models did you use where you had this success?

1014
01:20:42,240 --> 01:20:48,240
I think it was around GPT 5.0, because that's when, if I remember correctly, that's when

1015
01:20:49,360 --> 01:20:52,240
things started to make sense. I could be wrong about the exact version,

1016
01:20:52,960 --> 01:20:58,960
but it was chat GPT. It was pro. I got pro and it was able to do things correctly,

1017
01:20:58,960 --> 01:21:04,880
do research. So GPT 4.0 or 5.0, that era. Yeah, late 4.0s, early 5.0.

1018
01:21:06,240 --> 01:21:10,160
I don't remember the years of any of this stuff, it's all a blur kind of. Yeah, yeah, I mean

1019
01:21:10,160 --> 01:21:16,480
definitely. I mean we're still in the it's all a blur stage kind of as far as I'm concerned.

1020
01:21:16,560 --> 01:21:22,480
Yeah, so that was like the first successful thing where I could plan something out, I could feed it

1021
01:21:22,480 --> 01:21:27,840
into this manually, by the way. There was no looping or like there was no context injection.

1022
01:21:27,840 --> 01:21:32,720
I didn't have my own agent or my own harness. This was all just manual and it was working

1023
01:21:32,720 --> 01:21:37,600
pretty consistently. And then at this point, now there's like tools everywhere. You have like

1024
01:21:37,600 --> 01:21:41,760
Rue code and you have all these other tools that are just kind of doing the same idea. So I started

1025
01:21:41,760 --> 01:21:48,800
playing around basically with everything. I found some success and honestly pretty much

1026
01:21:48,800 --> 01:21:54,160
all of the tooling I think is good for someone. But I never didn't really run into anything that

1027
01:21:54,160 --> 01:22:00,240
worked great for me until GSD. Like that was the first one where I could, it worked exactly

1028
01:22:00,240 --> 01:22:08,720
with how I thought. And I was able to very clearly define a project scope and iterate through

1029
01:22:08,720 --> 01:22:15,760
milestones and capture things and bring them up to the surface. And so this became what I'm doing

1030
01:22:15,760 --> 01:22:21,920
now. And I've been on that for seven, eight months, I think. Okay, interesting. Seven, eight months and

1031
01:22:21,920 --> 01:22:29,520
with little change from your approach. No, it's changed. But your GSD stack grew in some sense.

1032
01:22:29,520 --> 01:22:33,760
A little bit, yeah. And I have been doing loop engineering as well, which has replaced a bit of

1033
01:22:33,760 --> 01:22:41,920
it. And I do anticipate that I'm nearing the end of that with GSD. Things are just going much

1034
01:22:41,920 --> 01:22:47,920
faster now. I'm probably going to outgrow it very soon, if not already. Like I'm just waiting for

1035
01:22:47,920 --> 01:22:53,360
something like GSD to come again. I anticipate I'm going to replace it. Okay, so next iteration

1036
01:22:53,360 --> 01:22:59,440
of GSD, whatever that will be. Because like loop engineering is, like GSD is basically loop

1037
01:22:59,440 --> 01:23:04,960
engineering, right? So it's like a template for it. It's a very specific workflow. And it works

1038
01:23:04,960 --> 01:23:11,200
really well. But yeah, there's something on the horizon. I don't know what it is. But you're right,

1039
01:23:11,200 --> 01:23:22,160
there are cockroaches. It's just like dancing, too. It's weird. Yeah. The yeah, there's more

1040
01:23:22,160 --> 01:23:25,680
things in the future. I'm not stuck on it because I do test other things all the time.

1041
01:23:25,840 --> 01:23:32,080
Uh, Fran shared something a few weeks ago, I tested it for a couple days. It's very lightweight. I

1042
01:23:32,080 --> 01:23:36,880
think it's open spec. I think that's what it's called. Really, it's actually quite good.

1043
01:23:38,320 --> 01:23:44,240
If you're someone that doesn't like the heaviness of GSD, I'm almost certain it's open spec. So I'm

1044
01:23:44,240 --> 01:23:49,520
I hope that's what it is. Yeah. Then that is really quite a good starting point because you

1045
01:23:49,520 --> 01:23:54,720
could build on that to create something like GSD without all the heaviness. For me, the heaviness

1046
01:23:54,720 --> 01:24:06,480
is good. Okay, so my my flow now is, it's really a back and forth. So I when I start a project,

1047
01:24:06,480 --> 01:24:11,840
I have like a agents.md template that's very small, it just has some basic policy things

1048
01:24:11,840 --> 01:24:16,160
that they change around what the project around some of the constraints or parameters,

1049
01:24:16,800 --> 01:24:24,000
language of the project. And I will start a new project in GSD, I will have a pretty good

1050
01:24:24,000 --> 01:24:30,560
conversation, produce a series of documents, GSD does like research, right when you start a

1051
01:24:30,560 --> 01:24:35,920
project to understand the domain, so that it can make more informed decisions. And it's really

1052
01:24:35,920 --> 01:24:40,240
important that you, especially if the domain you're in is novel or experimental, that you

1053
01:24:40,240 --> 01:24:46,080
check those documents like Nostr. Although models are getting really good with Nostr. Yeah, yeah.

1054
01:24:46,080 --> 01:24:50,320
Before they used to hate it. They're like, what the heck? Yeah, now it's a thing. And it's part

1055
01:24:50,320 --> 01:24:54,320
of the training data. And they're not as confused about it. But in the beginning was, oh, it was

1056
01:24:54,320 --> 01:24:58,240
terrible. We were always fighting the model. So they were always trying to do client server,

1057
01:24:58,240 --> 01:25:03,920
rest interface, kind of like everything, username, password kind of stuff. Right. And, and it was

1058
01:25:03,920 --> 01:25:08,800
painful. It was so painful. But the building up context for a new thing. Yeah, that's one thing

1059
01:25:08,800 --> 01:25:16,800
I forgot to mention today, when I showed off my stuff. It's a very small thing. But the way I do

1060
01:25:16,800 --> 01:25:23,040
it, like, I do very primitive context engineering. And I use the Socratic method, basically

1061
01:25:23,040 --> 01:25:29,200
exclusively. So when I start a greenfield project, very new thing, I just the first 10 prompts will

1062
01:25:29,200 --> 01:25:33,840
be questions. Yeah, like, what's out there? Like, what's, what do you know about this, all those

1063
01:25:33,840 --> 01:25:40,080
kinds of things. And from that, I'll land on the design document that you mentioned. That's actually

1064
01:25:40,080 --> 01:25:47,280
what the the the new project, and the planners use the Socratic method. So it will ask questions

1065
01:25:47,280 --> 01:25:51,520
to you. So instead of you asking questions, okay, it will ask questions to you. And then use that

1066
01:25:51,520 --> 01:25:58,080
input as a question for how it approaches the research. Yeah. So I always do it just to be sure

1067
01:25:58,080 --> 01:26:03,840
like, like I showed off today, every, every one of my projects has an NPUP and I use NIP17 to

1068
01:26:03,840 --> 01:26:09,520
communicate with the project. And let's say I want to add a search keyword to ants to the

1069
01:26:09,520 --> 01:26:14,560
Nostr search I've built. And then I would go like, like, I already know what I want to build.

1070
01:26:14,560 --> 01:26:17,760
But I'm not going to hit it with that. I'm going to go like, what are the search keywords that we

1071
01:26:17,760 --> 01:26:21,760
have? Yeah, you know, and it already builds up context. Okay, so these are search keywords. And

1072
01:26:21,760 --> 01:26:27,120
I go like, would it make sense to add this one? Yeah. And it would go like, yeah, that makes

1073
01:26:27,120 --> 01:26:31,360
sense. And we could do this and that. And it's like, okay, like, you know, like, give me like,

1074
01:26:31,360 --> 01:26:35,360
how would you implement it? You know, and then it would we iterate a little bit and so on. And then

1075
01:26:36,000 --> 01:26:40,640
once I'm happy, I'm like, okay, go, let's implement it. So just Socratic method through and

1076
01:26:40,640 --> 01:26:44,560
through. Yeah. And then I pull the trigger and then it's basically done. Nice. And I also always

1077
01:26:44,560 --> 01:26:50,480
end I mean, I mentioned this today. I always end like I use the same development workflow I've

1078
01:26:50,480 --> 01:26:54,400
always used to feature branches and so on. And I always end with like, what's the top five

1079
01:26:54,400 --> 01:27:00,000
things we could improve on this feature branch? Yeah, like before, before I merge and so on.

1080
01:27:00,080 --> 01:27:05,200
And so so like, oftentimes, one or two things are okay. And then I ask again,

1081
01:27:05,200 --> 01:27:08,160
and if all top five are complete bullshit, then I know I'm done.

1082
01:27:08,160 --> 01:27:15,120
Yeah, exactly. Exactly. I do the same thing. Yeah, yeah. It's a similar workflow. Yeah,

1083
01:27:15,120 --> 01:27:20,240
it's a slightly different approach. It's a little yours. Yours is yours is probably more automated

1084
01:27:20,240 --> 01:27:25,840
and more more structured a little bit. Yeah, mine is very kind of Yeah, I use like automated agents

1085
01:27:25,840 --> 01:27:31,600
for issues. And my agents are very like under a very strict policy for how they interface and

1086
01:27:31,600 --> 01:27:37,280
interact with other repos. Yeah. And how they interact with issues and pull requests. Yeah.

1087
01:27:37,280 --> 01:27:41,600
And then I have automated agents that go through and look for sloppy issues.

1088
01:27:41,600 --> 01:27:47,280
Yeah. likely posted by me, and then they contextualize them and put in like basically

1089
01:27:47,280 --> 01:27:53,440
do the planning for the next agent. And then there's a the development team will then come

1090
01:27:53,440 --> 01:28:00,640
in and look for issues. Yeah, cron, right? Yeah, same thing. Yep. And then it'll address them open

1091
01:28:00,640 --> 01:28:05,520
a PR and then I have a review team. Yeah, come in and review them. And then I do the final review.

1092
01:28:05,520 --> 01:28:09,600
And if something's wrong, it means I fucked up somewhere. Yeah. And I don't blame the agents.

1093
01:28:09,600 --> 01:28:16,160
Yeah. I haven't gotten angry at agents in a long time. Yeah. I never did. I never I never

1094
01:28:16,160 --> 01:28:20,880
believe eight months. No, there's there's never believed in screaming at them. Dude, they have

1095
01:28:20,880 --> 01:28:26,960
done some things. Sometimes like Claude and like a year ago, it would just do things where you just

1096
01:28:26,960 --> 01:28:34,480
thought it was trying to fuck with you. Seriously, I mean, maybe you may lie to you. Oh, no, no,

1097
01:28:34,480 --> 01:28:39,040
I think that I think that you go into the code. And it's like, like, yeah, I can't fix. Yeah,

1098
01:28:39,040 --> 01:28:43,520
tell operator it's fixed or something. The gaslighting the gaslighting. That's for sure.

1099
01:28:43,520 --> 01:28:48,880
But it's funny how we are rebuilding the same structures that we landed on in regular software

1100
01:28:48,880 --> 01:28:52,880
development. Yeah. But now instead of humans, we have agents, but we still have specialization.

1101
01:28:52,880 --> 01:28:56,400
We still have communication. We still have issue tracking. We still have milestones. We still have

1102
01:28:56,400 --> 01:29:00,320
specifications, all those kind of things. And I think that's why you're especially good at all

1103
01:29:00,320 --> 01:29:05,520
this stuff, because like you said, you started at a very early age working with teams and working

1104
01:29:05,520 --> 01:29:09,680
with teams that come from other cultures, speaking other languages and so on. And then you have to do

1105
01:29:10,320 --> 01:29:15,360
all this stuff properly. Like you have to specify all the things properly. You have to test stuff

1106
01:29:15,360 --> 01:29:20,480
properly. You have to do all the other things. Absolutely. I was pretty bad at testing, though,

1107
01:29:20,480 --> 01:29:25,440
until like the late 2010s. Yeah, I hated doing it. There's a there's a time and a place for

1108
01:29:25,440 --> 01:29:30,000
everything. I still for my vibe coded slop. I still don't test anything because I feel like

1109
01:29:30,000 --> 01:29:34,400
it pollutes the context and pollutes everything. And I just like no tests. It's one of the rules

1110
01:29:34,400 --> 01:29:39,040
I have like never write tests ever. That's hilarious. I prefer. Well, it depends on what

1111
01:29:39,040 --> 01:29:43,280
I'm working on. Right. If it's UX or interface, none of my stuff is important. That's why I can't

1112
01:29:44,240 --> 01:29:49,360
get away with it. But but speaking of that, you mentioned one thing that you gate using

1113
01:29:49,360 --> 01:29:53,680
LLM slop detection. Oh, yeah. So talk to me about that. That's pretty simple. I mean,

1114
01:29:53,680 --> 01:29:59,840
it was like a couple months ago, a library got popular called AI slop scan.

1115
01:30:00,400 --> 01:30:06,240
And it works pretty well. And that one's built only for JavaScript. I found the one I was talking

1116
01:30:06,240 --> 01:30:11,440
about for Rust that was on crates, and I shared it in the gist, but I don't remember it right now.

1117
01:30:13,040 --> 01:30:19,920
I use that in my agents.md. I use that in my CI, and it basically prevents...

1118
01:30:20,560 --> 01:30:26,720
Ah, nice. In the CI, that's awesome. So pull request won't go green until it passes the slot.

1119
01:30:27,680 --> 01:30:30,400
Yeah, that's awesome. That's great. I'll add that.

1120
01:30:30,400 --> 01:30:34,800
Yes, you need to. It makes a world of difference, because every time you add slop,

1121
01:30:34,800 --> 01:30:37,680
you're adding context poison. Yeah, forever, basically.

1122
01:30:37,680 --> 01:30:42,640
Yeah, and until you spend three days getting rid of it. There is nothing more difficult

1123
01:30:43,200 --> 01:30:47,520
than renaming a term in a code base. The agents will come back to you and be like,

1124
01:30:47,520 --> 01:30:51,680
okay, yeah, the term doesn't exist anywhere. And then a week later, it pops up again,

1125
01:30:51,680 --> 01:30:58,480
and you're like, wait, we did this. It's like, oh, wait, no, no, the function signatures still

1126
01:30:58,480 --> 01:31:02,880
have it. Oh, okay, okay. Go through all the signatures of the functions and the properties

1127
01:31:03,520 --> 01:31:06,640
and every parameter of everything you can find and get rid of it. And then it's like,

1128
01:31:06,640 --> 01:31:10,080
cool, I got rid of it. And then a week later, it pops right back up.

1129
01:31:10,080 --> 01:31:12,880
Naming is still one of the main problems when it comes to development.

1130
01:31:12,880 --> 01:31:15,840
God, it's the worst. The worst, man.

1131
01:31:15,840 --> 01:31:18,000
The more things change, the more they stay the same.

1132
01:31:18,800 --> 01:31:23,360
And that word could just, its meaning could screw you. It's like context poison.

1133
01:31:25,520 --> 01:31:34,160
Yeah, the slop scan, that has been a game changer for sure. That makes reviews easier.

1134
01:31:34,160 --> 01:31:39,680
The code quality stays more consistent because the code becomes the context at a certain point

1135
01:31:39,680 --> 01:31:45,440
in the project. And it defines the patterns that every agent uses. And when there's good patterns

1136
01:31:45,440 --> 01:31:52,400
already in the code, it produces good code. Also behavioral, test-driven development,

1137
01:31:52,400 --> 01:31:56,960
behavior-driven development. I've been doing that a lot. And that also works really,

1138
01:31:56,960 --> 01:32:02,320
really, really well. Not at the beginning of the project though, but at a certain point,

1139
01:32:02,320 --> 01:32:10,320
it starts to create certainty behind every single action. They don't fake the tests.

1140
01:32:10,320 --> 01:32:14,640
When they write the tests after the functionality, they fake the tests.

1141
01:32:14,640 --> 01:32:19,520
I'm a big believer in opponent processing. You want to have a specialized tester,

1142
01:32:19,520 --> 01:32:23,840
and you want to have a specialized implementation guy, and they must not be the same guys.

1143
01:32:23,840 --> 01:32:27,200
Yeah, absolutely. They have to be different. And even different models,

1144
01:32:27,920 --> 01:32:31,200
some diversity in the way they approach the problem is really helpful.

1145
01:32:31,200 --> 01:32:35,520
Yeah, 100%. No, I love that everyone is figuring out similar patterns and

1146
01:32:36,320 --> 01:32:39,200
and the same way of getting shit done.

1147
01:32:41,760 --> 01:32:46,880
Last question from my side. How do you think about running stuff on bare metal,

1148
01:32:46,880 --> 01:32:50,560
buying lots of hardware to run models, all those kind of things? Because I'm very close

1149
01:32:50,560 --> 01:32:53,680
to just saying fuck it and buying a bunch of shit.

1150
01:32:53,680 --> 01:32:56,320
Yeah, just dropping 50 to 100 grand.

1151
01:32:56,320 --> 01:32:58,880
Instead of buying a new car, you might as well.

1152
01:32:59,600 --> 01:33:05,280
Um, yeah, I think we need to do it. I mean, I think we should squeeze as much as we can out

1153
01:33:05,280 --> 01:33:08,800
of the subsidized models and services. I mean, the subsidy era will end.

1154
01:33:08,800 --> 01:33:12,320
Yes. And that's why I'm thinking about it. And when it ends, the prices are going to go up.

1155
01:33:12,320 --> 01:33:16,800
Yeah. Yeah. So, yeah, I think we should all be doing it.

1156
01:33:16,800 --> 01:33:19,280
Yeah. You explored any of that stuff?

1157
01:33:19,280 --> 01:33:25,680
Oh, god. Yeah. Oh, yeah. Yeah. Yeah. RTX 6000 Pro, Blackwell, that seems to be the route right now.

1158
01:33:25,680 --> 01:33:34,480
The only limitation is, like, SPI. I met someone in Oslo who was working on getting SPI working

1159
01:33:35,280 --> 01:33:43,040
on the Blackwell cards, the 6000s. And he says that basically it has all of the chips it needs,

1160
01:33:43,040 --> 01:33:47,440
but something's not connected. And last time I talked to him, he mentioned that,

1161
01:33:49,200 --> 01:33:53,840
or when I actually, like, how many layers of tinfoil do I need?

1162
01:33:54,800 --> 01:33:56,400
I assume it's like a jumper, basically.

1163
01:33:57,120 --> 01:33:59,760
How deep does the conspiracy go for that?

1164
01:33:59,760 --> 01:34:01,920
Well, I mean, it's NVIDIA. They're known to do this.

1165
01:34:03,120 --> 01:34:13,760
They arbitrarily limit encodes and decodes on their GTX cards to, like, four.

1166
01:34:13,760 --> 01:34:18,400
But they can totally handle, a 1050 Ti can do, like, 12 or something, but they just limit it

1167
01:34:18,400 --> 01:34:23,280
to four. So when they introduced this limitation, it was because they wanted to sell enterprise

1168
01:34:23,280 --> 01:34:29,760
cards at, you know, 10 times the cost. And someone released a bash script that removes

1169
01:34:29,760 --> 01:34:34,400
the limitation. You just run it when your system starts, and then it removes it, and you're good

1170
01:34:34,400 --> 01:34:35,840
to go. It's like chip tuning your car.

1171
01:34:35,840 --> 01:34:38,080
It's just called NVIDIA patch, I think, if I remember correctly.

1172
01:34:40,400 --> 01:34:46,320
So, yeah, I think everyone should do it. I have explored. I have some hardware waiting for me,

1173
01:34:48,320 --> 01:34:49,520
and I can't wait to get a hold of it.

1174
01:34:50,320 --> 01:34:52,880
Hardware waiting for you at home?

1175
01:34:53,920 --> 01:34:54,880
In the US, yeah.

1176
01:34:57,040 --> 01:35:02,480
So after the court, you'll go do an unboxing video and set stuff up?

1177
01:35:02,480 --> 01:35:02,800
Yeah.

1178
01:35:02,800 --> 01:35:03,200
All right.

1179
01:35:04,480 --> 01:35:10,320
Yeah, I think everyone should. But at the same time, it's sort of like Bitcoin mining,

1180
01:35:10,320 --> 01:35:16,880
or mining in general. It's a massive investment. You can't get attached to it. You have to watch

1181
01:35:16,880 --> 01:35:23,120
the market. You have to cycle your equipment. Otherwise, you're going to lose money. Because

1182
01:35:23,120 --> 01:35:25,600
it's like cost per watt is what you're really looking at, right?

1183
01:35:27,760 --> 01:35:32,640
So, yeah. But to me, it's like, it is going to be a timing issue, because we're still living

1184
01:35:32,640 --> 01:35:38,400
in the subsidy era. It's like, Pablo figured out this hack, how you can use unlimited compute,

1185
01:35:38,400 --> 01:35:44,800
thanks to JetGPT.com. You know, like he built an MCP wrapper on JetGPT. And you can just,

1186
01:35:44,800 --> 01:35:52,160
like for example, analyzing code and so on. He will pipe all his repos through JetGPT.com,

1187
01:35:52,160 --> 01:35:57,920
and it doesn't go towards your plan or anything. And we're still living in crazy times. It's

1188
01:35:57,920 --> 01:36:02,480
because of people like Pablo that do this shit. The AI bubble will pop, you know, like incurring

1189
01:36:02,480 --> 01:36:09,680
costs of like 50k USD per week or something. And there's nothing anyone can do about it. And so

1190
01:36:10,320 --> 01:36:15,760
this can't go on forever. Yeah, token use will have to get economical.

1191
01:36:15,760 --> 01:36:20,800
It does. Yeah, we got to optimize. Everyone's just leaning on compute right now.

1192
01:36:22,000 --> 01:36:26,960
Eventually, I mean, it's already happening that people are optimizing. They're squeezing every

1193
01:36:26,960 --> 01:36:31,040
last bit of power out of small models. That's going to get more and more intense. Things are

1194
01:36:31,040 --> 01:36:36,160
going to get more performant. It will hit a point where these models we're using now are going to

1195
01:36:36,160 --> 01:36:41,440
look ridiculous. It'll be like a mainframe, right? We'll look at it as like the old days.

1196
01:36:41,440 --> 01:36:51,040
You mentioned Oslo. Austin from Austin, he did some research on local models and basically how

1197
01:36:51,040 --> 01:36:55,360
fast they're catching up to the frontier models. And basically what he found is like they're

1198
01:36:55,360 --> 01:37:01,840
getting smaller and cheaper and more competitive faster than anyone basically thinks. Exactly.

1199
01:37:02,800 --> 01:37:07,600
That's what has me buying hardware, basically. I'm very close to pulling the trigger. But

1200
01:37:08,400 --> 01:37:12,320
yeah, no, very exciting times. So yeah, thanks for indulging me.

1201
01:37:13,840 --> 01:37:16,720
What felt like a three hour walk. It's been such a long day.

1202
01:37:17,600 --> 01:37:20,960
I'm so tired. I feel sorry for anyone who had to listen.

1203
01:37:23,600 --> 01:37:29,680
Any last words or we're just gonna end it here? You're excited for Friday? You know what you're

1204
01:37:29,680 --> 01:37:34,880
going to show off? Yeah, I got some ideas. You got some ideas. Yeah, we'll see. We'll see. Me

1205
01:37:34,880 --> 01:37:41,680
not. I'll go sleep. I hope that my subconscious will do the work and something pops up.

1206
01:37:42,960 --> 01:37:44,720
All right. Fantastic.
