[00:00.000 --> 00:07.640] All good, I don't know if this is working, but it's green. [00:07.640 --> 00:09.880] Ah, look at you, crikey, thank you for coming. [00:09.880 --> 00:12.560] Look at this, excitable people. [00:12.560 --> 00:16.440] Collaboration, well, so here we are with Calabra. [00:16.440 --> 00:19.440] I hope this is what you want to hear. [00:19.440 --> 00:21.640] One of my concerns is that I've given similar talks [00:21.640 --> 00:24.080] in the past, so maybe we have lots of time [00:24.080 --> 00:25.920] for questions at the end. [00:25.920 --> 00:31.600] So I tried to do some different things this time. [00:31.600 --> 00:34.280] So one thing that we're really eager to do [00:34.280 --> 00:37.680] is to get Calabra online reused in lots of different places. [00:37.680 --> 00:40.040] That's lots of innovation going on out there. [00:40.040 --> 00:41.600] And lots of people have great ideas [00:41.600 --> 00:45.560] of how to use documents and make them look better on the web. [00:45.560 --> 00:49.960] And we would love to integrate with you to do that. [00:49.960 --> 00:54.600] So one of the things that we're really useful for [00:54.600 --> 00:56.600] is converting documents to different formats, [00:56.600 --> 00:59.160] which seems like an easy thing to do, you know? [00:59.160 --> 01:00.760] But it's really tough. [01:00.760 --> 01:04.560] And to wrap that up nicely for you, [01:04.560 --> 01:06.960] we have this beautiful rest endpoint. [01:06.960 --> 01:09.000] And it looks so simple, you know, you just do this curl [01:09.000 --> 01:12.200] command, brilliant, and you ignore certificates, OK, [01:12.200 --> 01:15.040] so you should remove that in deployment. [01:15.040 --> 01:17.800] And out of it, you get, well, what do you get? [01:17.800 --> 01:20.080] You get your text file turned into a .x. [01:20.080 --> 01:21.320] That's an easy one, right? [01:21.320 --> 01:24.560] But imagine you wanted to convert a PDF or, you know, [01:24.560 --> 01:26.280] a PPTX into a PDF. [01:26.280 --> 01:29.680] Or a very common request is converting PPTX [01:29.680 --> 01:32.720] into animated SVG. [01:32.720 --> 01:33.880] So we can do that very nicely. [01:33.880 --> 01:35.520] We can produce XHGML out of it. [01:35.520 --> 01:37.040] You can run in your browser. [01:37.040 --> 01:38.320] That's actually how Calabra online [01:38.320 --> 01:39.680] does its presentation thing. [01:39.680 --> 01:41.760] So you can get animations and presentations. [01:41.760 --> 01:43.760] You can understand the structure [01:43.760 --> 01:48.480] of your arbitrarily horrible, say, binary PowerPoint file. [01:48.480 --> 01:49.680] And you can dump that into something. [01:49.720 --> 01:52.000] You can parse and read and interpret and mash up [01:52.000 --> 01:54.040] and do cool stuff with. [01:54.040 --> 01:55.760] And the good news about that is that, well, [01:55.760 --> 01:59.640] say, people do this already in lots of horrible ways. [01:59.640 --> 02:01.440] So I will pick on someone. [02:01.440 --> 02:03.840] I don't know, is there any? [02:03.840 --> 02:05.200] Who do we have in the room? [02:05.200 --> 02:06.440] OK, let me think. [02:06.440 --> 02:10.040] What integration do I particularly like? [02:10.040 --> 02:11.800] So there is an unnamed open source project. [02:11.800 --> 02:14.440] And when it tries to convert its files, [02:14.440 --> 02:18.720] to show them in its jitsie-like, remarkably jitsie-like, [02:18.760 --> 02:20.200] a video, no, not jitsie. [02:20.200 --> 02:21.240] I forget. [02:21.240 --> 02:23.200] One of these video conferencing systems, big blue button, [02:23.200 --> 02:24.680] let's call it. [02:24.680 --> 02:26.320] It essentially has a shell script. [02:26.320 --> 02:29.400] And all of the good, beautiful software architecture [02:29.400 --> 02:32.080] stops at the point you want to convert a document. [02:32.080 --> 02:35.480] And it launches a shell script, which starts a Docker image, [02:35.480 --> 02:37.760] which then launches another shell script in the Docker image [02:37.760 --> 02:40.680] that copies a file into it with some horrible command [02:40.680 --> 02:43.640] that then converts it via another shell script. [02:43.640 --> 02:47.800] It launches an Office Suite that sits and talks to a RPC. [02:47.800 --> 02:50.640] And then it's just absolute horror. [02:50.640 --> 02:53.520] And if any of this hangs, or dies, or crashes, or burns, [02:53.520 --> 02:56.760] or uses more CPU, or finds that one document that [02:56.760 --> 02:58.640] has a real problem, you're just doomed. [02:58.640 --> 03:02.560] You have to write all of this lifecycle management nightmare. [03:02.560 --> 03:04.640] And the good news is, with our beautiful API, [03:04.640 --> 03:06.840] you don't need to care about any of that. [03:06.840 --> 03:08.360] Deploy the Docker image, job done. [03:08.360 --> 03:09.960] If it's too big, we'll time out. [03:09.960 --> 03:11.920] If it's too horrible, we'll tell you. [03:11.920 --> 03:13.920] And it's all done for you. [03:13.920 --> 03:15.920] So that's kind of good if you want the whole document. [03:15.920 --> 03:19.040] Often, though, people have enterprise, file sync, and share. [03:19.040 --> 03:21.000] They want to see their document. [03:21.000 --> 03:23.480] They're fed up of seeing an icon. [03:23.480 --> 03:25.440] They want to see what's inside it. [03:25.440 --> 03:27.240] So again, we can convert your document [03:27.240 --> 03:29.840] to an easy thumbnail, very trivially. [03:29.840 --> 03:30.520] Nice big image. [03:30.520 --> 03:33.520] You can shrink it down to whatever size you like. [03:33.520 --> 03:35.720] And that's pretty good. [03:35.720 --> 03:38.200] So we're really eager that people use it everywhere. [03:38.200 --> 03:40.840] And so we've written most of the work for you already, [03:40.840 --> 03:42.240] so you can use it. [03:42.240 --> 03:45.440] I think it's a patchy license, some really liberal. [03:45.440 --> 03:47.800] I'm more of a copy-left guy, but at least I understand. [03:47.800 --> 03:48.800] Other people aren't. [03:48.800 --> 03:53.960] So in the language of choice, we probably missed Ruby. [03:53.960 --> 03:57.320] I'm going to get in trouble with Neil later. [03:57.320 --> 03:58.760] But there you go. [03:58.760 --> 04:00.600] And we've done a whole lot of features recently. [04:00.600 --> 04:03.120] So one of them I was really surprised and encouraged. [04:03.120 --> 04:06.280] I was talking to someone from a European office [04:06.280 --> 04:07.880] full of lawyers earlier. [04:07.880 --> 04:11.720] And you wouldn't believe it, but they really love citations. [04:11.720 --> 04:13.200] They're all court cases, of course. [04:13.200 --> 04:15.320] I always think academic citations. [04:15.320 --> 04:17.880] But referring to other legal cases [04:17.880 --> 04:20.640] is this massive, worldwide web of knowledge [04:20.640 --> 04:21.920] about what's fair. [04:21.920 --> 04:24.360] And anyway, so we've done lots of things with Zotero. [04:24.360 --> 04:25.760] So one of the things that you can do, [04:25.760 --> 04:28.320] if you have a collaboration online integration now, [04:28.320 --> 04:30.120] is just to push. [04:30.120 --> 04:35.040] We added all this citation stuff in the toolbar here. [04:35.040 --> 04:36.360] And NextCloud implemented this. [04:36.360 --> 04:38.640] And all you need to do is provide a box somewhere [04:38.640 --> 04:40.680] that you can set this API key. [04:40.680 --> 04:44.040] So Zotero have a very nice REST API. [04:44.080 --> 04:48.000] And then we plug into that, and you send us this. [04:48.000 --> 04:49.840] We had this user private info. [04:49.840 --> 04:52.440] So you have a user info which has things like avatars [04:52.440 --> 04:54.560] and extended information about users [04:54.560 --> 04:55.840] that we send to everyone in the UI. [04:55.840 --> 04:57.960] We thought it was best not to send your private key [04:57.960 --> 04:58.720] to everyone. [04:58.720 --> 05:01.720] So we added this extra tag, user private info. [05:01.720 --> 05:04.880] And so when you connect to CollaborOnline [05:04.880 --> 05:07.880] and embed it in your iFrame, you need three methods. [05:07.880 --> 05:11.640] Get, so we can get the file and show it and render it. [05:11.640 --> 05:13.760] And then a post so we can send it back again [05:13.760 --> 05:14.600] when we've edited it. [05:14.600 --> 05:16.000] So that's the save. [05:16.000 --> 05:17.880] And then there's a check file info. [05:17.880 --> 05:19.600] And that basically tells us about you. [05:19.600 --> 05:21.280] So who is this person? [05:21.280 --> 05:24.640] We've got a path thing, a URL for the document. [05:24.640 --> 05:28.920] And we've got an opaque identification password to token. [05:28.920 --> 05:29.880] But what's their name? [05:29.880 --> 05:30.720] Tell me their name. [05:30.720 --> 05:34.080] Tell me what they look like, their avatar and this sort of thing. [05:34.080 --> 05:36.560] And so you just send this back there and bingo. [05:36.560 --> 05:38.520] Suddenly you have beautiful integration [05:38.520 --> 05:41.640] with all of your citation libraries. [05:41.640 --> 05:44.760] You don't need to run a Java app on the side and then talk. [05:44.760 --> 05:46.800] It just works really nicely. [05:46.800 --> 05:50.080] And updates all of your citations beautifully [05:50.080 --> 05:51.120] with a familiar interface. [05:51.120 --> 05:52.880] So that's kind of nice. [05:52.880 --> 05:56.000] That's a way of integrating two things together [05:56.000 --> 05:59.400] through a very, very simple REST API into a nice UI. [06:01.840 --> 06:04.040] Yeah, so language tool is something else I love. [06:04.040 --> 06:07.320] I don't know if Daniel's, he's probably a rich man. [06:07.320 --> 06:11.000] Grammarly has set a price point for, [06:11.040 --> 06:12.600] does anyone get Grammarly adverts? [06:12.600 --> 06:13.560] Does anyone watch YouTube? [06:13.560 --> 06:15.320] Has been plagued by, yeah. [06:15.320 --> 06:18.920] So there are many ways to create value in the world. [06:18.920 --> 06:20.880] One of them is, of course, to create value. [06:20.880 --> 06:23.440] The other is to tell people you've created value. [06:23.440 --> 06:27.240] And I think often as engineers we forget to tell people [06:27.240 --> 06:28.400] that we've created the value. [06:28.400 --> 06:29.240] That's the problem. [06:29.240 --> 06:32.000] We do it all and then there's no marketing. [06:32.000 --> 06:34.240] I think Grammarly is probably the extreme example [06:34.240 --> 06:37.600] of marketing versus value. [06:37.600 --> 06:41.240] But anyway, so they can sell somehow for 30 bucks a month, [06:41.240 --> 06:43.440] 50 bucks a month, something like that, [06:43.440 --> 06:45.520] a subscription to their web grammar checker [06:45.520 --> 06:48.240] that sends all your information to someone else [06:48.240 --> 06:52.960] and sends it back with grammar checking, which is great. [06:52.960 --> 06:55.200] But because they've set the price point, [06:55.200 --> 06:56.600] there's a great company in Germany, [06:56.600 --> 06:58.600] I think based in Potsdam, that make, [06:58.600 --> 07:00.720] well, they already made an open source grammar checker. [07:00.720 --> 07:03.120] They've done the whole create the value bit. [07:03.120 --> 07:06.160] And so, but they now sell these lovely plugins to people [07:06.240 --> 07:08.200] and you can fit for much less money, [07:08.200 --> 07:10.280] get a better open source product [07:10.280 --> 07:13.320] and they have some of those nice AI things in there. [07:13.320 --> 07:14.680] And AI is cool. [07:14.680 --> 07:17.760] Of course, for checking an ISBN is valid, [07:17.760 --> 07:21.120] probably not the best use of AI, I might argue. [07:21.120 --> 07:22.840] But on the other hand, sentence structure [07:22.840 --> 07:26.920] and human language, that can be pretty cool. [07:26.920 --> 07:28.840] So, they're taking on Grammarly [07:28.840 --> 07:29.960] and the nice thing about that, of course, [07:29.960 --> 07:30.960] is you can get a docker image [07:30.960 --> 07:34.560] and you can deploy that in your Kubernetes, whatever [07:34.560 --> 07:36.480] and connect it up to a collaborate line. [07:36.480 --> 07:39.160] So, all of your grammar checking stays in-house. [07:39.160 --> 07:42.120] So, you get the benefit of all of that goodness [07:42.120 --> 07:45.600] and from a European free software company, I love it. [07:45.600 --> 07:48.440] And they're doing well and they're growing really nicely. [07:48.440 --> 07:51.160] So, nice to see that happen. [07:51.160 --> 07:52.600] Very easy to set up. [07:52.600 --> 07:54.600] And they even document the API nicely, [07:54.600 --> 07:55.760] which is kind of cool. [07:55.760 --> 07:58.760] So, you can see all of the number of features [07:58.760 --> 08:03.520] exposed in some of the JSON API they have at that URL. [08:03.560 --> 08:04.680] But again, very simple endpoints. [08:04.680 --> 08:06.840] You just send your stuff to check [08:06.840 --> 08:08.840] and you get some answers back and we show it. [08:08.840 --> 08:11.800] And then, of course, you can configure that as you like [08:11.800 --> 08:13.400] and they have a web service. [08:13.400 --> 08:15.040] I mean, another example of just sending text [08:15.040 --> 08:17.240] and getting text back is our deep integration. [08:17.240 --> 08:21.320] So, another easy thing there that's often useful for people. [08:22.880 --> 08:27.080] And, yeah, it's a bit interesting this. [08:27.080 --> 08:29.880] So, obviously, they want to try and retain formatting, [08:29.880 --> 08:31.920] which is probably one of the big advantages [08:32.920 --> 08:35.320] of pasting it into your web browser. [08:35.320 --> 08:37.800] But you can buy an enterprise key for DeepL and use that, [08:37.800 --> 08:40.400] but you're not going to have it on-premise, I guess. [08:41.400 --> 08:44.000] And then, trying to really get styles through HTML [08:44.000 --> 08:46.560] and map them back properly is more challenging [08:46.560 --> 08:47.840] than you might imagine. [08:47.840 --> 08:49.120] And we haven't done a very good job of it. [08:49.120 --> 08:50.480] So, if anyone wants to improve that, [08:50.480 --> 08:53.440] they're very welcome to come and contribute. [08:53.440 --> 08:56.240] But I think this idea of ask the computer [08:56.240 --> 08:57.640] to improve my documents and stuff, [08:57.640 --> 09:01.400] that interaction thing is there and working nicely. [09:01.400 --> 09:03.000] And there's lots of easy, low-hanging fruit [09:03.000 --> 09:05.800] if people want to help do cool stuff. [09:07.520 --> 09:09.800] So, one of the other things we try and do [09:09.800 --> 09:12.120] is we try and integrate outside the iframe. [09:13.400 --> 09:15.920] It's interesting. So, you create virtualization, for example, [09:15.920 --> 09:18.480] and almost all of the interesting thing about virtualization [09:18.480 --> 09:20.280] is the bit that isn't virtualized, you know, [09:20.280 --> 09:21.840] the bit where you can punch through the magic [09:21.840 --> 09:25.280] to not virtualize something and run the command inside it. [09:25.280 --> 09:28.560] Anyway, so, similarly with us, [09:28.600 --> 09:31.120] you know, the integration is probably [09:31.120 --> 09:33.280] the most interesting bit around the edge. [09:33.280 --> 09:35.600] And it's much the best if you can do that. [09:35.600 --> 09:37.720] So, we've written a huge SDK so that you're, [09:37.720 --> 09:40.280] it's easy to do, which you can see online. [09:41.800 --> 09:44.480] And so, when you save as, it seems easy to save as, right? [09:44.480 --> 09:45.680] But I just explained to you how it works. [09:45.680 --> 09:47.120] You know, you do a get and you do a post [09:47.120 --> 09:49.000] and that's kind of easy for us. [09:49.000 --> 09:51.280] But if you want to save it as something else, [09:51.280 --> 09:52.920] that's more tricky. [09:52.920 --> 09:55.240] So, but yet, people kind of want that [09:55.240 --> 09:56.280] if they're editing a document. [09:56.280 --> 09:59.120] They, you know, often people load a document [09:59.120 --> 10:01.160] and they continually save it as through its lifetime. [10:01.160 --> 10:05.360] So, the document you get actually started in 1995, [10:05.360 --> 10:07.760] you know, and it's been saved as ever since, you know, [10:07.760 --> 10:11.640] with a nice template and the WMF preview of Windows [10:11.640 --> 10:14.320] metafile in the top right corner and all of that good stuff. [10:14.320 --> 10:16.240] And often we see the macros in it. [10:16.240 --> 10:17.840] I mean, we're analyzing government macros [10:17.840 --> 10:20.920] and we routinely see like the Windows, [10:20.920 --> 10:25.240] the Office 95 macro API had a compatibility [10:25.240 --> 10:28.080] when Office 97 arrived and we're still seeing that in macros, [10:28.080 --> 10:31.440] you know, the word basic dot something thing. [10:31.440 --> 10:32.440] Just extraordinary. [10:32.440 --> 10:34.200] Anyway, save as is used. [10:34.200 --> 10:35.880] So, we should do that. [10:35.880 --> 10:36.760] I talked very quickly. [10:36.760 --> 10:37.800] Who has got lost? [10:37.800 --> 10:39.480] Does anyone, you know, no? [10:39.480 --> 10:40.320] I'm sorry. [10:40.320 --> 10:42.600] Okay, so we need a file picker. [10:42.600 --> 10:43.440] So, how are we going to get that? [10:43.440 --> 10:46.360] Well, I mentioned this check file info thing [10:46.360 --> 10:48.840] that tells us what you can cope with. [10:48.840 --> 10:51.120] And if you say, well, we can do insert remote image [10:51.120 --> 10:53.400] and we can do this write relative thing, [10:54.360 --> 10:56.360] then we'll send you a post message when you click save as. [10:56.360 --> 10:58.120] We send a post message outside the frame saying, [10:58.120 --> 11:01.560] hey, we want a graphic from somewhere, you know? [11:01.560 --> 11:03.160] And then you can do what you like. [11:03.160 --> 11:06.360] You pop up your nice file picker, come arbitrary, [11:06.360 --> 11:08.840] image creator, ASCII art, you know, whatever thing. [11:08.840 --> 11:10.280] We don't care. [11:10.280 --> 11:12.920] And when you're done, send us this action insert graphic [11:12.920 --> 11:15.160] and just a URL to it and we'll put it in the document. [11:15.160 --> 11:16.120] That's kind of cool. [11:16.120 --> 11:19.160] Or we'll save as and reload and, you know, [11:20.120 --> 11:23.720] create a window for the new document. [11:23.720 --> 11:25.880] So that's really useful and easy to do. [11:25.880 --> 11:27.280] And we're using, I think, the same hooks [11:27.280 --> 11:28.760] for our new export stuff. [11:28.760 --> 11:32.400] So there's a whole lot of work in accessible PDF creation [11:32.400 --> 11:34.800] and PDF UA and I mean, look at all these options. [11:34.800 --> 11:37.400] I mean, I hate options, but, you know, [11:37.400 --> 11:38.680] apparently you need all of these. [11:38.680 --> 11:41.800] So we've added loads of them recently and you'll be pleased. [11:41.800 --> 11:45.120] And of course, repub, it's very, very useful for accessibility. [11:45.120 --> 11:48.800] It's kind of an extended HTML, a dialect. [11:49.040 --> 11:50.720] So, you know, you can integrate easily [11:50.720 --> 11:54.880] and get all of this richness suddenly. [11:54.880 --> 11:56.760] One of our problems, of course, is that interoperability [11:56.760 --> 12:00.440] is really, really key in what we're doing. [12:00.440 --> 12:02.960] And people really care about that. [12:02.960 --> 12:05.080] And one of the challenges we have at the moment [12:05.080 --> 12:09.800] is our competition really is not great at interoperability. [12:09.800 --> 12:11.720] They're spoiled by interoperating with themselves [12:11.720 --> 12:14.120] a whole lot, which is easier. [12:14.120 --> 12:17.160] And so when we save, I mean, we love ODF, right? [12:17.160 --> 12:20.400] But if you save it in an ODF file, and, hey, that's good to see it, [12:20.400 --> 12:22.840] and then you sort of download it somewhere else [12:22.840 --> 12:25.040] and give it to someone on a Windows machine, [12:25.040 --> 12:26.920] like it's not, they'll load it in Word [12:26.920 --> 12:28.880] and it will completely mangle the document. [12:28.880 --> 12:32.120] You know, they even have a big list of the things they break. [12:32.120 --> 12:34.520] You know, there's a thousand pages. [12:34.520 --> 12:36.520] It's a very large document that explains [12:36.520 --> 12:38.800] all the things they don't do, you know, change tracking. [12:38.800 --> 12:39.760] I mean, why would you want that? [12:39.760 --> 12:42.480] You know, what kind of features? [12:42.480 --> 12:44.680] Anyway, so lots of it is dropped on the floor, [12:44.680 --> 12:47.760] which would be fine, because obviously that product is awful. [12:47.760 --> 12:51.120] But it's sad to be blamed, you know, for someone, I mean, like, [12:51.120 --> 12:53.960] you know, the user perception is your product doesn't interoperate. [12:53.960 --> 12:55.360] You're like, are you sure it's me? [12:55.360 --> 12:56.520] You know, like, I don't know. [12:56.520 --> 13:00.120] So, of course, if you use the DocX file format tragically, [13:00.120 --> 13:03.520] you know, we can interoperate better with the other world, [13:03.520 --> 13:04.200] which is a shame. [13:04.200 --> 13:06.400] But the good news is you shouldn't need to do that. [13:06.400 --> 13:08.560] You can use it all online in the browser [13:08.560 --> 13:12.040] and you can feel happy and relaxed knowing it's an ODF format [13:12.080 --> 13:15.600] on your server, and you have a full feature experience. [13:15.600 --> 13:16.960] But anyway, I was distracted. [13:16.960 --> 13:19.600] Remote font management, so that's all very good. [13:19.600 --> 13:22.520] But if you've ever written slides, what you'll notice is that, [13:22.520 --> 13:25.000] you know, that you change the wording of this line here [13:25.000 --> 13:28.720] until it just about fits in and doesn't wrap horribly, you know? [13:28.720 --> 13:29.600] And that's great. [13:29.600 --> 13:33.200] But of course, it's highly dependent on the font being used. [13:33.200 --> 13:35.960] And if you change the font, be it ever so slightly, [13:35.960 --> 13:39.080] you know, the text can grow and then everything looks awful. [13:39.080 --> 13:40.480] And of course, my slides look awful anyway, [13:40.480 --> 13:41.640] just because I'm a hacker. [13:41.640 --> 13:43.960] But other people have beautiful looking slides. [13:43.960 --> 13:46.720] And so anyway, we decided it was very useful [13:46.720 --> 13:48.320] to be able to configure fonts, [13:48.320 --> 13:52.320] and that brings a whole load of interesting problems. [13:52.320 --> 13:54.560] But anyway, to make this even easier, [13:54.560 --> 13:55.880] we have a remote configuration. [13:55.880 --> 13:58.280] So one of the things that's nice is to be able to deploy [13:58.280 --> 14:01.240] lots of images on Kubernetes and demand scale [14:01.240 --> 14:03.400] and more and more of these things. [14:03.400 --> 14:05.920] But it's a bit of a pain to configure them, [14:05.920 --> 14:08.080] and particularly for a large hoster or something. [14:08.080 --> 14:10.440] You know, you have customers that arrive quite regularly [14:10.440 --> 14:12.160] and add things, and how are you going to deal with that? [14:12.160 --> 14:13.640] And do you restart all of that? [14:13.640 --> 14:14.520] What do you do? [14:14.520 --> 14:17.200] So we have this remote configuration endpoint now. [14:17.200 --> 14:19.480] So you can cut a whole load of your config out. [14:19.480 --> 14:21.960] And collaboration, I would just go, hey, tell me my config. [14:21.960 --> 14:22.680] Has it changed? [14:22.680 --> 14:24.640] And then pull it every minute or so [14:24.640 --> 14:28.800] and update a whole subset of those settings to make it easier. [14:28.800 --> 14:30.920] And one of those courses is the font, font setting. [14:30.920 --> 14:32.680] So it's easy to have then a path to font. [14:32.680 --> 14:34.720] So if you have a file sync and share thing [14:34.720 --> 14:37.160] and you can manage files, you know, just create a folder [14:37.160 --> 14:40.040] and drop loads of fonts in it, and then we'll notice. [14:40.080 --> 14:43.760] And, you know, we just get this kind of JSON [14:43.760 --> 14:48.160] come out of that font endpoint, this thing we can figure in. [14:48.160 --> 14:50.440] That tells us where they are, and ideally some timestamps. [14:50.440 --> 14:52.600] So we don't, you know, continually fetch them. [14:52.600 --> 14:54.880] And then we can just build a whole set of fonts. [14:54.880 --> 14:56.920] And in the background, it's very funky, [14:56.920 --> 14:58.600] because we have a fork it. [14:58.600 --> 15:01.400] So you can't fork if you have threads. [15:01.400 --> 15:02.920] And it's kind of useful to have threads. [15:02.920 --> 15:05.080] So we initialize LibreOffice in what [15:05.080 --> 15:07.760] we call the fork it, whose job is just to fork. [15:07.800 --> 15:10.560] And we pre-initialize everything, load our configuration, [15:10.560 --> 15:13.560] and then we fork and copy on right huge amounts [15:13.560 --> 15:15.120] of our static data. [15:15.120 --> 15:16.880] So if you've started LibreOffice and thought, well, [15:16.880 --> 15:18.120] it took several seconds. [15:18.120 --> 15:19.680] What am I going to do online? [15:19.680 --> 15:22.480] Because that's the instant we fork within milliseconds [15:22.480 --> 15:25.480] and we have a document there ready to load and open. [15:25.480 --> 15:27.440] But the problem is it really needs all the fonts. [15:27.440 --> 15:29.200] And we really don't want to handle all of those fonts [15:29.200 --> 15:30.240] to the child processes. [15:30.240 --> 15:32.520] And we really control this very carefully [15:32.520 --> 15:34.240] from a security perspective. [15:34.240 --> 15:37.720] So anyway, after lots of work, we now restart this response. [15:38.520 --> 15:42.120] Load files and pass them in and patch lots of infrastructure. [15:42.120 --> 15:43.560] I was actually just talking to Leonard [15:43.560 --> 15:45.400] a few minutes ago about he was telling me, [15:45.400 --> 15:46.440] oh, you've got to mount PROC. [15:46.440 --> 15:47.280] You have to mount PROC. [15:47.280 --> 15:48.120] You'll get screwed over. [15:48.120 --> 15:49.400] You have to mount devices. [15:49.400 --> 15:51.760] Otherwise, something will go wrong in your stack somewhere. [15:51.760 --> 15:54.520] And we're like, yeah, well, we tested that. [15:54.520 --> 15:57.560] And we fixed and we patched around those things [15:57.560 --> 15:59.960] so that actually our jails have almost nothing in them. [15:59.960 --> 16:04.680] No PROC, only two devices in slash dev, no shell. [16:04.680 --> 16:06.200] They're pretty well locked down. [16:06.200 --> 16:07.600] So we like that. [16:07.600 --> 16:09.200] Oh, and then I've got a few minutes. [16:09.200 --> 16:11.800] I'll just show you a whole load of gratuitous features [16:11.800 --> 16:14.160] we've added just in case you like features. [16:14.160 --> 16:16.600] The users do, turns out. [16:16.600 --> 16:18.760] So I'm a big hater of the blockchain. [16:18.760 --> 16:22.520] But DevDAO actually sponsored some of this work. [16:22.520 --> 16:23.160] So we like that. [16:23.160 --> 16:25.520] And the European Commission as well. [16:25.520 --> 16:27.840] So getting our columns into our spreadsheets, [16:27.840 --> 16:30.320] lots of them has been happening. [16:30.320 --> 16:32.080] And it's got rid of this very annoying dialogue [16:32.080 --> 16:34.840] that played lots of users for a long time. [16:34.840 --> 16:35.840] So that's really cool. [16:35.840 --> 16:37.120] Oh, and there's even the proper credit. [16:37.120 --> 16:38.800] Well, NGIA DATSY. [16:38.800 --> 16:40.800] So the European Union Horizon Research Program [16:40.800 --> 16:42.400] is actually really cool. [16:42.400 --> 16:45.280] And anyone who has not knows about it, [16:45.280 --> 16:47.960] if you have a good idea, the traditional way [16:47.960 --> 16:49.920] of getting funding from the European Union [16:49.920 --> 16:51.800] was that if you have a really good idea, [16:51.800 --> 16:55.480] you need to find 15 other people across 27 countries [16:55.480 --> 16:57.400] and then try and persuade them all that their idea is [16:57.400 --> 16:58.920] the same thing and then get someone [16:58.920 --> 17:00.320] to write the proposal and submit it. [17:00.320 --> 17:03.320] And then you don't get it because it's all inconsistent. [17:03.320 --> 17:08.440] So the good thing about the NGIA DATSY, the Horizon Research [17:08.440 --> 17:09.920] thing, was that they said, hey, let's [17:09.920 --> 17:11.480] do something that's good for Europeans. [17:11.480 --> 17:15.960] And so they would just give money to single vision stuff. [17:15.960 --> 17:17.960] And our vision was, well, let's fix interoperability. [17:17.960 --> 17:19.160] So we did a lot of that. [17:19.160 --> 17:20.440] And they paid, which is awesome. [17:20.440 --> 17:20.960] Look at that. [17:20.960 --> 17:25.920] That's, yeah, it just makes life so much easier, doesn't it? [17:25.920 --> 17:27.320] And probably good for Europe as well. [17:27.320 --> 17:31.720] So anyway, say form controls, creating lots of nice rich text [17:31.720 --> 17:34.720] folders, much better PDF export with creating [17:34.720 --> 17:37.120] real, editable PDFs actually built into the product [17:37.120 --> 17:40.800] rather than having to layer things over the top afterwards. [17:40.800 --> 17:42.440] Starting to theme colors so that you [17:42.440 --> 17:44.000] can select different bits of your document [17:44.000 --> 17:47.360] and change the theme and see how that impacts the whole document. [17:47.360 --> 17:50.480] And we're doing lots of work here to extend that to writer [17:50.480 --> 17:51.800] and calc. [17:51.800 --> 17:52.640] Chart data tables. [17:52.640 --> 17:54.120] You wouldn't believe it, but these things [17:54.120 --> 17:56.800] at the bottom of charts are very popular in presentations. [17:56.800 --> 17:59.360] Some people like lines and other people like numbers. [17:59.360 --> 18:01.720] Now you can do both in the same thing. [18:01.720 --> 18:03.640] It's a key interoperability thing. [18:03.640 --> 18:06.120] And then also other random interop things, [18:06.120 --> 18:08.720] precisely anchoring your images and reflowing your text [18:08.720 --> 18:12.040] very nicely in the browser, improving our formula input [18:12.040 --> 18:15.480] bar, accessibility checker to try and find problems [18:15.480 --> 18:18.040] in your documents for the visually impaired, [18:18.040 --> 18:19.920] prettier dialogue functionality. [18:19.920 --> 18:21.720] So happening in the client side. [18:21.720 --> 18:24.040] And lots of this is now JavaScript in the client side [18:24.040 --> 18:27.640] to make it more accessible and performant. [18:27.640 --> 18:31.160] We completely reworked the tile serving thing. [18:31.160 --> 18:33.920] So instead of sending new tiles when things change, [18:33.920 --> 18:35.600] we send very small deltas of them. [18:35.600 --> 18:37.760] So we find the pixels that change, [18:37.760 --> 18:39.800] and then we Z-standard compress them. [18:39.800 --> 18:43.200] So we switch from big PNGs with even headers in them [18:43.200 --> 18:48.720] and crazy stuff to much smaller Z-standard compressed things. [18:48.720 --> 18:49.560] Thanks to Facebook. [18:49.560 --> 18:53.040] I just need to thank Facebook for helping us all get digital [18:53.040 --> 18:53.960] sovereignty back. [18:53.960 --> 18:56.920] That's important. [18:56.960 --> 18:57.960] Password options. [18:57.960 --> 19:00.200] So you can put passwords on your files [19:00.200 --> 19:01.200] and various attributes. [19:01.200 --> 19:03.680] Lots I've mentioned, the PDF things, embedded video [19:03.680 --> 19:06.680] playbacks, if you like that sort of thing. [19:06.680 --> 19:08.640] And the last silly idea, I think, [19:08.640 --> 19:12.160] in the few seconds I have left. [19:12.160 --> 19:13.760] So we've done a bit of a concept for running [19:13.760 --> 19:15.080] CollaborOnline in the browser. [19:15.080 --> 19:16.840] So when you go through your tunnel, [19:16.840 --> 19:19.280] and my hope is that tunnels get better connectivity. [19:19.280 --> 19:22.600] But you can then click a button and, in theory, [19:22.600 --> 19:23.880] run this thing offline. [19:23.880 --> 19:26.240] So we have a prototype now of CollaborOnline. [19:26.240 --> 19:27.680] If you're interested in that, there'll [19:27.680 --> 19:30.040] be talks in the LibreOffice track, which is, I suppose, [19:30.040 --> 19:33.360] somewhere nearby, that then allows you to edit offline. [19:33.360 --> 19:35.320] And there are a whole lot of interesting problems there. [19:35.320 --> 19:38.160] If you like wrestling with massive, multi-gigabyte [19:38.160 --> 19:41.600] linkages and horrible nightmares, do get involved with that. [19:41.600 --> 19:43.000] But there's a little prototype there [19:43.000 --> 19:46.920] that will allow you to work on that and play with WASM. [19:46.920 --> 19:48.280] So yeah, come and hack with us. [19:48.280 --> 19:48.960] We have HackFest. [19:48.960 --> 19:50.600] So there's a LibreOffice HackFest. [19:50.600 --> 19:53.360] If you're excited about LibreOffice, and you should be. [19:53.360 --> 19:55.880] The cool kids are all using LibreOffice technology. [19:55.920 --> 19:58.120] Come to our HackFest this Monday and Tuesday. [19:58.120 --> 20:00.320] Oh, we have a community dinner tonight with Pasta [20:00.320 --> 20:02.720] at the Business and Technology Incubator. [20:02.720 --> 20:04.240] And there's a great link there. [20:04.240 --> 20:06.120] If you take a photo of it, you'll have it for later, [20:06.120 --> 20:06.800] so you can come along. [20:06.800 --> 20:09.480] And beyond that, we're running a HackFest [20:09.480 --> 20:13.200] in Clare Corridor, Cambridge, in March 28 and 29, [20:13.200 --> 20:16.040] which is not only LibreOffice, but also CollaborOnline. [20:16.040 --> 20:17.960] And it would be lovely to see you there. [20:17.960 --> 20:20.080] If you want to come and stay in a beautiful Cambridge College [20:20.080 --> 20:24.120] and wine and dine at our expense and have some team building [20:24.120 --> 20:25.680] and get stuck into CollaborOnline, [20:25.680 --> 20:26.920] we'd love to have you with us. [20:26.920 --> 20:28.220] So thank you for your patience. [20:28.220 --> 20:36.760] Are there any questions? [20:39.920 --> 20:40.800] Yes, sir? [20:40.800 --> 20:44.520] When can we expect the chat-GPT integration with CollaborOn? [20:44.520 --> 20:49.280] Well, like I say, when can we expect chat-GPT integration [20:49.280 --> 20:49.760] with CollaborOn? [20:49.760 --> 20:51.000] I'm sorry, I have to repeat the question. [20:51.000 --> 20:52.560] Yes, so it's a really good question. [20:52.560 --> 20:55.080] Ultimately, you can select some text, [20:55.080 --> 20:58.040] and we can send that to you, and you can send it back quite [20:58.040 --> 20:59.440] easily. [20:59.440 --> 21:01.680] But yeah, I think AI brings a whole lot [21:01.680 --> 21:03.800] of interesting challenges. [21:03.800 --> 21:07.600] And I think, I don't know if you've looked at Office 365 [21:07.600 --> 21:09.960] and the AI slide improver, which I obviously [21:09.960 --> 21:12.440] should have used. [21:12.440 --> 21:14.440] It makes your slides look pretty. [21:14.440 --> 21:17.040] But the question is, what are pretty slides? [21:17.040 --> 21:20.240] And the real problem in AI is, of course, the training data. [21:20.240 --> 21:21.440] And one of our problems is that we [21:21.440 --> 21:23.720] like this digital sovereign world where we don't spy on people [21:23.720 --> 21:25.360] all the time to work out what they're [21:25.360 --> 21:26.960] doing to their documents, right? [21:26.960 --> 21:28.680] So Microsoft doesn't have this problem. [21:28.680 --> 21:31.880] They have Office 365, and they're constantly watching, you know? [21:31.880 --> 21:34.280] So they know how to make pretty slides just [21:34.280 --> 21:37.600] by watching millions of people go, color's a bit. [21:37.600 --> 21:40.000] And also offering you options of different ways [21:40.000 --> 21:44.800] to break or improve your slide and seeing what you choose. [21:44.800 --> 21:48.320] So yeah, I mean, how do we build the data sets [21:48.320 --> 21:51.120] to let us do this in an open-source way? [21:51.120 --> 21:53.240] And I think AI is fantastically interesting. [21:53.240 --> 21:54.680] And Bradley, no doubt, will come up [21:54.680 --> 21:58.720] with the Aferro AI license, you know? [21:58.720 --> 21:59.800] I'm sure this is happening. [21:59.800 --> 22:05.520] Because the source is banal beyond belief in most AI things. [22:05.520 --> 22:09.400] It's the data and the training data and the model you build. [22:09.400 --> 22:11.520] So yeah, it would suck to be an open-source company. [22:11.520 --> 22:13.040] 100% open-source code. [22:13.040 --> 22:14.600] It's just this massive binary blob [22:14.600 --> 22:16.480] that not even we understand that you have to buy, [22:16.480 --> 22:18.280] you know, to make it useful. [22:18.280 --> 22:19.400] So I don't know. [22:19.400 --> 22:20.920] We're working on the problem. [22:20.920 --> 22:22.360] And there are a lot of smart minds [22:22.360 --> 22:24.760] thinking about putting AI and keeping [22:24.760 --> 22:26.280] that sovereign and on-premise. [22:26.280 --> 22:28.840] But I don't have a perfect answer. [22:28.840 --> 22:30.600] But it's a fantastic question. [22:30.600 --> 22:33.280] And if you want to do chat, GPT, we should talk. [22:33.280 --> 22:34.640] You know, come and see me. [22:34.640 --> 22:35.800] I did not mention we're hiring people. [22:35.800 --> 22:36.720] I'm probably not supposed to. [22:36.720 --> 22:38.240] But we love C++ hackers. [22:38.240 --> 22:41.040] If you come and see me, you know, we're growing fast [22:41.040 --> 22:42.000] and doing some cool things. [22:42.000 --> 22:44.120] Other questions? [22:44.120 --> 22:45.640] Anyone at all? [22:45.640 --> 22:46.120] No? [22:46.120 --> 22:46.680] More? [22:46.680 --> 22:48.640] Yeah? [22:48.680 --> 22:51.320] Well, that's very good of you. [22:51.320 --> 22:52.840] Then come and see me afterwards if you want to chat. [22:52.840 --> 22:53.320] Please do. [22:53.320 --> 22:53.960] Thank you so much. [22:53.960 --> 22:54.960] Thank you very much. [22:54.960 --> 22:55.960] Thank you very much. [22:55.960 --> 22:56.960] Thank you very much. [22:56.960 --> 22:57.960] Thank you. [22:57.960 --> 22:58.960] Thank you very much. [22:58.960 --> 22:59.960] Thank you. [22:59.960 --> 23:00.960] Thank you.