Remote Work Tools

A portable coding workstation lets you work from home, a co-working space, or anywhere else without losing productivity. The key constraint is setup time: a good portable setup goes from bag to working in under 5 minutes, not 20. This guide covers the hardware choices and software configuration to achieve that.

Table of Contents

The Core Constraint: 5-Minute Setup

If your portable setup takes 20 minutes to assemble, you’ll stop using it. The goal is: open bag, plug in one or two cables, open laptop, start working.

What makes setup fast:

Laptop

For most engineers in 2026, a MacBook Pro M3 or M4 is the default choice for portable development. The M4 Pro’s battery life (14-18 hours under load) means you can work all day without a charger at a cafe.

Minimum specs for comfortable development:

Windows alternatives: ThinkPad X1 Carbon Gen 12 or Dell XPS 13 with 32GB RAM. Both are 1.1-1.2kg.

The Hub: The Center of the Setup

A quality Thunderbolt hub is the most important component:

Laptop (one Thunderbolt cable)
    ↓
Hub (CalDigit TS4 or OWC Thunderbolt Dock)
    ├── Power delivery to laptop (96W+)
    ├── Monitor (HDMI/DisplayPort)
    ├── USB-A: keyboard receiver
    ├── USB-A: mouse receiver or USB drive
    ├── Ethernet (via hub's RJ45)
    └── SD card reader

Recommended hubs:

Hub Ports Laptop Power Price
CalDigit TS4 18 ports 98W $250
OWC Thunderbolt 4 Hub 11 ports 60W $150
Anker Thunderbolt 4 Mini 10 ports 85W $140
Plugable TBT4-HUB3C 4 Thunderbolt ports 96W $130

For most engineers, the Anker or Plugable gives the right balance of ports and portability. The CalDigit is excellent but heavy for travel.

Portable Monitor

A secondary monitor doubles productivity for most engineers. The portable monitor market has improved dramatically:

Best options:

Monitor Size Resolution Weight Price
ASUS ZenScreen MB16QHG 16” 2560x1600 0.9kg $280
LG Gram +view 16 16” 2560x1600 0.8kg $250
Samsung M8 (32”) 32” 4K 6.4kg $700

For travel: 16” IPS portable monitor powered by USB-C (no separate power brick).

For a hotel desk: any monitor + your hub works fine since you’re not carrying it.

# macOS: arrange displays via command line for consistent setup
# Install displayplacer: https://github.com/jakehilborn/displayplacer
brew install jakehilborn/jakehilborn/displayplacer

# Save your current arrangement
displayplacer list

# Output: something like:
# displayplacer "id:37D8832A-2D66-02CA-B9F7-8F30A301B230 res:2560x1600 ..."
# "id:6CF5E21E-18CF-4E28-AEF7-C53ADE7FC476 res:2560x1600 ..."

# Create a script to restore arrangement
cat > ~/bin/arrange-displays.sh << 'EOF'
#!/bin/bash
displayplacer "id:37D8832A... res:2560x1600 hz:60 color_depth:8 enabled:true scaling:on origin:(0,0) degree:0" \
              "id:6CF5E21E... res:2560x1600 hz:60 color_depth:8 enabled:true scaling:on origin:(2560,0) degree:0"
EOF
chmod +x ~/bin/arrange-displays.sh

Keyboard and Mouse

For portable work, the keyboard you carry determines your productivity:

Best portable keyboards:

Keyboard Keys Size Battery Price
Keychron K3 Max 75% Compact 4000mAh $100
Logitech MX Keys Mini 75% Compact Rechargeable $100
Apple Magic Keyboard 75% Compact Rechargeable $99

For a mouse: Logitech MX Anywhere 3 ($60) — works on any surface including glass, rechargeable, small enough for a bag.

Tip: Use the Logi Bolt USB receiver (not Bluetooth) for keyboard + mouse. Plug the receiver into your hub — one less pairing to do at each new location.

Software: Making Any Machine Home

The second half of a portable setup is your environment being identical everywhere you go.

Dotfiles with chezmoi:

# On any new machine, restore your full config in minutes
sh -c "$(curl -fsLS get.chezmoi.io)"
chezmoi init https://github.com/yourusername/dotfiles.git
chezmoi apply

# This restores: shell config, git config, vim/neovim, tmux, etc.

Development environments with mise:

# Install mise (manages Node, Python, Go, Rust, etc.)
curl https://mise.run | sh
eval "$(~/.local/bin/mise activate zsh)"

# Your .mise.toml in each project specifies exact versions
# On a new machine: cd project && mise install

Cloud-synced state:

# 1Password for secrets (never store in dotfiles)
brew install 1password-cli
eval $(op signin)
# Use: op read "op://Private/AWS/access-key-id"

# SSH keys via 1Password SSH agent (no key files to sync)
# Add to ~/.ssh/config:
# Host *
#   IdentityAgent "~/Library/Group Containers/.../T/agent.sock"

# Git config
git config --global user.name "Your Name"
git config --global user.email "you@company.com"
git config --global core.sshCommand "ssh"
# 1Password handles authentication via SSH agent

The Bag

The bag is part of the setup. Everything should fit in one carry-on sized bag:

What to include:
- Laptop
- Laptop charger (45-96W USB-C, compact)
- Hub
- Portable monitor (in sleeve)
- HDMI/DP cable (1m)
- USB-C to USB-C cable (1m, 100W rated)
- Keyboard
- Mouse + USB receiver
- USB-A to USB-C adapter (for USB-A peripherals)
- 3.5mm audio adapter
- Ethernet cable (1m flat cable — takes less space)

What NOT to include:
- Multiple charging bricks (hub charges laptop; laptop charges phone)
- Display adapters (buy one per location or use hub's port)

Bag recommendation: Peak Design Everyday Backpack 20L or Knomo Harpsden 14”. Both have laptop sleeves with padding and organized pockets.

Location Setup Checklist

# Script to verify your setup works at a new location
cat > ~/bin/check-setup.sh << 'EOF'
#!/bin/bash
echo "=== Portable Setup Check ==="
echo "Network:"
ping -c 1 8.8.8.8 > /dev/null && echo "  Internet: ✓" || echo "  Internet: ✗"
networksetup -getinfo Ethernet | grep "IP address" | head -1

echo "Displays:"
system_profiler SPDisplaysDataType 2>/dev/null | grep "Resolution" | head -3

echo "Tools:"
mise --version && echo "  mise: ✓" || echo "  mise: ✗"
1password-cli --version 2>/dev/null && echo "  1Password CLI: ✓" || echo "  1Password CLI: needs sign-in"
docker info > /dev/null 2>&1 && echo "  Docker: ✓" || echo "  Docker: ✗"
EOF
chmod +x ~/bin/check-setup.sh

Power Management on Portable Setups

Battery life is critical for true portability. Optimize your system:

# macOS battery optimization
# Settings → Battery → Options:
- Low Power Mode: Keep enabled (reduces performance 10-15%)
- Disable background app refresh
- Reduce screen brightness below 40%
- Turn off Bluetooth when not needed

# Verify battery estimates
pmset -g batt  # Shows current drain rate in mW

# Disable power-hungry processes
# Top energy consumers on dev machines:
- Docker: Consume massive power (50-100W when active)
  Solution: Stop Docker when not coding
- Xcode compilation: Runs on battery even during background indexing
  Solution: Open Activity Monitor → CPU tab, kill Xcode if idle
- Chrome: Each tab uses 2-5W (especially video)
  Solution: Use Safari for video, limit open tabs

# Travel power profile (battery conservation)
cat >> ~/.zshrc << 'EOF'
function travel-mode() {
    pmset -c displaysleep 10
    pmset -c sleep 30
    pmset -b displaysleep 3
    pmset -b sleep 5
    defaults write NSGlobalDomain NSWindowShouldDragOnGesture -bool NO
    echo "Travel mode: aggressive power saving enabled"
}
EOF

Display Configuration for Different Scenarios

Portable setups often involve different display arrangements (hotel room, coffee shop, office). Automate display configuration:

# macOS: Create display profiles for different locations
# Using displayplacer (install: brew install jakehilborn/jakehilborn/displayplacer)

# Get current setup
displayplacer list > ~/display_profiles.txt

# Save three common configurations
# Config 1: Just laptop screen (no external monitor)
displayplacer "id:37D8832A res:1728x1117 hz:60 color_depth:8 scaling:on origin:(0,0)"

# Config 2: Laptop + portable monitor (hotel desk)
displayplacer "id:37D8832A res:1728x1117 hz:60 color_depth:8 scaling:on origin:(0,0)" \
              "id:6CF5E21E res:2560x1600 hz:60 color_depth:8 scaling:on origin:(1728,0)"

# Config 3: Laptop only, mirrored (conference room presenting)
displayplacer --mirrors active

# Create aliases for quick switching
cat >> ~/.zshrc << 'EOF'
alias dsp-single='displayplacer "id:37D8832A res:1728x1117 hz:60"'
alias dsp-dual='displayplacer "id:37D8832A res:1728x1117 hz:60" "id:6CF5E21E res:2560x1600 hz:60"'
EOF

Network Optimization for Portable Work

Different networks have different characteristics. Prepare your system:

# Detect network quality and adapt
cat > ~/bin/network-check.sh << 'EOF'
#!/bin/bash

echo "=== Network Quality Check ==="

# Latency test
LATENCY=$(ping -c 1 8.8.8.8 | grep time | awk '{print $4}' | cut -d'=' -f2)
echo "Latency: $LATENCY ms"

# Bandwidth test (requires iperf or speedtest)
# speedtest-cli --simple

# DNS resolution time
NSLOOKUP_TIME=$(time nslookup github.com 8.8.8.8 2>&1 | grep real)
echo "DNS: $NSLOOKUP_TIME"

# Packet loss
LOSS=$(ping -c 10 8.8.8.8 | grep % | awk '{print $6}')
echo "Packet loss: $LOSS"

# Determine if network is usable for video calls
if [[ $LATENCY > "100" ]] || [[ $LOSS > "5%" ]]; then
    echo "⚠️  Network quality poor — avoid video calls"
    echo "💡 Recommendation: Use phone for calls, save video for later"
else
    echo "✅ Network acceptable for video"
fi
EOF
chmod +x ~/bin/network-check.sh

Portable Setup Productivity Tips

Context switching overhead: Moving between locations takes mental energy. Minimize it:

# Startup routine (save as shell script)
cat > ~/bin/setup-work.sh << 'EOF'
#!/bin/bash

echo "=== Portable Work Setup ==="

# 1. Network check
~/bin/network-check.sh

# 2. Display configuration
dsp-dual  # Or dsp-single depending on location

# 3. GitHub status
git status
git pull origin main

# 4. Open work tools
open -a "VS Code"
open -a "Terminal"
open https://github.com/[org]/[repo]
open https://slack.com/

# 5. Set status in Slack
# (manual, but remember to do it)

echo "✅ Ready to work"
EOF
chmod +x ~/bin/setup-work.sh

Handling Common Portable Work Issues

Issue Symptom Solution
Monitor not detected External display doesn’t show up Try different USB-C port, restart hub, restart Mac
Hub overheating Hub gets hot during use Ensure ventilation, reduce number of high-power devices
Keyboard/mouse lag Wireless peripherals respond slowly Switch to USB receiver (not Bluetooth), reduce wireless interference
Battery drains in 30 min Should last 6+ hours Run pmset -g batt to check power drain, kill heavy apps
Can’t wake from sleep System doesn’t respond after hibernation Check USB dongle connection, restart hub
File sync issues Changes not syncing to cloud Check network connection, verify sync app is running

Comparison: Different Portability Approaches

Approach Setup Time Productivity Network Dependency Cost
Laptop only <5 min 7/10 (cramped screen) Moderate $0
Laptop + portable monitor 8-12 min 8.5/10 (good ergonomics) Moderate $250-400
Cloud dev environment (browser-based) 2 min 7/10 (latency issues) High $20-50/mo
Remote dev server (SSH) 5-10 min 8/10 (depends on server power) High $50-200/mo
Portable desktop setup (full hub) 15-20 min 9/10 (near-desktop performance) Moderate $400-600

For most engineers: laptop + portable monitor hits the productivity/friction sweet spot.

Security Considerations for Portable Work

Working from different networks and locations introduces security risks:

# Pre-travel security checklist
- [ ] Enable FileVault (macOS) or BitLocker (Windows)
- [ ] Ensure SSH keys are in 1Password or similar (not local files)
- [ ] Git credential stored in 1Password, not local git config
- [ ] VPN client installed and configured
- [ ] Two-factor authentication enabled on all accounts
- [ ] Screensaver enabled (2 min timeout)
- [ ] Firewall enabled
- [ ] Disk encryption enabled

# Portable work network rules
- Never join networks without VPN
- Avoid public WiFi for sensitive work (code review, secrets access)
- Use VPN even on "trusted" networks (hotel WiFi, airport)
- Disable Bluetooth and AirDrop when not in use
- Keep laptop in sight when taking breaks

# Public WiFi workflow
1. Connect to WiFi
2. Start VPN immediately (before opening email or work apps)
3. If VPN drops, kill internet-dependent apps
4. Reconnect VPN before resuming