<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent changes to Project Angels 95</title><link href="https://sourceforge.net/p/angels-95/" rel="alternate"/><link href="https://sourceforge.net/p/angels-95/feed.atom" rel="self"/><id>https://sourceforge.net/p/angels-95/</id><updated>2026-10-25T05:56:19.808000Z</updated><subtitle>Recent changes to Project Angels 95</subtitle><entry><title>_Footer modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/_Footer/" rel="alternate"/><published>2026-10-25T05:56:19.808000Z</published><updated>2026-10-25T05:56:19.808000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.netea851d85b101907f2f282d3ba57a6d8541ee2f4e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v7
+++ v8
@@ -1,3 +1,3 @@
-Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 3ecefc5
+Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | a3810b1

 Built on [raylib](https://www.raylib.com/) 5.5.
&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>Building modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/Building/" rel="alternate"/><published>2026-10-25T05:56:19.771000Z</published><updated>2026-10-25T05:56:19.771000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.netb8778e53707d43bc22518e938dc4747cc999ccc1</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v7
+++ v8
@@ -263,33 +263,36 @@
 #### Per-host ports, master targets and unit drift

 The deploy **rewrites** `/etc/systemd/system/angels95-serv.service` and
-`angels95-master.service` from `tools/*.service` on every tag. Host-specific
-ports and announce flags must therefore not live in those two files — the next
-`b*` deploy reverts them. There are two supported places:
-
-1. **Systemd drop-in (per host, survives every deploy).** The deploy only

-   writes the main unit, never the `.d/` directory:
-
-   ```ini
-   # /etc/systemd/system/angels95-serv.service.d/host.conf
-   [Service]
-   ExecStart=
-   ExecStart=/srv/angels95/System/AngelServ \
-       --port 27115 --http-port 8180 \
-       --dir /srv/angels95/GameData --bind 0.0.0.0 \
-       --master 127.0.0.1:27910 \
-       --master-http http://127.0.0.1:27960
-   ```
-
-   `ExecStart=` (empty) resets the main unit's command; the second line replaces
-   it. Run `sudo systemctl daemon-reload` after editing. This is the durable
-   way to keep non-default ports on one host.
-
-2. **Repository default (all hosts):** change `tools/angels95-serv.service` /
-   `tools/angels95-master.service` and ship a tag. b108 did this for the master
-   (`27910/27960`) so it can coexist with the hosted listing.
-
-Master announce targets are better kept in `System/OzServer.ini`, which the
+`angels95-master.service` from `tools/*.service` on every tag. Never edit the
+host copies: the next `b*` deploy reverts them. The checked-in units now carry
+the TribeWarez fleet settings, so they survive deploys:
+
+- `angels95-serv.service`: `27115/8180` (coexists with the Docker fleet on the
+  binary defaults `27015/8080`), heartbeats to the systemd master
+  `27910/27960`, and `--public-ip 159.195.10.230`.
+- `angels95-master.service`: `27910/27960` (coexists with the hosted master on
+  `27900/27950`).
+
+For a **different** host, use a systemd drop-in — the deploy only writes the
+main unit, never the `.d/` directory:
+
+    :::ini
+    # /etc/systemd/system/angels95-serv.service.d/host.conf
+    [Service]
+    ExecStart=
+    ExecStart=/srv/angels95/System/AngelServ \
+        --port 27015 --http-port 8080 \
+        --dir /srv/angels95/GameData --bind 0.0.0.0 \
+        --master 127.0.0.1:27910 \
+        --master-http http://127.0.0.1:27960 \
+        --public-ip &amp;lt;this-host-public-ip&amp;gt;
+
+`ExecStart=` (empty) resets the main unit's command; the second line replaces
+it. Run `sudo systemctl daemon-reload` after editing. Changing
+`tools/*.service` and shipping a tag is the alternative when *every* host
+should share the values.
+
+Master announce targets can also live in `System/OzServer.ini`, which the
 deploy preserves:

     :::ini
@@ -299,10 +302,11 @@
     # Local systemd master from this repo (b108+), optional:
     Master1=http://127.0.0.1:27960

-CLI flags in the unit/drop-in override the ini, so do not pass `--master` there
-if you want the ini to be authoritative. To list only on the public portal,
-leave `Master1` out; to keep the systemd fleet self-contained, leave
-`Master` out instead.
+CLI flags in the unit/drop-in override the ini, so the shipped unit's
+`--master`/`--master-http` win. To make the ini authoritative, remove those
+flags (via a drop-in or the repo unit) and list both masters there. To list only
+on the public portal, leave `Master1` out; to keep the systemd fleet
+self-contained, leave `Master` out instead.


 The binaries are built on `ubuntu-24.04` and CI verifies they require no symbol
@@ -312,11 +316,11 @@

 Create `System/OzServer.ini` once with the host's `[Server]`/`[Auth]` tokens —
 the deploy never writes that file. Open the ports you actually use:
-`27015/udp` + `8080/tcp` for `AngelServ`, `27910/udp` + `27960/tcp` for the
-in-repo `AngelMaster` (put an HTTPS reverse proxy in front of it if it is
-public). Advertise it explicitly — game servers via a second `[MasterServers]`
-entry, clients via `System/Angels95.ini` — as the unit is not on the default
-`27900/27950` ports.
+`27115/udp` + `8180/tcp` for the shipped `AngelServ` unit (binary defaults are
+`27015/8080`), `27910/udp` + `27960/tcp` for the in-repo `AngelMaster` (put an
+HTTPS reverse proxy in front of it if it is public). Advertise the master
+explicitly — game servers via a second `[MasterServers]` entry, clients via
+`System/Angels95.ini` — as the unit is not on the default `27900/27950` ports.

 #### Repository configuration

&amp;lt;/this-host-public-ip&amp;gt;&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>_Footer modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/_Footer/" rel="alternate"/><published>2026-10-25T05:56:19.720000Z</published><updated>2026-10-25T05:56:19.720000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net3d9176f41964d49931da0d334251b50e6ba492ae</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v6
+++ v7
@@ -1,3 +1,3 @@
-Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 265b41e
+Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 3ecefc5

 Built on [raylib](https://www.raylib.com/) 5.5.
&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>Building modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/Building/" rel="alternate"/><published>2026-10-25T05:56:19.692000Z</published><updated>2026-10-25T05:56:19.692000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net6e87e3b7f1b68a241a78b245c077df89046851e8</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v6
+++ v7
@@ -260,6 +260,51 @@
 sudoers rule than `NOPASSWD:ALL` is not a security boundary. Use a dedicated,
 key-only account and restrict it at the SSH/firewall level instead.

+#### Per-host ports, master targets and unit drift
+
+The deploy **rewrites** `/etc/systemd/system/angels95-serv.service` and
+`angels95-master.service` from `tools/*.service` on every tag. Host-specific
+ports and announce flags must therefore not live in those two files — the next
+`b*` deploy reverts them. There are two supported places:
+
+1. **Systemd drop-in (per host, survives every deploy).** The deploy only

+   writes the main unit, never the `.d/` directory:
+
+   ```ini
+   # /etc/systemd/system/angels95-serv.service.d/host.conf
+   [Service]
+   ExecStart=
+   ExecStart=/srv/angels95/System/AngelServ \
+       --port 27115 --http-port 8180 \
+       --dir /srv/angels95/GameData --bind 0.0.0.0 \
+       --master 127.0.0.1:27910 \
+       --master-http http://127.0.0.1:27960
+   ```
+
+   `ExecStart=` (empty) resets the main unit's command; the second line replaces
+   it. Run `sudo systemctl daemon-reload` after editing. This is the durable
+   way to keep non-default ports on one host.
+
+2. **Repository default (all hosts):** change `tools/angels95-serv.service` /
+   `tools/angels95-master.service` and ship a tag. b108 did this for the master
+   (`27910/27960`) so it can coexist with the hosted listing.
+
+Master announce targets are better kept in `System/OzServer.ini`, which the
+deploy preserves:
+
+    :::ini
+    [MasterServers]
+    # Public portal (hosted, Docker fleet on 27900/27950):
+    Master=https://angels95.tribewarez.com/master
+    # Local systemd master from this repo (b108+), optional:
+    Master1=http://127.0.0.1:27960
+
+CLI flags in the unit/drop-in override the ini, so do not pass `--master` there
+if you want the ini to be authoritative. To list only on the public portal,
+leave `Master1` out; to keep the systemd fleet self-contained, leave
+`Master` out instead.
+
+
 The binaries are built on `ubuntu-24.04` and CI verifies they require no symbol
 newer than `GLIBC_2.39`, so the VPS must provide at least that (Ubuntu 24.04 or
 a newer compatible distro). `deploy-remote.sh` runs `--version` on both binaries
&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>_Footer modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/_Footer/" rel="alternate"/><published>2026-10-25T05:56:19.633000Z</published><updated>2026-10-25T05:56:19.633000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net63e4cb5ac4089f3d451e341c5fd991f7bc1bdf35</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v5
+++ v6
@@ -1,3 +1,3 @@
-Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 80d07b7
+Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 265b41e

 Built on [raylib](https://www.raylib.com/) 5.5.
&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>Building modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/Building/" rel="alternate"/><published>2026-10-25T05:56:19.597000Z</published><updated>2026-10-25T05:56:19.597000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net435ed34bec38a3ff8c29bb2c769d10e2c09473b2</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v5
+++ v6
@@ -232,16 +232,15 @@
    with journal output if one does not become active.

 Deploys are gated on the `production` GitHub environment, so the repository can
-require a reviewer before a rollout. By default only `AngelServ` is shipped: the
-public listing normally runs the separate
-[`TribeWarez/angels95-master-server`](https://github.com/TribeWarez/angels95-master-server)
-deployment and two masters cannot share UDP `27900`. Set the repository variable
-`DEPLOY_MASTER` to `true` only on a host that should run the in-repo
-`AngelMaster` itself. A deploy that does not ship `angels95-master.service`
-automatically runs `systemctl disable --now angels95-master` if that unit was
-installed by an earlier deploy, so switching the flag off also stops a
-stale/crash-looping master (e.g. one that lost the `27900` port to the hosted
-master).
+require a reviewer before a rollout. By default only `AngelServ` is shipped. The
+in-repo `AngelMaster` is opt-in: when shipped it listens on **`27910/udp` +
+`27960/tcp`** (see `tools/angels95-master.service`), so it can coexist with the
+hosted listing on the protocol defaults `27900/27950`. Set the repository
+variable `DEPLOY_MASTER` to `true` only on a host that should run the in-repo
+master. A deploy that does not ship `angels95-master.service` automatically runs
+`systemctl disable --now angels95-master` if that unit was installed by an
+earlier deploy, so switching the flag off also stops a stale/crash-looping
+master.

 #### One-time VPS setup

@@ -268,9 +267,11 @@

 Create `System/OzServer.ini` once with the host's `[Server]`/`[Auth]` tokens —
 the deploy never writes that file. Open the ports you actually use:
-`27015/udp` + `8080/tcp` for `AngelServ`, `27900/udp` + `27950/tcp` for
-`AngelMaster` (put an HTTPS reverse proxy in front of the master if it is
-public).
+`27015/udp` + `8080/tcp` for `AngelServ`, `27910/udp` + `27960/tcp` for the
+in-repo `AngelMaster` (put an HTTPS reverse proxy in front of it if it is
+public). Advertise it explicitly — game servers via a second `[MasterServers]`
+entry, clients via `System/Angels95.ini` — as the unit is not on the default
+`27900/27950` ports.

 #### Repository configuration

@@ -289,7 +290,7 @@
 |---|---|---|
 | `DEPLOY_PORT` | `22` | SSH port |
 | `DEPLOY_PATH` | `/srv/angels95` | install root; holds `System/` and `GameData/` |
-| `DEPLOY_MASTER` | `false` | also ship `AngelMaster`; leave `false` when the public listing runs in `angels95-master-server` (two masters cannot share UDP 27900) |
+| `DEPLOY_MASTER` | `false` | also ship the in-repo `AngelMaster` on `27910/27960`; opt-in, so it does not collide with the hosted listing on `27900/27950` |

 #### Rollback and manual redeploy

&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>_Footer modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/_Footer/" rel="alternate"/><published>2026-10-25T05:56:19.539000Z</published><updated>2026-10-25T05:56:19.539000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net594d349ea91703b87a9ee902effed64ff31393e3</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v4
+++ v5
@@ -1,3 +1,3 @@
-Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 2163870
+Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 80d07b7

 Built on [raylib](https://www.raylib.com/) 5.5.
&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>Building modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/Building/" rel="alternate"/><published>2026-10-25T05:56:19.509000Z</published><updated>2026-10-25T05:56:19.509000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net758d99837eb5e65c094b5b7a5e5822534469992d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v4
+++ v5
@@ -232,14 +232,16 @@
    with journal output if one does not become active.

 Deploys are gated on the `production` GitHub environment, so the repository can
-require a reviewer before a rollout. By default both `AngelServ` and
-`AngelMaster` are shipped; set the repository variable `DEPLOY_MASTER` to
-`false` when the public listing is the separate
+require a reviewer before a rollout. By default only `AngelServ` is shipped: the
+public listing normally runs the separate
 [`TribeWarez/angels95-master-server`](https://github.com/TribeWarez/angels95-master-server)
-deployment and this host should run only the game server. The deploy only
-manages units it is given, so if a host previously ran `angels95-master` and you
-then switch `DEPLOY_MASTER` off, stop it once by hand
-(`sudo systemctl disable --now angels95-master`).
+deployment and two masters cannot share UDP `27900`. Set the repository variable
+`DEPLOY_MASTER` to `true` only on a host that should run the in-repo
+`AngelMaster` itself. A deploy that does not ship `angels95-master.service`
+automatically runs `systemctl disable --now angels95-master` if that unit was
+installed by an earlier deploy, so switching the flag off also stops a
+stale/crash-looping master (e.g. one that lost the `27900` port to the hosted
+master).

 #### One-time VPS setup

@@ -287,7 +289,7 @@
 |---|---|---|
 | `DEPLOY_PORT` | `22` | SSH port |
 | `DEPLOY_PATH` | `/srv/angels95` | install root; holds `System/` and `GameData/` |
-| `DEPLOY_MASTER` | `true` | ship `AngelMaster` too; set `false` for a game-server-only host |
+| `DEPLOY_MASTER` | `false` | also ship `AngelMaster`; leave `false` when the public listing runs in `angels95-master-server` (two masters cannot share UDP 27900) |

 #### Rollback and manual redeploy

&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>_Footer modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/_Footer/" rel="alternate"/><published>2026-10-25T05:56:19.454000Z</published><updated>2026-10-25T05:56:19.454000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.netf275882786a894c5de42955b98e106eb3c92b6d0</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v3
+++ v4
@@ -1,3 +1,3 @@
-Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | ef8c2a2
+Angels95 - AngelTech Engine | [repository](https://github.com/TribeWarez/Angels-95) | 2163870

 Built on [raylib](https://www.raylib.com/) 5.5.
&lt;/pre&gt;
&lt;/div&gt;</summary></entry><entry><title>Menu System modified by Oskar Artes</title><link href="https://sourceforge.net/p/angels-95/wiki/Menu%2520System/" rel="alternate"/><published>2026-10-25T05:56:19.416000Z</published><updated>2026-10-25T05:56:19.416000Z</updated><author><name>Oskar Artes</name><uri>https://sourceforge.net/u/tribewarez/</uri></author><id>https://sourceforge.net093354aa210b6536c0a7a5a81719ed61d7a651eb</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -23,8 +23,8 @@
 `MenuMetrics::Compute(w, h, dpi, uiScale)` returns the frame, title bar, nav bar,
 content and footer rectangles plus every text/row size. Pages must use those
 values; a hardcoded rect is a bug. `UiScale` is persisted in
-`System/Angels95.ini` as `ui_scale`. The menu draws directly to the screen, not
-into the game's `Target`, so resizing cannot leave it stretched.
+`System/Angels95.ini` as `[AngelTech.HUD] ui_scale`. The menu draws directly to
+the screen, not into the game's `Target`, so resizing cannot leave it stretched.

 Breakpoints: `compact` below 1100px, `wide` from 1150px. The character page uses
 two columns whenever the body is at least 700px wide. Long lists scroll with the
&lt;/pre&gt;
&lt;/div&gt;</summary></entry></feed>