Repository navigation
Releases
v0.17.0
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
Another player's craft is where it is. A copy was drawn 150 ms in the past,
which is how a walking thing is drawn smoothly and in low orbit is a kilometre:
a craft was put back a kilometre the instant its engine lit, a kitten out of a
hatch appeared a kilometre behind its capsule, and two players in orbit were
never beside each other. A copy is drawn at the present now. Two craft meeting
in orbit are drawn 12-14 mm from where their owners have them, and that over a
wire holding every datagram 50 ms give or take 20 and losing one in fifty.
You can dock with a craft nobody is flying. The two become one craft for
everyone, and two again when you undock. Two players' craft do not dock yet: the
ports touch, nothing happens, and you are told why.
A warp climbs to its speed. Asked for 1000x, the world ran at 1000x for a second
before any machine could say it could not keep up and then spent nineteen
seconds making that up, and when a long warp ended, the game that had run least
far ahead set the clock and the other stood still for the difference: two and a
half minutes, once. A warp now starts a step above normal and climbs as far as
every machine in the room can fly, a room that is catching up is left at the
speed it is catching up at, and when the warp ends the clock goes on to the game
that ran furthest. A game that is at no craft keeps the room's time, where it
came back from a 50x warp 229 s behind everybody.
A crash is the same crash in both games. A craft that dropped a stage or lost a
part vanished from every other game for five seconds; it changes shape in one
frame. Wreckage was drawn metres from where it was and jumping, ten to twenty
times a crash by a metre or more; a rocket falling over into thirty pieces now
has its worst piece within two metres and none that jumps. Pieces that stood in
their maker's world and no other, three of twenty-eight, are in both. And a
craft somebody was watching as it docked or crashed could be taken by the
watcher in the frame it left, and rebuilt in every world inside what it had
become part of. It is not taken.
A kitten walking was drawn further behind itself every second of the walk, to
1.6 m, and caught up in jumps. It is drawn 4-5 cm behind.
Four things were said once, and a wire that loses one datagram in fifty showed
what each cost: a game in a world the server did not count it in, a server
waiting for good on a world it had asked nobody for, a warp still shown after it
had ended, and a destroyed craft standing on in every world but its owner's.
Each is said until it has been heard.
For whoever runs a server. --trace <path> writes the clock and the warp a line
of JSON at a time, for a test and for nothing else. And from 0.16.1, which was
never tagged and is all in this release: an advertising server reads
directories.txt for itself once an hour and withdraws from any directory that
has left it, so it now contacts raw.githubusercontent.com, which an egress
allowlist holding only a directory's address will refuse; a server that cannot
read the list announces where 0.16.0 did. That list has a second directory in
it, ksamp.safeshows.dev.
Not right yet. A craft nobody owns is left to each world, and after a long warp
one stood 3.4 m from itself in two games, so one player saw a docking 3.4 m from
the port. A piece of wreckage at rest that gets struck is drawn metres out for
its last second or two. All of this was measured with two games on one machine,
on loopback and through a relay that delays and drops; what two games across the
internet do is still not known.
Nothing in the protocol changed: 0.16 and 0.17 speak version 23 and can play
together. A game still on 0.16 draws everybody else as 0.16 did.
Every change since v0.16.0
- docs: a day of two games measured, and what the handoff now says to do
- test(tools): both games recorded a frame at a time, and a warp walked and judged
- feat(mod): the bridge points a craft, lands it on its engine and flies it onto a port
- fix(mod): a copy stays with its craft through a walk, a breakup and a docking
- feat(server): --trace writes the clock and the warp a line at a time
- fix(server): a warp climbs to its speed, and what was said once is said again
- fix(protocol): another player's craft is drawn where it is now
- docs: a handoff for testing multiplayer with two games
- docs: the warp stop, the wire, and a kitten that does not arrive whole
- feat(server): a relay that holds datagrams, for testing off loopback
- fix(server): the clock keeps up with a room that has run past it
- docs: half a minute of warp costs eight minutes of frozen game
- docs: ending a timewarp stops the room, and a plan for testing the clock
- docs: a lone player warped past the server and his game stopped dead
- docs: what two games can be made to do, and what they cannot
- test(tools): the breakup run measures what it claims to
- feat(mod): the bridge starts a game, builds a craft and fails its parts
- fix(mod): wreckage is somebody's craft in both worlds
- chore: a second directory joins the shared list
- feat(server): an advertising server reads the shared directory list
- docs: the documentation says what the code does
- docs: running a directory says the easy ways first
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. The PLAY MULTIPLAYER window comes up before
anything else: pick a server from the list it shows, or type an address, and press
CONNECT.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:e81f7f9722995635ff3a67789780cb6790ac8f654745eaa211c57f9a1c93eb74Or an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.16.0
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
The Multiplayer window is laid out to a design by Beik, and it says what is the
server's apart from what is yours.
The list is the window. Every column holds a fact about a server -- its name,
who is on it, the world it holds, the round trip to it -- so the world it holds
stays on the row even when something about it is wrong, which is exactly when
you want to compare one server against another. Whether your game can join is
the state of the row instead: a server you cannot join carries a word beside its
name saying which of the things that must match did not, and the sentence
telling you what to do about it sits beside the button that would act on it.
PLAY ALONE is in the title bar, in the colour of something worth pressing.
CONNECT is at the foot of the block that says where you are going and what it
wants, and is greyed where that server would turn you away over its build or
your mods -- not where it is merely full or did not answer, since the first
changes while you look at it and the second is as likely to be a lost datagram.
Under the list, what you are on the left and where you are going on the right.
A server that would refuse you now says so in the window. It used to say it only
in the log and the chat, so pressing CONNECT looked like pressing nothing. The
list also weighed only mods you were missing and not mods you were running that
a world has not got -- which a server refuses just as firmly -- so it would call
a server joinable and then go quiet when it was not. A server that wants no
password says so in words rather than by grey.
The window opens on the monitor the game is on, which it did not when there was
more than one. The scoreboard sizes its own columns, so a long name no longer
runs under the ping beside it. The badge in the menu bar says "connecting..."
while it is.
Nothing in the protocol changed: 0.15 and 0.16 games speak version 23 and can
play together.
Every change since v0.15.0
- docs: the window's design is Beik's, and the README says so
- fix(mod): the blocks are a step above the body, not three steps
- feat(mod): the start-settings box moves into the block it is about
- fix(mod): room between the words and the rules, and a block that does not scroll
- fix(mod): the Latency column ends where the button under it begins, and Add server goes
- feat(mod): PLAY ALONE sits in the titlebar
- fix(mod): the list fills its box and the blocks under it are blocks
- feat(mod): the start window is the list, with what you are and where you are going under it
- fix(mod): a server says whether it wants a password, and a chosen row still reads
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:4dc3bb720ab832bead22cb6e4ddd09e8527ef558f5eb4423773dd8a6743b97c6Or an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.15.0
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
The server list says what is the server's and what is yours. Every column is
something about the server, so the world it holds stays on the row even when
something about it is wrong -- which is when you most want to compare one server
against another. Whether your game can join is the state of the row: one you
cannot join is dimmed, with a word beside it saying what to do about it, and the
sentence explaining it sits beside the button that would act on it. The table
has a title, a count of what is joinable, and REFRESH across from it.
CONNECT is greyed where that server would turn you away over the build it wants
or the mods you have. Not where it is merely full or did not answer: the first
changes while you look at it, the second is as likely to be a lost datagram, and
neither is worth locking you out of a server that is fine.
A server that refuses you now says so in the window. It used to say it only in
the log and the chat, so pressing CONNECT looked like pressing nothing at all.
The list also weighed only mods you were missing and not mods you were running
that a world has not got -- which a server refuses just as firmly -- so it would
call a server joinable and then sit silent when it was not.
Your name has a block of its own. Who is playing is not a fact about the server,
and it had been sitting between the server's address and its password.
The window opens on the monitor the game is on, which it did not when there was
more than one: it was placed against the whole desktop, so it drew off the side
of the game with a sliver showing and looked like a menu entry that did nothing.
The scoreboard sizes its own columns, so a long name no longer runs underneath
the ping beside it. The badge in the menu bar says "connecting..." while it is,
rather than an address that reads as being in the world already.
mp.ksarmory.com is called "Multiplayer test server".
Nothing in the protocol changed: 0.14 and 0.15 games speak version 23 and can
play together.
Every change since v0.14.0
- fix(mod): the World column reads as one kind of thing
- feat(mod): CONNECT is greyed where this game would be turned away
- feat(mod): a row says which way it fails, and says it once
- feat(mod): the server list sorts what is the server's from what is this game's
- fix(mod): the mods row keeps its number where the number means something
- fix(mod): the line beside REFRESH sits in the middle of it
- fix(mod): a server that will refuse this game says so where the player is looking
- docs: the mods setting belongs in the table a server operator reads
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:3ae132b9bc48034e1be5b3e2e21a98e4e23853667f1e1e65aa9c7a713ea88a85Or an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.14.0
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
The Multiplayer window's server list grew up: headed columns, the round trip to
each server, the mods it wants, and a password field that greys itself where a
server has said it wants none. Latency sits last, where a server browser puts
it, because the build, the mods and whether anybody is on it all decide before a
round trip ever does.
The window opens on the monitor the game is on. It was placed against the whole
desktop's work area, so on a second monitor it drew almost entirely off the side
of the game -- a nineteen-pixel sliver on screen, which from the Mods menu looks
exactly like an entry that does nothing. The scoreboard sizes its own columns
now rather than trusting offsets a long name runs past, and the badge in the
menu bar says "connecting..." through joining, seeding, waiting for the world
and loading it, instead of showing an address that reads as being in the world.
Running a server
mods pins what a world asks of players:
mods = "Core,KSAMultiplayer"
A world's list otherwise follows whoever last handed one over, and a server asks
a player for a fresh save every few minutes -- so one player joining with a mod
enabled writes it into what the world wants, and from the next snapshot on
nobody without it can join. It is the whole list and not a floor: a server
refuses players running mods its world has not got, so pinning to Core and this
mod means turning everything else off to play there.
Nothing in the protocol changed. A 0.13 game and a 0.14 game speak the same
version 23 and can play together.
Every change since v0.13.2
- fix(mod): the Multiplayer window opens on the monitor the game is on
- feat(server): the mods a world wants can be pinned
- feat(mod): the server list has headings, and latency last
- feat(mod): a row says the round trip, the mods, and whether a password is wanted
- fix(mod): the start window has room for the list and the fields both
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:36b8d332dc6ea5c49d7c3a380242c60f923e8f3cb4999169bf1f55eb5032c90eOr an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.13.2
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
A listed server was going out with a field the directory's specification does
not name. Nothing read it, and a reader that ignores what it does not know saw
no difference, but a document written down for other people to implement has to
be the shape that is served.
Nothing in the mod or the protocol changed: 0.13.0, 0.13.1 and 0.13.2 games all
speak protocol 23 and can play together.
Every change since v0.13.1
- fix(directory): the list carries only the fields its specification names
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:2c346064c4f51203bfaa781d2f6f0621ebd5e3da4e3a894c24fb9347967294d0Or an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.13.1
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
A server sharing a machine with a directory can now list itself. It was refused
by the directory beside it, because an announcement that never leaves a host
arrives from an address inside that host and no player can reach one of those.
Such a server gives a name with advertise-as and is held to it instead; one
with no name to give is still refused, and now says which of the two cases it
is.
Nothing else changed, and nothing in the mod changed at all: a 0.13.0 game and a
0.13.1 game speak the same protocol and can play together.
Every change since v0.13.0
- fix(directory): a server on the directory's own machine can list itself
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:6164e7b4aae71f2e9efe3798b0460da0cfea6b6d2dc0dfca9cf638087a08405aOr an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.13.0
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 23.
What's new
The Multiplayer window now lists the servers it can find, so joining one no
longer means being told its address first. Each row says how many players are
on it and, for a server you cannot join, why -- the KSA build it wants, or a
mod you have not got. Picking a row fills the address in; servers you have
connected to before are listed too, so you can see whether anybody is on them.
Nothing about the list is on the way in. Typing an address and pressing Connect
works exactly as before, whether or not the list came up at all.
Everyone has to be on this release. The protocol moved to 23, so a 0.12.1
game cannot join a 0.13.0 server and the server says so by name. The server at
mp.ksarmory.com updates itself with this release.
What the list costs you: the mod fetches the list of directories and then each
directory's servers over HTTPS, and asks every server on it the same question
your game asks before joining one. The operators of those servers see a request
from your address, as they would if you typed the address yourself -- a few
dozen rather than one. Nothing of yours goes with it: no name, no account.
A directories.json beside your settings in Documents/KSAMultiplayer narrows the
list or empties it.
Running a server
Listing yours is off unless you turn it on, because being listed publishes the
address the server is reached at:
advertise = true
The server then says at every start whether it is listed, and if not, why, in
words you can act on. Nothing is listed on asking: a directory sends the game's
own pre-join query to your address and lists the server only once that answers,
so a closed port or a wrong forward reads as exactly that in your log. Turning
it off takes the server out at once, without a restart.
A server behind carrier-grade NAT cannot be listed, and is told so.
Running a directory
Anybody can. docs/DIRECTORY.md is the whole specification, and the read half is
a JSON document a static file satisfies -- so a group that only wants to publish
a fixed list of servers it trusts needs no software at all. Directories are
listed in directories.txt, which the mod and every advertising server read at
startup, so adding one is a pull request and retiring one is a commented-out
line. Neither is a release.
Every change since v0.12.1
- ci(release): the directory goes up with the server, by digest
- docs: the server browser, what it costs a player, and how to run a directory
- feat(mod): the first window lists the servers it can find
- feat(server): a server lists itself when it is told to, and says so either way
- feat(directory): a list of servers, each one reached before it is listed
- feat(protocol): a welcome says who is on a server, and many can be asked at once
- fix(infra): a world's log is the host's, so a deploy stops taking it with it
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:b5de9e57431913cff5435bcd8be6776848db0c75fd2fbce2c56afadb2d7b549cOr an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.12.1
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 22.
What's new
Protocol stays 22 and nothing on the wire changed, so a game of 0.12.0 plays with this one and a
server need not move with it. The fault below is in the game's half, though, so a player who wants
their own rocket seen needs this mod rather than the last one. KSA 2026.11.10.5801 and StarMap 0.5.3
as before.
A rocket launched from the vehicle editor is built in everybody else's game again. Since 0.11.0 it
was not: the craft was claimed, its name stood in everyone's scoreboard and its position was relayed
to everyone, and no other game was ever told how to build it -- so the players already in the world
saw a name flying and no rocket. Anyone who joined afterwards was fine, the world they are handed
holding the craft, which is part of why this went three releases without being named. The launch
menu for a craft already built never came through that path and was never affected.
The same fault left a game re-sending a claim the server had refused, every two seconds for the rest
of the session, whenever the new craft's name collided with another player's -- which for a first
launch is often, KSA naming them all NewRocket_1.
No two games start at the same launchpad. The site's own pad was every game's first choice whatever
else was turned, so two players launching at a quiet site, inside the moment before either's craft
had crossed the wire to be counted, both stood on the same slab. Each game begins at a pad its own
player id picks out now.
The launch menu refuses a launch onto a site with every pad taken, as the editor already did. It
used to stack onto the site's own pad without a word, and says so with KSA's own alert.
Every change since v0.12.0
- fix(tools): two games run windowed, and a setting that misses says so
- feat(mod): the launch menu refuses a full site, and a craft handed over is written down
- fix(mod): a launch from the editor is described, and no two games start at one pad
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:99a171dd131cf4ff48d8922e03d50bed6a4a05b02e19aa559e4ba6fcd05d4654Or an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.12.0
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 22.
What's new
The ground under the extra launchpads is levelled with the ground under the one
the game shipped, so all eight stand on the flat at every site.
They used to sit out on the slope at the edge of a site's levelled ground, each
one buried on the side facing the site and hanging over a drop on the side
facing away. At Vandenberg, where the site is lifted 52 m out of a hillside,
that was 5.8 m of burial and a 10.5 m overhang, the pads stood at visibly
different heights from one another, and a kitten could walk in under a pad and
be stuck there. The pads are also further apart than they were -- 169 m between
centres rather than 130 -- so the grass aprons that had always overlapped now
clear each other.
Ground clutter is kept off whole launch complexes rather than off four single
pads, so grass and rocks no longer grow through the extra pads.
Everyone has to update. Protocol 22: a game that has not levelled its ground
cannot share a world with games that have, since craft would stand against
ground of a different shape. Every running server locks its players out until
both it and they are on this release.
Every change since v0.11.1
- fix(mod): the ground under the extra launchpads is levelled with the site's own
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:fe660b21408efdd1202fb1782d0a10f923a4c544fc762745e5d67b85c11fb1ddOr an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.
v0.11.1
A shared world for Kitten Space Agency: several players, each in their own game, flying in
one universe kept by a dedicated server that runs on Linux with no game installed.
Everyone in a world needs KSA 2026.11.10.5801 and a mod of this release. A game and a
server speaking different versions refuse each other by name rather than misread the
bytes, and this one speaks protocol 21.
What's new
Protocol stays 21 and nothing on the wire changed, so a game of 0.11.0 plays with this one and a
server need not move with it. KSA 2026.11.10.5801 and StarMap 0.5.3 as before.
Two windows that sat on top of KSA's own readouts now keep off them. The chat cleared the navball by
a number measured on a test profile at 800x500, which at the sizes anybody plays at put its lower
half inside the ball; and what has to be cleared turns out to be the cluster rather than the ball,
since the mode row above it reaches higher than the disc does. The scoreboard Tab holds up sat flush
under the altimeter -- two pixels under it -- which read as clipping it, and now has air.
The menu bar says how many are in the world beside the server's name: "localhost (3 players)", this
game counted among them so the number agrees with the list Tab shows.
Seen in a game at 1600x1024 rather than measured off the old screenshot again.
Every change since v0.11.0
- fix(mod): the chat and the scoreboard keep off KSA's own readouts
- docs(listing): the thread is up, and its URL is in the listing
- docs: a Borea listing, and the thread it has to hang on
- ci: a release says what is in it, and the build warns about nothing
Playing
Install StarMap, unzip KSAMultiplayer-*.zip
into KSA's mods folder and enable it. Load a world, get into flight, and the
Multiplayer window is at the top right.
There is a server at mp.ksarmory.com to try it on.
Hold Tab for who is playing and their ping, Enter for a chat line. A craft someone
else is flying carries their name and is theirs: you can watch it, not fly it. Changing the
simulation speed is put to everyone first, and only whoever asked can end the warp.
Hosting
docker run -dit --name ksamp -p 50100:50100/udp -v ksamp-world:/data \
-e KSAMP_NAME="My server" ghcr.io/laurensdev/ksamp-server@sha256:9176700d864ed99834387008644933712645f658266a9012a66287652f4eb3adOr an executable from below, needing no .NET and no KSA:
ksamp-server-linux-x64.tar.gz (with a systemd unit beside it),
ksamp-server-linux-arm64.tar.gz for a Pi or an ARM VPS, or
ksamp-server-win-x64.zip to run ksamp-server.exe on the machine you already have.
The server has no world until a player gives it one, and hands that world to everyone who
joins after -- or set empty-world and it starts with one of its own.
Hosting on the same machine you play on works: the server is its own process and needs no
game. Whoever else joins needs the port open to them.
Its commands are typed into its console, which is standard input -- hence -it above, and
docker attach ksamp to reach it, Ctrl+P Ctrl+Q to leave it running. clear is the broom
for a world filling up with spent stages: every craft nobody is flying goes, out of every
game and not just out of the server, and clear Rocket_* narrows it. reload hands the
world out again, which takes a few seconds and no reconnection, and is the only thing that
ever puts universe time back.
Upgrading a server when KSA has
A world remembers the KSA build of whoever gave it to the server, and the server turns away
anyone running a different one. So the day KSA updates, a world seeded before it refuses
everybody who updates -- and nothing says so from inside the game beyond the refusal.
Either fresh at the console, which throws that world away and starts an empty one, or
set ksa-build <the new build> to make the operator's word the test instead of the
world's. A world the server started by itself records no build and turns nobody away.
State
Two games on one machine have flown in one world through it: launching, EVA, chat, the
scoreboard, nametags, a voted time warp, and an 89-part rocket staged while the other game
watched and rebuilt the stage it dropped. Another player's engines are seen to burn even on
a craft this game is not simulating, 7,576 km away. What two games across the internet do
is not known yet.