Android Desktop Mode on Android 16

Tags:

This is my quest to using my Google Pixel 9 Pro Android phone as thin client in a docking station, with GrapheneOS build 2026032001, Android 16.

Using the phone as thin client requires an USB-C 3.x connector with "DP alternate mode" or "HDMI mode" to output a display signal over the USB-C cable. It also requires a higher quality of USB-C cable that connects all the wires. Some cheap (and not-so-cheap) cables don't connect all the pins and thus will not work.

Experience

With the 2026032001 build, you plug the phone into the docking station, select the display mode to extend the screen to the external display, and it just works. The mouse and keyboard input work anyway, and the phone asks you whether to connect the screen as a secondary display or to mirror the phone screen to the external display.

Display setup

The mouse cursor can now move between the desktop display and the phone display. You can even arrange the location of the phone relative to the large screen.

Screenshot of arrangement of the external screen

Adding an off-brand magnetic cable connector ("Magsafe") still lets the video work. I prefer this in situations where I expect to disconnect / reconnect the phone often. This was a "USB4 40 Gbps USB-C Magnetic Adapter" from Amazon or AliExpress.

As I wiped my old Samsung S10, I can't really compare the experience with Samsung Dex, but for mild desktop working, using Android Desktop Mode is OK as long as you have a mouse and keyboard connected. I couldn't find a way to make the phone screen act as touchpad for the external screen.

Configuring the DPI for your external screen

My display is a small display with a lot of pixels and I suspect it reports some ridiculous DPI to Android. On my display, the controls, fonts and buttons were rather large, crowding out the content. You get a slider in the settings that changes some display parameter. I pulled the slider for the external display all to the left, which made the display on the external screen mildly less grotesque. The phone screen remained as-is, so that setting seems to be per-display.

The display is a 4K display with 11" diagonal, so the controls and fonts are rather large:

Screenshot of the display

Weird stuff

Home 4K display is supplied at 1920x1080 , but Android displays everything as if it were a 1280x800 display. This maybe is due to the display being a 4K 11" display which I use for videoconferencing.

Launching apps on the home display does not work. It works on the display at work. Maybe this is also due to the ridiculously low resolution / large icons. Even with the changed DPI settings, I was unable to properly launch an application via the task bar on the external screen.

Drawbacks

On my Google Pixel 9 Pro, it makes a difference with one USB-C to USB-C cable whether it is plugged in upside down. I now have to shop Amazon to find a trusted Known Good USB-C USB-C cable that supports alternate mode. The USB-C cable that came with my docking station works in both orientations.

I've ordered a bunch of USB-C cables from Amazon and will try them out, expecting the cheap ones to fail.

Linkblog: Teenage Engineering Toy - EP40 Riddim'n'ting

Tags:

Link: https://teenage.engineering/store/riddim-n-ting

I always thought Teenage Engineering were expensive toys, with their (super shiny) OP-1 and OP-XY , but the EP-40 series seems comparably cheap at € 400.

Youtube presentation

Of course, I wouldn't do much more with an EP-40 over an OP-1, but at €400 compared to €1200 , the expense is lower. Not buying either is still cheaper and my rule of not buying a toy unless I have a concrete plan on when I'm going to use it and what I'm going to do with it is still a money-saving rule.

Concert: Kraftklub - Steben in Karl-Marx-Stadt

Tags:

I saw Kraftklub 2019 on their "Keine Nacht für Niemand" tour, also in the Festhalle and came back for their 2026 tour. They are still rocking the house and are really great as a live performance. The sound is still the same as on their first albums, but it is a good, pushing sound.

They invested a lot in the stage and lighting. The projections worked well, especially for a band that does a lot of guitar and non-electronic music.

They lived up to their credo of being a live band and had great interaction with the audience. Moving into and through the audience two times with songs that worked really well and other interactions with the audience also were great.

The pictures were taken from the upper levels, as I feel too old for going into the pit. Thus I missed out on the band going off-stage and moving through the audience.

The acoustics in the Festhalle were bad as usual. Understanding the song texts was hard, but I think it's not easy to work with the echoes in the hall. But they certainly were not worse than other bands I've seen there.

Now playing: Nordhold

Tags:

Nordhold

Nordhold logo

A surprisingly complex tower defense. It has the appeal of the GemCraft series, but the mechanics are different. You build your defense towers along a path on hexagonal terrain and at the same time build up the economy of your village to provide for more resources to build more towers. The first games you play are spent on unlocking all the buildings in some kind of meta-game. Once you have unlocked all the buildings, there is a change to the whole game dynamic as now you can chase beating the game to level 30, when all hex tiles are exhausted. After beating level 30, there is the chase of high-scores by getting your economy and defense good enough to survive wave after wave.

The game could be better, as the first 10 to 15 rounds of a game are mainly about kickstarting your economy, and that slog gets somewhat repetitive. Instead of having to play through these rounds, the game could start you in round 8 (or whatever) with ample resources instead. Otherwise, there is lots of strategy involved combining the right kinds of towers to find synergies. There is the bad luck of drawing bad tiles, but that usually isn't too punishing.

If you like tower defense games, this one is certainly one of the best in the last 5 years.

Setting up z.ai GLM 4.7 with Opencode

Tags:

Why?

Still using z.ai GLM as my main model, I was looking at other harnesses for using the model. Opencode is an Open Source coding harness that supports z.ai. The harness still has UI problems, which is the main point of a harness, so I likely won't be using it in the near time. I wonder if it will ever get away from the fancy slop machine, but maybe if most of your time with a program is watching the model in it output text, then having some colourful distractions / blinking lights is attractive for people.

How it should look:

How it should look

How it looks:

How it looks

No option for making the UI monochrome:

No option for no-color

Opencode has had some bad defaults in the name of user convenience, like sending all prompts to Groks free tier just for coming up with chat summaries for the UI. It seems that now the defaults don't do that anymore, but this weakens my trust in the harness.

Installation

Installing Opencode client just follows the default installation via npm.

Config setup

I did the model configuration within Opencode as outlined in the z.ai OpenCode instructions:

opencode auth login

and entered there a fresh API token from the z.ai API key page.

Afterwards I had to actively select the GLM 4.7 model.

Containerfile creating a container for CC-with-GLM4.7

The Containerfile I used for this harness is as follows:

FROM docker.io/library/debian:trixie-slim
# debian-trixie-slim
RUN <<EOF
apt update

# Install our packages
DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install -y npm perl build-essential imagemagick git apache2 wireguard wget curl cpanminus liblocal-lib-perl ripgrep
EOF

RUN <<EOF

# Install opencode
npm install -g opencode-ai

# Set up our directories to be mountable from the outside
mkdir -p /work
mkdir -p /tools
mkdir -p /root/.config/opencode

# Now you need to login manually with opencode :-/
# opencode auth login
EOF

# Add claude to the search path
ENV PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin"
ENTRYPOINT ["bash"]
CMD ["-i"]

launched as

podman run --rm -it -v /home/corion/agents/claude/mailagent-meeting-setup:/work -v /home/corion/agents/opencode/.opencode:/root/.opencode -e IS_SANDBOX=1 -e FORCE_COLOR=0 opencode-runner:latest