Deploy LPC to Europe β Lars PensjΓΆ πΈπͺ (Chalmers University Gothenburg 1989), the Language That Invented Online Multiplayer, on EU Infrastructure in 2026
In 1989, the World Wide Web did not yet exist. Tim Berners-Lee would not publish his proposal for hypertext at CERN until the following year. Yet in Gothenburg, Sweden, a computer science student at Chalmers University of Technology named Lars PensjΓΆ πΈπͺ had already created something that enabled strangers across the internet to inhabit a shared virtual world in real time.
He called it LPMud β Lars PensjΓΆ's Multi-User Dungeon. The language he designed to power it was LPC β Lars PensjΓΆ's C. It was the first programming language purpose-built for internet-accessible multiplayer virtual environments, and it introduced architectural ideas β persistent objects, hot-reloadable code, sandboxed execution, capability-based security β that became central to cloud computing decades later.
Lars PensjΓΆ and the LPMud Architecture
Lars PensjΓΆ πΈπͺ was a student at Chalmers University of Technology (Chalmers tekniska hΓΆgskola) in Gothenburg, Sweden β one of Europe's foremost technical universities, founded in 1829, a member of the IDEA League alongside ETH ZΓΌrich π¨π, TU Delft π³π±, Imperial College London π¬π§, and ParisTech π«π·.
PensjΓΆ was an avid player of MUDs β Multi-User Dungeons β text-based adventure games accessible via Telnet in which players explored virtual rooms, fought monsters, and interacted with each other. The existing MUD implementations of the era (MUD1 by Roy Trubshaw π¬π§ and Richard Bartle π¬π§ at Essex University, AberMUD by Alan Cox π¬π§) had a critical limitation: adding new content required halting the server, modifying C source code, recompiling, and restarting. The game world was static between updates.
PensjΓΆ designed LPMud and its scripting language LPC to solve this problem:
LPMud Architecture (Lars PensjΓΆ πΈπͺ, Chalmers Gothenburg 1989):
Game Driver (C, compiled)
β Network I/O β Telnet connections from players
β Scheduler β manages LPC object execution
β Interpreter β executes LPC bytecode
β Memory manager β handles LPC object lifecycle
β
Master Object (LPC)
β Controls what other objects can do
β Defines security model and capabilities
β Loaded at startup, governs all other objects
β
Mudlib (LPC objects)
β room.c β defines rooms
β player.c β defines player characters
β monster.c β defines NPCs
β weapon.c β defines items
β Each object: persistent state + callable methods
β Hot-loading: new objects deployed WITHOUT server restart
β Sandboxing: objects cannot call system(), exec(), or file I/O
without explicit master-object permission
β Persistence: object state survives across server cycles
β Capability model: permissions granted per-object by master
The key insight was separation of the game driver from the game content. The driver β compiled C β handled network I/O, scheduling, and the LPC interpreter. Everything else β rooms, players, monsters, items, quests β was LPC code. Adding a new dungeon room meant uploading a new .c file and telling the driver to load it. No compilation. No restart. The world could grow while players were inside it.
The LPC Language
LPC is a C-like language with automatic memory management, designed for object-oriented programming in a persistent, sandboxed environment:
/* Example LPC object: a room (room.c) */
/* LPMud heritage from Lars PensjΓΆ πΈπͺ Chalmers 1989 */
inherit "/std/room";
void create() {
set_name("Chalmers Computing Room");
set_short("A sunlit room with terminals");
set_long(
"You are in a computing room at Chalmers University of Technology "
"in Gothenburg, Sweden. Terminals line the walls. On one screen "
"you can see the LPMud source code taking shape β Lars PensjΓΆ "
"is debugging the object persistence system, 1989."
);
/* Exits */
add_exit("north", "/d/campus/corridor");
add_exit("south", "/d/campus/lab");
/* Items in the room */
add_object("/obj/terminal", 3);
add_object("/obj/coffee_mug", 1);
}
/* Called when a player looks at the room */
string query_long() {
return ::query_long() + "\n" +
"A note on the whiteboard reads: " +
"'LPC 1.0 β persistent objects, hot loading'";
}
LPC's type system combines static typing with runtime flexibility:
/* LPC type system and control flow */
/* Basic types: int, float, string, object, array, mapping */
int player_count = 0;
string welcome_msg = "Welcome to EU-hosted LPMud";
mixed dynamic_val; /* Can hold any type */
/* Arrays */
string *languages = ({ "LPC", "C", "Swedish" });
/* Mappings (hash tables) */
mapping player_stats = ([
"strength" : 10,
"mana" : 50,
"gdpr_consent" : 1, /* GDPR Art. 7 consent tracking */
]);
/* Object references */
object master = find_object("/secure/master");
/* Closures (function objects) */
function callback = (: write("Hello from " + $1 + "\n") :);
/* Control flow */
foreach (string lang : languages) {
if (lang == "LPC") {
call_other(master, "log", lang + " object loaded");
}
}
DGD β Dworkin's Game Driver
The most technically sophisticated LPC implementation is DGD (Dworkin's Game Driver), written by Felix Croes π§πͺ (Belgium) beginning in 1990. DGD extended PensjΓΆ's original design with capabilities that remain architecturally significant:
Atomic transactions: DGD supports transactional modification of objects. If an operation fails midway, all changes are rolled back β a property directly analogous to database ACID semantics, implemented in a game engine in 1990.
Snapshot persistence: DGD can dump its entire memory state to disk (a "statedump") and restore it on restart. The virtual world persists across server reboots. This is equivalent to a persistent memory model β the game driver as a distributed in-memory database with crash recovery.
Hot compilation: LPC objects can be recompiled and upgraded while the server runs. Existing instances of an object update to the new definition without restarting. This is live code replacement β a capability most production systems still treat as exotic.
Lightweight threads: DGD's execution model uses cooperative coroutines β each LPC call runs to completion before the scheduler moves to the next. This eliminates data races without locks, a design subsequently echoed in Node.js's event loop (2009) and Go's goroutines (2009).
/* DGD-specific: atomic function (transactional) */
/* Felix Croes π§πͺ Belgium, 1990 */
atomic void transfer_gold(object from, object to, int amount) {
/* If any call_other fails, entire function rolls back */
if (from->query_gold() < amount) {
error("Insufficient gold");
}
from->add_gold(-amount);
to->add_gold(amount);
/* Both operations succeed or neither does */
}
/* DGD: object upgrading while running */
/* Old instances automatically migrate to new code */
void upgraded() {
/* Called on existing instances when their code is recompiled */
if (!query_property("migration_v2")) {
set_property("migration_v2", 1);
/* Migrate old state to new format */
}
}
DGD is the runtime used by Skotos Tech (California) for historical roleplaying games, and by several EU-based MUD communities. It remains actively maintained and is available under the AGPL licence.
FluffOS and the Community
FluffOS is the most widely deployed LPC runtime, forked from MudOS (another LPMud derivative) and maintained by an international open-source community. FluffOS powers thousands of active MUD servers globally, including several based in Europe.
FluffOS compiles cleanly on Linux and produces a statically-linkable binary:
FROM debian:bookworm-slim AS builder
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
libssl-dev \
libpcre3-dev \
libmysqlclient-dev \
libpq-dev \
git \
&& rm -rf /var/lib/apt/lists/*
# Build FluffOS from source
RUN git clone https://github.com/fluffos/fluffos.git /fluffos
WORKDIR /fluffos
RUN cmake -DPACKAGE_DB=OFF . && make -j$(nproc)
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y \
libssl3 \
libpcre3 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /fluffos/src/driver /usr/local/bin/lpc-driver
COPY mudlib/ /mud/
COPY config.cfg /mud/
WORKDIR /mud
EXPOSE 6969
CMD ["lpc-driver", "config.cfg"]
For DGD specifically, which has no external dependencies:
FROM debian:bookworm-slim AS builder
RUN apt-get update && apt-get install -y \
build-essential \
git \
&& rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/dworkin/dgd.git /dgd
WORKDIR /dgd/src
RUN make DEFINES="-DUINDEX_TYPE=unsigned -DUINDEX_MAX=UINT_MAX"
FROM debian:bookworm-slim
COPY --from=builder /dgd/bin/dgd /usr/local/bin/dgd
COPY dgd-mudlib/ /mud/
COPY mud.dgd /mud/
WORKDIR /mud
EXPOSE 6047
CMD ["dgd", "mud.dgd"]
LPC's Influence on Modern Architecture
LPC's 1989 design anticipated architectural patterns that became mainstream in the 2010s:
LPC (Lars PensjΓΆ πΈπͺ, Chalmers 1989)
β
ββ Persistent objects surviving restarts
β β Erlang/OTP (Ericsson πΈπͺ, 1987 β released 1998)
β β Akka actor model (Scala)
β β Durable objects (Cloudflare, 2021)
β
ββ Hot code replacement
β β Erlang hot upgrades (release_handler)
β β Kubernetes rolling deployments
β β Next.js hot module replacement
β
ββ Sandboxed execution (master object controls capabilities)
β β Java Security Manager (1995)
β β Node.js VM module (2011)
β β WebAssembly capability model (2019)
β β Deno permission system (2020)
β
ββ Cooperative coroutines (no data races)
β β JavaScript event loop (Node.js 2009)
β β Go goroutines (2009)
β β Python asyncio (2014)
β
ββ Mudlib separation (driver vs. content)
β Microservices architecture
β Kubernetes operator pattern
β Platform-as-a-Service (the pattern sota.io implements)
The capability-based security model that LPC's master object implements β granting specific permissions to specific objects rather than running everything as root β was theorised by Dennis Ritchie πΊπΈ and Ken Thompson πΊπΈ in the 1970s and implemented in production game servers by PensjΓΆ in 1989.
EU Regulatory Angles
GDPR Art. 25 β Data Minimisation by Design:
LPC's object model is explicitly stateful: each object holds exactly the state it declares. A player.c object contains only the fields defined by the mudlib programmer. There are no hidden framework states, no ORM shadow tables, no session stores invisible to the developer. GDPR Art. 25 requires data minimisation at design time β LPC's explicit object state model enables a developer to enumerate all PII fields and prove they are the only data stored.
GDPR Art. 17 β Right to Erasure: In DGD's persistent model, deleting a player object removes all associated state atomically. The statedump mechanism means the deletion is durable β no shadow copies in transaction logs. Implementing a compliant GDPR Art. 17 erasure procedure in an LPC-based system requires deleting a single object, which DGD can do transactionally.
NIS2 β Sandboxed Execution: The master object pattern β in which all LPC objects must request capabilities from a single trusted supervisor β implements a mandatory access control model equivalent to SELinux or AppArmor at the application level. LPC objects cannot open network connections, read files, or execute system commands without explicit master-object approval. NIS2 Art. 21 requires appropriate access control for critical services; LPC's architecture enforces it at the language runtime level.
EU AI Act Art. 13 β Transparency:
LPC game logic is plaintext .c files interpreted at runtime. There are no compiled binaries obscuring business logic. An LPC-based decision system is auditable by reading its source files β a property directly relevant to EU AI Act Art. 13 requirements for high-risk AI systems to document their decision-making logic.
The Scandinavian Online Computing Cluster
LPMud and LPC emerged from a Nordic university tradition that produced significant contributions to networked computing:
Nordic Internet Computing Heritage (1980sβ1990s):
Chalmers University of Technology πΈπͺ (Gothenburg)
β Lars PensjΓΆ β LPMud/LPC (1989) β first internet multiplayer
β IDEA League: ETH ZΓΌrich π¨π / TU Delft π³π± / Imperial π¬π§ / ParisTech π«π·
β
KTH Royal Institute of Technology πΈπͺ (Stockholm)
β Internet infrastructure research
β Swedish Internet Exchange (Netnod, 1996)
β
Uppsala University πΈπͺ
β Lysator Academic Computer Society (1973)
β Project Runeberg: Nordic digital literature archive
β Hosted early Swedish internet nodes
β
University of Oslo π³π΄
β Simula (Dahl + Nygaard, 1967) β first OOP language
β Jon Postel collaboration β DNS for .no
β
DTU (Technical University of Denmark) π©π°
β DIKU (Copenhagen) β early internet research
β DIKU MUD (1991) β EverQuest, World of Warcraft lineage
β
Ericsson πΈπͺ (Stockholm)
β Erlang (1987) β concurrent fault-tolerant systems
β Parallel to LPMud: both solving distributed persistence
β Sweden joined EU: 1995. All universities above are EU-funded
through Horizon Europe and national research councils.
Felix Croes π§πͺ (Belgium) β author of DGD β represents the EU cross-border open-source collaboration that LPC enabled. A Belgian developer extended a Swedish student's game engine, and the result is still running EU-hosted game servers 35 years later.
Deploy LPC to sota.io
# LPC game server (DGD) on EU infrastructure
# Lars PensjΓΆ πΈπͺ Chalmers 1989 / Felix Croes π§πͺ DGD
FROM debian:bookworm-slim AS builder
RUN apt-get update && apt-get install -y \
build-essential git \
&& rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/dworkin/dgd.git /dgd \
&& cd /dgd/src \
&& make
FROM debian:bookworm-slim
COPY --from=builder /dgd/bin/dgd /usr/local/bin/dgd
WORKDIR /app
# DGD mudlib (your LPC objects)
COPY mudlib/ ./mudlib/
COPY kernel/ ./kernel/
COPY mud.dgd .
EXPOSE 6047
CMD ["dgd", "mud.dgd"]
// mud.dgd β DGD configuration
{
telnet_port = ([ "*": 6047 ]);
binary_port = ([ ]);
directory = "/app";
modules = ({ });
users = 40;
editors = 4;
ed_tmpfile = "/tmp/ed";
swap_file = "/tmp/swap";
swap_size = 4096;
swap_cache = 256;
sector_size = 512;
swap_fragment = 4096;
static_chunk = 64512;
dynamic_chunk = 32768;
dump_file = "/app/snapshots/state.dgd";
dump_interval = 3600; /* Snapshot every hour */
hotboot = ({ "/kernel/sys/auto" });
}
# sota.yaml
service:
name: lpc-mud-server
runtime: docker
region: eu-central-1
port: 6047
storage:
type: persistent
path: /app/snapshots
size: 1Gi
database:
type: postgres
version: "17"
size: small
env:
LPC_REGION: EU
GDPR_DATA_RESIDENCY: DE
DGD_DUMP_INTERVAL: "3600"
# Deploy LPC/DGD to EU infrastructure
sota deploy --region eu-central-1
# With persistent storage for DGD snapshots
sota deploy --region eu-central-1 --with-storage --with-postgres
# Check deployment status
sota status
sota logs --tail 100
DGD's single-binary deployment β no JVM, no Node modules, no Python packages β means a container image under 20MB. The persistent snapshot mechanism means game state survives container restarts, aligned with sota.io's persistent storage volumes. EU data residency (German data centres) satisfies GDPR Art. 46 data transfer restrictions for any user-identifiable player data stored in LPC objects.
See Also
- Deploy Erlang to Europe β Ericsson πΈπͺ (Stockholm, 1987). Erlang and LPC were developed in Sweden at almost the same time (1987/1989), both solving persistent concurrent state. Erlang's actor model and LPC's object persistence model are architectural cousins β one in telecom, one in gaming.
- Deploy Simula to Europe β Ole-Johan Dahl π³π΄ + Kristen Nygaard π³π΄ (Oslo, 1967). LPC's object model descends directly from Simula's class/object distinction. PensjΓΆ's persistent LPC objects are Simula objects with network presence and automatic persistence.
- Deploy Occam to Europe β Tony Hoare π¬π§ (Oxford, CSP). LPC's cooperative coroutine model β no shared state, message-based interaction β implements the same principles as CSP and Occam, arrived at independently from a game engineering perspective.
- Deploy GNU Guile/Scheme to Europe β Guile's embedded scripting model (Scheme as extension language for C programs) parallels LPC's role: a safe, sandboxed language embedded in a compiled driver to allow hot-loading of application logic.
- All languages on sota.io
Why sota.io for LPC Deployments
sota.io is the EU-native PaaS for developers who need European infrastructure β not as an afterthought, but as a technical requirement.
LPC's design philosophy β explicit state, sandboxed execution, hot-reloadable code, persistent objects β maps naturally onto modern cloud patterns. DGD's snapshot mechanism and transactional object model are ahead of their time. Deploying DGD on sota.io's EU infrastructure gives you persistent storage volumes for statedumps, managed PostgreSQL for structured data, and German data centres for GDPR compliance β all without configuring Kubernetes or managing servers.
Lars PensjΓΆ designed LPC in 1989 at Chalmers University in Gothenburg so that a virtual world could grow without ever going offline. That same property β continuous availability, live update, persistent state β is what modern cloud infrastructure attempts to provide. sota.io brings the language that invented it to EU infrastructure.
# Deploy LPC/DGD to EU β the language that
# invented online multiplayer in 1989.
sota deploy --region eu-central-1
LPC was designed by Lars PensjΓΆ πΈπͺ at Chalmers University of Technology in Gothenburg, Sweden in 1989. DGD (Dworkin's Game Driver) was written by Felix Croes π§πͺ (Belgium) beginning in 1990. FluffOS is maintained by an international open-source community. Chalmers University of Technology is a member of the IDEA League of European technical universities.