diff --git a/WebHostLib/templates/hostRoom.html b/WebHostLib/templates/hostRoom.html
index 2981c41452f0..2bbfe4ad0169 100644
--- a/WebHostLib/templates/hostRoom.html
+++ b/WebHostLib/templates/hostRoom.html
@@ -24,7 +24,8 @@
{% endif %}
{% if room.tracker %}
- This room has a Multiworld Tracker enabled.
+ This room has a Multiworld Tracker
+ and a Sphere Tracker enabled.
{% endif %}
The server for this room will be paused after {{ room.timeout//60//60 }} hours of inactivity.
diff --git a/WebHostLib/templates/multispheretracker.html b/WebHostLib/templates/multispheretracker.html
new file mode 100644
index 000000000000..a86697498396
--- /dev/null
+++ b/WebHostLib/templates/multispheretracker.html
@@ -0,0 +1,72 @@
+{% extends "tablepage.html" %}
+{% block head %}
+ {{ super() }}
+
Multiworld Sphere Tracker
+
+
+{% endblock %}
+
+{% block body %}
+ {% include "header/dirtHeader.html" %}
+
+
+
+
+
+
+ {% if tracker_data.get_spheres() %}
+ This tracker lists already found locations by their logical access sphere.
+ It ignores items that cannot be sent
+ and will therefore differ from the sphere numbers in the spoiler playthrough.
+ This tracker will automatically update itself periodically.
+ {% else %}
+ This Multiworld has no Sphere data, likely due to being too old, cannot display data.
+ {% endif %}
+
+
+
+
+ {%- for team, players in tracker_data.get_all_players().items() %}
+
+
+
+
+
Sphere
+ {#- Mimicking hint table header for familiarity. #}
+
Finder
+
Receiver
+
Item
+
Location
+
Game
+
+
+
+ {%- for sphere in tracker_data.get_spheres() %}
+ {%- set current_sphere = loop.index %}
+ {%- for player, sphere_location_ids in sphere.items() %}
+ {%- set checked_locations = tracker_data.get_player_checked_locations(team, player) %}
+ {%- set finder_game = tracker_data.get_player_game(team, player) %}
+ {%- set player_location_data = tracker_data.get_player_locations(team, player) %}
+ {%- for location_id in sphere_location_ids.intersection(checked_locations) %}
+
+ {%- set item_id, receiver, item_flags = player_location_data[location_id] %}
+ {%- set receiver_game = tracker_data.get_player_game(team, receiver) %}
+