AndroidConnect is a Noctalia plugin for Android device status, quick actions, file transfer, and embedded scrcpy control directly inside the panel.
This project is built on top of the original Noctalia kde-connect plugin. Credit and thanks to the original Noctalia KDE Connect plugin developers for the base plugin and architecture this work extends.
Upstream base project:
Project repository:
Watch the AndroidConnect MP4 demo
Current plugin version: 1.6.1
See CHANGELOG.md for release notes.
The embedded mirror uses a single live feed path:
scrcpywrites intov4l2loopback- Qt Multimedia reads that loopback device inside the panel
- There is no second mirror backend in the normal path
Current behavior:
- Embedded mirror launches automatically when the panel is ready, typically within about one second of
scrcpystarting - The embedded mirror is tied to the selected KDE Connect device and will not reuse another phone's ADB session
- If KDE Connect is not paired yet, a single safe ADB target can still be mirrored and controlled
- Audio can be toggled from the panel header
- Android nav buttons stay visible below the phone preview
- The decorative phone home indicator is hidden while the live
scrcpyfeed is connected - Screenshot and screen recording actions are available from the right-side utility row
- Keep-screen-awake is available from the utility row while the panel is open
- Status and error messages stay hidden during the initial grace period, then appear only if the feed or input path is still not ready
- Opening the panel while
scrcpyis already connected sends unlock-only, not Home - Embedded mirror launch probes Android display geometry, chooses a full-frame size for the phone's aspect ratio, and avoids cropping unless a fallback path is needed
- The V4L2 loopback format is checked against the expected
scrcpyoutput before the feed is locked for Qt Multimedia - Switching between different phone aspect ratios rebuilds the live preview path only after the loopback feed reports the expected format
- Header brand badges use logo assets where available, including Google, Xiaomi-family, and Motorola-family names, and fall back to icons otherwise
- First-run cold-start reliability is fixed in
1.4.0: the root cause wasv4l2loopbackadvertising the scrcpy device asV4L2_CAP_VIDEO_OUTPUTat process start when created withexclusive_caps=1, which caused Qt Multimedia to filter it out and never re-enumerate. Usingexclusive_caps=0on the scrcpy loopback resolves it
- KDE Connect device list, state, battery, signal, and notification summary
- Wake device, browse files, send files, and ring phone from the panel
- Embedded in-panel Android mirror
- Live V4L2 feed for the embedded mirror
- Display-size probing for broader phone aspect-ratio compatibility
- ADB-only mirroring and input when a single safe ADB target can be selected
- Optional embedded audio toggle, off by default
- ADB tap, swipe, text, key, and Android navigation input
- In-panel utility actions for screenshot, screen recording, and keep-screen-awake
- Wireless ADB pairing and reconnect helpers
- Wireless ADB auto-detect for the selected phone's current random connect port when mDNS is available
- Existing plugin toasts are mirrored into notification history
- Screenshot and screen recording save notifications include a link to the output folder
Required for the base plugin:
- Noctalia
>= 4.4.0 - KDE Connect desktop app and a running
kdeconnectd busctlfromsystemd
Required for mirror and Android input features:
scrcpyadbfrom Android platform-tools- Qt Multimedia runtime for your distro, for example
qt6-multimedia
Required for the embedded live feed:
v4l2loopback- A loopback device such as
/dev/video10 - A loopback label visible to Qt Multimedia, for example
scrcpy-panel
Required for some optional features:
qrencodefor Wireless ADB QR pairingsshfsand FUSE support for the Browse Files action
Recommended:
avahi-browsefor more reliable Wireless ADB service discovery
Not versioned in this repository:
settings.jsonis local user state and should stay untracked
- Copy this plugin directory into your Noctalia plugins directory.
Example:
~/.config/noctalia/plugins/androidconnect - Reload Noctalia or restart the shell so it picks up the plugin.
- Enable the plugin in Noctalia.
- Make sure KDE Connect is installed on both the desktop and phone, then pair the phone normally.
If you want the default experience, which is embedded scrcpy inside the panel:
- Install
scrcpy,adb, Qt Multimedia, andv4l2loopback. - On the phone, enable Developer options and USB debugging.
- Connect the phone over USB once, unlock it, and accept the USB debugging prompt for this computer.
- Create the V4L2 loopback device used by the embedded feed.
- Open the panel.
If ADB or the loopback feed is not ready, the plugin stays in a setup or error state and tells you what is missing instead of launching a broken mirror session.
If you only want device status and KDE Connect actions:
- Confirm
kdeconnectdis running. - Enable the relevant KDE Connect phone-side plugins for battery, notifications, browse files, and remote actions.
If you want the phone rendered inside the panel:
- Create a V4L2 loopback device with
exclusive_caps=0. This is required — see the note below. Example for a one-shot modprobe:
sudo modprobe -r v4l2loopback 2>/dev/null || true
sudo modprobe v4l2loopback devices=1 video_nr=10 card_label=scrcpy-panel exclusive_caps=0 max_width=960 max_height=2160To make it persist across reboots, add a config under /etc/modprobe.d/, for example /etc/modprobe.d/v4l2loopback.conf:
options v4l2loopback video_nr=10 card_label="scrcpy-panel" exclusive_caps=0
If you already have other loopback devices (for example OBS's virtual camera), combine them into a single options line with comma-separated values per device, and make sure every entry in the exclusive_caps list is 0:
options v4l2loopback video_nr=0,10 card_label="OBS Virtual Camera,scrcpy-panel" exclusive_caps=0,0
After editing the config, reload the module:
sudo modprobe -r v4l2loopback && sudo modprobe v4l2loopback- Confirm
/dev/video10exists andscrcpy-panelis visible to Qt Multimedia. - Open the panel and wait for the embedded mirror to start. It should appear roughly one second after
scrcpylaunches. - Use the speaker button in the header if you want embedded audio.
With exclusive_caps=1, a v4l2loopback device advertises V4L2_CAP_VIDEO_OUTPUT when no consumer is attached and only flips to V4L2_CAP_VIDEO_CAPTURE once scrcpy starts writing. Qt Multimedia enumerates video-capture devices once at process startup and caches the result. If the panel opens before scrcpy writes, Qt sees the loopback as an output-only device, filters it out, and never re-enumerates it — the embedded mirror then stays black for the lifetime of the shell and no amount of panel reloading recovers it.
With exclusive_caps=0, the loopback advertises both CAPTURE and OUTPUT unconditionally, so Qt enumerates it correctly at startup regardless of whether scrcpy has started yet. This is the only supported configuration.
Notes:
- If the phone is already mirrored when you open the plugin, AndroidConnect sends unlock-only and does not send Home.
- Device switcher when more than one phone is available
- Phone size toggle, shown when hovering the brand badge
- Embedded audio toggle
- Wireless ADB tools
- Browse files
- Send file
- Find phone
BackHomeRecents
Mouse and keyboard shortcuts:
- Right click on the phone view sends
Back - Middle click on the phone view sends
Recents Homekey sendsHome- Arrow keys, Enter, Tab, Escape, Delete, and Backspace are forwarded to Android when the phone view is focused
- Text typed into the focused phone view is sent to Android input
These appear in the utility action row under battery, network, and signal:
Take ScreenshotStart / Stop RecordingKeep Screen Awake
Saved media locations:
- Screenshots:
~/Pictures/AndroidConnect - Screen recordings:
~/Videos/AndroidConnect
When a screenshot or recording finishes, AndroidConnect adds the same event to notification history and includes a link to open the output folder.
Wireless ADB is optional, but it improves embedded input when USB is not available.
- Open Android's
Wireless debuggingscreen. - Use either:
Pair with QR codePair with code
- Open the Wi-Fi button in the panel header.
- After pairing, either:
- click
Auto-detectto discover the selected phone's current Wireless ADB connect port over mDNS - manually enter the ADB port shown on the phone and click
Connect
- click
The plugin stores Wireless ADB state per KDE Connect device. Android may rotate the Wireless debugging connect port whenever Wireless debugging reconnects, so saved ports are treated as history only. A saved host:port is used for mirroring only after adb devices reports that exact serial as connected.
Notes:
- Wireless ADB is optional. USB ADB is still the simplest and most reliable first setup path.
avahi-browseis recommended for auto-detect. Someadb mdns servicesbuilds do not expose mDNS discovery reliably.
The Browse Files action depends on KDE Connect's SFTP support.
If it fails:
- Check that the KDE Connect SFTP feature is enabled on the phone.
- Make sure
sshfsand FUSE support are installed. - If your file manager is sandboxed, it may not be able to access the mounted path.
- No persistent embedded mirror corruption issue is currently tracked. If the mirror starts black, check the loopback setup below first.
Most black-screen reports trace back to a v4l2loopback configuration issue. Check the following first:
scrcpy,adb, and Qt Multimedia are installed/dev/video10exists- The loopback label is visible as
scrcpy-panel v4l2loopbackwas created withexclusive_caps=0— see the "Embedded Mirror Setup" section for why this matters and how to fix it
Quick diagnostic commands:
# Confirm the scrcpy-panel device is present and Qt-visible
v4l2-ctl --list-devices
cat /sys/module/v4l2loopback/parameters/exclusive_caps # every entry should be "N"
# Inspect the current format on the scrcpy loopback
v4l2-ctl --device=/dev/video10 --allIf any exclusive_caps entry is Y, follow the "Embedded Mirror Setup" steps to recreate the loopback devices with exclusive_caps=0.
AndroidConnect also writes mirror diagnostics to:
/tmp/androidconnect-preview-debug.log
The log starts with a banner showing the current v4l2-ctl --list-devices output and the module's exclusive_caps parameter, which is usually enough to diagnose loopback problems at a glance.
- This repository is intended to host the plugin in a downloadable state for other users.
- Local machine state should not be committed.
- The plugin still uses KDE Connect as its transport and device integration backend.
AndroidConnectis a renamed and extended plugin package built on top of that foundation.
