[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82971":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},82971,"driftwm","malbiruk\u002Fdriftwm","malbiruk","A trackpad-first infinite canvas Wayland compositor.",null,"https:\u002F\u002Fgithub.com\u002Fmalbiruk\u002Fdriftwm","Rust",1175,37,11,8,0,97,171,222,291,17.74,false,"main",[25,26,27,28,29,30,31,32,33,34],"compositor","gestures","infinite-canvas","linux","rust","smithay","trackpad","wayland","wayland-compositor","window-manager","2026-06-12 02:04:29","\u003Ch1 align=\"center\">\u003Cimg alt=\"driftwm\" src=\"assets\u002Flogo.jpg\" width=\"500\">\u003C\u002Fh1>\n\u003Cp align=\"center\">A trackpad-first infinite canvas Wayland compositor.\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmalbiruk\u002Fdriftwm\u002Fblob\u002Fmain\u002FLICENSE\">\u003Cimg alt=\"License: GPL-3.0-or-later\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-GPL--3.0--or--later-blue\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmalbiruk\u002Fdriftwm\u002Freleases\">\u003Cimg alt=\"GitHub Release\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fmalbiruk\u002Fdriftwm?logo=github\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Frepology.org\u002Fproject\u002Fdriftwm\u002Fversions\">\u003Cimg alt=\"Packaging status\" src=\"https:\u002F\u002Frepology.org\u002Fbadge\u002Ftiny-repos\u002Fdriftwm.svg\">\u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Csub>Primary repository: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmalbiruk\u002Fdriftwm\">GitHub\u003C\u002Fa> · Mirror: \u003Ca href=\"https:\u002F\u002Fcodeberg.org\u002Fmalbiruk\u002Fdriftwm\">Codeberg\u003C\u002Fa>\u003C\u002Fsub>\u003C\u002Fp>\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fdf24e442-6ad0-4520-9491-cb666da06d05\n\nTraditional window managers arrange windows to fit your screen. Stacking compositors do so by piling windows on top of each other; tiling compositors do so by squeezing them to fit and utilizing workspaces.\n\n`driftwm` is an infinite-canvas compositor: windows live at their native size on an infinite 2D canvas, and your display is a camera viewing it. When two windows come close, they snap together, forming implicit groups that can be moved, resized, and viewed together. No tiling, no workspaces, window overlaps happen only on purpose.\n\nDesigned with laptops in mind: navigation and window management are trackpad-first; the infinite canvas makes the most of a small screen.\n\nBuilt on [smithay](https:\u002F\u002Fgithub.com\u002FSmithay\u002Fsmithay). Inspired by [vxwm](https:\u002F\u002Fcodeberg.org\u002Fwh1tepearl\u002Fvxwm); borrows implementation details from [niri](https:\u002F\u002Fgithub.com\u002FYaLTeR\u002Fniri).\n\n> [!WARNING]  \n> This is experimental software. Primarily built with AI. Use at your own risk.\n\n## Features\n\n### Pan & zoom\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fa5f14739-7762-4515-abb1-0de6990de4a3\n\nInfinite 2D canvas with viewport panning, zoom, and scroll momentum. A quick\nflick carries the viewport smoothly until friction stops it.\n\n| Input              | Action            | Context   |\n| ------------------ | ----------------- | --------- |\n| 3-finger swipe     | Pan viewport      | anywhere  |\n| Trackpad scroll    | Pan viewport      | on-canvas |\n| `Mod` + LMB drag   | Pan viewport      | anywhere  |\n| `Mod+Ctrl` + arrow | Pan viewport      | —         |\n| 2-finger pinch     | Zoom              | on-canvas |\n| 3-finger pinch     | Zoom              | anywhere  |\n| `Mod` + scroll     | Zoom at cursor    | anywhere  |\n| `Mod+=` \u002F `Mod+-`  | Zoom in \u002F out     | —         |\n| `Mod+0` \u002F `Mod+Z`  | Reset zoom to 1.0 | —         |\n\n### Window navigation\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F5b7d89cd-b065-4309-ae74-30bfe68a8abb\n\nJump to the nearest window in any direction via cone search. MRU cycling\n(`Alt-Tab`) with hold-to-commit. Zoom-to-fit shows all windows at once.\nConfigurable anchors act as navigation targets for directional jumps even\nwith no window there — useful for areas with pinned widgets.\n\n| Input                        | Action                                     |\n| ---------------------------- | ------------------------------------------ |\n| 4-finger swipe               | Jump to nearest window (natural direction) |\n| `Mod+Ctrl` + LMB drag        | Jump to nearest window (natural direction) |\n| `Mod` + arrow                | Jump to nearest window in direction        |\n| `Alt-Tab` \u002F `Alt-Shift-Tab`  | Cycle windows (MRU)                        |\n| 4-finger pinch in \u002F `Mod+W`  | Zoom-to-fit (overview)                     |\n| 4-finger pinch out \u002F `Mod+A` | Home toggle (origin and back)              |\n| 4-finger hold \u002F `Mod+C`      | Center focused window                      |\n| `Mod+1-4`                    | Jump to bookmarked canvas position         |\n\nAll 4-finger navigation gestures also work as `Mod` + 3-finger for smaller\ntrackpads.\n\n### Snapping\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F8a468e69-8887-4d27-8457-cdd2753948ca\n\nMove window with 3-finger doubletap-swipe or `Alt` + drag. Resize with `Alt` + 3-finger swipe. Snapping kicks in as edges approach each other. Drag past the viewport edge and the canvas auto-pans.\n\n**Snapped windows form a cluster.** Two benefits: neighbors stay visible at your view's edge for spatial context, and `Shift` + any move\u002Fresize\u002Ffit action acts on the whole cluster. Shuffle a layout in one drag, resize a row of panes proportionally, or scope an overview to just the cluster (`Mod+Shift+W`). No explicit grouping to manage.\n\n> [!TIP]\n> While dragging a window, keyboard shortcuts still work. Use `Mod+1-4`\n> to jump to a bookmark or `Mod+A` to go home — your held window comes with you.\n\nFit-window (`Mod+M`) is the maximize analogue — centers the viewport, resets\nzoom to 1.0, and resizes the window to fill the screen. Toggle again to\nrestore. Fullscreen (`Mod+F`) is a viewport mode, not a window state — any canvas\naction (launching an app, navigating) naturally exits it.\n\n| Input                                     | Action                        |\n| ----------------------------------------- | ----------------------------- |\n| 3-finger doubletap-swipe                  | Move window                   |\n| `Alt` + LMB drag                          | Move window                   |\n| `Alt+Shift` + LMB drag                    | Move snapped windows          |\n| `Alt` + 3-finger swipe                    | Resize window                 |\n| `Alt+Shift` + 3-finger swipe              | Resize snapped window         |\n| `Alt` + RMB drag                          | Resize window                 |\n| `Alt` + MMB click \u002F `Mod+M`               | Fit window (maximize\u002Frestore) |\n| `Alt+Shift` + MMB click \u002F `Mod+Shift+M`   | Fit snapped window            |\n| `Mod` + 4-finger pinch in \u002F `Mod+Shift+W` | Zoom-to-fit snapped windows   |\n| `Alt` + 2-finger pinch in\u002Fout             | Fit window                    |\n| `Alt` + 3-finger pinch in\u002Fout             | Toggle fullscreen             |\n| `Mod` + MMB click \u002F `Mod+F`               | Toggle fullscreen             |\n| `Mod+Shift` + arrow                       | Nudge window 20px             |\n\n### Infinite background\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F6e9eb7f7-0c73-4fdd-b7aa-230b8ff0a172\n\nThe background is part of the canvas — it scrolls and zooms with the viewport,\nnot stuck to the screen. This gives spatial awareness when panning.\n\nThree modes (all rendered as shaders internally):\n\n- **`shader`** — procedural GLSL, animated or static, optionally sampling an image via `texture`. Default is a dot grid. See [docs\u002Fshaders.md](docs\u002Fshaders.md) to write your own. Bundled shaders live in `extras\u002Fwallpapers\u002F{static,animated,textured}\u002F`.\n- **`tile`** — PNG\u002FJPG (single texture, tiled infinitely), or a tiled pyramidal TIFF for [gigapixel wallpapers](docs\u002Fgigapixel-wallpapers.md).\n- **`wallpaper`** — single image stretched to fill viewport (does not scroll\u002Fzoom) — a classic desktop wallpaper.\n\n> [!NOTE]\n> GPU cost scales with what a shader reads: one that reads no viewport uniforms renders once (as cheap as `wallpaper`); reading `u_camera`\u002F`u_zoom` redraws on pan\u002Fzoom; reading `u_time` redraws every frame. Tiles redraw on pan\u002Fzoom; `wallpaper` renders once.\n\n```toml\n[background]\ntype = \"shader\"\npath = \"~\u002F.config\u002Fdriftwm\u002Fbg.glsl\"\n# texture = \"~\u002FPictures\u002Fimg.jpg\"  # if it's a texture-based shader\n\n# Or: type = \"tile\",      path = \"~\u002FPictures\u002Ftile.png\"\n# Or: type = \"tile\",      path = \"~\u002FPictures\u002Fworld.tif\"   # pyramidal TIFF\n# Or: type = \"wallpaper\", path = \"~\u002FPictures\u002Fwallpaper.jpg\"\n```\n\n### Window rules\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Faf603001-9f08-4d42-b50a-0342d06e954b\n\nMatch windows by `app_id` and\u002For `title` (glob patterns) and control\neverything: position, size, decorations, blur, opacity, pass-through keys, and widget behavior. All\nfields are independent and combine freely.\n\n**Widgets**: set `widget = true` to pin a window in place — immovable, below\nnormal windows, excluded from Alt-Tab. Works for both regular windows and\nlayer-shell surfaces (e.g. waybar). Use this for clocks, system stats, trays, or\nanything you want fixed on the canvas.\n\n```toml\n# Frosted-glass terminal\n[[window_rules]]\napp_id = \"Alacritty\"\nopacity = 0.85\nblur = true\n\n# Desktop widget — pinned, borderless\n[[window_rules]]\napp_id = \"my-clock\"\nposition = [50, 50]\nwidget = true\ndecoration = \"none\"\n```\n\n> [!TIP]\n> To find a window's `app_id`, check `$XDG_RUNTIME_DIR\u002Fdriftwm\u002Fstate` —\n> the `windows` field lists all open windows by their app ID.\n\nSee [docs\u002Fwindow-rules.md](docs\u002Fwindow-rules.md) for more details.\n\n### Multi-monitor\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F3f6cc3a8-a4ed-4d78-80fc-d5a92478c48f\n\nMultiple monitors are independent viewports on the same canvas. An outline on each monitor shows where the\nother monitors' viewports are. Cursor crosses between monitors freely; dragged\nwindows teleport to the target viewport's canvas position.\n\n| Input             | Action                         |\n| ----------------- | ------------------------------ |\n| `Mod+Alt` + arrow | Send window to adjacent output |\n\n### Panels, docks & taskbars\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F83c2ad30-fbfa-4cf2-aa47-905826889dcb\n\nLayer shell surfaces (waybar, fuzzel, mako) work as expected. Foreign toplevel\nmanagement means your dock\u002Ftaskbar shows all windows — click one and the\nviewport pans to it and centers it. See [`extras\u002F`](extras\u002F) for a fuzzel\nwindow-search script that lets you search and jump to any open window.\n\n### Everything else\n\n- New window placement: in viewport center (default), under cursor, or snapped adjacent to the focused window's cluster\n- Click-to-focus (default) or focus-follows-mouse (sloppy focus)\n- Session lock (swaylock), idle notify (swayidle\u002Fhypridle)\n- Screen capture: screencasting (OBS, Firefox, Discord) and screenshots\n- 40+ Wayland protocols\n\n## Install\n\n### Arch Linux (AUR)\n\n```bash\nyay -S driftwm\n```\n\nor for latest main:\n\n```bash\nyay -S driftwm-git\n```\n\n### NixOS \u002F Nix\n\nA `flake.nix` is included. To build:\n\n```bash\nnix build\n```\n\nFor development (provides native deps, uses your system Rust):\n\n```bash\nnix develop\ncargo build\ncargo run\n```\n\nTo add driftwm as a session in your NixOS config:\n\n```nix\nlet\n  driftwm-flake = builtins.getFlake \"github:malbiruk\u002Fdriftwm\";\n  driftwm = driftwm-flake.packages.x86_64-linux.default;\nin\n{\n  services.displayManager.sessionPackages = [ driftwm ];\n  environment.systemPackages = [ driftwm ];\n}\n```\n\n### Build from source\n\nRequires Rust 1.88+ (edition 2024).\n\nInstall build dependencies:\n\n**Fedora:**\n\n```bash\nsudo dnf install libseat-devel libdisplay-info-devel libinput-devel mesa-libgbm-devel libxkbcommon-devel\n```\n\n**Ubuntu\u002FDebian:**\n\n```bash\nsudo apt install libseat-dev libdisplay-info-dev libinput-dev libudev-dev libgbm-dev libxkbcommon-dev libwayland-dev\n```\n\n**Arch Linux:**\n\n```bash\nsudo pacman -S libdisplay-info libinput seatd mesa libxkbcommon\n```\n\n> [!NOTE]\n> Ubuntu 24.04 ships Rust 1.75 which is too old. Install via\n> [rustup](https:\u002F\u002Frustup.rs\u002F) instead of `apt install rustc`.\n\nThen build and install:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fmalbiruk\u002Fdriftwm.git\ncd driftwm\nmake build\nsudo make install\n```\n\nTo uninstall, run `sudo make uninstall` from the repository.\n\n### Optional runtime dependencies\n\ndriftwm runs standalone — none of these are required — but each enables or\nimproves a feature:\n\n- `xwayland-satellite` (≥ 0.7) — X11 app support (see below).\n- `xdg-desktop-portal` + `xdg-desktop-portal-wlr` (≥ 0.8.0) or `xdg-desktop-portal-cosmic` — screencasting. wlr needs a dmenu-style picker in `$PATH` (`wmenu`\u002F`wofi`\u002F`rofi`\u002F`bemenu`\u002F`mew`\u002F`fuzzel`) to choose what to share.\n- `grim` + `slurp` — screenshots (+ cropping to region).\n- `adwaita-fonts` — renders SSD title bars in `Adwaita Sans` to match GTK apps; without it a generic sans-serif is substituted. Font, size, weight, and alignment are configurable under `[decorations]`.\n- A cursor theme — most desktops set one up already; on a bare install driftwm falls back to a basic built-in arrow.\n\n**X11 apps** run through [xwayland-satellite](https:\u002F\u002Fgithub.com\u002FSupreeeme\u002Fxwayland-satellite),\nwhich driftwm spawns at startup, exporting `DISPLAY=:N` so X11 clients connect\ntransparently — no extra config beyond having the binary in `$PATH`.\n\n- **Arch:** `sudo pacman -S xwayland-satellite`\n- **Fedora:** `sudo dnf install xwayland-satellite`\n- **NixOS:** `pkgs.xwayland-satellite`\n- **Debian\u002FUbuntu:** not yet packaged — `cargo install --locked xwayland-satellite`\n\nIf satellite isn't found at startup, driftwm logs a warning and continues without\nX11 support. You can override the binary path or disable the integration in\n[`config.reference.toml`](config.reference.toml) under `[xwayland]`.\n\n### Running\n\ndriftwm auto-detects whether it's running nested (inside an existing Wayland\nsession) or on real hardware (from a TTY). Just run `driftwm`. For display\nmanager integration, select \"driftwm\" from the session menu.\n\n> When launched by a display manager, driftwm runs as a systemd user service — view logs with `journalctl --user -u driftwm.service` (add `-f` to follow). Run directly and logs go to stderr.\n\n## Quick start\n\n`mod` is Super by default. Terminal and launcher are auto-detected (foot\u002Falacritty\u002Fkitty, fuzzel\u002Fwofi\u002Fbemenu); override in config.\n\n| Shortcut           | Action        |\n| ------------------ | ------------- |\n| `mod+return`       | Open terminal |\n| `mod+d`            | Open launcher |\n| `mod+q`            | Close window  |\n| `mod+l`            | Lock screen   |\n| `mod+ctrl+shift+q` | Quit          |\n\nFeature-specific bindings (navigation, zoom, snap) are in their respective sections above.\n\n## Configuration\n\nConfig file: `~\u002F.config\u002Fdriftwm\u002Fconfig.toml` (respects `XDG_CONFIG_HOME`).\n\n```bash\nmkdir -p ~\u002F.config\u002Fdriftwm\ncp \u002Fetc\u002Fdriftwm\u002Fconfig.reference.toml ~\u002F.config\u002Fdriftwm\u002Fconfig.toml\n```\n\nMissing file uses built-in defaults. Partial configs merge with defaults —\nonly specify what you want to change. Use `\"none\"` to unbind a default binding.\nValidate without starting: `driftwm --check-config`.\n\n```toml\n# Launch programs at startup\nautostart = [\"waybar\", \"swaync\", \"swayosd-server\"]\n```\n\nSee [`config.reference.toml`](config.reference.toml) for all options: input\nsettings, scroll\u002Fmomentum tuning, snap behavior, decorations, effects,\nper-output config, gesture bindings, mouse bindings, and window rules.\n\n## Example setup\n\ndriftwm is just a compositor — everything else is standard Wayland tooling.\nHere are some tools that work well with it:\n\n- **waybar** — Status bar \u002F taskbar\n- **crystal-dock** — macOS-style dock\n- **fuzzel \u002F wofi** — App launcher\n- **mako \u002F swaync** — Notifications\n- **swaylock** — Lock screen\n- **swayidle \u002F hypridle** — Idle timeout (lock, suspend)\n- **swayosd** — Volume\u002Fbrightness OSD\n- **grim + slurp** — Screenshots\n- **wlr-randr \u002F wdisplays** — Output configuration\n- **COSMIC Settings** — Wi-Fi, Bluetooth, sound (or **nm-applet** + **blueman** + **pavucontrol**)\n\nCompositor-agnostic full Wayland shells like **noctalia**, **wayle**, and **dank-material-shell** should work too (`driftwm` supports `wlr-layer-shell` protocol) but without compositor-specific features.\n\nThe [`extras\u002F`](extras\u002F) directory contains a complete setup — driftwm config,\nGLSL shader wallpapers, Python widgets (clock, calendar, system stats, power\nmenu), waybar with taskbar\u002Ftray, fuzzel window-search script, and window rules\ntying it all together. Use it as a starting point or steal pieces.\n\n## Community tools\n\n- [driftwm-settings](https:\u002F\u002Fgithub.com\u002Fwwmaxik\u002Fdriftwm-settings) — GTK4 GUI config editor\n- [driftwm-noctalia](https:\u002F\u002Fgithub.com\u002Fyoussefvdel\u002Fdriftwm-noctalia) — noctalia shell fork adapted for driftwm\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\nTL;DR: open an issue before writing non-trivial code, keep PRs small and focused.\n\n## Merch\n\nIf you want to support the project (or just want a shirt), this is the way.\n\n\u003Cp align=\"left\">\u003Cimg src=\"assets\u002Ftshirt.png\" width=\"400\">\u003C\u002Fp>\n\nXL\n\n100 GEL · 37 USD · 2800 RUB\n\nShips worldwide from Tbilisi.\n\nOrder via [Telegram](https:\u002F\u002Ft.me\u002Ffiyefiyefiye), [Instagram](https:\u002F\u002Finstagram.com\u002Fflwrs_in_ur_eyes), or email [2601074@gmail.com](mailto:2601074@gmail.com).\n\nRevenue goes to me as driftwm's primary maintainer. If you've contributed substantively and want a shirt, drop me a line.\n\n## License\n\nGPL-3.0-or-later\n","driftwm 是一个以触控板优先的无限画布 Wayland 合成器。其核心功能包括在无限 2D 画布上原生大小显示窗口，支持平移、缩放和滚动动量，并且当窗口靠近时会自动对齐形成组。技术上基于 Rust 语言开发，使用 smithay 框架构建，特别强调了对触控板手势的支持。适用于笔记本电脑等小屏幕设备，提供了一种不同于传统堆叠或平铺方式的窗口管理体验，让用户能够更高效地利用有限的屏幕空间。需要注意的是，该项目目前仍处于实验阶段，主要由 AI 构建，使用时需谨慎。",2,"2026-06-11 04:09:45","trending"]