feat: Standalone play site (#298)

## Description
Adds a basic standalone "play site" that mimics current one in apps/www.
This is so self-hosters don't need to host whole site, but can just use
small version of it.

Yet to test so marking as draft, not at home currently so may take some
time. Also might be good idea to make Caddy-powered container out of
this later?

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Introduces a standalone Play site with server output, accessible on
0.0.0.0:3000.
- Streams video via WebRTC into a canvas with continuous frame
rendering.
- Fullscreen and pointer lock support with optional keyboard lock for
navigation keys.
  - Room-based routing with offline and loading states.
  - Responsive 16:9 canvas and improved default layout styling.

- Chores
- Adds a multi-stage container build for efficient runtime images and a
lightweight init process.
  - Includes configuration and project setup for the standalone package.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DatCaptainHorse <datcaptainhorse@users.noreply.github.com>
This commit is contained in:
Kristian Ollikainen
2025-08-24 16:13:07 +03:00
committed by GitHub
parent 85d6fdd213
commit 51941e6560
11 changed files with 266 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
<html lang="en">
<head>
<meta charset="utf-8"/>
<link rel="icon" type="image/svg+xml" href="/favicon.svg"/>
<meta name="viewport" content="width=device-width"/>
<meta name="generator" content={Astro.generator}/>
<title>Nestri Standalone Play</title>
</head>
<body>
<slot></slot>
</body>
</html>
<style>
@font-face {
font-family: "Basement Grotesque";
src: url("/fonts/BasementGrotesque-Black.woff") format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
* {
font-family: "Basement Grotesque", sans-serif;
}
body {
display: flex;
justify-content: center;
align-items: center;
background-color: #191919;
margin: 0;
padding: 0;
}
</style>