diff --git a/kotlin/android/PortalMock/.tool-versions b/kotlin/android/PortalMock/.tool-versions
deleted file mode 100644
index 059ca477b..000000000
--- a/kotlin/android/PortalMock/.tool-versions
+++ /dev/null
@@ -1 +0,0 @@
-ruby 3.1.0
diff --git a/kotlin/android/PortalMock/Gemfile b/kotlin/android/PortalMock/Gemfile
deleted file mode 100644
index dc86e9cd9..000000000
--- a/kotlin/android/PortalMock/Gemfile
+++ /dev/null
@@ -1,4 +0,0 @@
-source "https://rubygems.org"
-
-gem 'sinatra'
-gem 'thin'
diff --git a/kotlin/android/PortalMock/Gemfile.lock b/kotlin/android/PortalMock/Gemfile.lock
deleted file mode 100644
index ebfeebdac..000000000
--- a/kotlin/android/PortalMock/Gemfile.lock
+++ /dev/null
@@ -1,34 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- daemons (1.4.1)
- eventmachine (1.2.7)
- mustermann (3.0.0)
- ruby2_keywords (~> 0.0.1)
- rack (2.2.7)
- rack-protection (3.0.4)
- rack
- ruby2_keywords (0.0.5)
- sinatra (3.0.4)
- mustermann (~> 3.0)
- rack (~> 2.2, >= 2.2.4)
- rack-protection (= 3.0.4)
- tilt (~> 2.0)
- thin (1.8.1)
- daemons (~> 1.0, >= 1.0.9)
- eventmachine (~> 1.0, >= 1.0.4)
- rack (>= 1, < 3)
- tilt (2.0.11)
-
-PLATFORMS
- arm64-darwin-21
- x64-mingw-ucrt
- x86_64-darwin-21
- x86_64-linux
-
-DEPENDENCIES
- sinatra
- thin
-
-BUNDLED WITH
- 2.3.3
diff --git a/kotlin/android/PortalMock/data/jwt b/kotlin/android/PortalMock/data/jwt
deleted file mode 100644
index 597b16ec2..000000000
--- a/kotlin/android/PortalMock/data/jwt
+++ /dev/null
@@ -1 +0,0 @@
-eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjFMN3k3RUM1T3VSZUNNNnIzX2l0MXNJbjNqeTdiZ2JPSVB3Z0xoejV0SGsifQ.eyJpc3MiOiJodHRwczovL2ZpcmV6b25lLmxvY2FsIiwic3ViIjoidGVzdEBmaXJlem9uZS5kZXYiLCJjbGllbnRfaWQiOiJmaXJlem9uZSIsImV4cCI6MTY3MjgzNzU0NCwiaWF0IjoxNjY4MTMzOTQ0fQ.NvvGWvrMvshKp5MYycDWXa8gQ41Ptrr_nIKzfPWzci8fxwmQYJ5hL1vQpdmECtR5NeGv7qTavi6yq19Kqmwrn27numDXaET2b2xypGbFOm1TJmcbZ4Rxy_-FfAeer-7YNhW_p83a0N7UoPORpxVs8hp76sKe_klfmoM830frrLzeqz0VYxBZXhPiTAlqiG39cY74yk-drxLY4xeRBAXh_TdewrkRkPpTpsrXFz60fF5P8AaRnUKlDSRq89ZIC-zo2ysJsXIZLrJpfcNgkscohZZfXfCLIFaiGvZseW0XHWfq-V5HOXVf09-57GHdmCr-AAJ7sqpnPrSBvg7EDBvylg
diff --git a/kotlin/android/PortalMock/server.rb b/kotlin/android/PortalMock/server.rb
deleted file mode 100755
index 4d674c432..000000000
--- a/kotlin/android/PortalMock/server.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env ruby
-
-# This server attempts to provide a crude mock of the Firezone auth process.
-
-require 'sinatra'
-
-set :bind, '0.0.0.0'
-set :port, 4568
-
-get '/:slug' do
- csrfToken = params['client_csrf_token']
- ERB.new("
Auth page
Proceed")
- .result(binding)
-end
-
-get '/redirect' do
- dest = 'https://app.firez.one/handle_client_auth_callback'
- csrfToken = params['client_csrf_token']
- authToken = File.read(File.join(__dir__, 'data', 'jwt'))
- redirect "#{dest}?client_csrf_token=#{csrfToken}&client_auth_token=#{authToken}"
-end
diff --git a/swift/apple/PortalMock/.tool-versions b/swift/apple/PortalMock/.tool-versions
deleted file mode 100644
index 059ca477b..000000000
--- a/swift/apple/PortalMock/.tool-versions
+++ /dev/null
@@ -1 +0,0 @@
-ruby 3.1.0
diff --git a/swift/apple/PortalMock/Gemfile b/swift/apple/PortalMock/Gemfile
deleted file mode 100644
index dc86e9cd9..000000000
--- a/swift/apple/PortalMock/Gemfile
+++ /dev/null
@@ -1,4 +0,0 @@
-source "https://rubygems.org"
-
-gem 'sinatra'
-gem 'thin'
diff --git a/swift/apple/PortalMock/Gemfile.lock b/swift/apple/PortalMock/Gemfile.lock
deleted file mode 100644
index e9faf88ed..000000000
--- a/swift/apple/PortalMock/Gemfile.lock
+++ /dev/null
@@ -1,33 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- daemons (1.4.1)
- eventmachine (1.2.7)
- mustermann (3.0.0)
- ruby2_keywords (~> 0.0.1)
- rack (2.2.7)
- rack-protection (3.0.4)
- rack
- ruby2_keywords (0.0.5)
- sinatra (3.0.4)
- mustermann (~> 3.0)
- rack (~> 2.2, >= 2.2.4)
- rack-protection (= 3.0.4)
- tilt (~> 2.0)
- thin (1.8.1)
- daemons (~> 1.0, >= 1.0.9)
- eventmachine (~> 1.0, >= 1.0.4)
- rack (>= 1, < 3)
- tilt (2.0.11)
-
-PLATFORMS
- arm64-darwin-21
- arm64-darwin-22
- x86_64-linux
-
-DEPENDENCIES
- sinatra
- thin
-
-BUNDLED WITH
- 2.3.3
diff --git a/swift/apple/PortalMock/Info.plist b/swift/apple/PortalMock/Info.plist
deleted file mode 100644
index 3059459e1..000000000
--- a/swift/apple/PortalMock/Info.plist
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- NSExtension
-
- NSExtensionPointIdentifier
- com.apple.networkextension.packet-tunnel
- NSExtensionPrincipalClass
- $(PRODUCT_MODULE_NAME).PacketTunnelProvider
-
-
-
diff --git a/swift/apple/PortalMock/data/client_auth_token b/swift/apple/PortalMock/data/client_auth_token
deleted file mode 100644
index 597b16ec2..000000000
--- a/swift/apple/PortalMock/data/client_auth_token
+++ /dev/null
@@ -1 +0,0 @@
-eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjFMN3k3RUM1T3VSZUNNNnIzX2l0MXNJbjNqeTdiZ2JPSVB3Z0xoejV0SGsifQ.eyJpc3MiOiJodHRwczovL2ZpcmV6b25lLmxvY2FsIiwic3ViIjoidGVzdEBmaXJlem9uZS5kZXYiLCJjbGllbnRfaWQiOiJmaXJlem9uZSIsImV4cCI6MTY3MjgzNzU0NCwiaWF0IjoxNjY4MTMzOTQ0fQ.NvvGWvrMvshKp5MYycDWXa8gQ41Ptrr_nIKzfPWzci8fxwmQYJ5hL1vQpdmECtR5NeGv7qTavi6yq19Kqmwrn27numDXaET2b2xypGbFOm1TJmcbZ4Rxy_-FfAeer-7YNhW_p83a0N7UoPORpxVs8hp76sKe_klfmoM830frrLzeqz0VYxBZXhPiTAlqiG39cY74yk-drxLY4xeRBAXh_TdewrkRkPpTpsrXFz60fF5P8AaRnUKlDSRq89ZIC-zo2ysJsXIZLrJpfcNgkscohZZfXfCLIFaiGvZseW0XHWfq-V5HOXVf09-57GHdmCr-AAJ7sqpnPrSBvg7EDBvylg
diff --git a/swift/apple/PortalMock/server.rb b/swift/apple/PortalMock/server.rb
deleted file mode 100755
index b3334c58a..000000000
--- a/swift/apple/PortalMock/server.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env ruby
-
-require 'sinatra'
-require 'erb'
-
-set :bind, '0.0.0.0'
-set :port, 4568
-
-get '/:slug' do
- ERB.new("Auth page
Proceed")
- .result(binding)
-end
-
-get '/redirect' do
- client_auth_token = File.read('./data/client_auth_token').strip
- redirect "firezone://handle_client_auth_callback?client_auth_token=#{client_auth_token}&actor_name=Foo+Bar"
-end