IRC channel logs

2023-11-10.log

back to list of logs

<mirai>less paperwork and entry barriers I suppose?
<vagrantc>copyright assignment has ... lots of issues.
<ieure>It took me *two years* to get a patch accepted into EMMS because of the copyright assignment rigamarole.
<vagrantc>i thought most GNU projects don't even require assignment anymore
<vagrantc>many have been abandoning it...
<ieure>And a previous one almost derailed the buyout of the company I was at. I was an early employee and had no problem getting them to sign the waiver. Then the company who was buying us found it in the bottom of a filing cabinet and FREAKED OUT and it became an issue raised to the board of directors of both companies, one of which was a $10b+ global bank.
<vagrantc>and how many decades have passed since the FSF did any actual enforcement?
<vagrantc>and ... on that note ... off to other things :)
<vagrantc>ACTION waves
<mirai>ieure: what was the problem?
<Guest25>thanks Andronikos
<lechner>peanuts / help
<peanuts>lechner: Hi, for comments please contact my maintainers at https://codeberg.org/lechner/irc-helper-bot
<Kolev>peanuts, show me your source code.
<peanuts>Kolev: Hi, for comments please contact my maintainers at https://codeberg.org/lechner/irc-helper-bot
<lechner>Kolev / patches are accepted!
<KE0VVT>Trying to install with the latest ISO. https://issues.guix.gnu.org/66786
<peanuts>"Failed to install" https://issues.guix.gnu.org/66786
<KE0VVT>Where is the system declaration for the live image?
<apteryx>KE0VVT: see 'installation-os' in (gnu system install)
<apteryx>Andronikos: Guix does not require copyright assignment to the FSF, unlike other GNU project; for the better and worse.
<apteryx>*some other GNU projects
<KE0VVT>apteryx: Thanks.
<KE0VVT>I'm having trouble making a live image with GNOME. https://bpa.st/NV2A
<peanuts>"View paste NV2A" https://bpa.st/NV2A
<apteryx>am I the only one with erratic Emacs menus?
<apteryx>sometimes they take some time to open; other times they get stuck and I need to click a couple places to recover
<podiki>menus like from the toolbar? or are you using posframe?
<apteryx>toolbar yes
<apteryx>on X11 (ratpoison wm)
<podiki>sorry, don't use them (toolbar off). but i have had problems with posframes (like the bar at the bottom but floating as box, not quite a real frame) recently
<isaneran>hmm wanted to prevent guix from downloading so much stuff again after runnin guix gc, one of these packages being guile-3.0.9-debug so I installed guile:debug which I thought would solve it but nope, still downloading it over again
<isaneran>any ideas of what I could do?
<lilyp>ieure: Companies freaking out at you assigning to GNU/FSF are waving the wrong kind of red flag anyway
<lilyp>s/assigning/assigning copyright/
<KE0VVT>lilyp: Corporations would welcome contributions to Apache Software Foundation.
<lilyp>yeah, they love themselves some rollover licenses
<bryan>I'm still finding my bearings with guix.  When trying to sort a problem with ublock-origin not completely blocking ads in ungoogled-chromium, I removed the extension from within chromium and can seem to get it back.  Can someone give me a hint and reference to docs where I can read up on how one should go about handling browser extensions in
<bryan>chromium?  Both packages are installed (and reinstalled) with guix.
<sner>bryan: you'll find that there are quite a few spots in guix where the best (and sometimes only) source of documentation is the guix codebase
<KE0VVT>A literate programming Guix codebase would be cool.
<sner>bryan: ~cd $(guix build -S guix)~ is your best friend for when that happens
<KE0VVT>sner: What's ~?
<sner>KE0VVT: a failed attempt at quoting a shell snippet lol
<KE0VVT>sner: Oh.
<sner>KE0VVT: bryan: if you're running into issues with chromium auto-loading the extension again after removal, it's almost definitely some state left over in your user-local chromium profile. if you don't want to purge the ~/.config/chromium dir entirely, targeted removal of some of the cached configuration there and running guix reconfigure should do it
<sner>(sorry for the mis-tag KE0VVT)
<KE0VVT>sner: It's OK! :D
<KE0VVT>Why isn't there a GNOME live image?
<KE0VVT>I'm building one now.
<bryan>sner: KE0VVT:  No, I just want it back after I removed it, but it's not as simple as searching it up in the google store....not complaining about that!   I just need to learn more, and guix is a defferent beast.
<bryan>sner: KE0VVT:  judging by my inability to type....I probably just need to sleep and it'll be a simple fix in the morning.
<futurile>Morning everyone
<gabber>\o
<Lumine>o/
<janneke>in a few moments: https://hpc.guix.info/events/2023/workshop/program/#how-to-get-started-using-guix
<peanuts>"Guix-HPC ??? Program" https://hpc.guix.info/events/2023/workshop/program/#how-to-get-started-using-guix
<janneke>=> https://www.youtube.com/watch?v=dT5S72x18R8
<peanuts>"GUIX HPC International Congress - YouTube" https://www.youtube.com/watch?v=dT5S72x18R8
<janneke>hmm, maybe i misread the schedule?
<gabber>or it's just not the right link?
<janneke>apparently civodul is not talking, but giving a tutorial (that's not broadcasted?)
<janneke>ACTION is looking at https://hpc.guix.info/events/2023/workshop/program/#software-heritage-archive-your-source-code-for-a-consistent-and-durable-referencing right now
<peanuts>"Guix-HPC ??? Program" https://hpc.guix.info/events/2023/workshop/program/#software-heritage-archive-your-source-code-for-a-consistent-and-durable-referencing
<janneke>yeah, thanks peanuts
<peanuts>janneke: Hi, for comments please contact my maintainers at https://codeberg.org/lechner/irc-helper-bot
<janneke>software heritage is also pretty cool!
<jpoiret>I think tutorials are not broadcasted
<jpoiret>(source : i'm there)
<janneke>yeah, bummer
<janneke>rekado's talk yesterday was pretty cool tho
<gabber>how come when i search the web (DDG) with the quoted string "GUIX HPC international congress" i *only* get that one youtube link from above?
<jpoiret>because that's not the name it was advertised with :p
<gabber>ok, this explains why i wouldn't match "First Workshop on Reproducible Software Environments for Research and High-Performance Computing" to be meaning the very same thing
<jpoiret>i was pretty surprised when I arrived there and say the "international congress" prefix
<jpoiret>saw *
<gabber>but yeah, rekado's talk is pretty cool and definitely worth the watch!
<Kabouik>Does anyone understand the error here? https://0x0.st/HtDY.txt This is the package definition: https://0x0.st/HtDg.txt
<cbaines>Kabouik, maybe try setting HOME to /tmp within the build and see if that changes anything
<Kabouik>How do I do that cbaines?
<cbaines>there's examples of this in guix.git, try searching for "HOME"
<Kabouik>Thanks, will look after lunch
<snape>hi all
<snape> https://ci.guix.gnu.org/ is down
<snape>nckx ^
<snape>(I don't know who else can restart it)
<Kabouik>I made the modification and it's not completed yet, but at least it's not erroring out as soon as it did before cbaines. Cool.
<cbaines>snape, I've done "sudo herd restart cuirass-web" on berlin and it seems to be back up
<snape>cbaines, thx, I still have 504 though
<cbaines>snape, hmm, yeah, something still seems to be up
<lechner->Hi, I'm working on bootloaders. What does it mean to "lower" an object via the store monad, please?
<cbaines>the docstring for store-lower says: Lower PROC, a monadic procedure in %STORE-MONAD, to a "normal" procedure
<cbaines>taking the store as its first argument.
<snape>lechner-: some high-level objects, like packages and (plain-file ...), can be transform into store items (derivations, or just store files).  This is what "lowering" means
<lechner->snape / thanks!
<snape>lechner-: when such a high-level object is unquoted inside a gexp (#$package...) the gexp code really sees the lowered object (a store file)
<lechner->snape / thank you! you have been very helpful
<snape>you're welcome :)
<snape>lechner- and the store monad is a framework that allows procedures to manipulate such high-level objects in a functional way without having to carry the connection to the build daemon around.
<lechner->snape / thanks! i think the bootloader code is mostly staying on "this" side of the monad.
<snape>good luck!
<jpoiret>lilyp: do you know why (native-comp-available-p) is nil for emacs-minimal and emacs-next-minimal on emacs-team? I'm trying it out wrt. #66864
<peanuts>"emacs-build-system builds .eln-files with mismatching path-hashes" https://issues.guix.gnu.org/66864
<apteryx>ACTION restarted ci.guix.gnu.org (cuirass-web)
<Kabouik>So what happens when you're on an >2-month-old package generatioon, and you run a `guix packageqe --delete-generation=2m`? I think I did that. All running processes gradually started to stop working, and the only later generation I have is broken due to power outage during the update. That'll be interesting.
<lechner->Hi, I would like to test some changes to our bootloader configurations. How may I do so without borking a real system, please?
<gabber>Kabouik: sounds like another edge case for that gc-bug you've encountered yesterday (:
<Kabouik>Actually gabber, I had to hard-reboot due to the above issues with all processes failing, but could reboot back so nothing is broken. But I still don't understand why a guix gc would break a running system.
<Kabouik>I still want to report it, but would like to better understand what is happening first.
<gabber>i *guess* the garbage collection was too greedy without checking whether stuff is still in use
<Kabouik>It was indeed more greedy than usual (would free 100GB!), but it couldn't complete so I'm still left with very low disk space left (18GB according to df, but I'm in btrfs so that is likely inaccurate).
<gabber>and by giving the 2 months option on a profile that uses older software you're somewhat implicitly telling the gc to also collect that stuf.. imho it should at least warn the user or hinder the user from doing so
<Kabouik>I was wrong on one thing above: my current generation was not older than the 2m pattern, it was actually just a few hours old, so that generation should not be comprised in the delete-generations pattern
<Kabouik>Alright, let's retry a guix gc I guess.
<apteryx>was there a new regression with shepherd recently introduced, that causes hangs on shutdown?
<apteryx>someone in my family using Guix System noticed that; they don't use NFS (the common reason for such a hang it seems)
<lechner->apteryx / how recently are you thinking?
<apteryx>in the last 2-3 weeks say
<apteryx>Kabouik: if you use Btrfs you should run btrfs balance sometimes to regain non-allocated blocks
<apteryx>you can look at the mcron jobs defined for berlin for example
<apteryx>(in the guix-maintenance repo)
<Kabouik>I do it from time to time, but I admit it's all manual.
<Kabouik>I'll do it after the guix gc, if it ever completes (CPU within 85-90°C, it's heating my office).
<apteryx>mirai: I'll try an attempt at snarfing texi from srfi HTML
<apteryx>what was the approach you suggested; parsing it with sxml?
<mirai>I'm not sure if sxml is cut for it, since it's HTML
<mirai>it would be if it were XHTML
<mirai>but HTML has some details that can choke XML tools
<apteryx>htmlprag should do it
<mirai>so perhaps the first step would be a HTML parser? or have upstream use a XML source that is styled to HTML via XSL stylesheets
<apteryx>to parse html into something usable
<mirai>… would be using …
<mirai>yeah
<Kabouik>I can't find a verbose option for guix gc, is there something I can do to check what is happening if it stays stuck on "finding garbage collector roots..." for more than 30 min?
<lechner->Kabouik / maybe a circular symbolic link?
<Kabouik>How would that happen, and how would I check/fix that?
<lechner->Don't remember but had it once. nckx helped me then
<lechner->Hi, will 'guix deploy' use the local bootloader code to configure the remote system?
<apteryx>it will use the bootloader defined in the operating-system definition deployed
<apteryx>Kabouik: if there's IO, its doing stuff. You just need to be patient :-) You could strace the daemon to see what it's doing exactly
<jpoiret>lechner-: if you want to test bootloader code the best is probably to reconfigure in a vm
<podiki>hi guixers
<lechner->jpoiret / thanks!
<lechner->Hi, which error did I encounter please? https://bpa.st/R5QQ
<peanuts>"View paste R5QQ" https://bpa.st/R5QQ
<lechner->Did I create a circular dependency with #:use-module?
<lechner->here is the cumulative diff https://bpa.st/RHPA
<peanuts>"View paste RHPA" https://bpa.st/RHPA
<lechner->actually, this is the cumulative diff. with magit d r, one has to mark an extra commit https://bpa.st/7QIA
<peanuts>"View paste 7QIA" https://bpa.st/7QIA
<lechner->i am trying to :use-module (gnu system) in (gnu bootloader grub)
<lechner->the error is on pull
<podiki>looks like it doesn't find (gnu build hurd-boot)?
<lechner->podiki / this is the commit that causes the message but nothing relates to (gnu build hurd-boot) https://bpa.st/PXDQ
<peanuts>"View paste PXDQ" https://bpa.st/PXDQ
<lechner->can this be fixed by moving the <boot-parameters> record into a separate file?
<podiki>sorry, not familiar with the code here
<podiki>i guess the error is complaining that in hurd-boot it doesn't find something it depends on? (unfortunately i also find these error messages hard to parse; if guix builds (not pulls) then there shouldn't be a circular dependency at least)
<gabber>maybe loading the modules in a repl raises a more useful error message?
<podiki>that's a good idea
<lechner->gabber / how would i do that, please?
<lechner->it would be guix repl, right?
<lechner->i guess i could try building first
<gabber>enter the repl and just do (use-modules (gnu build hurd-boot)) or whichever you were trying to build in the first place
<lechner->i was trying to pull, but it failed here build of /gnu/store/1wik4bsf9m7hnqiv1aih7lqiiyykzccp-guix-packages.drv failed
<gabber>do you have a source checkout ready?
<gabber>you could try to build that and $(./pre-inst-env guix repl) from there
<lechner->yeah, i'm building now
<lechner->ok
<jpoiret>lechner-: is the file checked-out in git?
<podiki>yes, if you didn't build guix (make) already, that would be first step
<jpoiret>the hurd-boot one
<lechner->jpoiret / presumably. i never worked on it
<jpoiret>oh, okay
<lechner->it's probably including something i worked on
<Rovanion>Is Pipewire ready for use on Guix System yet?
<lechner->some folks use it. i would like to but don't yet
<Kabouik>Is there a way to limit the CPU power that a guix command uses? I have tried "cpulimit -l 10 guix install mypackage", but there is no way this would be the clock and temperature of my CPU if that was taken into account: https://0x0.st/Htd_.png (and it was 2.9 GHz a minute ago). This is critical for me, because every "heavy" guix command I have run lately has ended up in a generalized crash of the system, presumably due to prolonged overheating, or too
<Kabouik> stringent throttling. I'm okay with waiting more, I just want the commands to complete.
<gabber>Rovanion: of course it is
<lechner->Kabouik / that's a hardware issue
<gabber>Kabouik: isn't there some BIOS option which could do that for you?
<gabber>are you on a laptop?
<Rovanion>gabber: Not a given, it wasn't last time I wanted it on a system /shrug
<gabber>could some more active passive cooling be of help?
<Kabouik>I'm on a very compact laptop yes, but this didn't use to be an issue. And anyhow, why would cpulimit not work with guix commands?
<lechner->Kabouik / what's the last time you cleaned the heat sink
<lechner->please don't use a vacuum. you can damage the fans
<Kabouik>It's due now, but still, the temperature when idle is quite acceptable at around 45°C. The thing is my laptop may not be able to handle the full CPU power, so I'd want to limit it. Is that in BIOS only then?
<gabber>Rovanion: i've been using it for quite some time now (not sure how long exactly). it might work better or worse with different setups
<gabber>Kabouik: i have little to no experience with cpulimit but your $(guix) command only instructs the daemon to do stuff. you probably want to cpulimit your guix-daemon
<gabber>unfortunately i have no help to offer WRT this
<lechner->blowing with a straw works well
<Kabouik>That's a good point gabber. The cpulimit command I'm using works with every other process, so I beliee you're right. Can I just kill the daemon and reload it with `cpulimit -l 50 guix-daemon`?
<gabber>Kabouik: i'd opt for trying to fix the hardware/BIOS config before going down that route
<gabber>but i guess you're pretty emergency proofen by now ;)
<lechner->what kind of laptop is it?
<Rovanion>gabber: Is there description on how to configure it in the manual? It's not in https://guix.gnu.org/manual/en/html_node/Sound-Services.html
<peanuts>"Sound Services (GNU Guix Reference Manual)" https://guix.gnu.org/manual/en/html_node/Sound-Services.html
<Kabouik>I will try to clean the heatsink for sure, but if I'm that close to the cooling limits of my computer, I'd still like to limit the clock of the CPU for commands that can last very long like guix ones
<lechner->any computer will overheat with a clogged heatsink. i try to clean all of mine once a year but the laptops can be hard to open. any brand laptop should be built to cool properly unless you overclock
<Kabouik>The thing is my computer is 8" with an i7 gen11, so long and intense CPU jobs might be an issue even with a clean heatsink (but I fully agree that a clogged one won't help; I don't think mine is too clogged, but it's certainly not mint).
<lechner->cleaning up your desk, especially from stray clothing, may be another viable solution!
<podiki>properly working hardware should handle heat and throttling to not cause damage ever; wanting to run better thermally and be in more control of it sure, but it shouldn't damage itself
<podiki>e.g. if cooling is not sufficient a processor will clock down or just switch off, at least that's what i understand about them
<lechner->mine just turn off, including the fan
<podiki>you can set some hardware limits of max cpu speed or power draw (in bios or e.g. governor settings)
<lechner->Hi, should ./pre-inst-env prevent the loading of .guile?
<podiki>don't think so? you can look at the script, it is pretty short
<Kabouik>It's not greatm but it's actually not too bad either lechner: https://0x0.st/Htdp.jpg I think I'll really need software limits to guix-daemon CPU demand.
<podiki>it just makes sure you are using the guix from the checkout
<lechner->like many folks I pull in (ice-9 readline) in .guile, but that is not available in the --pure environment when building Guix. starting the Guix REPL as gabber suggested fails
<lechner->Kabouik / the heat sink is under the black to the right
<podiki>you can add guile-readline (is that the right packge) to your pure shell of course
<lechner->podiki / okay, thanks!
<podiki>if that is the right package? (guessing since I don't use it but maybe should!)
<lechner->podiki / it worked!
<podiki>\o/
<podiki>the pure environment in the manual is pretty bare, often I add a few other tools if I need it
<podiki>you can also usethe pre-inst script outside of the pure environment to use your local guix checkout (i do this when testing, for example changes to guix shell)
<lechner->gabber / jpoiret / loading (gnu build hurd-boot) in a Guix REPL produces no error
<podiki>and make completed successfully for your modified guix?
<lechner->yes
<podiki>sorry, don't know anything special to debug the guix pull then
<podiki>just the usual of trying fewer and fewer changes to find out what's tripping it
<lilyp>jpoiret emacs-minimal does not come with native-comp
<lechner->when guix is building its parts during a pull, the progress meter reaches 100% several times on each component before resetting to 0% and going again
<jpoiret>lilyp: ah, my bad, i'll try again then. full emacs it is?
<Kolev>Tried installing last night with latest ISO. Still same result. https://issues.guix.gnu.org/66786
<peanuts>"Failed to install" https://issues.guix.gnu.org/66786
<lilyp>jpoiret I think everything starting from emacs-no-x
<jpoiret>lilyp: so emacs-team doesn't resolve the problem either
<jpoiret>as long as emacs generates and checks hashes of el paths in the eln file names we'll have trouble with grafts
<jpoiret>(that's ensured in C btw)
<lilyp>where does the "so" come from?
<lilyp>the file name should be stable btw. (/tmp/guix-build-emacs-whatever-0/emacs-whatever.el
<jpoiret>wasn't meant to be snarky, just concluding what i mentioned aboe
<lilyp>hence why I'm asking whether this happens on emacs-team in the first place
<jpoiret>lilyp: yes, it also happens there
<jpoiret>it seemed to load seamlessly but that's because it's actually rebuilding it in the local cache
<jpoiret>that'll probably be annoying to patch :(
<jpoiret>I wonder why we should care about the file path hash if we're already checking the content hash though
<lilyp>yeah, emacs feature hash ought to suffice imho
<lilyp>feel free to send a patch
<jpoiret>yeah, i'm looking if upstream has some solution on the MLs
<mwette>I've created a foo.scm package file. If I add the package symbol to the end `guix build -f foo.scm' works. If I remove the symbol and add the file to my channel-dir (and update git), then type `guix show foo-pkg1' it says "package not found". What did I forget? I've done this before.
<civodul>mwette: hi! that suggests foo.scm is not in the package search path
<civodul>to fix it, try “guix build -L . foo-pkg1” or similar
<civodul>where “.” is the directory containing foo.scm
<civodul>beware: every *.scm file in there will be loaded
<podiki>mwette: and if you haven't added it to the channels your user uses (~/.config/guix/channels.scm) and then do a guix pull; then guix won't know about it (using the -L as noted above is the alternative)
<mwette>civodul: Thanks. I think it ay be another issue. Trying something ...
<podiki>civodul: question on grafting: after an ungraft, that's when we might see packages fail to build due to some change in the now ungrafted dependency right? (even if abi compatible) or in tests failing? since both otherwise happen before grafting takes place right?
<podiki>(speaking about packages using a dependency that had a replacement)
<Franciman>hi, what's the best way to get started with guix system?
<Franciman>should i read the whole docs before being able to get started with it?
<mwette>Still having issue: https://paste.debian.net/1297814/
<peanuts>"debian Pastezone" https://paste.debian.net/1297814
<mrh57>Franciman: why not just go ahead and install it? there's an ncurses/tui installer so you don't have to know anything to set it up, and then you can just look up the things/read the relevant sections of the docs for stuff you wanna do
<Franciman>i will try tomorrow for sure on my thinkpad t450!
<podiki>mwette: what is the name of the package (that is what guix show/search look at, not the variable name)
<mrh57>Franciman: have fun! do let us know how it goes
<Franciman>thanks
<Franciman>ah one question: do you suggest guix 1.4.0 or the latest development version?
<KE0VVT>Franciman: Glad to see you here! I suggest latest ISO.
<KE0VVT>Franciman: Check out my Guix configs. https://codeberg.org/csh/dotfiles
<Franciman>hey KE0VVT!
<peanuts>"csh/dotfiles: My public configuration files. - dotfiles - Codeberg.org" https://codeberg.org/csh/dotfiles
<Franciman>thanks
<mwette>in a pull/upgrade -- tick, tock, ...
<KE0VVT>Franciman: What got you into Guix?
<Franciman>the nix paradigm
<Franciman>and the fact that it seems more resilient than debian, while allowing for more modern software
<Franciman>and the free software policy
<KE0VVT>Franciman: Nice. I'm here for the free software policy.
<Franciman>well more resilient than debian maybe is wrong, but at least not so brittle, since i can do rollbacks
<mwette>podiki: thanks -- I checked ; that does not seem to be it
<nathan-web>I'm looking to configure my laptop to automatically login but to a locked screen. I see in the X-Window documentation a way to configure various DMs to auto-login, but is there a more minimal one that doesn't include the login interface?
<nathan-web>It sounds like I might be looking for a DM without a greeter?
<ieure>nathan-web, What do you hope to gain by auto-logging into a locked screen? You're going to have to enter credentials to use the laptop either way. What's the difference between authenticating to the display manager vs. the screen locker?
<nathan-web>Auto-loading applications so they are ready to go when I unlock.
<ieure>Okay. But it's still going to take the same amount of time.
<ieure>Right, like, say this is the amount of time it takes to boot, log in, and run all your startup programs (boot at left, post-login launch at right): [=====/=====]
<ieure>And what you're saying is, I want that same amount of time, but divided like this: [=========/=]
<ieure>So like.
<ieure>What is the benefit?
<ieure>You're waiting the same amount of time either way.
<nathan-web>Logging in via greeter means the computer sits there not loading anything while it waits for me. Maybe I've walked off for a second. Logging in automatically will ensure that gets loaded anyway.
<nathan-web>And also loads in the background for the amount of time that it takes to type my password.
<ieure>Well, I don't agree, but okay. Seems like a poor tradeoff IMO, a lot of work and a real weird setup for a very niche usecase.
<ieure>I think the only thing you have to do is set the DM to auto-login, and put the screen lock command in your .xsesionrc (or whatever autostarts programs when you log in)
<Andronikos>I did just run "make check" on master. There were no fails but xfails. What are xfails?
<lilyp>expected fails
<Andronikos> https://github.com/skeeto/impatient-mode it says in the impatient-mode.el file that it is released into the public domain but without any LICENSE file or text in the file itself. There are also some HTML files that have only code. Can this even be packaged for Guix?
<peanuts>"GitHub - skeeto/impatient-mode: Impatient html mode. See your changes in the browser as you type" https://github.com/skeeto/impatient-mode
<Andronikos>lilyp: Ah thanks. That explains a lot.
<Andronikos>I also saw this https://github.com/skeeto/skewer-mode. I wonder if it makes even sense to package impatient-mode.
<peanuts>"GitHub - skeeto/skewer-mode: Live web development in Emacs" https://github.com/skeeto/skewer-mode