Processing S3 Uploads With Step Functions
aws/agent-toolkit-for-aws
Deploy an event-driven workflow that routes S3 uploads to either Lambda or Fargate via Step Functions based on file size.
Sets up Django 4.2+ to keep static and media files on AWS S3 through django-storages, with public and private backends, presigned URLs and CloudFront.
$ npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Jeffallan/claude-skills django-storages-s3 --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Jeffallan/claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/django-storages-s3 .claude/skills/django-storages-s3 && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "django-storages-s3" agent skill from https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3 into .claude/skills/django-storages-s3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "django-storages-s3", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Jeffallan/claude-skills django-storages-s3 --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Jeffallan/claude-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/django-storages-s3 .agents/skills/django-storages-s3 && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "django-storages-s3" agent skill from https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3 into .agents/skills/django-storages-s3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "django-storages-s3", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Jeffallan/claude-skills django-storages-s3 --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Jeffallan/claude-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/django-storages-s3 .cursor/skills/django-storages-s3 && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "django-storages-s3" agent skill from https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3 into .cursor/skills/django-storages-s3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "django-storages-s3", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Jeffallan/claude-skills.git --path skills/django-storages-s3--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Jeffallan/claude-skills django-storages-s3 --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Jeffallan/claude-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/django-storages-s3 .gemini/skills/django-storages-s3 && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "django-storages-s3" agent skill from https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3 into .gemini/skills/django-storages-s3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "django-storages-s3", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Jeffallan/claude-skills django-storages-s3Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Jeffallan/claude-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/django-storages-s3 .github/skills/django-storages-s3 && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "django-storages-s3" agent skill from https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3 into .github/skills/django-storages-s3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "django-storages-s3", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Jeffallan/claude-skills django-storages-s3 --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Jeffallan/claude-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/django-storages-s3 .opencode/skills/django-storages-s3 && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "django-storages-s3" agent skill from https://github.com/Jeffallan/claude-skills/tree/main/skills/django-storages-s3 into .opencode/skills/django-storages-s3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "django-storages-s3", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
django-storages-s3Sets up Django 4.2+ to keep static and media files on AWS S3 through django-storages, with public and private backends, presigned URLs and CloudFront.
This skill walks the agent through installing django-storages and boto3, registering the app, and wiring the Django 4.2+ STORAGES dict so uploads and collected static files land under separate prefixes in an S3 bucket. Credentials come from environment variables or an attached IAM role, and the skill says never to hardcode them.
Reference files cover splitting public and private backends, per-field storage, generating presigned download and direct browser upload URLs, fronting the bucket with CloudFront, and writing a least-privilege IAM policy. For tests it points to InMemoryStorage or moto so storage code runs without reaching S3. It also includes a checklist for auditing a project that already uses S3.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1be15d8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pipFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
jeffallan.github.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
AWS_SECRET_ACCESS_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Django Storages for S3 loads about 1.9k tokens when it runs, and up to ~6.8k if it reads all its reference files. Until then it costs about 133 tokens; SKILL.md has 635 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Jeffallan/claude-skills at commit 1be15d8, republished under its MIT licence (© Jeffallan). 635 words, ~1,856 tokens.
.claude/skills/django-storages-s3/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Senior Django specialist for production-grade file storage on AWS S3 via django-storages and boto3 — public and private media, static files, presigned URLs, and CloudFront.
STORAGES dict or legacy DEFAULT_FILE_STORAGEFileField/ImageField storage to S3 without code changespip install django-storages[s3] boto3; add "storages" to INSTALLED_APPSSTORAGES dict — Set default (media) and staticfiles backends with separate location prefixesSTORAGES entries when neededcollectstatic, confirm uploads land in S3, and mock S3 in tests with InMemoryStorage or motoLoad detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Settings & STORAGES | references/configuration.md | Core settings, 4.2+ vs legacy, CloudFront |
| Custom backends | references/custom-backends.md | Public vs. private buckets, per-field storage |
| Presigned URLs | references/presigned-urls.md | Download links, direct browser uploads |
| Testing & IAM | references/testing-storages.md | Mocking S3, IAM policy, common pitfalls |
The snippet below demonstrates the core MUST DO constraints: env-loaded credentials, STORAGES dict, separate media/static locations, and default_acl=None on the media backend.
# settings.py
import os
AWS_STORAGE_BUCKET_NAME = os.environ["AWS_STORAGE_BUCKET_NAME"]
AWS_S3_REGION_NAME = os.environ.get("AWS_S3_REGION_NAME", "us-east-1")
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
# On EC2/ECS/Lambda, omit keys entirely — boto3 uses the attached IAM role.
STORAGES = {
"default": { # media uploads
"BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
"OPTIONS": {
"bucket_name": AWS_STORAGE_BUCKET_NAME,
"location": "media",
"default_acl": None, # rely on bucket policy, not per-object ACLs
"file_overwrite": False,
"querystring_auth": False, # public objects → clean URLs
},
},
"staticfiles": {
"BACKEND": "storages.backends.s3boto3.S3StaticStorage",
"OPTIONS": {
"bucket_name": AWS_STORAGE_BUCKET_NAME,
"location": "static",
},
},
}
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"# models.py — uploads go straight to S3 on save()
from django.db import models
class Document(models.Model):
file = models.FileField(upload_to="docs/") # uses STORAGES["default"]When reviewing a project that already uses S3 (not greenfield), walk this checklist — each item is a constraint below rephrased as "find X, confirm Y":
grep -rn "AWS_SECRET_ACCESS_KEY\|aws_secret" settings/ → confirm values come from os.environ/django-environ or an IAM role, never literals committed to the repo.grep -rn "default_acl\|AWS_DEFAULT_ACL" . → on buckets created after April 2023, every value must be None. Any "public-read"/"private" will raise AccessControlListNotSupported; public access belongs in a bucket policy.STORAGES dict, not DEFAULT_FILE_STORAGE/STATICFILES_STORAGE (removed in Django 5.1, so silently ignored on 5.1/5.2/6.0); confirm the static class is S3StaticStorage, not a fabricated name.default (media) and staticfiles have distinct location prefixes or buckets so collectstatic never collides with uploads.region_name (or the global AWS_S3_REGION_NAME) matches the bucket's real region and that AWS_S3_CUSTOM_DOMAIN includes the region segment for non-us-east-1 buckets.querystring_auth=True and custom_domain=None; confirm presigned .url() results aren't cached past AWS_QUERYSTRING_EXPIRE.file_overwrite=False, confirm replaced files are explicitly deleted (otherwise superseded objects leak).Get/Put/Delete/ListBucket on the bucket ARN, not broader S3 access.default_acl=None so bucket policies (not object ACLs) control accesslocation prefixes or separate bucketsSTORAGES dict on Django 4.2+ (same config through 5.2 LTS and 6.0); DEFAULT_FILE_STORAGE/STATICFILES_STORAGE were removed in 5.1, so reserve them for < 4.2 onlycustom_domain=None on any backend that issues presigned URLsInMemoryStorage or moto) in tests instead of hitting real bucketsAWS_SECRET_ACCESS_KEY in settings.py or commit itquerystring_auth=True with a custom_domain (presigning breaks)Get/Put/Delete/ListBucket on the bucket ARNdjango-storages, S3Boto3Storage, S3StaticStorage, boto3, STORAGES dict, presigned URLs, generate_presigned_post, CloudFront, IAM policy, InMemoryStorage, moto
django-expert — core Django models, DRF, and ORM that produce the files this skill persists to S3fullstack-guardian — secure end-to-end upload flows and access control around stored filesdevops-engineer — provisioning the S3 buckets, IAM roles, and CloudFront distributions this skill targets© Jeffallan, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/django-storages-s3 of Jeffallan/claude-skills.
Open the folder on GitHubat commit 1be15d8
Django Storages for S3 next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Django Storages for S3 this skillJeffallan/claude-skills | 12k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Processing S3 Uploads With Step Functionsaws/agent-toolkit-for-aws | 2.8k | — | ~4k | Automated safety check: Pass | Apache-2.0 | |
| Neon Object Storageneondatabase/agent-skills | 100 | — | ~3.5k | Automated safety check: Notes | Apache-2.0 | |
| AWS S3sickn33/agentic-awesome-skills | 47k | 2 repos | ~3.1k | Automated safety check: Pass | MIT | |
| S3itsmostafa/aws-agent-skills | 1.2k | — | ~2.3k | Automated safety check: Pass | MIT | |
| Remediating S3 Bucket Misconfigurationmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~3k | Automated safety check: Pass | Apache-2.0 |
aws/agent-toolkit-for-aws
Deploy an event-driven workflow that routes S3 uploads to either Lambda or Fargate via Step Functions based on file size.
neondatabase/agent-skills
S3-compatible object storage that branches with your Neon project, so files and the database stay in sync across every branch.
sickn33/agentic-awesome-skills
Configure S3 buckets, policies, and lifecycle rules. An agent skill from sickn33/agentic-awesome-skills.
itsmostafa/aws-agent-skills
AWS S3 object storage for bucket management, object operations, and access control.
mukul975/Anthropic-Cybersecurity-Skills
Provides step-by-step procedures for remediating Amazon S3 bucket misconfigurations that expose sensitive data: enabling S3 Block Public Access, auditing bucket policies and ACLs, enforcing…
aws/agent-toolkit-for-aws
Create managed Iceberg tables using Amazon S3 Tables (s3tables API namespace) with automatic compaction and snapshot management.
Jeffallan/claude-skills
Designs REST and GraphQL APIs from resource modeling to an OpenAPI 3.1 contract, with versioning, pagination and RFC 7807 error handling.
Jeffallan/claude-skills
Walks through designing, building and polishing a command-line tool: user workflow and command hierarchy, implementation in commander, click, typer or cobra, completions and cross-platform testing.
Jeffallan/claude-skills
Creates and checks Kubernetes manifests, Helm charts, RBAC and network policies, and helps debug pod problems, with kubectl checks and rollback steps.
Jeffallan/claude-skills
Builds Laravel 10+ applications with Eloquent models, Sanctum authentication, Horizon queues, API resources and Livewire components, tested with Pest or PHPUnit.
Jeffallan/claude-skills
Handles pandas DataFrame work: cleaning, merging, groupby aggregation, pivots, time-series resampling and memory tuning, with checks on dtypes, shapes and nulls.
Jeffallan/claude-skills
Guides writing and tuning Apache Spark jobs: DataFrame and RDD code, Spark SQL, partitioning, caching, shuffle tuning and structured streaming.
Works with
Categories
Sets up Django 4.2+ to keep static and media files on AWS S3 through django-storages, with public and private backends, presigned URLs and CloudFront. 2+ STORAGES dict so uploads and collected static files land under separate prefixes in an S3 bucket. Credentials come from environment variables or an attached IAM role, and the skill says never to hardcode them.
Django Storages for S3 fits situations like: moving Django static and media files from local disk to an S3 bucket; splitting public CDN-served files from private files served by presigned URLs; adding direct browser-to-S3 uploads to a Django form or API; writing tests for storage code without calling real S3.
Run `npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a claude-code`. Or copy the skill folder (skills/django-storages-s3 in Jeffallan/claude-skills) into .claude/skills/django-storages-s3 in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a codex`. Or copy the skill folder (skills/django-storages-s3 in Jeffallan/claude-skills) into .agents/skills/django-storages-s3 in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/django-storages-s3, .gemini/skills/django-storages-s3, .github/skills/django-storages-s3 and .opencode/skills/django-storages-s3 in your project.
Going by SKILL.md and its folder, Django Storages for S3 needs the command-line tools its instructions call (pip) and credentials named AWS_SECRET_ACCESS_KEY. Our summary lists: Python with `django-storages` and `boto3`; An AWS S3 bucket and credentials or an IAM role.
SKILL.md names 1 domain. As links in the text: jeffallan.github.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Django Storages for S3 is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.9k tokens (SKILL.md is roughly 7.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Django Storages for S3: Processing S3 Uploads With Step Functions (aws/agent-toolkit-for-aws, 2.8k stars), Neon Object Storage (neondatabase/agent-skills, 100 stars), AWS S3 (sickn33/agentic-awesome-skills, 47k stars) and S3 (itsmostafa/aws-agent-skills, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Jeffallan (a GitHub user) maintains it in Jeffallan/claude-skills, which has 11,802 GitHub stars. The repository holds 58 skills in this directory. The repository was last updated on October 3, 2026.
Source: Jeffallan/claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.