1:16:57 Yeah, we have, we have these
like three types of data.
1:17:01 This is kind of in the conversation about
like what, What information is there?
1:17:05 How do you like categorize information?
1:17:07 What guarantees and sort of
like attributes does this
1:17:10 different information have?
1:17:11 Right.
1:17:11 So you have something
like an email client.
1:17:13 Let's say we have like what
email is currently being viewed.
1:17:16 What text is selected?
1:17:18 That's one type of information.
1:17:19 Another type of information is like.
1:17:21 What is in the email, what is
written in the email, right?
1:17:23 Who sent it, which time was it sent?
1:17:26 And, uh, there's, there's other kinds
of data too, but sort of like thinking
1:17:30 in this way, right now we can add
a third type of data, sort of like
1:17:33 a very ephemeral, like imagine that
there's a friend in there, so there's
1:17:36 a second cursor on the screen, like
where the cursor is, who that is, like
1:17:39 that, that's another piece of data.
1:17:41 I think these like have different,
you have different expectations about.
1:17:45 Where it is the synchronized hot,
like what reliability of this is, what
1:17:49 the latency of this data is roughly
speaking, like what's in the email,
1:17:54 what'd you expect there to be correct,
but it can take a while to load.
1:17:58 I'm exaggerating here now, obviously
everything should be correct
1:18:01 and be fast, but you gotta make
trade offs the cursor, right?
1:18:06 It's sometimes you can drop a frame, so
to speak, and it's not that important.
1:18:10 Right?
1:18:10 Like you can lose this information.
1:18:12 You don't have to cache it.
1:18:13 The information about like what's
selected and like scroll positions
1:18:16 and stuff like that is, is things that
can have lower integrity than sort
1:18:21 of like what's in the email, right?
1:18:23 And that information might, you
might not want to share with others.
1:18:26 Right.
1:18:26 Like what's, what texts
do I have selected?
1:18:28 Maybe that's something that
shared in a different way.
1:18:30 Right.
1:18:31 Let's say you have two people
looking at the same email.
1:18:33 Then if you shared the tick selection,
like what does that even mean?
1:18:36 Right.
1:18:36 If I want to select something, I
would change your tech selection.
1:18:39 That's kind of like weird.
1:18:40 So you've got to treat that differently.
1:18:41 So there are, there are
different categories of data.
1:18:43 One thing.
1:18:44 So more concretely to your question,
it's like when you write a Playbit app,
1:18:47 there is some of this information that's
just handles for you automatically.
1:18:51 So things like the sort of scroll
position and stuff like that.
1:18:56 All handles for you automatically,
you can override any of that.
1:18:59 And if you wanted to manage your own
scope position, of course you could, then
1:19:03 there's an API and we call this like game
state because you know, often we talk
1:19:07 about, and we look at video games, because
I think there's a lot more to learn there
1:19:10 than, uh, comparatively to utility apps.
1:19:13 So game state is essentially like
the state that the program has
1:19:17 that's unique to the program.
1:19:18 And earlier in this episode, we talked
a little bit about like, uh, like almost
1:19:22 impotence mismatch or a match between sort
of like the, the fifth of your problem
1:19:27 and the database and stuff like that.
1:19:28 And so you have a similar problem
here that, like, we, we could just
1:19:31 give you, like, I just like put
things in a SQLite database and
1:19:35 they will automatically just like.
1:19:36 Be synchronized, right?
1:19:37 The problem is like, that's not possible.
1:19:39 That is not, not possible because
like it's hard technologically.
1:19:42 That's just impossible because
like a real life human level.
1:19:45 It's not possible, right?
1:19:46 We cannot possibly know.
1:19:47 And the same thing is true
for like a file system.
1:19:49 We cannot possibly know what these like
chunks of bytes mean without trying to
1:19:53 interpret them, in which case you're
not on a file system level anymore.
1:19:56 But on a document level, and
so to like, solve this problem,
1:20:00 we choose to not solve it.
1:20:02 And this that give you the
tools to solve it yourself.
1:20:05 And so imagine that we, we make
a game like a tic tac toe game
1:20:08 and we can play that together.
1:20:09 It has like, it has a, it's
a turn based game, right?
1:20:12 So 1 and it's a 2 player game.
1:20:14 1 player is across the other 1.
1:20:16 It's like a circle.
1:20:17 And.
1:20:18 Let's say you start out and you do, you
click somewhere, you can choose, right?
1:20:22 And then it's my turn.
1:20:24 And so now game state in this
example is whose turn is it?
1:20:28 What sort of like what on, on
this kind of like three by three
1:20:31 or nine by nine or whatever you
end up doing on this game board.
1:20:35 Like, what is the state of that?
1:20:36 Which cells are empty?
1:20:37 Which are currently like filled?
1:20:39 What are they filled with?
1:20:40 Right.
1:20:40 And then you have conditions and
this is not part of game state.
1:20:43 It's like.
1:20:44 Did someone win?
1:20:45 Like, Oh, who is leading?
1:20:47 Like, this is stuff you
derive from the game state.
1:20:50 And the game state itself is
essentially a key value store.
1:20:53 And on the key value store level, we
give you the, we give you transactions.
1:20:58 And so if you say like, uh, change this to
the, to that and change this to that, and
1:21:04 you can make up your own keys and values,
we guarantee you that Those things are
1:21:10 merged with all the other clients with the
same result within that one transaction.
1:21:15 So we give you this kind of like
primitive, that is a key value
1:21:18 store with like CRDT transactions.
1:21:20 I don't know what to call them, but this
is kind of like a notion of transaction.
1:21:24 And on that level and beyond that
level, below that level, We as like,
1:21:28 we had all of the diffing and merging
and syncing for you automatically.
1:21:31 Then of course we finally, we
give you like a, the lowest level.
1:21:35 So the highest level is like, you
don't use any of these things and
1:21:38 you get some limited multiplayer
functionality and the scene graph of
1:21:42 the whole, like the whole desktop,
if you will, is synchronized always.
1:21:45 And so that's the highest level.
1:21:46 That's the simplest thing.
1:21:47 You can write like a 20 line
program that has some limited
1:21:50 multiplayer functionality.
1:21:51 And it's fine.
1:21:52 All the defaults in Playbit, like
in our APIs, if you don't opt in for
1:21:56 something, you will get something that
we think is a good default, right?
1:22:00 If you don't pass, if a function
call has like a flags attribute
1:22:04 or argument, if you just pass zero
for that, we will like, instead of
1:22:08 giving you a window, for example,
sorry, this is a tangent in macOS.
1:22:11 If you say.
1:22:12 And this window, create a new window.
1:22:13 It's the API for creating a new window.
1:22:16 If you set flags to zero, like no special
flags, you get a window that's useless.
1:22:21 You can't close it.
1:22:21 You can't resize it.
1:22:22 You can't like do much with it at all.
1:22:24 You can't even move it.
1:22:26 And so you have to like set certain
flags to get the default window.
1:22:29 And, and it's kind of like folk knowledge.
1:22:31 You just know which flags to set and
which flags not to set and the caveats.
1:22:36 In Playbit, we're trying to like have
an ethos that is like, when you don't
1:22:39 opt in for something, you will get the
thing that is that you probably want.
1:22:42 And yeah, so this goes
for the data layer too.
1:22:44 And yeah, we'll see.
1:22:46 So you got these three kind of
like, I want to start easy mode.
1:22:49 You just give me a thing.
1:22:50 It will be multiplayer.
1:22:51 It'll be pretty fine.
1:22:52 And then you say, actually, I want
to like have my, the state of my app,
1:22:55 my game to be multiplayer so that two
people can play tic tac toe together.
1:22:59 Then you use this like fairly
straightforward, but still you
1:23:02 got to model your data now.
1:23:04 Um, like this database and then at the
very lowest level, you get something
1:23:09 that is kind of like a socket, but we,
we handle like encryption and you know,
1:23:13 the actual connectivity of it for you.
1:23:15 So you can say, give me a connection
to the other instances of this app.
1:23:19 And now your app can, you'll send
like arbitrary data if you want
1:23:22 to do something really like wild.
1:23:24 Right.
1:23:25 But now there's no different emerging.
1:23:26 It's, we just give you an ability to
say, send bytes between, um, between
1:23:31 different like instances of your app now.
1:23:33 Got it.
1:23:33 So that's how, how data flows.
1:23:35 Um, I'm curious, what is the authoring
experience for me as a developer?
1:23:40 Um, do I have to use like a certain
programming language for that?
1:23:43 Can I choose between different
programming languages?
1:23:46 Is there, can I bring some outside
technologies, for example, something
1:23:50 like react, or is there sort of
a bespoke way to do all of that?
1:23:55 You have to use our own flavor of Fortran.
1:23:58 That is backside.
1:23:59 You know, no, it's a, so.
1:24:01 Um, This is obviously an important thing.
1:24:03 I think that there are
two paths that you can go.
1:24:05 You can either say, here's a blessed
programming language, and this is what
1:24:08 you use, or you can say like, bring your
own language, here's like a minimal API.
1:24:15 And I think the two like common examples
of this is like on, uh, on iOS, you
1:24:21 got, I guess a little complicated.
1:24:23 Now you get Swift and Cocoa, but for
a long time, you had just Objective C.
1:24:27 And if you want to write an
app, you write an Objective C
1:24:30 and you use these libraries.
1:24:32 And there's some flexibility if
you want to do something else,
1:24:34 but it's like pretty much zero.
1:24:35 And then you have something like BSD or
Linux where you say there's a syscall.
1:24:39 It's essentially like a single function,
uh, that's called syscall, which is
1:24:43 really just like a CPU instruction, but
it's a syscall and you give it a number
1:24:47 and the first number represents like the
thing you want to do, like open a file,
1:24:50 close a file, read some bytes, right?
1:24:52 And then you give it some number and
it's a fixed number of things you
1:24:55 can give it arguments essentially.
1:24:56 And that's the entire API surface.
1:24:58 This is one function to
your entire computer.
1:25:01 So these are two extremes and with
Playbit, we're closer to the second,
1:25:05 because that gives you the flexibility
of if you want to use Python or Node.
1:25:08 js or BUN, you could do that.
1:25:11 And I think that's important.
1:25:12 Some people have opinions about this.
1:25:14 So Playbit has a C A B I and B as
in, as in Bob, as a binary interface,
1:25:20 basically any programming language
today can interface with a C A B I.
1:25:25 It doesn't mean you have to
write it and see the developer
1:25:27 experience currently in Playbit.
1:25:28 And so, you know, Playbit does exist
and we use it day to day and we
1:25:32 develop Playbit inside of Playbit.
1:25:34 It's kind of weird sometimes is we
got something that's a little bit like
1:25:37 Xcode, something that's a little bit like
developer tools, like on the OS level.
1:25:41 And so in our version of the finder
or windows file explorer, there's
1:25:47 a button called new app and you can
click this and like a new app is just
1:25:50 made for you and it's called like, you
know, new app that app and inside it,
1:25:54 like, you know, there's a main dot C
because we got a C compiler and system.
1:25:57 So it's main dot C and
it's already ready for you.
1:26:00 And when you, when you create a
new app, there's another toolbar
1:26:03 button, like in the file browser,
this says build and run it, click
1:26:06 build and run and your app starts up.
1:26:09 And there's, you don't need to use
terminals or anything like that.
1:26:12 You got standard out and standard error.
1:26:14 You can get those kinds of things like in,
in a more friendly sort of developer log.
1:26:18 We have an inkling to this now,
but there's also a couple of
1:26:21 ways to like, look at the dom.
1:26:23 So we have the scene graph
that your app has, right?
1:26:25 You can inspect that.
1:26:26 You can inspect actually the scene graph
of the entire desktop if you wanted to.
1:26:30 So that, you know, this opens
up some very interesting things
1:26:33 for accessibility, for example.
1:26:34 But anyhow, so the developer experience
is very much like, it's very like
1:26:38 straightforward, very lightweight,
very opinionated right now.
1:26:41 So again, you click, you click a
button to just create a new app.
1:26:44 And you can just rename it
by changing the folder name.
1:26:46 And if you don't want to even open
a text editor, you just click the
1:26:50 building ride button, which is the same
place your app is built and is run.
1:26:54 And it takes like a
couple of milliseconds.
1:26:56 And now you can just like, and it's
just going to say, hello world.
1:27:00 It's just a window that opens hello world.
1:27:02 And it has closed buttons,
you know, it's very basic.
1:27:05 And what you can do now is that
you can open the source file.
1:27:07 In the text editor, it's only
in graphical environments.
1:27:10 And now you can, you
can change them, right?
1:27:13 You can change, for example,
like where it says hello world to
1:27:15 say, you know, hello, Johannes.
1:27:18 And then you hit build and run again.
1:27:19 And now like it restarts
and says, hello, Johannes.
1:27:22 And then, you know, there's some
generated documentation for the API.
1:27:26 There's functions, of course,
for, you know, we've got.
1:27:28 Grid functions, all of the kind of
really gooey things you might expect,
1:27:31 you know, pop up menus and scroll bars
and radio buttons and all of that stuff.
1:27:35 And if you want to bring in
libraries and stuff, you can do that.
1:27:38 And if you wanted to use Python
instead, then you will call these
1:27:41 functions through the C ABI and
FFI functions in Python, right?
1:27:44 So that's kind of like the, currently
the developer story in PlayBit.
1:27:48 That makes sense.
1:27:49 So you've like laid out the absolute
foundation and that allows for a lot
1:27:54 of layers, optional layers to be built
on top where you want to follow like
1:27:59 a certain flavor of app development.
1:28:01 And I think that also allows an
ecosystem to be built around PlayBit.
1:28:07 But I think the new level of primitives
and the, this new, um, More like
1:28:12 2024 foundation that you're laying
where you get things that are, that
1:28:17 was probably shareable by default,
that's collaborative by default.
1:28:20 So, uh, a lot of the local-first
aspects, what makes local-first software
1:28:25 great, having that be baked into the
foundations of an operating system.
1:28:30 Uh, that is not something I
would have expected in 2024 to
1:28:33 already exist, maybe rather 2040.
1:28:37 So you make me feel like
living in the future.
1:28:41 But I got to say, I think that there,
it's almost a logical conclusion
1:28:44 when I'm going to come to here.
1:28:45 But I think, first off, I want
to say, I think, I think of
1:28:47 Playbit as being a platform.
1:28:50 I think it's very interesting to
talk about, like, what is an OS?
1:28:53 Like, what is a platform?
1:28:54 We've been talking about the web a
lot today for really good reasons.
1:28:57 And the web to me kind of smells
like an operating system, you know,
1:29:00 in a way, and it is a platform.
1:29:03 And I think Playbit similarly,
although it is like, technically
1:29:05 speaking, a real operating system,
you know, it's like manages memory
1:29:08 and hardware and all of that stuff.
1:29:10 I think, or I hope at least it
also can become the platform.
1:29:13 That has a primary environment,
which is, you know, its own OS and a
1:29:18 secondary environment, which is like
other systems, like the web, right?
1:29:23 Other platforms.
1:29:24 And the logical confusion I was
mentioning, thinking about what,
1:29:27 what does a platform OS do?
1:29:30 Why, why does it exist?
1:29:31 Why do we have them?
1:29:32 Historically and an operating system
does really is two things, right?
1:29:36 One, it abstracts the hardware.
1:29:38 It used to be so.
1:29:39 That if you want it to write the disc,
you would have to like write the disc.
1:29:43 You have to have different code
depending on the specific hardware
1:29:46 you're writing, which is kind of insane.
1:29:47 But that's how it was.
1:29:48 And then someone was like, Hey, what,
what if we have like a layer in between?
1:29:51 So like you say, right to hard
disk a or hard disk B and you use
1:29:57 the same like function calls, even
if this is like a, you know, a
1:30:01 hard disk from this manufacturer,
if it's like a floppy disk drive.
1:30:04 Right.
1:30:05 And that is like, Those are
like drivers or whatever.
1:30:08 That is like one important
role that OS serves.
1:30:11 the other category, it's very interesting.
1:30:13 It's like the OS then needs to
provide services for like the
1:30:16 tools that run on top of it.
1:30:18 And this is where I think we as like,
we as kind of like set back in our
1:30:22 chairs, you know, in, in like the late
nineties and said, Oh, we're done.
1:30:26 You know, I mean, iOS is like built on
macOS, which is built on next, which is
1:30:30 built in the eighties and we have windows,
which like still has like some parts in
1:30:34 it that are from, you know, the nineties
or maybe even further back than that.
1:30:38 And so a lot of these OS's that we use
today, and even like the windowing,
1:30:41 like the compositing windowing system
is sort of like an ancient idea, right.
1:30:45 Of like, that comes from like X11 and
stuff like that, or, you know, even
1:30:49 earlier stuff, of course, X11 was not the
first, but, you know, you have a window.
1:30:54 And you have a window and
these are two like bitmaps or
1:30:57 textures, if in GPX or either.
1:30:59 And each window is like a process
or whatever you want to call it.
1:31:02 And they like use the same library code to
draw the same button into their bitmaps.
1:31:06 And then on the desktop, you
put these bitmaps together and
1:31:09 that's how you have windows.
1:31:10 I was like, gee, the huge problem
with this is that how do you like
1:31:13 introspect what's on the desktop?
1:31:14 How do you do things like accessibility?
1:31:16 How do you, how do you like, uh,
debug something that goes wrong?
1:31:19 That crosses the boundary of two windows.
1:31:22 Like you, it becomes really hard and
you end up with this like really weird
1:31:26 patched on things at the, at the end.
1:31:28 And so I think that the
services argument, right?
1:31:31 Like then we think about, so why is it
so that today you look at someone who
1:31:36 used a Mac book And what apps do you use?
1:31:38 These are web apps that they use.
1:31:40 They are not native apps, but they
have this like Mac OS running there.
1:31:43 Why aren't there Mac OS apps?
1:31:44 I think it's because Mac OS
doesn't provide the things
1:31:46 that people want, right?
1:31:48 Developers want.
1:31:49 I want to be able to just like fetch
the thing from the network, right?
1:31:51 I can do that one line of code in
JavaScript or like a fucking million
1:31:55 lines, excuse my French, of codes
in, in like a Mac OS native, right?
1:32:00 There's just like a, there's a mismatch
between the services that an OS provides.
1:32:04 Another thing is like, like
payments or like subscriptions
1:32:07 or whatever, like revenue.
1:32:08 Let's say that I read a little thing.
1:32:10 And it's a hobby thing.
1:32:11 I can't spend too much like time
slash money on it, but I still spend
1:32:15 a lot of like my time and money on it.
1:32:16 Right.
1:32:17 Even if it's like, you know, five
hours a week and now I'm going
1:32:20 to ask people who really like it.
1:32:22 It's kind of the shareware model.
1:32:23 So like, give me a dollar,
like a month, if they like this
1:32:26 thing or just like one time.
1:32:27 And obviously I'm not like pitching
anything novel here, like the, you know,
1:32:32 Apple app stores are very successful
and everything else that comes after it.
1:32:36 But the problem with that is that
it is sort of like a monolith.
1:32:39 It's this sort of like
it's in the planet Apple.
1:32:41 First off, if you want this to
work on other platforms, like
1:32:44 you can't, it's iOS or nothing.
1:32:46 And if you want to market this somewhere
else where you really can't, it's in
1:32:49 the app store or nowhere else, and you
have to build it specifically for them.
1:32:53 And there's all of this, this
whole list of cabinets is basically
1:32:55 like there's a little bubble,
you can put it in the bubble.
1:32:58 If you don't want it to be in
the bubble, you're on your own.
1:33:00 You got to Do a Stripe integration
or something that's going to take
1:33:03 you a lot more time than you have.
1:33:05 And so I think that there's a lot of
hobby developers out there who make
1:33:09 something truly valuable who will
just like, just pass on it, right?
1:33:13 They will just pass on the revenue
they could get because it's
1:33:15 just like not worth building it.
1:33:17 So that's just one example.
1:33:19 Uh, multipliers we were talking about
is another example, like data syncing,
1:33:22 all of these things that like the OSS
that we use today, they just don't
1:33:26 provide But the web platform does.
1:33:28 So we moved to the web platform instead.
1:33:29 Yeah.
1:33:30 I love that, that vision.
1:33:31 Uh, and, and so I've mentioned before
that I am trying to build the best
1:33:36 of both worlds for like embracing the
web, still making the app feel native
1:33:40 and, uh, the app also following the
local-first ideals as much as possible.
1:33:45 This is really, uh, building an
app on the hard mode compared
1:33:49 to how you build other apps.
1:33:50 So.
1:33:51 Um, chasing that quality,
et cetera, but it's so hard.
1:33:55 Um, and this is where in the future,
where I can just build Overtone on top
1:34:01 of Playbit, this is where I can put all
of my effort on making the, like spending
1:34:06 the quality on like even, even more higher
leverage things, and you've been taking
1:34:12 care of like the tough foundation that the
app is collaborative by default, that it
1:34:17 feels more, gives me better primitives.
1:34:19 The app feels native where, depending
on where it's running, whether it's
1:34:23 running in the browser or whether
it's running on, on someone's
1:34:27 more, more native environment.
1:34:29 So I'm really looking
forward to that future.
1:34:31 I have one tangent question.
1:34:33 Uh, you've been mentioning that you're
developing Playbit inside of Playbit.
1:34:39 Looking at this from a similar lens,
I'm very curious whether you can already
1:34:43 have a browser running inside of Playbit
and then open a Playbit environment
1:34:48 within the browser running Playbit.
1:34:53 Oh, we don't have a web browser yet.
1:34:57 If there's anyone out there who wants
to join us, I mean, play, but it's
1:35:00 like a venture backed company, like,
you know, we can pay you a salary.
1:35:03 It's like a real job.
1:35:05 If you want to come work with us
and, you know, put Chrome or Firefox
1:35:08 in play, but yeah, hit me up.
1:35:11 Or if you want to work on like
GPU stuff or the Linux kernel, we
1:35:16 are looking to hire a few people.
1:35:17 So yeah, there's no web browser yet.
1:35:19 It will, it will be a mind band.
1:35:20 Yeah.
1:35:21 To like run it inside a web browser,
because then you can keep going.
1:35:23 It's like you take a video camera
connected to a TV and you point
1:35:27 it at the TV, you know, you got
this like, Infinity mirror effect.
1:35:31 Yeah.
1:35:31 That's kind of fun.
1:35:32 Uh, exactly.
1:35:33 That's what I had in mind, or I think you
get the same when you like use like Google
1:35:37 meet or something or whatever it's called
these days, but yeah, I would like take
1:35:41 up that, that job offer opportunity in
a, in an instant, if I had the background
1:35:47 that fits it and If I wasn't already knee
deep in all sorts of other things, but
1:35:52 I'm sure there, there will be someone
out there who is the perfect fit and
1:35:56 I'm sure that's an amazing opportunity.
1:35:59 So before wrapping up, you're
all, you're not just building such
1:36:03 an ambitious startup, but you're
also about to become a father.
1:36:07 So I'm very curious, uh, from
a personal perspective, like
1:36:11 how are you navigating that?
1:36:13 How do you balance going after such
an, such an ambitious project, uh,