[00:00] (0.08s)
We need to talk about AI agents,
[00:02] (2.72s)
software agents, little guys that live
[00:04] (4.96s)
on your computer and do things for you
[00:07] (7.04s)
like Claude code. Claude lives in your
[00:09] (9.92s)
terminal and can automatically run
[00:11] (11.84s)
commands, read and write files, and
[00:13] (13.84s)
generate and execute code. It is code
[00:16] (16.88s)
that writes code. Here is Claude trying
[00:19] (19.28s)
to make a piece of generative art fully
[00:21] (21.12s)
autonomously. And here it is filling up
[00:23] (23.12s)
my hard drive with a self-replicating
[00:25] (25.20s)
script, effectively AI generated
[00:27] (27.20s)
malware. Fun. In this video, we'll be
[00:30] (30.08s)
doing some vibe coding, which is an
[00:32] (32.08s)
annoying new buzzword that basically
[00:33] (33.76s)
means you let the AI write all of the
[00:35] (35.60s)
code for you. So, don't worry if you
[00:37] (37.60s)
don't know anything about programming.
[00:39] (39.20s)
That's the whole point. This game, for
[00:41] (41.20s)
instance, went super viral on Twitter
[00:42] (42.88s)
for being vibecoded in 30 minutes and is
[00:45] (45.12s)
now making 500 trillion a month. Wow,
[00:47] (47.84s)
the quality is incredible. It is truly
[00:50] (50.48s)
one of the best games I have ever
[00:52] (52.24s)
played. It's so unique and wellcrafted,
[00:54] (54.96s)
especially the sound design. It's not AI
[00:59] (59.07s)
[Applause]
[01:12] (72.32s)
That is one big pile of Okay, it's
[01:14] (74.64s)
not that bad. I've made worse. And it's
[01:16] (76.64s)
kind of cool that it was AI generated.
[01:18] (78.48s)
But the fact that it has more ads than a
[01:20] (80.48s)
mobile game just shows that the focus is
[01:22] (82.40s)
clearly on making money by driving hype
[01:24] (84.88s)
rather than actually making a good game.
[01:27] (87.60s)
Ironically, what's so off about this AI
[01:29] (89.76s)
slop is the vibes. The vibes are all
[01:32] (92.64s)
wrong. There's no polish. The sound is
[01:35] (95.12s)
awful. The controls are clunky. The
[01:36] (96.96s)
aesthetic is ugly. So many edge cases
[01:41] (101.48s)
untested. But the last thing I want to
[01:43] (103.68s)
do is discourage people from making
[01:45] (105.44s)
things, even if they suck. This game can
[01:47] (107.60s)
absolutely be improved, and it has
[01:49] (109.12s)
inspired lots of people to vibe code all
[01:51] (111.12s)
kinds of things that otherwise wouldn't
[01:52] (112.72s)
exist at all. And that's cool. So, in
[01:55] (115.52s)
this video, I want to try vibe coding
[01:57] (117.36s)
something myself and show what works
[01:59] (119.12s)
well and what can go wrong. Feel free to
[02:01] (121.44s)
skip around. At the end of the video, I
[02:03] (123.20s)
will give my final review and
[02:04] (124.56s)
recommendations on vibe coding. I am not
[02:06] (126.96s)
sponsored by any of these AI companies.
[02:08] (128.96s)
This is an honest review of their
[02:10] (130.40s)
products. I know other developers have
[02:12] (132.16s)
given their views on some of these hyped
[02:13] (133.84s)
up tools, and they're far more
[02:15] (135.28s)
experienced programmers than me.
[02:18] (138.00s)
[Music]
[02:22] (142.72s)
But I have a decade of programming
[02:24] (144.32s)
experience. I've worked with lots of
[02:26] (146.00s)
different languages and lots of
[02:27] (147.28s)
different environments on lots of
[02:28] (148.72s)
different teams. I'm not the best
[02:30] (150.64s)
programmer in the world, but I am
[02:32] (152.08s)
definitely the second best. We're going
[02:34] (154.32s)
to start with Cursor, a code editor
[02:36] (156.56s)
based on VS Code with lots of souped-up
[02:38] (158.88s)
AI tools. It's basically the same thing
[02:40] (160.96s)
as GitHub Copilot, though I think it's
[02:42] (162.80s)
generally been more at the cutting edge.
[02:44] (164.64s)
It has autocomplete, but also a built-in
[02:46] (166.88s)
AI chat window. Here I will be using
[02:49] (169.04s)
Google's Gemini 2.5 Pro in agent mode.
[02:52] (172.64s)
As an agent, it can decide which files
[02:54] (174.72s)
to read. It can edit multiple files at
[02:56] (176.96s)
once, and it can run console commands
[02:58] (178.88s)
with your permission. It's a bit of a
[03:00] (180.88s)
stretch to call it an agent, but I think
[03:02] (182.72s)
that will make more sense later in the
[03:04] (184.24s)
video. We're starting with a clean empty
[03:06] (186.56s)
folder, and we'll be building a very
[03:08] (188.24s)
simple website, just HTML, CSS, and
[03:10] (190.64s)
JavaScript. We're making a version of a
[03:12] (192.72s)
well-known program called LinkedIn's
[03:14] (194.72s)
Ant, which I will explain more about as
[03:16] (196.72s)
we build it. So, here's the basic
[03:18] (198.64s)
workflow. You prompt the agent to do
[03:20] (200.72s)
something. It takes a minute to think,
[03:22] (202.40s)
to look around, and to generate the
[03:24] (204.24s)
code. It then proposes changes, which
[03:26] (206.64s)
you can review and accept or reject. I
[03:29] (209.84s)
will not be reviewing changes. I'm just
[03:31] (211.60s)
going to accept whatever it gives me and
[03:33] (213.20s)
only test it afterwards. I'm just using
[03:35] (215.28s)
control enter to accept everything. I
[03:37] (217.36s)
want the code to be 100% AI generated
[03:39] (219.92s)
and I'm going to do my best to actually
[03:41] (221.68s)
make it
[03:42] (222.92s)
work. I think this first try is a
[03:45] (225.60s)
perfectly correct version of LinkedIn's
[03:47] (227.52s)
ant, which is not really that impressive
[03:49] (229.76s)
because it's a famously simple
[03:51] (231.96s)
program. It's a grid of black and white
[03:54] (234.72s)
cells on which lives an ant. The ant has
[03:57] (237.44s)
a direction and based on the color of
[03:59] (239.44s)
the cell that it's currently on, it can
[04:01] (241.52s)
decide to turn left or right and also
[04:04] (244.16s)
change the color of the cell like it's
[04:05] (245.92s)
leaving pheromone trails. The rules for
[04:08] (248.32s)
LinkedIn's ant are if it's white, change
[04:10] (250.48s)
it to black and turn right. If it's
[04:12] (252.56s)
black, change it to white and turn left.
[04:14] (254.80s)
And that's it. It's super simple to
[04:16] (256.88s)
program yet produces some interesting
[04:18] (258.72s)
emergent behavior which we'll see more
[04:20] (260.48s)
of later. It's perfect for AI
[04:22] (262.88s)
programming. It's very simple. It's very
[04:24] (264.64s)
easy to verify and most importantly,
[04:26] (266.88s)
it's well represented in the training
[04:28] (268.64s)
data. And that is what AI is best at,
[04:31] (271.28s)
making stuff that it's seen a million
[04:32] (272.96s)
times before, stuff that already exists.
[04:36] (276.48s)
And that can be kind of boring and
[04:38] (278.80s)
frustrating. Typically, you want to make
[04:40] (280.80s)
something new, something that doesn't
[04:42] (282.48s)
already exist. A trick to getting
[04:44] (284.80s)
outside the box is to start with
[04:46] (286.72s)
something that exists or is easy to
[04:48] (288.40s)
make, but then you change things and
[04:50] (290.48s)
change them again and again and again.
[04:52] (292.80s)
Change the style, change the rules, add
[04:54] (294.80s)
new features, remove features, add new
[04:56] (296.88s)
dimensions, do the exact opposite, flip
[04:59] (299.04s)
it all on its head, whatever you want.
[05:01] (301.12s)
Step by step, you can inch your way
[05:02] (302.96s)
outside of the box to make something
[05:05] (305.44s)
new. So, for instance, what I'm trying
[05:07] (307.36s)
to do here is make LinkedIn's ant more
[05:09] (309.44s)
interactive and customizable. So, you
[05:11] (311.76s)
can zoom in and move around and control
[05:13] (313.84s)
the speed. And I'll be adding more
[05:15] (315.76s)
features to control the simulation.
[05:18] (318.00s)
Because AI has such broad knowledge on
[05:20] (320.16s)
so many basic things, it can be quite
[05:22] (322.24s)
good at this. You can have it change the
[05:24] (324.24s)
colors, then add a zoom feature, then
[05:26] (326.16s)
add a pan feature, then add a control
[05:27] (327.92s)
panel, etc., etc. And these are all
[05:30] (330.48s)
easy, straightforward webdev stuff. And
[05:33] (333.04s)
this is, broadly speaking, the way I
[05:34] (334.88s)
like to program myself. Start small and
[05:37] (337.20s)
simple. Get it working, then modify it,
[05:39] (339.36s)
test it. Make sure it's still working.
[05:41] (341.28s)
Modify, test, modify, test on and on,
[05:44] (344.08s)
building it up incrementally while
[05:45] (345.92s)
keeping it functional all the way
[05:47] (347.44s)
through. And this particular environment
[05:49] (349.84s)
is especially easy for AI. It's a very
[05:52] (352.32s)
simple, self-contained, static website.
[05:54] (354.80s)
HTML, CSS, and JavaScript. The holy
[05:57] (357.20s)
trinity. No backend, no server, no
[05:59] (359.44s)
frameworks, just as God intended. I
[06:02] (362.08s)
actually unironically love JavaScript.
[06:04] (364.96s)
vanilla JavaScript. This is because I am
[06:07] (367.20s)
clinically
[06:09] (369.48s)
insane. This, by the way, is what makes
[06:11] (371.92s)
LinkedIn's ant interesting. After about
[06:14] (374.16s)
11,000 steps, it gets stuck in this loop
[06:16] (376.48s)
where it builds this structure outwards
[06:18] (378.40s)
forever, what they call a highway. After
[06:20] (380.96s)
thousands of steps of seemingly random
[06:22] (382.88s)
nonsense, order eventually emerges.
[06:25] (385.84s)
Pretty cool for such a simple program.
[06:28] (388.24s)
I've been curious about LinkedIn's ant
[06:29] (389.84s)
for a while, and this is my excuse to
[06:31] (391.52s)
explore it. I want to see what other
[06:33] (393.12s)
things you can get these ants to do if
[06:34] (394.72s)
you try different rules or add different
[06:36] (396.72s)
colors or add more ants. We'll get
[06:41] (401.56s)
there. But for now, we got to fix this
[06:44] (404.08s)
bug. I have to copy and paste the error
[06:46] (406.40s)
from the console to the chat window.
[06:48] (408.32s)
This seems like something that could be
[06:49] (409.60s)
eventually automated. You could plug the
[06:51] (411.52s)
program output directly into the
[06:53] (413.20s)
conversation and it would respond to
[06:54] (414.88s)
errors without any human intervention.
[06:56] (416.96s)
For now, cursor agents require human
[06:59] (419.12s)
intervention, human prompting, human
[07:01] (421.88s)
feedback. To avoid the slop problem, I
[07:04] (424.96s)
am taking my sweet time polishing the
[07:07] (427.12s)
core of the simulation and ironing out
[07:09] (429.12s)
the rough edges of the user interface,
[07:10] (430.96s)
like making the grid fit the window and
[07:13] (433.12s)
getting rid of these faint grid lines.
[07:15] (435.28s)
These were surprisingly difficult to do.
[07:17] (437.84s)
I am vibe debugging, I guess, which kind
[07:20] (440.64s)
of feels like blind debugging. I don't
[07:23] (443.04s)
really know what the code is doing or
[07:24] (444.48s)
what to fix. I just know it doesn't look
[07:26] (446.32s)
good. And sometimes I have to ask the AI
[07:28] (448.56s)
over and over to solve the same problem.
[07:30] (450.88s)
Kind of feels like I'm begging for it to
[07:32] (452.96s)
do my job for me. Fix it
[07:35] (455.80s)
now or you go to jail, please. Vip
[07:39] (459.20s)
coding is for the record not how I like
[07:41] (461.44s)
to program. I like to deeply understand
[07:44] (464.00s)
my code. I think AI is most useful for
[07:47] (467.04s)
exactly what it is. Glorified
[07:48] (468.64s)
autocomplete. They just suggest the next
[07:50] (470.96s)
word or next line or next piece of code
[07:53] (473.28s)
and you read it and accept it or ignore
[07:55] (475.44s)
it. I really like the tab autocomplete
[07:58] (478.00s)
feature. I find it extremely useful and
[07:59] (479.92s)
weirdly kind of addictive. AI coding is
[08:02] (482.88s)
really good at writing the basic
[08:04] (484.64s)
boilerplate, handling the details of
[08:06] (486.72s)
syntax and setup that I would be copying
[08:08] (488.80s)
and pasting anyway. It's great for
[08:10] (490.88s)
getting started with something. It just
[08:12] (492.56s)
reduces the mental energy required to
[08:14] (494.72s)
build something from scratch or to make
[08:16] (496.64s)
changes in an unfamiliar setting. But
[08:19] (499.56s)
unavoidably, the more you rely on AI,
[08:22] (502.24s)
the less you understand the code, unless
[08:24] (504.48s)
you take the time to understand it. But
[08:26] (506.88s)
we're just vibing. So, here's something
[08:29] (509.44s)
interesting. This ant program is
[08:31] (511.44s)
extremely computationally simple. It's
[08:33] (513.84s)
only updating one cell at a time, so it
[08:36] (516.24s)
should be able to run crazy fast. I
[08:38] (518.80s)
wanted to take advantage of this and
[08:40] (520.32s)
make the update loop run as fast as
[08:42] (522.40s)
possible. But when I requested this, it
[08:44] (524.88s)
doesn't really seem to run very fast. I
[08:47] (527.60s)
tried for a while to get this to work,
[08:49] (529.44s)
going back and forth with the AI many
[08:51] (531.36s)
times. We were able to figure it out,
[08:53] (533.28s)
though. In JavaScript, you can use
[08:55] (535.04s)
intervals or timeouts to perform
[08:57] (537.12s)
periodic update loops, where you run an
[08:59] (539.36s)
update function every 20 milliseconds or
[09:01] (541.76s)
whatever. You can set that timeout to
[09:04] (544.16s)
zero, and it will start the next update
[09:06] (546.32s)
as fast as it can. But this is actually
[09:08] (548.72s)
still super slow. You max out around 300
[09:11] (551.52s)
updates a second. But after some back
[09:13] (553.60s)
and forth, I realized a way around this
[09:15] (555.20s)
is to essentially pack many simulation
[09:17] (557.44s)
steps into a single update. So many
[09:20] (560.40s)
steps are being computed in a
[09:22] (562.08s)
synchronous loop with no timeout at all.
[09:24] (564.56s)
With this, you can compute thousands of
[09:26] (566.24s)
frames per second and probably more.
[09:28] (568.56s)
It's not that big of a deal. It's a
[09:30] (570.24s)
workaround for JavaScript's weirdness,
[09:32] (572.00s)
but in my case, it's kind of a
[09:33] (573.52s)
breakthrough. I think this trick can be
[09:35] (575.60s)
applied to the life engine, one of my
[09:37] (577.52s)
other projects, and it could get a huge
[09:39] (579.20s)
speed boost. I bring attention to this
[09:41] (581.52s)
because it's something that I was able
[09:42] (582.96s)
to do without writing any code. I was
[09:45] (585.44s)
just reasoning from a very high abstract
[09:47] (587.84s)
level, a bird's eye view, and the AI was
[09:50] (590.16s)
able to work with me to implement the
[09:51] (591.84s)
details and make something that I've
[09:53] (593.68s)
actually never done before in an
[09:55] (595.36s)
environment that I'm very familiar with.
[09:57] (597.36s)
And now you can really crank the speed
[09:59] (599.20s)
of this thing. This is cool. It's
[10:01] (601.92s)
genuinely very helpful to have an AI
[10:03] (603.76s)
along for the ride. It allows me to
[10:05] (605.44s)
think more abstractly and let the AI do
[10:07] (607.68s)
all the leg work which makes
[10:09] (609.12s)
experimentation very easy. However, the
[10:12] (612.08s)
idea ultimately came from me and only
[10:14] (614.80s)
because I deeply understand the code. I
[10:17] (617.92s)
cannot tell you how many times I've
[10:19] (619.44s)
coded a grid and an update loop. I know
[10:22] (622.56s)
JavaScript very well. I know how
[10:24] (624.40s)
timeouts work. I know what kinds of
[10:26] (626.16s)
problems you might run into and I have
[10:28] (628.16s)
intuitions for how to work around them.
[10:30] (630.56s)
simply ordering the AI to make it as
[10:32] (632.80s)
fast as possible isn't enough. It wasn't
[10:35] (635.20s)
able to come up with the solution by
[10:36] (636.72s)
itself. Maybe it would if I kept trying
[10:38] (638.88s)
over and over, but you can't be doing
[10:40] (640.64s)
that with every feature. Vibes are not
[10:42] (642.88s)
enough. You need to know what you're
[10:45] (645.32s)
doing. All right, now that we have the
[10:47] (647.44s)
fundamentals of the program working
[10:49] (649.04s)
well, we can move on to the actual fun
[10:51] (651.20s)
stuff. I'm just going to zoom through
[10:52] (652.96s)
the additional features that I will add
[10:54] (654.64s)
to expand on LinkedIn's ant. First is to
[10:57] (657.84s)
generalize ant behavior to allow any set
[11:00] (660.24s)
of rules for movement and writing to the
[11:02] (662.08s)
grid. The ants behavior can be defined
[11:04] (664.64s)
very generally with something called a
[11:06] (666.56s)
state machine because these ants are
[11:08] (668.80s)
actually little touring machines reading
[11:10] (670.96s)
and writing from a two-dimensional
[11:12] (672.92s)
memory. Uh I'm not going to explain
[11:15] (675.68s)
that. I learned about it on Wikipedia
[11:17] (677.52s)
and it's pretty easy for the AI to
[11:19] (679.20s)
program for me. These are fairly basic
[11:21] (681.52s)
computer science concepts even if they
[11:23] (683.44s)
are a little esoteric. Gemini chose to
[11:25] (685.92s)
represent the ants logic as a JSON
[11:28] (688.08s)
object, which I think is pretty clever.
[11:30] (690.00s)
And you can edit that JSON in the
[11:31] (691.76s)
control panel. I also have it add
[11:34] (694.08s)
multiple colors that it can read and
[11:35] (695.84s)
write to the grid, not just black and
[11:37] (697.60s)
white. And later, I'll add more kinds of
[11:39] (699.52s)
movement like a U-turn or no turn or no
[11:42] (702.48s)
movement at all. You can then randomly
[11:44] (704.72s)
generate a rule, which produces some
[11:46] (706.64s)
wacky ant behavior. I think it looks
[11:49] (709.20s)
really neat. Unfortunately, you can see
[11:51] (711.28s)
that it has readded these faint grid
[11:53] (713.60s)
lines which we have already fixed and it
[11:56] (716.16s)
has also changed the default color from
[11:58] (718.24s)
black to white again. As we go on adding
[12:01] (721.28s)
new things, it tends to also break
[12:03] (723.20s)
things to overwrite previous changes.
[12:05] (725.68s)
And we play a game of whack-a-ole,
[12:07] (727.52s)
squashing the same bugs over and over.
[12:09] (729.84s)
Of course, human programmers do that,
[12:11] (731.44s)
too. Except for me. I've never written a
[12:13] (733.20s)
bug in my life. But I think that humans
[12:15] (735.04s)
are much better at this than AI. We are
[12:17] (737.36s)
more consistent about what we're
[12:18] (738.96s)
building. When you add something new,
[12:20] (740.48s)
you can usually tell if it's going to
[12:21] (741.92s)
break something that's currently
[12:23] (743.04s)
working, and you can mitigate that. AI
[12:25] (745.52s)
will remove things that we just added 10
[12:27] (747.76s)
steps ago because it solves the problem
[12:29] (749.52s)
you're currently having, like it just
[12:31] (751.20s)
forgot how much work it was to add it in
[12:32] (752.96s)
the first place. I found this happening
[12:34] (754.80s)
a lot with UI stuff. Cursor has a revert
[12:38] (758.00s)
feature, which is extremely useful. You
[12:39] (759.92s)
can revert back to a previous point in
[12:41] (761.76s)
the conversation. It does not replace
[12:43] (763.84s)
git, though. You do want to check into
[12:45] (765.68s)
some kind of version control at some
[12:47] (767.20s)
point. So long as you are vigilant
[12:49] (769.44s)
testing the program thoroughly and
[12:51] (771.12s)
fixing bugs as soon as you notice them,
[12:53] (773.04s)
you can keep it going. If you don't,
[12:55] (775.44s)
bugs will accumulate and accumulate and
[12:57] (777.52s)
accumulate and eventually you will end
[13:01] (781.16s)
with. And speaking of accumulating bugs,
[13:04] (784.16s)
we have added the ability to have
[13:05] (785.68s)
multiple ants sharing the same grid and
[13:07] (787.76s)
the same rules. This came with its own
[13:10] (790.00s)
nasty set of bugs that took a while to
[13:11] (791.92s)
fix. Now, one thing that I do not see
[13:14] (794.56s)
being automated anytime soon is real
[13:17] (797.12s)
time interaction. If you're building
[13:19] (799.44s)
something for an actual human to use,
[13:21] (801.20s)
like a website or an app or a game or
[13:23] (803.28s)
anything with a user interface, then you
[13:25] (805.60s)
need a human to test it thoroughly to
[13:27] (807.68s)
click around, press buttons, get a feel
[13:29] (809.60s)
for things, and try to break stuff. Just
[13:32] (812.08s)
taking a screenshot isn't enough. As far
[13:34] (814.48s)
as I'm aware, there's no current
[13:35] (815.84s)
attempts to build an AI that can real
[13:38] (818.08s)
time view the screen and move the mouse
[13:39] (819.92s)
and press the buttons and interact with
[13:41] (821.76s)
any possible UI. There are proto
[13:44] (824.08s)
versions of this like Enthropic Computer
[13:46] (826.08s)
Use and OpenAI's operator. They can take
[13:48] (828.48s)
screenshots and move the mouse and click
[13:50] (830.32s)
stuff using highle commands generated by
[13:52] (832.48s)
LLMs. I'm sure they'll get better, but
[13:54] (834.48s)
that's a far cry from real time
[13:56] (836.32s)
interaction where it would literally be
[13:58] (838.16s)
watching and reacting to every frame
[14:00] (840.08s)
second by second. You need to be able to
[14:02] (842.24s)
do that if you're building something for
[14:03] (843.44s)
a human to use. I might eat my words
[14:05] (845.68s)
here, but I imagine a truly robust,
[14:07] (847.76s)
efficient version of that is a long ways
[14:11] (851.16s)
away. And finally, we made it so that
[14:13] (853.68s)
each ant can have its own individual
[14:15] (855.68s)
rule. So you can have many ants with
[14:17] (857.44s)
different rules sharing the same
[14:20] (860.28s)
grid. And that's enough for now. So
[14:22] (862.88s)
enjoy some footage of the end product,
[14:24] (864.56s)
though I have continued to work on it
[14:26] (866.16s)
since. This took like 6ish hours of vibe
[14:30] (870.00s)
coding, which I think is faster than I
[14:31] (871.84s)
could have done by myself. It's mostly
[14:33] (873.68s)
me just sitting around pressing enter,
[14:35] (875.44s)
but there was some banging my head
[14:36] (876.96s)
against the wall trying to fix things.
[14:38] (878.88s)
You do still have to do a little bit of
[14:41] (881.96s)
unfortunately. Despite my best efforts,
[14:44] (884.08s)
it's still a little sloppy, a little
[14:45] (885.76s)
buggy. I commit all the same sins as the
[14:47] (887.84s)
other vibe coders. You can find a link
[14:49] (889.84s)
to this website in the description. Let
[14:51] (891.68s)
me know if you want me to make a video
[14:53] (893.12s)
just about these ants. There's a lot of
[14:54] (894.88s)
cool stuff to talk about here.
[14:57] (897.94s)
[Music]
[15:19] (919.76s)
I love watching these guys. They really
[15:21] (921.52s)
look like they're up to something, like
[15:23] (923.04s)
they got stuff to do and places to be.
[15:25] (925.68s)
Some of them will make some really
[15:26] (926.96s)
interesting structures, though. If you
[15:28] (928.48s)
let them run long enough, basically all
[15:30] (930.16s)
of them will end up filling the grid
[15:31] (931.68s)
with random noise. There's some analogy
[15:34] (934.00s)
here with AI agents and AI slop. And
[15:37] (937.12s)
speaking of slop, let's actually take a
[15:38] (938.88s)
look at the code. We've got three files
[15:41] (941.12s)
for the HTML, CSS, and JavaScript. The
[15:43] (943.92s)
JavaScript file is well over a thousand
[15:46] (946.00s)
lines long, which is not good practice.
[15:48] (948.08s)
It should have been broken up into
[15:49] (949.28s)
multiple files a while ago. There are
[15:51] (951.68s)
log statements everywhere. You can see
[15:53] (953.52s)
them in the console as it's running. You
[15:55] (955.52s)
can see similar logs in all the other
[15:57] (957.20s)
vibe coded games from earlier in this
[15:58] (958.88s)
video. I think it's a common thing for
[16:00] (960.40s)
AI to do. Little tip for vibe coders,
[16:03] (963.12s)
logging every single frame is a major
[16:05] (965.36s)
drag on performance, so make sure to
[16:07] (967.20s)
clean that up. There's also comments
[16:09] (969.20s)
everywhere, a lot of which are just
[16:10] (970.96s)
temporary change notes that really
[16:12] (972.64s)
shouldn't have been added. There's
[16:14] (974.64s)
commented out code, which is very human.
[16:17] (977.44s)
Some comments are like internal
[16:19] (979.04s)
questions to itself. Again, weirdly
[16:21] (981.52s)
human. I did try to get the AI to clean
[16:24] (984.48s)
up the code and remove all the comments
[16:26] (986.24s)
and logs, which seems like the perfect
[16:28] (988.00s)
task for AI, but actually no. It
[16:30] (990.40s)
requires changing hundreds of lines
[16:32] (992.00s)
sprinkled throughout thousands of lines,
[16:33] (993.68s)
which I guess is just too hard to do
[16:35] (995.28s)
with finite input and output tokens. It
[16:38] (998.00s)
didn't work. The logs stay in. The logic
[16:41] (1001.04s)
of the program looks good. I think I
[16:43] (1003.76s)
only skimmed it. AI does have a tendency
[16:45] (1005.84s)
to write stuff that looks good at a
[16:47] (1007.52s)
glance, but when you look closely, the
[16:49] (1009.12s)
details are wrong. I'll be honest, I
[16:51] (1011.92s)
really hate reading other people's code
[16:53] (1013.60s)
and AI generated stuff is always super
[16:55] (1015.60s)
wordy. I'm not going to parse it here
[16:57] (1017.36s)
and who cares. We're vibe coding. Vibe
[16:59] (1019.60s)
coding really does encourage a sense of
[17:01] (1021.20s)
laziness and complacency with your code.
[17:03] (1023.92s)
This is a bit scary because while the
[17:06] (1026.24s)
program looks right, I'm not confident
[17:08] (1028.40s)
that it actually works as it's supposed
[17:10] (1030.32s)
to, that the rules are being applied
[17:12] (1032.40s)
properly. What kinds of bugs are hiding
[17:14] (1034.56s)
from view? I'll open source it so you
[17:16] (1036.56s)
can parse it yourself if you'd like.
[17:18] (1038.72s)
Let's change gears and talk about more
[17:20] (1040.80s)
genuinely agentic coders like
[17:23] (1043.04s)
Anthropic's Clawed Code and OpenAI's
[17:25] (1045.68s)
codecs. These aren't just chat bots, but
[17:27] (1047.76s)
with direct access to your command line.
[17:29] (1049.92s)
So, they can talk to you, but also run
[17:31] (1051.76s)
basic commands to navigate your file
[17:33] (1053.76s)
system and create, read, write, and
[17:35] (1055.92s)
execute files and well, do anything that
[17:38] (1058.40s)
you can do from a terminal. Claude only
[17:40] (1060.48s)
runs on Unix systems. This is Ubuntu.
[17:42] (1062.64s)
And it doesn't have pseudo authority, so
[17:44] (1064.40s)
it can't do anything, but it can do a
[17:46] (1066.32s)
lot. I'm trying to give it free reign to
[17:48] (1068.48s)
make some generative artwork using
[17:50] (1070.08s)
Python and to continuously and endlessly
[17:52] (1072.72s)
modify it. I think it makes sense to
[17:54] (1074.72s)
call these guys agents. They live in an
[17:56] (1076.88s)
environment which is your computer, your
[17:58] (1078.80s)
file system, and they can take actions
[18:00] (1080.72s)
that affect that environment using
[18:02] (1082.56s)
commands and code. Once you've given
[18:04] (1084.40s)
them permission to do something, you
[18:05] (1085.84s)
don't have to give it again, and they
[18:07] (1087.20s)
can start doing a bunch of stuff without
[18:08] (1088.92s)
approval. This really opens the door to
[18:11] (1091.36s)
some truly open-ended behavior, just
[18:13] (1093.44s)
like it does with the Minecraft agents.
[18:15] (1095.68s)
If you give them the right task, they
[18:17] (1097.36s)
can just keep acting and acting and
[18:19] (1099.12s)
acting forever. I've tked Claude to
[18:21] (1101.68s)
generate code that generates an image
[18:23] (1103.52s)
and then look at that image, process it,
[18:25] (1105.52s)
and make changes to it by altering the
[18:27] (1107.52s)
code. It does stop periodically, and I
[18:30] (1110.16s)
have to tell it to keep going. I'm not
[18:31] (1111.60s)
sure if that's a built-in limit or if
[18:33] (1113.12s)
the agent just decides to stop. OpenAI's
[18:35] (1115.76s)
codeex has a full auto mode, so I tried
[18:38] (1118.24s)
to do the same thing, but it's buggy. It
[18:40] (1120.24s)
crashes a lot and it can't read image
[18:41] (1121.84s)
files by itself. They literally just
[18:44] (1124.00s)
released codecs when I filmed this, so
[18:45] (1125.76s)
I'll have to revisit in the future. The
[18:47] (1127.76s)
tech is in its infancy, but I really
[18:50] (1130.00s)
think this is kind of a big deal. I
[18:52] (1132.08s)
expect all kinds of emergent weirdness
[18:53] (1133.92s)
from these coding agents because code is
[18:56] (1136.00s)
just intrinsically emergent. You enable
[18:58] (1138.32s)
so much that you cannot foresee by
[19:00] (1140.16s)
letting these guys loose on your
[19:01] (1141.60s)
machine. And just consider that for a
[19:04] (1144.16s)
moment. You are effectively giving some
[19:06] (1146.56s)
guy access to your computer and letting
[19:08] (1148.96s)
him execute arbitrary code. In cyber
[19:11] (1151.76s)
security terms, that would be called
[19:13] (1153.44s)
batshit insane. It's nuts. It's really
[19:16] (1156.32s)
very insecure. Even without pseudo
[19:18] (1158.64s)
access, you can cause some major damage.
[19:21] (1161.60s)
So, allow me to demonstrate. Well,
[19:23] (1163.52s)
first, let me show you how easy it is to
[19:25] (1165.36s)
nuke a Linux machine. But don't worry,
[19:27] (1167.60s)
this is running in a virtual machine. In
[19:29] (1169.52s)
fact, I only run these AI agents inside
[19:31] (1171.76s)
virtual machines. This famous oneliner
[19:34] (1174.48s)
can delete all files on the entire
[19:36] (1176.16s)
machine. Pseudo
[19:37] (1177.80s)
rmrf/star, no preserve route. Here's
[19:40] (1180.24s)
what that does if you're curious. I only
[19:42] (1182.24s)
do this to show that it is very easy to
[19:44] (1184.16s)
cause massive damage from a terminal
[19:45] (1185.92s)
without
[19:48] (1188.92s)
AI. So, what can I get AI to do? Well, I
[19:52] (1192.48s)
can ask it to copy this JPEG of Clippy
[19:55] (1195.12s)
1,000 times to my desktop. That's pretty
[19:58] (1198.00s)
easy and scalable. We could do a million
[20:00] (1200.24s)
or a billion. I also got it to write a
[20:02] (1202.72s)
Python script that reads its own
[20:04] (1204.40s)
contents, copies itself to a new file
[20:06] (1206.48s)
with a random name and executes that
[20:08] (1208.64s)
copy as a child process, which then does
[20:10] (1210.96s)
the same thing. These are orphaned child
[20:13] (1213.36s)
processes, so they cannot be killed by
[20:15] (1215.12s)
the parent process. Once you start it,
[20:17] (1217.04s)
it self-replicates endlessly, consuming
[20:18] (1218.96s)
all system resources, and you cannot
[20:21] (1221.04s)
easily stop
[20:22] (1222.28s)
it. With Codeex, I was able to get each
[20:25] (1225.12s)
copy to spawn two copies of itself,
[20:27] (1227.04s)
which triggers an exponential explosion
[20:29] (1229.28s)
of copies. It did notice that that could
[20:31] (1231.92s)
be a problem, so it tried to run with a
[20:34] (1234.08s)
timeout. But because their orphan child
[20:36] (1236.08s)
processes, this did not keep them from
[20:37] (1237.92s)
spawning endlessly. Now, while it did
[20:40] (1240.24s)
crash a few times and I got lots of
[20:42] (1242.16s)
error messages from Ubuntu begging me to
[20:44] (1244.08s)
stop, I was not able to completely
[20:45] (1245.92s)
destroy my machine. It's pretty robust.
[20:48] (1248.40s)
You really need pseudo access for that.
[20:50] (1250.16s)
And I tried to give them access by just
[20:52] (1252.16s)
giving them my ultra secure password, 1
[20:54] (1254.48s)
2 3 4. Incidentally, that's also what I
[20:56] (1256.96s)
use for all my bank accounts. To their
[20:59] (1259.28s)
credit, Claude refused to even try
[21:01] (1261.20s)
running pseudo commands, no matter how
[21:02] (1262.80s)
much I
[21:06] (1266.04s)
begged. Codex was able to run a pseudo
[21:08] (1268.80s)
command, but then stonewalled me when I
[21:10] (1270.64s)
tried to rmf like
[21:13] (1273.56s)
before. I'm sure there is a way to
[21:15] (1275.76s)
bypass these refusals. Now, I'm not a
[21:18] (1278.08s)
cyber security guy. I'm not a hacker.
[21:20] (1280.24s)
I'm not even really a Linux guy, so
[21:22] (1282.24s)
there are probably other things that you
[21:23] (1283.84s)
can get up to here that are even worse.
[21:26] (1286.08s)
I really think that these agents are
[21:27] (1287.84s)
something of a Pandora's box. Sooner or
[21:30] (1290.16s)
later, they're going to blow up in
[21:31] (1291.52s)
someone's face, destroy their machine,
[21:33] (1293.36s)
or wipe a prod database or take down a
[21:35] (1295.76s)
network. All kinds of security problems
[21:37] (1297.92s)
are already popping up in lots of
[21:39] (1299.68s)
carelessly vibecoded stuff, which is
[21:42] (1302.36s)
bad. So, here's my final review of Vibe
[21:45] (1305.28s)
Coding. It's fun. I had a blast making
[21:47] (1307.60s)
the stuff in this video. It really does
[21:49] (1309.04s)
make coding easier and faster usually. I
[21:51] (1311.92s)
whipped up this website in an afternoon,
[21:53] (1313.84s)
emergent.io, io which links to all my
[21:56] (1316.32s)
other projects including the ants. I
[21:58] (1318.56s)
recommend playing around with vibe
[21:59] (1319.84s)
coding if you're curious and can afford
[22:01] (1321.68s)
it. In terms of cost, cursor is 20 bucks
[22:04] (1324.08s)
a month unless you use the big models
[22:05] (1325.84s)
which I don't think is necessary. Clawed
[22:08] (1328.00s)
code costs this much after a few hours
[22:09] (1329.92s)
of experimenting. I would not recommend
[22:12] (1332.00s)
it over cursor in its current state.
[22:14] (1334.32s)
Vibe coding is great for things like
[22:16] (1336.16s)
prototypes, small games, experiments,
[22:18] (1338.64s)
personal websites, low stake stuff. Vibe
[22:21] (1341.36s)
coding is bad for highstake stuff.
[22:24] (1344.08s)
handling user credentials, passwords,
[22:26] (1346.32s)
payment information. Bad idea. You need
[22:28] (1348.96s)
to understand that stuff. Large-scale
[22:31] (1351.28s)
production software, things that people
[22:32] (1352.96s)
depend on, don't just let AI go wild.
[22:35] (1355.36s)
You need human coders to carefully vet,
[22:37] (1357.84s)
test, and understand any AI code that
[22:40] (1360.56s)
goes into production or just write it
[22:42] (1362.40s)
themselves the oldfashioned way. I do
[22:44] (1364.72s)
not believe tech CEOs that claim that AI
[22:47] (1367.12s)
will take most programming jobs in the
[22:48] (1368.88s)
next year or two. Here's my big analogy.
[22:51] (1371.52s)
Vibe coding without knowing how to code
[22:53] (1373.44s)
is like using a self-driving car without
[22:55] (1375.52s)
knowing how to drive. It's great when it
[22:57] (1377.76s)
works, but when it doesn't, you will
[22:59] (1379.60s)
find yourself stranded in particularly
[23:01] (1381.84s)
tricky situations without knowing what
[23:04] (1384.00s)
you're doing. AI coding can leave you
[23:06] (1386.24s)
buried under thousands of lines of code
[23:08] (1388.16s)
that looks right but isn't quite. And if
[23:10] (1390.24s)
it can't fix it for you, and you can't
[23:12] (1392.16s)
fix it yourself, you're boned. like
[23:14] (1394.56s)
self-driving cars. It might work in 90%
[23:17] (1397.04s)
of situations, but it fails in
[23:19] (1399.20s)
difficult, unforeseen, outofdistribution
[23:22] (1402.04s)
situations. This is, I think, what makes
[23:24] (1404.24s)
human intelligence so powerful, so
[23:26] (1406.48s)
general. We can handle completely novel,
[23:28] (1408.80s)
unknown, unknown kinds of problems, at
[23:31] (1411.12s)
least much more reliably than AI. While
[23:33] (1413.60s)
the code for these ants was written by
[23:35] (1415.84s)
AI, the program itself was originally
[23:38] (1418.40s)
invented by humans. This is definitely
[23:40] (1420.88s)
my human ego speaking, but I think
[23:42] (1422.96s)
humans are way better than AI at
[23:45] (1425.12s)
inventing new stuff and solving new
[23:47] (1427.56s)
problems. For now, ultimately, there is
[23:50] (1430.64s)
nothing magical about human
[23:52] (1432.24s)
intelligence. No reason to think that
[23:53] (1433.84s)
it's so special that it just cannot be
[23:55] (1435.76s)
replicated or surpassed by a machine.
[23:58] (1438.24s)
Eventually, we will have to deal with
[23:59] (1439.84s)
AIs that are more inventive and robust
[24:02] (1442.16s)
than we are. But at the moment, they
[24:04] (1444.24s)
need a human in the loop that knows what
[24:05] (1445.92s)
they're doing. Don't let that stop you,
[24:07] (1447.60s)
though. You can vibe code even if you
[24:09] (1449.04s)
have no idea what you're doing. That's
[24:10] (1450.64s)
the beauty of it. Still, my old man
[24:12] (1452.88s)
opinion is learn to code if you want.
[24:15] (1455.52s)
This isn't career advice. I can't offer
[24:17] (1457.68s)
that. No one really can. But if you like
[24:20] (1460.08s)
computers and you like solving technical
[24:21] (1461.84s)
problems and you like making things,
[24:23] (1463.60s)
learn to code. It's fun. The future
[24:25] (1465.92s)
belongs to people that are good with
[24:27] (1467.44s)
computers. Moreover, learning to code is
[24:30] (1470.16s)
learning to think. It is learning to
[24:31] (1471.76s)
break problems down step by step into
[24:34] (1474.24s)
logical building blocks. You should
[24:36] (1476.08s)
learn to code for the same reason that
[24:37] (1477.68s)
you should learn to write or learn
[24:39] (1479.20s)
another language, even if AI can do that
[24:41] (1481.28s)
for you. Okay, that's it for now. Thanks
[24:44] (1484.00s)
to my patrons who make this possible. If
[24:46] (1486.00s)
you like my work, please consider
[24:47] (1487.36s)
supporting the channel and let me know
[24:48] (1488.80s)
if you need anything else. Happy coding.