In short:
ak-storageputs images, videos and slides into S3-style storage (Cloudflare R2, AWS S3, MinIO, Backblaze B2, DigitalOcean Spaces), downloads, lists or syncs them, then reads them back to be sure each file is where it should be. A link is called shareable only after a test download through it. Without config it does not pretend: the file stays on your machine and it says clearly that nothing was uploaded.
Disclosure: I maintain AgentKit and have an affiliate relationship with it: the AgentKit link in this post is an affiliate link; buying through it gets you 30% off.
Summary
Use it when you have just finished assets and need to put them in a bucket to get a link, push a whole campaign folder to one prefix, or get a file back from a bucket. Sync only pushes up and does not clean the bucket, so do not use it to delete remote objects.
flowchart LR
A["Asset files on your machine"] --> B["ak-storage"]
C["Objects in a bucket"] --> B
B --> D["Object read back, link checked"]
B --> E["File downloaded to your machine"]
B --> F["Missing config: file stays local"]It rests on 4 ideas:
| Idea | Question | Example |
|---|---|---|
| Operation and path | What do you want to do, with which file or folder? | upload ./assets/banner.png, download designs/logo.svg, list campaign-q4/, sync ./campaign |
| Config in the environment file | Where does the skill get the address, keys and bucket? | S3_ENDPOINT, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_BUCKET; add S3_REGION, S3_PUBLIC_URL if needed |
| A checked share link | Can other people open this link yet? | Only once the skill has checked the bucket's access and downloaded the file through the link |
| Sync only pushes up | Does sync delete anything in the bucket? | No. Existing remote objects stay, and public access does not change |
Before overwriting, the skill checks whether the target already has an object with the same name. Keys live only in a gitignored .env file and are never printed to logs. A token scoped to exactly one bucket is recommended.
Sample prompt to upload an image and get a link:
/ak-storage upload ./assets/banner.png
Target: prefix campaign-q4/.
Done when: there is a public link that opens in a browser.| Flag | What it is for | Since ak |
|---|---|---|
--bucket | Takes one value: a bucket name. The skill does not describe how it changes behavior | 2.15.0 |
After the skill name you write the operation (upload, download, list, sync), then the file or path.
Below is the detailed version: the run flow, 4 situations with prompts, how to write the input and the --bucket flag, the change history by ak release, and common pitfalls. The detailed version and the interactive page are for subscribers. Your agent can also search them through the portal's MCP.
Opens when your account has subscriber access
This guide is for subscribers
Once your account has access, the full piece, the interactive visual and the agent call all open.
- Sign in or create a modernEngineer accountReading access belongs to your account email.
- Choose a plan on the pricing page1, 3 or 12 months, paid by VietQR bank transfer. Access opens about a minute after the money arrives.
- Or redeem a Facebook subscriber codePeople supporting the page on Facebook get an activation code by message each month.
Already a subscriber? Sign in to read.
Use this piece in your agent
Get an API keyCopy the text below and paste it into Claude Code, Codex or whichever agent you use. The agent reads the piece and checks it against the repo you have open.
Read "ak-storage: put assets in S3 storage and check every file" on modernEngineer and apply it to this repo.
1. Call the content_get tool of the modernengineer MCP server with locale "en", slug "ak-storage". If the modernengineer MCP server is not connected, stop and walk me through connecting it from https://modernengineer.dev/en/mcp.
2. Summarize the main steps of the piece and point out which apply to this repo.
3. Propose concrete changes and ask me before editing any file.Connect MCP in Claude Code (once)
claude mcp add --transport http modernengineer \
https://api.modernengineer.dev/mcp \
--header "Authorization: Bearer <API key>"Reading the full piece over MCP needs an API key from a subscriber account or one that bought this guide. Without access, the agent only gets the opening.
- Version
- v1.0.0
- Updated
- 22/10/2026
- Licence
- All rights reserved
- Slug
- ak-storage


