{"id":50991851,"url":"https://github.com/noctalia-dev/noctalia-greeter","last_synced_at":"2026-06-20T04:06:26.955Z","repository":{"id":363318074,"uuid":"1239705109","full_name":"noctalia-dev/noctalia-greeter","owner":"noctalia-dev","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-08T11:19:59.000Z","size":2408,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T12:25:51.525Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noctalia-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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-05-15T11:03:10.000Z","updated_at":"2026-06-08T11:20:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/noctalia-dev/noctalia-greeter","commit_stats":null,"previous_names":["noctalia-dev/noctalia-greeter"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/noctalia-dev/noctalia-greeter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noctalia-dev%2Fnoctalia-greeter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noctalia-dev%2Fnoctalia-greeter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noctalia-dev%2Fnoctalia-greeter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noctalia-dev%2Fnoctalia-greeter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noctalia-dev","download_url":"https://codeload.github.com/noctalia-dev/noctalia-greeter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noctalia-dev%2Fnoctalia-greeter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34556513,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-06-20T04:06:26.255Z","updated_at":"2026-06-20T04:06:26.949Z","avatar_url":"https://github.com/noctalia-dev.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"Noctalia Greeter\n===\n\nA minimal login greeter for [greetd](https://github.com/kennylevinsen/greetd) that matches the look and feel of [Noctalia Shell](https://github.com/noctalia-dev/noctalia-shell).\n\n\u003cp\u003e\u003cbr/\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://assets.noctalia.dev/noctalia-logo.svg?v=2\" alt=\"Noctalia Logo\" style=\"width: 192px\" /\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\u003cbr/\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/noctalia-dev/noctalia-greeter/commits\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/noctalia-dev/noctalia-greeter?style=for-the-badge\u0026labelColor=0C0D11\u0026color=A8AEFF\u0026logo=git\u0026logoColor=FFFFFF\u0026label=commit\" alt=\"Last commit\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/noctalia-dev/noctalia-greeter/stargazers\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/noctalia-dev/noctalia-greeter?style=for-the-badge\u0026labelColor=0C0D11\u0026color=A8AEFF\u0026logo=github\u0026logoColor=FFFFFF\" alt=\"GitHub stars\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://docs.noctalia.dev\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/docs-A8AEFF?style=for-the-badge\u0026logo=gitbook\u0026logoColor=FFFFFF\u0026labelColor=0C0D11\" alt=\"Documentation\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://discord.noctalia.dev\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/discord-A8AEFF?style=for-the-badge\u0026labelColor=0C0D11\u0026logo=discord\u0026logoColor=FFFFFF\" alt=\"Discord\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## What is Noctalia Greeter?\n\nNoctalia Greeter is the screen you see before your desktop session starts. It lets you pick a user, enter your password, choose a Wayland session, and pick a color scheme - with the same visual language as Noctalia Shell.\n\nIt is built for **greetd**: greetd starts the bundled wlroots compositor (`noctalia-greeter-compositor`), and the greeter runs inside that session.\n\nPair it with **[Noctalia v5](https://github.com/noctalia-dev/noctalia)** if you want wallpaper and palette synced from the shell settings (optional).\n\n## Dependencies\n\nInstall everything below on the machine where greetd will run. Each list covers build tools and libraries, plus **greetd** and **D-Bus** (used by `noctalia-greeter-session`). You still need your desktop sessions separately (niri, Hyprland, and so on).\n\n### Arch\n\n```sh\nsudo pacman -S meson gcc just \\\n  greetd dbus \\\n  wayland wayland-protocols wlroots0.20 \\\n  libglvnd freetype2 fontconfig \\\n  cairo pango harfbuzz \\\n  libxkbcommon glib2 \\\n  libwebp librsvg\n```\n\n### Fedora\n\n```sh\nsudo dnf install meson gcc-c++ just \\\n  greetd dbus \\\n  wayland-devel wayland-protocols-devel wlroots-devel \\\n  libEGL-devel mesa-libGLES-devel \\\n  freetype-devel fontconfig-devel \\\n  cairo-devel pango-devel harfbuzz-devel \\\n  libxkbcommon-devel glib2-devel \\\n  libwebp-devel librsvg2-devel\n```\n\n### Debian / Ubuntu\n\n```sh\nsudo apt install meson g++ just \\\n  greetd dbus \\\n  libwayland-dev wayland-protocols libwlroots-0.20-dev \\\n  libegl-dev libgles-dev \\\n  libfreetype-dev libfontconfig-dev \\\n  libcairo2-dev libpango1.0-dev libharfbuzz-dev \\\n  libxkbcommon-dev libglib2.0-dev \\\n  libwebp-dev librsvg2-dev\n```\n\n### Void Linux\n\n```sh\nsudo xbps-install meson ninja pkg-config git \\\n  greetd dbus \\\n  wayland-devel wayland-protocols wlroots-devel libepoxy-devel \\\n  MesaLib-devel libglvnd-devel cairo-devel \\\n  pango-devel fontconfig-devel freetype-devel harfbuzz-devel \\\n  libxkbcommon-devel libwebp-devel librsvg-devel\n```\n\nVendored dependencies, with no system package needed: `nlohmann/json`, `stb`, and `Wuffs`.\n\nBuild requires `wlroots-0.20` and `wayland-server` development packages (see distro lists above).\n\n`libwebp` handles WebP wallpapers when syncing appearance from the shell. Wuffs handles other raster image formats.\n\nOn Void Linux, `libepoxy-devel` is used when EGL/GLES pkg-config modules are not available.\n\n## NixOS\n\nA flake and NixOS module are provided.\n\nAdd the input to your `flake.nix`:\n\n```nix\ninputs = {\n  noctalia-greeter = {\n    url = \"github:noctalia-dev/noctalia-greeter\";\n    inputs.nixpkgs.follows = \"nixpkgs\";\n  };\n};\n```\n\nImport the module and enable the greeter in your configuration:\n\n```nix\nimports = [\n  inputs.noctalia-greeter.nixosModules.default\n];\n\nprograms.noctalia-greeter = {\n  enable = true;\n  package = inputs.noctalia-greeter.packages.${pkgs.stdenv.hostPlatform.system}.default;\n\n  # Optional configuration\n  greeter-args = \"\";\n  settings.cursor = {\n    theme = \"Adwaita\";\n    size = 24;\n    package = pkgs.adwaita-icon-theme;\n  };\n};\n```\n\nThe module enables greetd and sets the session command automatically.\n\n`greeter-args` passes extra flags to `noctalia-greeter-session`, for example\n`--session \u003cname\u003e` to set a default session. Run `noctalia-greeter sessions`\nto list valid names.\n\n## Building and installing\n\nRequires [just](https://github.com/casey/just) and [meson](https://mesonbuild.com/).\n\n#### Release build\n\n```sh\njust configure-release\njust build-release\nsudo meson install -C build-release\nsudo ./scripts/setup_greeter_system.sh\n```\n\nPass a prefix when configuring to install somewhere other than `/usr/local`:\n\n```sh\nmeson setup build-release --prefix=\"$HOME/.local\" --buildtype=release --reconfigure\njust build-release\nsudo meson install -C build-release\nsudo ./scripts/setup_greeter_system.sh\n```\n\n#### Debug build\n\n```sh\njust build\nsudo just install\n```\n\n`just install` runs the same system setup scripts after Meson install.\n\nMeson installs the greeter binary, session launcher and assets. With the default prefix that is under `/usr/local`; distro packages (e.g. AUR) usually install to `/usr/bin` instead.\n\n```text\n\u003cprefix\u003e/bin/noctalia-greeter\n\u003cprefix\u003e/bin/noctalia-greeter-compositor\n\u003cprefix\u003e/bin/noctalia-greeter-session\n\u003cprefix\u003e/bin/noctalia-greeter-apply-appearance\n\u003cprefix\u003e/share/noctalia-greeter/assets/...\n```\n\nThe greeter needs the shipped `assets/` tree at runtime. Copying only the `noctalia-greeter` binary is not enough.\n\n## Setting up greetd\n\nPoint greetd at the installed session wrapper. Use the path on your system — do not assume `/usr/local` if you installed from a package:\n\n```sh\nwhich noctalia-greeter-session\n```\n\nExample for a manual install to `/usr/local` (replace the path if `which` shows something else, e.g. `/usr/bin/noctalia-greeter-session`):\n\n```toml\n[default_session]\ncommand = \"/usr/local/bin/noctalia-greeter-session\"\nuser = \"greeter\"\n```\n\nUse the `user` value that matches your greetd config. `setup_greeter_system.sh` prints a ready-to-paste `config.toml` block with the path it finds. It also prepares `/var/lib/noctalia-greeter/` for that account.\n\nOptional default session (must match a name from the session picker, e.g. `niri`):\n\n```toml\ncommand = \"/usr/bin/noctalia-greeter-session -- --session niri\"\n```\n\nList valid session names:\n\n```sh\nnoctalia-greeter sessions\n```\n\nSessions come from `wayland-sessions` `.desktop` files under `/usr/share`, each path in `XDG_DATA_DIRS`, and on NixOS `/run/current-system/sw/share`.\n\n### Multi-monitor\n\nBy default the greeter is **mirrored on every connected monitor** (same UI on each display, sized to the primary output). To pin it to a single connector, set `output` in `/var/lib/noctalia-greeter/greeter.conf`:\n\n```ini\noutput=\"DP-2\"\n```\n\nThe compositor disables the other connectors at the KMS level when `output` is set. If `output` names a disconnected connector, the greeter falls back to mirroring on all outputs.\n\nWhen using multiple monitors, set `output_layout` manually or sync from Noctalia Shell (see Matching Noctalia Shell). Without it, outputs are placed left-to-right by connector name. List connector names with `noctalia-greeter outputs`:\n\n```ini\noutput_layout=\"DP-1:0,0; HDMI-A-1:1920,0; DP-2:3840,0\"\n```\n\nCoordinates are logical pixels from your desktop compositor. The greeter uses them for **order and row grouping**, then places outputs edge-to-edge at its own scale so the cursor can move between monitors.\n\nTest locally with:\n\n```sh\njust run\n```\n\nOn high-DPI panels (for example 4K), the greeter compositor applies fractional output scaling from the monitor's physical size when EDID reports it, otherwise from resolution. Scale is capped at 2×. The greeter client lays out at logical size and renders HiDPI buffers via Wayland fractional scale.\n\nTo override auto scaling, set `scale` in `greeter.conf` (read by the compositor):\n\n```ini\nscale=1.5\n```\n\nIf `scale` is missing or invalid, the compositor falls back to auto scaling.\n\nList connector names from a running Wayland session:\n\n```sh\nnoctalia-greeter outputs\n```\n\nRestart greetd:\n\n```sh\nsudo systemctl restart greetd\n```\n\nOn runit:\n\n```sh\nsudo sv restart greetd\n```\n\nCreate log files once if needed:\n\n```sh\njust setup-log-dir\n```\n\nLogs: `/var/log/noctalia-greeter.log` and `/var/lib/noctalia-greeter/greeter.log`.\n\n## Matching Noctalia Shell\n\nWith [Noctalia v5](https://github.com/noctalia-dev/noctalia) installed, open **Settings → Shell → Security → Noctalia Greeter → Sync Now**. The shell copies your wallpaper, palette, and multi-monitor layout (when available) to the greeter (you may be prompted for admin credentials). After syncing, log out or restart greetd to see the changes on the login screen.\n\nThe greeter adds a **Synced** color scheme when sync data is present. Session and scheme choices you make on the login screen are remembered in `/var/lib/noctalia-greeter/greeter.conf`.\n\nAdmin-only keys in `greeter.conf` (set by you, not the UI):\n\n- `default_session` - session selected when the greeter opens (overrides last-used unless you pass `--session` on the command line)\n- `default_user` - username to select on startup; opens the password step immediately (overrides user picker unless you go back; `--user` on the command line wins)\n- `greeter_user` - greetd account name (setup/logging)\n- `output` - Wayland connector name (see Multi-monitor)\n- `output_layout` - multi-monitor positions as `NAME:X,Y; ...` in logical pixels (see Multi-monitor)\n- `scale` - manual compositor scale factor (e.g. `1.5`); invalid or missing → auto scale\n- `cursor_theme` - cursor theme name (e.g. `Adwaita`); missing → wlroots default cursor\n- `cursor_size` - cursor size in pixels (e.g. `24`); missing → `24`\n- `cursor_path` - colon-separated theme search path (sets `XCURSOR_PATH`); needed when the theme is not on the default search path (`~/.icons:/usr/share/icons:/usr/share/pixmaps`)\n- `keyboard_layout` - XKB layout code(s), e.g. `cz`, `us`, `de,cz` (comma-separated for multiple layouts)\n- `keyboard_variant` - XKB variant(s), e.g. `qwertz` (optional; comma-separated when multiple layouts)\n- `keyboard_options` - XKB options string, e.g. `grp:alt_shift_toggle` (optional)\n\nThe greeter updates `session` and `scheme` when you change them in the UI.\n\n## Cursor theme\n\nThe compositor resolves the cursor theme, size and search path in this order:\n\n1. `cursor_theme` / `cursor_size` / `cursor_path` in `greeter.conf` (above)\n2. The `XCURSOR_THEME`, `XCURSOR_SIZE` and `XCURSOR_PATH` environment variables\n3. The wlroots defaults (built-in cursor at size `24`)\n\ngreetd starts greeters with an empty environment, so to use the environment\nvariables set them in the greetd session **command** rather than the service\nenvironment, for example in `/etc/greetd/config.toml`:\n\n```toml\n[default_session]\ncommand = \"env XCURSOR_THEME=Adwaita XCURSOR_SIZE=24 /usr/bin/noctalia-greeter-session\"\n```\n\nIf the theme is not under the default search path, also set\n`XCURSOR_PATH` (or `cursor_path`) to the directory that contains it. On NixOS,\nuse the `programs.noctalia-greeter.settings.cursor` options instead, which wire this up\nfor you.\n\n## Keyboard\n\nThe greeter works without a mouse.\n\n### Layout\n\nThe compositor builds an XKB keymap in this precedence order:\n\n1. `greeter.conf`: `keyboard_layout` / `keyboard_variant` / `keyboard_options`\n2. `XKB_DEFAULT_LAYOUT` / `XKB_DEFAULT_VARIANT` / `XKB_DEFAULT_OPTIONS` (environment)\n3. The system default keymap\n\nExample:\n\n```ini\nkeyboard_layout = cz\n```\n\nMultiple layouts:\n\n```ini\nkeyboard_layout = us,cz\nkeyboard_options = grp:alt_shift_toggle\n```\n\nUse standard [XKB layout codes](https://www.freedesktop.org/wiki/Software/XKeyboard-config/Rules/) (`de`, `fr`, `ru`, …).\n\ngreetd starts greeters with an empty environment, so set layout in `greeter.conf` or prefix the greetd session command:\n\n```toml\n[default_session]\ncommand = \"env XKB_DEFAULT_LAYOUT=cz /usr/bin/noctalia-greeter-session\"\n```\n\n### Shortcuts\n\n| Key | Action |\n|-----|--------|\n| `Tab` / `Shift+Tab` | Move focus |\n| `↑` / `↓` | Move focus, or move in an open menu |\n| `Enter` | Submit password / activate / confirm menu |\n| `Space` | Activate focused control |\n| `Esc` | Close menu or leave password step |\n| `F3` | Session picker |\n| `F7` | Color scheme picker |\n| `Ctrl+Alt+F1`–`F12` | Switch to virtual terminal (TTY) |\n\n## Troubleshooting\n\n- **Blank screen** - Check `/var/log/noctalia-greeter.log` and `/var/lib/noctalia-greeter/greeter.log`. Run `just setup-log-dir` if they are missing.\n- **`Failed to spawn client` / wrong path in greetd config** - `command` must be the full path from `which noctalia-greeter-session` (often `/usr/bin/...` on packaged installs, not `/usr/local/bin/...`).\n- **`WAYLAND_DISPLAY is not set`** - greetd must use `noctalia-greeter-session` (it starts `noctalia-greeter-compositor`). Fix `command` in `/etc/greetd/config.toml`.\n- **Black screen after reboot** - logs survive under `/var/log/noctalia-greeter.log` and `/var/lib/noctalia-greeter/greeter.log` (run `just setup-log-dir` once). Session output also goes there when writable.\n- **Wrong session on startup** - If `default_session` is set in `greeter.conf`, it wins over last-used `session`. Run `noctalia-greeter sessions` for exact **Name** spelling.\n- **Synced look missing** - Install shell v5 and greeter; run **Sync Now** in shell settings again; restart greetd or log out once.\n\nStuck display over SSH:\n\n```sh\njust recover\n```\n\n---\n\n## Scope\n\nNoctalia Greeter is a **display/login greeter** for greetd. It handles user/session selection and authentication UI.\n\nIt is **not** a desktop shell or compositor replacement.\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome: fixes, polish, docs, or UX improvements.\n\n- Open an issue for bugs and regressions\n- Open a PR for improvements\n\n---\n\n## License\n\nDistributed under the MIT License. See [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoctalia-dev%2Fnoctalia-greeter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoctalia-dev%2Fnoctalia-greeter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoctalia-dev%2Fnoctalia-greeter/lists"}