Skip to main content

Mount, not install. AI workspace configuration from git-backed registries.

Project description

csaw

Multi-source AI workspace governance.
Mount team and client AI configs alongside personal ones — with protected paths, priority resolution, forkable lineage, and per-project pinning.

CI License: MIT Version PyPI

Works with: Claude Code · Codex · Cursor · Copilot · Windsurf · OpenCode · Gemini CLI


Who csaw is for

You have more than one source of AI configuration:

  • Staff engineers across multiple clients or product teams — each codebase has its own rules, skills, and policies you must respect.
  • Contractors and consultants juggling clients — each engagement demands its own MCP servers, conventions, and security posture, and these must not bleed across projects.
  • Teams with mandated AI policy — a security or platform team publishes config that engineers must use, with personal preferences layered on top without being able to break the mandate.
  • Individuals composing personal config with one or more team or community sources.

If you only have one set of AI files to manage, simpler tools work fine. csaw earns its complexity when you have multiple stakeholders in your AI workspace.

The problem

Multi-stakeholder AI config is a governance problem:

  • No source of truth across projects. A team's AGENTS.md gets copy-pasted into every repo. Each copy drifts independently. The "real" version is whoever pushed last.
  • No way to enforce policy. Security mandates a rule. A developer overrides it locally. Nobody notices.
  • No client isolation. Contractor on Client A's repo runs with personal MCP servers connected to Client B's databases. One slip from data exposure.
  • No layering. Team has shared rules; you want personal additions on top. Composing them per repo is manual, so nobody bothers.
  • No lineage. Fork a team skill, customize for your style, push improvements back? Manual copy-paste, no record of what diverged.
  • Cleanup is impossible. Tried an experimental config; now hunting through 3 tool directories and 6 files.

What csaw does

Keep your AI config in one or more git-backed sources — personal, team, per-client, community. csaw mounts them into your projects via symlinks, composing across sources with priority resolution, protected files that can't be overridden, per-project pinning to specific git refs, and forkable lineage between sources. Update a source — every project sees the change instantly. Unmount, and it's like csaw was never there.

your-registry/                         your-project/
  AGENTS.md                     ──→      AGENTS.md (symlink)
  rules/                                 .claude/rules/
    go-conventions.md           ──→        go-conventions.md (symlink)
  agents/                                .claude/agents/
    code-reviewer.md            ──→        code-reviewer.md (symlink)
  skills/                                .claude/skills/
    code-review/SKILL.md        ──→        code-review/SKILL.md (symlink)
  mcp/                                   .mcp.json (symlink)
    claude-code.json            ──→

Nothing is committed to your project. Git never sees the files. Unmount, and they're gone.


Install

uv tool install csaw
Other install methods
# macOS / Linux
brew install --cask NicholasCullenCooper/tap/csaw

# Windows
scoop bucket add csaw https://github.com/NicholasCullenCooper/scoop-bucket
scoop install csaw

# pipx
pipx install csaw

# Go from source
go install github.com/NicholasCullenCooper/csaw/cmd/csaw@latest

macOS note (Homebrew): If you see "Apple could not verify", run:

xattr -d com.apple.quarantine "$(which csaw)"

This is normal for unsigned CLI tools distributed via Homebrew casks.


Starting a New Project

You have a brand new repo with no AI config. Create a personal registry:

csaw init ~/my-ai-config
✔ initialized registry "my-ai-config"

╭─────────────────────────────────────────────────────╮
│  Register as a source?                              │
│  ▸ Yes       No                                     │
╰─────────────────────────────────────────────────────╯

✔ registered source "my-ai-config" with priority 10

This creates a ready-to-use registry:

~/my-ai-config/
  csaw.yml              ← default profile
  .csawignore           ← hides skills/experimental/** by default
  AGENTS.md             ← your coding rules
  rules/                ← always-on standards
  agents/               ← subagent definitions
  skills/
    code-review/SKILL.md
    commit-message/SKILL.md
    experimental/       ← work-in-progress skills

Now mount it into your project:

cd ~/my-project
csaw mount --profile my-ai-config/default
╭──────────────────────────────────────────────────╮
│                                                  │
│  mounted                                         │
│                                                  │
│  my-ai-config                                    │
│   ✔ AGENTS.md                                    │
│   ✔ .claude/skills/code-review/SKILL.md          │
│   ✔ .claude/skills/commit-message/SKILL.md       │
│                                                  │
│  3 files mounted · 1 tool dirs                   │
│                                                  │
╰──────────────────────────────────────────────────╯

Your project now looks like this:

my-project/
  src/
  package.json
  AGENTS.md                              ← symlink to ~/my-ai-config/AGENTS.md
  .claude/
    skills/
      code-review/SKILL.md               ← symlink
      commit-message/SKILL.md            ← symlink

Open Claude Code (or Cursor, Codex, Copilot) — it finds the files automatically. Run git status — nothing shows up. The files are hidden via .git/info/exclude.


I Already Have an AGENTS.md

You have an existing project with AI config files scattered around — an AGENTS.md, maybe some skills in .claude/skills/. You want to pull them into a registry instead of leaving them committed.

cd ~/my-project
csaw init --adopt ~/my-ai-config
╭───────────────────────────────────────╮
│                                       │
│  adopted 3 files                      │
│                                       │
│   ✔ AGENTS.md                         │
│   ✔ skills/testing/SKILL.md           │
│   ✔ rules/go.md                       │
│                                       │
╰───────────────────────────────────────╯

csaw scans your project, finds AI config files, and copies them into the new registry with the correct structure. It reverses the projection — .claude/skills/testing/SKILL.md becomes skills/testing/SKILL.md in the registry, .claude/rules/go.md becomes rules/go.md, .claude/agents/reviewer.md becomes agents/reviewer.md.

Now you can delete the originals from your project, register the source, and mount instead:

csaw source add personal ~/my-ai-config --priority 10
csaw mount --profile personal/default

Mounting a Team Source

Your team keeps shared AI config in a git repo. One command to get it:

csaw source add team git@github.com:your-org/ai-config.git
✔ registered source "team"
✔ cloned team

csaw auto-clones the repo. Now mount:

cd ~/my-project
csaw mount --profile team/backend

Your project gets the team's AGENTS.md, skills, and rules — all symlinked. Every repo on the team mounts the same source. When someone updates the team config:

csaw pull team
# ✔ pulled team

Every project sees the update instantly through the symlinks. No re-mounting needed.


Composing Multiple Sources

You want a team or client's shared config plus your personal preferences. Or you're a contractor with client-acme and client-globex configs, never to bleed across projects. Add multiple sources:

csaw init ~/my-ai-config
csaw source add personal ~/my-ai-config --priority 10
csaw source add client-acme git@github.com:acme/ai-config.git --priority 50

Now mount uses all configured sources:

csaw mount --profile client-acme/backend

If personal has skills/debug-strategy/SKILL.md and client-acme has skills/code-review/SKILL.md, both get mounted — they're different files, no conflict.

What if two sources provide the same file?

Priority decides. Higher number wins.

csaw inspect
Sources
  client-acme (remote, priority 50) → ~/.csaw/sources/client-acme
  personal (local, priority 10) → ~/my-ai-config

You can set priority on any source:

csaw source add team git@github.com:org/config.git --priority 0
csaw source add personal ~/my-config --priority 10     # wins on conflicts

If two sources have the same priority and provide the same file, csaw errors and tells you to resolve it explicitly.


Protected Files

When a source needs to enforce that certain files cannot be overridden — a team's mandatory security rules, a client's required AGENTS.md — mark them as protected in that source's csaw.yml:

csaw:
  protected:
    - AGENTS.md
    - rules/security.md

backend:
  include:
    - AGENTS.md
    - rules/**

When a file is protected:

  • Priority is bypassed. Even if personal has priority 100, the protected source wins for that file.
  • Fork is refused. csaw fork client-acme/AGENTS.md --into personal returns an error.
  • Protection is visible. csaw inspect marks protected files with a * under the source.

This is the mechanism for team and client governance — let a team or client's source publish required files, layer personal preferences on top, and csaw won't let the personal layer break the protected ones.

Protection is advisory within csaw — it prevents csaw's own mechanisms from bypassing the rules. A developer can still manually delete a symlink and write their own file in its place. csaw doesn't try to stop that. This is an open-source tool, not an enterprise MDM.

Future work: content-hash verification. csaw could record the SHA of each protected file at mount time and detect if someone replaces the symlink with a modified copy. csaw check --strict would fail the check. Tracked as tech debt.


Auditing Active Context

Projects can declare local context requirements in .csaw/policy.yml:

required_sources:
  - client-acme
  - team
blocked_sources:
  - personal-experimental
  - other-client-*
required_kinds:
  - instructions
  - rules
  - mcp

Run audit before starting work, before handing off, or in local/CI checks:

csaw audit
csaw audit --strict
csaw audit --json

csaw audit checks active mount health, required sources, blocked source patterns, and required artifact kinds. Default mode exits nonzero on errors. --strict also exits nonzero on warnings, including a missing project policy.

This is local assurance, not hard prevention. csaw can tell you Client A context is active and Client B context is mounted, but it does not sandbox your machine or stop a user from manually editing files.


Experimental Skills

Working on a new skill? Put it in skills/experimental/:

~/my-ai-config/
  skills/
    code-review/SKILL.md         ← stable, always mounted
    experimental/
      debug-strategy/SKILL.md    ← hidden from default mounts

The .csawignore file hides skills/experimental/** by default. To test an experimental skill:

csaw mount --profile personal/default --include-experimental

When you're confident it works, promote it:

csaw promote personal/skills/experimental/debug-strategy
# ✔ promoted debug-strategy from experimental to stable
#   Push: csaw push personal -m "promote debug-strategy"

This moves it from skills/experimental/debug-strategy/ to skills/debug-strategy/ — now it mounts by default.

To share a promoted skill with the team:

csaw fork personal/skills/debug-strategy/SKILL.md --into team
csaw push team -m "add debug-strategy skill"

Pulling Team Updates

A teammate updated the team's AGENTS.md. Get the latest:

csaw pull team
# ✔ pulled team

Since your project's AGENTS.md is a symlink to the team registry, the update is visible instantly — no remount needed.

What if I edited a mounted file?

If you edited AGENTS.md in your project, you actually edited the team registry (through the symlink). Now csaw pull detects uncommitted changes:

! team has uncommitted changes
  Commit:  cd ~/.csaw/sources/team && git add -A && git commit -m "..."
  Or stash: csaw pull team --stash

--stash stashes your changes, pulls, then pops the stash:

csaw pull team --stash
# ✔ pulled team

What if the team and I changed the same file?

If you have local commits and the remote has diverged:

! team has diverged (2 local, 5 remote commits)
  Resolve: cd ~/.csaw/sources/team && git pull --rebase

This is standard git — csaw tells you what happened and where to fix it. The registry is a normal git repo.


Sharing Your Changes

You updated a skill through a symlink (or edited the registry directly). Push it:

csaw push team -m "improve code review skill"
# ✔ pushed team

This runs git add -A && git commit && git push in the team registry. Your teammates pull the update with csaw pull.

If you're not sure and want to go through a PR instead:

csaw source clone team ~/Developer/team-config
cd ~/Developer/team-config
git checkout -b improve-code-review
# ... edit files ...
git add -A && git commit -m "improve code review"
git push -u origin improve-code-review
gh pr create

csaw source clone moves a remote source to a local directory for contribution. Now you can branch, PR, and collaborate like any codebase.


Testing a Branch

You want to try a feature branch of the team config without affecting other projects:

csaw pin team@feature/new-rules
csaw pull team
csaw mount --profile team/backend

This project now uses the feature/new-rules branch. Other projects stay on main. When you're done:

csaw unpin team
csaw pull team

Back to main.


Forking a Team File

You like the team's AGENTS.md but want to customize it. Fork it:

csaw fork team/AGENTS.md --into personal

This copies the file to your personal registry. Since personal has higher priority, your version gets mounted instead of the team's. The team original is untouched.


Switching Profiles

Mounting a new profile replaces the previous one automatically:

csaw mount --profile team/backend
# ... working on backend ...

csaw mount --profile team/frontend
# previous mount removed, frontend mounted

To go back to what you had before:

csaw mount --restore

To add files on top of an existing mount without replacing:

csaw mount --keep --profile personal/extras

Clean Removal

csaw unmount

Every symlink is removed. If csaw stashed any original files during mount (because they existed before), they're restored. Your project is exactly as it was.

✔ 6 removed · 2 restored

  Remount: csaw mount --restore

The Kinds

csaw treats AI workspace artifacts as five distinct kinds, each with its own conventions and projection target:

Kind Registry path Projects to When loaded
Instructions AGENTS.md, CLAUDE.md Project root Every turn — always in context
Rules rules/*.md .claude/rules/, .cursor/rules/, etc. Every turn — always-on coding standards
Agents agents/*.md .claude/agents/, .cursor/agents/, etc. When invoked — specialized subagent personas
Skills skills/*/SKILL.md .claude/skills/, .opencode/skills/, etc. When relevant — on-demand procedural workflows
MCP mcp/*.json .mcp.json, .cursor/mcp.json, .vscode/mcp.json Session start — tool/data connectivity

Agents vs skills. Both are spawnable, both are markdown with frontmatter. The distinction: an agent defines a persona (a subagent with its own tools, scope, and prompt — Claude's .claude/agents/code-reviewer.md); a skill defines a procedure (a step-by-step workflow loaded only when relevant). Use agents when you want a specialist to take over for a focused task; use skills when you want guidance the main agent can pull in mid-task.

Rules vs instructions. Both are always loaded. The distinction is conventional: instructions (AGENTS.md) are the project-level summary every tool reads; rules are split-out always-on standards organized by topic (e.g., rules/go-conventions.md, rules/security.md).

You can mount selectively by kind:

csaw mount --profile team/backend --kind agents          # only agent definitions
csaw mount --profile team/backend --kind agents,skills   # agents and skills only
csaw mount --profile team/backend                        # all kinds

You write files once in your registry. csaw projects them into every tool's native directory. Mounted files are hidden from git via .git/info/exclude. Use csaw show <path> to make one visible, csaw hide <path> to hide it.

csaw inspect groups mounted files by kind within each source so you can see at a glance what's loaded.


Configuring Tools

If csaw can't auto-detect any tool directories in your project on first mount, it asks which AI tools you use:

╭──────────────────────────────────────────╮
│  Which AI tools do you use?              │
│                                          │
│  ● Claude Code                           │
│  ● Cursor                                │
│  ○ OpenCode                              │
│  ○ Codex                                 │
│  ○ Windsurf                              │
│                                          │
│  space toggle · enter confirm            │
╰──────────────────────────────────────────╯

This is saved to ~/.csaw/config.yml and applies to all projects. You can also set it directly:

csaw config set tools claude,cursor

Registry Structure

A csaw source is just a git repo with markdown files:

my-ai-config/
  csaw.yml              ← profiles (which files to mount)
  .csawignore           ← files hidden from default mounts
  AGENTS.md             ← project guidance (the standard)
  rules/                ← always-on coding standards
    go-conventions.md
    testing-standards.md
  agents/               ← subagent definitions (separate context windows)
    code-reviewer.md
    planner.md
  skills/               ← on-demand reusable workflows
    code-review/
      SKILL.md
    testing/
      SKILL.md
    experimental/       ← work in progress (hidden by .csawignore)
      new-idea/
        SKILL.md
  mcp/                  ← MCP server configs
    claude-code.json

Every file is standard markdown — usable with or without csaw.

Profiles

Profiles go in csaw.yml. They define which files to mount:

backend:
  description: Go backend development
  include:
    - AGENTS.md
    - rules/go-conventions.md
    - skills/code-review/**
    - skills/testing/**

frontend:
  extends: backend
  include:
    - rules/react-patterns.md
    - skills/react-testing/**

Profiles support glob patterns and inheritance. extends pulls in everything from the parent.


Full command reference

Commands

Command What it does
csaw init [dir] Scaffold a new registry. --adopt imports from existing project.
csaw source add name url Add a source (auto-clones remote). --priority n for conflicts.
csaw source remove name Remove a source.
csaw source clone name dir Clone remote source locally for contributing.
csaw source list List configured sources.
csaw mount [patterns] Mount files. Replaces previous mount. Picker if no args.
csaw mount --profile name Mount a named profile.
csaw mount --restore Re-mount the previous selection.
csaw unmount [patterns] Remove mounted files, restore originals.
csaw inspect Full state: sources, mounts, priorities, pins.
csaw audit [path] Audit active context against .csaw/policy.yml.
csaw check Detect broken or drifted symlinks.
csaw update Repair drifted links.
csaw diff path Diff a mounted file against its source.
csaw pull [source] Pull latest from remote sources. --stash for dirty state.
csaw push [source] -m "msg" Commit and push source changes.
csaw pin source@ref Pin source to a branch/tag for this project.
csaw unpin source Unpin, return to default branch.
csaw fork source/path Copy a file into another source. --into target.
csaw promote source/skills/experimental/name Promote experimental skill to stable.
csaw config set key value Set config (tools, default_fork_target).
csaw config list Show configuration.
csaw show / hide path Control git visibility of mounted files.
csaw status Quick summary.

Key Flags

Flag Commands What it does
--profile name mount Named profile to mount.
--kind list mount Filter by kind: agents, skills, rules, mcp, instructions (repeatable).
--force mount Overwrite conflicts, stash originals.
--keep mount Add to existing mount instead of replacing.
--tools list mount Target tools (e.g., --tools claude,cursor).
--restore mount Re-mount previous selection.
--include-experimental mount Include experimental skills (hidden by .csawignore).
--strict audit Fail on warnings as well as errors.
--json audit Emit a machine-readable audit report.
--adopt init Import existing AI config from current project.
--stash pull Stash uncommitted changes before pulling.
--priority n source add Source priority (higher wins on conflict).
--into source fork Target source to fork into.

Contributing

See CONTRIBUTING.md for workflow, validation, and repo standards.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

csaw-0.4.0-py3-none-win_arm64.whl (11.9 MB view details)

Uploaded Python 3Windows ARM64

csaw-0.4.0-py3-none-win_amd64.whl (12.8 MB view details)

Uploaded Python 3Windows x86-64

csaw-0.4.0-py3-none-musllinux_1_2_x86_64.whl (12.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

csaw-0.4.0-py3-none-musllinux_1_2_aarch64.whl (11.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

csaw-0.4.0-py3-none-manylinux_2_17_x86_64.whl (12.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

csaw-0.4.0-py3-none-manylinux_2_17_aarch64.whl (11.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

csaw-0.4.0-py3-none-macosx_11_0_arm64.whl (11.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

csaw-0.4.0-py3-none-macosx_10_9_x86_64.whl (12.6 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file csaw-0.4.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: csaw-0.4.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 11.9 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csaw-0.4.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 fd43429a71f5e1cf206f19319c61d43b7b1b9916eb5b68b7e5f889c1596dc5bd
MD5 49206b1a07632877e2061e8fc3cde9c4
BLAKE2b-256 fdfebe2e71895e070cb4bb121d527f344a6aed70fbdc6d07cc21aef8530ccc86

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-win_arm64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: csaw-0.4.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csaw-0.4.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d0629d49e98905990bf4368b0118cd260cf3bf2e79a553687929aa8ef7d27194
MD5 cb3349588c4ef8402465ed016b33e096
BLAKE2b-256 9811a0641d09dabe10582152cdeca03a4d494c792186ded9fa569ecd40d8120b

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-win_amd64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: csaw-0.4.0-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 12.3 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csaw-0.4.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 46eab2d336bc341231e44e4b45f602c059064079498f9301164c33dbd1e534c1
MD5 37836fa1166073ce938991cbcbe414ef
BLAKE2b-256 917a129d2844517f8144bac2b5037f510092b2e106c059eca4ffa288f2fa47fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.4.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b872a2f8d2d7bb846805709626006cced180fdaa517485c69940daede9817e83
MD5 38874042192829d24d13ec160be084c3
BLAKE2b-256 42f5c84e37d9e449789035691d107a106d17070099cc73bd5331568e087618f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-manylinux_2_17_x86_64.whl.

File metadata

  • Download URL: csaw-0.4.0-py3-none-manylinux_2_17_x86_64.whl
  • Upload date:
  • Size: 12.3 MB
  • Tags: Python 3, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csaw-0.4.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d7020acd30d747017885e85f6302c93c8ab321bb8972f46280131c426deee1b9
MD5 fd7689b8843c702ce2f1d33bdd005338
BLAKE2b-256 328b21eb1dbb60a2f90650bc716a325507885b13838b1cf859d7f69d936530ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-manylinux_2_17_x86_64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for csaw-0.4.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 fa34f4e4d95cde2633bddc9399e3625977792e21737bea0f2fc21d5d9e4c0f0d
MD5 34478d4e3b1ede85d89fc915445955e7
BLAKE2b-256 e9fa1b9672787959d302c86d751d8751653ccd37f6e78753cfae23527c555612

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-manylinux_2_17_aarch64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: csaw-0.4.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 11.9 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csaw-0.4.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6102e0dca28c4649517d43a10ec3d08002b02ba65d378b57328becbb42ff3d12
MD5 74506df11bd540bd6fb0e1e11d5ea9d8
BLAKE2b-256 020424fab6c6e39fe4d91f9cc306f90c6b51a63e5ff943fdfdf215b40621347f

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csaw-0.4.0-py3-none-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: csaw-0.4.0-py3-none-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: Python 3, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csaw-0.4.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 77055caabb58d6b017f8e15036d819349b881a885e84636536fda39d730b3473
MD5 4671630e2784a43092bcb8d9ba4621f5
BLAKE2b-256 2fec5277de7ceb629fb4cdb8ec882cf8abf8f60d150db862fd2d55ce1797fa3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for csaw-0.4.0-py3-none-macosx_10_9_x86_64.whl:

Publisher: release.yml on NicholasCullenCooper/csaw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page