# Bluetooth keeps disconnecting - reconnecting

Solution: Change config in /etc/bluetooth/main.conf
`ControllerMode = bredr`
Then `sudo systemctl restart bluetooth`

UPDATE: It's still not fixed :(
Trying `yay -S pipewire wireplumber`
TODO test it again

# Touchpad scroll direction (libinput)

To change touchpad scroll direction on Arch Linux using libinput driver:

## Investigation steps:
1. Check which driver is used: `pacman -Q | grep -E "(synaptics|libinput)"`
2. Verify libinput config exists: `ls /usr/share/X11/xorg.conf.d/ | grep libinput`

## Solution for libinput:
Create `/etc/X11/xorg.conf.d/30-touchpad.conf`:

```
Section "InputClass"
    Identifier "touchpad"
    Driver "libinput"
    MatchIsTouchpad "on"
    Option "NaturalScrolling" "true"
    Option "Tapping" "on"
    Option "TappingDrag" "on"
    Option "DisableWhileTyping" "on"
EndSection
```

Set `NaturalScrolling` to:
- `"true"` for macOS-style (natural) scrolling
- `"false"` for traditional scrolling

Restart X11 (log out/in) or reboot to apply changes.

## Alternative: Synaptics driver (legacy)

If using the older synaptics driver instead of libinput:

### Investigation steps:
1. Check for synaptics: `pacman -Q xf86-input-synaptics`
2. Look for config: `ls /usr/share/X11/xorg.conf.d/ | grep synaptics`

### Solution:
Create `/etc/X11/xorg.conf.d/70-synaptics.conf`:

```
Section "InputClass"
    Identifier "touchpad"
    Driver "synaptics"
    MatchIsTouchpad "on"
    MatchDevicePath "/dev/input/event*"
    Option "VertScrollDelta" "-111"
    Option "HorizScrollDelta" "-111"
    Option "TapButton1" "1"
    Option "TapButton2" "3"
    Option "TapButton3" "2"
    Option "PalmDetect" "1"
    Option "SHMConfig" "on"
EndSection
```

Synaptics scroll direction options:
- `VertScrollDelta` and `HorizScrollDelta`:
  - Positive values (e.g., `"111"`) for traditional scrolling
  - Negative values (e.g., `"-111"`) for natural/reversed scrolling

**Note:** libinput is the modern standard. Consider switching from synaptics to libinput for better support and features.

# Theme switching issues

## Cross-application theme synchronization

**Issue:** Need to synchronize theme (light/dark) across tmux, nvim, and other terminal applications.

**Solution:** File-based theme management system using `~/.vim_theme`:

### Setup:

1. **Create theme switcher script** (`~/.config/tmux/themeswitch.sh`):
```bash
#!/bin/bash
if [ -f ~/.vim_theme ] && [ "$(cat ~/.vim_theme)" = "light" ]; then
    tmux set -g @catppuccin_flavor "latte"
else
    tmux set -g @catppuccin_flavor "mocha"
fi
```

2. **Add to tmux config** (`~/.config/tmux/tmux.conf`):
```bash
# Dynamic theme switching based on ~/.vim_theme file
run 'bash ~/.config/tmux/themeswitch.sh'
```

3. **Add to shell config** (`~/.zshrc`):
```bash
# Export THEME environment variable for nvim and other apps
if [ -f ~/.vim_theme ]; then
    export THEME=$(cat ~/.vim_theme)
else
    export THEME="dark"  # default
fi
```

### Usage:
```bash
# Switch to light theme
echo "light" > ~/.vim_theme

# Switch to dark theme
echo "dark" > ~/.vim_theme
```

### Benefits:
- ✅ **Single source of truth:** `~/.vim_theme` file controls all applications
- ✅ **Automatic propagation:** New terminals inherit theme via shell config
- ✅ **No environment variable issues:** File-based approach avoids tmux env var propagation problems
- ✅ **Cross-application support:** nvim reads `$THEME`, tmux uses catppuccin flavors

### Limitations:
- **Tmux live reload:** Changes require tmux config reload or session restart
- **Workaround:** Use tmux-resurrect to quickly restore sessions after restart

## Legacy: Tmux and terminal not updating after theme switch

**Issue:** After running the theme switcher script, tmux sessions and existing terminals don't reflect the new theme until restarted.

**Temporary workaround:**
- Restart tmux sessions: `tmux kill-server && tmux`
- Open new terminal windows

**Status:** ✅ **Solved** - Use file-based theme management system above

## Tmux window names showing hostname instead of command

**Issue:** Tmux windows show "homelab" (hostname) for inactive tabs but correct command names for active tabs.

**Root cause:** Catppuccin tmux theme with `@catppuccin_window_tabs_enabled on` uses different text formatting for active vs inactive windows.

**Solution:** Disable catppuccin window tabs:
```
set -g @catppuccin_window_tabs_enabled off
```

**Alternative:** Configure explicit window text for both states:
```
set -g @catppuccin_window_default_text "#W"
set -g @catppuccin_window_current_text "#W"
```

Also ensure automatic renaming is enabled:
```
setw -g automatic-rename on
setw -g allow-rename on
```

# Font and Unicode Display Issues

## Missing emoji and unicode symbols

**Issue:** Emojis show as boxes or missing characters, unicode symbols don't display properly.

**Solution:** Install comprehensive unicode font packages:
```bash
sudo pacman -S noto-fonts-emoji noto-fonts-extra
fc-cache -f
```

## Nerd Font icons not displaying

**Issue:** Developer icons (programming languages, git symbols, file types) show as blank spaces or boxes.

**Root cause:** Terminal emulator not configured to use Nerd Font as primary font.

**Solution:**
1. Install Nerd Fonts:
```bash
sudo pacman -S ttf-iosevkaterm-nerd ttf-jetbrains-mono-nerd
fc-cache -f
```

2. Configure terminal to use Nerd Font as primary font
3. For wezterm, ensure config includes:
```lua
config.font = wezterm.font_with_fallback {
    'IosevkaTerm Nerd Font',
    'JetBrainsMono Nerd Font Mono',
    'Noto Color Emoji'
}
```

**Testing:** Use printf with direct codepoints:
```bash
printf "Icons: \\ue702 \\uf121 \\uf015 \\uf07b\\n"
```

## Ancient/exotic script support

**Comprehensive coverage achieved with:**
- `noto-fonts` (base unicode)
- `noto-fonts-cjk` (Chinese/Japanese/Korean)
- `noto-fonts-emoji` (color emoji)
- `noto-fonts-extra` (additional scripts)

Successfully displays: Egyptian hieroglyphs, Cuneiform, Nordic runes, Hungarian rovás, Arabic, Chinese, Japanese, Korean, Thai, Hindi, Hebrew, Greek, Tamil.

# Cannot tile windows by drag and dropping

Keyboard workaround: Go to  Settings > Window Manager > Keyboard, set up tiling shortcuts (set to Super+arrow keys)

# Additional Known Issues (TODO Items)

## Tmux battery indicator missing until config reload

**Issue:** Battery indicator doesn't appear in tmux status line immediately after starting tmux.

**Temporary workaround:** Reload tmux config with `Prefix + r` or restart tmux session.

**Status:** Investigation needed

## TTY fallbacks needed

**Issue:** When not in X11/graphical mode, nvim and tmux need proper fallback configurations.

**Status:** Completed

**Solutions implemented:**
- ✅ **nvim:** TTY detection and color scheme fallback configured
- ✅ **Font:** Selected ter-124b (12x24 bold) for good readability
- ✅ **Keyboard:** Colemak layout with caps lock remapped to backspace
- ✅ **Caps lock fix:** Uses systemd service with `setkeycodes 3a 14`

**Configuration files:**
- `/etc/systemd/system/caps-backspace.service` - Permanent caps lock remapping
- TTY font testing script: `~/.local/scripts/test-fonts.sh`

## TTY Caps Lock Not Working as Backspace

**Issue:** With colemak keymap loaded, caps lock acts like Control instead of backspace in TTY.

**Root cause:** Colemak keymap maps caps lock to Control, which conflicts with tmux navigation keys.

**Solution:** Use `setkeycodes` to remap at scancode level:
```bash
sudo setkeycodes 3a 14  # Map caps lock scancode to backspace keycode
```

**Permanent fix:** Systemd service created at `/etc/systemd/system/caps-backspace.service`

## Laptop sleeps when lid is closed

Solution:

sudo nvim /etc/systemd/logind.conf

Uncomment and change these lines:

```
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
```

Then restart service:
`sudo systemctl restart systemd-logind`

## IP addresses keep changing

Due to 3 interfaces:
* Wifi
* Ethernet left port (ThinkPad adapter) - Wired Connection 1
* Ethernet right port (regular ethernet cable) - Wired Connection 2

### Proposed solution

* Stick with wired2

● Configure static IP for "Wired connection 2" (enp4s0):

  * Set static IP to 192.168.0.100
  sudo nmcli connection modify "Wired connection 2" \
      ipv4.method manual \
      ipv4.addresses 192.168.0.100/24 \
      ipv4.gateway 192.168.0.1 \
      ipv4.dns 192.168.0.1

  * Apply the changes
  sudo nmcli connection up "Wired connection 2"

  Then configure WiFi with the same static IP:

  * First connect to your WiFi if not already
  sudo nmcli connection up "Telekom-4b28df-2.4GHz"

  * Set same static IP for WiFi
  sudo nmcli connection modify "Telekom-4b28df-2.4GHz" \
      ipv4.method manual \
      ipv4.addresses 192.168.0.100/24 \
      ipv4.gateway 192.168.0.1 \
      ipv4.dns 192.168.0.1

  Verify the configuration:
  nmcli connection show "Wired connection 2" | grep ipv4
  ip addr show enp4s0

  This way both your ethernet (enp4s0) and WiFi will use 192.168.0.100, solving your dual interface IP issue.
  Ready to run these commands?

# Homelab Service Issues

## Landing Page Returns 404 Not Found

**Issue:** Landing page at `https://ak-homelab.duckdns.org/` returns 404 Not Found despite nginx running and other services working.

**Symptoms:**
- Landing page returns 404 Not Found
- Nginx logs show attempts to access `/etc/nginx/html/index.html` instead of `/var/www/homelab/index.html`
- Custom 404 pages work but main index doesn't load
- Services like `/gitea/`, `/files/`, `/media/` work correctly

**Root Cause:**
1. Default server block in `/etc/nginx/nginx.conf` conflicted with homelab configuration
2. Missing `default_server` directive in homelab server blocks
3. Incorrect location block (`location = /` vs `location /`)
4. Nginx not properly reloading configuration changes

**Resolution Steps:**
```bash
# 1. Comment out default server block in nginx.conf
sudo nano /etc/nginx/nginx.conf
# Comment out the entire server { listen 80; server_name localhost; ... } block

# 2. Add default_server directives to homelab config
sudo nano /etc/nginx/sites-available/homelab
# Change to: listen 80 default_server; and listen 443 ssl default_server;
# Add server_name ak-homelab.duckdns.org _; (underscore catches all)

# 3. Fix location block for root path
# Change from: location = / { ... }
# Change to:   location / { root /var/www/homelab; index index.html; try_files $uri $uri/ =404; }

# 4. Add custom error pages to prevent fallback
# Add: error_page 404 /404.html;
#      location = /404.html { root /var/www/homelab; internal; }

# 5. Test and restart (reload may not be sufficient)
sudo nginx -t
sudo systemctl restart nginx  # Use restart, not reload

# 6. Verify file permissions
sudo ls -la /var/www/homelab/index.html
# Should be readable by nginx user (http)
```

**Verification Commands:**
```bash
# Test HTTP redirect
curl -I http://192.168.0.100/

# Test HTTPS access
curl -I https://ak-homelab.duckdns.org/ --insecure

# Check active nginx configuration
sudo nginx -T | grep -A10 "server_name ak-homelab"

# Monitor real-time nginx logs
sudo journalctl -u nginx -f
```

**Final Working Configuration:**
- HTTP redirects properly to HTTPS (301 redirect)
- HTTPS returns 200 OK with full landing page HTML
- Security headers present (X-Frame-Options, X-Content-Type-Options, X-XSS-Protection)
- Custom error handling prevents fallback to default nginx errors

## SSL Certificate Breaks After Nginx Updates

**Issue:** HTTPS stops working after deploying nginx configuration changes from the repo.

**Root cause:** Certbot modifies the deployed nginx configuration directly (adding SSL blocks), but the repo only contains the base HTTP configuration. When deploying from repo, it overwrites certbot's SSL additions.

**Solution:**
```bash
# 1. Re-run certbot to restore SSL configuration
sudo certbot --nginx -d ak-homelab.duckdns.org --non-interactive

# 2. Copy complete config (with SSL blocks) back to repo
sudo cp /etc/nginx/sites-available/homelab config/nginx/homelab.conf

# 3. Commit updated config to prevent future issues
git add config/nginx/homelab.conf
git commit -m "Update nginx config with SSL configuration from certbot"
```

**Prevention:** Always copy deployed configurations back to repo after certbot runs to preserve SSL blocks.

## WebDAV Upload Error 301 (Moved Permanently)

**Issue:** WebDAV clients (X-plore, rclone) get HTTP 301 redirect errors when uploading files, even though browsing works fine.

**Root cause:** Nginx reverse proxy missing WebDAV-specific headers needed for upload operations.

**Solution:** Ensure nginx configuration includes WebDAV headers:
```nginx
location /files/ {
    proxy_pass http://127.0.0.1:8082/files/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    # WebDAV specific headers (REQUIRED for uploads)
    proxy_set_header Depth $http_depth;
    proxy_set_header Destination $http_destination;
    proxy_set_header Overwrite $http_overwrite;
    proxy_set_header If $http_if;
    
    proxy_request_buffering off;
}
```

**WebDAV Client Settings (X-plore):**
- URL: `https://ak-homelab.duckdns.org/files/` 
- Username: `hoborg`
- Password: `AdminPass2024!`
- Port: 443 (HTTPS)

## Media Files Not Syncing Between Copyparty and Jellyfin

**Issue:** Files uploaded to Copyparty don't appear in Jellyfin media library.

**Root cause:** Volume mount mismatch or Jellyfin not scanning new files.

**Troubleshooting:**
```bash
# 1. Verify volume mounts match
# Copyparty config: /home/hoborg/private -> /private
# Jellyfin config: /home/hoborg/private:/media/private:ro

# 2. Check file permissions
ls -la /home/hoborg/private/
# Files should be readable by user 1000:1000

# 3. Force Jellyfin library rescan
docker exec jellyfin curl -X POST "http://localhost:8096/Library/Refresh"

# 4. Check Jellyfin logs
docker-compose -f /opt/docker/jellyfin/docker-compose.yml logs jellyfin
```

## Service Deployment Best Practices

**To avoid common issues:**

1. **Always test nginx before reload:**
```bash
sudo nginx -t && sudo systemctl reload nginx
```

2. **Backup configs before changes:**
```bash
sudo cp /etc/nginx/sites-available/homelab /etc/nginx/sites-available/homelab.backup
```

3. **Use temporary scripts for multiple sudo commands:**
```bash
# Create script with all commands, then run once with sudo
echo "command1; command2; command3" > /tmp/deploy.sh
chmod +x /tmp/deploy.sh
sudo -A /tmp/deploy.sh
```

4. **Monitor service logs after changes:**
```bash
sudo systemctl status nginx copyparty
docker-compose -f /opt/docker/jellyfin/docker-compose.yml logs --tail 50
```

## Configuration Debugging Commands

### Nginx Configuration Analysis
```bash
# Show all active server blocks
sudo nginx -T | grep -A50 "server {"

# Find all nginx config files
sudo find /etc/nginx -name "*.conf" -exec grep -l "server_name\|listen.*80\|listen.*443" {} \;

# Check which server block is handling requests
sudo nginx -T | grep -A20 "location = /"

# Verify sites-enabled vs sites-available
sudo ls -la /etc/nginx/sites-enabled/
sudo ls -la /etc/nginx/sites-available/

# Test nginx config without reloading
sudo nginx -t
```

### File Permissions and Access
```bash
# Check file permissions for web content
sudo ls -la /var/www/homelab/
sudo -u http ls -la /var/www/homelab/  # Test as nginx user

# Check SSL certificate access
sudo ls -la /etc/letsencrypt/live/ak-homelab.duckdns.org/

# Verify configuration deployment
diff /home/hoborg/homelab/config/nginx/homelab.conf /etc/nginx/sites-available/homelab
```

### Real-time Debugging
```bash
# Monitor nginx logs in real-time
sudo journalctl -u nginx -f

# Monitor nginx logs since specific time
sudo journalctl -u nginx --since "10 minutes ago"

# Test with verbose curl output
curl -v https://ak-homelab.duckdns.org/ --insecure

# Check nginx worker processes
ps aux | grep nginx
```

### Service Status Verification
```bash
# Check all homelab services at once
sudo systemctl status nginx copyparty
docker-compose -f /opt/docker/gitea/docker-compose.yml ps
docker-compose -f /opt/docker/jellyfin/docker-compose.yml ps

# Quick connectivity test for all services
curl -I https://ak-homelab.duckdns.org/        # Landing page
curl -I https://ak-homelab.duckdns.org/gitea/  # Gitea
curl -I https://ak-homelab.duckdns.org/files/  # Copyparty
curl -I https://ak-homelab.duckdns.org/media/  # Jellyfin
```
