diff --git a/sync/sync.go b/sync/sync.go
index 86f4d94..d94c3cc 100644
--- a/sync/sync.go
+++ b/sync/sync.go
@@ -31,11 +31,66 @@
 package sync
 
 import (
+	"fmt"
+	"regexp"
+	"strings"
+	"os"
+	"path/filepath"
 	"github.com/arduino/go-properties-orderedmap"
 	discovery "github.com/arduino/pluggable-discovery-protocol-handler/v2"
 	"go.bug.st/serial/enumerator"
 )
 
+var loaded = false
+var filter = ""
+
+func load() string {
+	if loaded {
+		return filter
+	}
+
+	loaded = true
+	thepath, err := filepath.Abs(filepath.Dir(os.Args[0]))
+
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Error: %s\n", err.Error())
+		return filter
+	}
+
+	data, err := os.ReadFile(filepath.Join(thepath, "skip.txt"))
+
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Error: %s\n", err.Error())
+		return filter
+	}
+
+	filter = strings.Trim(string(data), " \t\r\n")
+
+	return filter
+}
+
+func filterValid(ports []*enumerator.PortDetails) (ret []*enumerator.PortDetails) {
+	filter := load()
+
+	if len(filter) <= 0 {
+		ret = ports
+		return
+	}
+
+	for _, port := range ports {
+		if isValid(port, filter) {
+			ret = append(ret, port)
+		}
+	}
+	return
+}
+
+func isValid(port *enumerator.PortDetails, filter string) bool {
+	match, _ := regexp.MatchString(filter, port.Name)
+
+	return !match;
+}
+
 // nolint
 // processUpdates sends 'add' and 'remove' events by comparing two ports enumeration
 // made at different times:
diff --git a/sync/sync_darwin.go b/sync/sync_darwin.go
index c39ac52..abae634 100644
--- a/sync/sync_darwin.go
+++ b/sync/sync_darwin.go
@@ -64,6 +64,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch
 			errorCB(err.Error())
 			return
 		}
+
+		current = filterValid(current)
+
 		for _, port := range current {
 			eventCB("add", toDiscoveryPort(port))
 		}
@@ -98,6 +101,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch
 					enumeratorErr = err
 					break
 				}
+
+				updates = filterValid(updates)
+
 				processUpdates(current, updates, eventCB)
 				current = updates
 			}
diff --git a/sync/sync_linux.go b/sync/sync_linux.go
index 9018318..57b0a9c 100644
--- a/sync/sync_linux.go
+++ b/sync/sync_linux.go
@@ -36,6 +36,8 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch
 		return nil, err
 	}
 
+	current = filterValid(current)
+
 	// Start sync reader from udev
 	syncReader, err := uevent.NewReader()
 	if err != nil {
@@ -78,6 +80,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch
 				if err != nil {
 					continue
 				}
+
+				portList = filterValid(portList)
+
 				for _, port := range portList {
 					if port.IsUSB && port.Name == changedPort {
 						eventCB("add", toDiscoveryPort(port))
diff --git a/sync/sync_windows.go b/sync/sync_windows.go
index 9dd3bee..a399f6a 100644
--- a/sync/sync_windows.go
+++ b/sync/sync_windows.go
@@ -120,6 +120,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch
 			errorCB(fmt.Sprintf("Error enumerating serial ports: %s", err))
 			return
 		}
+
+		current = filterValid(current)
+
 		for _, port := range current {
 			eventCB("add", toDiscoveryPort(port))
 		}
@@ -140,6 +143,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch
 				errorCB(fmt.Sprintf("Error enumerating serial ports: %s", err))
 				return
 			}
+
+			updates = filterValid(updates)
+
 			processUpdates(current, updates, eventCB)
 			current = updates
 		}