Build Guide
Step-by-step assembly from unboxing to first SSH session. This guide assumes you've read the other sections and have all components ready.
Build Checklist
Before starting, verify you have everything:
# HARDWARE [ ] Sony Xperia 10 V (XQ-DC54) [ ] Compact mechanical keyboard (60% or similar) [ ] USB-C hub or OTG adapter [ ] USB-C cable (for keyboard, if wired) [ ] Screen protector (recommended) # CHASSIS (choose one) [ ] 3D printed parts + hardware [ ] Printed shells (phone mount, keyboard tray) [ ] M3 screws and heat-set inserts [ ] Magnets (if using magnetic closure) [ ] CNC wood parts + hardware [ ] Machined wood shells [ ] Laptop hinges (×2) [ ] Neodymium magnets (8×) [ ] M3/M4 screws for hinges [ ] Wood finish (oil/lacquer) # SOFTWARE/ACCOUNTS [ ] Jolla account [ ] Sailfish X licence purchased [ ] Sailfish OS image downloaded [ ] Sony AOSP binaries downloaded [ ] Bootloader unlock code from Sony [ ] Anthropic account (for Claude Code) [ ] Bastion server ready (see bastion.html) [ ] Tailscale account (optional but recommended) # TOOLS [ ] Computer for flashing (Windows/Mac/Linux) [ ] USB-C data cable (phone to computer) [ ] Screwdrivers (for chassis assembly) [ ] Soldering iron (for heat-set inserts, if 3D printed)
Phase 1: Phone Preparation
Initial Android Setup
Unbox the Xperia 10 V and complete basic Android setup. Insert your SIM card and verify:
- Phone calls work (make a test call)
- Mobile data works
- WiFi connects properly
- Android version is 13 or 14 (Settings → About Phone)
If Android is older, update via Settings → System → Software update before proceeding.
Note Down IMEI
Go to Settings → About Phone and write down your IMEI number. You'll need this for the bootloader unlock code. If there are two IMEI numbers (dual SIM), use IMEI #1.
Apply Screen Protector
Apply a tempered glass screen protector now, before the chassis makes it awkward. Clean the screen thoroughly first. This protects during assembly and daily use.
Phase 2: Flash Sailfish OS
Enable Developer Options
On the phone:
- Settings → About Phone
- Tap "Build number" 7 times
- Go back to Settings → System → Developer options
- Enable "OEM unlocking"
- Enable "USB debugging"
Get Bootloader Unlock Code
Visit Sony Developer World:
- Select "Xperia 10 V"
- Enter your IMEI
- Accept terms
- Copy the unlock code provided
Unlocking the bootloader voids Sony's warranty and permanently trips the DRM flag, which disables some camera processing features. This is irreversible.
Prepare Flash Files
On your computer:
- Download Sailfish OS image from Jolla Shop (requires login)
- Extract to a folder (e.g.,
~/sailfish) - Download Sony binaries:
SW_binaries_for_Xperia_Android_14_5.4_v3a_zambezi.zip - Extract and copy the .img file to the Sailfish folder
Flash Sailfish OS
- Power off the phone completely
- Hold Volume Up and connect USB cable
- Wait for blue LED (if green, disconnect and retry)
- On computer, navigate to Sailfish folder
- Run the flash script:
# Linux/Mac ./flash.sh # Windows flash-on-windows.bat
- Follow prompts, enter unlock code when asked
- Wait for flashing to complete (~5 minutes)
Complete Sailfish Setup
- Disconnect USB and reboot the phone
- You'll see the unlocked bootloader warning (ignore it)
- Sailfish OS logo appears
- Follow the setup wizard
- Sign in with your Jolla account to enable Android support
- Restart the phone once to activate all services
Phase 3: Configure Sailfish
Enable Developer Mode
- Settings → Developer tools → Developer mode
- Set a password for remote SSH access
- Terminal app appears in your app drawer
Install Essential Packages
Open Terminal and run:
devel-su pkcon refresh pkcon install openssh-clients zypper install mosh tmux vim git curl
Generate SSH Keys
ssh-keygen -t ed25519 -C "cyberdeck@sailfish" cat ~/.ssh/id_ed25519.pub # Copy this public key - you'll add it to your bastion
Configure SSH
Create ~/.ssh/config:
vim ~/.ssh/config Host bastion HostName 100.x.x.x # Your bastion's Tailscale IP User your-username IdentityFile ~/.ssh/id_ed25519
Install Tailscale (Optional)
Check Chum repository for Tailscale package, or install manually. Authenticate to join your Tailnet.
Phase 4: Bastion Setup
Prepare Bastion Server
On your bastion server (see Bastion Server for details):
- Install and configure SSH, tmux, mosh
- Add your cyberdeck's public key to
~/.ssh/authorized_keys - Install Tailscale and join your Tailnet
- Install Claude Code
Test Connection
From the Xperia (before chassis assembly):
# Test SSH ssh bastion # Test mosh mosh bastion # Test full workflow mosh bastion -- tmux new -s test claude # Ctrl-a d to detach
If everything connects, the software stack is ready. Time to build the hardware.
Phase 5: Chassis Assembly
Follow either the 3D printed or CNC wood assembly steps below, depending on your chassis choice.
Option A: 3D Printed Chassis
Print Parts
- Print phone mount shell (PETG recommended)
- Print keyboard tray shell
- Print hinge components (if not using hardware hinges)
- Use settings from Chassis Design page
Install Hardware
- Install heat-set inserts with soldering iron
- Press-fit or glue magnets (check polarity!)
- Test fit phone and keyboard before final assembly
- Assemble hinge mechanism
- Route USB cable through channel
Option B: CNC Wood Chassis
Machine Parts
- CNC both shells from wood stock
- Sand progressively: 120 → 180 → 240 → 320 grit
- Apply finish (Danish oil, tung oil, or lacquer)
- Allow finish to fully cure (24-48 hours)
Install Hardware
- Install threaded inserts for hinge screws (if using)
- Epoxy magnets into pockets — test polarity first!
- Mount laptop hinges to both shells
- Test open/close action, adjust if needed
- Route and secure USB cable
Phase 6: Final Assembly
Install Components
- Place keyboard in tray, secure if needed
- Connect USB cable to keyboard
- Position USB hub in its pocket/mount
- Place phone in mount
- Connect hub to phone
- Verify keyboard works
Test Everything
# Open cyberdeck in typing position # Open Terminal app on phone # Test keyboard input echo "Hello from cyberdeck" # Connect to bastion mosh bastion -- tmux attach -t main # Start Claude Code claude # Congratulations! 🎉
Troubleshooting
Keyboard Not Recognised
- Check USB hub is connected properly
- Try a different USB port on the hub
- Test with a different cable
- Check
dmesg | tail -20for USB errors
SSH Connection Fails
- Verify bastion is reachable:
ping bastion - Check Tailscale status:
tailscale status - Verify SSH key is in bastion's authorized_keys
- Try verbose mode:
ssh -v bastion
Mosh Won't Connect
- Mosh must be installed on both devices
- UDP ports 60000-61000 must be open on bastion
- Fall back to SSH if network blocks UDP
Chassis Fit Issues
- 3D printed: Adjust tolerances in CAD, reprint affected parts
- Wood: Sand or file for better fit
- Add felt/foam padding for snug fit without scratching
What's Next?
Your Sailfish Cyberdeck is complete! Some ideas for further development:
- Custom terminal themes — Match the terminal colours to the chassis aesthetic
- Shell scripts — Automate common workflows
- Backup setup — Script to backup configs and SSH keys
- Battery monitoring — Script to alert on low battery
- Second bastion — Failover server for redundancy
- Carry case — Protective case for transport