Calculator Tools Calculator Tools
Create

Hyperspace Screensaver

Aug 12, 2026

About this app

A fullscreen screensaver that simulates flying through hyperspace.

Hyperspace Screensaver

Related apps

Put this on your site

Source

                    <html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">

<title>Hyperspace Screensaver</title>
<meta name="description" content="A fullscreen screensaver that simulates flying through hyperspace.">
<meta name="keywords" content="hyperspace, screensaver, three.js, simulation">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

<!-- Built-In Functions for Apps -->
<script type="text/javascript">
var localStoragePrefix = "ct-168123515822835";
var lastSave = 0;
// save to localstorage
function saveLocal(data) {
if (Date.now() - lastSave < 1000) {
return;
}
// save to cookie
let cookie = localStoragePrefix + "=" + JSON.stringify(data) + "; path=" + window.location.pathname + "'; SameSite=Strict";
cookie += "; expires=" + new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 1000).toUTCString();
document.cookie = cookie;
lastSave = Date.now();
}

// load from localstorage
function loadLocal() {
var cookiePrefix = localStoragePrefix + "=";
var cookieStart = document.cookie.indexOf(cookiePrefix);
if (cookieStart > -1) {
let cookieEnd = document.cookie.indexOf(";", cookieStart);
if (cookieEnd == -1) {
cookieEnd = document.cookie.length;
}
var cookieData = document.cookie.substring(cookieStart + cookiePrefix.length, cookieEnd);
return JSON.parse(cookieData);
}
}
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/0.151.3/three.min.js"></script>
<script type="text/javascript">
var scene, camera, renderer, particles;

function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;

renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

particles = new THREE.BufferGeometry();
var positions = new Float32Array(1000 * 3);
var speeds = new Float32Array(1000);

for (var i = 0; i < 1000; i++) {
positions[i * 3] = (Math.random() * 2 - 1) * 10;
positions[i * 3 + 1] = (Math.random() * 2 - 1) * 10;
positions[i * 3 + 2] = -Math.random() * 50;

speeds[i] = Math.random() * 0.05 + 0.025;
}

particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));
particles.setAttribute('speed', new THREE.BufferAttribute(speeds, 1));

var material = new THREE.PointsMaterial({ color: 0xFFFFFF, size: 0.1 });

var particleSystem = new THREE.Points(particles, material);
scene.add(particleSystem);

window.addEventListener('resize', onWindowResize, false);

animate();
}

function animate() {
requestAnimationFrame(animate);

var positions = particles.attributes.position;
var speeds = particles.attributes.speed;

for (var i = 0; i < 1000; i++) {
positions.array[i * 3 + 2] += speeds.array[i];

if (positions.array[i * 3 + 2] > 5) {
positions.array[i * 3 + 2] = -50;
}
}

positions.needsUpdate = true;

renderer.render(scene, camera);
}

function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
</script>

<style>
body {
margin: 0;
overflow: hidden;
}
</style>
</head>
<body onload="init()">
</body>
</html>