Next, the programmable web browser
CC Attribution 2.0 Belgium:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal purpose as long as the work is attributed to the author in the manner specified by the author or licensor.
Atlas Engineer
While actual browsers expose their internals through an API and limit access to the host system, Next doesn't, allowing for infinite extensibility and inviting the users to program their web browser. On top of that, it doesn't tie itself to a particular platform (we currently provide bindings to WebKit and WebEngine) and allows for live code reloads, thanks to the Common Lisp language, about which we'll share our experience too. Next is a keyboard-oriented, extensible web browser designed for power users. While most (all?) current browsers expose their internals through an API, Next exposes its entire code to the user. Modern browsers limit access to the host system, and Next doesn't, allowing for a broad range of new features. Similar projects have failed due to being tied to a particular platform (Vimperator, Conkeror…), but Next's choice is to have its core written as an independent library, and to provide bindings to web engines (currently WebKit and WebEngine are supported). Next's magic touch is its live coding capability: we can develop a command from a REPL, compile the function and try the changes immediately, without restarting anything. Or just edit our init file and reload it into the current session. This flexbility comes for free thanks to the Common Lisp language, the experience with which we'd like to share too. Next is usable as of today. It features ad-blocking (only basic for now, contributions are welcome), multi-selection, bookmarks, session persistence, Emacs and Vim-like shortcuts, history seen as a tree, fuzzy completion everywhere, basic git-forking and file management interfaces… We are entering a new phase of development, with hopefully announcements that we can make public at the time of the conference :)
 Hello, everyone. I'll talk about the next browser today. So part of Atlas engineer, we've been working on this browser for the last two years, something. And we try to look at the world of browsers a bit differently. We've been a little bit frustrated with the popular browsers like Firefox and Chrome, or the more geeky browsers that allow us to be tinkering with the configuration and all. So personally, when I use Firefox and Chrome, what frustrates me a little bit is that I feel a bit imprisoned. I feel like I cannot do much configure. So a little bit like this black box or less. You could argue that, okay, there are extensions, but those extensions really are limited. They don't really, you can't access the internals of the browser. They can't really communicate so much between each other, and they can't really communicate with your system. So if you want to interact with Git or your text editor, you can't really do that very well. It's not easy. So there's that. And then other smaller browsers, they're tinkering to the more geeky crowds. And those are usually keyboard-focused, minimalist. You can configure them with Python or different languages. And those browsers, well, there are so many of them, actually. There are legions. And I've been wondering, I mean, why actually do they come and go so fast? And I think the problem here is a lack of abstraction with regard to the renderer. And really I think what a web browser truly is, it's a user interface. It's a user experience that allows us to interact with the web, with the content, but it's not, it shouldn't really be stuck to the web renderer itself. So we don't really, I mean, it matters, of course, but maybe it is not all that matters for a browser. So that's what we've been trying to do with next browsers. So the key design decisions that we've taken here is one to decouple the browser from the web renderer. That means that we support WebKit and Web Engine, which is more or less blank from. And on the other hand, we also try hard to make it extremely configurable, because I'm a geek and I like to configure my browser to the very core. And I like to make it to have full control over my browser. So how do we do that? How do we have a fully customizable program where we don't only expose an API to the user, we give the program, the whole program to the user so that they can do whatever they want with it. And I think for that we need the right programming language. That means the language is fully introspectable, that can be fully molded around. And I think maybe the right language here is language from the list family, because those languages are extremely powerful in that sense, so very introspectable. So we chose common list here. And well, that's enough with the details. And I'm just going to show you some demos and you will see for yourself. So this is a, no, it doesn't matter. I will explain it. So if I can start a browser, okay, here, there I go. So first of all, it's really barren. But what I want to show is this area here, which is a little bit similar to, and oops. Okay, sorry about that. Okay, sorry. So first thing is that we, by default we don't show tabs, but instead we use an approach that's used by Emacs in particular. We list all the tabs, or what we call buffers. And what's cool about that is that we can search them. So if I write wiki and geeks, I can freely search my tab and go directly to the GNU Geeks wiki page. And we can extend this concept of what we call the mini buffer, or the address bar essentially in a browser, to actually do this for everything. For instance, say I'm browsing here, and I see there is this table of content here. I can actually browse it the same way. So if I go roll back, enter, and I'm directly at the rollback section. So we can actually use this concept, this fuzzy search concept everywhere. So that's pretty cool. We can even use it to interact with the browser itself. For instance, how many times have you found yourself with so many tabs? You were really lost with them. And you wanted to, okay, let's kill just a bunch of wiki page you don't need. So then I can just start deleting my buffers. I can narrow them down to wiki, set them all, enter, and they are gone. So that's much more productive, right? And it's a very simple concept. And when you start using it everywhere, it's just become pretty cool. So that's essentially basics for the UI or the UX. But as I mentioned before, it's written in common less, which means that you can leverage the language to hack it. And I mean by that program every single part of it live. So for instance, here I go back to my repo where I can evaluate code. So if I evaluate the function current buffer, I get an object here, which I can start introspecting. And here I get this is a sliver, sliver for common less. This is an introspection window where I get all the details, like the title or the URL, et cetera. And if I go back to my buffer, I can start calling functions. I can say set URL. And let's go to my website. And there. It works. Now I can start doing more sophisticated things. I can define a function. So I'm going to copy paste it. It's going to be easier. And where is it? Oh, sorry. Okay. There. So I copy paste this. Okay. There. And here is a command that will repeat what I just did. I want to delete all wiki buffers. Say I keep doing this all over again all the time. Well, maybe I want to write a function that will essentially loop over all buffers, match all those on Wikipedia, and delete them all. So if I evaluate this, and I go back to my next window, and here this is the list of all commands I have at my disposal. If I start pretty searching the delete wiki, there it is. And well, it's double and it's long story. I'm sorry about that. So, and I can call it. Or I can actually do even better. I can bind it to a key. And if I do this, I can evaluate code even from within next. You don't need an extra setup. That doesn't matter. So if you command evaluate, and I evaluate this here, there. So I've evaluated the form. Now I open a new wiki pdf window, first them. And I've deleted all the wiki. Just pressing the right key binding, I've rerun the command again. So I've essentially hacked the browser while it was running. I define a function, I bind it to a key. But you can do everything. You have full access to the entire internals. It goes a long way down this road when you can start extending stuff. For instance, you can easily call to the US components. If you want to hook onto Git, it's very easy to go on your whatever GitHub page. Let's say this one. And here, if I call the command vcs clone, I've cloned the repository to my local project directory. That's very convenient. We would like to extend this a little more so that it actually updates the page at the same time to show you that you've cloned it. Stuff like that. Beyond that, we've also password managers. What about password managers? I mean, they're really useful. I like to have a password manager integrated to my browser. It's best for security. Very convenient. So we've also simply wrote a bridge to keep us XC and password store. And depending on what you've got installed, you can just create copy password and your browser here and first them and then you get your password and you can paste it. Then next, I mean, I can go on and on. Let's say bookmarks. So if I want to open my bookmarks, I can also fully search them and I can match against some tags. So if you look at them at the end of the lines here, the end of the candidates, if I want to match say against Geeks and Fast or Crypto, I can start writing complex expressions like sorry. And Geeks, Fast, Crypto. And as soon as I close the parenthesis, I've matched exactly those two types of bookmarks. One that has Fast and Geeks. The other one has Crypto. So imagine you have thousands of bookmarks. You can have extremely powerful tag matching from within the browser. What else? So what about let's go back to, let's go to Tor and if I go here, I'll start browsing. So I go to the anonymity network and I want to go on the main page. So I go there, I start browsing, go to documentation, then I realize, all right, I want to go back, I want to go back to the Wikipedia page. So I go back to the history and go back to Tor. Now I'm going down a few more links and at this point, if I go back again and forward it again, well, I've written the history. I don't have access to the first branch of the history, which was the Tor website. But here we're a bit smarter. We try to store everything. We try to store the whole tree of history. So we can essentially go, sorry, history, tree, and there. I can actually display the whole history of all the links I've browsed and in a very, well, tree fashion, which is pretty cool, right? So yeah, a few more examples. I think I've showed it all, I think it's already. Bookmarks, yeah. So if you like Emacs, maybe you like Augmoud, something else you can do is go to your favorite website and if you want to bookmark this link into your text editor as a log entry, I've written very small functions for it. And there I can capture the link and this will be stored with the right title and the right link in my org agenda. So here I've actually essentially wrote a function to communicate with the other world by passing code around, which is quite amazing. I'm passing a list to an external process and this is just one function. It's really trivial. That's the kind of power we can get when we choose the right language, I believe. So that would be it for the demo and well, I hope you enjoyed it. We have a few minutes for the questions. So thank you very much. Yes. So you mentioned there was password to manage integration for Keeper, Xe, and some other as well. Password story. Password integration for Bitward. Bitward. I can't hear you. It's there also integration for the password manager Bitwarden. Bitwarden. Oh, okay. Thank you. I mean, of course, so the question is, can we have integration with more password managers? And of course, really, that's the whole point is that it's really easy to integrate with all sorts of external processes. And when it comes to the password manager, we wrote this virtual interface and you can essentially connect to it and then you get everything for free. Can the language be used to control the page itself like automation similar to what Selenium would do? Like? Like Selenium. So automating within the page, find the second link, click on that and then fill in the text box and then click the submit button. Can you do that kind of thing within the language? So what really you can leverage the web renderer to send any sort of JavaScript that you want. And what's also pretty neat is that with a language like Lisp, you can have, maybe you know you've heard of ClusterScript. CommonLisp has the equivalent called parent script. Also it compiles Lisp on the fly to JavaScript and sends it to the browser. So you can start compiling everything in Lisp but actually interact with the web page. Hi. Thank you for the talk. Is there a way to exchange extensions because there are quite a security risk since they have access to a file system, don't they? So have you, I'm sure you've thought about it, but how do you exchange extensions and make sure that they're secure? You mean, so the question is, so last question, the question is how do we make sure that extensions can be exchanged and are secure? So you mean third-party extensions. So the answer is very simple for now. We don't have third-party extensions. But in the future, of course, we want something very robust here. I mean, I personally work with Geeks package manager which provides a lot of security here. So that could be, we could leverage this package manager to do distribute extensions. That gives us a lot of guarantees here. Thank you very much. Thank you.
 Hello, everyone.  I'll talk about the next browser today.  So part of Atlas engineer, we've been working on this browser for the last two years, something.  And we try to look at the world of browsers a bit differently.  We've been a little bit frustrated with the popular browsers like Firefox and Chrome,  or the more geeky browsers that allow us to be tinkering with the configuration and all.  So personally, when I use Firefox and Chrome, what frustrates me a little bit is that I  feel a bit imprisoned.  I feel like I cannot do much configure.  So a little bit like this black box or less.  You could argue that, okay, there are extensions, but those extensions really are limited.  They don't really, you can't access the internals of the browser.  They can't really communicate so much between each other, and they can't really communicate  with your system.  So if you want to interact with Git or your text editor, you can't really do that very  well.  It's not easy.  So there's that.  And then other smaller browsers, they're tinkering to the more geeky crowds.  And those are usually keyboard-focused, minimalist.  You can configure them with Python or different languages.  And those browsers, well, there are so many of them, actually.  There are legions.  And I've been wondering, I mean, why actually do they come and go so fast?  And I think the problem here is a lack of abstraction with regard to the renderer.  And really I think what a web browser truly is, it's a user interface.  It's a user experience that allows us to interact with the web, with the content, but it's not,  it shouldn't really be stuck to the web renderer itself.  So we don't really, I mean, it matters, of course, but maybe it is not all that matters  for a browser.  So that's what we've been trying to do with next browsers.  So the key design decisions that we've taken here is one to decouple the browser from the  web renderer.  That means that we support WebKit and Web Engine, which is more or less blank from.  And on the other hand, we also try hard to make it extremely configurable, because I'm  a geek and I like to configure my browser to the very core.  And I like to make it to have full control over my browser.  So how do we do that?  How do we have a fully customizable program where we don't only expose an API to the user,  we give the program, the whole program to the user so that they can do whatever they  want with it.  And I think for that we need the right programming language.  That means the language is fully introspectable, that can be fully molded around.  And I think maybe the right language here is language from the list family, because  those languages are extremely powerful in that sense, so very introspectable.  So we chose common list here.  And well, that's enough with the details.  And I'm just going to show you some demos and you will see for yourself.  So this is a, no, it doesn't matter.  I will explain it.  So if I can start a browser, okay, here, there I go.  So first of all, it's really barren.  But what I want to show is this area here, which is a little bit similar to, and oops.  Okay, sorry about that.  Okay, sorry.  So first thing is that we, by default we don't show tabs, but instead we use an approach  that's used by Emacs in particular.  We list all the tabs, or what we call buffers.  And what's cool about that is that we can search them.  So if I write wiki and geeks, I can freely search my tab and go directly to the GNU Geeks  wiki page.  And we can extend this concept of what we call the mini buffer, or the address bar essentially  in a browser, to actually do this for everything.  For instance, say I'm browsing here, and I see there is this table of content here.  I can actually browse it the same way.  So if I go roll back, enter, and I'm directly at the rollback section.  So we can actually use this concept, this fuzzy search concept everywhere.  So that's pretty cool.  We can even use it to interact with the browser itself.  For instance, how many times have you found yourself with so many tabs?  You were really lost with them.  And you wanted to, okay, let's kill just a bunch of wiki page you don't need.  So then I can just start deleting my buffers.  I can narrow them down to wiki, set them all, enter, and they are gone.  So that's much more productive, right?  And it's a very simple concept.  And when you start using it everywhere, it's just become pretty cool.  So that's essentially basics for the UI or the UX.  But as I mentioned before, it's written in common less, which means that you can leverage  the language to hack it.  And I mean by that program every single part of it live.  So for instance, here I go back to my repo where I can evaluate code.  So if I evaluate the function current buffer, I get an object here, which I can start introspecting.  And here I get this is a sliver, sliver for common less.  This is an introspection window where I get all the details, like the title or the URL,  et cetera.  And if I go back to my buffer, I can start calling functions.  I can say set URL.  And let's go to my website.  And there.  It works.  Now I can start doing more sophisticated things.  I can define a function.  So I'm going to copy paste it.  It's going to be easier.  And where is it?  Oh, sorry.  Okay.  There.  So I copy paste this.  Okay.  There.  And here is a command that will repeat what I just did.  I want to delete all wiki buffers.  Say I keep doing this all over again all the time.  Well, maybe I want to write a function that will essentially loop over all buffers, match  all those on Wikipedia, and delete them all.  So if I evaluate this, and I go back to my next window, and here this is the list of  all commands I have at my disposal.  If I start pretty searching the delete wiki, there it is.  And well, it's double and it's long story.  I'm sorry about that.  So, and I can call it.  Or I can actually do even better.  I can bind it to a key.  And if I do this, I can evaluate code even from within next.  You don't need an extra setup.  That doesn't matter.  So if you command evaluate, and I evaluate this here, there.  So I've evaluated the form.  Now I open a new wiki pdf window, first them.  And I've deleted all the wiki.  Just pressing the right key binding, I've rerun the command again.  So I've essentially hacked the browser while it was running.  I define a function, I bind it to a key.  But you can do everything.  You have full access to the entire internals.  It goes a long way down this road when you can start extending stuff.  For instance, you can easily call to the US components.  If you want to hook onto Git, it's very easy to go on your whatever GitHub page.  Let's say this one.  And here, if I call the command vcs clone, I've cloned the repository to my local project  directory.  That's very convenient.  We would like to extend this a little more so that it actually updates the page at the  same time to show you that you've cloned it.  Stuff like that.  Beyond that, we've also password managers.  What about password managers?  I mean, they're really useful.  I like to have a password manager integrated to my browser.  It's best for security.  Very convenient.  So we've also simply wrote a bridge to keep us XC and password store.  And depending on what you've got installed, you can just create copy password and your  browser here and first them and then you get your password and you can paste it.  Then next, I mean, I can go on and on.  Let's say bookmarks.  So if I want to open my bookmarks, I can also fully search them and I can match against  some tags.  So if you look at them at the end of the lines here, the end of the candidates, if I want  to match say against Geeks and Fast or Crypto, I can start writing complex expressions like  sorry.  And Geeks, Fast, Crypto.  And as soon as I close the parenthesis, I've matched exactly those two types of bookmarks.  One that has Fast and Geeks.  The other one has Crypto.  So imagine you have thousands of bookmarks.  You can have extremely powerful tag matching from within the browser.  What else?  So what about let's go back to, let's go to Tor and if I go here, I'll start browsing.  So I go to the anonymity network and I want to go on the main page.  So I go there, I start browsing, go to documentation, then I realize, all right, I want to go back,  I want to go back to the Wikipedia page.  So I go back to the history and go back to Tor.  Now I'm going down a few more links and at this point, if I go back again and forward  it again, well, I've written the history.  I don't have access to the first branch of the history, which was the Tor website.  But here we're a bit smarter.  We try to store everything.  We try to store the whole tree of history.  So we can essentially go, sorry, history, tree, and there.  I can actually display the whole history of all the links I've browsed and in a very,  well, tree fashion, which is pretty cool, right?  So yeah, a few more examples.  I think I've showed it all, I think it's already.  Bookmarks, yeah.  So if you like Emacs, maybe you like Augmoud, something else you can do is go to your favorite  website and if you want to bookmark this link into your text editor as a log entry, I've  written very small functions for it.  And there I can capture the link and this will be stored with the right title and the  right link in my org agenda.  So here I've actually essentially wrote a function to communicate with the other world  by passing code around, which is quite amazing.  I'm passing a list to an external process and this is just one function.  It's really trivial.  That's the kind of power we can get when we choose the right language, I believe.  So that would be it for the demo and well, I hope you enjoyed it.  We have a few minutes for the questions.  So thank you very much.  Yes.  So you mentioned there was password to manage integration for Keeper, Xe, and some other  as well.  Password story.  Password integration for Bitward.  Bitward.  I can't hear you.  It's there also integration for the password manager Bitwarden.  Bitwarden.  Oh, okay.  Thank you.  I mean, of course, so the question is, can we have integration with more password managers?  And of course, really, that's the whole point is that it's really easy to integrate with  all sorts of external processes.  And when it comes to the password manager, we wrote this virtual interface and you can  essentially connect to it and then you get everything for free.  Can the language be used to control the page itself like automation similar to what Selenium  would do?  Like?  Like Selenium.  So automating within the page, find the second link, click on that and then fill in the text  box and then click the submit button.  Can you do that kind of thing within the language?  So what really you can leverage the web renderer to send any sort of JavaScript that you want.  And what's also pretty neat is that with a language like Lisp, you can have, maybe you  know you've heard of ClusterScript.  CommonLisp has the equivalent called parent script.  Also it compiles Lisp on the fly to JavaScript and sends it to the browser.  So you can start compiling everything in Lisp but actually interact with the web page.  Hi.  Thank you for the talk.  Is there a way to exchange extensions because there are quite a security risk since they  have access to a file system, don't they?  So have you, I'm sure you've thought about it, but how do you exchange extensions and  make sure that they're secure?  You mean, so the question is, so last question, the question is how do we make sure that extensions  can be exchanged and are secure?  So you mean third-party extensions.  So the answer is very simple for now.  We don't have third-party extensions.  But in the future, of course, we want something very robust here.  I mean, I personally work with Geeks package manager which provides a lot of security here.  So that could be, we could leverage this package manager to do distribute extensions.  That gives us a lot of guarantees here.  Thank you very much.  Thank you.
next_web_browser_0_155.png next_web_browser_156_5339.png next_web_browser_5340_5519.png next_web_browser_5520_5951.png next_web_browser_5952_6167.png next_web_browser_6168_8195.png next_web_browser_8196_10067.png next_web_browser_10068_10151.png next_web_browser_10152_10427.png next_web_browser_10428_11747.png next_web_browser_11748_12059.png next_web_browser_12060_12119.png next_web_browser_12120_12191.png next_web_browser_12192_12263.png next_web_browser_12264_13139.png next_web_browser_13140_13199.png next_web_browser_13200_17507.png next_web_browser_17508_17627.png next_web_browser_17628_23555.png next_web_browser_23556_23663.png next_web_browser_23664_23779.png