From 2fc5e2db3f9a060f1c0014674fc0d81a313c23a0 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Mon, 23 Feb 2026 18:21:42 -0600 Subject: [PATCH] add blog to website --- docs/design/actor_use_cases.md | 39 ++++++++++++++ website/content/blog/_index.md | 4 ++ website/hugo.toml | 4 ++ .../themes/prosperon/layouts/blog/list.html | 22 ++++++++ .../themes/prosperon/layouts/blog/single.html | 12 +++++ website/themes/prosperon/static/css/style.css | 51 +++++++++++++++++++ 6 files changed, 132 insertions(+) create mode 100644 docs/design/actor_use_cases.md create mode 100644 website/content/blog/_index.md create mode 100644 website/themes/prosperon/layouts/blog/list.html create mode 100644 website/themes/prosperon/layouts/blog/single.html diff --git a/docs/design/actor_use_cases.md b/docs/design/actor_use_cases.md new file mode 100644 index 00000000..a4904fd9 --- /dev/null +++ b/docs/design/actor_use_cases.md @@ -0,0 +1,39 @@ +# Actor Use Cases for Prosperon + +Confirmed implementation targets. These are the concrete reasons actors add value beyond basic frame scheduling. + +## 1. P2P Networking (Lockstep + Input Streaming) + +Actor security model enables safe P2P: +- **Lockstep**: Both peers run the same actor with the same inputs. Actors are deterministic (same messages in = same state). Synchronize input streams. +- **Input streaming** (GGPO-style): Each peer sends inputs to the other. Actors only see inputs, not internal state, so cheaters can't fabricate state — only send inputs that the other peer validates by running the simulation. +- Security-first actor system makes this safe by design. + +## 2. Game Sharing (DS Download Play Style) + +Send entire cell packages over the network. Receiver runs the game in a sandboxed actor. +- A cell program/game sends its entire package (code + assets) using the cell package system. +- The other person runs it in a sandboxed actor — can't touch host filesystem, can't read save data, can only draw sprites and send messages through the allowed interface. +- Same trust model as mod sandboxing but for complete games. + +## 3. Mod Sandboxing + +Untrusted code runs in its own actor, communicates through a controlled message interface. +- Mods can't corrupt game state. +- Related to game sharing — same isolation model. + +## 4. Background Asset Loading + +Refactor the resource manager (currently single-threaded) into an actor: +- Game sends: `{type: 'load', kind: 'image', path: 'player'}` +- Resources replies: `{type: 'loaded', path: 'player', data: }` +- Game never blocks. Request assets, keep running, handle them when they arrive. +- Sprites show placeholder until real texture lands. +- This is the natural actor pattern: send a message, get a message back. + +## 5. Editor <-> Game Isolation + +Editor runs as a separate actor, sends commands to the game actor. +- Can't corrupt game state. +- Clean separation of concerns. +- Editor can inspect/modify game state only through the message interface. diff --git a/website/content/blog/_index.md b/website/content/blog/_index.md new file mode 100644 index 00000000..c5d7293d --- /dev/null +++ b/website/content/blog/_index.md @@ -0,0 +1,4 @@ +--- +title: "Blog" +type: blog +--- diff --git a/website/hugo.toml b/website/hugo.toml index 1228663d..9e9e5676 100644 --- a/website/hugo.toml +++ b/website/hugo.toml @@ -24,6 +24,10 @@ theme = 'prosperon' name = 'Get Started' pageRef = '/start/' weight = 30 + [[menus.main]] + name = 'Blog' + pageRef = '/blog/' + weight = 35 [[menus.main]] name = 'Changelog' pageRef = '/changelog/' diff --git a/website/themes/prosperon/layouts/blog/list.html b/website/themes/prosperon/layouts/blog/list.html new file mode 100644 index 00000000..1ea178d9 --- /dev/null +++ b/website/themes/prosperon/layouts/blog/list.html @@ -0,0 +1,22 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+ {{ .Content }} + +
+ {{ range .Pages.ByDate.Reverse }} +
+
+

{{ .Title }}

+ {{ .Date.Format "January 2, 2006" }} +
+ {{ if .Summary }} +

{{ .Summary }}

+ {{ end }} +
+ {{ end }} +
+
+
+{{ end }} diff --git a/website/themes/prosperon/layouts/blog/single.html b/website/themes/prosperon/layouts/blog/single.html new file mode 100644 index 00000000..d34653c8 --- /dev/null +++ b/website/themes/prosperon/layouts/blog/single.html @@ -0,0 +1,12 @@ +{{ define "main" }} +
+
+
+

{{ .Title }}

+ {{ .Date.Format "January 2, 2006" }} +
+ {{ .Content }} +

← All posts

+
+
+{{ end }} diff --git a/website/themes/prosperon/static/css/style.css b/website/themes/prosperon/static/css/style.css index e6cefb69..7c852e79 100644 --- a/website/themes/prosperon/static/css/style.css +++ b/website/themes/prosperon/static/css/style.css @@ -411,6 +411,57 @@ th { font-size: 0.9em; } +/* ========================================= + Blog +========================================= */ +.blog-list { + margin-top: 2em; +} + +.blog-entry { + margin-bottom: 2em; + padding-bottom: 1.5em; + border-bottom: 1px solid rgba(255, 214, 0, 0.2); +} + +.blog-entry:last-child { + border-bottom: none; +} + +.blog-header { + display: flex; + align-items: baseline; + gap: 15px; + flex-wrap: wrap; +} + +.blog-header h2 { + margin: 0; + font-size: 1.4em; + border-bottom: none; + padding-bottom: 0; +} + +.blog-date { + color: rgba(255, 214, 0, 0.7); + font-size: 0.9em; + white-space: nowrap; +} + +.blog-post-header { + margin-bottom: 1.5em; +} + +.blog-post-header h1 { + margin-bottom: 0.1em; +} + +.blog-back { + margin-top: 3em; + padding-top: 1em; + border-top: 1px solid rgba(255, 214, 0, 0.2); +} + /* ========================================= Docs Layout ========================================= */