{"id":15629714,"url":"https://github.com/anko/basedwm","last_synced_at":"2026-02-10T17:01:34.993Z","repository":{"id":33886089,"uuid":"37597932","full_name":"anko/basedwm","owner":"anko","description":"experimental panning X window manager, with an infinite desktop","archived":false,"fork":false,"pushed_at":"2015-11-30T23:02:31.000Z","size":46,"stargazers_count":16,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-30T23:03:00.723Z","etag":null,"topics":["x11-wm"],"latest_commit_sha":null,"homepage":"","language":"LiveScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anko.png","metadata":{"files":{"readme":"readme.markdown","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-06-17T13:53:52.000Z","updated_at":"2024-10-30T06:26:36.000Z","dependencies_parsed_at":"2022-09-13T19:11:06.732Z","dependency_job_id":null,"html_url":"https://github.com/anko/basedwm","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/anko/basedwm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anko%2Fbasedwm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anko%2Fbasedwm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anko%2Fbasedwm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anko%2Fbasedwm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anko","download_url":"https://codeload.github.com/anko/basedwm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anko%2Fbasedwm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29308855,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T16:09:25.305Z","status":"ssl_error","status_checked_at":"2026-02-10T16:08:52.170Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["x11-wm"],"created_at":"2024-10-03T10:28:16.397Z","updated_at":"2026-02-10T17:01:34.968Z","avatar_url":"https://github.com/anko.png","language":"LiveScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# basedwm [![](https://img.shields.io/npm/v/basedwm.svg)][1]\n\nMinimalistic [X window manager][2] in [LiveScript][3], with an infinite panning\ndesktop.  Controlled by [named pipe][4].  Emits focus events and window\npositions on a [socket][5].\n\n## Install\n\nYou only need [Node.js][6] (or [io.js][7]) to run the basic WM.\n\n      sudo npm i -g basedwm\n\nThen add `exec basedwm` to your `~/.xinitrc`, commenting out any existing WM.\n\nHowever, note that basedwm alone doesn't provide any keyboard or pointer\ncontrols or window decorations.  Instead, it takes control input from a named\npipe and logs focus events and window positions out to another named pipe.\nThis way you can easily switch out what programs you use to control it or to\nrender window decorations.\n\n## Keyboard controls\n\n### Recommendations\n\nTo bind commands to keyboard controls, I recommend [sxhkd][8].  A suitable\nexample config is in [`example/basedwm.sxhkdrc`][9].\n\n### Details\n\nBasedwm is controlled through a named pipe, by default at\n`/tmp/basedwm:0-cmd.fifo` (where the `:0` is the contents of the `$DISPLAY`\n[env variable][10]).  The program `basedc` is provided for convenience; it just\nechoes its arguments into that pipe.\n\nSome commands are **stateless** and run immediately:\n\n| name          | description                                              |\n| ------------- | -------------------------------------------------------- |\n| exit          | terminates the program                                   |\n| raise         | raises the currently focused window                      |\n| pointer-raise | raises window under pointer                              |\n| move x y      | moves the currently focused window by the given amount   |\n| move-all x y  | moves all windows, effectively panning the desktop       |\n| resize x y    | resizes the currently focused window by the given amount |\n| destroy       | closes the currently focused window (polite suggestion)  |\n| kill          | kills the currently focused window (force close)         |\n\nSo `basedc move-all 50 -50` to move all windows 50px right and 50px up.\n\nThe **stateful** ones are intended for pointer interaction:\n\n| name                 | description                             |\n| -------------------- | --------------------------------------- |\n| pointer-move x y     | moves focused window with pointer       |\n| pointer-resize x y   | resizes focused window with the pointer |\n| pointer-move-all x y | pans desktop with pointer               |\n| reset                | resets pointer drag state               |\n\nRemember to send a `reset` once each drag is done!  This tells basedwm that the\nnext pointer command will be a separate action.\n\n## Window decorations\n\n### Recommendations\n\n[Hudkit][11] was written for this.  I'll get around to uploading my setup\neventually, but the basic idea is to create a Node server that `net.connect`s\nto the WM state socket, dumps the events into a websocket and serves up a page\nthat uses [D3][12] to render borders and a minimap.  [Screenshot here][13].\n\n\u003c!-- TODO publish a more complete hud example --\u003e\n\n### Details\n\nBasedwm outputs window positions on a socket in `/tmp/wmstate.sock`, as\nnewline-delimited [JSON][14] objects.  Every object has a property `id` with\nthe window's ID, and a property `action` representing the event type.\n\nThe possible `action`s and their additional properties are:\n\n| action       | description             | additional properties       |\n| ------------ | ----------------------- | --------------------------- |\n| focus        | window gained focus     | none                        |\n| destroy      | window was destroyed    | none                        |\n| existing-add | initial window position | `x`, `y`, `width`, `height` |\n| add          | window was added        | `x`, `y`, `width`, `height` |\n| move         | window was moved        | `x`, `y`                    |\n| resize       | window was resized      | `width`, `height`           |\n\n`existing-add`-events are only sent immediately after connecting.  This lets\nany consuming program initialise its copy of the window positions.\n\nThe `x` and `y` properties indicate the absolute coordinates of the window's\ntop-left corner, relative to the screen's top-left corner.  The `width` and\n`height` properties indicate the absolute dimensions of the window.\n\nYou can easily survey the output using `socat UNIX:/tmp/wmstate.sock -`.\n\n## Bugs\n\nYes.\n\n## Inspirations \u0026 thankyous\n\nIntended as a modern reinterpretation of [swm][15], with the big virtual\ndesktop taken to the extreme.  Exposing controls on a pipe/socket interface and\noutsourcing controls to [sxhkd][16] are ideas from [bspwm][17].\n\n## License\n\n[ISC][18].\n\n[1]: https://www.npmjs.com/package/basedwm\n[2]: https://en.wikipedia.org/wiki/X_window_manager\n[3]: http://livescript.net\n[4]: http://en.wikipedia.org/wiki/Named_pipe\n[5]: https://en.wikipedia.org/wiki/Unix_domain_socket\n[6]: https://nodejs.org/\n[7]: https://iojs.org/\n[8]: https://github.com/baskerville/sxhkd\n[9]: example/basedwm.sxhkdrc\n[10]: https://en.wikipedia.org/wiki/Environment_variable\n[11]: https://github.com/anko/hudkit\n[12]: http://d3js.org/\n[13]: https://cloud.githubusercontent.com/assets/5231746/8208678/c40d95a6-1500-11e5-9ecf-84aece17044e.png\n[14]: http://json.org/\n[15]: https://en.wikipedia.org/wiki/Swm\n[16]: https://github.com/baskerville/sxhkd\n[17]: https://github.com/baskerville/bspwm\n[18]: LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanko%2Fbasedwm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanko%2Fbasedwm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanko%2Fbasedwm/lists"}