---
title: Google Slides
description: Mount Google Slides presentations as JSON-backed files that Python agents can read through Mirage shell commands.
icon: presentation
---
The Google Slides resource exposes presentations as a virtual
filesystem mounted at some prefix such as `/gslides/`.

For Google OAuth setup, see [Google Workspace Setup](/python/setup/google).

## Config

```python
import os

from mirage import MountMode, Workspace
from mirage.resource.gslides import GSlidesConfig, GSlidesResource

config = GSlidesConfig(
    client_id=os.environ["GOOGLE_CLIENT_ID"],
    client_secret=os.environ["GOOGLE_CLIENT_SECRET"],
    refresh_token=os.environ["GOOGLE_REFRESH_TOKEN"],
)
resource = GSlidesResource(config=config)
ws = Workspace({"/gslides": resource}, mode=MountMode.READ)
```

## Filesystem Layout

```text
/gslides/
  owned/
    <YYYY-MM-DD>_<sanitized-title>__<presentation-id>.gslide.json
    ...
  shared/
    <YYYY-MM-DD>_<sanitized-title>__<presentation-id>.gslide.json
    ...
```

Example:

```text
/gslides/
  owned/
    2026-04-04_QBR_Deck__1AbCdEf.gslide.json
    2026-04-10_Team_Update__2BcDeFg.gslide.json
  shared/
    2026-04-03_Design_Review__9XyZ.gslide.json
```

Presentations are split into `owned` (presentations you created)
and `shared` (presentations shared with you). The filename shape is:

```text
<YYYY-MM-DD>_<sanitized-title>__<presentation-id>.gslide.json
```

If the modified date is unavailable, the date prefix is omitted.
Reading a presentation file returns the full Google Slides API JSON
for that presentation.

## Cache

The Google Slides resource uses `IndexCacheStore`. Index entries
store presentation IDs and metadata. There is no separate content
cache -- file content caching is handled by the workspace `IOResult`
mechanism.

## Example

```python
import asyncio
import os

from dotenv import load_dotenv

from mirage import MountMode, Workspace
from mirage.resource.gslides import GSlidesConfig, GSlidesResource

load_dotenv(".env.development")

config = GSlidesConfig(
    client_id=os.environ["GOOGLE_CLIENT_ID"],
    client_secret=os.environ["GOOGLE_CLIENT_SECRET"],
    refresh_token=os.environ["GOOGLE_REFRESH_TOKEN"],
)
resource = GSlidesResource(config=config)


async def main():
    ws = Workspace({"/gslides": resource}, mode=MountMode.READ)

    # List structure
    r = await ws.execute("ls /gslides/")
    print(await r.stdout_str())

    # List owned presentations
    r = await ws.execute("ls /gslides/owned/")
    print(await r.stdout_str())

    # Read a presentation
    r = await ws.execute(
        "cat /gslides/owned/2026-04-04_QBR_Deck__1AbCdEf.gslide.json")
    print(await r.stdout_str())

    # Extract title with jq
    r = await ws.execute(
        'jq ".title"'
        " /gslides/owned/2026-04-04_QBR_Deck__1AbCdEf.gslide.json")
    print(await r.stdout_str())

    # Search across all presentations
    r = await ws.execute('rg "quarterly" /gslides/owned/')
    print(await r.stdout_str())

    # Tree view
    r = await ws.execute("tree -L 1 /gslides/")
    print(await r.stdout_str())

    # Create a new presentation
    r = await ws.execute(
        'gws slides presentations create --json \'{"title":"MIRAGE Deck"}\'')
    print(await r.stdout_str())

    # Batch update a presentation
    r = await ws.execute(
        'gws slides presentations batchUpdate'
        ' --params \'{"presentationId":"1AbCdEf"}\''
        ' --json \'{"requests":[]}\'')
    print(await r.stdout_str())


if __name__ == "__main__":
    asyncio.run(main())
```

See `examples/gslides/gslides.py` for the full working example.

## Shell Commands

Standard commands available on the mounted Google Slides tree:

| Command                             | Notes                           |
| ----------------------------------- | ------------------------------- |
| `ls`                                | List owned/shared presentations |
| `cat`                               | Read presentation JSON          |
| `head` / `tail`                     | First/last N lines              |
| `grep` / `rg`                       | Pattern search                  |
| `jq`                                | Query JSON fields               |
| `wc`                                | Line/word/byte counts           |
| `stat`                              | File metadata                   |
| `find`                              | Recursive search                |
| `tree`                              | Directory tree view             |
| `basename` / `dirname` / `realpath` | Path utilities                  |
| `nl`                                | Number lines                    |

Resource-specific commands:

### `gws slides presentations create`

Create a new presentation.

```bash
gws slides presentations create --json '{"title":"MIRAGE Deck"}'
```

| Option   | Required | Description                  |
| -------- | -------- | ---------------------------- |
| `--json` | yes      | JSON body with `title` field |

Returns the created presentation JSON.

### `gws slides presentations batchUpdate`

Batch update a presentation.

```bash
gws slides presentations batchUpdate --params '{"presentationId":"1AbCdEf"}' --json '{"requests":[]}'
```

| Option     | Required | Description                |
| ---------- | -------- | -------------------------- |
| `--params` | yes      | JSON with `presentationId` |
| `--json`   | yes      | JSON with `requests` array |

Returns the batch update response JSON.
