Filesystem Tables And Uploads Expose local, S3-compatible, and GCS object storage as GraphQL tables. integrations guide integrations/filesystem-uploads integrations/filesystem-uploads.md

Filesystem Tables And Uploads

Expose local, S3-compatible, and GCS object storage as GraphQL tables.

Filesystem tables

YAML
sources:
  - name: documents
    kind: file
    backend: s3
    bucket: app-documents
    prefix: tenants/${account_id}
    presign_ttl: 15m
    capabilities:
      files.list: true
      files.read: true
      files.write: false

Every filesystem table exposes stable columns such as key, size, content_type, etag, modified_at, url, and data.

GraphQL
query {
  documents(prefix: "reports/", first: 20, order_by: { key: asc }) {
    key
    size
    content_type
    url
  }
  documents_cursor
}
Local/S3/GCSobject rootsFilesystem tablekey · size · etag · urldata when selectedGraphQLlist · readUploadmultipartRead-only capability defaults let agents discover files without granting writes unless policy allows it.

Verified by TestIntrospectionIncludesFilesystemRemoteCursorField core/intro_test.go:328
Verified by TestBridge_LocalWritesInvalidateFilesystemCacheRefs core/fstable_bridge_test.go:473

Uploads

Uploads accept multipart requests on /api/v1/graphql. Files can either be inlined as base64 variables or streamed into a configured filesystem table.

GraphQL
mutation ($file: Upload!) {
  documents(insert: { file: $file }) {
    key
    size
    url
  }
}

When uploads.storage names a filesystem table, the upload handler streams the file into the backend and replaces the variable with object metadata instead of base64 file data.

Verified by TestGenerateUploadKey_DateMarker serv/upload_storage_test.go:122
Verified by TestMIMEAllowed_GlobAndExact serv/upload_test.go:173

Policy

Filesystems participate in source capabilities and read-only policy. Use read-only defaults for discovery surfaces and enable writes deliberately.

Read-only filesystems block managed writes and watchers. S3/GCS presigned URLs are cache-bounded so GraphJin does not serve stale URLs past their TTL.

Verified by TestBridge_ReadOnlyFilesystemBlocksManagedWrites core/fstable_bridge_test.go:522
Verified by TestFilesystemFragmentCacheOptions core/cache_response_test.go:141

Docs