 I'm here with Alfonso. He's the creator of Fable. I think he, about eight years ago, he tried to, you know, use F-Shop to do web development, which was kind of one of his passion. And what he found was that symmetry between that was not great. And so that's what kind of led Alfonso to actually create Fable. And there's been tremendous support and community, you know, uptake on Fable. So we always wanted to have him speak at the conference and talk about how he's trying to push the boundaries and making F-Shop even better. So thank you, Alfonso, for joining us today from Japan. And it's great to have you. So I will hand it over to you. Looking forward to your talk. Thanks a lot, Reis, for the interaction. And thanks a lot for the invitation to talk at Functional Go. I'm very happy to be here, even if only virtually. But yeah, it's, I'm living in Asia for two years now. So very, very happy. And also working with sometimes with colleagues from India. So yeah, very happy to be part of this conference. So let's, thanks a lot for the introduction. Let's start. I'll share my screen so we can see. Well, I'm just sharing a screen. Quick reminder, if you have questions, you can use the Q&A section. I'll be watching over it. And if there's anything important, I will let Fonso know about that. We'll try and keep it interactive a little bit as we go along. He likes to not be talking to a screen. So we'll try and keep it interactive and need your help to make that possible. So yeah, I think over to you, Alfonso. Yeah, please do interrupt. Because yes, as I just say, I guess for me and for the other fellow speakers, it's a bit difficult to be talking for a long time just to a screen. So it's great to have some feedback. So any time that you have a question, just please write. And yeah, as if you are so kind to just let me know, we can pause and answer very quickly. So yeah, we are going to talk today about the table and F-sharp. And actually about the next version, which is currently the development of Fable, which we are trying to go one step further, one step beyond from the current F-sharp JavaScript compilation. But let's start very quickly with Risa. She already introduced me, but just three points. We just say I'm originally from Spain, but I'm living in Japan right now. My major in college was linguistics. So I usually say I'm linguistic by heart and a programmer by trade, but that has many, many programmers. I've changed my career and I'm mostly programming now, but I'm very interested in languages. And that's probably one of the reasons that I've been working in open source in our compiler. So mostly I'm an F-sharp developer nowadays. And yeah, on the creator and main maintainer, you can say a table break. I'm going to say also a couple of things of the companies I'm collaborating with at the moment. One is The Metrics, which is doing a great job using cutting-edge permutation technology to produce a rare canon in the night, sorry, that are safe, and effective for health and wellness. But it's always difficult for me to pronounce the word in English. And yeah, if you're interested, please visit their homepage in TheMetrics.com. And also collaborating with Charles Dowell, which is a company that also has their actionist also focusing on Asia. Charles Dowell builds software and systems to drive supply chains in the developing world and in refugee camps. It has launched the world's first one hour grocery delivery system in the world's most densely populated city, which is the DACA. I was going to say close to regular, it's not that close, but yeah, in a global perspective, it's closer. And it's also, Charles Dowell is picked by Y Combinator and the World Bank RAP. If you're interested, you can take Charles Dowell.com, which is their website, if you're interested in the development group, and maybe also joining the team, you can take CharlesDoc.dec. Okay, so Fable is about compiling F-Sharp to JavaScript. So let's talk very briefly about F-Sharp that probably you already know because it was one of the most used functional programming language still and kind of a niche language. But yeah, usually it's known if you're interested in functional programming. In fact, it was normally promoted as the functional first programming language for .NET platform. But nowadays they are changing a bit the promotion and they are not insisting that that match in the functional part. This is in three characteristics. So the first one is that it's robust. So it's a functional programming characteristic because it's aesthetically typed. It has discriminated units which are great to model your domain. And it also has immunity by default as most of the functional programming languages. It's section, so it is also important because it has a type inference. So it means that even if it's strictly typed, you don't have to type the types all the time. The compiler can import them for you most of the time. It also has a terse syntax. So syntax that doesn't get you on your way. You don't need to write brackets most of the time using white spaces now. And it's also, it can be used to write scripts and it has a rebel. So it's very good for prototyping. And it's also a performance language. There's been a big focus on performance in the last years, both on the extra language and the .NET runtime. Actually, in the latest versions of .NET, many times you can match the performance or even be of equivalence on the same terms reaching in a goal or rest, for example. So now let's talk about Fable. What's Fable? Fable is an F-sharp to JavaScript compiler. It's important to mention it's not the only one available for F-sharp. You can also take a web-sharper which is also an F-sharp to JavaScript compiler. It's a compiler that supports most of the F-sharp core library. We say that it's battery charged because of this. And supports part of the .NET base class library. One important thing of .NET is that this has this huge base class library that can do many things and sometimes you don't need external libraries. But yeah, because it's huge, it's become a check-in to support all of it. So this is a goal of Fable. But it supports the things that you need most commonly to write programs. And it also can support Nuket packages. Nuket is the package system that is used for .NET and F-sharp break. But they have to be Fable compatible. Okay. And it can also support JavaScript libraries, for example, from NPM, through bindings, or you can just use dynamic program to just interact with JavaScript. And it has some support for reflection. This is, it's partial, it's not a big support for everything because we also support tree-shaking, which means that the parts of your application that are not being used will be removed from the JavaScript bundle. This is very important because in JavaScript we want to deploy as less code as possible. So it's the, or websites load fast. But still, it's interesting because you can, let's see here. Okay. So we have, yeah, we have press like this one, which is Fable Remotin, which allows you through the use of reflection in Fable and the .NET F-sharp servers, you can just generate it automatically and it's API out of types. Okay. Let's go back to the presentation. And yeah, I told this already. It's been eight years since the first release. I had to check it out for the, for the brand to talk. And I was a bit surprised because time really flies. And there are multiple pricing prices. I don't know all of them, but I know that there are many companies that are using it for projects that are doing real work and their real work. One thing that I like to stress is the Fable philosophy. This because when, yeah, actually eight years ago, it was very popular to have many languages compiled to JavaScript because JavaScript was thought to be not a very good language. This has changed. JavaScript is quite powerful now. It's evolved very quickly. And we have TypeScript, which is like a JavaScript with types. It's to mean static types. So this is not the case anymore, but yeah, back in the, even back in the time, the Fable wasn't born to, to, to just because thinking that the JavaScript was a bad language that had to be hidden from the developers. Actually, Fable was born out of love of F-sharp, both F-sharp and the JavaScript ecosystem and community. So Fable, what it tries to do is make F-sharp a first class citizen of the target platform, JavaScript in this case. And we try to do that by aiming for good interop with native code and tooling, like for example, tools that are widely used by the JavaScript community like a webpack. And we also try to find a balance between the F-sharp semantics and having minimal overhead. And we say that we don't want to bundle a full runtime. So sometimes if we have to make a sacrifice, some things in F-sharp or .NET runtime, some special behavior that will require to wrap things. We try to avoid that. But in general, I think we, after many years and many attempts, I think we have a good balance right now. Talking a bit about the Fable history, what has happened in these eight years. So first of all, I'd like to mention about PanScript, which was another F-sharp JavaScript compiler that I've seen before. It had the best name ever. PanScript used to use something that's a feature of F-sharp's code quotations. But at one point, F-sharp compiler service, which is F-sharp compiler used as a library, exposed the internal AST, where AST stands for Apsar Syndex Tree. So this was taken by Mia as an opportunity to write a new compiler that will use the F-sharp compiler directly to transform the F-sharp AST into JavaScript AST. We had a Fable 1, the first version used a Babel. Babel was a JavaScript compiler. It was translating modern JavaScript to old JavaScript because at the time, not many browsers could support the new JavaScript feature. So this was very needed. So this was what Fable 1 was using. You can see, let's have a very good look here. Let's imagine that we have... So imagine that all of these circles, they are ASTs. So we have... So this is the code, and F-sharp compiler is going to translate it into F-sharp AST. So this means the parsing and invalidating that the code is valid. And then we can do the same with Babel. Babel will also take it that the code is valid, but it doesn't make us very strict checking because there's no static typing in JavaScript. But it was also printing the final code. So Fable was acting here. So it was translating the AST into Fable AST. Why do we have a Fable AST? This is because the F-sharp AST is kind of exposed, but it's not actually possible to produce the F-sharp AST. It's only possible to consume. So it means that if we want to make some transformation and create new AST, we have to have our own AST. And yeah, this is something that Fable is using and then compiles to JavaScript and then sends this to Babel. This happened in Fable 1. In Fable 2, what we had is that we had an internal step. Before it was more or less like a direct, but now we had an internal step here to make some transformations. So this was helpful to focus on Fable AST itself. And in Babel 3, what we did is remove this Babel dependency. So basically Fable could just bring the JavaScript code directly. And now what's going to happen in Fable 4? What are we trying to do now? So what we are trying to do is because we have this work zone. So we have the F-sharp AST, the Fable AST. We have a recent transformation here. So we thought, what if we just add new steps and we can compile it to multiple languages? So this is what we are trying to do with Fable 4. And let's see if we can manage to do that. So as we talk, we will do an intermediate step. And we have Fable 3. And Fable 4 is adding new target languages. So Snake Island is the code name for the new Fable. And we are going to explain a bit how the new Fable appeared. Actually, I'm very happy about that because it was mainly driven by the community. So it was not driven by me. It was the community that started to add these new targets. And they made some PRs. So we request the Fable code to the Fable repository. So we decided to try to be more open to these new targets. And we are now trying to change a bit the architecture to make it easier to target other languages. So it started with a Japanese person. And he was creating a board game. We are talking about the physical board game here. But he also wrote an online version using F-SAR. The game is called Crazy Pharmace. You can Google it. And this website, which is called Board Game Arena, which offered him to include the game in their website so that he could reach weather aliens. Because the server only supported PHP. So what did he do? He wrote people, which is an F-SAR PHP compiler based on Fable, to compile his code to PHP. I think it's quite interesting that he found it was easier to create a compiler just than rewriting the whole bread in PHP. But actually, yes, F-SAR, especially using these community unions, and connecting other features, makes writing a compiler actually quite fun. So they later sent the PR team to write this PHP compilation into Fable. And maybe we can say that this was how the new Fable 4 was born, which I insist is still in development. And then we also have another contributor, sorry, I forgot to mention that if you're interested in Japanese and some work, you can take his GitHub profile, which is thinking before coding. Okay. And yeah, and we have Dick Bradley, which is also an F-SAR, and a Fable contributor. He's the author of the AsyncRx library. And he's also an expert Python developer. And he believes that F-SAR can help make a better Python. And actually, he wrote a Python library, which was inspired by F-SAR. It's called Expression, and this library was meant to enable pragmatic functional programming with Python. But still, there were some things in the Python language that made the functional programming difficult to apply to. So now he tried to compile directly F-SAR to Python using Fable. And this is very interesting because, as you know, Python is the most widely used functional programming in the world. It's a functional programming language in the world. And there are many tools and many possibilities for Python developers. And it's great that just by compiling to Python, these possibilities are also open to F-SAR programming. So I probably all know about these Jupyter notebooks for data science, for example. The Python interactive, which is like a rebel, but it's very, very advanced and very interesting for prototyping. And we can also do some IoT with BBC macros, for example. And it's actually, as all the other targets still in development, but it's quite advanced. And we have indeed, there's an OSP that is already using, which is called type BNF. We can check it here. So yeah, you can check type BNF, which is a break to take errors when parsing languages using a BNF grower, okay? So I think now they are compiling to JavaScript because some issues, but yeah, this break used to be compiling to Python, using paywall Python. And then we have F-SAR to RAS as well. This is also in the making. This is responsible by NK, which is a long time F-SAR and paywall mysterious contributor. I say mysterious because nobody know the entity of NK. We only know the GitHub profile, which is NK. NK also is the one who enabled the F-SAR compiler and paywall search compilation, which enabled the Fable repo. We are going to have a look at this right now because it was necessary to modify, strip some parts of the F-SAR compiler to make it possible to be compilable by Fable. And also, NK maintains an F-SAR compiler for, this being used to improve the incremental compilation for paywall. And NK starts some work to compile F-SAR to RAS code through Fable. And what can we have with RAS code? Actually, the one thing that you'll think first is that this can improve the performance. It probably is true, but we made some tests. Actually, because the new .NET 6 is quite fast. Actually, .NET can run sometimes as fast as RAS, but the most important thing is that you're going to create, you're going to generate binary, native binaries that are much smaller than the .NET binaries because there are the binaries that need to include the runtime. So they tend to be quite big if you need to make some deployment, for example, to machine in the cloud that doesn't have .NET installed. So yeah, this is quite a good alternative. Also, it enables WebAssembly completion using a Wasmap app, which is a project to compile RAS code to WebAssembly. So this is interesting because we compile F-SAR to RAS and then RAS to WebAssembly. Actually, there's already a project to put .NET in WebAssembly using this called Blazor. And it's a good project. And you can use it with F-SAR through Bolero. But yeah, the thing is that it's also, again, it puts the whole .NET runtime. So it's kind of big. So with this method, you're going to have, it's much lighter. We have 20 minutes in. 20 minutes, perfect. Okay, so yeah, this is actually the last one for now of the language we are trying to include for fail for, which is Dart. Dart probably wasn't a very known language, but then Google developed the Fluture, which is gaining traction at the most comprehensive cross-platform app development solution. And Fluture currently only supports Dart. So yeah, by using F-SAR to Dart, we could make it possible to develop a Fluture app in Fable directly. And I have to say that this mobile and desktop development is already possible with F-SAR using, for example, React Native with Fable, or there are also .NET solutions like Samarin, malware, and Avalonia UI. But I still think that Fluture, everybody, most of the developers that have tried Fluture, they really like it. So I think it's very interesting to be able to write F-SAR apps with it. And the thing is that Dart is a language similar to C-Sharp and .NET. So many of the challenges to compile F-SAR to this kind of language have already been met. So I think it's something doable, but there are still many challenges left. So it's not that easy, but yeah, we are trying to make some progress. So let's, before starting then, checking the last slides, let's take some demos. So first, I talk about the repo. So you can try this online. So this is the Fable repo. That's actually, this is the F-SAR compiler, which is being compiled to JavaScript, and it's put there. So there's no server here. This host has the static web page in the GitHub. So there is no server doing anything here. You can, let's see for example, this is an example from Thomas Pettschik, which is creating a spreadsheet that you can use. Like you put right here, right here, and you say, okay, I want to add B3 plus B4. And this is going to tell you. So it's a mini Excel in your browser and it's done with less than, less than 500 lines of code. And yeah, using the UI and also the logic. And yeah, you can see some of the features of F-SAR. So very common to the functional programming languages. So we have this pattern matching. We have a current function. So we have the type inference because as you can see here, all the types, you don't have to write them. They are automatically impaired by a compiler. And again, this compiler, this actually is operating in the browser. It's not sending anything to the server. We have some custom operators here. So yeah, I'm not going to go too deep in the features of F-SAR, but if you're interested, you can go to the repo and you have a tool F-SAR here that you have some of the main features and some examples that you can try. So we talk about this RAS compilation. So I'm going to show you this example. Sorry, here. This ray tracer example. Okay, which is doing some creating some scene using some geometric figures. And then using this ray tracer algorithm to render the scene. So here we are going to make it a bit bigger. We're going to make it 1,024 times 1,024. Compat it again. We take a bit longer, so over two seconds, because it's actually very CPU intensive. So this code that is, yeah, it's quite intensive. So you can see that it takes more than two seconds. It's not trivial time. So let's go to... So what we see here actually is the same example, but this is going to be translated, compiled to RAS, and then using the Wasma pack, it's going to be compiled to WebAssembly. So you can see this ray is running on local server. You can see here that this actually is also 1,024, but it's reduced to the half the size, so you can have more detail. And as you can see here, it's faster. Because it's faster, you can do things like, for example, just running a small animation, and we are rendering it in different angles, because we can have it much faster, but yeah, it's pressable, so it's always good to have to be rendered things. Actually, I can get the better times here, but because right now my computer is busy streaming this video, it's taking a bit longer. But actually, there's also an example here. Oops, no, sorry. There's also another example here. This is equivalent to the example we saw in the rebel, but this is done with... That's one here. This was done with a version of TypeScript that was in the TypeScript Playground. So, yeah, we still have this version. So, as you can see, it's actually... This one is taking longer than... You see, it's almost four seconds, and we have the favorable version, that's a bit more than two seconds, and then the REST version, that actually, if we can picture, it would have more resources, it would be close to one second. So, yeah, but by using Fsharp and Fable, we can get this performance basically with the same code. If you go to the code here, this one is the code base in the TypeScript sample. It's actually very, very, very similar. If we take this, this is the code generated by Fable. You can take also in the Fable repo. I just copy it from there. So, you can see the code that is generated here. If you check it out, it's very, very, very close. But still, it's a separate example, you can see. So, we have this minus in Fsharp. We can have this custom operator, so we can use this, like, multiplies normal integers. But still, this faster, why? It's difficult to say because it's the JavaScript engines, they have some heuristics. It's not easy to say, to know what is actually causing the optimization. But one important thing is that because the methods in Fsharp and Fable, they are being compiled as just separate functions instead of static or instance members of a class. These are great advantages for a dynamic language like JavaScript, because in JavaScript, the runtime always have to check that the prototype actually has this method. But when you have a model function, this function can be statically linked, and this is much easier for the engines to optimize. And you can see here, the code is basically the same, and this is the generated RAS code. It's not so clean because it's automatically being generated, but yeah, as you can see, it's many lines. So we have, yeah, out of around 200 lines of Fsharp, we can generate this 800 lines of RAS code. So yeah, it's much easier to do it in Fsharp and let Fable do the boilerplate for you. Let's check. Let's close this one. So we just saw Fable compiling to JavaScript and then compiling to RAS and then compiling to WebAssembly using Fable. We are going to check the Python compilation. Ten minute check. Okay, thanks. So this Fsharp script, which was being done by Steph and Forgman, and it has been used to solve Sudokus. So if you know Sudokus, this was a very popular page time. And what's about the generating, actually if you go, it's not in the latest repo, but you can go to Fable repo, the old repo too, which is the old repo. We still have the example here. And you can see here's the same code plus the UI. So you can have this here. And you can just automatically solve it, okay? So this is the same code but in a script. And this is something that we are also trying for Fable for this region compilation, which is instead of just overwriting the whole file, we just put the code in a special region of the code. This makes it very easy to mix the generated Python code with a custom Python code in the same file. And this is good, for example, when you are using the Python interactive. And for example, here in Visual Studio Code, we can use these comments to generate cells. So I'm going to use... So as you can see, this value here, this puzzle, it's automatically available in the Python interactive. And we can just inspect the values and we have here. And we can even use pandas. If you know it, it's a very popular Python library for data science. You can use because this translates directly to Python types. We can very easily convert pandas here. So we have this and even also we can have the solution. So again, this is the get first solution here. It's converted into Python. Just in this case, we are changing the case to a snake case, which is what Python understands. So we can do the same here. So with this, for example, we can just very easily certify that the solution is right because it sums all the rows. They sum 45, which is what we expect to probably solve. And we can also transpose this and see the result is the same. And because the pandas data frames, they allow you to easily get some subgrid. We know that the Python subgrids, three times three, they should sum also 45. And we see that they do. And now we can get any subgrid, three times three. And yeah, there was some 45, so we can certify that the solution is valid here. Okay. And the last one I want to show you is the future completion. Okay, so as you can see here, right now it's only available for very, very simple demos like this one, but yes, it's a great first step. And as you can see, this is the Elmys model of writing UI apps that actually is very popular in fable apps. And here in this case, this is the simple sample with this just a counter and we just have an update function, and a model, so and a message. So when we send a message, we just have a mutual function here, the update function that is going to update the model. And with this, start the compiler. We have, okay, we have it here. Okay, so as you can see here, this Dart file is empty, but this server, again, is going to be slower because my CPU is a bit busy at the moment. I should close a few things. So it started already, it's going to generate the code, the code is generated, so then we can compile this. We can let the plotter kick in and generate the Android application for us. You can see here, this is going to just create a pattern that dispatches when it's being clicked. It's going to dispatch the increment message and it's going to just add one to the model. I want to also, the last slides are about the motivation to have this multi-language population. So yeah, basically it's just, we can say that the main motivation, okay, it's also, let's take it very quickly. So yeah, it's on here, we can expect the, everything is very good tooling for Flutter. So we can just click as you can see here, this is going to increase. If we change, if we, for example, say, you're going to decrement, decrement, and hold reload. Now when we push the button, it's going backwards. And may we say, okay, increment that, we, plus 10 every time. So else, we go to hold reload. Okay, so again, now it's just incrementing by 10. So we have this nice piece of Flutter and hold reloading with Fable, an Fsharp Fable app. This is quite nice. So yeah, it has to finish very quickly. So why compatible language? So, because we can, because this is actually one of the reasons to do many open source break, because we can, actually, because we want to know, we can, we can, right? So we saw an opportunity, the community saw an opportunity and tried to that. Actually, the Fsharp community always tries to expand Fsharp on .NET because, yeah, Fsharp developers usually develop a language and they want to make it available in other places, not only in .NET. And I like to think of a language as a platform. So, yeah, as we saw, JavaScript is their web platform. Rust is becoming a system platform. Also, it's in defined with a web assembly platform as well. Python is very good for data science, for example, and machine learning. So, yeah, it's, when you enter a language, you enter, you get more facilities and also communities stand together around the language. So, internally, a new language is also entering a new community. So, maybe people say that we should use the best tool for the job and this absolutely right. But the problem is that it's not trivial to transition to another ecosystem. We have the new language, we have new tooling, we have new ideas, tooling, tooling. I wrote here, I said, yeah, many, many new tools. And sometimes learning the basics of programming language is easy, but mastering is hard. This is because there are many nuances in the language that are not in the syntax directly. You need to learn how to write idiomatic code. You need to learn different APIs to do the same things. For example, for a regular expression, I love regular expressions, but every time that you learn a new language, you have to learn how to do the same things in different ways. And you go back to other languages and you have to relearn again. So, it's a bit crazy. So, yeah, I think it's good to have an opportunity to write some cross-platform code. So, the same way that Flutter is a way to write the cross-platform apps, because being able to cross-language, do the cross-language completion can help lower the barriers to entry. And I think it's totally fine. If it fails, for example, it's just a way to help developers to transition to a new ecosystem. I know of several cases of developers that they work.net and absorb developers, and they try fable, and then they go out involved in the front-end development and, yeah, with JavaScript and TypeScript. And at one point, they decide, okay, I want to do things directly in TypeScript or JavaScript with the JavaScript tooling. I think this is totally fine. I'm very happy that fable helped them to make this step. It's not that fable tells you that you need to do everything in Fsharp, because Fsharp is the best language in the world. I think Fsharp has some good things, and also, maybe not so good things, but, yeah, when it becomes your comfort zone, it's good to be able to use this comfort zone to compile to and enter other areas. So, what I want to say that the fable philosophy is to try to build bridges, but don't impose anything on anybody. I think it's a way to learn from others, because if you cannot leave your ecosystem, you won't learn from anybody else. But if you can leave, even if it's in this way that's compiled, it's an opportunity to learn, it's an opportunity to say true to yourself. If you like this way of calling, you can still do it, even if you try a new language. That's all from my side. Thanks, big thank you. If you're interested, you can check the fable.io site. If you're on Twitter, you can follow Fable compiler or Alfonso GC . Thanks, everybody. I know if there are questions. Thanks Alfonso. That was great. Very interesting demos, I must say. So thank you for those. I know we ran out of time, but there is one quick question from Manoj. He's basically saying, very excited for fable 4. When is it coming out? Yeah, that's the question. So yeah, the thing is that it's an open source browser. It depends on the contributors. So it's a bit good and bad things. It's a bit out of my hand. So I'm taking care of that compilation, but the RAS, Python and PHP, there are different contributors. So yeah, it depends on their time. So I'm going to make it come out this year. And at least, these are not for version, but some alpha beta version in the next couple of months. But yeah, hopefully we can have something this year. And I see there's another question. All the business is coming out. Yeah, there's also a tricky question. We have something for TypeScript bindings to fsharp. It's not always easy because the type systems are different. So we have a tool that is called TS2fable. Yeah, there are some talks about Dart because there are also some tools for Dart code introspection in Dart. So maybe we could use that. It's not always super easy, but I already prayed we have some way of compiling of have some automatic banding generation in TypeScript at the moment. TypeScript to fsharp it's kind of semi-automatic. So we use the tool to generate the bulk of the business and then we usually recognize some minor tweaking. But for example, you have fable.browser which is a library to provide your bindings to the browser APIs and there are other parades maintained by the community so to do this kind of there are key apps if you take the Twitter fable.compiler account he is publishing some bindings recently. Sometimes if there is an interesting JavaScript library one of the users in the community they create some bindings so you can use it also in a more idiomatic fsharp way. So for example, we have this Feliz API from Zahid Zaidayakis a very big contributor of the fable community that is used to write react applications using fable. I think we slightly overshot the time but again thanks a lot for the wonderful introduction to fable and all its great demos so I'm sure people will be excited to hopefully contribute but at least start using some of the cool features that you have. I'll certainly be looking to check out the website that you talked about.