{"id":42702065,"url":"https://github.com/synle/display-dj","last_synced_at":"2026-05-20T06:13:41.676Z","repository":{"id":352315552,"uuid":"1210756925","full_name":"synle/display-dj","owner":"synle","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-26T22:22:11.000Z","size":8471,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-27T00:25:59.735Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/synle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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},"funding":{"github":"synle"}},"created_at":"2026-04-14T18:16:50.000Z","updated_at":"2026-04-26T22:10:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/synle/display-dj","commit_stats":null,"previous_names":["synle/display-dj"],"tags_count":82,"template":false,"template_full_name":null,"purl":"pkg:github/synle/display-dj","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synle%2Fdisplay-dj","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synle%2Fdisplay-dj/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synle%2Fdisplay-dj/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synle%2Fdisplay-dj/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/synle","download_url":"https://codeload.github.com/synle/display-dj/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synle%2Fdisplay-dj/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32525986,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T01:12:54.858Z","status":"online","status_checked_at":"2026-05-02T02:00:05.923Z","response_time":132,"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":["brightness","darkmode","ddcci","displaydj","electron","mac","windows"],"created_at":"2026-01-29T14:22:03.420Z","updated_at":"2026-05-20T06:13:41.666Z","avatar_url":"https://github.com/synle.png","language":"Rust","funding_links":["https://github.com/sponsors/synle"],"categories":[],"sub_categories":[],"readme":"[![Build](https://github.com/synle/display-dj/actions/workflows/build.yml/badge.svg)](https://github.com/synle/display-dj/actions/workflows/build.yml)\n\n# Display DJ\n\nA cross-platform desktop system tray app for controlling monitor brightness, contrast, dark mode, volume, keep-awake, window tiling, exposé, and layout presets -- all from one place. Works with both built-in laptop displays and external monitors via DDC/CI. Supports **macOS**, **Windows**, and **Linux**.\n\n## Why I Built This\n\n- **No built-in external display control** -- macOS, Windows, and Linux have no native way to adjust brightness or contrast on external monitors connected via HDMI, USB-C, or DisplayPort. You're stuck reaching for physical buttons on the back of your monitor.\n- **Fragmented experience** -- every OS handles brightness, dark mode, and volume differently with different UIs, scattered across different system panels. There's no single place to control it all.\n- **Unified keyboard shortcuts** -- I wanted one set of global hotkeys that works the same way everywhere, regardless of which app is focused or which OS I'm on.\n- **Too many single-purpose apps** -- instead of installing separate apps for brightness control, volume control, keep awake, window tiling, and exposé, Display DJ bundles all of that into one lightweight tray app.\n- **Small and fast** -- built with Rust and Tauri instead of Electron/Node.js. The entire app is a fraction of the size and memory footprint of an Electron app, while still using a modern React frontend.\n\n## Screenshots\n\n|                 Main View (All Monitors)                  |                         Main View (Individual)                          |\n| :-------------------------------------------------------: | :---------------------------------------------------------------------: |\n| ![Main - All Monitors](screenshots/main-all-monitors.png) | ![Main - Individual Monitors](screenshots/main-individual-monitors.png) |\n\n|                  Settings - General                   |                  Settings - Tiling                  |\n| :---------------------------------------------------: | :-------------------------------------------------: |\n| ![Settings General](screenshots/settings-general.png) | ![Settings Tiling](screenshots/settings-tiling.png) |\n\n|                  Tray Menu - Tiling                   |                   Tray Menu - Profiles                    |\n| :---------------------------------------------------: | :-------------------------------------------------------: |\n| ![Tray Menu Tiling](screenshots/tray-menu-tiling.png) | ![Tray Menu Profiles](screenshots/tray-menu-profiles.png) |\n\n| Exposé Grid (all windows across 3 monitors) |\n| :-----------------------------------------: |\n| ![Exposé Grid](screenshots/expose-grid.png) |\n\n## Features\n\n- **Brightness control** -- a single slider to adjust all monitors at once, or expand to control each monitor individually\n- **Contrast control** -- DDC/CI contrast adjustment for external monitors (enable in Settings)\n- **Dark mode toggle** -- system-wide dark/light mode switch\n- **Volume control** -- system volume slider with mute indicator\n- **Keyboard backlight (beta)** -- built-in laptop keyboard backlight slider snapped to 25% increments. macOS via IOHIDEventSystem (built-in keyboards) and Windows via Lenovo / Dell WMI. Auto-hides on unsupported devices; master enable/disable in Settings. Default `Shift+F2` dims the backlight to 0 alongside the Focus profile\n- **Keep Awake** -- prevent your system from sleeping with a single toggle (macOS, Windows, Linux)\n- **Night mode schedule** -- automatically set brightness and dark/light mode on a time-based schedule (e.g., dim at 9 PM, bright at 7 AM). Supports custom commands (`nightCommands`/`dayCommands`) to run arbitrary actions on schedule (volume changes, profile activation, per-monitor brightness)\n- **Profiles** -- save and restore preset combinations of brightness, contrast, dark mode, and volume\n- **Global keyboard shortcuts** -- work even when the app isn't focused; fully configurable\n- **Monitor renaming** -- click any display name to give it a custom label\n- **Window tiling** (macOS + Windows + Linux/X11) -- tile windows to halves, thirds, two-thirds, quarters, or maximize via keyboard shortcuts or tray menu\n- **Tile Snap** (macOS only) -- drag a window to a screen edge to preview and snap it into a tiled layout. Enable/disable via the Tile Snap toggle in Settings\n- **Exposé** (macOS + Windows + Linux/X11) -- spread all windows into a grid overview, or just the current app's windows. Deterministic alphabetical layout with configurable multi-display strategy (spread evenly or fill each display). Has its own tray submenu with enable/disable toggle and grid size presets (2x2 through 5x5)\n- **App Exposé** -- grids the frontmost app's windows and fills remaining grid cells with other apps' windows\n- **Layout Presets** -- named presets that automatically tile specific apps to specific layouts. Triggered via keyboard shortcuts, profiles, or the tray menu\n- **Dynamic tray icon** -- the system tray icon updates to reflect app state: dark/light mode (border color), keep-awake active (blue fill), and muted (red X overlay)\n- **Settings panel** -- tabbed UI (General + Tiling) with auto-save. Configure brightness, contrast, monitors, night mode, snap zones, exposé grid size, layout strategy, and launch at login\n- **About / Update check** -- \"About Display DJ\" in the tray menu shows current version, latest GitHub release, engine, platform, build date, and homepage. Green \"Up to date\" or orange \"Update available\" badge with download link. macOS section includes quarantine fix and Accessibility settings commands\n- **System tray app** -- lives in your menu bar / system tray with no dock or taskbar clutter\n\n## Download \u0026 Install\n\nGrab the latest release from the **[Releases](../../releases)** page.\n\n### macOS\n\n| Chip          | File                           |\n| ------------- | ------------------------------ |\n| Apple Silicon | `Display DJ_x.x.x_aarch64.dmg` |\n| Intel         | `Display DJ_x.x.x_x64.dmg`     |\n\n1. Download the `.dmg` for your chip\n2. Open the `.dmg` and drag **Display DJ** into your **Applications** folder\n3. Launch **Display DJ** from Applications -- it will appear in your **menu bar** (top-right)\n\n\u003e **First launch note:** macOS Gatekeeper may show _\"Display DJ is damaged and can't be opened\"_ or _\"unidentified developer\"_ because the app is not notarized via the App Store. See the [macOS Gatekeeper fix](#macos-gatekeeper-fix) below.\n\n### Windows\n\n| Architecture | File                             |\n| ------------ | -------------------------------- |\n| x64          | `Display DJ_x.x.x_x64-setup.exe` |\n\n1. Download the `.exe` installer\n2. Run the installer and follow the prompts\n3. Launch **Display DJ** -- it will appear in your **system tray** (bottom-right; click `^` if hidden)\n\n### Linux\n\n| Format   | File                              |\n| -------- | --------------------------------- |\n| Debian   | `Display DJ_x.x.x_amd64.deb`      |\n| AppImage | `Display DJ_x.x.x_amd64.AppImage` |\n\n1. Install via your preferred format:\n\n   ```bash\n   # Debian / Ubuntu\n   sudo dpkg -i \"Display DJ_x.x.x_amd64.deb\"\n\n   # AppImage (no install needed)\n   chmod +x \"Display DJ_x.x.x_amd64.AppImage\"\n   ./\"Display DJ_x.x.x_amd64.AppImage\"\n   ```\n\n2. Install the required display-control dependencies:\n   ```bash\n   sudo apt install ddcutil brightnessctl i2c-tools\n   sudo modprobe i2c-dev\n   sudo usermod -aG i2c $USER\n   ```\n3. The app appears in your **top panel** (you may need the [AppIndicator extension](https://extensions.gnome.org/extension/615/appindicator-support/) on GNOME)\n\n## Configuration\n\nConfig files are stored in:\n\n- **macOS**: `~/Library/Application Support/display-dj/`\n- **Windows**: `%APPDATA%\\display-dj\\`\n- **Linux**: `~/.config/display-dj/`\n\nThe main config file is **`preferences.json`** -- it holds keyboard shortcuts, min brightness, night mode schedule, profiles, and per-monitor metadata (labels, sort order).\n\n### Default Keyboard Shortcuts\n\n| Keys            | Action                                |\n| --------------- | ------------------------------------- |\n| Shift + Escape  | Toggle Dark Mode                      |\n| Shift + F1      | Brightness 10% + Dark Mode            |\n| Shift + F2      | Focus profile + Keyboard Backlight 0% |\n| Shift + F3-F5   | Brightness 0% / 50% / 100%            |\n| Shift + F10-F12 | Volume 0% / 10% / 100%                |\n\n**Window Tiling** (macOS + Windows + Linux/X11):\n\n| Keys                  | Action                           |\n| --------------------- | -------------------------------- |\n| Ctrl + Shift + Left   | Left Third                       |\n| Ctrl + Shift + Right  | Right Third                      |\n| Ctrl + Shift + Up     | Left Two-Thirds                  |\n| Ctrl + Shift + Down   | Right Two-Thirds                 |\n| Ctrl + Shift + D/C/G  | Left/Center/Right Third          |\n| Ctrl + Shift + I/O    | Top-Left/Top-Right Quarter       |\n| Ctrl + Shift + K/L    | Bottom-Left/Bottom-Right Quarter |\n| Ctrl + Shift + M or / | Maximize                         |\n| Ctrl + Shift + E      | Exposé (all windows)             |\n| Ctrl + Up             | Exposé (all windows)             |\n| Ctrl + Shift + A      | App Exposé (current app only)    |\n| Ctrl + Down           | App Exposé (current app only)    |\n\n## Window Tiling (macOS + Windows + Linux/X11)\n\nWindow tiling lets you snap windows to halves, thirds, two-thirds, quarters, or maximize using keyboard shortcuts or the **Tiling** submenu in the tray icon's right-click menu. All 19 layouts, restore, Exposé, and App Exposé work on macOS, Windows, and Linux (X11). Tile Snap (mouse edge snapping) is currently macOS-only.\n\n### Exposé\n\nTwo Exposé modes are available:\n\n- **Exposé** (Ctrl+Up or Ctrl+Shift+E) -- spreads all on-screen windows into a deterministic alphabetical grid. Fills the first display, then overflows to the next. Windows with minimum size constraints (e.g., Steam, Chrome) that don't fit in the grid automatically overflow to subsequent displays where cells are larger.\n- **App Exposé** (Ctrl+Down or Ctrl+Shift+A) -- grids the frontmost app's windows, then fills remaining grid cells with other apps' windows.\n\nBoth modes normalize windows first (unminimize and exit fullscreen), then lay out a grid. Each invocation always re-lays out all windows (no toggle/restore). The grid size is configurable in Settings (Tiling tab) with separate Columns and Rows sliders (1-5 each, default 3x3). The layout strategy can be set to \"spread\" (distribute windows evenly across all displays) or \"fill\" (pack each display to capacity before using the next).\n\nThe Exposé tray submenu (separate from Tiling) provides an Enable/Disable toggle, Exposé and App Exposé actions, and grid size presets (2x2, 2x3, 3x3, 3x4, 4x4, 5x5).\n\n### Layout Presets\n\nLayout presets let you define named configurations that automatically tile specific apps to specific layouts. Each preset has a `name` and a list of `rules`. Each rule specifies:\n\n- `appMatch` -- case-insensitive substring to match against window/app names\n- `layout` -- the tiling layout to apply (e.g., `\"leftHalf\"`, `\"rightThird\"`, `\"maximize\"`)\n- `displayIndex` (optional) -- 0-based display index to place the window on\n\nPresets are triggered via `command/layout/{name_or_index}` and can be bound to keyboard shortcuts, included in profiles, or triggered from the \"Layout Presets\" tray submenu. Configure presets by editing `preferences.json` (accessible via \"Open App Preferences\" in the tray menu) or browse the config directory via \"Open App Folder\".\n\n## Wallpaper\n\nDisplay DJ can change your desktop wallpaper via commands that work from keyboard shortcuts, profiles, and night/day schedules.\n\n### Setting a Wallpaper\n\nUse the `command/wallpaper/change/{path}` command in your keyboard shortcuts or profiles. The path must be an absolute path to an image file.\n\n**macOS:**\n\n```json\n\"command/wallpaper/change//Users/jane/Pictures/mountain.jpg\"\n```\n\n**Windows:**\n\n```json\n\"command/wallpaper/change/D:\\\\Pictures\\\\mountain.jpg\"\n\"command/wallpaper/change/C:\\\\Users\\\\YourName\\\\Pictures\\\\wallpaper.png\"\n```\n\nWindows network shares (UNC paths) also work:\n\n```json\n\"command/wallpaper/change/\\\\\\\\NAS-SERVER\\\\g\\\\share\\\\Wallpapers\\\\sunset.jpg\"\n```\n\n\u003e **Note:** In JSON, backslashes must be doubled (`\\\\`). The path `\\\\NAS-SERVER\\g\\share\\Wallpapers\\sunset.jpg` becomes `\\\\\\\\NAS-SERVER\\\\g\\\\share\\\\Wallpapers\\\\sunset.jpg` in `preferences.json`.\n\n**Fit modes:** Add a fit mode before the path to control how the image fills the screen: `fill` (default), `fit`, `stretch`, `center`, `tile`.\n\n```json\n\"command/wallpaper/change/fit/D:\\\\Pictures\\\\wide-banner.jpg\"\n```\n\n**Per-monitor wallpaper** (macOS + Windows only):\n\n```json\n\"command/wallpaper/change_single/Dell U2723QE/D:\\\\Pictures\\\\left-monitor.jpg\"\n\"command/wallpaper/change_single/builtin/fill//Users/jane/Pictures/laptop.jpg\"\n```\n\nThe monitor name is matched by case-insensitive substring (e.g., `\"Dell\"` matches `\"Dell U2723QE\"`).\n\n### Slideshow\n\nStart a slideshow that cycles through all images in a folder:\n\n```json\n\"command/wallpaper/slideshow/D:\\\\Pictures\\\\Wallpapers\"\n\"command/wallpaper/slideshow/\\\\\\\\NAS-SERVER\\\\g\\\\share\\\\Wallpapers\"\n\"command/wallpaper/slideshow//Users/jane/Pictures/rotation\"\n```\n\nWith explicit interval (minutes) and order (`forward`, `backward`, `random`):\n\n```json\n\"command/wallpaper/slideshow/15/random/D:\\\\Pictures\\\\Wallpapers\"\n\"command/wallpaper/slideshow/30/forward/\\\\\\\\NAS-SERVER\\\\g\\\\share\\\\Wallpapers\"\n```\n\nStop the active slideshow:\n\n```json\n\"command/wallpaper/slideshow_stop\"\n```\n\n### Remote Wallpaper Packs\n\nDownload a `.zip` of images from a URL and start a slideshow on them:\n\n```json\n\"command/wallpaper/slideshow_remote/https://example.com/nature-pack.zip\"\n```\n\nThe zip is downloaded once (max 500 MB), extracted to the config directory, and the slideshow starts automatically. Subsequent calls with the same URL skip the download if images already exist.\n\n### Slideshow Settings\n\nThe Settings panel (General tab) has controls for:\n\n- **Wallpaper Fit** -- dropdown for fill/fit/stretch/center/tile\n- **Enable Slideshow** -- checkbox to start/stop\n- **Folder** -- path to the image folder\n- **Interval** -- hours + minutes dropdowns (minimum 5 minutes)\n- **Order** -- Forward, Backward, or Random\n\nSlideshow can also be configured in `preferences.json` under the `wallpaper` key:\n\n| Setting                              | Default     | Description                                           |\n| ------------------------------------ | ----------- | ----------------------------------------------------- |\n| `wallpaper.fit`                      | `\"fill\"`    | Default fit mode for wallpaper commands               |\n| `wallpaper.slideshowEnabled`         | `false`     | Whether the slideshow is active                       |\n| `wallpaper.slideshowFolder`          | `\"\"`        | Absolute path to the image folder                     |\n| `wallpaper.slideshowIntervalMinutes` | `30`        | Cycle interval in minutes (minimum 5)                 |\n| `wallpaper.slideshowOrder`           | `\"forward\"` | Cycle order: `\"forward\"`, `\"backward\"`, or `\"random\"` |\n\n### Enabling Tiling\n\n1. Open the tray menu and go to **Tiling \u003e Enable Tiling**, or toggle **Enable Window Tiling** in the Settings panel (Tiling tab)\n\n#### macOS: Accessibility Permission\n\nmacOS requires Accessibility permission for tiling to move/resize other apps' windows:\n\n1. Open **System Settings \u003e Privacy \u0026 Security \u003e Accessibility**\n2. Click the **+** button\n3. Add **Display DJ** (from `/Applications/Display DJ.app`)\n4. Make sure the toggle next to it is **on**\n5. If running in development mode (`npx tauri dev`), add your **terminal app** (e.g., iTerm, Terminal.app) instead\n\n\u003e **Note:** Tiling will not work without Accessibility permission on macOS. The Settings panel shows a warning with a link to these instructions if permission is missing.\n\n#### Windows\n\nNo special permissions are needed. Tiling works out of the box using Win32 APIs.\n\n#### Linux (X11)\n\nNo special permissions are needed on X11. Tiling uses EWMH window manager hints and works out of the box. Wayland is not supported — `get_tiling_supported` returns false on Wayland-only sessions (the `$DISPLAY` env var must be set).\n\n### Tiling Preferences\n\nTiling settings are stored in `preferences.json` under the `tiling` key. They can also be configured via the Settings panel (Tiling tab).\n\n| Setting                | Default    | Range      | Description                                                                                                                          |\n| ---------------------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------ |\n| `enabled`              | `true`     | --         | Master toggle for all tiling features                                                                                                |\n| `halfRatio`            | `50`       | --         | Percentage for half splits (affects halves and quarters)                                                                             |\n| `thirdRatio`           | `33`       | --         | Percentage for third splits (center = 100 - 2 x third)                                                                               |\n| `gap`                  | `0`        | --         | Padding in points around the tiling area                                                                                             |\n| `tileSnapEnabled`      | `true`     | --         | Enable/disable Tile Snap mouse edge snapping (macOS only)                                                                            |\n| `sideEdgeTrigger`      | `10`       | 5-50 px    | Tile Snap: width of left/right/bottom edge zone                                                                                      |\n| `topEdgeTrigger`       | `10`       | 10-50 px   | Tile Snap: height of top edge zone (maximize)                                                                                        |\n| `cornerTrigger`        | `50`       | 25-150 px  | Tile Snap: size of corner zone (quarter tiles)                                                                                       |\n| `exposeEnabled`        | `true`     | --         | Master toggle for Exposé features                                                                                                    |\n| `exposeColumns`        | `3`        | 1-5        | Number of columns in the Exposé grid per display                                                                                     |\n| `exposeRows`           | `3`        | 1-5        | Number of rows in the Exposé grid per display                                                                                        |\n| `exposeLayoutStrategy` | `\"spread\"` | --         | `\"spread\"` distributes windows evenly across displays; `\"fill\"` packs each display to capacity before using the next                 |\n| `exposeMinWidth`       | `400`      | 100-800 px | Minimum grid cell width in logical pixels. Cells smaller than this cause overflow to less-crowded displays. Scaled by DPI on Windows |\n| `exposeMinHeight`      | `300`      | 100-600 px | Minimum grid cell height in logical pixels. Same DPI scaling as width                                                                |\n\n## Known Issues\n\n- Not every external monitor supports DDC/CI (some budget models and certain HDMI connections)\n- Built-in HDMI on base M1/M2 Macs doesn't support DDC/CI -- use USB-C or DisplayPort instead\n- Linux global shortcuts may not work under Wayland (X11 works fine)\n\n## macOS Gatekeeper Fix\n\nmacOS Gatekeeper quarantines apps downloaded outside the App Store by setting an extended attribute (`com.apple.quarantine`) on the `.app` bundle. This causes the _\"app is damaged and can't be opened\"_ or _\"unidentified developer\"_ error when you try to launch the app.\n\nTo fix this, open **Terminal** and run:\n\n```bash\nxattr -cr \"/Applications/Display DJ.app\"\n```\n\nThis recursively clears the quarantine flag so macOS allows the app to run. You only need to do this once after the initial install (or after updating to a new version).\n\n## Tech Stack\n\n[Tauri v2](https://v2.tauri.app/) (Rust) + React 19 + TypeScript + Vite 6.\n\nAll platform code (DDC/CI, gamma, WMI, DisplayServices, dark mode, volume, wallpaper) lives in-process inside the Rust backend under `src-tauri/src/core/`. There is no external sidecar or helper binary -- macOS and Windows need no extra tools installed; Linux needs the system packages listed in the install section above.\n\n## Contributing\n\nSee **[CONTRIBUTING.md](CONTRIBUTING.md)** for the full development setup, project structure, testing, and platform guides. See **[DEV.md](DEV.md)** for the architecture deep-dive.\n\n## Bug Reports \u0026 Suggestions\n\nUse the [Issues](../../issues) page. Please include your OS version, monitor model(s), and connection type.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsynle%2Fdisplay-dj","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsynle%2Fdisplay-dj","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsynle%2Fdisplay-dj/lists"}