copit
Copy reusable source code from GitHub repos, HTTP URLs, and ZIP archives into your project.
Inspired by shadcn/ui — instead of installing opaque packages, copit copies source code directly into your codebase. The code is yours: readable, modifiable, and fully owned. No hidden abstractions, no dependency lock-in. Override anything, keep what you need.
Use cases
-
Quickly copy and own code — Pull files from GitHub repos, HTTP URLs, or ZIP archives directly into your project. No forks, no submodules — just your own copy to read, modify, and maintain.
-
Build frameworks with injectable components — Create a core library as a traditional package, then offer optional components that users copy into their projects via copit. Think of how shadcn/ui is built on top of Tailwind and Radix UI: the base libraries are installed as dependencies, while UI components are copied in and fully owned. Apply the same pattern to any ecosystem — a LangChain-style core as a library, with community integrations (OpenAI, Anthropic, etc.) as injectable source code that users can customize freely.
Installation
Standalone (recommended)
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/huynguyengl99/copit/main/install.sh | bash
You can specify a version or install directory:
COPIT_VERSION=v0.1.0 curl -fsSL https://raw.githubusercontent.com/huynguyengl99/copit/main/install.sh | bash
# Custom install location
INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/huynguyengl99/copit/main/install.sh | bash
From PyPI
pip install copit
# or
uv pip install copit
From npm
npm install -g @copit/cli
# or run without installing
npx @copit/cli --help
npm installs only the prebuilt binary for your platform. The unscoped copit package on
npm is a different tool.
From Cargo
cargo install copit
Uninstall
If installed via the standalone script:
curl -fsSL https://raw.githubusercontent.com/huynguyengl99/copit/main/uninstall.sh | bash
If installed to a custom directory:
INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/huynguyengl99/copit/main/uninstall.sh | bash
For PyPI: pip uninstall copit. For npm: npm uninstall -g @copit/cli. For Cargo: cargo uninstall copit.
Quick start
# Initialize a copit.toml in your project
copit init
# Copy a file from a GitHub repo
copit add github:serde-rs/serde@v1.0.219/serde/src/lib.rs
# Copy a file from a raw URL
copit add https://raw.githubusercontent.com/serde-rs/serde/refs/heads/master/LICENSE-MIT
# Copy from a ZIP archive
copit add https://example.com/archive.zip#src/utils.rs
Usage
copit init
Creates a copit.toml config file in the current directory with a default target directory (vendor).
copit create <source> <dir>
Starts a new project from a template folder. Its contents are copied into <dir> (new or
empty) as your own code, untracked. A template can ship its own copit.toml, so
copit add works right away.
copit create github:owner/repo@v1.0.0/templates/api my-app
copit create ../templates/api my-app # a local folder, skipping what git ignores
As with registries, a template is data: copit copies it and never runs anything.
copit add <source>...
Fetches source code and copies it into your project.
Usage: copit add [OPTIONS] [SOURCES]...
Arguments:
[SOURCES]... Source(s) to add (e.g., github:owner/repo@ref/path, https://...)
Options:
--to <TO> Target directory to copy files into
--overwrite Overwrite existing files without prompting
--skip Skip existing files without prompting
--backup Save .orig copy of new version for excluded modified files
--freeze Pin this source so update and update-all skip it
--no-license Skip copying license files
Source formats
| Format | Example |
|---|---|
| GitHub | github:owner/repo@ref/path/to/file (alias: gh:) |
| HTTP URL | https://example.com/file.txt |
| ZIP archive | https://example.com/archive.zip#inner/path |
| Registry component | @registry/component |
Registries
A registry publishes named components you install by id, resolving what they require and installing their package dependencies:
copit registry add my-kit github:owner/repo@v1.0.0 --to app/components
copit add @my-kit/auth
logger 0.1.0 (core) (required)
auth 0.1.0 (core)
Files -> app/components/
logger/ (6 files)
auth/ (6 files)
Packages (via uv): my-runtime>=0.1
Dependencies are copied before the components that need them, and packages go to whichever manager the project already uses: uv, poetry, pdm, pip, pnpm, yarn, npm or cargo, chosen by the registry's declared ecosystem.
See Registries for the index format,
copit-registry.json, and how to publish one.
copit update <path>...
Re-fetches specific tracked source(s) by path (as shown in copit.toml). Always overwrites non-excluded files.
# Re-fetch a specific tracked source
copit update vendor/mylib
# Re-fetch with a new version
copit update vendor/mylib --ref v2.0
# Re-fetch with backup for excluded modified files
copit update vendor/mylib --backup
Options:
--ref <version>— Override the version ref for this update (updates the source string and ref field)--backup— Save.origcopy of new version for excluded modified files--overwrite— Overwrite existing files without prompting--skip— Skip existing files without prompting--freeze— Pin this source so update and update-all skip it--unfreeze— Unpin this source so it can be updated again
copit update-all
Re-fetches all tracked sources in copit.toml.
# Re-fetch all tracked sources
copit update-all
# Re-fetch all with backup for excluded modified files
copit update-all --backup
Options:
--ref <version>— Override the version ref (errors if multiple sources are tracked)--backup— Save.origcopy of new version for excluded modified files--overwrite— Overwrite existing files without prompting--skip— Skip existing files without prompting
copit licenses-sync
Reorganizes license files to match the current (or a new) licenses_dir configuration — moving between centralized and side-by-side layouts.
# Move all license files into a centralized directory
copit licenses-sync --licenses-dir licenses
# Move licenses back to side-by-side (next to each source)
copit licenses-sync --no-dir
# Re-sync based on current config
copit licenses-sync
Options:
--licenses-dir <DIR>— Move licenses into a centralized directory and setlicenses_dirin config--no-dir— Move licenses back to side-by-side and removelicenses_dirfrom config--dry-run— Preview what would be moved without making changes
copit remove <path>... (alias: rm)
Removes previously copied files from disk and their entries from copit.toml.
# Remove a specific file
copit remove vendor/lib.rs
# Remove multiple files
copit rm vendor/lib.rs vendor/utils.rs
# Remove all tracked sources
copit rm --all
Config file
copit.toml tracks your project's target directory and all copied sources:
target = "vendor"
[[sources]]
path = "vendor/prek-identify"
source = "github:j178/prek@master/crates/prek-identify"
ref = "master"
commit = "abc123def456..."
copied_at = "2026-03-07T08:46:51Z"
excludes = ["Cargo.toml", "src/lib.rs"]
Root-level fields:
overwrite/skip/backup: Project defaults. Priority: CLI flags > per-source > root-level >false.licenses_dir: Centralized directory for license files. When set, licenses go to{licenses_dir}/{relative_path}/(mirroring the target structure) instead of next to the source.
Per-source ([[sources]]) fields:
ref: The user-specified version string (branch/tag/sha)commit: Resolved commit SHA from GitHub API (optional, GitHub sources only)excludes: List of relative paths (within source folder) to skip on re-add. With--backup, the new version is saved as<file>.orig.frozen: Pin this source so it's skipped duringupdateandupdate-all.no_license: Skip copying license files for this source (set via--no-licenseonadd, respected byupdate/update-all).overwrite/skip/backup: Per-source overrides.
See Configuration for full details.
License
MIT
Metadata
Release files for copit 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| copit-0.10.0.tar.gz | 181.1 kB | Without provenance | Details for copit-0.10.0.tar.gz |
Built distributions (wheels)
Total release size: 38.0 MB
Release files / copit-0.10.0.tar.gz
| Download URL | copit-0.10.0.tar.gz |
|---|---|
| Size | 181.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
502ace832b25105b48c40f134a3870d9998e45fd995cf9ac4208a2867dcc1149
|
|
BLAKE2b-256 checksum How to use checksums |
58aa1dcb616c2e032d795d7d7a4868debe68355f55fcea0b316b885a5cb250e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-win_arm64.whl
| Download URL | copit-0.10.0-py3-none-win_arm64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Python 3 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
eb27ac5fe2e0afa17c721ccf3e82f48ffeb3f2974582b478fdf83bc6db6f9306
|
|
BLAKE2b-256 checksum How to use checksums |
66947f77d66e1d74f566ef5598e50fca0b2b9b3ca77893cd2cac5a38dc7dda52
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-win_amd64.whl
| Download URL | copit-0.10.0-py3-none-win_amd64.whl |
|---|---|
| Size | 4.2 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
46206c0b5f63b95322e9400817cb0af4120500ff818b88066b8c067c212ea207
|
|
BLAKE2b-256 checksum How to use checksums |
cb50acef7940376f5cf462d677f41ce0db18c98c83e40483bdfd900146fc4b15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-musllinux_1_2_x86_64.whl
| Download URL | copit-0.10.0-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 4.6 MB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
6fd36016ea47043338c15361118c576156a99fccebba2d1b45145c087c2c62be
|
|
BLAKE2b-256 checksum How to use checksums |
0ac54c45b195d26e1427baffbf66f8b4233bf88590272ea93894921bf518ded0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-musllinux_1_2_aarch64.whl
| Download URL | copit-0.10.0-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
ee91dd8f78b777dde2e48695ec1bf2568dfc2fa5a43bc04c34da8eb0c915514c
|
|
BLAKE2b-256 checksum How to use checksums |
9e90d593cd95e7952a2407c45454209532f7ed54b3f89538ccc13fbcdfd4cb5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-manylinux_2_28_armv7l.whl
| Download URL | copit-0.10.0-py3-none-manylinux_2_28_armv7l.whl |
|---|---|
| Size | 3.6 MB |
| Tags | Linux glibc 2.28+ ARMv7l Python 3 |
|
SHA-256 checksum How to use checksums |
1b8fd1b75dce8cb536070bd4fe99325522156809e13c581242e70387eed81678
|
|
BLAKE2b-256 checksum How to use checksums |
e9413baaaebf842105d73151552f6c2ed44210ff955af122a2b8942f25fbb428
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-manylinux_2_28_aarch64.whl
| Download URL | copit-0.10.0-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
979337341547df019c2cd2655958348ce8525f4f768caeb72a50b7ca8a5bbdb8
|
|
BLAKE2b-256 checksum How to use checksums |
3ff49782cb6e6a7f9c767470a2cf9f6f312d2ce47298ae81b65ed27c5f0236f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | copit-0.10.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
4ffcc6cc0059fb104067eddc2dda17eec29b5163d3d475fbf1ba58b2cb1b4267
|
|
BLAKE2b-256 checksum How to use checksums |
81145997ab6edb70664ca8eb85685db859342011651ad42ea551bfd332af12d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-macosx_11_0_arm64.whl
| Download URL | copit-0.10.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e5b5e815ee3f3e088953b0ba519b03d6497912660e092c5842798f6dcad53f64
|
|
BLAKE2b-256 checksum How to use checksums |
98a3dd6878b44f43cc2cdf985307b1d88f285877292370126d5f8e3afe32e33a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / copit-0.10.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | copit-0.10.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
eef793f5a014fcd9e8c9a5d98cc0de24cb25b62335fcb97d10fd7cbd9bb59c24
|
|
BLAKE2b-256 checksum How to use checksums |
317b8b445ca0a932f4562b61e023230e0c2c822454ab361b00c0099e4f1cc11e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for copit 0.10.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.