> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beam.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Snapshots

Snapshots let you capture the filesystem and/or memory of a Sandbox as an immutable artifact.
You can then use this artifact to create new Sandboxes with that same captured state.

Use snapshots when you want to:

* Fork Sandboxes to test different variations of code
* Initialize Sandboxes with existing state for faster cold starts
* Save a reproducible environment you can return to later

## Creating a Filesystem Snapshot

```python theme={null}
from beam import Image, Sandbox

# Create a sandbox and make some changes to the filesystem
sandbox = Sandbox(cpu=1).create()
p = sandbox.process.exec("sh", "-c", "mkdir -p /something && touch /something/file.txt")

# Read the logs
p.wait()
print(p.logs.read())

# Generate a filesystem snapshot and terminate the sandbox
image_id = sandbox.create_image_from_filesystem()
sandbox.terminate()
```

## Using Filesystem Snapshots

You can use Snapshots as a base image for any other abstraction or Sandbox on Beam, using `Image.from_id`:

```python theme={null}
from beam import Image, Sandbox

# Creates an image from a filesystem snapshot
image = Image.from_id(image_id)

sandbox = Sandbox(image=image).create()
p = sandbox.process.exec("ls", "-l", "/something")

p.wait()
print(p.logs.read())

sandbox.terminate()
```

## Creating a Memory Snapshot

You can also create a memory snapshot of a running Sandbox, which will capture the state of the sandbox's memory - including all running processes and exposed ports.

```python theme={null}
from beam import Image, Sandbox

# Create a sandbox and make some changes to the filesystem
sandbox = Sandbox(cpu=1).create()
sandbox.expose_port(8000)

p = sandbox.process.exec("python", "-c", "import http.server; http.server.HTTPServer(('', 8000), http.server.SimpleHTTPRequestHandler).serve_forever()")

# Generate a memory snapshot and terminate the sandbox
snapshot_id = sandbox.snapshot_memory()

print(sandbox.list_urls())

sandbox.terminate()
```

## Using Memory Snapshots

You can use memory snapshots as a starting point for a new Sandbox, using `Sandbox().create_from_memory_snapshot`:

```python theme={null}
from beam import Image, Sandbox

# Creates a new sandbox from a memory snapshot

sandbox = Sandbox().create_from_memory_snapshot(snapshot_id)

print(sandbox.list_urls())

sandbox.terminate()
```
