Hey folks, for about 10 months or so been working on a hobby project just to get more practice in Linux application packaging, the Rust ecosystem/utilities, and software development on Nix and NixOS (as well as solve some personal pain points in using a HDMI TVs and projectors with PCs). Disclosure: this project includes AI assisted development, documentation and research, and has been a great help given my physical disabilities in typing.

While I enjoy using large, affordable OLED TVs as a PC display, they do lack in ways compared to regular desktop monitors, such as native power synchronization, programmatic volume and backlight control, etc. Thankfully there are a plethora of PC software projects to replicate these features, with LGTVCompanion for Windows and WebOS hardware being a prominent example. However, having migrated to Linux, and wanting something that would work just as well with projectors as with TVs, I began work on a display vendor/interface agnostic project, named TisVlay.

Over the past year it has grown from a simple CLI into a full system daemon with a GUI, a system tray, and webOS and HDMI-CEC support, plus the desktop integration and profile automation you’d expect from such a tool, like login and idle detection and remote-streaming awareness. That last one matters to me: my desktop pulls triple duty as a workstation, a media PC, and a game-streaming host for my office, living room, and tablet via Sunshine/Moonlight.

The app itself follows more of a distributed pub/sub architecture (my background is in robotics and cyber-physical system design, not desktop software), so converging on IPC and middle-ware libraries I’ve been meaning to experiment while keeping the installable setup self contained was a balance.

While still beta (pre v1.0), it’s already daily drivable and fully documented. Being largely feature-complete, my current focus has shifted towards distro packaging. If you’d like to give it a try, the installation guide and docs are linked below. Or if not and you’re already use something else, I’d like to give a shout-out to netflector, especially for privacy-conscious home-automation users, given how common spyware is in smart TVs and projectors these days. The docs cover using it to keep displays on an isolated network.

  • tatterdemalion@programming.dev
    link
    fedilink
    arrow-up
    0
    ·
    6 days ago

    Nice! Thanks for sharing!

    I’m curious if you’ve used Plasma Bigscreen, what you think of it, and how TisVlay would integrate with it.

    • ruffsl@programming.devOP
      link
      fedilink
      English
      arrow-up
      2
      ·
      6 days ago

      Thanks! I’ve not used Plasma Bigscreen yet, but as long as it make use of the same wayland interfaces that normal KDE Plasma does, I’d imagine that session and greeter event watchers (tisvlay-session, tisvlay-greeter) implemented for idle and resume detection would work the same. Another way Plasma Bigscreen could differ is how they use screensavers or DPMS control, given the developers behind Bigscreen would be aware that OLED panel burn-in or projector bulb burn-out would bigger concern for target users, and DPMS would be moot for HDMI hardware.

      A separate question I may have would be how Plasma Bigscreen handles session login (or auto-login). TisVlay’s greeter integration monitor the host while no user is logged in runs as the same user as the DE’s own login manager. KDE recently forked SDDM for Plasma Login Manager, and that’s what I’ve been daily driving, and suspect Plasma Bigscreen uses for same HDR support.

      One thing I think would be cool to collaborate on with the Plasma team, or other distro developers such as Cachy or SteamOS is better user-land HDMI CEC integration in Linux. TisVlay already makes use of Valve’s linux-cec rust crate, and many gaming distros already ship kernels with CONFIG_CEC_CORE enabled. Rather than working on orthogonal control planes for driving CEC based peripherals, it could be wise to split that out into a shared abstraction. TisVlay does publish a public SDK, but that is more so for programmatically interfacing with TisVlay’s daemon at runtime, rather than say hardware abstraction library.

      That all aside, I’ll add Plasma Bigscreen in my que for QA, and check if nixpkgs has merged any changes for it that I could quickly test from.

      Have you used Plasma Bigscreen yet or know what the development status is nowadays?

      • tatterdemalion@programming.dev
        link
        fedilink
        arrow-up
        0
        ·
        6 days ago

        I use Plasma Bigscreen for my HTPC. I can’t speak to development status, but I know that it is functional for me as I use it daily. I use it for two things: moonlight game streaming client and jellyfin client. I can use the KDE Connect android app as a remote, but more often I use a bluetooth game controller or the Jellyfin android app to cast stuff.

        It’s basically never locked because I don’t need it to be.

        I don’t have an OLED TV yet, so the burn in prevention stuff isn’t useful to me yet. But having things like power and volume control on my phone would be really nice QoL improvements. I currently need to use my TV remote for power and input selection and my speaker remote for volume (though at least Jellyfin has its own volume control too).

        • ruffsl@programming.devOP
          link
          fedilink
          English
          arrow-up
          2
          ·
          6 days ago

          I just tried Plasma Bigscreen via KDE Neon in a VM. Everything related to PC->TV automation worked as expected, aside from two fixed bugs related to missing greeter service setup and an old systemd bug still biting folks from ubuntu 24.04 based distros.

          I’ll note that the TisVlay UI isn’t yet friendly for gamepad input navigation that Plasma Bigscreen encourages, so that’s room for improvement in the Slint interface. Thanks for the leads.

          But having things like power and volume control on my phone would be really nice QoL improvements.

          I know on KDE Connect, there is a “Run Command” button in the android app UI. You could use that to run the TisVlay CLI to automate TV related macros (chaining power/input/volume commands), or just use the system/user profiles to drive the TV based on standard events like moving mouse/keyboard or other HID that would wake wayland’s idle timeout.

          I currently need to use my TV remote for power and input selection and my speaker remote for volume (though at least Jellyfin has its own volume control too).

          TisVlay can switch inputs on power for backends with input capability bits (like LG WebOS), and for as for HDMI-CEC backend - the TV firmware normally switch to the port that sent the CEC power to the TV already. But for speaker bars/stereos, that’s another idea to add to the HDMI-CEC backend. Perhaps I should extend TisVlay to control/monitor other device classes on the TV’s same CEC bus… That’d be cool for a next release.

          • tatterdemalion@programming.dev
            link
            fedilink
            arrow-up
            1
            ·
            6 days ago

            You could use that to run the TisVlay CLI to automate TV related macros

            Nice idea. I may try this out next time I’m tweaking my NixOS configs.

            But for speaker bars/stereos, that’s another idea to add to the HDMI-CEC backend.

            Yea that definitely sounds interesting. My speakers are connected over optical digital audio cables. I can’t even control them with my TV remote. I’m not sure I will be able to make this work. But I am planning on getting a new TV soon so 🤞