I had an external WiFi adapter lying around. I enabled its driver in the kernel, recompiled it, placed the WiFi firmware in
Result: Out-of-the-box wlan0, the moment it's plugged in..!
This phone has 2GB RAM, 16GB storage, and a Qualcomm SoC scoring ~150 (single-core) and ~450 (multi-core) on Geekbench.
Look at this htop screenshot - even this weak potato sits at 0% CPU idle! π₯
On Android, idle CPU usage hovers around 30β50% for absolutely nothing.
This is Alpine Linux, booted directly from a lightweight TWRP recovery environment, with full networking.
Most people see these phones as phones. I see them as Android slapped on top of an ARM64 development boardπΏ
So I nuked Android and used that space for a lightweight Linux container instead.
@Droidspaces
recovery_ramdisk/vendor/firmware, and wired it up via /sys/module/firmware_class/parameters/pathResult: Out-of-the-box wlan0, the moment it's plugged in..!
This phone has 2GB RAM, 16GB storage, and a Qualcomm SoC scoring ~150 (single-core) and ~450 (multi-core) on Geekbench.
Look at this htop screenshot - even this weak potato sits at 0% CPU idle! π₯
On Android, idle CPU usage hovers around 30β50% for absolutely nothing.
This is Alpine Linux, booted directly from a lightweight TWRP recovery environment, with full networking.
Most people see these phones as phones. I see them as Android slapped on top of an ARM64 development boardπΏ
So I nuked Android and used that space for a lightweight Linux container instead.
@Droidspaces
β€6π₯5πΏ4π©1
Droidspaces
I had an external WiFi adapter lying around. I enabled its driver in the kernel, recompiled it, placed the WiFi firmware in recovery_ramdisk/vendor/firmware, and wired it up via /sys/module/firmware_class/parameters/path Result: Out-of-the-box wlan0, theβ¦
LET'S PLAY DOOM ! πΏ
π₯5πΏ2π©1
This media is not supported in your browser
VIEW IN TELEGRAM
β€3π€―2π1π©1
Droidspaces
[ Explanation ] @Droidspaces
Final update for the ~200MB RAM Galaxy A01 Droidspaces setup πΏ
The key difficulty with this setup was that you had to hold the recovery key combination every time you wanted to enter TWRP, manually type Droidspaces CLI commands to start the container, and if the phone was plugged into a charger while powered off - it would bootloop forever since there's no Android left to show a charging animation.
Here's how I solved all of that:
- Flashed recovery.img directly to the boot partition, making the device boot straight into TWRP by default; no key combos needed
- Since flashing to the boot partition means Android's init now executes TWRP's init binary on charger detection, I patched TWRP's main init.rc to trigger a clean reboot whenever a charger is connected while the device is powered off, which boots straight into TWRP
- Wrote a simple init.rc service called "alpine" that automatically starts the Alpine Linux container right after the Droidspaces daemon is ready - meaning Alpine boots automatically as part of the TWRP boot sequence
- Wrote an OpenRC service that watches for the wlan0 interface, brings it up, connects to the WiFi network, and assigns an IP - running as a daemon forever, handling hotplug and reconnection automatically
Final result: a fully functional Raspberry Pi-like device that powers on the moment a charger is detected, auto-boots Linux, and fires up SSH, Tailscale, and WiFi - all with only ~200MB of RAM usage.
This is what I call a proper server πΏ
[ Demonstration, init Script ]
@Droidspaces
The key difficulty with this setup was that you had to hold the recovery key combination every time you wanted to enter TWRP, manually type Droidspaces CLI commands to start the container, and if the phone was plugged into a charger while powered off - it would bootloop forever since there's no Android left to show a charging animation.
Here's how I solved all of that:
- Flashed recovery.img directly to the boot partition, making the device boot straight into TWRP by default; no key combos needed
- Since flashing to the boot partition means Android's init now executes TWRP's init binary on charger detection, I patched TWRP's main init.rc to trigger a clean reboot whenever a charger is connected while the device is powered off, which boots straight into TWRP
- Wrote a simple init.rc service called "alpine" that automatically starts the Alpine Linux container right after the Droidspaces daemon is ready - meaning Alpine boots automatically as part of the TWRP boot sequence
- Wrote an OpenRC service that watches for the wlan0 interface, brings it up, connects to the WiFi network, and assigns an IP - running as a daemon forever, handling hotplug and reconnection automatically
Final result: a fully functional Raspberry Pi-like device that powers on the moment a charger is detected, auto-boots Linux, and fires up SSH, Tailscale, and WiFi - all with only ~200MB of RAM usage.
This is what I call a proper server πΏ
[ Demonstration, init Script ]
@Droidspaces
π₯13β€6πΏ2π₯°1π©1
Do you want a "Privileged/F*ck Security" mode? Runs the container with zero restrictions: no seccomp, no cap drops, no masking, just execute init with maximum permissions. Perfect for recovery mode!
Anonymous Poll
25%
No
85%
Yes
π6π©1
Droidspaces
Direct display output π Basically, another way to run Android on Linux π
Proof of concept.
Booting Linux from Android recovery with direct display output. Works in stock recoveries, too.
Booting Linux from Android recovery with direct display output. Works in stock recoveries, too.
π€―5β€1π©1
Droidspaces
Droidspaces OS wen ? π³
This media is not supported in your browser
VIEW IN TELEGRAM
Demonstration π₯
π₯11π±2π©1
π₯9π1π©1
Accidentally booted desktop environment using my crappy project on android recovery π
π₯25π©1πΏ1