Index: TFP-WebServer/WebServer/ModInfo.xml
===================================================================
--- TFP-WebServer/WebServer/ModInfo.xml	(revision 466)
+++ TFP-WebServer/WebServer/ModInfo.xml	(revision 467)
@@ -5,5 +5,5 @@
 	<Description value="Integrated Webserver for the Web Dashboard and server APIs" />
 	<Author value="The Fun Pimps LLC" />
-	<Version value="21.1.16.1" />
+	<Version value="21.1.16.2" />
 	<Website value="" />
 </xml>
Index: TFP-WebServer/WebServer/src/LogBuffer.cs
===================================================================
--- TFP-WebServer/WebServer/src/LogBuffer.cs	(revision 466)
+++ TFP-WebServer/WebServer/src/LogBuffer.cs	(revision 467)
@@ -12,4 +12,6 @@
 
 		private int listOffset;
+
+		public static event Action<LogEntry> EntryAdded;
 
 		public static void Init () {
@@ -60,8 +62,10 @@
 
 		private void LogCallback (string _formattedMsg, string _plainMsg, string _trace, LogType _type, DateTime _timestamp, long _uptime) {
-			LogEntry le = new LogEntry (_timestamp, _plainMsg, _trace, _type, _uptime);
+			lock (logEntries) {
+				LogEntry le = new LogEntry (listOffset + logEntries.Count, _timestamp, _plainMsg, _trace, _type, _uptime);
 
-			lock (logEntries) {
 				logEntries.Add (le);
+				EntryAdded?.Invoke (le);
+				
 				if (logEntries.Count <= maxEntries) {
 					return;
@@ -126,4 +130,5 @@
 
 		public class LogEntry {
+			public readonly int MessageId;
 			public readonly DateTime Timestamp;
 			public readonly string IsoTime;
@@ -133,5 +138,7 @@
 			public readonly long Uptime;
 
-			public LogEntry (DateTime _timestamp, string _message, string _trace, LogType _type, long _uptime) {
+			public LogEntry (int _messageId, DateTime _timestamp, string _message, string _trace, LogType _type, long _uptime) {
+				MessageId = _messageId;
+				
 				Timestamp = _timestamp;
 				IsoTime = _timestamp.ToString ("o");
Index: TFP-WebServer/WebServer/src/SSE/EventLog.cs
===================================================================
--- TFP-WebServer/WebServer/src/SSE/EventLog.cs	(revision 466)
+++ TFP-WebServer/WebServer/src/SSE/EventLog.cs	(revision 467)
@@ -1,8 +1,6 @@
-using System;
 using JetBrains.Annotations;
-using UnityEngine;
 using Utf8Json;
 using Webserver.UrlHandlers;
-using Webserver.WebAPI;
+using Webserver.WebAPI.APIs;
 
 namespace Webserver.SSE {
@@ -10,34 +8,10 @@
 	public class EventLog : AbsEvent {
 		public EventLog (SseHandler _parent) : base (_parent, _name: "log") {
-			Log.LogCallbacksExtended += LogCallback;
+			LogBuffer.EntryAdded += LogCallback;
 		}
 
-		private static readonly byte[] jsonMsgKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("msg");
-		private static readonly byte[] jsonTypeKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("type");
-		private static readonly byte[] jsonTraceKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("trace");
-		private static readonly byte[] jsonIsotimeKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("isotime");
-		private static readonly byte[] jsonUptimeKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("uptime");
-
-		private void LogCallback (string _formattedMsg, string _plainMsg, string _trace, LogType _type, DateTime _timestamp, long _uptime) {
-			string uptime = _uptime.ToString ();
-
+		private void LogCallback (LogBuffer.LogEntry _logEntry) {
 			JsonWriter writer = new JsonWriter ();
-			
-			writer.WriteRaw (jsonMsgKey);
-			writer.WriteString (_plainMsg);
-			
-			writer.WriteRaw (jsonTypeKey);
-			writer.WriteString (_type.ToStringCached ());
-			
-			writer.WriteRaw (jsonTraceKey);
-			writer.WriteString (_trace);
-			
-			writer.WriteRaw (jsonIsotimeKey);
-			JsonCommons.WriteDateTime (ref writer, _timestamp);
-			
-			writer.WriteRaw (jsonUptimeKey);
-			writer.WriteString (uptime);
-			
-			writer.WriteEndObject ();
+			LogApi.WriteLogMessageObject (ref writer, _logEntry);
 			
 			SendData ("logLine", writer.ToString ());
Index: TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.cs
===================================================================
--- TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.cs	(revision 466)
+++ TFP-WebServer/WebServer/src/UrlHandlers/ItemIconHandler.cs	(revision 467)
@@ -122,5 +122,5 @@
 					Log.Out ($"[Web] IconHandler: Loaded {icons.Count} icons");
 				} else {
-					stats?.MswTotal.Stop ();
+					stats.MswTotal.Stop ();
 					Log.Out ($"[Web] IconHandler: Loaded {icons.Count} icons ({stats.Files} source images with {stats.Tints} tints applied)");
 					Log.Out ($"[Web] IconHandler: Total time {stats.MswTotal.ElapsedMilliseconds} ms, loading files {stats.MswLoading.ElapsedMilliseconds} ms, tinting files {stats.MswTinting.ElapsedMilliseconds} ms, encoding files {stats.MswEncoding.ElapsedMilliseconds} ms");
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/GameData/Mods.cs
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/GameData/Mods.cs	(revision 466)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/GameData/Mods.cs	(revision 467)
@@ -19,34 +19,5 @@
 				}
 				
-				writer.WriteBeginObject ();
-
 				writeModJson (ref writer, webMod);
-
-				if (webMod.ReactBundle != null || webMod.CssPath != null) {
-					writer.WriteValueSeparator ();
-
-					writer.WritePropertyName ("web");
-					writer.WriteBeginObject ();
-					
-					string webModReactBundle = webMod.ReactBundle;
-					if (webModReactBundle != null) {
-						writer.WritePropertyName ("bundle");
-						writer.WriteString (webModReactBundle);
-					}
-
-					string webModCssFile = webMod.CssPath;
-					if (webModCssFile != null) {
-						if (webModReactBundle != null) {
-							writer.WriteValueSeparator ();
-						}
-
-						writer.WritePropertyName ("css");
-						writer.WriteString (webModCssFile);
-					}
-					
-					writer.WriteEndObject ();
-				}
-
-				writer.WriteEndObject ();
 			}
 
@@ -56,5 +27,7 @@
 		}
 
-		private void writeModJson (ref JsonWriter _writer, WebMod _webMod) {
+		private static void writeModJson (ref JsonWriter _writer, WebMod _webMod) {
+			_writer.WriteBeginObject ();
+
 			_writer.WritePropertyName ("name");
 			_writer.WriteString (_webMod.ParentMod.Name);
@@ -79,4 +52,36 @@
 			_writer.WritePropertyName ("website");
 			_writer.WriteString (_webMod.ParentMod.Website);
+			
+			writeWebModJson (ref _writer, _webMod);
+
+			_writer.WriteEndObject ();
+		}
+
+		private static void writeWebModJson (ref JsonWriter _writer, WebMod _webMod) {
+			if (_webMod.ModUrl != null) {
+				_writer.WriteValueSeparator ();
+
+				_writer.WritePropertyName ("web");
+				_writer.WriteBeginObject ();
+				
+				_writer.WritePropertyName ("baseUrl");
+				_writer.WriteString (_webMod.ModUrl);
+
+				string webModReactBundle = _webMod.ReactBundle;
+				if (webModReactBundle != null) {
+					_writer.WriteValueSeparator ();
+					_writer.WritePropertyName ("bundle");
+					_writer.WriteString (webModReactBundle);
+				}
+
+				string webModCssFile = _webMod.CssPath;
+				if (webModCssFile != null) {
+					_writer.WriteValueSeparator ();
+					_writer.WritePropertyName ("css");
+					_writer.WriteString (webModCssFile);
+				}
+
+				_writer.WriteEndObject ();
+			}
 		}
 
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/GameData/Mods.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/GameData/Mods.openapi.yaml	(revision 466)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/GameData/Mods.openapi.yaml	(revision 467)
@@ -37,12 +37,21 @@
           type: object
           properties:
+            baseUrl:
+              type: string
+              examples:
+                - /webmods/TFP_MarkersExample/
+              description: Base URL of the WebMod folder of this mod. Always ends with a forward slash '/'.
             bundle:
               type: string
               examples:
-                - /webmods/Xample_MarkersMod/bundle.js
+                - /webmods/TFP_MarkersExample/bundle.js
+              description: URL of the React bundle if the mod has one.
             css:
               type: string
               examples:
-                - /webmods/Xample_MarkersMod/styling.css
+                - /webmods/TFP_MarkersExample/styling.css
+              description: URL of a styling CSS file if the mod has one.
+          required:
+            - baseUrl
       required:
         - name
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/Log.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/Log.openapi.yaml	(revision 466)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/Log.openapi.yaml	(revision 467)
@@ -8,5 +8,9 @@
     LogEntry:
       type: object
-      properties: 
+      properties:
+        id:
+          type: integer
+          minimum: 0
+          description: Consecutive ID/number of this log line
         msg:
           type: string
@@ -33,6 +37,7 @@
           examples:
             - '87123'
-          description: Time since server was started in milliseconds.
+          description: Time since server was started in milliseconds
       required:
+        - id
         - msg
         - type
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/LogApi.cs
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/LogApi.cs	(revision 466)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/LogApi.cs	(revision 467)
@@ -12,5 +12,6 @@
 		private static readonly byte[] jsonKeyLastLine = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("lastLine");
 
-		private static readonly byte[] jsonMsgKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("msg");
+		private static readonly byte[] jsonIdKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("id");
+		private static readonly byte[] jsonMsgKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("msg");
 		private static readonly byte[] jsonTypeKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("type");
 		private static readonly byte[] jsonTraceKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("trace");
@@ -57,20 +58,5 @@
 				}
 
-				writer.WriteRaw (jsonMsgKey);
-				writer.WriteString (logEntry.Message);
-
-				writer.WriteRaw (jsonTypeKey);
-				writer.WriteString (logEntry.Type.ToStringCached ());
-
-				writer.WriteRaw (jsonTraceKey);
-				writer.WriteString (logEntry.Trace);
-
-				writer.WriteRaw (jsonIsotimeKey);
-				writer.WriteString (logEntry.IsoTime);
-
-				writer.WriteRaw (jsonUptimeKey);
-				writer.WriteString (logEntry.Uptime.ToString ());
-
-				writer.WriteEndObject ();
+				WriteLogMessageObject (ref writer, logEntry);
 			}
 
@@ -87,4 +73,26 @@
 			SendEnvelopedResult (_context, ref writer);
 		}
+
+		public static void WriteLogMessageObject (ref JsonWriter _writer, LogBuffer.LogEntry _logEntry) {
+			_writer.WriteRaw (jsonIdKey);
+			_writer.WriteInt32 (_logEntry.MessageId);
+			
+			_writer.WriteRaw (jsonMsgKey);
+			_writer.WriteString (_logEntry.Message);
+
+			_writer.WriteRaw (jsonTypeKey);
+			_writer.WriteString (_logEntry.Type.ToStringCached ());
+
+			_writer.WriteRaw (jsonTraceKey);
+			_writer.WriteString (_logEntry.Trace);
+
+			_writer.WriteRaw (jsonIsotimeKey);
+			_writer.WriteString (_logEntry.IsoTime);
+
+			_writer.WriteRaw (jsonUptimeKey);
+			_writer.WriteString (_logEntry.Uptime.ToString ());
+
+			_writer.WriteEndObject ();
+		}
 	}
 }
Index: TFP-WebServer/bin/Mods/TFP_WebServer/ModInfo.xml
===================================================================
--- TFP-WebServer/bin/Mods/TFP_WebServer/ModInfo.xml	(revision 466)
+++ TFP-WebServer/bin/Mods/TFP_WebServer/ModInfo.xml	(revision 467)
@@ -5,5 +5,5 @@
 	<Description value="Integrated Webserver for the Web Dashboard and server APIs" />
 	<Author value="The Fun Pimps LLC" />
-	<Version value="21.1.16.1" />
+	<Version value="21.1.16.2" />
 	<Website value="" />
 </xml>
