diff --git a/package-lock.json b/package-lock.json
index 468cb896..f649d2be 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,8 @@
"@lucide/svelte": "^0.564.0",
"@types/leaflet.markercluster": "^1.5.6",
"leaflet": "^1.9.4",
- "leaflet.markercluster": "^1.5.3"
+ "leaflet.markercluster": "^1.5.3",
+ "spacetimedb": "^2.3.0"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^7.0.0",
@@ -2140,6 +2141,26 @@
"node": ">= 0.4"
}
},
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/blake3-wasm": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz",
@@ -2331,6 +2352,12 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/headers-polyfill": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz",
+ "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==",
+ "license": "MIT"
+ },
"node_modules/is-reference": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
@@ -2673,6 +2700,17 @@
"node": ">=18.0.0"
}
},
+ "node_modules/miniflare/node_modules/undici": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz",
+ "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20.18.1"
+ }
+ },
"node_modules/mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
@@ -2712,6 +2750,18 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/obug": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
@@ -2788,6 +2838,37 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/prettier": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
+ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz",
+ "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -2870,6 +2951,15 @@
"node": ">=6"
}
},
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
@@ -2962,6 +3052,59 @@
"node": ">=0.10.0"
}
},
+ "node_modules/spacetimedb": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spacetimedb/-/spacetimedb-2.3.0.tgz",
+ "integrity": "sha512-AleiQ+UkcgC9aRe0ArRRh77c8DI6lM2lBBw1wlVzlYpev6Aiem5aLiduPbACxyECrdwngfurDR211ZTmbh+etw==",
+ "license": "ISC",
+ "dependencies": {
+ "base64-js": "^1.5.1",
+ "headers-polyfill": "^4.0.3",
+ "object-inspect": "^1.13.4",
+ "prettier": "^3.3.3",
+ "pure-rand": "^7.0.1",
+ "safe-stable-stringify": "^2.5.0",
+ "statuses": "^2.0.2",
+ "url-polyfill": "^1.1.14"
+ },
+ "peerDependencies": {
+ "@angular/core": ">=17.0.0",
+ "@tanstack/react-query": "^5.0.0",
+ "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0",
+ "svelte": "^4.0.0 || ^5.0.0",
+ "undici": "^6.19.2",
+ "vue": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@angular/core": {
+ "optional": true
+ },
+ "@tanstack/react-query": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "svelte": {
+ "optional": true
+ },
+ "undici": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/supports-color": {
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
@@ -3099,14 +3242,14 @@
}
},
"node_modules/undici": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz",
- "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==",
- "dev": true,
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz",
+ "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==",
"license": "MIT",
+ "optional": true,
"peer": true,
"engines": {
- "node": ">=20.18.1"
+ "node": ">=18.17"
}
},
"node_modules/unenv": {
@@ -3120,6 +3263,12 @@
"pathe": "^2.0.3"
}
},
+ "node_modules/url-polyfill": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.14.tgz",
+ "integrity": "sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==",
+ "license": "MIT"
+ },
"node_modules/vite": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
diff --git a/package.json b/package.json
index f4005c17..b55beb41 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,7 @@
"@lucide/svelte": "^0.564.0",
"@types/leaflet.markercluster": "^1.5.6",
"leaflet": "^1.9.4",
- "leaflet.markercluster": "^1.5.3"
+ "leaflet.markercluster": "^1.5.3",
+ "spacetimedb": "^2.3.0"
}
}
diff --git a/src/app.html b/src/app.html
index 0994e653..fb417f32 100644
--- a/src/app.html
+++ b/src/app.html
@@ -4,10 +4,16 @@
+
%sveltekit.head%
diff --git a/src/lib/components/map/MapContainer.svelte b/src/lib/components/map/MapContainer.svelte
index 923dfdef..17d15b09 100644
--- a/src/lib/components/map/MapContainer.svelte
+++ b/src/lib/components/map/MapContainer.svelte
@@ -1,95 +1,49 @@