Direct uploads, no byte proxy
bucket.put() starts the upload flow, then the file goes straight to S3 instead of pinning your API servers under file traffic.
Upload files directly to S3, serve public assets through the CDN, keep private objects behind signed access, and query metadata from the same bucket surface.
One org-aware path across SDK code, CLI jobs, dashboard tooling, and agent automation.
Bucket Surface
const uploads = monkey.bucket('uploads')
await uploads.put('runs/run_001/input.json', file, {
visibility: 'private',
contentType: 'application/json',
})
const url = await uploads.getUrl('runs/run_001/input.json')Direct-to-S3 uploads
File bytes skip the app server path, so upload traffic does not become an API bottleneck.
CDN for public files
Public assets get a stable delivery URL without turning the underlying bucket into a public object dump.
Signed access for private files
Private reads resolve through short-lived object URLs that match the caller and expiry you request.
Why MonkeyBuckets
MonkeyBuckets keeps the useful parts of S3 and CloudFront while removing the ceremony most teams rebuild around uploads, delivery, and file metadata.
bucket.put() starts the upload flow, then the file goes straight to S3 instead of pinning your API servers under file traffic.
Public files get stable CDN URLs. Private files stay behind short-lived signed access instead of a permanently exposed object path.
Visibility, content type, extension, and custom metadata are queryable alongside the object reference so file workflows stay inspectable.
SDK code, CLI scripts, dashboard tooling, and MCP traffic all hit the same bucket model instead of parallel upload systems.
How It Works
The core model is simple: MonkeyBuckets keeps file transfer on the storage plane, then resolves each object through the public or private delivery path that matches its visibility.
Your app calls bucket.put() with a filename, visibility, content type, and optional metadata. MonkeyHub validates auth and prepares the upload.
The SDK uploads to a pre-signed S3 URL, which keeps file transfer out of the API request path and avoids turning uploads into app-server bottlenecks.
Public files resolve to permanent CDN URLs. Private files resolve through getUrl() to short-lived signed access for exactly one object.
Access Model
Public
brand/logo.png
visibility: public
https://cdn.monkeyhub.io/org_abc/uploads/brand/logo.png
Private
runs/run_001/input.json
visibility: private
signed URL via getUrl(..., { expiresIn: 900 })
Queryable file metadata
uploads.query({ ext: 'png', limit: 20 })Use the file record for listings, dashboard views, and automations without crawling the object store directly.
Real Surface Area
These examples match the implemented SDK and CLI surface. No pseudo-API, no marketing-only shorthand.
Put files, fetch URLs, and query metadata through one bucket object.
import { Monkey } from '@monkeyhub/sdk'
const monkey = new Monkey(process.env.MONKEY_KEY!)
const uploads = monkey.bucket('uploads')
const record = await uploads.put(
'runs/run_001/input.json',
JSON.stringify({ prompt: 'Summarize the latest support backlog' }),
{
visibility: 'private',
contentType: 'application/json',
metadata: {
kind: 'prompt',
runId: 'run_001',
},
},
)
const signedUrl = await uploads.getUrl(record.filename, { expiresIn: 900 })
const jsonFiles = await uploads.query({
ext: 'json',
limit: 20,
})The same upload and query flow for scripts, CI jobs, and one-off operational work.
monkey bucket put uploads ./fixtures/logo.png \
--input '{"visibility":"public","contentType":"image/png","metadata":{"kind":"brand"}}'
monkey bucket url uploads logo.png
monkey bucket query uploads \
--input '{"ext":"png","limit":20}'Compare
MonkeyBuckets is for teams that want S3-grade storage behavior without turning uploads, CDN delivery, and signed access into yet another internal platform project.
MonkeyBuckets on the MonkeyHub data plane
Sign up if you want the shortest path to a real org, API keys, and a working bucket surface. Or go straight to the docs if you want to inspect the upload flow in detail first.