diff --git a/src/snek/templates/sandbox.html b/src/snek/templates/sandbox.html
index 5306b6e..0535b9b 100644
--- a/src/snek/templates/sandbox.html
+++ b/src/snek/templates/sandbox.html
@@ -53,4 +53,63 @@ function updateStarColorDelayed(color) {
app.ws.addEventListener("set_typing", (data) => {
updateStarColorDelayed(data.data.color);
});
+
+
+class StarField {
+ constructor(container = document.body, options = {}) {
+ this.container = container;
+ this.stars = [];
+ this.setOptions(options);
+ }
+
+ setOptions({
+ starCount = 200,
+ minSize = 1,
+ maxSize = 3,
+ speed = 5,
+ color = "white"
+ }) {
+ this.options = { starCount, minSize, maxSize, speed, color };
+ }
+
+ clear() {
+ this.stars.forEach(star => star.remove());
+ this.stars = [];
+ }
+
+ generate() {
+ this.clear();
+ const { starCount, minSize, maxSize, speed, color } = this.options;
+
+ for (let i = 0; i < starCount; i++) {
+ const star = document.createElement("div");
+ star.classList.add("star");
+ const size = Math.random() * (maxSize - minSize) + minSize;
+
+ Object.assign(star.style, {
+ left: `${Math.random() * 100}%`,
+ top: `${Math.random() * 100}%`,
+ width: `${size}px`,
+ height: `${size}px`,
+ backgroundColor: color,
+ position: "absolute",
+ borderRadius: "50%",
+ opacity: "0.8",
+ animation: `twinkle ${speed}s ease-in-out infinite`,
+ });
+
+ this.container.appendChild(star);
+ this.stars.push(star);
+ }
+ }
+}
+
+const starField = new StarField(document.body, {
+ starCount: 200,
+ minSize: 1,
+ maxSize: 3,
+ speed: 5,
+ color: "white"
+});
+