2026-04-07Β·8 min readΒ·sota.io team

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

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.