{"id":49688114,"url":"https://github.com/isene/tile","last_synced_at":"2026-06-07T05:03:57.349Z","repository":{"id":352887600,"uuid":"1217003736","full_name":"isene/tile","owner":"isene","description":"Pure-asm tiling window manager (CHasm suite). x86_64 Linux, no libc, X11 wire protocol, single static binary.","archived":false,"fork":false,"pushed_at":"2026-05-18T09:42:27.000Z","size":1351,"stargazers_count":24,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-18T10:42:38.392Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/isene.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T12:57:04.000Z","updated_at":"2026-05-18T09:42:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/isene/tile","commit_stats":null,"previous_names":["isene/tile"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/isene/tile","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isene%2Ftile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isene%2Ftile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isene%2Ftile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isene%2Ftile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/isene","download_url":"https://codeload.github.com/isene/tile/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isene%2Ftile/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33417489,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"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":[],"created_at":"2026-05-07T11:00:37.359Z","updated_at":"2026-06-07T05:03:57.342Z","avatar_url":"https://github.com/isene.png","language":"Assembly","funding_links":[],"categories":["Assembly"],"sub_categories":[],"readme":"# tile - Pure Assembly Tiling Window Manager\n\n\u003cimg src=\"img/tile.svg\" align=\"left\" width=\"150\" height=\"150\"\u003e\n\n![Version](https://img.shields.io/badge/version-0.1.26-blue)\n![Assembly](https://img.shields.io/badge/language-x86__64%20Assembly-purple)\n![License](https://img.shields.io/badge/license-Unlicense-green)\n![Platform](https://img.shields.io/badge/platform-Linux%20x86__64-blue)\n![Dependencies](https://img.shields.io/badge/dependencies-none-brightgreen)\n![Binary](https://img.shields.io/badge/binary-~71KB-orange)\n![X11](https://img.shields.io/badge/protocol-X11%20wire-ff6600)\n\nTiling window manager written in x86_64 Linux assembly. No libc, no\ntoolkit, pure syscalls. Speaks X11 wire protocol directly via Unix\nsocket.\n\nPart of the **[CHasm](https://github.com/isene/chasm)** (CHange to ASM)\nsuite, alongside [bare](https://github.com/isene/bare) (shell),\n[show](https://github.com/isene/show) (file viewer), and\n[glass](https://github.com/isene/glass) (terminal emulator).\n\n\u003cbr clear=\"left\"/\u003e\n\n![tile in action](img/screenshot.png)\n\nA tile-managed desktop: row-of-squares bar across the top, tabs on\nthe left, workspace indicators on the right, glass panes in a\nmaster/stack layout, **strip** + the **asmites** (the per-segment\nprograms in [chasm-bits](https://github.com/isene/chasm-bits))\ndriving the status row above tile's bar, **show** in the left +\nbottom-right panes, **bare** behind the prompt. Every binary on\nscreen is pure x86_64 assembly.\n\n**Status: daily-driver since 2026-04 (the author runs nothing else).**\nSee [PLAN.md](PLAN.md) for the full architecture and roadmap, and\n[CONFIG-FUTURE.md](CONFIG-FUTURE.md) for hardcoded constants that may\nbecome `~/.tilerc` keys later.\n\n## Goals\n\n- Replace i3 + i3bar + i3status + conky + stalonetray for the\n  author's daily workflow\n- No floating windows. Tiling only.\n- Tabbed layout as default (matches typical vim/glass usage)\n- Smart workspace cycling (Win+Right/Left walks only populated\n  workspaces; Win+N jumps direct)\n- Workspace pinned to output (external monitor always shows a\n  designated workspace)\n- A real bar (`strip`) with system tray (XEMBED) — coming in phase 2\n\n## Build (requires nasm and ld)\n\n```bash\ngit clone https://github.com/isene/tile.git\ncd tile\nmake\n```\n\n## Run safely under Xephyr (development)\n\n[Xephyr](https://www.freedesktop.org/wiki/Software/Xephyr/) is a\nnested X server that runs as a window inside your existing X\nsession. tile inside Xephyr cannot affect your host i3/Gnome/KDE\nsession, so a crash or bug just kills the Xephyr window.\n\n```bash\nsudo apt install xserver-xephyr        # Debian/Ubuntu (Arch: xorg-server-xephyr)\n\nmake xephyr                            # windowed Xephyr (1280x800)\nmake xephyr-multi                      # dual-output simulation (+xinerama)\n```\n\n### A subtlety about keybindings\n\nXephyr (even with `-fullscreen`) does **not** shield keystrokes from\nthe host window manager. The host WM's passive key grabs fire first —\nif your host i3 binds `Mod4+Return`, then `Mod4+Return` typed inside\nXephyr is captured by i3, not delivered to tile.\n\nFor development under i3, bind tile to chords i3 doesn't grab. Alt is\nessentially unused by typical i3 configs, so the built-in defaults\n(when there is no `~/.tilerc`) are:\n\n| Key | Action |\n|-----|--------|\n| `Alt+Return`  | Spawn glass |\n| `Alt+q`       | Close the focused window cleanly (WM_DELETE_WINDOW) |\n| `Alt+Shift+q` | Exit tile |\n\nOnce you cold-switch from i3 to tile on real hardware, `Mod4+`-style\nbinds work fine — see `tilerc.example` for the config syntax.\n\nTo launch a test app inside the Xephyr session:\n\n```bash\nDISPLAY=:9 glass                        # or: DISPLAY=:9 xterm\n```\n\n## Current capabilities\n\n- X11 wire protocol over Unix socket, MIT-MAGIC-COOKIE-1 authentication\n- Claims SubstructureRedirectMask on the root (single-WM enforcement)\n- ICCCM `WM_DELETE_WINDOW` — `kill` asks the app to close cleanly\n- **10 workspaces** with `workspace N` / `move-to N` / smart cycling\n  (`workspace next-populated` walks only populated workspaces) /\n  `workspace back-and-forth`\n- **Per-workspace layout**: TABBED, SPLIT_H, SPLIT_V, MASTER. New\n  windows append; cycle / reorder / move tabs across workspaces.\n  Closing the active tab auto-focuses the next-most-recent one.\n  Tab cycling in TABBED reconfigures the new active before mapping,\n  so siblings sized in MASTER/SPLIT take the full TABBED geometry\n  on cycle (no half-screen leftovers).\n- **Multi-output (Xinerama)** with workspace-pinned outputs: a\n  designated workspace always shows on the external monitor.\n- **Row-of-squares bar** at the very top: WS squares grouped\n  `[1 2 3]·[4 5 6]·[7 8 9]·[0]` with configurable per-WS colour\n  overrides, vertical separator bar, layout-mode glyph (TABBED ☰,\n  SPLIT_H ▌▐, SPLIT_V ▀▄, MASTER ▌▘▖), then the tab strip\n  (current = bright, others dimmed). `tab-color-cycle` rotates a\n  per-tab colour through `tab_palette`.\n- **strip status row** (companion bar) with text segments fed by\n  the [chasm-bits](https://github.com/isene/chasm-bits) asmites\n  (clock, battery, cpu, mem, disk, net, mailbox, brightness, vol,\n  weather, wintitle). Per-segment refresh interval, `+N` leading-gap\n  override, default-fg colour, all driven by `~/.striprc`.\n- **XEMBED system tray** (phase 2c) — apps that emit `_NET_WM_S0`\n  selection requests dock into strip's tray area.\n- **Stash / unstash** — i3 scratchpad replacement: a small LIFO of\n  unmapped tabs you can pop back to the current workspace.\n- **In-place restart** — `restart` action does\n  `execve(\"/proc/self/exe\")`, picking up a freshly-built tile binary\n  without losing any X clients (X owns the windows, WM just\n  reconnects).\n- WM-initiated unmaps don't get treated as window-closed\n- `~/.tilerc` and `~/.striprc` config parsers (reload via SIGUSR1)\n\nSee `tilerc.example` for the full config syntax. Recognised\nstatements: `bind \u003cchord\u003e \u003caction\u003e [arg]`, `exec \u003ccmdline\u003e`,\n`key = value` for bar appearance, `# comments`.\nModifiers: `Shift`, `Ctrl`/`Control`, `Alt`/`Mod1`, `Mod4`/`Win`/`Super`.\nActions: `exec`, `exec-here`, `kill`, `exit`, `workspace`, `move-to`,\n`focus`, `move-tab`, `tab-color-cycle`, `stash`, `unstash`, `layout`,\n`spawn-split`, `reload`, `restart`.\n\n## License\n\n[Unlicense](https://unlicense.org/) (public domain)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fisene%2Ftile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fisene%2Ftile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fisene%2Ftile/lists"}