DesktopModules is an application that allows you to create overlays for your operating system.
The modules are displayed over all your programs and games and are freely movable.
- Spotify (Current playing song, cover and lyrics)
 - SmartHome (FritzBox client list and IP-Camera feed)
 - Phasmophobia (Evidence selector)
 - Crypto (Bitcoin live ticker)
 - Piano (MIDI device display)
 
Feel free to add your addons!
- Make sure you have Java 16 installed.
 - Download the latest executable file here.
 - Execute the 
DesktopModules.exe - Right-click the DesktopModules tray icon in your task bar and click on 
Open addons directory - Place your addon jars in the opened directory (
C:/Users/<name>/AppData/Roaming/DesktopModules/addons/) - Close the DesktopModules application. (Right-click the tray icon -> 
Exit) - Execute the 
DesktopModules.exeagain to load all addons 
You can left-click on the tray icon to manage your installed addons.
You can exit the application by right-clicking the tray icon and selecting "Exit"
repositories {
    maven { url 'https://jitpack.io' }
}
dependencies {
    implementation 'com.github.LabyStudio:desktopmodules:2.5.5:all'
}The main class of your addon. You have to register your modules in the onEnable method.
import de.labystudio.desktopmodules.core.addon.Addon;
public class TestAddon extends Addon {
    @Override
    public void onInitialize() throws Exception {
        // Config example
        if (!this.config.has("flag")) {
            this.config.addProperty("flag", true);
            System.out.println("This addon started for the first time. My config can remember that!");
        }
        // Another config example with default values
        String startupMessage = getConfigValue(this.config, "startup_message", "Hello World!");
        System.out.println(startupMessage);
        
        // Register your modules
        registerModule(TestModule.class);
    }
    @Override
    public void onEnable() {
        // Called when at least one module of the addon activates
        System.out.println("Test addon enabled!");
    }
    @Override
    public void onDisable() {
        // Called when all modules of the addon are disabled
        System.out.println("Test addon disabled!");
    }
}You can create multiple modules for one addon
import de.labystudio.desktopmodules.core.addon.Addon;
import de.labystudio.desktopmodules.core.loader.TextureLoader;
import de.labystudio.desktopmodules.core.module.Module;
import de.labystudio.desktopmodules.core.module.render.IModuleRenderer;
import de.labystudio.desktopmodules.core.renderer.IRenderContext;
import java.awt.*;
import java.awt.image.BufferedImage;
public class TestModule extends Module<TestAddon> {
    private BufferedImage testTexture;
    public TestModule() {
        super(250, 60); // The fixed size of the module
    }
    @Override
    public void onTick() {
        // Do backend stuff..
    }
    @Override
    public void onRender(IRenderContext context, int width, int height) {
        context.drawRect(0, 0, width - 1, height - 1, new Color(50, 50, 50, 130));
        context.drawImage(this.testTexture, 0, 0, height, height);
        // Render your module...
    }
    
    @Override
    public void loadTextures(TextureLoader textureLoader) {
        this.testTexture = textureLoader.loadTexture("textures/test/test.png"); // Load a texture
    }
    
    @Override
    protected String getIconPath() {
        return "textures/test/test.png"; // The settings icon of the module
    }
    @Override
    public String getDisplayName() {
        return "Test Module"; // The setting name of the module
    }
}Launch the main class Start with the program parameter your.package.name.TestAddon
To make it available as a jar file, you have to define the addon class name in the /addon.json
{
  "main": "your.package.name.TestAddon"
}To use your addon, put the jar file into the following directory: C:/Users/<name>/AppData/Roaming/DesktopModules/addons/

