Show HN: A Tiling Window Manager for Windows, Written in Janet
297 points| agentkilo | 9 months ago |agent-kilo.github.io
I read[1] about Janet[2] some time ago, then immediately got impressed by the enthusiasm of its community, and by the language itself, so I started playing with it.
At the time I was searching for a tiling window manager for Windows, and unavoidably the idea of scratching my own itch with Janet got hold of me, so Jwno was born.
Simply put, Jwno is a keyboard-driven tiling window manager for Windows, scriptable with Janet. But since it has a complete Lisp runtime, and a thin wrapper library for Win32 APIs[3], you can certainly do much more with it.
I hope you'll enjoy playing with it as much as I enjoyed building it.
And yes, I use StumpWM on the Linux side, by the way.
rich_sasha|9 months ago
I tried various lisp dialects, but I could never find the killer feature vs other languages I already use. And I can justify why I use these specific languages I do use, if that makes sense.
agentkilo|9 months ago
I think Jwno's REPL module is so important, I specifically changed Jwno's architecture at one point to make it work.
iLemming|9 months ago
You're kidding or trolling? Structural editing and the REPL are the greatest features of Lisp. The ability to just grab any expression and move it around simplifies so many things when coding and refactoring. With the connected REPL you can eval anything on the spot, that turns the entire experience of coding into a video game — you don't need to wait for linter, linker, compiler — you just run things. You often don't even have to save anything. I suspect when you "tried various lisp dialects" maybe you didn't use structural editing and the connected REPL?
Often people confuse Lisp REPL with REPLs in other programming languages, e.g. Python, where usually you have to copy-n-paste chunks of code into it. Lisp's REPLs are different in the sense that every step in Read-Eval-Print-Loop is different — in Lisp, you typically eval things right where you type them, by sending whole expressions to the connected REPL, which could be remote. We (for example) run ours in a Kubernetes cluster, that allows us to experiment with pods, running queries against the "real" DB tables, testing services "live".
90s_dev|9 months ago
Great job. Looks really interesting and useful. And a fun excuse to write Lisp.
I really appreciate it when APIs give you high-level functionality but keep the door open to lower-level APIs when you really need them.
once_inc|9 months ago
roflmaostc|9 months ago
For example, GIMP works without any issues. And the productivity boost is tremendous, for me it's very hard to work on anything else. I barely encounter programs where it does more harm than use.
Especially having multiple desktops with different names allow me to localize windows so much quicker than looking through a dozens of terminals manually.
Right now, I do have: 1 mail, 2 web, 3 gimp, 4 chat, 5 notes, 6 terminal, 7 ssh cluster
3036e4|9 months ago
I use StumpWM, and for the few applications that this becomes a real problem it is possible to run those in a floating windows group that works just like a minimalistic non-tiling window manager. I think this is a common features of tiling window managers.
aus10d|9 months ago
Rasthor|9 months ago
jazzyjackson|9 months ago
behnamoh|9 months ago
And yet, I find Windows window management far more advanced than macOS. It's ridiculous that up until recently, macOS didn't even have basic max-size functionality w/o reaching for 3rd party apps.
weeb|9 months ago
The UI hints also look promising, but I can't get them working. Using example-config.janet I tried pressing RAlt or RAlt+K and I get the UI hint shortcuts list coming up, but none of them seem to do anything, except in Notepad where I sometimes get the standard UI hints (that always come up here with a long press of left alt)
Fwiw, as a newbie I found it a bit intimidating/off-putting that it doesn't work out the box without choosing a config file. That's quite a lot of extra cognitive effort and link-clicking before you can try it out. And I'm left quite unsure what I'm missing out on. Am I able to access the different documented features with the config file I have? It's not clear.
agentkilo|9 months ago
Do you mean reserving screen space for the on-screen keyboard? If that's the case, you can try to "transform" the top-level frame (a frame that tracks a monitor's screen area), either in the REPL or in your config: https://agent-kilo.github.io/jwno/cookbook/adjust-top-level-...
> Using example-config.janet I tried pressing RAlt or RAlt+K and I get the UI hint shortcuts list coming up, but none of them seem to do anything
Can you please file a bug report and attach relevant logs? You can write logs to a file by starting Jwno like this:
jwno.exe --log-file C:\jwno.log --log-level debug --no-console your-config.janet
There should be some interesting logs when you press one of the UI hint shortcuts.
> Fwiw, as a newbie I found it a bit intimidating/off-putting that it doesn't work out the box without choosing a config file. That's quite a lot of extra cognitive effort and link-clicking before you can try it out.
I totally understand. But I chose to not include a default config in the executable, because I thought a window manager is a... personal thing. It should evolve with your habits and workflows, so the default config will most likely get changed to something dramatically different anyway. I can be wrong though.
iLemming|9 months ago
avindrag|9 months ago
accrual|9 months ago
bsnnkv|9 months ago
agentkilo|9 months ago
alpb|9 months ago
videogreg93|9 months ago
TeMPOraL|9 months ago
(Browsers, in particular, I use full-screen less and less. That annoying trend of squeezing everything into short lines "because readability" is just wasting too much screen space; zooming in makes everything too big, and I'm getting tired of writing userstyles or userscript to fix it for every other page I open, so I'm back to keeping 2 or 3 columns of windows running.)
Also, any excuse to use more Lisp is good in my book. Based on the screenshots, it looks stellar; if it works half as well as it comes across, I'll switch over instantly.
agentkilo|9 months ago
My StumpWM is heavily customized though, and I mostly modeled Jwno's behavior after my own config, so it may not be what you expected at all.
But that's one of the reasons I like Lisp and things built in Lisp: They are so flexible, you can sometimes build something based on the original thing, while it feels completely different from the original.
> my monitor seems just the right shape/resolution for the standard Windows splits to be suboptimal
Do you use an ultra-wide? In that case, Jwno has no OOTB ultra-wide support, but there's a section for adjusting it in the cookbook[1].
[1]: https://agent-kilo.github.io/jwno/cookbook/adjust-top-level-...
entropie|9 months ago
agentkilo|9 months ago
Jwno's internal data structure has these levels (higher-level comes first):
Root - Virtual Desktops - Monitors - Normal Frames - Windows
So monitors are part of a virtual desktop, and every virtual desktop has the same layout that reflects your physical monitor arrangement. When you switch virtual desktops, all monitors switch to the new desktop at the same time.
[1]:https://agent-kilo.github.io/jwno/frame-tree/frame-nodes.htm...
[2]: https://github.com/agent-kilo/jwno/blob/master/example/tutor...
pona-a|9 months ago
packetlost|9 months ago
wodenokoto|9 months ago
harryvederci|9 months ago
I learnt Janet after learning Clojure, and it all felt very natural. So a possible approach is to grab a beginner Clojure book/tutorial first, run some of the examples, and then see how far you get with Janet.
Not everything is the same, but you'll find that out along the way, and the people in the Janet Zulip chat are always super helpful.
Also check out https://janetdocs.com for some examples.
-__---____-ZXyw|9 months ago
unknown|9 months ago
[deleted]
jackemerson|9 months ago
xtiansimon|9 months ago
pjerem|9 months ago
agentkilo|9 months ago
unknown|9 months ago
[deleted]
ang_cire|9 months ago
scbrg|9 months ago
I start explaining, very carefully, like I'm talking to a child, that this is an alternative shell, which replaces the standard Windows Explorer et cetera, und so weiter... it's very complicated you know...
Guy says, "cool... hey, why don't you check out this URL?". I do. It's the litestep contributor page. His nick is on it. Near the top.
Ow.
insin|9 months ago
[1] https://bb4win.sourceforge.net/bblean/
wredcoll|9 months ago
I mean, I remember there being a whole ton of wildly customized windows shells with menus and floating terminals and so on, but not a single thing stuck around?
philsnow|9 months ago
reddit_clone|9 months ago
Brings back memories !
piskov|9 months ago
unknown|9 months ago
[deleted]
pbohun|9 months ago
I've recently started playing around with Janet, and it's a great language. I think it's inspired by Clojure and Lua, and somehow manages to be better than both (in my opinion).
agentkilo|9 months ago
This is exactly how I feel about Janet too. I don't think I have enough experience on Clojure or Lua to comment on them, but I got attracted to Janet almost immediately.
Working on Jwno also confirms my first impression on Janet: It's really a practical language. The tooling has some room for improvement, but the language itself can get things done - usually fast and easily.
qingcharles|9 months ago
https://filepilot.tech/
(it's beta so it has a few little annoyances still)
unknown|9 months ago
[deleted]
roxolotl|9 months ago
The one thing I’ve noticed is that it seems like Janet had a burst of interest 2020-2022 but it has since slowed down. Would love to see it become popular again. The main reason I’m using it is because I like how it’s both powerful and lightweight. I’d use clojure but I don’t want Java. I’m tempted to also try Common Lisp but so far Janet has been great.
[0]: https://github.com/joy-framework/joy
agentkilo|9 months ago
Maybe the most "opinionated" things in Janet are the ev stuff and fibers. I think they're done right though, you just need to be careful with the event loop when embedding Janet.
unknown|9 months ago
[deleted]
Pfeil|9 months ago
bsnnkv|9 months ago
modzu|9 months ago
unknown|9 months ago
[deleted]
MisterKent|9 months ago
agentkilo|9 months ago
* By default, Komorebi uses dynamic tiling, while Jwno uses manual tiling.
* Komorebi has workspaces, Jwno works with Windows native virtual desktops instead.
* Komorebi uses IPC and native system command line to send commands, while Jwno usually operates all by itself.
There are definitely other details that are important to you, but these are the things that immediately came to my mind. I don't run Hyprland so can't really comment on that.
unknown|9 months ago
[deleted]
piskov|9 months ago
https://github.com/LGUG2Z/komorebi
bsnnkv|9 months ago
The Windows tiling window manager development scene is a very kind, relaxed and collaborative space where we all take inspiration from and support each other
agentkilo|9 months ago
unknown|9 months ago
[deleted]