diff --git a/app/alter/main.go b/app/alter/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..e7134ff01486574909f0aa1c880a54a19cd2455f
--- /dev/null
+++ b/app/alter/main.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"log"
+
+	"0xacab.org/leap/vpn-hole/alter/alter"
+	"github.com/miekg/dns"
+
+	"time"
+)
+
+func init() {
+	// start the cmdline parser
+	alter.ParseFlags()
+
+}
+
+func main() {
+
+	// call ParseFlags() to get the config struct with the values
+	c := alter.ParseFlags()
+	fmt.Println(c)
+
+	// start the vpnhole
+	if err := c.Start(); err != nil {
+		log.Fatalln(fmt.Errorf("failed to start vpnhole: %w", err))
+	}
+	defer func() {
+		if err := c.Stop(); err != nil {
+			log.Println(fmt.Errorf("failed to stop vpnhole: %w", err))
+		}
+	}()
+	log.Printf("vpnhole started: %s", c)
+
+	subscriptions, err := ReadSubscriptions(c.SubscriptionsFilename)
+	if err != nil {
+		log.Fatalln(fmt.Errorf("failed to read subscriptions list: %w", err))
+	}
+
+	for _, blacklistURL := range subscriptions {
+		PrivBlacklist.Subscribe(blacklistURL)
+	}
+
+	ctx, cancel := context.WithCancel(context.Background())
+	defer cancel()
+
+	go PrivBlacklist.Watch(ctx, time.Minute*10)
+
+	dns.HandleFunc(".", Handler)
+
+	if err = dns.ListenAndServe(c.Addr, "udp", nil); err != nil {
+		log.Println(fmt.Errorf("failed to serve DNS server: %w", err))
+	}
+
+}
diff --git a/main.go b/main.go
deleted file mode 100644
index c43a73a6699cace4d868d3eac09204905f5ba264..0000000000000000000000000000000000000000
--- a/main.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package main
-
-import (
-	"context"
-	"flag"
-	"fmt"
-	"log"
-	"net/http"
-	"time"
-
-	"github.com/miekg/dns"
-)
-
-var httpClient = &http.Client{Timeout: 30 * time.Second}
-
-func main() {
-	var (
-		addr                  string
-		subscriptionsFilename string
-	)
-
-	flag.StringVar(&addr, "addr", ":53", "addr")
-	flag.StringVar(&upstream, "upstream", "1.1.1.1:53", "upstream")
-	flag.StringVar(&subscriptionsFilename, "subs", "subs.list", "subscriptions filename")
-	flag.Parse()
-
-	subscriptions, err := readSubscriptions(subscriptionsFilename)
-	if err != nil {
-		log.Fatalln(fmt.Errorf("Failed to read subscriptions list: %w", err))
-	}
-
-	for _, blacklistURL := range subscriptions {
-		privBlacklist.Subscribe(blacklistURL)
-	}
-
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-
-	go privBlacklist.Watch(ctx, time.Minute*10)
-
-	dns.HandleFunc(".", handler)
-
-	if err = dns.ListenAndServe(addr, "udp", nil); err != nil {
-		log.Println(fmt.Errorf("Failed to serve DNS server: %w", err))
-	}
-}