User File Store
Your user file store is a personal, per-organisation space where files produced by PebbleAI on your behalf are stored durably. Today it holds the output files from Skills that run Python — PDFs, Word docs, Excel spreadsheets, images, charts — and in future it will also hold Canvas artifacts and eventually link to OneDrive and SharePoint.
Infrastructure is in place and actively used by the Skills Python sandbox. A dedicated browse/manage UI is not yet released — files are accessed via download links returned in the chat for now.
What’s in it today
Every time you run a Skill that produces a file — the pdf skill that generates a polished PDF, the xlsx skill that assembles a spreadsheet, the frontend-design skill that emits a mockup — the output file is:
- Written inside the code execution sandbox at
/workspace/or/tmp/ - Detected automatically by PebbleChat’s
python_runtool (based on file extension) - Uploaded to your user file store at
tenants/{partnerId}/{orgId}/user-files/{yourUserId}/sandbox-output/ - Returned to you as a download link in the chat response
The link looks like /api/v1/pebblechat/user-files/{yourUserId}/{fileId}/{filename} — the fileId is a 128-bit UUID capability URL, so only you (and anyone you share the link with) can reach the file, and only after authenticating as yourself.
Supported file extensions today:
.pdf, .docx, .xlsx, .pptx, .csv, .tsv, .json, .png, .jpg, .jpeg, .gif, .svg, .html, .txt, .md
Anything a Skill’s Python code writes with one of those extensions lands in your file store automatically. Other file types can still be produced but won’t be auto-captured — the skill author needs to convert them or handle them directly.
Storage structure
Your files are stored in an S3-backed per-user namespace inside your organisation’s bucket:
s3://pebble-storage/tenants/{partnerId}/{orgId}/user-files/{yourUserId}/
└── sandbox-output/
├── {fileId-1}.pdf
├── {fileId-2}.xlsx
├── {fileId-3}.png
└── ...This builds on the same multi-tenant S3 persistent storage that handles PebbleChat image attachments. Three key properties:
- Per-user isolation — you cannot read another user’s files, and they cannot read yours, even if they somehow guessed the filename
- Per-organisation scoping — your files belong to the organisation you were in when the file was created. If you’re a member of multiple organisations, each has its own file store namespace for you
- Durable — files persist beyond any single session, chat, or pod lifetime. They’re in S3, not in the sandbox’s ephemeral storage
Accessing your files
Today there is no dedicated browse UI — this is the honest current state. You access files via the download links that PebbleChat returns in chat responses. A typical skill response looks something like:
I’ve generated your quarterly report as a PDF. Download it here: Q1-2026-Report.pdf
Click the link and the file downloads. The link stays valid as long as you’re authenticated and the file exists.
Finding a file from an earlier chat
Since the links are in the chat messages, you can always find a past-generated file by:
- Going to PebbleChat
- Finding the conversation where the file was generated (search the sidebar if needed)
- Scrolling to the message with the download link
- Clicking it
This works reliably today but isn’t ideal — which is why the browse UI is on the roadmap below.
What’s coming
The file store is explicitly positioned as a foundation for larger work. Three things are planned on top of the current infrastructure:
1. A browse and manage UI
A dedicated page under User Settings that lets you:
- See every file currently in your store, organised by date and source
- Filter by file type (PDFs, spreadsheets, images, etc.)
- See which skill or chat produced each file
- Delete files you no longer need
- Rename, tag, and organise
This is in the backlog but not yet scheduled. For now, files accumulate silently — there are no retention policies forcing you to clean up, but also no easy way to audit what’s there.
2. Indexing over time for context
Files in your file store are candidates for indexing into your personal memory / ambient context over time. Stuart framed it this way in an internal discussion:
“Think indexing that over time so that in three months time you’ve got the context of all of the files that have been created as part of your process. There’s a lot of intel there.”
The vision is that a user who has been using PebbleAI for three months has accumulated a rich corpus of their own work — reports, analyses, drafts, charts — and PebbleChat can draw on that corpus at query time. “What were we saying about the Q2 campaign last month?” could retrieve from your file store the same way it retrieves from document stores today.
3. OneDrive and SharePoint linking
The final step is linking your file store to OneDrive and SharePoint, so files flow both ways:
- Files you generate in PebbleAI appear in your OneDrive automatically
- Files you already have in OneDrive become searchable in PebbleChat
- One indexed space spans everything you produce and everything you already have
This builds on the existing Microsoft 365 integration (see PebbleFlows → Integrations for how the MS365 MCP works today) and is a natural extension once the file store browse UI is in place.
Limits and caveats
- No explicit per-user quota today. Storage limits are enforced at organisation level via your deployment’s license-based quotas (
LICENSE_QUOTAS.STORAGE_LIMIT). Individual users don’t see a quota, but if your organisation hits its storage limit, new sandbox outputs will start failing. - Retention is indefinite. Files stay until deleted. There is no automatic cleanup, which is convenient but means the space grows unbounded.
- Files are per-organisation. Switching workspaces within the same organisation does not change which files you can see. Switching organisations (multi-org users) does.
- Download links require authentication. The UUID alone isn’t enough — the API verifies that the authenticated user matches the user ID in the URL path before returning the file.
- Skill output detection is pattern-based. If a skill writes a file with an extension not in the supported list, it won’t be auto-captured. This is a Skill-author consideration, not a user one.
How it relates to other storage
PebbleAI has several distinct storage surfaces and it’s worth being clear about which one is which:
| Storage | What it holds | Scope | How you access it |
|---|---|---|---|
| User file store (this page) | Skill output files, future Canvas artifacts | Per user per org | Download links in chat |
| Document stores (@Mentions) | Curated document collections for RAG | Per workspace / org | Via @mention or auto-discovery in PebbleChat |
| PebbleChat image attachments | Images you attach to a chat message | Per user per org, inside the conversation | Via the chat attachment picker |
| Credentials (User Settings → Credentials) | API keys and secrets | Per user / workspace / org | Via credential picker in flows and tools |
| Variables (User Settings → Variables) | Named configuration values | Per user / workspace / org | Via {{$vars.NAME}} in flows |
The user file store is specifically for artifacts produced by AI on your behalf — outputs, not inputs. Inputs live elsewhere.
Related
- PebbleChat → Skills — the feature that produces most files in your store today
- Code Execution Sandbox — the infrastructure that actually runs the code that writes the files
- User Settings → Capabilities — personal view of skills and integrations that can write to your file store
- PebbleFlows → Integrations — future OneDrive / SharePoint linking will build on this integration surface