{"id":35770093,"url":"https://github.com/tylerbutler/repoverlay","last_synced_at":"2026-04-02T14:48:24.760Z","repository":{"id":332412811,"uuid":"1129296973","full_name":"tylerbutler/repoverlay","owner":"tylerbutler","description":"A tool to overlay files on top of a git repo without committing them.","archived":false,"fork":false,"pushed_at":"2026-03-21T23:33:19.000Z","size":1590,"stargazers_count":6,"open_issues_count":15,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T12:37:02.542Z","etag":null,"topics":["ai-agents","cli","configuration","sync"],"latest_commit_sha":null,"homepage":"https://repoverlay.tylerbutler.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tylerbutler.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-06T22:25:49.000Z","updated_at":"2026-03-21T23:32:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tylerbutler/repoverlay","commit_stats":null,"previous_names":["tylerbutler/repoverlay"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/tylerbutler/repoverlay","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerbutler%2Frepoverlay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerbutler%2Frepoverlay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerbutler%2Frepoverlay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerbutler%2Frepoverlay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tylerbutler","download_url":"https://codeload.github.com/tylerbutler/repoverlay/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerbutler%2Frepoverlay/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31308443,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","cli","configuration","sync"],"created_at":"2026-01-07T03:14:56.254Z","updated_at":"2026-04-02T14:48:24.755Z","avatar_url":"https://github.com/tylerbutler.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# repoverlay\n\n[![CI](https://github.com/tylerbutler/repoverlay/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/tylerbutler/repoverlay/actions/workflows/ci.yml)\n[![Crates.io](https://img.shields.io/crates/v/repoverlay)](https://crates.io/crates/repoverlay)\n[![codecov](https://codecov.io/gh/tylerbutler/repoverlay/graph/badge.svg)](https://codecov.io/gh/tylerbutler/repoverlay)\n[![MIT License](https://img.shields.io/crates/l/repoverlay)](LICENSE)\n\nOverlay config files into git repositories without committing them. Files are symlinked (or copied with `--copy`) from overlay sources and automatically excluded via `.git/info/exclude`.\n\n## Quick Reference\n\n| Task | Command |\n|------|---------|\n| **Browse \u0026 apply overlays** | **`repoverlay browse`** |\n| Apply overlay (scripting) | `repoverlay apply \u003csource\u003e` |\n| Check status | `repoverlay status` |\n| Remove overlay | `repoverlay remove \u003cname\u003e` |\n| Remove all | `repoverlay remove --all` |\n| Update from remote | `repoverlay update` |\n| Restore after git clean | `repoverlay restore` |\n| Create overlay | `repoverlay create \u003cname\u003e` |\n| Create local overlay | `repoverlay create --output \u003cpath\u003e` |\n| Edit overlay | `repoverlay edit \u003cname\u003e --add \u003cfiles\u003e` |\n| Sync changes back | `repoverlay sync \u003cname\u003e` |\n| Switch overlays | `repoverlay switch \u003csource\u003e` |\n| Manage sources | `repoverlay source add/list/remove` |\n| Shell completions | `repoverlay completions \u003cshell\u003e` |\n\n## Concepts\n\nrepoverlay manages four kinds of objects:\n\n- **Overlay** — a set of config files applied to a repo. Lifecycle: `create` → `apply` → `update` → `remove`.\n- **Source** — a configured location (GitHub repo or local directory) to find overlays. Lifecycle: `source add` → `source list` → `source remove`.\n- **Cache** — local clones of GitHub repos used by overlays. Managed automatically on `apply`; inspect with `cache list`, clean with `cache remove --all`.\n- **File** — an individual file within an overlay. Managed via `edit` and `sync`.\n\n## Installation\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew install tylerbutler/tap/repoverlay\n```\n\n### Shell installer (macOS/Linux)\n\n```bash\ncurl --proto '=https' --tlsv1.2 -LsSf https://github.com/tylerbutler/repoverlay/releases/latest/download/repoverlay-installer.sh | sh\n```\n\n### PowerShell installer (Windows)\n\n```powershell\nirm https://github.com/tylerbutler/repoverlay/releases/latest/download/repoverlay-installer.ps1 | iex\n```\n\n### Cargo\n\n```bash\ncargo binstall repoverlay  # pre-built binary\ncargo install repoverlay   # build from source\n```\n\n## Usage\n\nThe easiest way to get started is with `browse`, which interactively lists available overlays and lets you select which to apply:\n\n```bash\n# Add a source, then browse and apply interactively\nrepoverlay source add owner/repo\nrepoverlay browse\n\n# Or browse an ephemeral source directly\nrepoverlay browse ./path/to/overlays\nrepoverlay browse owner/repo\n```\n\nFor scripting or power-user workflows, use `apply` directly:\n\n```bash\n# Apply from a local directory\nrepoverlay apply /path/to/overlay\n\n# Apply from GitHub\nrepoverlay apply https://github.com/owner/repo\n\n# Remove an overlay\nrepoverlay remove my-overlay\n```\n\nFor the full command reference with all options and flags, see [docs/cli-reference.md](docs/cli-reference.md).\n\n## Overlay Configuration\n\nCreate a `repoverlay.ccl` in your overlay directory:\n\n```\noverlay =\n  name = my-config\n\n/= Rename files when applying\nmappings =\n  .envrc.template = .envrc\n  vscode-settings.json = .vscode/settings.json\n\n/= Symlink entire directories as a unit\ndirectories =\n  = .claude\n  = scratch\n```\n\n**`mappings`** — Rename files during apply (source = destination).\n\n**`directories`** — Directories to symlink (or copy) as a unit rather than walking individual files. Useful for directories like `.claude/` that should be managed atomically.\n\nWithout a config file, all files are symlinked with the same relative path.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylerbutler%2Frepoverlay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftylerbutler%2Frepoverlay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylerbutler%2Frepoverlay/lists"}