diff --git a/SimpleServer/index.html b/SimpleServer/index.html
new file mode 100644
index 0000000..d0ab4b2
--- /dev/null
+++ b/SimpleServer/index.html
@@ -0,0 +1,21 @@
+
+
+
+ BaseBand download server
+
+
+ BaseBand downloads
+
+ This website serves the version information and downloads of BaseBand.
+
+ Artifacts
+
+
+ Version information
+
+ /latest
+
diff --git a/SimpleServer/server.spl b/SimpleServer/server.spl
new file mode 100644
index 0000000..43bcbb3
--- /dev/null
+++ b/SimpleServer/server.spl
@@ -0,0 +1,70 @@
+
+"#httpserver/base.spl" import
+"#httpserver/static.spl" import
+use net:http:Server
+
+construct Latest {
+ release
+ main
+ loader
+ ;
+ construct { this | with this ;
+ func read-commit { s | with file ;
+ [ "unzip" "-p" file "commit" ] StreamTypes:cmd:create:read-to-end<32>:to-str
+ }
+ "BaseBand-release.jar" read-commit this:=release
+ "BaseBand-main.jar" read-commit this:=main
+ "BaseBand-Loader.jar" read-commit this:=loader
+ this properties props-to-json
+ }
+}
+
+construct Object404 {
+ error
+ ;
+ construct { this | with this ;
+ "Endpoint not found" this:=error
+ this properties props-to-json
+ }
+}
+
+func props-to-json { | with props ;
+ "{"
+ props
+ :iter
+ :filter<{ b | :to-stack pop with key ; key ":" eq not key ";" eq not and }>
+ :map<{ s |
+ :to-stack with key value ;
+ "\""
+ key :replace<"\\" "\\\\">:replace<"\"" "\\\""> concat
+ "\": \"" concat
+ value _str :replace<"\\" "\\\\">:replace<"\"" "\\\""> concat
+ "\"" concat
+ }>
+ :join<", "> concat
+ "}" concat
+}
+
+func main { exitcode | with args ;
+ def server Server:new<"::0" 40002> =server
+ while { 1 } {
+ server:accept &handle-client fork;
+ }
+}
+
+func handle-client { | with client ;
+ client:read;
+ "index.html" "/" client:serve-html-cached;
+
+ "BaseBand-release.jar" "/download/client/release" client:serve-file-cached;<"application/octet-stream">
+ "BaseBand-main.jar" "/download/client/main" client:serve-file-cached;<"application/octet-stream">
+ "BaseBand-Loader.jar" "/download/loader" client:serve-file-cached;<"application/octet-stream">
+
+ "/latest" client:path eq if {
+ Latest:new client:write-ok:write-content-type<"application/json">:write-str-body:finish;
+ }
+
+ client:wrote-body not if {
+ Object404:new client:write-head<404 "Not Found">:write-content-type<"application/json">:write-str-body:finish;
+ }
+}