21 September 2026

Mounting Google Drive on Ubuntu 26.04 with rclone

(Notes captured from a Kagi Assistant thread...)

Ubuntu 26.04 LTS ships GNOME 50, which removed the built-in Google Drive mount — the old GVfs backend was dropped because it depended on unmaintained libgdata/libsoup2.4. The community replacement (fluhus's PPA backend) works, but the most robust distro-agnostic option is rclone mount.

Why not apt or snap?

  • Ubuntu's apt package is rclone 1.60.1 — from 2022. It's frozen for the entire LTS release.
  • The snap blocks rclone mount entirely ("Fatal error: mounting is not supported when running from snap") due to its FUSE sandbox.

Instead, install the current binary directly — rclone is a single static Go binary, and it updates itself via rclone selfupdate (manual command; wrap it in a systemd timer or cron if you want it scheduled):

cd /tmp
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
mkdir -p ~/bin
install rclone-*-linux-amd64/rclone ~/bin/rclone

Creating your own Google OAuth client ID

rclone ships with a shared client ID, but Google rate-limits it across all rclone users — so the official docs recommend creating your own. It takes about five minutes and only needs doing once. For more on Google's OAuth policies and how test-mode projects work, see my companion page on the subject.

Step 1: Create a new Google Cloud project

  1. Go to the Google Cloud Console at https://console.cloud.google.com/ and sign in with your Google account.
  2. Click the project picker at the top of the page (next to the "Google Cloud" logo) → New Project.
  3. Give it a name (e.g. rclone) — you can leave the auto-generated Project ID as-is — and click Create.
  4. Once created, make sure the new project is selected in the project picker; everything below happens inside it.

Keep this project dedicated to rclone — it makes the credentials easy to find later, and isolates anything you enable from other projects.

Step 2: Enable the Google Drive API

APIs & Services → Library → search for Google Drive APIEnable.

Step 3: Configure the OAuth consent screen

APIs & Services → OAuth consent screen:

  • Choose External (the only option for personal accounts) and continue.
  • Fill in an app name (e.g. rclone) and your email as the support/contact email.
  • Add your own Google account as a test user — required, since the project stays in test mode.

No Google verification needed — test mode is fine for personal use as long as your account is a test user.

Step 4: Create the OAuth client

APIs & Services → Credentials → Create Credentials → OAuth client ID:

  • Application type: Desktop app
  • Click Create, then copy the Client ID and Client Secret.

A note on the companion page

The OAuth policy notes referenced above live on a GitHub Pages site, and two things are worth knowing when publishing one:

  • Initial deployment takes a while. After pushing the site and enabling Pages, the build and propagation can take several minutes to a few hours before the URL resolves and serves content. Don't panic if it 404s at first.
  • Verify the site with Google Search Console. For Google to index and reference the page, verify ownership in Google Search Console. The easiest method for a GitHub Pages site is the HTML tag: Search Console gives you a <meta name="google-site-verification" content="..."> tag, which you add to the page's <head>, push, and click Verify. Since you control the source directly, this is more convenient than a DNS TXT record — and it survives Pages rebuilds as long as the tag stays in your template.

Configuring the remote

Run rclone config as your normal user (never sudo — the token belongs in your config, not root's):

n) new remote → name: GDrive → storage: drive
client_id:     <paste your Client ID>
client_secret: <paste your Client Secret>
scope:         1 (full access)
root_folder_id: leave blank

The OAuth verification dance

During setup you'll hit Google's security screening:

  1. rclone opens a browser to Google's consent page.
  2. Google warns "Google hasn't verified this app" — expected, because your project is in test mode rather than published/verified.
  3. Click Advanced → Go to rclone (unsafe) — it's safe; you're authorizing your own project to access your own Drive.
  4. Approve, and the token is saved to the config.

The config lives at ~/.config/rclone/rclone.conf (check with rclone config file) — a plain text file containing your OAuth tokens, created 0600. Back it up like a password file; copying it to another machine carries the tokens with it.

Test mount

mkdir -p ~/GDrive
rclone mount GDrive: ~/GDrive --vfs-cache-mode writes --daemon

--vfs-cache-mode writes is essential for Drive — many apps fail writing directly to the mount without it.

Running automatically at login: a systemd user unit

Drop --daemon (systemd backgrounds the process itself) and create ~/.config/systemd/user/rclone-gdrive.service:

[Unit]
Description=rclone mount of Google Drive
AssertPathIsDirectory=%h/GDrive
After=network-online.target

[Service]
Type=notify
ExecStart=%h/bin/rclone mount GDrive: %h/GDrive \
    --vfs-cache-mode writes \
    --dir-cache-time 12h \
    --cache-dir %h/.cache/rclone
ExecStop=/bin/fusermount -u %h/GDrive
Restart=on-failure
RestartSec=10

[Install]
WantedBy=default.target

Then:

systemctl --user daemon-reload
systemctl --user enable --now rclone-gdrive.service
systemctl --user status rclone-gdrive.service

Useful commands:

systemctl --user stop rclone-gdrive      # unmount
systemctl --user restart rclone-gdrive   # after config changes
journalctl --user -u rclone-gdrive -f    # live logs

To stop a manually-daemonized mount first: fusermount -u ~/GDrive (lazy variant: -uz if a file handle is stuck).

Type=notify means systemd waits until the mount is genuinely ready; Restart=on-failure recovers from network blips. If you want the mount alive even with no login session, add sudo loginctl enable-linger $USER.

Keeping it updated

~/bin/rclone selfupdate        # run occasionally; it's a one-shot command

Or schedule it — a systemd user timer with OnCalendar=weekly works nicely. Note a running mount keeps the old code until restarted.

30 August 2026

Window, Workspace, and System keyboard shortcuts for Ubuntu 24.04 and 26.04

(Distilled from a larger summary, augmented, reorganized, and saved here for posterity...)

Window Management

ShortcutAction
Super + AShow all applications
Super + TabSwitch applications
Alt + TabSwitch windows
Alt + Shift + TabSwitch windows in reverse
Super + | Maximize / restore window
Super + | Snap window to left / right half of screen
Shift + Super + | | | Move window to adjacent monitor
Super + HMinimize/hide window
Alt + F4Close current window

Workspace Navigation

ShortcutAction
Super + Page Up | Page DownSwitch to previous / next workspace
Super + Home | EndMove to first / last workspace
Shift + Super + Page Up | Page DownMove window to previous / next workspace

System Controls

ShortcutAction
SuperOpen Activities overview
Super + SQuick settings menu
Super + VShow notification list
Super + LLock screen
Ctrl + Alt + DeleteLog out menu
Print ScreenOpen screenshot tool
Alt + Print ScreenScreenshot of current window
Shift + Print ScreenScreenshot of entire screen
Ctrl + Alt + TOpen terminal

26 August 2026

Connecting a Nintendo Switch Pro Controller Wirelessly to Ubuntu 26.04

(Courtesy of the Kagi Assistant and saved for posterity...)

Context & Symptoms

System: Ubuntu 26.04 (Linux), using the in-kernel hid_nintendo driver (057e:2009), connecting a Nintendo Switch Pro Controller over Bluetooth.

Symptoms: The controller paired successfully and hid_nintendo bound to it in dmesg, but two problems appeared:

  1. The controller would immediately disconnect when evtest (or any program) tried to read from the device, with the error: expected 24 bytes, got -1 — No such device.
  2. After fixing the disconnect, evtest could see the controller's input node but no button or stick events appeared when pressing anything. The controller worked perfectly when connected via USB-C cable — the problem was Bluetooth-only.

The root causes were two separate BlueZ/Bluetooth configuration issues: a firmware quirk in the controller that rejects adapters with unexpected names, and BlueZ's default UHID transport silently failing to forward HID input reports to the kernel.


Step 1: Rename the Bluetooth adapter to “Nintendo”

The Pro Controller's firmware has a quirk where it disconnects if the Bluetooth adapter name doesn't match what it expects. Renaming the adapter satisfies the handshake.

Edit /etc/bluetooth/main.conf:

sudo nano /etc/bluetooth/main.conf

Under [General], set:

[General]
Name = Nintendo
Alias = Nintendo

Restart Bluetooth:

sudo systemctl restart bluetooth

This fixed the immediate disconnection observed when evtest tried to read from the device.


Step 2: Disable UHID (use kernel HIDP instead)

BlueZ's default UHID (userspace HID) transport was creating the input device but not forwarding input reports from the controller to the kernel — so evtest saw the device but no button events ever arrived. Switching to kernel HIDP fixed this.

The telltale sign in dmesg was the input device path containing /devices/virtual/misc/uhid/, indicating the UHID transport was in use:

input: Pro Controller as /devices/virtual/misc/uhid/0005:057E:2009.000E/input/input31

Edit /etc/bluetooth/input.conf:

sudo nano /etc/bluetooth/input.conf

Under [General], set:

[General]
UserspaceHID=false

Restart Bluetooth:

sudo systemctl restart bluetooth

Note: This requires the hidp kernel module. On stock Ubuntu it should be available, but if the controller fails to connect after this change, load it manually:

sudo modprobe hidp
echo "hidp" | sudo tee /etc/modules-load.d/hidp.conf

Step 3: Re-pair the controller

Remove the old pairing and re-pair fresh, since the Bluetooth configuration has changed:

bluetoothctl
[bluetooth]# remove <MAC_ADDRESS>
[bluetooth]# scan on
# (hold the Sync button on the Pro Controller until LEDs flash)
[bluetooth]# pair <MAC_ADDRESS>
[bluetooth]# trust <MAC_ADDRESS>
[bluetooth]# connect <MAC_ADDRESS>
[bluetooth]# quit

The trust command is important — without it, the controller may disconnect after pairing.


Step 4: Verify

Confirm the input device is no longer on the UHID path:

dmesg | grep -i "057e:2009" | tail -10

The input: line should now reference a real Bluetooth device path rather than /devices/virtual/misc/uhid/.

Test with:

sudo evtest

Select “Pro Controller” (not “Pro Controller (IMU)”) and press buttons — events should now stream.


Summary of problems and fixes

Problem Cause Fix
Controller disconnects when evtest opens it BT adapter name doesn't match controller's firmware expectation Rename adapter to “Nintendo” in main.conf
evtest sees the device but no button events BlueZ UHID transport creates input node but doesn't forward HID reports Set UserspaceHID=false in input.conf to use kernel HIDP
USB worked but Bluetooth didn't USB bypasses BlueZ entirely; Bluetooth was broken at the BlueZ → UHID bridge Same — switching to HIDP bypasses the broken bridge

14 August 2026

Maternal Oddity

(I spotted this parody in my file of old writings. Evidently, it's from June 2018.)

Ground Control to Major Mom
Ground Control to Major Mom
Take your protein pills and put your make-up on
Ground Control to Major Mom (ten, nine, eight, seven, six)
Commencing countdown, footwear on (five, four, three)
Odor suspicion! Did you wash your hands too? (two, one, liftoff)

This is Ground Control to Major Mom
We've really made the bed
And the kiddos want to know which shirts to wear.
Now it's time to leave the castle if you dare.

"This is Major Mom in Complete Control
I'm stepping out the door
And no one's listening to what I say
And I'm haunted by forgetting something today

For here
Is coffee in my right hand
No silence in the room
The toddler is blue
And there's nothing I can do

Though we've passed one hundred thousand smiles
I've misgivings still
And I hope my husband knows which way to go
That fool better love me very much he knows"

Ground Control to Major Mom
Your mobile's dead, there's something wrong
Can you hear me, Major Mom?
Can you hear me, Major Mom?
Can you hear me, Major Mom?
Can you...

"Here am I coffee in my right hand
No silence in the room
The toddler is blue
And there's nothing I can do"