---
"@type": Article
"@id": "https://helloloam.dev/principles/portable-by-design"
"@source": "https://helloloam.dev/data/article/portable-by-design.json"
"@stamp": "2026-10-22T21:53:55+00:00"
about:
  "@type": DefinedTerm
  "@id": "https://helloloam.dev/data/definedterm/portable-by-design.json"
  name: Portable by design
  identifier: portable-by-design
  inDefinedTermSet:
    "@type": DefinedTermSet
    "@id": "https://helloloam.dev/data/definedtermset/basics.json"
    name: Basics
    identifier: basics
author: {"@id":"https://helloloam.dev/#organization"}
datePublished: "2026-10-03"
description: Copy the folder and you have the site. The same engine renders it on a server, on a laptop or in a throwaway test.
headline: Portable by design
identifier: portable-by-design
inLanguage: en
publisher: {"@id":"https://helloloam.dev/#organization"}
url: "https://helloloam.dev/principles/portable-by-design"
---

# Portable by design

## Copy the folder, have the site

A loam site is a folder. Copy it and you have the site — the same engine renders it on a server, on a laptop or in a throwaway test. The same files render the same everywhere.

## Nothing points at the machine

Nothing in a loam site knows the machine it happens to run on. Where the install stands — its address, which PHP runs it — is read from a handful of environment keys when it starts, never written into the site. The engine works out its own root from its position, so a copy runs before anyone has configured it.

## The engine sits beside your site

The engine lives in one folder, `.loam/`, next to yours, and knows nothing about your site in particular. [An update swaps parts](/principles/no-update-stress) of that folder and touches nothing of your content. What you have keeps working — offline, without a check, for as long as you like. [A licence](/licence) buys the stream of updates, never a dependency: lose access and you keep a working site, not a broken one.

## A mirror is the whole site

The git mirror of your site is [not a backup that needs a restore](/principles/backups-as-a-snapshot) procedure — it is the site. A local copy is not an export — it is the site. No database means no schema to migrate, no plugin tables to reconcile, no cache to warm. Moving a site is moving its files and pointing a domain at them.

## Loam, elsewhere

That is also why there is no separate desktop product. Bedrock ships the same engine, byte for byte, and points it at a copy of your files on your own machine: a layer below draft where you can build and experiment with nothing at stake. What comes back travels through the site's MCP and is judged like any other change. Not a desktop version of loam — just loam, elsewhere.

## What it costs

There is no content that differs per machine. What should differ — a path, the PHP binary — lives in a handful of environment keys, not in the site. And the engine refuses to know where it is: it works out its root from its own position and trusts the host to have put it there. Rules you only notice when you try to break them.
