external-data-upload
Uploads test data files to Filebase IPFS storage using the S3 API, replacing them with .cid content links, and maintains a manifest file.
Identity proven by GitHub's verified organisation badge (greptileai)
- Agents
- Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode
- License
- Apache-2.0 (permissive)
- Pin
- 3ae346cpinned Oct 9, 2026
- Context cost
- about 1,400 tokenswhen the skill loads
- GitHub stars
- 0on greptileai/demo-itk
- Scripts
- 3 scripts
What it does
“Upload ITK test data to Filebase IPFS storage and produce .cid content links via the S3 REST API + npx ipfs-car (no Kubo daemon required), optionally mirror into ITKTestingData, and normalize existing .md5 / .sha256 / .cid content links. Use when the user wants to add test images, baseline data, or model files under Testing/Data/ or a module's data/ directory, or when asked to convert hash-based content links to CID.”
Generated summary from the skill's own text
Uploads test data files to Filebase IPFS storage using the S3 API, replacing them with .cid content links, and maintains a manifest file. Also normalizes existing hash-based content links to CID format and reconciles local mirrors with the Filebase bucket.
When to use it
- Adding test images or baseline data to Testing/Data/ directory
- Converting hash-based content links to CID format
- Maintaining ITK test data storage infrastructure
- Mirroring files to ITKTestingData GitHub Pages gateway
When not to
- User lacks Filebase credentials or pixi environment setup
- Files larger than 50 MB and GitHub mirror requested simultaneously
Install
These commands install from the publisher's repository and need no account.
skills CLI
npx skills add greptileai/demo-itk --skill external-data-uploadInstalls from the repository's default branch, which may have changed since the commit we checked.
GitHub CLI 2.90 or later
gh skill install greptileai/demo-itk external-data-upload@3ae346c24099adce41da49dbc8201d73ee6f8a4fInstalls the commit we checked (3ae346c).
Copy by hand
Download the folder at 3ae346c and put it in .claude/skills/external-data-upload for Claude Code and in .agents/skills/external-data-upload for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.
Copy for your agent
A prompt for any coding agent. It installs this skill from GitHub at the pinned commit, copies the files as they are, and runs nothing unless you ask.
Prompt
Install the agent skill "external-data-upload" by Greptile. Source, pinned to commit 3ae346c24099adce41da49dbc8201d73ee6f8a4f: https://github.com/greptileai/demo-itk/tree/3ae346c24099adce41da49dbc8201d73ee6f8a4f/Utilities/Maintenance/ExternalDataUpload 1. Download that folder at exactly this commit. Do not use the default branch. 2. Copy every file unchanged, keeping the folder structure, into .claude/skills/external-data-upload/ for Claude Code and .agents/skills/external-data-upload/ for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. Create the folders if they do not exist. 3. Do not edit the files, and do not run any script in the folder unless I ask you to. 4. When you are done, list the files you copied and where you put them. Listing and checks: https://www.agentnative.dev/skills/greptile/external-data-upload
SKILL.md at the pin
---
name: external-data-upload
description: >
Upload ITK test data to Filebase IPFS storage and produce .cid content
links via the S3 REST API + npx ipfs-car (no Kubo daemon required),
optionally mirror into ITKTestingData, and normalize existing
.md5 / .sha256 / .cid content links. Use when the user wants to add
test images, baseline data, or model files under Testing/Data/ or a
module's data/ directory, or when asked to convert hash-based content
links to CID.
allowed-tools:
- Bash
- Read
---
# ITK External Data Upload
Upload a file to Filebase IPFS storage and replace it with a `.cid` content
link, maintain `Testing/Data/content-links.manifest`, and (optionally) mirror
the bytes into `ITKTestingData` for the GitHub Pages gateway. Also: regenerate
existing `.md5` / `.sha256` / `.cid` content links under the unixfs-v1-2025
profile.
## Prerequisites
The developer must have the `external-data-upload` pixi environment installed
and Filebase credentials exported. If not, direct them to
[`README.md`](./README.md) in this directory.
Required:
- pixi environment installed: `pixi install -e external-data-upload`
- Filebase IPFS bucket with an S3 access key
- Environment variables exported: `FILEBASE_ACCESS_KEY`,
`FILEBASE_SECRET_KEY`, `FILEBASE_BUCKET`
A local Kubo daemon, IPFS Desktop, or any `ipfs pin remote` PSA service is
**not** required — the upload talks to Filebase's S3 REST API directly and
relies on `npx ipfs-car` (installed via Node.js in the pixi environment) for
local CAR construction.
## Tasks this skill handles
### 1. Upload a single file
Run the upload script via pixi:
```bash
pixi run -e external-data-upload python \
Utilities/Maintenance/ExternalDataUpload/upload.py <filepath>
```
If the user mentions `ITKTestingData` or asks you to mirror the bytes to
GitHub Pages, pass `--testing-data-repo <path>`:
```bash
pixi run -e external-data-upload python \
Utilities/Maintenance/ExternalDataUpload/upload.py \
--testing-data-repo <path-to-ITKTestingData> \
<filepath>
```
The script will:
1. Pack the file into a CARv1 with `npx ipfs-car pack --no-wrap`
(defaults match the unixfs-v1-2025 profile)
2. Upload the CAR to the Filebase IPFS bucket via boto3 with
`Metadata={"import": "car"}` and verify the CID returned by
`head_object` matches the local CID
3. If `--testing-data-repo` given and file ≤ 50 MB, copy to
`<path>/CID/<cid>` and `git add` it there. Files over 50 MB are skipped
for the mirror step only (GitHub rejects > 50 MB) — Filebase pinning still
succeeds.
4. Replace the source file with `<source>.cid`
5. Update `Testing/Data/content-links.manifest`
### 2. Normalize existing content links
Use when the user wants to convert `.md5` / `.sha256` / `.sha512` links to
`.cid`, or re-generate `.cid` links under the unixfs-v1-2025 profile.
```bash
pixi run -e external-data-upload python \
Utilities/Maintenance/ExternalDataUpload/normalize.py <path-or-file>
```
Useful options:
- `--dry-run` — report what would change
- `--hash-only` — only touch `.md5` / `.shaNNN` links, leave `.cid` alone
- `--cid-only` — only re-hash existing `.cid` links under the new profile
- `--testing-data-repo <path>` — forwarded to the upload helper
- `--bucket <name>` — Filebase bucket override (default: `$FILEBASE_BUCKET`)
The normalize script fetches bytes through the gateway templates in
`CMake/ITKExternalData.cmake` (same order as the build), verifies them
against the declared hash or CID, and calls `upload.upload_file_to_filebase`
to produce the new `.cid`.
### 3. Reconcile a local ITKTestingData mirror with Filebase and the manifest
Use when the user has files under `<ITKTestingData>/CID/` that are
referenced by `.cid` content links in the ITK source tree but are missing
from `Testing/Data/content-links.manifest` (and so may not be pinned on
Filebase yet).
```bash
pixi run -e external-data-upload python \
Utilities/Maintenance/ExternalDataUpload/sync.py \
--testing-data-repo <path-to-ITKTestingData>
```
The sync script:
1. Loads CIDs already in the manifest and skips files whose CID is listed.
2. Indexes `.cid` content links in the source tree via `git ls-files`.
3. For each file in `<ITKTestingData>/CID/` whose CID is unlisted and is
referenced by at least one `.cid` link, uploads the bytes to Filebase
under the unixfs-v1-2025 profile and verifies the returned CID matches
the filename.
4. Appends a manifest entry per referencing `.cid` link.
Files in `<ITKTestingData>/CID/` not referenced by any `.cid` link are
skipped silently — the script will not pin loose bytes. The source-tree
`.cid` files are never modified.
Useful options:
- `--dry-run` — preview the CIDs that would be uploaded
- `--bucket <name>` — Filebase bucket override (default: `$FILEBASE_BUCKET`)
## After Upload
Stage the git changes the upload script prints. Typical ITK workflow:
```bash
git rm <original-file>
git add <original-file>.cid
git add Testing/Data/content-links.manifest
```
If `--testing-data-repo` was used, follow the printed commands in that repo:
```bash
git -C <ITKTestingData> commit -m "Add <file> (<cid>)"
git -C <ITKTestingData> push
```
Commit the ITK changes with an appropriate prefix per
[`Documentation/AI/git-commits.md`](../../../Documentation/AI/git-commits.md):
- `ENH:` for new test data
- `STYLE:` for normalizing existing content links (no test semantics change)
## How `.cid` Files Work
A `.cid` file is one line of plain text: a CIDv1, base32-encoded. ITK's
`CMake/ITKExternalData.cmake` recognises the `.cid` extension and fetches
through the gateway list declared there (local Kubo, `ipfs.io`,
`gateway.pinata.cloud`, `cloudflare-ipfs.com`, `dweb.link`, plus the
`ITKTestingData` GitHub Pages mirror at
`insightsoftwareconsortium.github.io/ITKTestingData/CID/<cid>`).
Because CIDs are content-addressed, integrity is verified automatically at
fetch time.
From greptileai/demo-itk at 3ae346c, shown as plain text under its license: Apache-2.0 (permissive). The license text is in LICENSE.
View SKILL.md on GitHub at 3ae346cFiles
- SKILL.md6.0 KB · e16fe1416e15
- README.md12 KB · 7c6b3727b2f9
- normalize.py11 KB · 97b97f1c175a
- sync.py6.8 KB · 1b0e672088f0
- upload.py14 KB · e30919afc79a
5 files, 50 KB in total. Each file has a sha256 in the pin's manifest; the first 12 characters are shown.
Skill folder on GitHub at 3ae346cMore from Greptile
image-generation
This skill generates images using Google's Gemini API through text prompts or by modifying reference images with image-to-image mode.
Contains scripts
Claude Code, Codex, Cursor +3 · about 650 tokens · pinned 6 days ago
onyx-cli
The skill queries an Onyx enterprise search platform to retrieve company documents and internal knowledge.
Contains scripts
Claude Code, Codex, Cursor +3 · about 1.5K tokens · pinned 6 days ago
pptx
This skill enables agents to work with PowerPoint presentations through text extraction, visual analysis, template-based editing, and creation from scratch.
Contains scripts
Agents not labelled yet · about 2.2K tokens · pinned 6 days ago
Related in Cloud and DevOps
n8n-cli
This skill enables agents to manage n8n workflows, credentials, executions, and instance resources via the n8n CLI command-line tool.
by n8nOfficial publisher
Claude Code, Codex, Cursor +4 · about 2.9K tokens · pinned 6 days ago
managing-streamlit-apps
Manage Streamlit apps running in PostHog sandboxes through the full lifecycle: create, set or edit source code, start and stop the sandbox, poll status, and…
by PostHogOfficial publisher
Claude Code, Codex, Cursor +4 · about 1.4K tokens · pinned 6 days ago
release-candidate-prep
Prepares a local Python SDK release candidate in a dedicated Git worktree when explicitly invoked with a version number.
by OpenAIOfficial publisher
Contains scripts
Claude Code, Codex, Cursor +3 · about 4.8K tokens · pinned 6 days ago
cloud-run-basics
Deploys and manages Google Cloud Run services, jobs, and worker pools for running containerized applications or source code.
by GoogleOfficial publisher
Claude Code, Codex, Cursor +4 · about 3.9K tokens · pinned 6 days ago
debug-openshell-cluster
Diagnoses OpenShell gateway deployment problems across Docker, Podman, Kubernetes, and VM compute platforms.
by NVIDIAOfficial publisher
Claude Code, Codex, Cursor +4 · about 19.1K tokens · pinned 6 days ago
hf-cloud-aws-context-discovery
This skill reads the user's local AWS configuration to discover their active profile, region, account ID, and caller identity before any AWS work begins.
by Hugging FaceOfficial publisher
Claude Code, Codex, Cursor +4 · about 830 tokens · pinned 6 days ago
Open roles at Greptile
5 of 6 open roles on the jobs board
- Product Engineer, Security
San Francisco, California, United States (On-site)
- Generalist Engineer
San Francisco, California, United States (On-site)
- Senior Generalist Engineer
San Francisco, California, United States (On-site)
- Infrastructure Engineer
San Francisco, California, United States (On-site)
- Staff Generalist Engineer
San Francisco, California, United States (On-site)