[00:36] <apogee_ntv> Yeah shouldnt be too hard to wrap treesitter?

[00:37] <apogee_ntv> Or parse those... whats the files the JS hilite uses?

[00:37] <apogee_ntv> highlight.js config files

[00:37] <apogee_ntv> Should be easy with a grammar

[00:37] <apogee_ntv> or is it prism.js?

[00:38] <apogee_ntv> I dont know, I dont write a lot of JS

[00:38] <SmokeMachine> In theory AST and deparse should be able to highlight, I suppose…

[00:39] <apogee_ntv> https://github.com/tree-sitter/tree-sitter/tree/master/crates/highlight Should be able to write thin FFI wrapper around this

[00:39] <apogee_ntv> then nativecall to it

[00:40] <apogee_ntv> https://github.com/tree-sitter/tree-sitter/blob/master/crates/highlight/include/tree_sitter/highlight.h There's already ffi

[01:03] <SmokeMachine> m: use experimental :rakuast; say “say 11 + 31”.AST.DEPARSE: class Bla is RakuAST::Deparse { method hsyn($type, $content) { “({ $type }: { $content })” } } # apogee_ntv

[01:03] <evalable6> SmokeMachine, rakudo-moar 5e09687ff: OUTPUT: «(core-say: say) (literal: 11) (infix-+: +) (lit…»

[01:03] <evalable6> SmokeMachine, Full output: https://gist.github.com/614e6c43bd69a0e041a3fa41ed2e0840

[01:13] *** hulk joined
[01:14] *** kylese left
[01:29] *** sibl joined
[01:29] *** sibl left
[01:29] *** sibl joined
[02:00] <SmokeMachine> spoon a multi line input, is there a way to get the cursor position and/or emit events when that position changes?

[02:15] *** hulk left
[02:15] *** kylese joined
[02:58] *** apogee_ntv left
[03:00] *** apogee_ntv joined
[03:58] *** mtj left
[04:01] *** mtj joined
[04:27] *** sibl left
[04:47] *** thatonelutenist left
[04:51] *** thatonelutenist joined
[04:55] *** thatonelutenist left
[05:09] *** Aedil left
[05:11] *** thatonelutenist joined
[05:17] *** sibl joined
[05:19] *** Aedil joined
[05:31] *** annamalai left
[05:52] *** annamalai joined
[06:08] *** annamalai left
[06:08] *** annamalai joined
[06:52] *** dakkar joined
[07:12] <disbot2> <librasteve> that gif is wild - amazing how it already looks so good!

[07:31] *** soverysour joined
[07:35] *** Sgeo left
[07:41] *** soverysour left
[07:43] *** soverysour joined
[07:43] *** soverysour left
[07:43] *** soverysour joined
[07:50] *** soverysour left
[08:21] *** soverysour joined
[08:21] *** soverysour left
[08:21] *** soverysour joined
[08:28] *** soverysour left
[08:52] *** soverysour joined
[08:56] *** soverysour left
[09:11] *** sibl left
[09:35] <SmokeMachine> :)

[09:48] <disbot2> <librasteve> fwiw i use Rainbow for syntax hiliting … not quite RakuAST

[10:07] *** justache left
[10:07] *** justache joined
[10:22] *** xkr47 left
[10:40] <SmokeMachine> I don’t know how I would add colors to a MultiLineInput, neither how to do that while writing… apogee_ntv, any suggestion?

[10:50] <apogee_ntv> SmokeMachine: It's not currently rich IIRC. I think we would want a proper editor widget.

[10:50] <apogee_ntv> Since multiline doesnt support things like normal up/down navigation on multiline text, it would make a poor editor for large source files.

[10:55] <SmokeMachine> apogee_ntv: Sorry, what do you mean by up/down? It seems to work... https://usercontent.irccloud-cdn.com/file/rYSJAQMr/CleanShot%202026-04-29%20at%2011.54.25.gif

[10:57] <SmokeMachine> Scroll also seem to work... https://usercontent.irccloud-cdn.com/file/ElMeokeQ/CleanShot%202026-04-29%20at%2011.56.54.gif

[11:00] <apogee_ntv> SmokeMachine: If the lines wrap, it will wrap to the logical line not the display line, it also wont preserve col if it goes past a blank line IIRC. It wont feel like vim/emacs I guess is what I mean :P

[11:00] *** sibl joined
[11:01] <apogee_ntv> I mostly designed the existing widget set for an LLM inference client so 'chat-ish' purposes, an editor widget is on my todo list though

[11:01] <apogee_ntv> I would like an editor written in Raku to edit Raku, good dogfooding opportunity.

[11:02] <SmokeMachine> apogee_ntv: you mean something like this? https://usercontent.irccloud-cdn.com/file/IoYtqmhm/CleanShot%202026-04-29%20at%2012.01.55.gif

[11:03] <apogee_ntv> But right now working on some other Selkie apps

[11:03] <apogee_ntv> No I mean, go on one of the a's and press down

[11:03] <apogee_ntv> or up

[11:03] <apogee_ntv> It will move the cursor to the logical line above/below, not the character displayed above/below

[11:04] <apogee_ntv> Then go in vim and do the same

[11:04] <apogee_ntv> It will move to the character

[11:04] <apogee_ntv> on the display line below

[11:05] <apogee_ntv> And if you make 3 lines: 'abcdefg', 'zyx', and '1234567'. Put the cursor on 'f'. In any normal editor if you press down twice, cursor will end up on '6'. Here I believe it will end up on '1' or '3' (not 100% sure off hand).

[11:06] <SmokeMachine> https://usercontent.irccloud-cdn.com/file/T1MxkhB5/CleanShot%202026-04-29%20at%2012.04.13.gif

[11:06] <apogee_ntv> Yeah see, it should jump to the 'a' on the 2nd line directly below the 'a' you have highlighted to 'feel right' as an editor.

[11:07] <apogee_ntv> Though that one is less important than

[11:10] <SmokeMachine> on nvim... my last moves were using "gj" and "gk", that's why it came from a line of "a" to another line of "a"... https://usercontent.irccloud-cdn.com/file/EIOKmHI7/CleanShot%202026-04-29%20at%2012.08.06.gif

[11:10] <SmokeMachine> (sorry I tried to keep the same panes/windows/... positions)

[11:11] <apogee_ntv> Sec let me show you the bigger problem

[11:11] <apogee_ntv> https://wormhole.app/kzBPPm#Xv_UwBkvshdYoFyJlTzsQg

[11:12] <SmokeMachine> on my example with MultiLineInput IMHO the biggest problem is when going back to the "a" line, it does not go back to the column it was before...

[11:12] <apogee_ntv> Yeah exactly

[11:12] <apogee_ntv> Thats the big 'editor pane' issue

[11:12] <apogee_ntv> Though tbh I'd like to do one with modal editing & vim keybinds lol

[11:12] <apogee_ntv> At least the major ones like i, esc, hjkl.

[11:13] <SmokeMachine> I would like it a lot

[11:13] <apogee_ntv> I'm also looking at wrapping treesitter to give it syntax highlighting

[11:14] <apogee_ntv> And AST level hierarchy for i.e. go to definition

[11:14] <apogee_ntv> Not going to implement a full code editor

[11:14] <apogee_ntv> But at least enough that it feels nice

[11:15] <SmokeMachine> I'm looking forward to it... it would male the playground and some other projects I'm planing to start much nicer...

[11:24] <apogee_ntv> I plan to do some widgets in a Selkie::X namespace, just to avoid making the base lib huge.

[11:24] <apogee_ntv> Like pulling in treesitter as a dep definitely doesnt belong in Selkie base.

[11:26] <apogee_ntv> Its a pretty heavy rust lib

[11:47] <apogee_ntv> Hm there's actually no full coverage treesitter plugin *for* Raku that I can find.

[11:48] <apogee_ntv> Maybe RakuAST can do this job better...

[11:54] <apogee_ntv> Hm, I will end up in a rabbithole if I keep looking at syntax highlighting :D Parking for now, its definitely doable but its a large chunk of work because the logic to do the actual highlighting from RakuAST is hard and treesitter probably cant cover slangs etc.

[11:54] <apogee_ntv> Though done right it could make the neovim experience less painful.

[12:05] <SmokeMachine> for syntax highlight, it seems Rainbow should be used (as librasteve_  suggested)

[12:07] <SmokeMachine> apogee_ntv: is there some kind of a tree widget? I mean a widget to create trees

[12:08] *** [dpk] joined
[12:08] *** dpk left
[12:09] <apogee_ntv> SmokeMachine: Not currently but I have trees in one of my projects

[12:10] *** [dpk] is now known as dpk

[12:12] <SmokeMachine> Would you be kind enough to share that code (or maybe if you have enough time, create a widget with that)?

[12:14] <apogee_ntv> Yeah its only 1 level so not really a tree but should be easy to recurse, let me dig it up

[12:15] <apogee_ntv> Actually I implemented multi-level even though data is 1 level

[12:19] *** soverysour joined
[12:19] *** soverysour left
[12:19] *** soverysour joined
[12:19] <SmokeMachine> Even better! :)

[12:22] <apogee_ntv> OK it's pretty deeply embedded in a whole bunch of other render logic lol but https://paste2.org/zX8IO1v4 should cover all of the tree render logic.

[12:23] *** soverysour left
[12:23] <apogee_ntv> This is for a TUI gtd app I've been building

[12:24] <apogee_ntv> And these widgets are specifically for tasks, not just lines of text, hence all the extra logic

[12:24] <apogee_ntv> I got fed up of paying for omnifocus so decided to rebuild it

[12:27] <apogee_ntv> https://wormhole.app/Pp6ElN#RhZthZVlnzS21rXK5BWbkQ Renders like this

[12:28] <tbrowder> anyone having problems on github with "actions/checkout@v4"? if so, what's the fix?

[12:29] <apogee_ntv> tbrowder: Use checkout@v5 I guess

[12:29] <apogee_ntv> or v6

[12:29] <apogee_ntv> I know Github actions are turning off Node 20 runners at some point but my v4s are still working atm

[12:30] <SmokeMachine> apogee_ntv: it looks good! I’m planing on using that to list a match returned by a grammar parse

[12:31] <tbrowder> ok, thnx, i'll try v5 which i assume works. in the early days i thought a raku person had to build the actions

[12:35] <apogee_ntv> I am aiming for a v1 Selkie release sometime next month with a proper website, tree widget should probably be a high priority with collapse/expand logic.

[12:36] <apogee_ntv> Aiming to pull some non-Raku people over by offering the only route to notcurses that doesn't require you to know notcurses internals lol

[12:36] <apogee_ntv> Which is a vast api -- ~600 functions, full manual memory management, etc

[12:40] <apogee_ntv> I built ~90% Omnifocus parity in a week, thats a $150/yr commercial application. Kinda nice.

[12:46] *** sibl left
[12:51] <SmokeMachine> apogee_ntv: I totally agree Selkie is very very nice and I think it has the potential to bring people to Raku. I hope, once it’s done, Selkie::UI can also help a bit… :)

[12:53] <apogee_ntv> I think it will, Selkie is verbose for simple things.

[12:54] <apogee_ntv> Selkie::UI seems not to be as verbose.

[12:55] <apogee_ntv> Well, I say Selkie is verbose, I'm used to writing raw notcurses and it's much more terse than that but probably building TUI in asm is less verbose than using notcurses (:

[12:56] <apogee_ntv> Great lib but it prioritises feature completeness & perf over DX at every junction

[12:59] <tbrowder> btw, my problem was actually caused by a spurious comma on the end of a META6.json file. not an intuitive msg...

[13:18] <disbot2> <librasteve> oh - maybe post your reddit items to reddit/r/C_Programming ... there seems to be some notcurses stuff there

[13:23] <apogee_ntv> Hm they might get upset when it's not in C though :D Selkie is half pseudo-C I guess.

[13:23] <apogee_ntv> Its a *lot* of NativeCall

[13:49] <disbot2> <librasteve> yeah - I guess

[14:36] <SmokeMachine> librasteve_: I’m sorry, but I’m curious… so how did you implement the PR you closed on Cromponents today?

[14:38] <disbot2> <librasteve> PR? Cromponents? Me? Today?

[14:39] <disbot2> <librasteve> Oh - short memory - sorry

[14:40] <SmokeMachine> https://github.com/FCO/Cromponent/issues/19

[14:43] <disbot2> <librasteve> OK - three things I guess

[14:47] <disbot2> <librasteve> (i) Air::Base::Nav is already a thing https://github.com/librasteve/Air/blob/b6759a631c47d95383eb9cc809cacbeac4a0172e/lib/Air/Base.rakumod#L403 and it and yes it takes a List of Pairs like this https://github.com/librasteve/raku.org/blob/bd84ffb60bb86f3baf19de2fb4e3e5f1d50742b0/lib/Org.rakumod#L60 I did not make C(r)omponent a target - but no reason why not

[14:50] <SmokeMachine> 👍

[14:50] <disbot2> <librasteve> (ii) the stubs refactor includes an explicit page tree - on reflection my thinking was to ape WordPress (!) and there an admin can dynamically change page name and reassign the parent (no restart) - so I realised that needs a catch all Cro route (here *@rest) https://github.com/librasteve/Air/blob/b6759a631c47d95383eb9cc809cacbeac4a0172e/lib/Air/Base.rakumod#L929

[14:51] <disbot2> <librasteve> here is how to declare and inspect the tree https://github.com/librasteve/Air-Examples/blob/main/bin/23-stubs.raku

[14:52] <disbot2> <librasteve> note that this also makes a robots.txt and a sitemap.xml

[14:54] *** xkr47 joined
[14:56] <disbot2> <librasteve> (iii) I have kept the class Page does C(r)omponent does Sitemapped {...} so that entire pages can be stored in Red and you can easily extend to have a query to eg list all pages and their create dates, titles, descriptions (thing the archive view on https://rakudoweekly.blog)

[14:57] <disbot2> <librasteve> the canonical WordPress model is that everything is a post and all gets stored in the posts table; the canonical Air model is that everything is a C(r)omponent and everything gets stored in Red via it's own model

[15:02] <SmokeMachine> makes sense

[15:03] <disbot2> <librasteve> 👍  (you are welcome to propose improvements to Air ofc)

[15:40] *** itaipu left
[15:46] *** human-blip left
[15:48] *** human-blip joined
[15:52] <SmokeMachine> librasteve_: I'm starting playing with this idea I think is closer to what was wanting: https://usercontent.irccloud-cdn.com/file/UgiAF17r/CleanShot%202026-04-29%20at%2016.49.05.gif

[15:52] *** dakkar left
[15:53] <SmokeMachine> but I plan to make the output a tree

[15:54] <SmokeMachine> and I want to make that tree selectable and when selected it would highlight the session on the string it corresponds to

[15:57] *** itaipu joined
[16:06] *** abraxxa left
[16:12] *** soverysour joined
[16:12] *** soverysour left
[16:12] *** soverysour joined
[16:18] *** andinus left
[16:19] <SmokeMachine> is there a way to avoid infinite loop on generic grammars? or at least timeout grammars? when I do something wrong that starts a loop on this test, it hangs...

[16:20] <librasteve_> that looks reasonable

[16:21] *** soverysour left
[16:30] *** soverysour joined
[16:40] *** soverysour left
[16:41] *** human-blip left
[16:42] <lizmat> SmokeMachine: perhaps you can figure out running with -Mownup  and then pressing ctrl-c when it infiniloops

[16:42] <lizmat> it will give you the stacktraces of all threads

[16:43] *** human-blip joined
[16:45] *** soverysour joined
[16:45] *** soverysour left
[16:45] *** soverysour joined
[16:47] *** Guest35 joined
[16:48] *** Guest35 left
[16:50] *** soverysour left
[16:55] <SmokeMachine> lizmat: thanks, let me try it out

[16:56] <SmokeMachine> lizmat: ownup?  is that builtin? it wasn't found here...

[16:57] <lizmat> oops, sorry

[16:57] <lizmat> -Mown-up

[16:57] <lizmat> and yes that's a builtin module

[17:03] <SmokeMachine> it did not print anything... :(

[17:03] <lizmat> ah?  But it did stop execution?  or not ?

[17:04] <SmokeMachine> I ctrl+c it...

[17:07] <lizmat> what happens if you:

[17:07] <lizmat> $ raku -Mown-up -e 'loop {  }'

[17:07] <lizmat> and control-c that ?

[17:08] <SmokeMachine> lizmat: on this example it hanged when I pressed * (`rule char {.*}`) and then after trying to write anything, arrows, etc and nothing happening, I ctrl+c https://usercontent.irccloud-cdn.com/file/9Cji2qe8/CleanShot%202026-04-29%20at%2018.05.26.gif

[17:09] <SmokeMachine> let me try to golf it...

[17:09] <lizmat> yeah, looks like Selkie is stealing control-c

[17:09] <lizmat> m: use own-up; own-up

[17:09] <evalable6> lizmat, rakudo-moar a8b8c7132: OUTPUT: «(exit code 1) ===SORRY!=== Error while compilin…»

[17:09] <evalable6> lizmat, Full output: https://gist.github.com/274b49b3962c1db6fdf28d9efa47ef7e

[17:10] <lizmat> m: VM.own-up

[17:10] <evalable6> lizmat, rakudo-moar a8b8c7132: OUTPUT: «(exit code 2) ␤==========␤Thread 1 (perl6) requ…»

[17:10] <evalable6> lizmat, Full output: https://gist.github.com/14068bcce4f6c9296198a1293788ea64

[17:10] <lizmat> if you can make it to execute "VM.own-up" an a control-c, you should be in business

[17:10] <SmokeMachine> https://www.irccloud.com/pastebin/XxlZ1rNk/

[17:11] <lizmat> Thread 1 is the interesing one...

[17:12] <lizmat> but it doesn't tell us much  :-(

[17:12] <SmokeMachine> :(

[17:14] <SmokeMachine> I don't know what to do... :(

[17:15] <lizmat> if you put that code in a text file and then run it, does it also hang?   Am not sure whether this is a core or a Selkie issue at this point?

[17:19] <disbot2> <librasteve> I am considering a generic way to get from a Grammar to a populated object - ie if the attribute names match the token / rule names then they get loaded - a Transformer that takes a Match and a class name and returns an instance

[17:19] <disbot2> <librasteve> does anything like that exist?

[17:19] <disbot2> <librasteve> (in Raku land)

[17:20] <lizmat> aren't actions allowing you to do that ?

[17:21] <disbot2> <librasteve> sure - but i’m too lazy to write a custom Action for each target class

[17:22] <disbot2> <librasteve> maybe i can write a role on the class that takes the match object and then introspects :-)

[17:23] <disbot2> <librasteve> does Actionable

[17:28] *** andinus joined
[17:30] <SmokeMachine> on my last message I tried that with no selfie... 

[17:31] <SmokeMachine> m: grammar Bla { rule TOP {<char>+}; rule char {.*} }

[17:31] <evalable6> SmokeMachine, rakudo-moar a8b8c7132: OUTPUT: «»

[17:32] <SmokeMachine> m: grammar Bla { rule TOP {<char>+}; rule char {.*} }; Bla.parse: "asdf"

[17:32] <evalable6> SmokeMachine, rakudo-moar a8b8c7132: OUTPUT: «(signal SIGHUP) «timed out after 10 seconds»»

[17:40] <lizmat> that feels like it should just match all chars...

[17:43] <SmokeMachine> lizmat: that's expected to infinite loop, and that's usually ok... my problem is that I am running that grammar on every edit to the code, so it makes it much easier to happen...

[17:46] *** soverysour joined
[17:55] *** abraxxa joined
[18:18] <disbot2> <melezhik.> o/

[18:20] <disbot2> <melezhik.> So I am generating Sparrow task check DSL using Qwen 3.6 plus and results are pretty impressive

[18:20] <disbot2> <melezhik.> Here are some examples for those who are interested

[18:21] <disbot2> <melezhik.> verify output from rpm command to verify package is installed and has some specific version or greater then the one - https://chat.rockylinux.org/rocky-linux/pl/6rah1zzyctg4bbbzu4tpt5doar

[18:22] <disbot2> <melezhik.> verify output from df command and validate that you have swap and home mounts , and that /root partition  capacity is more then 20 percentage  - https://rpa.st/LO4JE

[18:23] <disbot2> <melezhik.> verify that input is valid date in ISO format and that this is current date - https://rpa.st/MPTAQ

[18:24] <disbot2> <melezhik.> Sometimes it uses Python for handlers, sometimes Perl. I don’t know why ))

[18:24] <disbot2> <melezhik.> https://github.com/melezhik/Sparrow6/blob/master/documentation/taskchecks.md

[18:27] *** abraxxa left
[18:28] <disbot2> <melezhik.> If someone wants to try just let me know - I use Qwen for free from browsers

[18:29] <disbot2> <melezhik.> The question should be: “You are sparrow task check dsl expert - use following links as documentation   https://github.com/melezhik/Sparrow6/blob/master/documentation/taskchecks.md  And generate task check dsl code to BLA BLA BLA”

[18:29] <Voldenet> SmokeMachine: if you don't mind memleaks on abort, then maybe raw pthreads could work

[18:35] <Voldenet> (there's no uv_thread_abort, so you can't do this https://github.com/MoarVM/MoarVM/blob/091571bdbd7afa51970d05bfc0824c9f1f441560/src/core/threads.c#L185 )

[18:42] <Voldenet> any reliable timeouts in EVAL would pretty much require hacky threading magic though

[18:42] *** abraxxa joined
[18:47] *** soverysour left
[18:48] <disbot2> <melezhik.> verify output from raku -v command and verify that raku version is greater then 2026.04 - https://rpa.st/PJMXS

[18:48] <disbot2> <melezhik.> This is kinda cool - LLM knows how to use zoom in expression ( within: )

[19:53] *** perryprog left
[19:54] *** perryprog joined
[19:57] *** soverysour joined
[19:59] *** soverysour left
[20:17] *** perryprog left
[20:18] *** perryprog joined
[20:50] *** peder left
[21:01] *** justache left
[21:05] *** justache joined
[21:05] *** justache left
[21:07] *** justache joined
[21:35] *** abraxxa left
[21:41] *** Aedil left
[21:53] *** perryprog left
[21:58] *** perryprog joined
[21:58] <[Coke]> easiest way to test something where you have to run the test on a given day? container? Maybe an override of Date.today?

[22:00] <disbot2> <librasteve> maybe override Date.today with a wrapper set from an ENV?

[22:13] <lizmat> depends on how you create the Date object

[22:15] <lizmat> m: use MONKEY; my class Date is Date { method today() { "2006-04-30".Date } }; dd Date.today

[22:15] <evalable6> lizmat, rakudo-moar a8b8c7132: OUTPUT: «Date.new(2006,4,30)␤»

[22:15] <lizmat> m: my class Date is Date { method today() { "2006-04-30".Date } }; dd Date.today   # don't need MONKEY that way

[22:15] <evalable6> lizmat, rakudo-moar a8b8c7132: OUTPUT: «Date.new(2006,4,30)␤»

[22:17] *** Sgeo joined
[22:38] <[Coke]> nice

[22:47] *** silug left
[23:15] <apogee_ntv> Currently bumping all of my packages to not use node 20 github actions, hopefully nothing breaks :D

[23:15] <apogee_ntv> I already had to adopt a Windows action for setting up msvc

[23:15] <[Coke]> don't rush with that.

[23:15] <[Coke]> let me find you the bug...

[23:16] <[Coke]> https://github.com/microsoft/azure-pipelines-agent/issues/5464

[23:16] <[Coke]> Sounds like 20 is the recommended version right now and the warning was over-eager

[23:17] <ugexe> [Coke]: I suspect `RAKUDO_RAKUAST=1 make install` never truly worked. what would have sort of worked was doing like `make install && RAKUDO_RAKUAST=1 make install`

[23:18] <ugexe> which is an easy state to find yourself in and not realize it

[23:18] <[Coke]> ah, ok.

[23:18] <[Coke]> do you want https://github.com/rakudo/rakudo/issues/5906 ?

[23:18] <ugexe> since make doesn't know that environment variable means the artifacts it would generate wouuld be different

[23:19] <ugexe> i already submitted PRs to make it work

[23:19] <apogee_ntv> [Coke]: Node 20 is EOL Apr 30th

[23:19] <[Coke]> ahhh.

[23:19] <[Coke]> apogee_ntv: ah, those tickets were complaining about the warning in advance, didn't realize we were that close.

[23:20] <ugexe> PRs 6123 through 6127 are for make install

[23:20] <apogee_ntv> I dont think they will remove it from Github Actions until probably Oct

[23:20] <ugexe> the ones after that are for make test and make spectest

[23:20] <apogee_ntv> But it does go EOL today (as of UK time)

[23:21] *** perryprog left
[23:21] <apogee_ntv> Raku/install-rakudo action is really flaky atm

[23:21] <apogee_ntv> Raku/setup-raku*

[23:22] <apogee_ntv> Times out on about 20% of runs.

[23:23] <ugexe> i've merged the PRs that anyone left a comment or emoji on

[23:29] <[Coke]> ugexe++

[23:35] *** perryprog joined
