 Hi everyone, thanks very much for joining me in this meeting room and to discuss building truly platform agnostic graphical user interfaces with fine My name is Andrew Williams. You might know me from previous projects such as the maven build system or the Enlightenment Foundation libraries and window manager, but if not, that's okay I've been a software engineer for nearly 20 years. We're working in open source and recently got into Entrepreneurship being an author on the topic of GraphQL user interfaces, and I've been developing fine and go since 2018 I have a bit of a confession. This is the first time that I've spoken open source summit That was really helpful really exciting to be here. It'd be helpful to gauge for this talk People's familiarity with things. So is there anybody in the room that knows the go programming language? No, that's cool That's great. Yeah, absolutely some familiarity is helpful, but it's not essential Has anybody built a GraphQL user interface for any applications? Excellent. Okay. Yeah, that's cool. So you'll understand some of the things some of the directions that I'm coming from and Does anybody who doesn't say yes to either of those have familiarity with C or some other programming language that might be utilized? Okay, awesome. So there might be a couple of things in here that aren't Super familiar, but I'll try and explain this as we as we go along so the concept of building a GraphQL user interface is complicated and it sits in a legacy of 25 30 years of history about how things came around They're complicated for a lot of people coming in first time based in the C programming language Which is not let's face it the easiest one to build with you have to think about memory management And thread handling is my code running in the right location at the right time if I cleared the memory Am I handing it to somebody else? All sorts of things that aren't really a problem if you start building with web technologies and other approaches And so you can see why perhaps native application development has been left a little bit in the past And when you compare that to modern programming languages We don't even have think things like good string handling or templates Think that can really help us to put together a more complicated user interface Now, of course, there's plenty of languages that have come since but they are not all really embracing. Let's build this correctly There's plenty of opportunities to access graphics in other programming languages But they're commonly building on bindings from existing technologies Which means we get the nice programming language on top, but we don't really get a new way of thinking about things Building in this way and on top of legacy technologies or existing libraries can be difficult to learn There's a lot of complicated things and the API you're interacting with might not match your understanding of how the programming language is set up Which is going to add a lot of overhead to the learning and to maintaining the code And the excellent tool kits that are out there, they've tried to solve this in the past Do come along with this 2025 year of baggage, which makes them really featureful But it does mean it's a little bit difficult to get started I'm not going to name any names, but you might find that the downloaded 10 gigabytes you need 40 gigabytes on your hard drive That's going to take a while to do anything before you can get started And then there's a lot of setup required as well So actually, I'm here to tell you that the Go programming language is a really fantastic fit here It may not have built-in tool kits, but it happens to be a really great fit The applications that you build are designed to be written once and run anywhere The compiler just understands all of the different operating systems that you can target The apps are single binaries, which means when you put them onto a system, they're going to run You don't need to find that DLL or the library that you're missing or do a system update for anything like this to be possible You're getting native performance So everything that I've said right up to now might be possible to do through HTML, some JavaScript, if you got the right libraries installed But it might not be a good performance, it might not be the user experience you're looking for So we're talking about native applications that run as though they were written dedicated to the platform you're running on It's built using best practice in techniques and language setup So you feel productive, you have a great time from the offset And really, this is lowering the barrier to building graphical user interfaces And we get to promote good engineering principles at the same time It makes me feel warm and fuzzy inside And I think it really helps people come into this for the first time to learn how things can be done well And so this is where the Find project comes in I started it four and a half years ago with all of these design principles in mind Giving folk a chance to get started and get started fast Our underlying aim is to be the simplest toolkit for building beautiful and usable native graphical applications for desktop and beyond And these are applications that you will write once and will be able to run on any device If you've not heard about the Find toolkit, which is understandable, especially if you've not been working with Go You can see here it has been growing faster than anything for Go before It's more popular than any of the competing projects out there And so if you're thinking about doing anything in this area, Find is absolutely where you want to be at Now I'm going to step you through a whole bunch of codes I hope most of it makes sense, but it will show you with a limited number of lines how you can get up and running super fast I've got a few images in here Apart from this one, all of the photos have come from Unsplash And I don't know if they're all truly Gophers, but I know this one is, he's called Gophie And if you've ever gone to a Go meet-up or conference, you'll have seen a ton of these around Most people have a collection of them, but he is mine and he supervises This time he's going to show us how to build a Hello World application Now if you're getting started for the first time on your computer, you will need a Go compiler They've just released, I think, 119, but we work back to 114 Mostly because it supports some older devices and it's in all the Linux distributions by default And we're working with graphics, so you're going to need a C compiler, I'm afraid If you're a developer and you're at an open source conference, there's a good chance you have all of this setup and running already It's just to be aware that some platforms have restrictions on how they build And you might need other tools available, but I will come back to what that means shortly So we can set up our first project I could live code this, but I'm just not that brave So you would create a directory for the appropriate name Go into it, call Go mod init in the name of your project And that's just setting up essentially a module file It's a new feature, but it allows us to keep track of our dependencies And then you go get find.io slash find slash v2 And that is you up and running And so now, assuming that Vim is your favourite text editor Others are available, I also recommend IDs, but they don't look so good on the command line We'll open our first Go file Now this should be pretty straightforward to follow We have our packages called main that's your entry point for any Go program We're importing the app and widget sub packages from the find project And the main function is all that we need to create We're starting a new application, assigning it to the variable a We're opening a new window We're calling it hello This might be displayed on a title bar or some window decorations depending on your operating systems It's a good one to get right And then we're setting the content of the window Pretty straightforward here, we're creating a new label widget And we're saying hello find And then we're calling the show and run method on window Which is just a little helper for window show and application run We can run this simply using the standard Go tools Go run and this project And you'll see perhaps unsurprisingly a window appears with hello find written in there The title bar would say what you asked it to But this window is very small because we're going to by default display Just the right size to fit the content when you're on the desktop system Because that's the way that things are typically set up So there we go, it's in a light theme Because as you can see the operating system is currently in light But it will adapt to your user configuration theme font size, those sorts of things So that was simple, straightforward The application will work on any device that you have the compiler for But our gopher expected more I don't imagine you came all the way up or down two or three flights of stairs To see how to write hello world Especially not if you want the air conditioning for another 25 minutes So instead I thought let's build a text editor I mean everybody's got to build a text editor right It's the first step towards building an IDE Is the ambition of surely any user interface developer And so we're going to put all of the code necessary to build this application And I'm going to do so in the next 10 minutes We'll start with something very familiar It's our main package, it's got an entry point called main We have similar imports This time we've not touched widgets yet But we are importing the root package The one that looks like it's called v2 But that's just a versioning semantic The package is actually called fine as you can see in the path before it And so we're creating an app This time we're setting the window to be called text edit Because I am just feeling that uniquely inspired We're creating user interface in a function that we've not defined yet Called make UI And we're assigning it to the UI variable and passing that into set content Nothing to see here really The big change in this function is that we're calling resize on the window With years of experience and reflecting We probably should have called that request resize or request size Because some operating systems like your mobile device are going to say Nope, it needs to be bigger or it needs to be smaller But in this case, we're going to ask for that size Because it feels about right for a text editor And these are device independent coordinates Sorry, dimensions And on a platform that won't resize to that size If you ask for huge and the screen's only so small It will do the best to adapt So let's look at the user interface itself Everything that you saw there was a standard widget And from the widget package that we used before The main area that we're editing We're going to create a variable called entry And it is a new multi-line entry I don't have prices to give away But somebody would probably get that that is an entry line That has multiple lines in it For the status bar at the bottom We've got two fields that we want to update The row and the column So we're creating two labels there They both have one as the default content And we're going to add a toolbar as well So we're going to create a function called build toolbar Probably wouldn't have got any prizes For getting what this is going to do either And here we're just simply returning a new toolbar Again from the standard widget package Each item in the toolbar is in action It has an icon and it has a function call And with go we can simply tell the name of the function And it will invoke that later So when the toolbar button is pressed The action invokes And we'll look at the details of some of those actions later And we're putting a little separator in there as well So that's perhaps a few lines more Than you would want on the Hello World But I think you can clearly see that each line of this Is doing one thing and it's doing it quite clearly And that's how we're aiming to keep the API clean And simple for the entire toolkit So to complete the definition of this user interface We need to build a layout And this comes in two parts So our status bar at the bottom is an independent layout It wants to flow horizontally along We're using an H box, a horizontal box Which is designed to pack the widgets tightly together But of equal height so we get a nice uniform feel So we're creating some anonymous labels here Because we don't need to interact with them We're saying cursor row is then the label for cursor row And the column is going to be that label that we created earlier For representing the column And then lastly we use what is probably the most powerful And sometimes overlooked container and layout for fine And that is the border So we can set items around the edges And then something in the center The label bar at the top The status bar at the bottom We have nothing left and right And because Go doesn't really do name parameters to construct We just pass nil And then we pass a new scroll for the entry And that's going to mean that the content can be scrolled And as I look at it I think Ah, but we put scrolling into the multi-line entry Only in the last release So this code is out of date And we could have just passed that multi-line entry widget And you run it and you get this It's something that looks like a working text editor And I did in fact work This is, right, this is a working text editor Into the multi-line entry there You can see the cursor row and column Haven't been updated And that's not a surprise we haven't wired them up But it looks like an application that we designed earlier And running on our Mac This is probably what you would expect But then I thought, well, let me put it on my iPhone With no changes to the code And just on a platform that Apple has agreed Is licensed to install onto an iOS device Because sometimes people own the platforms That you want to deploy to We were able to build that application and install it And I'll show you how to do that shortly as well But there you go, that's the same UI Adapted, as you would expect To a different modality of device But what about that data? It technically works But it's not going to really be a functional application Until we're able to work with files on the system Now there's a fair bit of code in here And I don't really want to step into the details of it Especially if you're not avid Go developers want me to justify Why I've taken a certain path But what you can see Is the first section there Is opening a dialogue, is this file Sorry, it's a show file open call So it's going to create a file open dialogue And show it The function that we pass in Is a callback for when the user has finished interacting So we check that there was no error Occurred in opening the file that the user requested It can happen So we would then use another help or show error In the dialogue package, which is going to Again, no prizes Show an error to the user If there was no error, we'll continue But if there was no reader The user could have cancelled it, changed their mind So we need to make sure that we're not forcing them To open a file So we can return there if nothing has happened The rest of it is just a little bit of go code That's reading all the data from a stream If there is no error doing so We will make sure to close it because we're done But we're just setting the text By the string representation of the data that was read I'm not going to go into that But as you can see, it's fairly straightforward And we're going to save the URI The resource identifier for the file that we opened for later And if anything went wrong, we'll show another error Because we're not doing Particularly sophisticated error handling here Pretty straightforward opening in general Save as, kind of the same but inverse We take the content of the widgets Which is entry.txt And we write that out to a file that the user has requested And then we have save, which is just a small Improvement over save as Because like I showed before, we were remembering The URI of the file that we opened And saved URI So we're just going to try and write the data out To that same location again Of course, if any error has happened, we'll show an error dialogue Now, this is going to result in a file dialogue Such as this, this is the fine provided fallback We don't have a platform-specific dialogue That we think we should be opening And it's particularly functional The users can browse their files and pick something to open and save Now, you might be thinking, goodness, that was a strange amount of work To go and just read a file I've used fopen in the past, for example But we're doing this for a reason Because file systems are actually a fairly rigid definition And not necessarily present on every operating system Your phone may have a file system But when you write an app for it, you're not really getting access To all of that data in the traditional format So the approach that we took using URIs Instead of file paths Means that we can interact with data That's been selected by the user That might not be a file system So the same app on my iPhone When I say open a file I'm going into iOS's native picker And it's allowing me to choose files on the file system Or on my cloud drive And in the same way, you can ask for data Or be passed it from another application So I could be interacting with a file In my Dropbox app That's been temporarily made available to the application So once again, we're just solving complicated challenges Before you realize that they're going to be a problem for you And lastly, let's just wire up the callbacks there So we want to update the cursor row and column We create a little function called update status Which does that It sets the text for each of those labels And the text is just an integer to string conversion From properties on the entry It knows where the cursor is And apart from being zero indexed It's pretty simply just copying the data into the user interface And when the user has changed their cursor There is an uncursor changed callback So you'll find many widgets have on something And you can set functions in there To be executed when these events occur All of this is completely thread safe as well We haven't mentioned threading once And you really don't need to All of this is going to work And you can then add your own background Handling or complex things Happening alongside the user interface And one last thing I really wanted to add to this application To make it feel complete The title bar should clearly show an asterisk If you're editing a file and you haven't saved it In the future you might wire that into a Don't exit, don't close the window Are you sure here's an opportunity to save But we don't want to be using global variables And saving state and interacting with it So we've introduced data binding So this is like a piece of a variable in memory That you then can monitor for changes And passing around the handle Different parts of the application can respond So we set up a new boolean A true or false state with binding And in our main method underneath the code But before we run the application We've added this listener It's just a simple anonymous data listener That's going to say what is the current value And if this has been edited Because that's the state we're representing We'll put a little asterisk at the name At the end of the title for our title bar That's all the setup we need in the place that owns How the window is presented We have the code that manages it And in the state of the application Where we're actually making changes And reading data, we can set the value Of this data binding So if somebody changes something The on change is called We set true into the data binding And when they save, we set false We don't need to know that the window Is responding to that event We just pass that new data And so there we have it Our complete text editor application All of this running completely On any platform that you choose We're done We added a question mark The asterisk went on But we could have done more Time is a little limited So I'm not going to just go ahead And do this right now But we could have put a main menu in there It's similar to toolbars You pass some metadata in Some actions And it will populate on a macOS It will appear right at the top As part of the native bar Of the systems It will appear in the window And on a mobile There's what's called the burger bun I guess Pops in from the side It's doing the right thing for the platform We could set up a system tray menu Maybe overkill this case But it could be useful If you want to see more About what the toolkit can do And all of the widgets available Rather than have me slide show all of them You can check it out There's a fine demo application As part of the repository And if you've done the prerequisites You can install that line there Which is in the slide Which is shared I'm not going to read it out For the folk at home Now I said this was easy To get out there And put on any devices So let's just touch briefly On the testing and distribution Of these applications I think these are gophers And they're clearly sharing something So we're good I mentioned at the beginning That Go has unit testing baked right in This is hugely beneficial To the robustness of the software That it creates And we thought it needs to be embraced In the user interface as well And so next time Somebody says Well the test coverage is low there Because it's a graphical user interface You can say whoa Let's just put that assumption aside And think are we using the right tools Because building with Appropriate technologies and techniques We can have unit testing baked right into Everything that we build At the front end as well Now there's some Boiler plate here Which is setting up a unit test in Go We have a Some imports up there I like to use Testifies a cert package Because the built-in one feels a little bit Weak But other than that It's a standard unit test with no add-ons We have a method called TestTextSelectIt So any function In a code package That starts with test And takes a parameter of the testing.t Which is a context For test handling again It's a little boiler platey But it's pretty easy to learn Basically the only thing you need to know To make a unit test So we're going to test that the text Is selected appropriately So we're creating An entry widget This would probably be part of the application A variable that you've saved into the state Like we did before But here we're just setting it For a simple standalone test And we have a test package And fine That helps to simulate certain user input If you're wanting to Have it appear that the user took actions Rather than do it all in literal code And so we're having it type The word hello into the entry Then we can use the assert package To check that the text of the entry Is in fact the text hello No surprises there That's probably going to pass But then we can do a little bit more We can say well The user is now going to double tap on the entry What's going to happen here The text should be selected Because they've indicated That they want the current word And so then we say Is the selected text Now hello And it is if the test is passing And we can also check that the cursor Moved on to the end of the word By checking that five is now the cursor column Now that might not seem fundamentally huge But it's clearly validating certain behaviors That we might just have coded into This entry widget What's really important is that this text Test can be run using the same Go standard tools We've edited our test file And we've run it with Go test Really straightforward Now if anybody's been building user interfaces With the web or other technologies Where you have a test driver It loads the application And takes control of your mouse and keyboard And you sit there while somebody Freakishly fast Moves around your screen You'll be reassured to know That this is completely running in memory There's no user interface popping up There is nothing that's taking control of your screen This knows how things should work How they should render But it doesn't need to present it to you We have a driver in there That is going to run what is called headless The application runs completely But in memory You can take snapshots of the state If it's important to your testing But you don't need to relinquish control Of your computer Now let's get into packaging and distribution So we have a helpful tool called fine It's in addition to the library It's a little command line tool That you can install And that's just the parameters there For getting the latest version of it And if you're using fine And building your applications over time Do keep this up to date That can be very helpful sometimes New functionality might need The helper tool up to date As well as the library Now we're going to run fine package Now we've run the code already It's appeared on screen And we've had a window But it might not look like An application that you're familiar with Because it's essentially running A command line tool like any other Go application might be Fine package on the other hand Is going to create an application bundle Or whatever is appropriate For your operating system So that you can drag and drop icons Double click them And it has all of the metadata That you would expect By default that's working For the current operating system If you want to build for somebody else's Then just specify the operating system You're targeting Because fine, because Go Understands all of these Different compiling targets Most of this is completely automatic Most of this is completely automatic And so here we could Build a Linux bundle instead That's probably going to be a target With all of the metadata appropriate To install onto a computer But if you're just doing it for yourself Packaging, yeah, I mean it's nice But then I have to go and drag it And do something So we added a command called install And so if you call install It's just going to take the application Bundle it and then put it Into the right place for your OS Which here on my Mac It is put it into the applications folder I did this with fine settings So then if I search set It's going to find the application You can see the metadata and the version Icon and so forth is present With my iOS device plugged in And appropriate Apple certificate signed I can do exactly the same for my iPhone I just install dash OS iOS And it's going to push that down the cable Onto my device And here you can broadly See that there is a group of apps Called fine that has got a bunch Of my favorite applications And they've all just been coded In exactly the way that you've seen before The metadata is bundled The app is something that iOS understands Natively and it's going to install Like any other application Now I mentioned most of this Happens automatically and earlier I mentioned that C compilers are Required to connect to graphic stack And if you want to build for iOS you need X code And if you want to build for Android You need the Android SDK setup If that sounds a little bit difficult But you're quite happy to have Docker installed Then we have a containerized solution As well called fine cross That was very generously donated to the community By one of our team And that is going to have Essentially the same commands But instead of looking at local tools It's going to download an image Run it in a Docker instance It's going to take your code Mount it into the developer tools Container Do the work Put your application back onto your file system And shut it down So you don't have to manage the installs But you get the same benefit So it's worth looking at if you're not so familiar With managing compilers and versions And so forth Distribution is a little bit more complex The package that I just showed you Can be shared with your friends It can be copied onto other computers It's relocatable and independent In the way that a single binary application From go is as well But sometimes you want to work with Who don't know what to do with that icon Or you might want to have it on the store So here we're looking at How would we then set up an application For release I'm demonstrating that sometimes There's a little bit more metadata needed Such as an app ID If we're sending this out to Windows Or Mac OS or iOS They need a little bit more metadata That they can use to uniquely Identify your software When it goes into the store So we pass that into the release command Which is often going to generate Something similar to package But with a little bit more data Perhaps a different format structure Certification It's just going to do the right thing On iOS we can do exactly that But we need to say Apple has given me this certificate This is the profile that's been set up To allow me to distribute I'm not going to go into What either of those things mean Suffice to say there's documentation And if you're getting into Building and shipping onto iOS You will be able to find lots about it And that will mean something By the time you get there On Android we could do the same We just need to tell it where our password was stored Some of these things are repetitive Potentially the command line arguments Would lead to issues When being replicated again and again So we added a file format here A little toml file called find app And so you can store these Put it into your repository And it means that these then Become optional parameters That you could override Or you can just omit completely And then your build number Will just get incremented by the tooling as well To help you out just a little bit With the release process Finance in the world Sorry, I find him very intense there Gets me motivated to show All of the amazing things that people Have been doing with fine Sadly I can't show you everything That people have been doing with fine There's too much Which is an amazing problem But none the less we have to live with App.find.io is the place to go For a showcase of all of the open source Apps that are currently known And people want to share There's a selection of some here We have a file sharing secure platform Up on the top left Bottom left It's one of my favourites actually It's a little medical imaging viewer This is running on a raspberry pi And a $50 touchscreen off Amazon But you wouldn't know it From the performance that you get From something that's built natively From the ground up to be Efficient in this way So that's pretty cool A music player in the centre there By one of our collaborator Core contributor sorry Which I just completely love the look of And somebody contributed to Gordle A wordle clone for go In case that wasn't quite fitting Into your pun mindset That's pretty cool actually So I got back into wordle After somebody contributed that Very faithful clone I think of the original Top right there There's a little version of the Text editor that I showed you today It's taken out the toolbar And the status bar So it's a little bit simpler But actually that entire application Is simply done with under 20 lines of code Because we understand markdown As a definition of rich text And so the two are connected With the data callback Much like I showed you before When somebody changes the text We parse the markdown So that's another great example In fact there's a seven minute Lightning talk of going from nothing To a markdown editor in the store At goforcon last year I believe And then I was working on a Cross-platform chat application With a cross-platform GUI technology And that is showing WhatsApp, Telegram, Discord All connected to one system That is going to, as you might guess Run on any device that you Choose to build it for I wouldn't recommend using that Every day it's a proof of concept QR code security systems And some improvements to be made Show that it's a technology preview really Of course this is just the stuff That's open source There's so much more right there In the wild People have been using this in production There are remote desktop companies That have used it as a streaming solution And so many more that I wish that I could go into But people get to keep this to themselves They build internal tools And they keep them there But true to being at LinuxCon In the open source summit We have a desktop environment It's called Find Desk Like I said Complete genius with naming And that has all the functionality You'd expect to manage your applications Menus and in the screenshot On the right there We also have an application For discovering these applications Built in fine as you might expect And it will allow you to install All of the applications That you can find on that website At the moment it requires developer tools Installed We're working on a binary distribution system For that And we have a terminal Any guesses on its name? Fine term Exactly Yeah, I named that one too A terminal emulator That's going to work on everything It may not be the most Elegant up-performance terminal in the world yet But it works on anything And so I wanted to build An SSH client So I put an SSH wrapper In between the user interface And the shell Packaged a login screen with it And it works on iOS and Android And it's available in the stores The terminal widget Is just another widget in fine It's not in the core repository It's in identitions But because Go Just allows you to import code From anywhere that's open source You say I would like a terminal in here And it's in your code with one line And you have a terminal Embedded in your user interface And up on the top left there I did actually get created with this one It's called FIN It's the fine login manager Occasionally these things You know they just come to you Anyway, I think that's probably An old version now But it's allowing you to have A fully fine experience From booting your graphics Through to your full desktop environment And there is an early days Linux distribution called FISHOS Spelled with a Y Okay, the story of that name Is probably a little bit older But it's aiming to have A Linux experience That doesn't rely on the presence Of the libraries for Qt Or GTK And all of their dependencies Because these are single binary Applications with no dependencies So we're pushing towards A really, really lightweight desktop But because we haven't Reimplemented your Wi-Fi Chooser and your file manager Yet there are still a few things That we're trying to get out of there But it's coming along nicely Thank you so much for your attention If you would like to know more Because there is plenty more You can go to our main documentation It's at developer.find.io Or we have a YouTube channel Which is full of getting started Tutorials And all sorts of random things That we've thrown in there That folks are enjoying And we have an annual conference That's been online until this year And we put all of our videos up there As well so you can get to see The State of the Union over the years I did write a book Building cross-platform GUI applications With FINE It's available in many good bookstores I'm quite surprised But that's an opportunity there To step through from the very beginning All the way to distributing your applications In an awful lot more detail Than I was able to give you here Depending on your platform It will step through the installation steps There's appendices for managing Those build tools that I completely Glossed over today Which will be helpful if you're getting started For the very first time There was a precursor to this book Which was looking at all of the different ways You can build Graph Collapse with GO I wrote that one too And you might not be surprised to say that To find that I found that Our platform was the easiest to use So you can skip over that one But if you're looking for a comparison About Qt, GTK and other Go specific technologies There's another book out there We absolutely would love more contributions People getting involved in the community However it is Just come along The main project is at that URL On GitHub All of our websites are open source On projects on GitHub We have contributors From all over the world I think 120 people so far Are getting involved One more is always a big deal And we're loving contributions Of code, new tests That keep us honest For a graphical platform We're pretty proud to have a test Coverage of about 68% Which is pretty great Considering the low level stuff that we're doing I wish it could be higher And it will over time But it's getting there Design, documentation Anything you think you can contribute In fact at the moment We're working on the next release Which has a graphic designer Influenced design improvements So the stuff I've showed you Is older It's current But it's a little out of date We're going to release that In a few weeks Or within the next month or so It still looks very similar But it's polished And looks honestly Like somebody designed it Everything to this date Has been material design With some engineer tweaks And over time That gets worse Not better As I'm sure you can imagine Oh sorry We also do have plenty of channels Pick your favourite server essentially We're on the Gophers Slack On the Gophers Discord We have our own Discord server Linked from the website And from the Gophers one I believe we're on Matrix But you might need to ping me If you want an answer on that one Because it's a little quiet And last of all Please do consider Either sponsoring us yourselves Telling your work Or your friends About the great work we're doing When people see how much time And angst can be removed Or made more effective, efficient And just happier Using these tools They love to feed But love to give back Of course sponsorship makes it all possible And so do your contributions We love everybody in the community And it's such a nice place to be We see folk building their first graphical app We see folk building their first piece of software Wherever they come in They have a chat and they are Well the conversations that you're part of When somebody says I've never coded before And I've got a phone app running I was only doing this for two days It's amazing to see those things Do consider being part of the community Or reach out to me directly I'd be happy to take your questions Thoughts, all of these things But thank you so much for your attention And enjoy the rest of OSS Summit as well If I don't get a chance to speak to you Thank you Yeah please So do you have So there's lots of widgets there What's the situation if There isn't a widget that does what you need? Right, yeah absolutely So there's a good chance There isn't because there's all sorts of things That people are dreaming of doing The standard widget package should Capture the basics There's all sorts of different Inputs, manipulators Ways to lay out your user interface I recommend having a look at that Find demo app if you're curious We also have an extensions repository That the community have contributed to Which is easier to put things into But doesn't necessarily have the same Production level code guarantees And that has things like the A map widget, graphing capabilities I can't remember if the terminal is in there Or if it's a third party repository But actually the terminal is one of those examples Where I just decided it would be A really helpful thing to do And you can build any widget that you want Out of canvas primitives Which I didn't really speak about today But all of those widgets are built Using a public API that you can use To build your own Underlying the entire thing is a separate package Called canvas And that defines things like your text Lines, boxes, gradients Anything that should be All that you need to build any widget And a piece of code that fulfills An interface definition of widget Is a widget And that simply says I am a canvas object Which is the base level I could be drawn By the fine toolkit And here's my renderer Because we encourage the separation Of state and rendering Which is why you have a clean API on a widget But a complex potential setup For how it would be displayed So you put your canvas manipulation code Into the renderer And your widget state into the widget object And then you use it like anything else So instead of widget.newLabel You would say my awesome widget package Dot fantastic widget And then that gets dropped straight Into your user interface like anything else And it will lay out according to the same rules And you can customize A widget can say how big it must be But beyond that the context it's in Is going to be told hey you can fill this space So yeah, there is actually nothing That can't be done in your own code That I've shown on screen If you get into the depths You might find some private packages But they are purely optimizations Ways that we have avoided duplication Of code in the system It's not because there's certain Things you can't do Thanks Well I think I'm probably Standing between you and lunch then Have a fantastic rest of the day Thanks so much