[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-5446":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},5446,"komorebi","LGUG2Z\u002Fkomorebi","LGUG2Z","A tiling window manager for Windows 🍉","https:\u002F\u002Flgug2z.github.io\u002Fkomorebi\u002F",null,"Rust",14722,331,51,81,0,4,44,192,21,42.56,"Other",false,"master",true,[27,28,29,30,31,32,33],"autohotkey","palestine","rust","status-bar","tiling-window-manager","whkd","windows","2026-06-12 02:01:10","# komorebi\n\nTiling Window Management for Windows.\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Ftechforpalestine.org\u002Flearn-more\">\n    \u003Cimg alt=\"Tech for Palestine\" src=\"https:\u002F\u002Fbadge.techforpalestine.org\u002Fdefault\">\n  \u003C\u002Fa>\n  \u003Cimg alt=\"GitHub Workflow Status\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002FLGUG2Z\u002Fkomorebi\u002F.github\u002Fworkflows\u002Fwindows.yaml\">\n  \u003Cimg alt=\"GitHub all releases\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002FLGUG2Z\u002Fkomorebi\u002Ftotal\">\n  \u003Cimg alt=\"GitHub commits since latest release (by date) for a branch\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcommits-since\u002FLGUG2Z\u002Fkomorebi\u002Flatest\">\n  \u003Cimg alt=\"Active Individual Commercial Use Licenses\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdynamic\u002Fjson?url=https%3A%2F%2Flgug2z-ecstaticmagentacheetah.web.val.run&query=%24.&label=active%20individual%20commercial%20use%20licenses&cacheSeconds=3600&link=https%3A%2F%2Flgug2z.com%2Fsoftware%2Fkomorebi\">\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FmGkn66PHkx\">\n    \u003Cimg alt=\"Discord\" src=\"https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F898554690126630914\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsponsors\u002FLGUG2Z\">\n    \u003Cimg alt=\"GitHub Sponsors\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fsponsors\u002FLGUG2Z\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fko-fi.com\u002Flgug2z\">\n    \u003Cimg alt=\"Ko-fi\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fkofi-tip-green\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fnotado.app\u002Ffeeds\u002Fjado\u002Fsoftware-development\">\n    \u003Cimg alt=\"Notado Feed\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNotado-Subscribe-informational\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCeai3-do-9O4MNy9_xjO6mg?sub_confirmation=1\">\n    \u003Cimg alt=\"YouTube\" src=\"https:\u002F\u002Fimg.shields.io\u002Fyoutube\u002Fchannel\u002Fsubscribers\u002FUCeai3-do-9O4MNy9_xjO6mg\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n![screenshot](https:\u002F\u002Fuser-images.githubusercontent.com\u002F13164844\u002F184027064-f5a6cec2-2865-4d65-a549-a1f1da589abf.png)\n\n## Note: Students using devices enrolled in mobile device management (MDM)\n\nYour usage still falls under the [Komorebi License 2.0.0](.\u002FLICENSE.md).\n\nYou can email me at the address I sign my commits with (add `.patch` to the end\nof any commit URL on GitHub to find it) from the address associated with your\ninstitution with the subject \"komorebi - student with an MDM device\", and I will\nbe able to remove the splash intended for corporate users, whose usage falls\nunder the [Individual Commercial Use\nLicense](https:\u002F\u002Flgug2z.com\u002Fsoftware\u002Fkomorebi).\n\nThis is currently a manual process - most days this shouldn't take more than\n12h, and you will receive an email reply from me when the process is complete.\n\nIf you haven't had a reply to your email within 24h you can reach out to me on\nDiscord.\n\n## Note: Unexpected mobile device management (MDM) detection prompts\n\nYou have most likely unintentionally enrolled your device in \"Bring Your Own\nDevice\" (BYOD) MDM. You can confirm if this is the case by running `dsregcmd\n\u002Fstatus` and then take the appropriate steps to remove the MDM profile and take\nback full control of your system.\n\nIf you need help doing this you can ask on Discord.\n\n## Note: komorebi for Mac\n\nkomorebi for Mac lives [here](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi-for-mac) :)\n\n## Overview\n\n_komorebi_ is a tiling window manager that works as an extension to Microsoft's\n[Desktop Window\nManager](https:\u002F\u002Fdocs.microsoft.com\u002Fen-us\u002Fwindows\u002Fwin32\u002Fdwm\u002Fdwm-overview) in\nWindows 10 and above.\n\n_komorebi_ allows you to control application windows, virtual workspaces and display monitors with a CLI which can be\nused with third-party software such as [`whkd`](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fwhkd)\nand [AutoHotKey](https:\u002F\u002Fgithub.com\u002FLexikos\u002FAutoHotkey_L) to set user-defined keyboard shortcuts.\n\n_komorebi_ aims to make _as few modifications as possible_ to the operating\nsystem and desktop environment by default. Users are free to make such\nmodifications in their own configuration files for _komorebi_, but these will\nremain opt-in and off-by-default for the foreseeable future.\n\nPlease refer to the [documentation](https:\u002F\u002Flgug2z.github.io\u002Fkomorebi) for instructions on how\nto [install](https:\u002F\u002Flgug2z.github.io\u002Fkomorebi\u002Finstallation.html) and\n[configure](https:\u002F\u002Flgug2z.github.io\u002Fkomorebi\u002Fexample-configurations.html)\n_komorebi_, [common workflows](https:\u002F\u002Flgug2z.github.io\u002Fkomorebi\u002Fcommon-workflows\u002Fkomorebi-config-home.html), a complete\n[configuration schema reference](https:\u002F\u002Fkomorebi-starlight.lgug2z.workers.dev\u002Freference\u002Fkomorebi-windows\u002F) and a\ncomplete [CLI reference](https:\u002F\u002Flgug2z.github.io\u002Fkomorebi\u002Fcli\u002Fquickstart.html).\n\n## Community\n\nThere is a [Discord server](https:\u002F\u002Fdiscord.gg\u002FmGkn66PHkx) available for\n_komorebi_-related discussion, help, troubleshooting etc. If you have any\nspecific feature requests or bugs to report, please create an issue in this\nrepository.\n\nThere is a [YouTube\nchannel](https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCeai3-do-9O4MNy9_xjO6mg) where I post\n_komorebi_ development videos, feature previews and release overviews. Subscribing\nto the channel (which is monetized as part of the YouTube Partner Program) and\nwatching videos is a really simple and passive way to contribute financially to\nthe development and maintenance of _komorebi_.\n\nThere is an [Awesome List](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fawesome-komorebi) which\nshowcases the many awesome projects that exist in the _komorebi_ ecosystem.\n\n## Licensing for Personal Use\n\n`komorebi` is [educational source\nsoftware](https:\u002F\u002Flgug2z.com\u002Farticles\u002Feducational-source-software\u002F).\n\n`komorebi` is licensed under the [Komorebi 2.0.0\nlicense](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi-license), which is a fork of the\n[PolyForm Strict 1.0.0\nlicense](https:\u002F\u002Fpolyformproject.org\u002Flicenses\u002Fstrict\u002F1.0.0). On a high level\nthis means that you are free to do whatever you want with `komorebi` for\npersonal use other than redistribution, or distribution of new works (i.e.\nhard-forks) based on the software.\n\nAnyone is free to make their own fork of `komorebi` with changes intended either\nfor personal use or for integration back upstream via pull requests.\n\nThe [Komorebi 2.0.0 License](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi-license) does\nnot permit any kind of commercial use (i.e. using `komorebi` at work).\n\n## Sponsorship for Personal Use\n\n_komorebi_ is a free and educational source project, and one that encourages you\nto make charitable donations if you find the software to be useful and have the\nfinancial means.\n\nI encourage you to make a charitable donation to the [Palestine Children's\nRelief Fund](https:\u002F\u002Fpcrf1.app.neoncrm.com\u002Fforms\u002Fgaza-recovery) or to contribute\nto a [Gaza Funds campaign](https:\u002F\u002Fgazafunds.com) before you consider sponsoring\nme on GitHub.\n\n[GitHub Sponsors is enabled for this\nproject](https:\u002F\u002Fgithub.com\u002Fsponsors\u002FLGUG2Z). Sponsors can claim custom roles on\nthe Discord server, get shout outs at the end of _komorebi_-related videos on\nYouTube, gain the ability to submit feature requests on the issue tracker, and\nreceive releases of komorebi with \"easter eggs\" on physical media.\n\nIf you would like to tip or sponsor the project but are unable to use GitHub\nSponsors, you may also sponsor through [Ko-fi](https:\u002F\u002Fko-fi.com\u002Flgug2z), or\nmake an anonymous Bitcoin donation to `bc1qv73wzspc77k46uty4vp85x8sdp24mphvm58f6q`.\n\n## Licensing for Commercial Use\n\nA dedicated Individual Commercial Use License is available for those who want to\nuse `komorebi` at work.\n\nThe Individual Commerical Use License adds “Commercial Use” as a “Permitted Use”\nfor the licensed individual only, for the duration of a valid paid license\nsubscription only. All provisions and restrictions enumerated in the [Komorebi\nLicense](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi-license) continue to apply.\n\nMore information, pricing and purchase links for Individual Commercial Use\nLicenses [can be found here](https:\u002F\u002Flgug2z.com\u002Fsoftware\u002Fkomorebi).\n\n# Installation\n\nA [detailed installation and quickstart\nguide](https:\u002F\u002Flgug2z.github.io\u002Fkomorebi\u002Finstallation.html) is available which shows how to get started\nusing `scoop`, `winget` or building from source.\n\n[![Watch the quickstart walkthrough video](https:\u002F\u002Fimg.youtube.com\u002Fvi\u002FMMZUAtHbTYY\u002Fhqdefault.jpg)](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=MMZUAtHbTYY)\n\n# Comparison With Fancy Zones\n\nCommunity member [Olge](https:\u002F\u002Fwww.youtube.com\u002F@polle5555) has created an\nexcellent video which compares the default window management features of\nWindows 11, Fancy Zones and komorebi.\n\nIf you are not familiar with tiling window managers or if you are looking at\nkomorebi and wondering \"how is this different from Fancy Zones? 🤔\", this short\nvideo will answer the majority of your questions.\n\n[![Watch the comparison video](https:\u002F\u002Fimg.youtube.com\u002Fvi\u002F0LCbS_gm0RA\u002Fhqdefault.jpg)](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=0LCbS_gm0RA)\n\n# Demonstrations\n\n[@amnweb](https:\u002F\u002Fgithub.com\u002Famnweb) showing _komorebi_ `v0.1.28` running on Windows 11 with window borders,\nunfocused window transparency and animations enabled, using a custom status bar integrated using\n_komorebi_'\ns [Window Manager Event Subscriptions](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi?tab=readme-ov-file#window-manager-event-subscriptions).\n\nhttps:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi\u002Fassets\u002F13164844\u002F21be8dc4-fa76-4f70-9b37-1d316f4b40c2\n\n[@haxibami](https:\u002F\u002Fgithub.com\u002Fhaxibami) showing _komorebi_ running on Windows\n11 with a terminal emulator, a web browser and a code editor. The original\nvideo can be viewed\n[here](https:\u002F\u002Ftwitter.com\u002Fhaxibami\u002Fstatus\u002F1501560766578659332).\n\nhttps:\u002F\u002Fuser-images.githubusercontent.com\u002F13164844\u002F163496447-20c3ff0a-c5d8-40d1-9cc8-156c4cebf12e.mp4\n\n[@aik2mlj](https:\u002F\u002Fgithub.com\u002Faik2mlj) showing _komorebi_ running on Windows 11\nwith multiple workspaces, terminal emulators, a web browser, and the\n[yasb](https:\u002F\u002Fgithub.com\u002FDenBot\u002Fyasb) status bar with the _komorebi_ workspace\nwidget enabled. The original video can be viewed\n[here](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F455064481).\n\nhttps:\u002F\u002Fuser-images.githubusercontent.com\u002F13164844\u002F163496414-a9cde3d1-b8a7-4a7a-96fb-a8985380bc70.mp4\n\n# Contribution Guidelines\n\nIf you would like to contribute to `komorebi` please take the time to carefully\nread the guidelines below.\n\nPlease see [CONTRIBUTING.md](.\u002FCONTRIBUTING.md) for more information about how\ncode contributions to `komorebi` are licensed.\n\n## Commit hygiene\n\n- Flatten all `use` statements\n- Run `cargo +stable clippy` and ensure that all lints and suggestions have been addressed before committing\n- Run `cargo +nightly fmt --all` to ensure consistent formatting before committing\n- Use `git cz` with\n  the [Commitizen CLI](https:\u002F\u002Fgithub.com\u002Fcommitizen\u002Fcz-cli#conventional-commit-messages-as-a-global-utility) to prepare\n  commit messages\n- Provide **at least** one short sentence or paragraph in your commit message body to describe your thought process for\n  the changes being committed\n\n## PRs should contain only a single feature or bug fix\n\nIt is very difficult to review pull requests which touch multiple unrelated features and parts of the codebase.\n\nPlease do not submit pull requests like this; you will be asked to separate them into smaller PRs that deal only with\none feature or bug fix at a time.\n\nIf you are working on multiple features and bug fixes, I suggest that you cut a branch called `local-trunk`\nfrom `master` which you keep up to date, and rebase the various independent branches you are working on onto that branch\nif you want to test them together or create a build with everything integrated.\n\n## Refactors to the codebase must have prior approval\n\n`komorebi` is a mature codebase with an internal consistency and structure that has developed organically over close to\nhalf a decade.\n\nThere are [countless hours of live coding videos](https:\u002F\u002Fyoutube.com\u002F@LGUG2Z) demonstrating work on this project and\nshowing new contributors how to do everything from basic tasks like implementing new `komorebic` commands to\ndistinguishing monitors by manufacturer hardware identifiers and video card ports.\n\nRefactors to the structure of the codebase are not taken lightly and require prior discussion and approval.\n\nPlease do not start refactoring the codebase with the expectation of having your changes integrated until you receive an\nexplicit approval or a request to do so.\n\nSimilarly, when implementing features and bug fixes, please stick to the structure of the codebase as much as possible\nand do not take this as an opportunity to do some \"refactoring along the way\".\n\nIt is extremely difficult to review PRs for features and bug fixes if they are lost in sweeping changes to the structure\nof the codebase.\n\n## Breaking changes to user-facing interfaces are unacceptable\n\nThis includes but is not limited to:\n\n- All `komorebic` commands\n- The `komorebi.json` schema\n- The [\n  `komorebi-application-specific-configuration`](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi-application-specific-configuration)\n  schema\n\nNo user should ever find that their configuration file has stopped working after upgrading to a new version\nof `komorebi`.\n\nMore often than not there are ways to reformulate changes that may initially seem like they require breaking user-facing\ninterfaces into additive changes.\n\nFor some inspiration please take a look\nat [this commit](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi\u002Fcommit\u002Fe7d928a065eb63bb4ea1fb864c69c1cae8cc763b) which added the\nability for users to specify colours in `komorebi.json` in Hex format alongside RGB.\n\nThere is also a process in place for graceful, non-breaking, deprecation of configuration options that are no longer\nrequired.\n\n# Development\n\nIf you use IntelliJ, you should enable the following settings to ensure that code generated by macros is recognised by\nthe IDE for completions and navigation:\n\n- Set `Expand declarative macros`\n  to `Use new engine` under \"Settings > Langauges & Frameworks > Rust\"\n- Enable the following experimental features:\n    - `org.rust.cargo.evaluate.build.scripts`\n    - `org.rust.macros.proc`\n\n# Logs and Debugging\n\nLogs from `komorebi` will be appended to `%LOCALAPPDATA%\u002Fkomorebi\u002Fkomorebi.log`; this file is never rotated or\noverwritten, so it will keep growing until it is deleted by the user.\n\nWhenever running the `komorebic stop` command or sending a Ctrl-C signal to `komorebi` directly, the `komorebi` process\nensures that all hidden windows are restored before termination.\n\nIf however, you ever end up with windows that are hidden and cannot be restored, a list of window handles known\nto `komorebi` are stored and continuously updated in `%LOCALAPPDATA%\u002Fkomorebi\u002F\u002Fkomorebi.hwnd.json`.\n\n## Restoring Windows\n\nRunning `komorebic restore-windows` will read the list of window handles and forcibly restore them, regardless of\nwhether the main `komorebi` process is running.\n\n## Panics and Deadlocks\n\nIf `komorebi` ever stops responding, it is most likely either due to either a panic or a deadlock. In the case of a\npanic, this will be reported in the log. In the case of a deadlock, there will not be any errors in the log, but the\nprocess and the log will appear frozen.\n\nIf you believe you have encountered a deadlock, you can compile `komorebi` with `--features deadlock_detection` and try\nreproducing the deadlock again. This will check for deadlocks every 5 seconds in the background, and if a deadlock is\nfound, information about it will appear in the log which can be shared when opening an issue.\n\n# Window Manager State and Integrations\n\nThe current state of the window manager can be queried using the `komorebic state` command, which returns a JSON\nrepresentation of the `State` struct.\n\nThis may also be polled to build further integrations and widgets on top of.\n\n# Window Manager Event Subscriptions\n\n## Named Pipes\n\nIt is possible to subscribe to notifications of every `WindowManagerEvent` and `SocketMessage` handled\nby `komorebi` using [Named Pipes](https:\u002F\u002Fdocs.microsoft.com\u002Fen-us\u002Fwindows\u002Fwin32\u002Fipc\u002Fnamed-pipes).\n\nFirst, your application must create a named pipe. Once the named pipe has been created, run the following command:\n\n```powershell\nkomorebic.exe subscribe-pipe \u003Cyour pipe name>\n```\n\nNote that you do not have to include the full path of the named pipe, just the name.\n\nIf the named pipe exists, `komorebi` will start pushing JSON data of successfully handled events and messages:\n\n```json lines\n{\"event\":{\"type\":\"AddSubscriber\",\"content\":\"yasb\"},\"state\":{}}\n{\"event\":{\"type\":\"FocusWindow\",\"content\":\"Left\"},\"state\":{}}\n{\"event\":{\"type\":\"FocusChange\",\"content\":[\"SystemForeground\",{\"hwnd\":131444,\"title\":\"komorebi – README.md\",\"exe\":\"idea64.exe\",\"class\":\"SunAwtFrame\",\"rect\":{\"left\":13,\"top\":60,\"right\":1520,\"bottom\":1655}}]},\"state\":{}}\n{\"event\":{\"type\":\"MonitorPoll\",\"content\":[\"ObjectCreate\",{\"hwnd\":5572450,\"title\":\"OLEChannelWnd\",\"exe\":\"explorer.exe\",\"class\":\"OleMainThreadWndClass\",\"rect\":{\"left\":0,\"top\":0,\"right\":0,\"bottom\":0}}]},\"state\":{}}\n{\"event\":{\"type\":\"FocusWindow\",\"content\":\"Right\"},\"state\":{}}\n{\"event\":{\"type\":\"FocusChange\",\"content\":[\"SystemForeground\",{\"hwnd\":132968,\"title\":\"Windows PowerShell\",\"exe\":\"WindowsTerminal.exe\",\"class\":\"CASCADIA_HOSTING_WINDOW_CLASS\",\"rect\":{\"left\":1539,\"top\":60,\"right\":1520,\"bottom\":821}}]},\"state\":{}}\n{\"event\":{\"type\":\"FocusWindow\",\"content\":\"Down\"},\"state\":{}}\n{\"event\":{\"type\":\"FocusChange\",\"content\":[\"SystemForeground\",{\"hwnd\":329264,\"title\":\"den — Mozilla Firefox\",\"exe\":\"firefox.exe\",\"class\":\"MozillaWindowClass\",\"rect\":{\"left\":1539,\"top\":894,\"right\":1520,\"bottom\":821}}]},\"state\":{}}\n{\"event\":{\"type\":\"FocusWindow\",\"content\":\"Up\"},\"state\":{}}\n{\"event\":{\"type\":\"FocusChange\",\"content\":[\"SystemForeground\",{\"hwnd\":132968,\"title\":\"Windows PowerShell\",\"exe\":\"WindowsTerminal.exe\",\"class\":\"CASCADIA_HOSTING_WINDOW_CLASS\",\"rect\":{\"left\":1539,\"top\":60,\"right\":1520,\"bottom\":821}}]},\"state\":{}}\n```\n\nYou may then filter on the `type` key to listen to the events that you are interested in. For a full list of possible\nnotification types, refer to the enum variants of `WindowManagerEvent` in `komorebi` and `SocketMessage`\nin `komorebi::core`.\n\nBelow is an example of how you can subscribe to and filter on events using a named pipe in `nodejs`.\n\n```javascript\nconst { exec } = require(\"child_process\");\nconst net = require(\"net\");\n\nconst pipeName = \"\\\\\\\\.\\\\pipe\\\\komorebi-js\";\nconst server = net.createServer((stream) => {\n  console.log(\"Client connected\");\n\n  \u002F\u002F Every time there is a workspace-related event, let's log the names of all\n  \u002F\u002F workspaces on the currently focused monitor, and then log the name of the\n  \u002F\u002F currently focused workspace on that monitor\n\n  stream.on(\"data\", (data) => {\n    let json = JSON.parse(data.toString());\n    let event = json.event;\n\n    if (event.type.includes(\"Workspace\")) {\n      let monitors = json.state.monitors;\n      let current_monitor = monitors.elements[monitors.focused];\n      let workspaces = monitors.elements[monitors.focused].workspaces;\n      let current_workspace = workspaces.elements[workspaces.focused];\n\n      console.log(\n        workspaces.elements\n          .map((workspace) => workspace.name)\n          .filter((name) => name !== null)\n      );\n      console.log(current_workspace.name);\n    }\n  });\n\n  stream.on(\"end\", () => {\n    console.log(\"Client disconnected\");\n  });\n});\n\nserver.listen(pipeName, () => {\n  console.log(\"Named pipe server listening\");\n});\n\nconst command = \"komorebic subscribe-pipe komorebi-js\";\n\nexec(command, (error, stdout, stderr) => {\n  if (error) {\n    console.error(`Error executing command: ${error}`);\n    return;\n  }\n});\n```\n\n## Unix Domain Sockets\n\nIt is possible to subscribe to notifications of every `WindowManagerEvent` and `SocketMessage` handled\nby `komorebi` using [Unix Domain Sockets](https:\u002F\u002Fdevblogs.microsoft.com\u002Fcommandline\u002Faf_unix-comes-to-windows\u002F).\n\nUDS are also the only mode of communication between `komorebi` and `komorebic`.\n\nFirst, your application must create a socket in `$ENV:LocalAppData\\komorebi`. Once the socket has been created, run the\nfollowing command:\n\n```powershell\nkomorebic.exe subscribe-socket \u003Cyour socket name>\n```\n\nIf the socket exists, komorebi will start pushing JSON data of successfully handled events and messages as in the\nexample above in the Named Pipes section.\n\n## Rust Client\n\nAs of `v0.1.22` it is possible to use the `komorebi-client` crate to subscribe to notifications of\nevery `WindowManagerEvent` and `SocketMessage` handled by `komorebi` in a Rust codebase.\n\nBelow is a simple example of how to use `komorebi-client` in a basic Rust application.\n\n```rust\n\u002F\u002F komorebi-client = { git = \"https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi\" }\n\nuse anyhow::Result;\nuse komorebi_client::Notification;\nuse komorebi_client::NotificationEvent;\nuse komorebi_client::UnixListener;\nuse komorebi_client::WindowManagerEvent;\nuse std::io::BufRead;\nuse std::io::BufReader;\nuse std::io::Read;\n\npub fn main() -> anyhow::Result\u003C()> {\n  let socket = komorebi_client::subscribe(NAME)?;\n\n  for incoming in socket.incoming() {\n    match incoming {\n      Ok(data) => {\n        let reader = BufReader::new(data.try_clone()?);\n\n        for line in reader.lines().flatten() {\n          let notification: Notification = match serde_json::from_str(&line) {\n            Ok(notification) => notification,\n            Err(error) => {\n              log::debug!(\"discarding malformed komorebi notification: {error}\");\n              continue;\n            }\n          };\n\n          \u002F\u002F match and filter on desired notifications\n        }\n      }\n      Err(error) => {\n        log::debug!(\"{error}\");\n      }\n    }\n  }\n\n}\n```\n\nA read-world example can be found\nin [komokana](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomokana\u002Fblob\u002Ffeature\u002Fkomorebi-uds\u002Fsrc\u002Fmain.rs).\n\n## Subscription Event Notification Schema\n\nA [JSON Schema](https:\u002F\u002Fjson-schema.org\u002F) of the event notifications emitted to subscribers can be generated with\nthe `komorebic notification-schema` command. The output of this command can be redirected to the clipboard or a file,\nwhich can be used with services such as [Quicktype](https:\u002F\u002Fapp.quicktype.io\u002F) to generate type definitions in different\nprogramming languages.\n\n## Communication over TCP\n\nA TCP listener can optionally be exposed on a port of your choosing with the `--tcp-port=N` flag. If this flag is not\nprovided to `komorebi` or `komorebic start`, no TCP listener will be created.\n\nOnce created, your client may send\nany [SocketMessage](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi\u002Fblob\u002Fmaster\u002Fkomorebi\u002Fsrc\u002Fcore\u002Fmod.rs#L37) to `komorebi` in the\nsame way that `komorebic` would.\n\nThis can be used if you would like to create your own alternative to `komorebic` which incorporates scripting and\nvarious middleware layers, and similarly it can be used if you would like to integrate `komorebi` with\na [custom input handler](https:\u002F\u002Fgithub.com\u002FLGUG2Z\u002Fkomorebi\u002Fissues\u002F176#issue-1302643961).\n\nIf a client sends an unrecognized message, it will be disconnected and have to reconnect before trying to communicate\nagain.\n\n## Socket Message Schema\n\nA [JSON Schema](https:\u002F\u002Fjson-schema.org\u002F) of socket messages used to send instructions to `komorebi` can be generated\nwith the `komorebic socket-schema` command. The output of this command can be redirected to the clipboard or a file,\nwhich can be used with services such as [Quicktype](https:\u002F\u002Fapp.quicktype.io\u002F) to generate type definitions in different\nprogramming languages.\n\n# Appreciations\n\n- First and foremost, thank you to my wife, both for naming this project and for her patience throughout its\n  never-ending development\n\n- Thank you to [@sitiom](https:\u002F\u002Fgithub.com\u002Fsitiom) for\n  being [an exemplary open source community leader](https:\u002F\u002Fjeezy.substack.com\u002Fp\u002Fthe-open-source-contributions-i-appreciate)\n\n- Thank you to the developers of [nog](https:\u002F\u002Fgithub.com\u002FTimUntersberger\u002Fnog) who came before me and whose work taught\n  me more than I can ever hope to repay\n\n- Thank you to the developers of [GlazeWM](https:\u002F\u002Fgithub.com\u002Flars-berger\u002FGlazeWM) for pushing the boundaries of tiling\n  window management on Windows with me and having an excellent spirit of collaboration\n\n- Thank you to [@Ciantic](https:\u002F\u002Fgithub.com\u002FCiantic) for helping me bring\n  the [hidden Virtual Desktops cloaking function](https:\u002F\u002Fgithub.com\u002FCiantic\u002FAltTabAccessor\u002Fissues\u002F1) to `komorebi`\n","Komorebi 是一个专为 Windows 设计的平铺窗口管理器。它使用 Rust 语言编写，提供高效稳定的性能，并支持通过 AutoHotkey 脚本自定义快捷键与行为，使得用户能够以更直观的方式组织和管理屏幕上的窗口布局。此外，Komorebi 还具备状态栏功能，可显示系统信息或集成其他工具。该项目非常适合需要同时处理多个应用程序窗口、追求高效工作流程的开发者或重度多任务处理者使用。",2,"2026-06-11 03:03:22","top_language"]