diff --git a/ZeroSpace/ZeroSpace.Web/Pages/StarSystemDetail.razor b/ZeroSpace/ZeroSpace.Web/Pages/StarSystemDetail.razor
new file mode 100644
index 0000000..08b7cf4
--- /dev/null
+++ b/ZeroSpace/ZeroSpace.Web/Pages/StarSystemDetail.razor
@@ -0,0 +1,111 @@
+@page "/StarSystem/{Id}"
+
+@(system?.Name ?? "Star System")
+
+@if (system is null)
+{
+
+}
+else
+{
+
+
+
+ - Occupation buff
+ - @(system.OccupationBuff ?? "—")
+
+ - System mastery
+ -
+ @if (system.SystemMastery is null)
+ {
+ @:—
+ }
+ else
+ {
+ var masteryUrl = ZeroSpaceLinks.UrlFor(system.SystemMastery);
+ if (masteryUrl is null)
+ {
+ @system.SystemMastery
+ }
+ else
+ {
+ @system.SystemMastery
+ }
+ }
+
+
+ - Yields
+ - @YieldText(system)
+
+ - Connected systems
+ -
+ @for (var i = 0; i < system.ConnectedSystems.Count; i++)
+ {
+ var name = system.ConnectedSystems[i];
+ var url = ZeroSpaceLinks.UrlFor(name);
+ if (url is null)
+ {
+ @name
+ }
+ else
+ {
+ @name
+ }
+ @if (i < system.ConnectedSystems.Count - 1)
+ {
+ @:,
+ }
+ }
+
+
+
+ @if (!string.IsNullOrWhiteSpace(system.Body))
+ {
+ Notes
+
+ }
+}
+
+@code {
+ [Parameter]
+ public string Id { get; set; } = string.Empty;
+
+ private StarSystemData? system;
+
+ protected override void OnParametersSet()
+ {
+ system = StarSystems.All.FirstOrDefault(s => s.Id.Equals(Id, StringComparison.OrdinalIgnoreCase));
+ }
+
+ private static string YieldText(StarSystemData s)
+ {
+ var yields = new List();
+ if (s.HigherInfluenceYield)
+ {
+ yields.Add("Influence");
+ }
+
+ if (s.HigherCreditYield)
+ {
+ yields.Add("Credits");
+ }
+
+ if (s.HigherEnergyYield)
+ {
+ yields.Add("Energy");
+ }
+
+ if (s.HigherChanceForItems)
+ {
+ yields.Add("Items");
+ }
+
+ return yields.Count == 0 ? "Standard" : "Higher " + string.Join(", ", yields);
+ }
+}