Obtained from:	https://github.com/mhenrixon/sidekiq-unique-jobs/commit/fdfc15ef00961295b3ec1533d33b86315bd80224
		https://github.com/mhenrixon/sidekiq-unique-jobs/commit/73bc7ffbac4a3c9c51e426d6329d18bb25bd06a1

--- lib/sidekiq_unique_jobs/web.rb.orig	2025-03-15 18:09:47 UTC
+++ lib/sidekiq_unique_jobs/web.rb
@@ -8,20 +8,18 @@ module SidekiqUniqueJobs
   # @author Mikael Henriksson <mikael@mhenrixon.com>
   module Web
     def self.registered(app) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
-      app.helpers do
-        include Web::Helpers
-      end
+      app.helpers Web::Helpers
 
       app.get "/changelogs" do
-        @filter         = h(params[:filter] || "*")
+        @filter         = h(safe_url_params("filter") || "*")
         @filter         = "*" if @filter == ""
-        @count          = h(params[:count] || 100).to_i
-        @current_cursor = h(params[:cursor]).to_i
-        @prev_cursor    = h(params[:prev_cursor]).to_i
+        @count          = h(safe_url_params("count") || 100).to_i
+        @current_cursor = h(safe_url_params("cursor")).to_i
+        @prev_cursor    = h(safe_url_params("prev_cursor")).to_i
         @total_size, @next_cursor, @changelogs = changelog.page(
           cursor: @current_cursor,
           pattern: @filter,
-          page_size: @count,
+          page_size: @count
         )
 
         erb(unique_template(:changelogs))
@@ -29,36 +27,36 @@ module SidekiqUniqueJobs
 
       app.get "/changelogs/delete_all" do
         changelog.clear
-        redirect_to :changelogs
+        safe_redirect_to :changelogs
       end
 
       app.get "/locks" do
-        @filter         = h(params[:filter]) || "*"
+        @filter         = h(safe_url_params("filter") || "*")
         @filter         = "*" if @filter == ""
-        @count          = h(params[:count] || 100).to_i
-        @current_cursor = h(params[:cursor]).to_i
-        @prev_cursor    = h(params[:prev_cursor]).to_i
+        @count          = h(safe_url_params("count") || 100).to_i
+        @current_cursor = h(safe_url_params("cursor")).to_i
+        @prev_cursor    = h(safe_url_params("prev_cursor")).to_i
 
         @total_size, @next_cursor, @locks = digests.page(
           cursor: @current_cursor,
           pattern: @filter,
-          page_size: @count,
+          page_size: @count
         )
 
         erb(unique_template(:locks))
       end
 
       app.get "/expiring_locks" do
-        @filter         = h(params[:filter]) || "*"
+        @filter         = h(safe_url_params("filter") || "*")
         @filter         = "*" if @filter == ""
-        @count          = h(params[:count] || 100).to_i
-        @current_cursor = h(params[:cursor]).to_i
-        @prev_cursor    = h(params[:prev_cursor]).to_i
+        @count          = h(safe_url_params("count") || 100).to_i
+        @current_cursor = h(safe_url_params("cursor")).to_i
+        @prev_cursor    = h(safe_url_params("prev_cursor")).to_i
 
         @total_size, @next_cursor, @locks = expiring_digests.page(
           cursor: @current_cursor,
           pattern: @filter,
-          page_size: @count,
+          page_size: @count
         )
 
         erb(unique_template(:locks))
@@ -67,29 +65,29 @@ module SidekiqUniqueJobs
       app.get "/locks/delete_all" do
         digests.delete_by_pattern("*", count: digests.count)
         expiring_digests.delete_by_pattern("*", count: digests.count)
-        redirect_to :locks
+        safe_redirect_to :locks
       end
 
       app.get "/locks/:digest" do
-        @digest = h(params[:digest])
+        @digest = h(safe_route_params(:digest))
         @lock   = SidekiqUniqueJobs::Lock.new(@digest)
 
         erb(unique_template(:lock))
       end
 
       app.get "/locks/:digest/delete" do
-        digests.delete_by_digest(h(params[:digest]))
-        expiring_digests.delete_by_digest(h(params[:digest]))
-        redirect_to :locks
+        digests.delete_by_digest(h(safe_route_params(:digest)))
+        expiring_digests.delete_by_digest(h(safe_route_params(:digest)))
+        safe_redirect_to :locks
       end
 
       app.get "/locks/:digest/jobs/:job_id/delete" do
-        @digest = h(params[:digest])
-        @job_id = h(params[:job_id])
+        @digest = h(safe_route_params(:digest))
+        @job_id = h(safe_route_params(:job_id))
         @lock   = SidekiqUniqueJobs::Lock.new(@digest)
         @lock.unlock(@job_id)
 
-        redirect_to "locks/#{@lock.key}"
+        safe_redirect_to "locks/#{@lock.key}"
       end
     end
   end
@@ -99,11 +97,17 @@ begin
   require "delegate" unless defined?(DelegateClass)
   require "sidekiq/web" unless defined?(Sidekiq::Web)
 
-  Sidekiq::Web.register(SidekiqUniqueJobs::Web)
-  Sidekiq::Web.tabs["Locks"]          = "locks"
-  Sidekiq::Web.tabs["Expiring Locks"] = "expiring_locks"
-  Sidekiq::Web.tabs["Changelogs"]     = "changelogs"
-  Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "locales")
-rescue NameError, LoadError => ex
-  SidekiqUniqueJobs.logger.error(ex)
+  if Sidekiq::MAJOR >= 8
+    Sidekiq::Web.configure do |config|
+      config.register_extension(SidekiqUniqueJobs::Web, name: "unique_jobs", tab: ["Locks", "Expiring Locks", "Changelogs"],
+                                                        index: %w[locks/ expiring_locks/ changelogs/])
+    end
+  else
+    Sidekiq::Web.register(SidekiqUniqueJobs::Web)
+    Sidekiq::Web.tabs["Locks"]          = "locks"
+    Sidekiq::Web.tabs["Expiring Locks"] = "expiring_locks"
+    Sidekiq::Web.tabs["Changelogs"]     = "changelogs"
+  end
+rescue NameError, LoadError => e
+  SidekiqUniqueJobs.logger.error(e)
 end
--- lib/sidekiq_unique_jobs/web/helpers.rb.orig	2025-03-15 18:09:47 UTC
+++ lib/sidekiq_unique_jobs/web/helpers.rb
@@ -116,7 +116,7 @@ module SidekiqUniqueJobs
       #
       # @return a redirect to the new subpath
       #
-      def redirect_to(subpath)
+      def safe_redirect_to(subpath)
         if respond_to?(:to)
           # Sinatra-based web UI
           redirect to(subpath)
@@ -169,6 +169,26 @@ module SidekiqUniqueJobs
         else
           Time.parse(time.to_s)
         end
+      end
+
+      # Copied from sidekiq for compatibility with older versions
+
+      # stuff after ? or form input
+      # uses String keys, no Symbols!
+      def safe_url_params(key)
+        return url_params(key) if Sidekiq::MAJOR >= 8
+
+        warn { "URL parameter `#{key}` should be accessed via String, not Symbol (at #{caller(3..3).first})" } if key.is_a?(Symbol)
+        request.params[key.to_s]
+      end
+
+      # variables embedded in path, `/metrics/:name`
+      # uses Symbol keys, no Strings!
+      def safe_route_params(key)
+        return route_params(key) if Sidekiq::MAJOR >= 8
+
+        warn { "Route parameter `#{key}` should be accessed via Symbol, not String (at #{caller(3..3).first})" } if key.is_a?(String)
+        env["rack.route_params"][key.to_sym]
       end
     end
   end
--- sidekiq-unique-jobs.gemspec.orig	2025-03-15 18:09:47 UTC
+++ sidekiq-unique-jobs.gemspec
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
   s.specification_version = 4
 
   s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0".freeze, ">= 1.0.5".freeze])
-  s.add_runtime_dependency(%q<sidekiq>.freeze, [">= 7.0.0".freeze, "< 8.0.0".freeze])
+  s.add_runtime_dependency(%q<sidekiq>.freeze, [">= 7.0.0".freeze, "< 9.0.0".freeze])
   s.add_runtime_dependency(%q<thor>.freeze, [">= 1.0".freeze, "< 3.0".freeze])
 end
 
