A short follow-up to the Fibocom L850 story. The GNOME extension that adds a Mobile Data switch to Quick Settings is now published on extensions.gnome.org. You can install the GNOME part with one click:
Getting there took a detour. The first submission was rejected for two reasons. A GNOME extension must never call sudo or pkexec. Extension code runs inside the gnome-shell process. The reviewer also asked whether the code was AI-generated. GNOME does not accept that as-is.
Both points were fair. So I fixed them.
No more privilege escalation from the extension. All privileged work now lives in a small system D-Bus service (org.fibocom.l850). The extension is a pure client. It talks to the service over Gio.DBus.system. There is no Gio.Subprocess, no sudo, no pkexec anywhere. Changing the APN goes through a normal polkit password prompt. This is the architecture it should have had from the start.
On the AI question. Yes, I built this with AI assistance. But it is my own hardware. I use it every day. I tested every path on the real device. I found and fixed several real bugs along the way. The D-Bus rewrite was one of them. I understand the code and I maintain it.
The reworked Version 2 passed review today.
How to install it
The one-click button installs the desktop front-end only. The toggle needs two more things behind it. It needs the system D-Bus service. It needs the out-of-tree xmm7360-pci driver. Only the project repo sets those up. So install.sh from the repo is the real entry point. Run it first. Use the extensions.gnome.org button for the GNOME part after that, or let the installer handle the whole thing.
The --build flag compiles the kernel module and registers it with DKMS. It then rebuilds itself after every kernel update. Full instructions and options are in the repo:
If you have one of these modems, you now get the GNOME part with a single click. The modem is a Fibocom L850-GL. It is really an Intel XMM7360. You find it in the Lenovo IdeaPad Duet 3 and many other LTE laptops.
Version 1.5.1 of the YouTube Transcript Distiller is live on addons.mozilla.org. It bundles two releases from July 10: a new transcript engine, first support for Firefox on Android, and a selectable Gemini model. What the add-on does is covered in the introduction post.
What’s new
The Distiller button now shows up in Firefox on Android. About two thirds of daily users are on Android and never saw the button before. Update, July 11: the device test found the path from button to posted comment broken in two places; versions 1.5.3 and 1.5.4 fixed transcript fetching and comment posting on Android, verified end to end on a physical device.
Distilling no longer opens the transcript panel or the video description. The add-on reads the transcript in the background; the page stays as it is.
The Gemini model is selectable in the settings: Flash-Lite (the new default), Flash, Pro, or any model ID typed in by hand – for experiments, or for anyone bringing a paid account.
When Google’s servers are overloaded or the daily free quota is used up, the error message now says what to do: pick a different model in the settings. In all eleven languages.
How it’s done
Transcript: the content script asks the player object for the caption track URL, waits up to eight seconds until the player has attached the proof-of-origin token (without it, the caption endpoint answers HTTP 200 with an empty body), then fetches the track as JSON. The old panel scraper stays in as a fallback. I found the technique while reading the source of the Dualsub add-on.
Title, channel name and description come from the player data as well (getPlayerResponse().videoDetails, getVideoData()) instead of DOM selectors.
Android: m.youtube.com added to manifest and content script, injection targets for the ytm-* DOM, a separate mobile comment flow.
The default model is now the alias ID gemini-flash-lite-latest. Alias IDs follow the newest version of a model line. The previous pinned default answered 404, “no longer available”, in early July and reappeared days later – a pinned model version is a liability either way.
There is no automatic fallback, on purpose: from the Lite model, a fallback could only escalate to the busier, tighter-limited models (free tier on the flash model: 20 requests per day). Instead, a 404, 429 or 503 from the API appends one line to the error message: switch the model in the settings.
What’s next
Most of this list shipped later the same day, in versions 1.5.2 to 1.5.4: a fix for a quiet bug where saving the settings froze the then-current default prompt forever (unchanged old defaults are migrated silently, customized prompts get a dismissible notice), a prompt section that carries numbers, data and study references from the video into the summary and makes the summary say so when a claim comes without them, and the Android repairs above. The comment box on Android also grows to a reviewable size after insertion, and if insertion ever fails, the finished summary lands in the clipboard instead of being lost.
Further out: prompt profiles, a preview before the comment is posted, and a length check against YouTube’s 10,000-character comment limit.
My little Lenovo IdeaPad Duet 3 came with a built-in LTE modem. On Windows it “just worked.” On Linux it showed no signal and wouldn’t register. Getting it working turned out to be a two-part story: a quick (slightly embarrassing) SIM check, and then the real work of making Linux talk to this modem — which ModemManager flatly can’t. By the end the thing has a proper mobile-data switch in the GNOME Quick Settings panel, just like Wi-Fi.
The hardware is a Fibocom L850-GL, which is really an Intel XMM7360 (lspci shows Intel Corporation XMM7360 LTE Advanced Modem [8086:7360]). You find it in a bunch of “LTE” laptop variants.
On Linux the picture was bleak:
mmcli -L → no modem, or a modem that would never connect.
GNOME’s Mobile Network panel: empty.
Every signal indicator I could coax out of it said 0 / not registered.
First, the boring check: the SIM
Before blaming the driver, I checked the obvious thing — the SIM — and spotted it quickly: the old prepaid SIM had no credit left, so the network simply refused to register it. An empty SIM produces the exact “no signal, not registered” symptom that looks like a driver bug.
Topped it up, popped it back in, and the modem registered on the first try.
Lesson: check the SIM before you debug anything else. It costs two minutes and saves you from chasing a problem that isn’t there.
Why ModemManager doesn’t drive this modem
With a working SIM, the obvious path is ModemManager + NetworkManager, the way every other modem works. It doesn’t work here, and it’s worth knowing why so you don’t waste a weekend like I almost did again.
The in-kernel driver for the XMM7360 is iosm. It brings up only:
AT command ports (/dev/wwan0at0), and
a proprietary xmmrpc port.
There’s no MBIM/QMI control port. Worse, those AT ports are silent — the L850 won’t answer AT until it’s been initialised and FCC-unlocked over the proprietary RPC channel first. ModemManager (I tested 1.23.4 with the Intel plugin) can’t claim the xmmrpc port either — it just logs “unhandled port type.” So MM has nothing it can actually talk to.
Conclusion: on this modem there is no native ModemManager path, and therefore no native GNOME mobile-data toggle. You need a userspace driver that speaks the proprietary RPC itself.
The working stack: xmm7360-pci
That driver exists: xmm7360-pci. It’s an out-of-tree kernel module plus a Python bring-up script that performs the RPC dance and gives you a plain wwan0 network interface.
sudo apt install build-essential "linux-headers-$(uname -r)"
sudo git clone https://github.com/xmm7360/xmm7360-pci /opt/xmm7360-pci
cd /opt/xmm7360-pci && make
One thing to internalise: this module is out-of-tree and not DKMS-packaged, so every kernel update breaks LTE until you rebuild it:
cd /opt/xmm7360-pci && make clean && make
sudo install -D xmm7360.ko "/lib/modules/$(uname -r)/extra/xmm7360.ko"
sudo depmod -a && sudo modprobe xmm7360
The missing piece: desktop integration
xmm7360-pci gets you online, but it’s a script you run by hand. There’s no boot service, no toggle, no signal readout. I wanted the laptop to behave like a laptop: connect on boot, fail over to Wi-Fi when it’s around, and give me a switch in the top-right with bars and the operator name.
a systemd service that brings the modem up on boot;
tiny helper scripts to toggle the wwan0 link and report status as JSON;
a GNOME Shell extension that adds a Mobile Data Quick Settings toggle showing operator, RAT and signal in dBm;
an APN field in the extension preferences, applied through a polkit-guarded helper (no editing config files by hand).
Routing is Wi-Fi-first: the LTE default route gets a higher metric than Wi-Fi, so it only carries traffic when Wi-Fi is gone.
Install is one script:
git clone https://github.com/michaelruck/fibocom-l850-gnome-lte
cd fibocom-l850-gnome-lte
sudo ./install.sh --xmm7360-dir /opt/xmm7360-pci --build
Three gotchas worth knowing
Building this on real hardware turned up a few things the README now warns about:
1. The systemd unit must tolerate exit 1. The bring-up script deliberately exits with code 1 once wwan0 is up (it only stays resident with --dbus). A naive Restart=on-failure turns that into an infinite re-attach loop. The unit uses Type=oneshot + RemainAfterExit=yes + SuccessExitStatus=1 and noRestart=.
2. ModemManager will grab the modem behind your back. Once xmm7360 brings the modem up, those ttyXMM* AT ports do start answering, ModemManager happily adopts the modem, and NetworkManager pops up a second, non-functional mobile toggle — in my case helpfully named after the SIM (“Lidl”). The fix is a udev rule that tells MM to ignore the device:
After that, mmcli -L reports “No modems were found” and only my toggle remains.
3. Changing the APN needs a module reload. The XMM7360 only accepts its RPC init once per module load. Re-running bring-up while it’s attached fails with ENODEV. So the “set APN” helper reloads xmm7360 before reconnecting.
Try it
The code is on GitHub: https://github.com/michaelruck/fibocom-l850-gnome-lte. It targets GNOME 45–48 and was tested on a Lenovo IdeaPad Duet 3 10IGL5 LTE, but it should help anyone stuck with a Fibocom L850-GL / XMM7360. You install it from the repo, not from extensions.gnome.org: EGO doesn’t allow extensions that call sudo/pkexec (which this one needs, since the modem has no ModemManager service to talk to), and it has a no-AI-generated-code rule that this project — honestly — falls under. So it’s manual install from GitHub.
If you found this because your “LTE laptop” shows no signal on Linux: check the SIM first, then come back and grab the driver.
You open a video. Twelve minutes. You watch. You wait. The one insight you came for arrives at minute nine — buried under filler, recaps, and sponsor breaks.
I built this add-on because I got tired of it.
What it does
YouTube Transcript Distiller fetches the full transcript of any YouTube video, sends it to Google Gemini AI with a customizable prompt, and posts the result directly into the YouTube comment field — formatted and ready to publish.
One click. The important points, right where other viewers can see them.
Why post it as a comment?
A good summary helps everyone. The more users share what a video is actually about, the less time we all waste on clickbait and padded content. YouTube’s own algorithm rewards watch time — this add-on rewards substance.
Why the parenthesis around wireless? Because there is an issue with the cloudinit/netplan, I can’t figure out yet. The setup for wifi only works when an ethernet-cable is connected to the Raspi on first boot. After the initial first boot it works without ethernet. Strange!
The procedure is tested with Raspberry Pi 4 B.
Start the Raspberry Pi Imager.
Make a SD-Card with Ubuntu Server 20.04.2 LTS (RPI 3/4/400).
Open the file “network-config” on the SD-Card with notepad++.
This is a yaml configuration file. Yaml is a picky diva. There MUST be no tab-stop in the file. The indentations must all be spaces. Therefore you better switch on the visibility of the non printable characters.
Make your changes. An example is below.
Insert SD-Card in your Raspi.
Connect the ethernet cable.
Boot your Raspi.
After a couple of minutes you will see your Raspi on your wired network. The wifi is not working yet.
Rebooting the Raspi is activating the wifi connection. You can get rid of the ethernet cable now.
Ssh is running. You can login over Wifi with PuTTY . The default login for Ubuntu server is User: ubuntu PW: ubuntu
Example network-config file
# This file contains a netplan-compatible configuration which cloud-init
# will apply on first-boot. Please refer to the cloud-init documentation and
# the netplan reference for full details:
#
# https://cloudinit.readthedocs.io/
# https://netplan.io/reference
#
# Some additional examples are commented out below
version: 2
ethernets:
eth0:
dhcp4: true
optional: true
wifis:
wlan0:
# dhcp4: true
addresses:
- 192.168.0.66/24
gateway4: 192.168.0.1
nameservers:
addresses: [192.168.0.1]
optional: false
access-points:
"mywifi_net1":
password: "mysecretpassword"
# myworkwifi:
# password: "correct battery horse staple"
# workssid:
# auth:
# key-management: eap
# method: peap
# identity: "me@example.com"
# password: "passw0rd"
# ca-certificate: /etc/my_ca.pem
##Reboot after cloud-init completes
#power_state:
# mode: reboot