An open API service indexing awesome lists of open source software.

https://github.com/suhoiyis/gui-for-linux-wallpaperengine

gui for https://github.com/Almamu/linux-wallpaperengine
https://github.com/suhoiyis/gui-for-linux-wallpaperengine

gtk4 linux python wallpaper-app-gui-linux wallpaper-engine

Last synced: 2 months ago
JSON representation

gui for https://github.com/Almamu/linux-wallpaperengine

Awesome Lists containing this project

README

          


Logo

LINUX WALLPAPER ENGINE GUI

A modern GTK4 graphical interface for managing and applying Steam Workshop live wallpapers on Linux.



Latest Release


License

Platform
Python Version
GTK4


English |
็ฎ€ไฝ“ไธญๆ–‡

> [!NOTE]
> ๐ŸŒ Language Note: This English documentation was generated by AI and translating tools. While we strive for accuracy, some technical nuances might be lost. If you spot any linguistic errors, please feel free to or submit a Pull Request. Your help is much appreciated!

> Built on [Almamu/linux-wallpaperengine](https://github.com/Almamu/linux-wallpaperengine) backend, optimized for GNOME / Wayland desktop environments.

> ## ๐Ÿš€ Architecture Upgrade Announcement
> **We are rewriting the entire project in Rust!**
> ### โšก Performance Revolution
>- We are planning a major architecture upgrade โ€” a complete core rewrite in Rust. By replacing the existing Python architecture, we will bring you:
>
> - ๐Ÿš€ Native-level Performance โ€” Eliminate interpreter overhead, significantly faster execution
> - ๐Ÿ’พ Lower Resource Usage โ€” Reduced memory footprint, lightweight operation
> - ๐Ÿ”’ Enhanced Type Safety โ€” Compile-time checks, fewer runtime errors
> - ๐Ÿ› ๏ธ Better Concurrency Support โ€” Full utilization of multi-core processors
>
> - ๐Ÿ“ View Progress: Switch to [main-pre](https://github.com/Suhoiyis/gui-for-linux-wallpaperengine/tree/main-pre) branch for the latest development updates
> - ๐Ÿ“ฅ Try Early Builds: Download the latest builds from [Pre-release](https://github.com/Suhoiyis/gui-for-linux-wallpaperengine/releases) (Assets)
>
> - โš ๏ธ Note: The Rust version is currently in development and may be unstable. Please continue using the stable version for production environments.




Dark Mode
Light Mode










## โœจ Features

### Core Features

- ๐ŸŽจ **Light/Dark Theme Adaptive**: Fully adapts to your system's light or dark theme with automatic accent color sync โ€” no more unreadable text in light mode
- ๐Ÿ–ฅ๏ธ **Multi-Monitor Support**: Set independent wallpapers for each display, with Link/Unlink mode for bulk or per-screen control
- ๐Ÿ“œ **Playback History**: Automatically tracks your last 30 played wallpapers with timestamps, thumbnails, and one-click replay
- โœ๏ธ **Nickname System**: Assign custom nicknames to wallpapers for easier identification; supports batch management and search integration
- ๐Ÿ” **Search & Sort**: Real-time keyword search across titles, descriptions, and tags; sort by name, size, type, or folder ID
- ๐Ÿ“บ **System Tray**: Runs in background with quick actions โ€” random switch, stop, show/hide window
- โŒจ๏ธ **Command-Line Control**: Full CLI support for headless operation and remote control via single-instance architecture

### Advanced Features

- ๐ŸชŸ **Compact Preview Mode**: A dedicated mini-window (300ร—700) designed for tiling window managers (Niri, Hyprland, Sway) with circular thumbnail navigation and keyboard shortcuts


Compact Preview Mode


- ๐Ÿ“Š **Performance Monitor**: Real-time CPU/memory tracking with 60-second sparkline charts, per-process breakdown (Frontend, Backend, Tray), and detailed thread lists


Click to view performance monitoring screenshots




Performance Monitor

Real-time CPU/memory tracing and process details



- ๐Ÿ“ธ **Smart Screenshot**: Silent 4K capture via Xvfb virtual framebuffer, intelligent delay per wallpaper type, resource usage stats, and screenshot history (last 10 captures)
- ๐Ÿ”„ **Timed Rotation**: Auto-switch wallpapers at configurable intervals; supports random mode and ordered cycling by title, size, type, or folder ID
- โ˜ฐ **Hamburger Menu**: Global application menu with Playback History, Check for Updates, Welcome Guide, Restart, and Quit
- ๐ŸŽ›๏ธ **Wayland Advanced Tweaks**: Fine-grained control โ€” pause only when active window is fullscreen, ignore specific app IDs (e.g., docks, bars)
- ๐Ÿ“‹ **Log Management**: Filter logs by module (Controller/Engine/GUI), copy filtered output for bug reports
- ๐Ÿ–ผ๏ธ **GIF Smart Thumbnails**: Intelligent frame extraction (15th frame) to avoid blank/black preview images; supports transparent GIF rendering
- ๐Ÿ”” **Update Checker**: Automatic GitHub release checking with smart rate-limit handling and semantic version comparison

## ๐Ÿš€ Installation

### 1. Install the Backend (Required)
This GUI acts as a controller and requires the core rendering engine to be installed on your system.
Follow the build instructions for [Almamu/linux-wallpaperengine](https://github.com/Almamu/linux-wallpaperengine) and ensure the executable is in your system's PATH:

```bash
which linux-wallpaperengine # Verify installation
```
(Arch Linux users can simply install it from the AUR: yay -S linux-wallpaperengine)

### 2. Install the GUI
Head over to the [Releases page](https://github.com/Suhoiyis/gui-for-linux-wallpaperengine/releases) to download the latest version, then choose your preferred method:

#### Method A: Arch Linux Package (Recommended for Arch/Manjaro)

We have not yet published the application to the AUR (it is currently planned), but we now provide a pre-built .pkg.tar.zst package. Installing it with pacman will automatically handle all GUI dependencies.

```Bash
# Replace with the actual downloaded filename
sudo pacman -U linux-wallpaperengine-gui-*-x86_64.pkg.tar.zst
```

Once installed, you can launch it from your application menu.

#### Method B: AppImage (Universal Linux)
A portable, zero-config executable. It integrates directly with your desktop environment and system tray.

```Bash
# Make it executable
chmod +x linux-wallpaperengine-gui-*-x86_64.AppImage

# Run it
./linux-wallpaperengine-gui-*-x86_64.AppImage
```

#### Method C: Run from Source
If you prefer running the Python script directly, please ensure you have the required dependencies:

```Bash
# Arch Linux
sudo pacman -S python-gobject gtk4 libadwaita libayatana-appindicator
# Ubuntu / Debian
sudo apt install python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 libayatana-appindicator3-1
```

Then clone the repository and run:

```Bash
python3 run_gui.py
```

## ๐Ÿ“– Basic Usage

### Browse & Apply Wallpapers

1. **Browse**: The app automatically scans your Steam Workshop wallpaper library on first launch
2. **Apply**: Double-click a wallpaper card or click the **Apply** button in the sidebar
3. **Random**: Click the ๐ŸŽฒ button in the toolbar or use the tray menu
4. **Stop**: Click the โน button in the toolbar
5. **Multi-Monitor**: Select the target display from the top bar dropdown, then apply

### Playback History

Access your recent wallpaper history via the **Hamburger Menu (โ˜ฐ) โ†’ Playback History**:

- View the last 30 wallpapers with thumbnails, nicknames (italic), original IDs, and timestamps (MM-DD HH:MM)
- One-click replay any previous wallpaper โ€” the main window syncs automatically
- Clear history or check capacity (current / 30)

### Nickname Management

Give your wallpapers meaningful names:

- **Set a nickname**: Right-click a wallpaper โ†’ "Set Nickname", or click the โœ๏ธ button in the sidebar
- **Batch manage**: Settings โ†’ "Manage Nicknames" to view, edit, or delete all nicknames in a dialog
- **Search integration**: The search box matches both nicknames and original titles
- **Visual distinction**: Nicknames appear in *italic bold* in the grid view; the sidebar shows "Nickname + Original Name (small gray text)"

### Compact Preview Mode

A lightweight preview window designed for tiling WMs:

- **Toggle**: Click the compact mode icon in the toolbar
- **Navigate**: Use `โ†` `โ†’` keys or the on-screen buttons to cycle through 5 circular thumbnails
- **Quick actions**: Apply, Stop, Lucky (random), and Jump to current wallpaper
- **Window rules**: You may need to configure your WM to float this window โ€” see [Advanced Guide](docs/ADVANCED.md#compact-preview-mode)

### Performance Monitoring

Click the monitor icon in the top bar to open the Performance page:

- **Overview cards**: Total CPU, Total Memory, Active Threads
- **Sparkline charts**: 60-second history for CPU (color-coded: green < 20%, orange < 40%, red โ‰ฅ 40%) and Memory (blue)
- **Process details**: Expand Frontend/Backend/Tray for individual metrics, thread names, and currently playing wallpapers


Click to expand the settings page screenshot



Settings page1
settings page2
settings page3

General Settings / Audio / Advanced Tweaks



## โŒจ๏ธ Command-Line Control

All commands are sent to the same running instance (single-instance architecture):

| Command | Action |
|---------|--------|
| `--show` | Show the window |
| `--hide` | Hide the window (process keeps running) |
| `--toggle` | Toggle show/hide |
| `--random` | Random wallpaper switch |
| `--stop` | Stop current wallpaper |
| `--apply-last` | Apply the last used wallpaper |
| `--refresh` | Rescan wallpaper library |
| `--quit` | Fully exit (GUI + all wallpaper processes) |

**Example:** Autostart with Niri
```bash
# In your niri config.kdl
spawn-at-startup "python3" "/path/to/run_gui.py" "--hidden"

binds {
Mod+W { spawn "python3" "/path/to/run_gui.py" "--toggle"; }
Mod+Shift+W { spawn "python3" "/path/to/run_gui.py" "--random"; }
}
```

## โš™๏ธ Configuration

**Location:** `~/.config/linux-wallpaperengine-gui/config.json`

Key settings (all configurable via the GUI's Settings page):

| Setting | Default | Description |
|---------|---------|-------------|
| `fps` | 30 | Frame rate limit (1โ€“144) |
| `volume` | 50 | Audio volume (0โ€“100) |
| `scaling` | `"default"` | Scaling mode: default / stretch / fit / fill |
| `silence` | `true` | Mute audio |
| `autoRotateEnabled` | `false` | Enable timed wallpaper rotation |
| `rotateInterval` | 30 | Rotation interval in minutes |
| `cycleOrder` | `"random"` | Cycle order: random / title / size / type / id |
| `useXvfb` | `true` | Use Xvfb for silent screenshots |
| `screenshotRes` | `"3840x2160"` | Screenshot resolution |

For the complete configuration reference, see [docs/ADVANCED.md](docs/ADVANCED.md#configuration-reference).

## โš ๏ธ Known Limitations

### Wallpaper Type Compatibility

| Type | Status | Notes |
|------|--------|-------|
| **Video** | โœ… Fully supported | MP4/WebM recommended |
| **Web** | โš ๏ธ Partial | Renders correctly, but **property adjustments are non-functional** (backend limitation) |
| **Scene** | โš ๏ธ Limited | Complex particle systems / custom shaders may glitch or fail |

### Wayland Limitations

- โŒ **Mouse interaction disabled**: Cannot obtain global cursor position; click interactions and mouse trails do not work
- โŒ **Web property injection limited**: CEF communication is restricted under Wayland's security model

For detailed compatibility information, see [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md).

### Other Notes

- **Memory growth**: Long-running Web wallpapers may slowly increase memory usage (upstream engine issue). Enable timed rotation to mitigate.
- **Test environment**: Primarily tested on Arch Linux + Niri. Other environments may require adjustments.

## โ“ FAQ

### Why do Web wallpaper property adjustments not work?

The C++ backend uses CEF (Chromium Embedded Framework) for Web wallpapers. On Linux/Wayland, CEF's inter-process communication has compatibility issues that prevent JavaScript property injection from working reliably. Wallpapers will run with their default settings. As a workaround, you can manually edit the wallpaper's `project.json` or HTML source files.

### How can I reduce memory usage?

1. Avoid Web wallpapers (they use CEF/Chromium internally)
2. Enable timed rotation (Settings โ†’ Automation) to periodically restart the backend
3. Lower FPS (Settings โ†’ General)
4. Disable audio processing (Settings โ†’ Advanced)

### The compact preview window doesn't float in my tiling WM

You need to add a window rule in your WM configuration. See [docs/ADVANCED.md](docs/ADVANCED.md#compact-preview-mode) for Niri and Hyprland examples.

### Why are screenshots slow (5โ€“10 seconds)?

If Xvfb is installed, the app uses CPU software rendering to produce 4K screenshots silently (no popup window). This is slower but guarantees consistent quality regardless of your physical screen resolution or tiling WM layout. You can disable Xvfb mode in Settings โ†’ Advanced for faster (but windowed) screenshots.

### System tray icon is not showing

1. Verify `libayatana-appindicator` is installed
2. GNOME users: Install the "AppIndicator Support" extension
3. Waybar users: Ensure the `tray` module is configured
4. i3/Sway users: You may need `waybar` or another status bar with tray support

### How do I set different wallpapers for each monitor?

Select the target display from the top bar dropdown, then browse and apply a wallpaper. Repeat for each monitor. Use the ๐Ÿ”— Link/Unlink button to toggle between applying to all screens (Same mode) or just the selected screen (Diff mode).

### Can I use this with Flatpak or AppImage?

**AppImage**: Fully supported since v0.10.4 with zero-config desktop integration. The app auto-creates `.desktop` shortcuts and self-heals if the file is moved.

**Flatpak**: Not officially supported yet. File access and sandbox restrictions may affect functionality.

### How do I report a bug?

1. Go to Settings โ†’ Logs and click **Copy Logs**
2. Open a [GitHub Issue](https://github.com/Suhoiyis/gui-for-linux-wallpaperengine/issues)
3. Include: system info (`uname -a`), desktop environment, wallpaper ID/type, and the copied logs

## ๐Ÿ›๏ธ Technical Architecture

### Project Structure

```
suw/
โ”œโ”€โ”€ py_GUI/ # Main application package
โ”‚ โ”œโ”€โ”€ core/ # Core logic
โ”‚ โ”‚ โ”œโ”€โ”€ controller.py # WallpaperController โ€” process management
โ”‚ โ”‚ โ”œโ”€โ”€ config_manager.py # ConfigManager โ€” settings I/O with robust fallback
โ”‚ โ”‚ โ”œโ”€โ”€ history.py # HistoryManager โ€” playback history (30 entries)
โ”‚ โ”‚ โ””โ”€โ”€ nickname.py # NicknameManager โ€” alias persistence
โ”‚ โ”œโ”€โ”€ ui/ # User interface
โ”‚ โ”‚ โ”œโ”€โ”€ app.py # Main application window
โ”‚ โ”‚ โ”œโ”€โ”€ components/ # Reusable components (navbar, sidebar, preview)
โ”‚ โ”‚ โ””โ”€โ”€ pages/ # Page views (wallpapers, settings, performance)
โ”‚ โ”œโ”€โ”€ utils/ # Utilities
โ”‚ โ”‚ โ”œโ”€โ”€ performance.py # PerformanceMonitor โ€” CPU/memory tracking
โ”‚ โ”‚ โ””โ”€โ”€ logger.py # Logging configuration
โ”‚ โ””โ”€โ”€ const.py # Constants, version, CSS styles
โ”œโ”€โ”€ run_gui.py # Entry point
โ”œโ”€โ”€ docs/ # Documentation
โ”‚ โ””โ”€โ”€ assets/ # Screenshots and images
โ””โ”€โ”€ pic/icons/ # Application icons
```

### Architecture Overview

```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ GTK4 + Libadwaita โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Wallpaperโ”‚ โ”‚ Settings โ”‚ โ”‚ Performance โ”‚ โ”‚
โ”‚ โ”‚ Page โ”‚ โ”‚ Page โ”‚ โ”‚ Monitor โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ WallpaperController โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ Config โ”‚ โ”‚ History โ”‚ โ”‚ Nickname โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ Manager โ”‚ โ”‚ Manager โ”‚ โ”‚ Manager โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ subprocess โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚
โ”‚ โ”‚ linux-wallpaperengine (C++) โ”‚โ”‚
โ”‚ โ”‚ Rendering ยท Audio ยท Screenshot โ”‚โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ System Tray (libayatana) โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

### Key Design Decisions

- **Single-instance architecture**: All CLI commands route to the running GTK application via `Gio.Application`, avoiding process duplication
- **Defensive configuration**: `ConfigManager.get()` handles `None` values and falsy-but-valid values (e.g., `volume=0`) correctly
- **Theme variables**: All UI colors use GTK/Libadwaita named colors (`@window_bg_color`, `@theme_fg_color`, `@accent_bg_color`) for seamless theme adaptation
- **Object pooling**: Compact mode thumbnails use object pooling to eliminate scroll jank

## ๐Ÿ“š Documentation

| Document | Description |
|----------|-------------|
| [CHANGELOG.md](CHANGELOG.md) | Version history and release notes |
| [docs/ADVANCED.md](docs/ADVANCED.md) | Advanced features, configuration reference, and WM integration |
| [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md) | Wallpaper type compatibility, Wayland limitations, hardware requirements |
| [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | Common errors, backend log analysis, and fixes |

## ๐Ÿ”ง Tech Stack

- **Language**: Python 3.10+
- **UI Framework**: PyGObject (GTK4 + Libadwaita)
- **System Tray**: libayatana-appindicator
- **Backend**: Almamu/linux-wallpaperengine (C++)
- **Charts**: Cairo-based sparkline components

## ๐Ÿค Contributing

Contributions are welcome!

- Feature requests and bug reports โ†’ [Open an Issue](https://github.com/Suhoiyis/gui-for-linux-wallpaperengine/issues)
- Code contributions โ†’ Follow existing code style and submit a Pull Request
- Documentation improvements are equally appreciated

## ๐Ÿ™ Acknowledgements

> Some UI design inspiration was drawn from [AzPepoze/linux-wallpaperengine-gui](https://github.com/AzPepoze/linux-wallpaperengine-gui).
>
> It is an excellent GUI project โ€” we recommend checking it out.

## ๐Ÿ“„ License

GPL-3.0 license

---

**Current Version**: v0.11.2

**Last Updated**: 2026-02-22

*A Vibe Coding experiment project*