Googlebook Projects
Lenovo Googlebook 15 · GooglebookOS (Android 17)

Open-Source Fixes and Apps for the Lenovo Googlebook 15

On this GitHub Page, I fix GooglebookOS bugs and repair the Googlebook's hardware functionality purely through software, and I develop open-source x86 software built for the Googlebook's hardware and for GooglebookOS. For now, I can't fix firmware issues because the OEMs lock out developers like myself from accessing drivers and most of the Android backend code!

On this page are deep fixes for root problems in the Googlebooks and GooglebookOS as well as original, open-source apps for a brand-new class of device that almost no one is building for yet: the x86-64 laptop running GooglebookOS, which is a desktop version of Android 17 that can also run ChromeOS Web Apps like the desktop version of Google Chrome! Even though there are ARM Googlebooks that run a Snapdragon processor, I will only be focusing on x86 Android Fixes and App Development! However, you may edit the code to work with ARM Googlebooks if you would like!

Every project here started as a real problem on my Lenovo Googlebook 15. I used Claude Code to thoroughly read and trace the system's own code and logs until I reached a tested fix that keeps itself running and protects itself from breaking after Play Store updates, GooglebookOS updates, and operating system upgrades. Each fix is published on this GitHub Page as open source, so others can look at, edit, and fork my code.

I encourage all GooglebookOS and Android developers to edit and fork my code so that we can solve these awful GooglebookOS problems and make GooglebookOS the Desktop powerhouse that us Android lovers want it to be! Not only that, but Linux enthusaists can use the code published and edited on this GitHub Page to improve their Linux Distros as well! Together, we can defeat Microslop and make Android and Linux the master race of computing, office and school mutitasking and productivity, creative apps, and gaming! Thank you.

x86-64 Intel Android 17 · GooglebookOS Linux Terminal VM bridge: adb over Wireless debugging
The developer

About Thomas Liviakis

Hello Everyone,

My name is Thomas Liviakis, and I am an Android software developer. When I bought my Lenovo Tab P12 Android tablet years ago, I fell in love with Android: its customizable, fast, a Linux-based Operating System that allows users to side-load apps (unlike Apple iOS and iPadOS) and run full-on Linux commands in ADB tunnel or Termux, and doesn't eat up RAM and CPU like Microsoft Windows does! As I was using the tablet with my customized widgets, apps, background processes, and scripts, I saw the potential that Android had as a desktop operating system: the potential to truly combine mobile and desktop apps into one powerful ecosystem! Then, when the GameNative and GameHub, gaming apps that allow users to run Steam, GOG, Amazon, Epic Games, and other games on their android devices using the Proton Engine to convert Windows code into Linux code and FEX-Emu to convert game code from x86 architecture to ARM architecture, I knew that my dream was 100% achievable, so I registered as an official Google Play Developer and started coding apps such as WiFiWidget, an Android app that puts a Widget on the device's Home Screen that allows the user to scan for networks automatically in real time, join a network, disconnect and save a network, forget a network, and see the network strength all from the Home Screen without digging into settings, and Bluetooth Widget, an Android app that does operates very similarly to WiFiWidget except for the fact that it scans for Bluetooth Devices instead of WiFi Networks and shows the battery level of the bluetooth device instead of the WiFi Signal all from your Home Screen without digging through settings, for monetary reasons but also to empower Android users with powerful desktop apps (instead of the free junk full of ads and in-app purchases) to bridge the gap between Desktop and Mobile operating systems in order to pave the way for an Android Desktop operating system for PCs and Laptops! Well, with the release of the Intel Googlebooks and GooglebookOS, we finally have that opprotunity! Also, with Microsoft's CoPilot+PCs and Windows 11 itself being a complete nightmaric disaster of epic proportions, from Recall capturing your private data to CoPilot being forced into everything while being absolute garbage to catastrophically broken Windows Updates, Windows users have had enough as many are switching to either macOS OR LINUX!!!!! Entire countries like Germany and France have already switched their entire goverment infrastructure to Linux as the European Union has approved of open source software that replaces Microsoft Office 365 CoPilot entirely! The moment that the Linux community has been waiting for has finally arrived: the Linux Desktop going mainstream! Even though the Linux community has had tremendous victories as of late due to Microsoft's horrifying business decisions, there are still MASSIVE flaws within the majority of Linux distros such as the lack of PC Game support (aka Battlefield 6 and other Anti-Cheat Games), the lack of apps available on Linux (although that's steadily growing thanks to Valve's SteamOS), the requirement to use the Terminal FOR EVERYTHING...AND I MEAN EEEEEEEEEEEEEEEEEEVERYTHING including setting up a bluetooth driver, connecting your mouse, solving networking issues, and opening up and updating an app amongst all the other frustrations reported on Linux forums and YouTube, lack of peripheral support for special functions and operations on devices such as Gaming Mice and Keyboards that usually come with a Windows installer, and the inability to access certain websites like banking websites or websites with hardcore encryption or authentication/certification processes! However, Android doesn't have these problems at all and has already solved all of these problems a long time ago! Because Android is based off of the Linux Kernel, Android apps can easily emulate on Linux desktops with emulators such as Waydroid, meaning that as Android and GooglebookOS developers as well as Corporations such as Adobe, Autodesk, Intuit, Epic Games, Valve, Blackmagic Design, Avid, Native Instruments, and others create Desktop apps for GooglebookOS and Android devices, they will easily be adaptable for Linux Desktop users as well since Android is based off of the Linux Kernel!

I created this GitHub Page because I want to take these Googlebooks to the next level! I understand that the Googlebooks were released with lots bugs and problems, and I want to help solve these problems for you so that you continue using the Googlebook as your main computer for your creative, school, or office work as well as help configure it for gaming! I truly believe that if we all work together, we can truly make GooglebookOS a fantastic operating system for everybody's needs so that we as a society can finally get rid of Microslop once and for all! If you desire to try a new operating system but feel overwhelmed by the naysayers and doomers online, telling you how bad GooglebookOS is, then this is the place for you! I promise you that if we all as a community commit to this operating system and build it up together, than Google will see our passion and will put more effort into it and won't cancel the Googlebooks and GooglebookOS like many online and in the tech world expect! We can make this work! I'm 100% invested into making GooglebookOS work for any and all of your needs! It doesn't matter what your need or desire is! I will make it work for you to the best of my ability! I'm here to make your lives better, not worse! And best of all, your Googlebook will last a VERY long time since Android is a fantastic, secure, lightweight Linux-based Operating System and Google promised to update the 5 released Googlebooks for at least 10 years! This GitHub Page will have everything you need to successfully and optimally operate your Googlebook! Thank you and Enjoy!

On Google Play

Android Apps by Thomas

These are Android apps I've published on the Google Play Store. They are separate from the Googlebook projects below.

These are general-purpose Android apps. They were not built specifically for the Googlebook. Each app has its own terms: open the app's Google Play listing and read its Terms & Conditions to see whether it is open source or closed source.

WiFi Widget

WiFi Widget puts a widget on your Home Screen that scans for Wi-Fi networks automatically in real time. From the widget, you can join a network, disconnect and save a network, forget a network, and see each network's signal strength without digging into Settings.

View on Google Play

Bluetooth Widget

Bluetooth Widget puts a widget on your Home Screen that scans for Bluetooth devices. It works much like WiFi Widget, but it shows each Bluetooth device's battery level instead of a Wi-Fi signal, all without digging through Settings.

View on Google Play
The work

Projects

Every project here started as a real problem on the Googlebook. Each one was traced to its root cause in the device's own code and logs and then solved with a fix that keeps itself running. Before you set up any project, read the Getting started guide.

Important: turn on "Disable adb authorization timeout" in Developer options and leave it on. Otherwise Android forgets every Wireless debugging pairing that has not connected for 7 days, without a word. On 2026-10-17 the pairings of Sleep Guard and Shadow Trackpad Fix vanished that way and both apps stopped working. Both now switch the timeout off themselves whenever they connect, but your own adb pairing needs the switch too. The guide shows where it is.

Sleep Guard

helper · app · VM command

Click anywhere on this card to open its code and instructions on GitHub.

What it does

Sleep Guard protects the Googlebook from losing power when the charger is unplugged or plugged in while the lid is closed and the laptop is in deep sleep. Closing the lid still puts the laptop into normal deep sleep, so battery life is not affected.

It has three parts. A small helper runs on GooglebookOS with the same permissions as adb, without root. The Sleep Guard app starts and repairs that helper automatically after every reboot, app update and Wi-Fi reconnect, and it shows the helper's status. A command in the Linux Terminal, sleep-guard, handles pairing, installing, status and logs. Once it is set up, I never have to touch it.

Problem

I would open the lid and find a black screen. Pressing a key started a full boot instead of showing the lock screen, so any open work was lost. It happened after the laptop had slept on the charger and the charger was unplugged before the lid was opened, although not every unplug caused it.

A bug report and the firmware logs showed that the embedded controller (EC), the chip that manages power, had cold-rebooted itself and cut all power while the laptop was in deep sleep (S0ix). Its reset flags read "sysjump | hard". The EC source code shows that "hard" means software ordered a cold reboot, because a crash, a watchdog reset or a power failure leaves different flags. The EC log had also recorded a "sleep hang" after an earlier charger change.

The trigger is a race. With the lid closed, GooglebookOS force-disables every wakelock, so when a charger change wakes the laptop, it falls back into deep sleep within about 60 milliseconds while the USB-C controller is still handling the change. Lenovo's EC module is closed source, so the exact sender of the reboot command could not be identified. Many other causes were checked and ruled out, including the Setup Wizard's auto-shutdown, the lid settings, an Android shutdown, the battery level, heat, the 80% charge limit and the EC watchdog.

Solution

Sleep Guard gives the hardware a moment to finish before the laptop goes back to sleep. It notices every wake that happens with the lid closed within about 5 milliseconds and checks again 15 milliseconds later that the lid really is closed. Then it briefly tells GooglebookOS that the lid is open for power purposes, which makes wakelocks work again, while it keeps the screen and the glow bar off. The hold lasts 0.3 seconds, and it stretches to a 20-second settle period when the charger has changed. After that, everything is released and normal deep sleep resumes.

It was proven live on October 10, 2026. An unplug during deep sleep was caught 87 milliseconds after the wake, a plug-in was caught 18 milliseconds after the wake, and the laptop stayed up overnight.

Safety was treated as seriously as the fix. An early version once stalled the power service for about two minutes, so the helper now reads system service output asynchronously with a deadline and a size cap. Every command has a time limit, and a watchdog releases everything and exits if the helper ever stalls. After every exit, it restores the real lid state. On a new GooglebookOS build, it runs a self-test and stands down with a notification if anything has changed, instead of guessing. It also notices when Wireless debugging moves to a new port after a Wi-Fi drop and publishes the new port, so the app can always reconnect.

Sleep Guard wins a timing race. It is not a firmware fix. Opening the lid before unplugging the charger is always completely safe.

Shadow Trackpad Fix

input helper · app · diagnostic

Click anywhere on this card to open its code and instructions on GitHub.

What it does

Shadow Trackpad Fix makes the Googlebook's trackpad work properly inside the Shadow PC cloud computer app. Two-finger scrolling becomes smooth and precise, including slow scrolling, sideways scrolling and flicks with momentum. Pinch to zoom works, three- and four-finger swipes switch windows and go back and forward, and one-, two- and three-finger taps give left, right and middle clicks.

The project has four parts. A small helper runs on GooglebookOS with adb permissions and switches itself on only while Shadow has captured the pointer. The Shadow Trackpad Fix app restarts that helper after every reboot and update, and it tells me when Shadow or GooglebookOS has been updated. A command in the Linux Terminal, shadow-trackpad, controls the helper and includes a doctor that re-checks everything after an update. Trackpad Probe is the diagnostic app that proved the root cause, and it is now the test target for the helper and the doctor.

Problem

In Shadow PC, slow two-finger scrolling did nothing, and normal scrolling was jerky and lost much of its movement. Pinch, flick and multi-finger swipes did not work at all. Turning on Shadow's Accessibility option did not help, because Shadow's Accessibility service only handles the keyboard.

Two things combine to cause it. Shadow captures the pointer with Android's older pointer capture call, and on this GooglebookOS build, which is based on Android 17, that call now gets "relative" capture mode by default. In relative mode, Android passes on only cursor moves, clicks and scrolling. Pinch, flicks and three- and four-finger swipes are dropped, and the raw finger data that Shadow's own gesture code needs never arrives. The scrolling that does arrive comes in small fractional steps, and Shadow rounds each step down to a whole number, so every step smaller than one notch becomes zero.

Trackpad Probe proved this. It captures the pointer exactly the way Shadow does and logs every event. With capture on, 100% of slow scrolls and 30% to 85% of normal scrolls were lost, and pinch, flick and swipe produced nothing. The trackpad hardware, my settings, the network and system load were all ruled out, and the system flag behind relative mode cannot be changed without root.

Solution

While Shadow holds pointer capture, the helper takes exclusive control of the trackpad, reads the raw finger data itself and runs its own gesture engine. It sends cursor moves and clicks straight to Shadow. Scrolling is sent as a synthetic two-finger touchpad drag, which Shadow's own gesture code turns into fine-grained Windows scrolling. Pinch is sent as Ctrl plus that drag, which is how Windows precision touchpads zoom. GooglebookOS intercepts the Windows key and Alt+Tab, so three-finger swipes use the Ctrl+Alt+Tab switcher instead, and four-finger swipes send Back and Forward. The moment capture ends, the trackpad goes back to Android.

It is fast. In an A/B test, the time from finger to app was 9.4 milliseconds with the helper and 11.2 milliseconds with Android's own handling, with no lost movement.

It was built to be safe and to keep working. A watchdog releases the trackpad if the helper stalls for 1.5 seconds. The app proves it is talking to the real adb service before it hands over any secret, and that secret is derived from the paired key, so only the Linux Terminal and the app can compute it. After an update, the doctor decompiles the new Shadow app, re-checks every assumption the helper relies on, and switches any broken feature to a safe fallback until the check passes again. Before release, the code went through three rounds of independent review by AI code reviewers, and a fuzz test ran one million gesture sequences with zero stuck keys or buttons. The final doctor run passed all 25 checks.

The real fix belongs in Shadow itself, which could keep the fractional scroll steps or request absolute capture mode.

Buds LE Link

helper app · plugin fix

Click anywhere on this card to open its code and instructions on GitHub.

What it does

Buds LE Link keeps Samsung's Galaxy Buds4 fully connected to Samsung's Galaxy Wearable app on the Googlebook, so the earbuds' controls, settings and battery widget work without tapping Connect over and over. It is a small background app. It reconnects the earbuds' control link a few seconds after they connect, then checks the link about once a minute for several minutes and warns me only if five of those checks fail in a row. Every 15 minutes, it also sends the reconnect signal again while the earbuds are connected. A status window shows the link state and has a Reconnect now button.

The project also includes the fix that stopped Galaxy Wearable from crashing in the first place.

Problem

The first problem was a crash. Galaxy Wearable crashed the moment the Buds4 were connected and then on every launch, and the Buds widget never appeared. Galaxy Wearable itself was fine. Its Galaxy Buds plugin was the part that crashed, because Samsung's x86-64 build of that plugin includes only 3 of its 8 native libraries, so it failed at startup.

The second problem appeared once the crash was fixed. The plugin's screens and widget showed "disconnected" while music was playing through the earbuds, and I had to tap Connect every time. The link also dropped at random.

The Googlebook connects the Buds4 over LE Audio only and turns down the older Bluetooth audio connections. The plugin reconnects automatically only when one of those older connections comes up, which never happens on this laptop. It does see the LE Audio connection, but it ignores it unless the earbuds are one specific other Galaxy Buds model and the host has a Samsung-only system feature, so the Buds4 fail that check. The plugin's control channel also closes whenever an earbud's link blips, and nothing reopens it.

Solution

The crash was fixed by reinstalling the same Play Store copy of the plugin in its ARM version, which contains all of its libraries. GooglebookOS translates it to run on the Intel processor. The plugin kept its data and its Play Store link, and it received the Nearby devices permission it had never been given. The widget then appeared by itself.

To solve the connection problem, the plugin's code was studied to find out what makes it connect. At startup, it sends itself an internal "ready" signal, and its handler for that signal does count LE Audio as connected. Any app is allowed to send that signal. Buds LE Link sends it twice, a few seconds after the earbuds connect. The first signal refreshes the plugin's stale state, and the second one opens the control channel. Audio stays on LE Audio the whole time. In the first test, the link came back about 4 seconds after the earbuds came out of the case.

I wanted it to be foolproof, so version 2 added the 15-minute check, the status window, and self-checks for every permission and battery setting it needs, with a Fix button for each one in the status window. Version 2.2 turned that window into a normal one that closes cleanly. Version 2.3 came after a GooglebookOS update switched the plugin back to its Intel version during the restart. Now, after every restart, Buds LE Link checks the plugin, and if it is in Intel mode, the app reinstalls it in ARM mode by itself through its own Wireless debugging pairing. In my test it was back in ARM mode 1.1 seconds later. Version 2.4 came after the plugin got stuck after days of running and stopped trying to connect. Now, when the earbuds play audio but the plugin has had no control link for five minutes, Buds LE Link restarts the plugin by itself, at most once every 30 minutes. In my test it was connected again 3 seconds later. Both fixes depend on how this exact version of Samsung's plugin behaves, so a Samsung update could undo them, and the app warns me if a different plugin version is installed.

Click anywhere on this card to open its code and instructions on GitHub.

What it does

This project gives the Gmail web app on the Googlebook real, lasting notifications, even when Gmail is completely closed. Each new email pops up as its own notification, stays in the Notification Center until I deal with it, and is grouped by account. Every email notification has three buttons: Reply, Delete and Mark as read. Tapping a notification opens that email in the Gmail web app.

It has four parts. A 2021 version of Google's Gmail Go app works only as the engine that receives Google's push messages. Notification Keeper turns each of its alerts into a proper notification. A helper inside Notification Keeper carries out a tap, Reply or Delete in the Gmail web app window. A small background service that runs on GooglebookOS itself handles Mark as read without opening any window.

Problem

On the Googlebook, Gmail is a web app. Its alerts are created by the open Gmail web page, and Gmail's own web code withdraws each alert about 7 seconds after posting it, so nothing is left in the Notification Center. When the window is closed, GooglebookOS ends the page within a fraction of a second. From then on nothing can notify at all, because Gmail's web code has no way to receive push messages while it is closed. Do Not Disturb, notification settings, battery settings and rate limits were all checked and ruled out.

Installing the full Gmail Android app did not solve it. On a Googlebook, the full app detects the desktop and switches itself into the same web mode, and it disables 84 of its own components, including the one that receives push messages and the one that syncs mail. The adb shell is not allowed to switch those components back on. The newer 2022 version of Gmail Go never asks for permission to post notifications, so Android blocks all of them.

Solution

The 2021 version of Gmail Go has no web mode, keeps its own push receiver and mail sync, and targets an Android version old enough that its notification permission can be granted from adb. Google's own signed copy of it was installed, granted that permission, exempted from battery limits and set to stay silent. When new mail arrives, Google's push wakes Gmail Go even if it has been closed, and it syncs the email. Notification Keeper then posts its own pop-up copy and removes Gmail Go's original. The whole chain takes about 1 to 1.5 seconds from Google's push to the pop-up. If the Gmail web app is open and posts its own alert as well, the Keeper removes that duplicate.

Tap, Reply and Delete open the right account's inbox in the Gmail web app. The helper finds the email by its exact subject and arrival time, and then it opens the email or uses Gmail's own menu to reply or delete. It only touches the screen when Gmail is the active window and nothing covers it. For Reply and Delete, it removes the notification only after the action succeeds. Mark as read works without opening anything. The background service runs on the Googlebook itself and keeps a hidden browser signed in to each Gmail account, finds the unread email by sender address, subject and time, and clicks Gmail's own Mark as read button. Each one takes about 4 to 6 seconds. It started out in the Linux Terminal, but the Terminal stops whenever its window closes, so it now runs on GooglebookOS with the same browser and sign-ins, and a small app starts it again after every restart. A settings guard saves my Gmail notification settings and puts them back if they are ever reset.

Every part was proven on October 12, 2026, including notifications with Gmail Go closed, Mark as read on more than one account, and tap, Reply and Delete. Mark as read on GooglebookOS itself, with the Linux Terminal closed, was proven on November 3, 2026. Archive was left out because Android shows at most three buttons on a notification. Mark as read needs Wireless debugging on so the app can start it after a restart, and it works for @gmail.com and @googlemail.com accounts only.

Notification Keeper

open-source app

Click anywhere on this card to open its code and instructions on GitHub.

What it does

Notification Keeper is an open-source Android app that keeps web app notifications in the GooglebookOS Notification Center. When a Chrome web app or website withdraws one of its own notifications a few seconds after posting it, the Keeper posts a quiet copy that stays until I tap it or clear it. Tapping the copy opens the site or web app. The Keeper has no internet permission and stores no message content.

It was built first for the Gmail web app. For Gmail, it goes further. It turns each email alert into a rich notification with Reply, Delete and Mark as read, it clears a copy by itself when I read that email on another device, it guards Gmail's notification settings, and it runs the Gmail helper described in the card above. Its long-term goal is to preserve notifications for every Chrome web app on GooglebookOS, and other developers will need to extend the code to get there.

It also shows Home Depot order updates as their own notifications. The Home Depot app's own notifications never reach my Googlebook, so when an order update email from Home Depot arrives in any email app, the Keeper also shows it as a Home Depot notification in the brand's colors. When I tap it, my Home Depot Helper, described in the next card, opens the exact order in the Home Depot app. Without the helper the tap opens the Home Depot app. The email's own notification still arrives as usual.

Problem

Websites and Chrome web apps can withdraw their own notifications a few seconds after posting them, and the Gmail web app does this with every alert. The alert pops up, disappears, and leaves nothing behind in the Notification Center, so a notification that arrives while I am away from the screen is simply gone.

No GooglebookOS setting causes this. Do Not Disturb, snoozing, notification timeouts and rate limits were all checked and ruled out. The site's own code withdraws the alert, and Chrome passes that on to the system.

Solution

The Keeper is a notification listener. It recognizes notifications that Chrome delivers for websites and web apps, and it watches for the moment one is withdrawn by the app itself. It ignores notifications that I swipe away or tap. When an alert is withdrawn, the Keeper posts a copy with the same title, text and icon on its own "Kept web notifications" category, which keeps it in the Notification Center. It keeps up to 15 copies, because Android allows each app only 50 notifications. A Run test button posts a fake web notification and withdraws it after 7 seconds, so anyone can check that the Keeper catches it.

This generic keeping already works for any web app's withdrawn alerts without any changes. The rich features are the action buttons, the settings guard, and a privileged link that lets the Keeper manage another app's notification categories. Those are written only for Gmail and Gmail Go. Bringing them to other web apps means editing the app names written into the code and writing matching logic for each app, and that is the work this project invites other developers to do.

The Keeper cannot make a closed web app notify. For Gmail, that part is handled by Gmail Go, as the card above explains.

Home Depot Helper

open-source app

Click anywhere on this card to open its code and instructions on GitHub.

What it does

Home Depot Helper is a small open-source Android app that takes a Home Depot order notification from my Notification Keeper to the exact place in the Home Depot app. An email that names an order number, such as shipped, out for delivery, delivered, rescheduled or cancelled, opens that order's own details page with its status timeline and return barcode. An order email without a number in the preview opens my purchase history, newest order first. A sign-in verification code email copies the code and types it into the app's code field for me. Anything else simply opens the app. It has no internet permission and stores nothing but one line about its last action.

Problem

The Keeper's Home Depot notifications could only open the Home Depot app, and I still had to find the order myself. A verification code arrived as an email that I had to read, remember and type. A notification carries only the email's subject and preview, so whatever opens the right place has to work from those two lines alone.

Solution

I read the Home Depot app's manifest and followed the links behind the buttons in my own Home Depot emails. The app handles its website's account addresses natively, and "Manage Order" ends at the order details address for one order number, while "Check Order Status" ends at the purchase history. The helper builds the same address from the order number in the notification and hands it to the Home Depot app, so orders need no screen tapping at all. The Keeper only passes the subject and preview to the helper, and keeps working exactly as before when the helper is not installed.

A verification code cannot be opened by a link, so the helper has one accessibility service for that. It receives events only from the Home Depot app, looks at the screen only while a code is waiting, prefers a field whose label mentions a code, never types into a search, email or password field, performs no gestures, and gives up quietly after 45 seconds with the code still on the clipboard. Android switches an accessibility service off after every update, so with one permission granted over adb the helper switches its own service back on by itself. I tested a card tap landing on the order page and the code typing on screen, and the typing check had to learn that a web page may reformat the digits it was given.

Battery Widget

system fix · repair command

Click anywhere on this card to open its code and instructions on GitHub.

What it does

This fix makes Google's built-in Batteries widget on the Googlebook show the battery level of connected Bluetooth earbuds, such as the Galaxy Buds4 and the Pixel Buds 2a, next to the laptop's own battery. It is a one-time permission change. A small command in the Linux Terminal, fix-battery-widget, re-applies it in seconds if the widget ever goes blank again, for example after a factory reset.

Problem

The earbuds showed up in Bluetooth Settings, but the Batteries widget only ever showed the laptop. The earbuds and the Bluetooth system were working normally, and the widget was even being told every time a Bluetooth device connected or disconnected. It simply could not read them.

The widget belongs to a preinstalled Google app called Settings Services. Since Android 12, an app that wants to list connected Bluetooth devices and read their battery levels needs the Nearby devices permission (BLUETOOTH_CONNECT). Settings Services asks for that permission, but on the Googlebook it had never been granted for my account, so the widget could not see any devices. Bluetooth Settings still showed the earbuds because it runs with its own system privileges.

Solution

The Nearby devices permission was granted to Settings Services over adb from the Linux Terminal. The widget refreshes when a Bluetooth device connects, and it only lists devices that are connected at that moment. When I reconnected the earbuds, both the Galaxy Buds4 and the Pixel Buds 2a appeared in the widget right away.

To make the fix stick, the permission was marked as my own choice, so the system treats it as a deliberate setting. Android's automatic removal of permissions from unused apps was also turned off for Settings Services. The fix-battery-widget command repeats all of these steps and prints the result, so I can see that it worked.

Waydroid

Linux VM · Android container

Click anywhere on this card to open its code and instructions on GitHub.

What it does

This project runs Waydroid, a complete Android 13 system with Google Play, inside the Googlebook's Linux Terminal. Waydroid includes Intel's ARM translator, so it can install Android apps that only come in ARM versions, including 32-bit ARM apps that GooglebookOS itself cannot run. Two buttons on the panel of the Linux Terminal's display open Waydroid and restart it, and the same actions are available as the terminal commands waydroid-open and waydroid-restart.

Problem

I wanted to run ARM-only Google Play apps on the x86 Googlebook. GooglebookOS can already translate 64-bit ARM apps, but it has no support for 32-bit ARM apps. Waydroid had been installed in the Linux Terminal, but Android never finished starting.

The cause was Waydroid's network setup. Its script adds an iptables rule that needs a kernel feature called the CHECKSUM target, and the Linux Terminal's kernel is built without it. The network script failed, and Waydroid gave up before Android could boot.

Three more problems appeared after that. Waydroid froze Android whenever its window was hidden, which also stopped Play Store downloads. The virtual machine's memory and swap filled up, so Android looked frozen. Google Play also refused to sign in until the device was registered with Google, because a Waydroid system is not a certified device.

Solution

Waydroid's network script was switched to nftables, which the kernel fully supports, and Android then booted in about 18 seconds with working internet and Google Play. A systemd drop-in re-applies that change every time Waydroid starts, so package upgrades cannot undo it. The unused LXC network service, which failed in the same way, was turned off.

Auto-freeze was switched off, so Android keeps running in the background. A 4 GB swap file was added at a lower priority than the fast compressed swap, which freed enough memory for the Play Store to run smoothly. I registered the device with Google so I could sign in to Google Play, and the two launcher buttons were added and tested.

An app that ships only with 64-bit ARM libraries installed successfully from Waydroid's Play Store, but no ARM app has been launched and tested yet. The virtual machine has no GPU acceleration, so Android draws everything in software. Waydroid's window appears only inside the Linux Terminal's display view, and apps with strict integrity checks usually refuse to run.

Continue On

workaround · mirroring app

Click anywhere on this card to open its code and instructions on GitHub.

What it does

This workaround brings my Android devices onto the Googlebook's screen when Google's Continue On feature is not available for them. It uses Scrcpy for Android, an open-source scrcpy client by Miuzarte that runs on GooglebookOS itself. It streams a device's screen and sound into a window on the Googlebook, and the Googlebook's trackpad, mouse and keyboard control the device directly. Nothing is installed on the phone or tablet, and no root is needed.

Problem

Continue On is part of Google's Better Together features, and it lets a Googlebook pick up apps from a phone. Google's requirements say the phone must run Android 17 or newer. The feature also launched for Pixel phones only, with Samsung support promised later. My Lenovo Tab P12 runs Android 15 and my Galaxy S23 Ultra runs Android 16, so both devices are left out.

Setting up a replacement had its own obstacles. Android 17's new local network permission had not been granted to the app. The app could not discover the devices on the network, so they had to be added by hand. The tablet refused the first connection and had to be paired again. The first stream also lagged, because the tablet was sending its full 2944 by 1840 resolution over Wi-Fi.

Solution

Before the app was installed, its download was checked against the checksum published on GitHub and its signature was verified. It was given the local network and notification permissions, allowed to run in the background and exempted from battery saving, so the connection does not drop when the app is not in front. Each device was paired once over Wireless debugging and added by the IP address and port shown on its Wireless debugging screen. The stream was limited to 1920 pixels at 60 frames per second, which removed the lag and made the stream much smoother.

The app mirrors one device at a time in a single window, and it streams the device instead of handing apps over the way Continue On does. After a device restarts, its Wireless debugging port changes, so the saved entry needs the new port. Apps that block screen capture show a black screen.

Forge IDE

AI coding IDE · app · GPU engine

Click anywhere on this card to open its code and instructions on GitHub.

What it does

Forge is my Cursor-style AI coding IDE for the Googlebook. It runs my local Llama 3.1 model through Ollama in the Linux Terminal and gives me what I have in Cursor: an editor with code intelligence next to a chat with several tabs, an agent that reads, edits and runs code for me with my approval, a visible thinking process, every change highlighted inline with Keep and Undo, checkpoints I can restore, context from files, folders, docs, past chats, the web and linter errors, attachments of any kind, voice input, memories, rules, hooks and custom modes, a debugger for Python, C, C++, Rust, Kotlin, Java, JavaScript, TypeScript and Android apps on a device, Jupyter notebooks in Python, Kotlin and Bash, a codebase index that searches by meaning, Android, Kotlin (including Kotlin Multiplatform), Java and Rust development with code intelligence, virtual Android devices from Android 11 to Android 17, including Android 17 and Android TV with Google's apps and Google's own Wear OS 6, Google TV 16, Pixel-style Android 16, Android Automotive 15 and desktop Android 14 builds (phones, foldables, tablets, watches, TVs, cars and desktops, running in the Linux VM without an emulator and behind a shield that keeps Android from changing the VM), the makers' own Android under ARM emulation (Samsung One UI 8, Nothing OS 4 and OnePlus OxygenOS 16 boot to their setup wizards and Xiaomi HyperOS 3 to its lock screen; OPPO, Honor, vivo, Realme and Pixel system images are downloaded and prepared the same way), every emulator image checking its own source for updates and upgrades daily and installing them with one click, device personas that dress the fast native devices as 28 real Galaxy, Pixel, OnePlus, Motorola, Lenovo, Xiaomi, Fire TV and Shield devices with each maker's battery behavior, Compose previews of phone, watch and TV screens without a device, real devices with the makers' own software from Google's and Samsung's device labs, source control, a terminal, and native app windows, one per project. A GPU engine built into the app runs Llama or Qwen3.5 4B on the laptop's Intel graphics, and I can paste screenshots, which Qwen3.5 on the engine looks at itself, or a vision model reads for Llama. I can watch the two models work together in the chat, step by step. The models run on the laptop, so nothing I type leaves it unless I ask for it: a web search, documentation fetched from the web, an MCP server on the internet or a device lab.

Problem

Ollama runs Llama 3.1 8B in the Linux Terminal, but a terminal is a poor place to do real coding work with a model. The CPU in the Linux VM processes prompts at only 10 to 23 tokens per second, so an agent with a few thousand tokens of context waited minutes before its first word. The VM has 7.8 GB and the model takes 5.2 GB of it, and the laptop takes memory back from the VM when it needs it; one reload into a full VM made the laptop kill the whole VM.

The Intel graphics could not help: the Terminal app only passes the GPU through to the VM on devices where Google has set a flag, the Googlebook is not one of them, and flipping the flag needs root.

Solution

A native Kotlin app on the Android side is the IDE: an editor with language servers, AI completions, Ctrl K and an inline review of every change, the terminal and the chat, with no browser and no WebView. A pure Python server in the VM runs the agent with a tool protocol an 8B model follows reliably, checkpoints for every change, automatic syntax checks after every edit, and a prompt cache strategy that makes follow-ups answer in seconds. Memory guards show the VM's free RAM, refuse to load the model into a full VM and unload it before the VM gets into danger. Helpers such as the language servers, the debugger, notebook kernels and the small embedding model start only when needed and only when a memory check passes, and they stop again when they are not used.

For the GPU, I cross-compiled llama.cpp's Vulkan backend for Android and packaged it into the Forge app, where the Intel graphics are reachable. The app downloads the weights once from Ollama's store, asks the VM to hand memory back, and serves the model to the IDE. Prompt processing went from 10 to 23 tokens per second to about 100, the first token of a cold agent prompt from 134 seconds to 9, and a three-step agent task from 257 seconds to 50, with no model memory left inside the VM.

Also solved

Smaller fixes

These are one-off diagnoses and fixes on the same Googlebook, written up for reference.

I thought the Linux Terminal's Keep Awake setting was broken, because the screen still went to sleep while the Terminal was open. Decompiling the Terminal app showed that Keep Awake is not a screen setting at all. It holds a partial wake lock, which keeps the processor and the Linux virtual machine running while the screen is off, and it only takes that lock after I switch away from the Terminal or the screen turns off. It does nothing while the Terminal is in front, and when its timer runs out, it switches itself back to Off. The screen was turning off because of the normal five-minute GooglebookOS screen timeout, which can be changed in the Screen timeout option of the Display settings. Later work on Sleep Guard also found that closing the lid disables every wake lock, so Keep Awake cannot keep the virtual machine running while the lid is closed. The setting works as designed, and nothing needed to be fixed.
My Linux Terminal closed by itself in the middle of my work, and the Linux virtual machine stopped with it. The Googlebook's own record of why the Terminal ended showed that the Play Store had updated Android System WebView in that same second. The Terminal draws its window with WebView, and Android closes every app that loaded WebView when WebView is updated. The Play Store only waits while WebView itself is in use, which it never is, and it does not offer its auto-update switch for the built-in WebView. Research into Android's install system showed that nothing reachable over adb can hold that update back. Android does accept WebView Beta as the WebView apps use, though, and the Play Store lets me turn off its automatic updates. A small watcher on the Googlebook switched to WebView Beta while the Terminal was closed, because switching closes apps that use WebView too, and it now tells me when an update is waiting and the Terminal is closed, so it is safe to install. Updates to the regular WebView no longer touch the Terminal at all. A small desktop shortcut reminds me to close the Terminal and then opens WebView Beta's Play Store page, where I tap Update.
Long jobs in the Linux Terminal, including Claude Code, were dying in the middle of their work. The Googlebook's logs showed why. About two minutes after the Terminal app went into the background, its connection to the Linux virtual machine sometimes dropped, and the terminal server inside the virtual machine then closed the shell and every program running in it, even though the app and the virtual machine kept running. The fix was to install tmux, which keeps programs running in a session that does not depend on the window. The shell's startup file now opens or re-attaches that session automatically whenever the Terminal opens a new window, so after a dropped connection, everything is still running exactly where it was left. Command shells that programs start in the background are not affected, and setting NO_AUTO_TMUX=1 skips the feature. In testing, a simulated disconnect left the running program alive, and a new window re-attached the same session. tmux cannot help if the whole virtual machine stops, for example after a restart or when an update closes the Terminal app. Because mouse mode is on, text is selected by holding Shift while dragging.
The Home Depot app refused to run on my Googlebook and showed "The Home Depot app is no longer supported for tablet devices." The app treats any window 600 dp or wider as a tablet, and because Android 16 and later ignore its portrait-only setting on large screens, GooglebookOS opened it in a wide landscape window. The fix keeps the app in a tall, phone-sized window. A one-time script performs real mouse drags so that GooglebookOS remembers a 448 dp wide window for the app, a small watcher snaps any window that grows too wide back to phone size within about a second, and a keeper in the Linux Terminal keeps the watcher running after reboots. Since October 30, 2026 the watcher also rescues a Home Depot window that has become a fullscreen task, which happens when the app is brought to the front while no desktop window is showing, for example from the lock screen. It asks the desktop shell for the desk id, checks it against the system's own list, and moves the task back onto the desk, the same move as the window menu's own entry. The same approach works for other phone-only apps. Separately, the Home Depot app's own notifications never reach the Googlebook either, so my Notification Keeper app turns Home Depot order update emails into Home Depot notifications, and my Home Depot Helper opens the exact order from them. The Notification Keeper and Home Depot Helper cards above describe that.