I did, just to confirm, is this the place where you'd put it? # Create client config peers::create_client_config "$full_name" "$effective_type" "$ip" "$allowed_ips" || return 1 # Store subtype in meta if [[ -n "$subtype" ]]; then peers::set_meta "$full_name" "subtype" "$subtype" fi # Add peer to server config local public_key public_key=$(keys::public "$full_name") || return 1 peers::add_to_server "$full_name" "$public_key" "$ip" || return 1 # Determine rule — explicit flag > type default if [[ -z "$rule" ]]; then if config::is_guest_type "$type"; then rule="guest" else rule="user" fi fi # Validate rule if specified if [[ -n "$rule" ]] && ! rule::exists "$rule"; then log::error "Rule not found: ${rule}" return 1 fi log::wg_add "Rule: ${rule:-none}" # Apply presets for preset in "${presets[@]}"; do firewall::apply_preset "$preset" "${ip}" || return 1 done # Apply rule if [[ -n "$rule" ]]; then rule::apply "$rule" "$ip" || return 1 fi # Reload WireGuard peers::reload || return 1 log::wg_success "Client added successfully: ${full_name} (${ip}) [${tunnel} tunnel]" # Show QR for mobile by default, config for desktop/laptop local display_type="${subtype:-$type}" if cmd::add::is_mobile "$display_type"; then keys::qr "$full_name" else log::section "Client Config" cat "$(ctx::clients)/${full_name}.conf" fi } wgctl rule list ──────────────────────────────────────────────── Firewall Rules ──────────────────────────────────────────────── NAME DESCRIPTION ALLOWS BLOCKS PEERS /etc/wireguard/wgctl/commands/rule.command.sh: line 115: block_ips: command not found wgctl list root@wireguard:/# wgctl add --name test2 --type guest --subtype phone ──────────────────────────────────────────────── Adding client: guest-test2 ──────────────────────────────────────────────── => INFO: ➕ 🔒 Name: guest-test2 => INFO: ➕ 🔒 Type: guest => INFO: ➕ 🔒 IP: 10.1.103.2 => INFO: ➕ 🔒 Tunnel: split (10.1.0.0/16, 10.0.0.0/24) => INFO: 🔑 🔒 Generated key pair for: guest-test2 => INFO: ➕ 🔒 Created client config: guest-test2 (10.1.103.2) => INFO: ➕ 🔒 Added peer to server config: guest-test2 => INFO: ➕ 🔒 Rule: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.100/32 => INFO: 🚫 🔒 Persisted block rule for: 10.1.103.2 => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.105/32 => INFO: 🚫 🔒 Persisted block rule for: 10.1.103.2 => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.102/32 => INFO: 🚫 🔒 Persisted block rule for: 10.1.103.2 => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.103/32 => INFO: 🚫 🔒 Persisted block rule for: 10.1.103.2 => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.101/32 => INFO: 🚫 🔒 Persisted block rule for: 10.1.103.2 => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.200/32 => INFO: 🚫 🔒 Persisted block rule for: 10.1.103.2 => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.100:8006/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.100:22/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.105:8007/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.102:22/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.200:80/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.200:443/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.103:80/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.101:80/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.101:443/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 🚫 🔒 Blocked 10.1.103.2 → 10.0.0.210:9000/tcp => INFO: 🚫 🔒 Persisted block rule for: guest => INFO: 📋 🔒 Applied rule 'guest' to: 10.1.103.2 => SUCCESS: ✅ 🔒 WireGuard config reloaded => SUCCESS: ✅ 🔒 Client added successfully: guest-test2 () [split tunnel] => INFO: 📱 🔒 QR code for: guest-test2