Manage Android devices declaratively using Nix-on-Droid, bringing the power of NixOS-style configuration to mobile devices.
Overview
Nix-on-Droid configurations are stored in the droids/ directory. Each directory is automatically discovered and exposed as a nixOnDroidConfiguration.
Prerequisites
Android Device Requirements
- Android device with ARM64 architecture (most modern devices)
- Termux installed from F-Droid (NOT Google Play Store)
- Storage permissions granted to Termux
- Stable internet connection
- At least 2GB free storage
Install Termux from F-Droid, not Google Play Store. The Play Store version is outdated and incompatible with Nix-on-Droid.
Initial Device Setup
Before deploying configurations, set up Nix-on-Droid on your device:
Install Termux
Download and install Termux from F-Droid. Grant storage permissions
In Termux, run:Grant permission when prompted. Install Nix-on-Droid
curl -fsSL https://raw.githubusercontent.com/nix-community/nix-on-droid/master/install.sh | bash
This installs Nix and sets up the Nix-on-Droid environment.Restart Termux
Close and reopen Termux to load the new environment.
Flake Configuration
The flake uses automatic discovery for Nix-on-Droid configurations:
nixOnDroidConfigurations = lib.mapAttrs mkDroid (lib.discover ./droids);
Each directory in droids/ is automatically available for deployment.
Architecture Settings
Nix-on-Droid configurations are built for aarch64-linux using the nixpkgs-droid input:
mkDroid = name: path: let
systemArch = "aarch64-linux";
pkgs = import nixpkgs-droid {
system = systemArch;
config.allowUnfree = true;
};
in
nix-on-droid.lib.nixOnDroidConfiguration {
inherit pkgs;
modules = droidModules ++ [path];
};
Deployment from Android Device
Deploy directly on the Android device itself.
Clone repository on device
In Termux:cd ~
git clone <your-repo-url> homelab
cd homelab
Deploy configuration
nix-on-droid switch --flake .#<device-name>
Replace <device-name> with your configuration name from droids/.
Deployment from Desktop
Build configurations on a desktop machine and deploy to the device.
Build on desktop
On your desktop/laptop:cd /path/to/homelab
nix build .#nixOnDroidConfigurations.<device-name>.activationPackage
Copy to device
Transfer the built configuration:# Find the result path
readlink -f result
# Copy via various methods:
# Method 1: Using adb
adb push result /data/data/com.termux/files/home/config
# Method 2: Using SSH (if configured)
scp -r result user@android-device:~/config
# Method 3: Via cloud storage or file sharing
# Upload result and download on device
Activate on device
In Termux on the Android device:
Configuration Structure
Each Nix-on-Droid configuration should be structured as:
droids/<device-name>/
├── default.nix # Main configuration
├── home.nix # Home Manager settings (optional)
└── packages.nix # Device-specific packages (optional)
Home Manager Integration
Nix-on-Droid includes integrated Home Manager support:
droidModules = [
self.droidModules.default
{
home-manager = {
useGlobalPkgs = true;
extraSpecialArgs = { inherit inputs self lib; isDroid = true; };
sharedModules = homeManagerModules;
backupFileExtension = "bak";
};
}
];
Your device configuration can include Home Manager modules:
# droids/phone/default.nix
{ pkgs, ... }:
{
# Nix-on-Droid settings
time.timeZone = "America/New_York";
# Home Manager settings
home-manager.config = { ... };
}
Common Configuration Examples
Basic Configuration
# droids/phone/default.nix
{ pkgs, ... }:
{
# Set timezone
time.timeZone = "America/New_York";
# Install packages
environment.packages = with pkgs; [
vim
git
htop
tmux
];
# User configuration
user.shell = "${pkgs.zsh}/bin/zsh";
}
With Home Manager
# droids/phone/default.nix
{ pkgs, ... }:
{
time.timeZone = "America/New_York";
environment.packages = with pkgs; [ vim git ];
home-manager.config = {
programs.zsh = {
enable = true;
enableCompletion = true;
syntaxHighlighting.enable = true;
};
programs.git = {
enable = true;
userName = "Your Name";
userEmail = "[email protected]";
};
};
}
Nix-on-Droid uses this flake reference:
Where:
. refers to the current directory (flake root)
# separates the flake reference from the output
<device-name> matches directory name in droids/
Rollback and Recovery
List Generations
nix-on-droid list-generations
Rollback to Previous Generation
Switch to Specific Generation
nix-on-droid switch --rollback --generation <number>
Troubleshooting
Installation Issues
Problem: Nix installation fails on Android
Solutions:
- Ensure Termux is from F-Droid
- Grant storage permissions
- Check internet connectivity
- Ensure sufficient storage space
- Try clearing Termux cache
Build Failures
Problem: Configuration fails to build
Solutions:
- Run
nix flake check first
- Verify architecture is
aarch64-linux
- Check that all packages support ARM64
- Review error messages for unsupported packages
- Test build on desktop:
nix build .#nixOnDroidConfigurations.<device-name>.activationPackage
Storage Issues
Problem: Running out of storage
Solutions:
# Clean old generations
nix-collect-garbage -d
# Check Nix store size
du -sh ~/.nix-profile
# Remove specific generations
nix-on-droid remove-generations 7d
Package Not Available
Problem: Package doesn’t work on Android
Solutions:
- Some packages don’t support ARM64 or Android
- Check if package is in
aarch64-linux cache
- Consider alternatives or building from source
- Review package meta.platforms
Initial builds on Android devices can be slow and battery-intensive. Consider building on a desktop and transferring the result.
Optimization Tips
-
Use Binary Caches: Configure substituters to avoid building on device
nix.extraOptions = ''
substituters = https://cache.nixos.org https://nix-community.cachix.org
'';
-
Minimize Packages: Only install essential packages on device
-
Build Remotely: Build on desktop when possible
-
Cleanup Regularly: Remove old generations to save space
Remote Access
Configure SSH for remote access to your Android device:
# droids/phone/default.nix
{ pkgs, ... }:
{
environment.packages = [ pkgs.openssh ];
# SSH daemon will be available in Termux
# Start with: sshd
}
Best Practices
- Test configurations on desktop first
- Keep device configs minimal
- Use binary caches to avoid local builds
- Regularly clean old generations
- Backup important data before major changes
- Monitor storage usage
- Keep Termux and Nix updated
Always run nix flake check before deploying to ensure configuration is valid. Failed deployments on Android can be harder to recover from.
Next Steps