 Hello, everyone. Welcome to a Jenkins online meetup. I'm Liam Newman. I'm joined today by Mark Waite and Udi Hoffner We'll be talking about the static analysis plug-in the new next generation version of it for the for Jenkins Before we get started. I have a couple of announcements We'll be taking questions if you have any Going along at home. You can go to the IRC channel The Jenkins hashtag Jenkins IRC channel or also on the Gitter channel for for Jenkins Jenkins CI Jenkins And I'll be keeping track of that and asking your questions as needed other announcements The CFP for DevOps world Jenkins world has opened Can go and submit your your talks about Jenkins similar to to the one that you're going to hear today If you're using Jenkins for cool stuff Just found things interesting that you've enjoyed doing or have some big challenges that you saw with Jenkins Hop on hop on over there and submit your talk ideas Also coming up There'll be a bunch of activities around Fosdame at the beginning of February Just before Fosdame will be doing some workshops in in Brussels One of them will be a continuous deployment with Jenkins X Kubernetes and friends There'll be two of those actually one at 9 a.m. And I want 1 p.m. On the 1st of February Mark and I will be at We'll be competing with that one to talk about Jenkins pipeline fundamentals The these are two really interesting courses courses if you've been using pipeline for a while aren't you know familiar with everything? This is a great place to start and Let's see what else I think that's everything beforehand so just to say again we've got We'll be monitoring the Gitter and IRC channels for any questions and We'll take it away. Okay. Thank you very much There we go, okay, I'll share my screen. Yeah, great So I would like to start with some slides so that everybody gets Some an overview of my plugins and then I'll show you the plugins in detail with a demo and Then we can have some question or you can have the questions in the middle of the talk. Let's see and start so the static analysis plugins Yeah, a typical use case of them is I think everybody using so you have a normal job in Jenkins Where you check out your code then you compile the code and test the code and deploy the code And if you do this without my plugins, you normally use a console a lock to Visualize the results of your build and then you see the test results in the unit view for instance When my plugins came into play What they are doing they take the console a lock and replace the console a lock with something nice and beautiful like the test results So I'm taking the results of the console a lock parse them with some parsers and then present the results in a detailed view so this is one aspect of my plugin and We can generalize this this aspect in Basically, I don't own I don't only scan the console a lock I can scan every tool you would like to know so you can scan check style warnings you can Scan spot box result chairs lint every static analysis tool you would like to scan you can scan with my tool now Actually, we have now almost 100 tools reported Actually, most tools have been supported by some volume tiers So it's always good if you have a new tool which you would like to have support for for please provide a pull request And I will integrate it into this tool So the analysis suite the old system consists of about yeah, 10 or 12 plug-ins, which basically provided Results for Android check style spot box warnings PMD and so on they have been provided by individual plug-ins So one thing for users This was a little bit difficult and for me as a developer of these tools It was also a little bit complicated. So one thing I decided we should replace these all plug-ins with one single plug-in and The idea was to use the warnings plug-in as a result But we discussed it in San Francisco and the tankings world that it would be even better if we drop this plug-in at all and Write a completely new plug-in and this plug-in now is called warnings the next generation This has the advantage That I'm using a new plug-in. I can drop all these dependencies I don't need anymore and I don't need to Yeah, look for backward compatibility compatibility So the new plug-in Now consists of these new parsers which are support. Yeah, almost 100 different tools So that's the background for the plug-in and What I would like to show you are now some your features of the new plug-ins and These features I think are best shown and on a real instance So I will show you it's on one of my local on a local Jenkins instance So this is a local Jenkins. I'm using for my tests If you would like to see the Results of the plug-ins on your Jenkins instance or you'll see how you can also visit our continuous integration server, I'm not sure if everybody is aware of that our Jenkins CI server for our plug-ins is also now using the New warnings plug-in. Oh, so you're talking about the this CI Jenkins.io That's the one that we use for testing all the plug-ins when we go on when we're on GitHub You see the results on there and yeah, okay So everybody A little larger Okay One back from that. It's there we go. That's fine. That'd be great. Yeah, I think it's better. So yeah There's only so much so much so much so much size you can get out of that. Yeah, okay So, okay, I need to make it here as well Okay, so if you use my static analysis plug-ins You can use them basically with every type of project in Jenkins So you can have it with pipelines with Maven project with freestyle projects declarative pipelines and so on. I think I've added support for every type of plug-in So in order to see the results of the plug-ins you need for instance to Go to a job and click on the job and if you open the job you see The first results of my plug-ins on the left side. You see the links to the results So you see the bit now button and now you see Java warnings error prone warnings. Check style warnings These are the warnings you need to configure in your build. So I'm building with Java So there are a lot of tools available that can be rendered with my plug-ins If you're using Jack style or JavaScript, you get only one link for instance with your results So from here you can navigate to the results of the latest build And what you also see on the top-level page of a job you see the trend charts so you see How your warnings behave over the builds so Yeah, you see then warnings increased a lot and yes Sometimes I have some more time to make some clean code then I reduce the warning So so you can see here a trend of all these tools For that are configured in your system This is one of the new things the trend charts I'm using here I'm generated on the client side using JavaScript libraries and this is the test read so I trend this Is still the old type of charts. These aren't generated on the Jenkins master So I think having them on the client side is a little bit better Because yeah, you have a better frameworks to use and what I'm going to add in future releases is you can have some kind of Yeah configuration of the charts Locally, so you don't need to talk to the server anymore. You can Set the range Etc colors what else on the client side and that will be stored on your browser And you don't need a connection to the server for this So these are the trends and the most important thing for me when I'm looking at a project is the results of a single build so I navigate to build and Here we have the page to see the result of a build and Here you see the individual results So we have the test results and now here for every tool I'm having You see one of these boxes Where you see an overview of the warnings of the special tool So for instance error prone we have 15 warnings checks like one warning and so on so you see for every tool You get one of these boxes if you want What you can also have this is here for Java you can also have a box or a result that is a combination of Multiple tools here for Java and for Java doc because I think these warnings are quite similar So I combined them into one result So on this page you have links to the results So I'll follow the link a little bit in a moment. So what we also see We have some kind of Icons here is that here we have a quality gate. That means this bill is unstable This is a feature of the plug-in which I already had in the old version. That means you can Create a quality gates for a build and say okay if the number of New warnings is greater than five then the bill should be unstable or if the number of Total warnings is greater than 200 then the bill should be unstable or should be failed. This is something you can configure How you like it? If you have such a quality gate you also see the reference build That means if you compute new warnings You must say new to what and what is the number of the build? We are I'm using so here, for instance, I have a reference build that In number 27 and here's a reference build a number 30 So the plug-in is capable of deciding which is the best a reference build and Computes the new warnings based on these reference builds The details about choosing a reference build are quite complicated. So I'll drop that for a moment So if you have later some questions, I can go into more detail on how this reference build is computed. So What we also have is this small icon here with an an info or an error So normally you look into the console a lock every time you want to see something important for a plug-in I integrated it now into The plug-in so you see every console lock messages from my plug-in Are shown on an individual screen. So you don't need to go to the console a lock and scan for error prone You just have the warnings here. What's going on and what happened? So these are the information things. Sorry And if you want to see the results you need to click the main link here and then you are navigated to the results of The analysis and here we have the error prone compiler Which shows the warnings which are in my build now? These results are split into Three parts on the first part we have an overview where we have a kind of Diagram which shows the new outstanding and fixed one Warnings so here it's a little bit boring. We have only old warnings which have been in the previous build as well But if you have new warnings, I think I have it for check style Yeah, you see it's it's red. That means In the previous build we had no warning and now in the wrapper in this build. We have one new warning You can also navigate to the Severities means we have severity of high warnings normal warnings low and error warnings. So Here we only have one issue. So severity distribution does not make much sense, but Typically you have to a lot of different severities. So Let me jump in here. So you can choose a Reference build right on the basis can can we can we choose for instance to have like I'm the last stable master Build be the reference for PR for a different branch or is it only within that one branch? No, this is an feature I added in the in this release that you can Choose actually not I'm choosing not from branches. I'm choosing from jobs Excuse me. I did yeah interchangeable in my in my world, but I So you can choose a different job to be the reference Yes, exactly. And that means if you have a master build and then you can say, okay, let's pick the Last successful master build as reference and then if you have a pull request, you are building the Delta from the current build from the pull request Build with the results from the master build This is I think a great achievement. So you can see for each pull request what actually changed Yeah, that's really exciting. Actually, that's it. That's a great. That's a great feature it It sounds a simple But if you look at it a little bit more in detail, you will see it's not so simple because the problem is And that is not yet implemented and I'm not sure if it's doable at all So if we have a built on the master, they contain a lot of sub subsequent commits So not for every commit you get a build and if someone creates a pull request they get off from a git history and They may pick one commit where they start from which is not Built by Jenkins in a standalone version. So Sometimes you will get some differences. Sure. Sure So that graph computation problem, I'm very impressed early that you you've worked through that. That's very very nice Well done Yeah this is by the way, one thing I would like to have a student for working on it if we Should get this even better to compute something That we maybe we built two times So we built with a commit branch point and then we built with a pull request the final pull request and send compute the data That means we need to put two bills, but if we actually do these two bills We will get results which are Correct and currently the other results are correct the most time but not every time so Maybe that is also interesting. I'm switching to the configuration So we see how we can choose the reference build. So it's a little bit scrolling because it's here at the This is a freestyle Configuration of the same job. So if you configure your job and there is This section called reference analysis And here you can select the reference job. So here you can Select one of these jobs where your master is building and The plug-in chooses the best result of this master job and The best result Depends so I have two options to select the best result. So you can For instance, you can ignore failed builds and look only up on success successful builds And you also can select if the master build should Taking the previous build from the master or the previous build that has been and status of successful So these are some options you can use to select the reference build So okay back to the results Let's go to error prone because there was a little bit more warnings. So here we have some Yeah charts the history is also visible here I'm using bootstrap to visualize the results mmm That means I now have the capability to Use some rendering which is different if your screen is larger or screen is on of your mobile phone The support is there, but I have not yet the time to implement something So currently everybody sees the same page if it's on a big screen or a small screen But I'm what I'm going to add is if you have a really large screen as I'm normally using Maybe we can have three of them or the history is larger than the overview This is sense something which is called responsive design Which still needs to be implemented? So this is also something someone else can provide to me. So as a pre request Speaking of which actually so just just a side note here a bunch of this work was actually done by In in concert with students, right? Well, yes, exactly. So I had a bachelor thesis Which we called a little bit Evaluating some UI frameworks and we wanted to evaluate them on a real project So we chose Jenkins or my Jenkins plugins and we try to Replace the old user interface Which is yeah, it's quite old school Let's say in Jenkins with something new and as a student Replaced and added these detail views to the plugins that that's really cool. Uh, you know all the initiative and a Number of other people are working on doing Google Summary of Code If you have any things that you're talking about I want to add this I want to add that This would that would be a great opportunity to Maybe submit a project to that and see if someone's interested in doing that I'm not you have the time necessarily to be a mentor on it, but maybe we can figure something out. Yeah Yeah, that's on my to-do list. I need to Yeah Mm-hmm. Cool. Uli if maybe not right now But I would love to hear any any insight you have if we've got time at the end of the presentation about your experience Developing inside the Jenkins infrastructure with something that to me looks quite quite different than how Jenkins usually does UI components So that's not really the warnings plug-in per se. I guess but I'm fascinated by what you've done It's really an amazing piece of work Mm-hmm. Yeah, I think we will have some time later on so maybe we can add it at the end That'd be great. Okay So these are just yeah, I candy let's say and the real interesting results for me as an architect are the details so we have here if You have a lot of issues you can Navigate into the packages or types of files so you can Sort out the interesting ones and for instance, I would like to see these issues then I can navigate here and You see here at the top. I'm navigating into this sub folder. Let's say and then you see only the details of these issues That these steps that are visualized are Generated dynamically. So if you have no packages or everything is in the same package, you don't see a package tap and and so on Let's go back to see everything What I'm also considering is to replace this thing here to a yeah Detail tap here at the top, but I'm not sure if that makes sense now So what I also use that we use here a new a table and a JavaScript table which Makes sense mostly here for the issues here are all these issues. I found my build this table Which is something you you can search for something Yeah Search for characters and then you see something And this is something I did not put program at all. It's just a JavaScript library I take took and said, okay Let's apply it to Jenkins and it worked out of the box So what we have sorting and things like that? That works just out of the box without any great programming Which which which library was that it's data tables Take query data tables And Well, I have should have said it normally works out of the box in Jenkins It's not so easy because Jenkins uses a lot of Old type of JavaScript libraries, which are hard-coded and can't be replaced So it the the hard work was to get this thing working with Jenkins Now to put it in a isolated enough frame that it could be the modern modern view nice Okay, so We have pagination You can have here one or two results or you can show everything in one page Yeah, this is everything supported by this data table a few So, yeah, nothing to do for what which I need to do Currently the pagination is rendered on the client side This works well for my projects. I don't have so much warnings But I already had some bug reports where people have a 10,000 of warnings and then We should implement pagination on the server side That means we don't we shouldn't read every 10,000 issues at once So but that still needs to be done Maybe a side note for this this screen here the issues screen is rendered Lazily that means if you load the page the table of issues is empty and then we use Ajax to get back all these issues that are shown here and This needs to be split if you have a lot of issues in your system So every element here is clickable. So you can Show all issues in this package So you see only the issues in this package and you can only select the type and so on what you also see is you can Open some details for each issue and the details you see are a little bit It depends on the tool. So here we have error prone That means you have typically in the console a lock just one message and what I also added you have a link Where you can directly go to the website of error prone and then you see some more details about the problem These details which are shown below the warnings These are let's say hard coded that means For these 100 tools I have you need to provide the information for each tool by programming so by Programming in error prone. It was quite easy. It's just a link Which is on the console I can show for fine bugs check style and PMD. I'm using some descriptions from the projects And for all other tools, you don't have anything So if you have a tool that has a lot of descriptions on a web page Feel free to create a pull request so we can include these information also here in Jenkins So, okay, I started we have Aggregation about types files you see the issues and what we also have and this is as well as student work one of my students had a Bachelor thesis about integrating The kid lock or get blame with the warnings that means for each warning you see who is the actual Committer or author or how do you call it? So we make And this works only for kid if the project is Associated with a kid project We have a warning and for each warning we can compute the author who is And commit of these warnings This helps I think to reduce the number of warnings quite fast and if you're someone detects his name you so You can disable it because it's some kind of here security and Maybe personal information which is printed here. So if you don't like it test disable it The last thing I added Yesterday, this is also not a work by a student, but a work of a volunteer We you can also navigate to the warning itself that means we have the source code is also visible where this warning occurred and This display or this view is also new and This view also uses a JavaScript library prism chairs and Now we have a syntax highlighting for every language not only Java I think it's what over 100 languages are supported now and you have a Highlighting of the warning here and you can also see okay the documentation here is not quite impressive because it's just a link to error prone But let's say I will navigate to something else. So we see some Okay here We have wrong class loader. So then you see the documentation Which is part of a PMD for instance? So here I'm using the PMD project documentation and show you the details about this warning So this few is also new and Yeah, I think this is or these are all the information of The of these details few One thing which might be interesting for others If you are interested in the warnings Maybe because you want to write mails to somebody or you want to extract them You can create with the REST API And list of all issues means you have for every here we have two issues you have The possibility to extract everything to REST API And this is something what I'm using with a student currently He is writing an application Who is a combining the The issues of the warnings with the good Information about files. So what we are interested we want to see If someone has a warning in a file, we want to see What is this for a file is how many commits has this file or how many authors worked on this file? So some warnings or the same warning may be quite different if there are 100 people working on the same file or if you have a warning in a file, which is added just by a single person It doesn't really care if there's a warning. So these are information I'm currently trying to acquire with a new master thesis Okay, so so this this REST API exists already or okay If the REST API where you see the information of the issues that is already existing the combination with git is not existing yet So they work in progress So we are still writing an and separate application which is reading clankings data and reading git data and combining the result and If the master thesis is ready To go live then we need to pull it back into the Jenkins plug-in, but with some time interesting interesting Yeah, so really it looks like what you've shown is Many of them are freestyle. Is this also available in pipeline? Can I use it in pipeline jobs and what what's what's the feeling? How does it work? What I don't understand what you mean with feeling sorry, how do I integrate this into my pipeline job, okay? So if you want a pipeline You anticipated the question excellent Yeah That was good. It's a little bit smaller. I don't It's not yeah, this is one thing one should change here. You can't make it bigger so so Into an editor just so we can take a look at a little larger So they already have cool Okay, and this is the Jenkins file we are using to produce the builds on Jenkins a CI and I know see I bought Jenkins dot IO so our build of my plug-ins and you have these command Sorry record issues is the command of basically the step or Actually, it's a freestyle Postop a post step publisher and it is available in the step as well and then you have some flags and Basically, we have 20 different flags because the plug-in is getting complex and even complexer And but the main interesting thing is use you need to say, okay, which tool I want to pass so here we have a symbol and And for each of the tools I have you Must select the corresponding symbol So if you want to pass in the maven console a lock you need the tool console look if you Say here want to see the Java warnings of the Java compiler. You need that you can Put multiple tools then you need here the tools if you want one tool you take this step and You also Sometimes it depends a little bit on your configuration need to provide the encoding of source files Because the source files are visualized afterwards. You need to provide the encoding of the report files There are a lot of parameters you can use but the new thing is that we in the old plug-ins you had something like find bugs Etc. This is now replaced with a single step and The thing which is a variable is the tool which you give yours for instance, you say, okay this is check style with a pattern target check style and Even the open task scanner It's a little bit more complicated. You can say, okay, which files I want to scan for to-dos I scan for Java files. I don't want to scan in the target folder and Fix me is a high priority warning and then to do is a normal Warning so you basically have the same functionality in pipelines as you have in freestyle jobs That looks beautiful now Do I do I kind of also work in the pipeline syntax UI that that generates these things for me? So we have So And and it's more than enough if you just tell me yes, you don't have to have to even show the demo you've seen you You know it works in pipeline syntax. That's brilliant because now I have an easy way to generate script Yeah It works But there seem to be some problems I think here I have it because What I think nobody else ever have done had done before to have List of about 100 elements Oh, no, that's been done Yeah, more more than that and I'm sure that it was an issue there, too It's just there's only so much The different thing in my thing is that the the UI here So let's say my open tasks kind of Yeah It's a different UI Okay broken for each one Let's say find bugs. It's a little bit easier because it has just one checkbox. No, okay, you see it's Sometimes it's broken and I think the problem is that we the Jenkins renders these things Somehow strangely and it takes every Sub diffs and it's a little bit too complex. So, hmm, you know Jesse was actually just because I'm gonna talk about this and he actually commented about that. There's a bug for the for the editor window resizing Already, of course, so any any help people want to hop in on that. I'll Include that in the in some of the links that we do after this, but um, that's also it. What's interesting to see I mean from a Jenkins developers perspective looking at this I'm just fascinated that you're the way that you're sort of pushing the envelope with this in some ways and Showing what you what can be done with Jenkins and how do you make how you make actually kind of these modern UIs? even Even under some of the the the older spaces here and then of course you run into the limits of what what's what's possible And and you and bugs. I'm sure any second now Jesse will be posting on on the Gator channel what the buggy is for the thing you just mentioned because it's the kind of thing that Somebody's tried to do it before right? So So Okay, we were a pipeline. So this is the simple step if you are writing a pipeline We have The same thing you can use in If you have a declarative pipeline it works as well so you can use the same command it is pretty easy and I also have And this is what I wanted to show here. Um Sorry, it's too many tabs Okay, I think here we were If you have a pipeline and want to configure it and some people have Different ideas on this is from Okay, that's better. You can split this command the record command into two commands where you can Create issues and then publish issues. So you can if you're working in parallel you can even split this step into two steps to Have some special requirements Actually, and there was one other question. I actually was going to ask this other the Can you configure what the base? Uh, the the reference build is from inside pipeline Yes, you every parameter you can choose From uh freestyle builds you can also choose in pipelines. Awesome. Great. Great It is something you get out of the box. So I did not do anything for it. So I I'm just provided a publisher which works for freestyle builds and I just need to implement one interface and then everything is working out of box for pipelines Right on anyways and maybe Prepare this as a slide Um, let's jump into it. Uh, so What you've seen now is this pipeline support the simple mode where you have So scanning for warnings and the publishing are two different things But if you use the three card issues, uh command you get everything in one place and some projects Want to use an advanced mode. That means you can scan in different Parallel steps and you want to publish only one report And you or you want to to compile for ubuntu and compile for Other linux systems and then you want only a single report. You can have it as well This works only in scripted pipelines But some people yeah prefer to use it in that way. So this is possible as well okay, so basically So let's jump back to so Yeah, so the way that works so that then what you have is Uh, you have one step that does a bunch of like you have a bunch of scan steps And then a publish at the end that says okay now publish them. Yeah. Okay. Yeah Okay, cool So, um, I think it's the main future features you've seen now so some small things maybe to Show what I've included in the new release is Something which was part of the analysis collector plug in in the previous releases And you have on the dashboard view you see for each job the number of warnings And you can see them by icon or you can see them by text. So this is a thing which can be configured So this is I think helpful if you have a large set of projects and want to see which projects have warnings and which have no warnings at all So Uli I don't recognize this particular dashboard view is this is a standard part I had not seen this before. I think it's a beautiful piece of work. How do I get there? It's a plug-in Yeah, the dashboard view I'm using very often in projects Which contains several types or you see the tests the analysis everything is aggregated And the thing is dashboard view plug-in which you need So I think Yeah, I have support for the token macro if you need that So some small things are in the plugins. You yeah, you actually Don't see they are just there um I think one thing. Let's see what have I written here. Okay one thing. Um I talked the plugin already supports 100 different tools If your tool is not supported you have two ways to support it one way is to write a new plugin and provide a java parser for this tool It should be quite simple And it's even simpler if you have a simple format You can define a parser on the on the user interface so you I have In the check it system configuration you can define new parsers where you have to define a name and an id and then you have Unregular expression Some kind of groovy script and then you can pass for instance This is an example lock if you have some old language which is not supported by Jenkins so far you can write your own parser and include it afterwards in my steps So this is also not new it was part of the warnings plugin and I also integrated into the new warnings plugin So I think yeah These are most of the interesting features So maybe it would make sense to Have some questions Well, you know, it's funny to have this thing where we have questions at the end. We've been asking them all the way through so I mean Okay, as they've come up Okay, I do have one so I was a long time user of the warnings plugin before next generation came out And as far as I can tell it seems like I can coexist the old warnings plugin in the new and I can make a transition at whatever pace I choose to are there any Things that I should be watching for as a warnings plugin user as I move to warnings next generation Um, actually, uh I programmed it that way that there is they can coexist So you can have in one chop the results of the warnings plugin and the results of the warnings next generation plugins So you you you always will see Uh the old results um, I think it was necessary because it It yeah, it takes a lot of time to write a migration of the old data and I did not find the time to do that So it's still possible to use both things um It it's one thing or one problem we have in Jenkins. Um is that we have The problem of symbols with the same name and I think we already had this problem in the pmd plugin and I think the android lint plugin they used the same A symbol on the step. So then the parser of the declarative pipelines. Um, yeah, don't work anymore so if you Continue to use the android lint plugin and my plug in Um, all together and in parallel. It's a little bit complicated because you sometimes get problems but Some of the problems Because of my plugins. These are problems because of the underlying architecture All right. So some of the old plugins may not Make it easy to coexist. I know I didn't encounter any problems personally But it sounds like you found some some sort of niche cases or corner cases where At prior plug-in and the new plug-in they have some conflict that that a user or an administrator may detect Yeah, that's true Now is there anything that we should be aware of here with regard to how this interacts with blue ocean Is it available in blue ocean at all or is that a separate separate topic? Yeah um, I think this is a separate topic When I started writing the new extensions, I wanted to do it with blue ocean um, but actually, um I ask a lot of times in the mailing list if they are ready for extension, but I think they are still not ready for extension So there is and there is an Yeah, I think they wanted to make something that is extendable, but it's not yet finished And I'm not sure if it's feasible at all. So Blue ocean makes a total different model so the And I wanted to wait but somehow. Yeah, no It was I think it's two years ago when they They contacted me if we can make something and actually it it didn't work out So we decided to make it with the old jelly style and just use some new libraries, which is yeah simple for the plug-in developer On those new libraries that you're using Any guidance that you can give or places you could give pointers to people if others wanted to experiment with The new libraries you're using in the context of jelly Yeah I think one Or a good way to integrate these new libraries would be to provide some kind of new user interface plug-in, which provides these libraries Currently everything is coded into my plugin So if If you want to use these libraries you either either need to Yeah, include it in your plug-in or Yeah, you can't use it from my plug-in. So this is a little bit complicated And I think this is where the work really starts So If you want to for instance, if you want to use bootstrap 4 Which i'm using We actually need to provide a plug-in which is called bootstrap 4 and then another plug-in can use it So but this has to be done. So I have not found the time to do this in my plugins Well, the work you've done is absolutely awe-inspiring. I'm so impressed. Thank you. Yeah, I'm I'm really what's what's interesting To me about this is is the level of like this plug-in is really great and does great stuff and That that's you know, it's a whole whole next generation of this this work And yet at the same time Like you could have a whole another we have a whole another online meet-up just about the work that you did to Add add these very add the some of these technologies that you're using in there on just we could do just just that on its own too Okay So yeah, I'd be interested in like looking at what your Thoughts are for the for the for some of these other other things that you would want to do in terms of splitting out and Making this available to other other plugins Yeah, even the trend charts for instance, uh, these are code hardcoded in my plug-in But it would be I think really useful if we have a trend chart plug-in Which is configurable using some kind of API Where you can create these nice charts and these just work out of the box You have a configuration on the client side, etc This is Nothing which should be part of my plug-in. It should be part of a greater plug-in So, yeah, absolutely. Yeah, there are client programmers available Feel free to join All right. Well, I I think that's that's almost our time and also, uh, also what we're uh Well, we have to work on uh have to talk about for the day. Um, I will include links to A bunch of the stuff that we talked about and hopefully the slides as well in the in the the description of the the video and Really, thanks so much for being here And and presenting this it's really really great Yeah, see you next All right. Thanks. Thanks. We'll see you. Bye Mike