█████ █████████ ██████ ██████
░░███ ███░░░░░███ ███░░███ ███░░███
███████ ░███████ ░███ ░░░ ██████ ██████ ░███ ░░░ ░███ ░░░
███░░███ ░███░░███ ░░█████████ ███░░███ ░░░░░███ ███████ ███████
░███ ░███ ░███ ░███ ░░░░░░░░███░███ ░░░ ███████ ░░░███░ ░░░███░
░███ ░███ ░███ ░███ ███ ░███░███ ███ ███░░███ ░███ ░███
░░███████ ████ █████░░█████████ ░░██████ ░░████████ █████ █████
░░░░░███░░░░ ░░░░░ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░ ░░░░░
███ ░███
░░██████
░░░░░░
Interactive CLI wizard for creating and configuring GitHub repositories. One binary, zero runtime dependencies.
- 🪄 Interactive wizard — Create GitHub repos with a conversational guided flow
- ⚡ Zero dependencies — Single binary, no runtime requirements
- 🔒 Encrypted vault — Tokens stored locally with XSalsa20-Poly1305, never in env vars or plain text
- 🔄 Idempotent apply mode — Configure existing repos without recreation
- 👥 Team access control — Assign repositories to organization teams with custom permissions (read, triage, write, admin)
- 🏷️ Enforced labels — 7 standard labels synced on every run (non-standard labels are removed)
- 🛡️ Branch protection — Enforce reviews, status checks, and workflow validation
- 🚀 Language templates — Rust (v1), Python/Node.js/Java coming soon
- 📝 Boilerplate files — README, Cargo.toml, CI/CD workflows, LICENSE
- 🔑 Template secrets — Automatically configures required GitHub Actions secrets per template
- ⬆️ Self-update — Detects new releases on startup and offers one-command upgrade
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/UniverLab/ghscaff/main/scripts/install.sh | shWindows (PowerShell):
irm https://raw.githubusercontent.com/UniverLab/ghscaff/main/scripts/install.ps1 | iexThis downloads and installs ghscaff. No Rust toolchain required.
You can customize the install:
# Pin a specific version
VERSION=0.1.0 curl -fsSL https://raw.githubusercontent.com/UniverLab/ghscaff/main/scripts/install.sh | sh
# Install to a custom directory
INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/UniverLab/ghscaff/main/scripts/install.sh | shcargo install ghscaffAvailable on crates.io.
git clone https://github.com/UniverLab/ghscaff.git
cd ghscaff
cargo build --release
# Binary at target/release/ghscaffCheck the Releases page for precompiled binaries (Linux x86_64, macOS x86_64/ARM64, Windows x86_64).
rm -f ~/.local/bin/ghscaff # ghscaff binary
rm -rf ~/.ghscaff/ # boilerplate cache + encrypted vault# Interactive wizard — create a new repo
# (token is requested on first run and stored in the encrypted vault)
ghscaff
# Or directly with a subcommand
ghscaff new
# Configure an existing repo
ghscaff apply owner/repo
# Preview changes without API calls
ghscaff --dry-run
# Reconfigure credentials
ghscaff configghscaff resolves the GitHub token in this order:
GITHUB_TOKENenv var — for CI/CD and backward compatibility- Encrypted vault (
~/.ghscaff/vault.enc) — for secure local usage - Interactive prompt — on first run, asks for the token and saves it to the vault
Tokens are encrypted with XSalsa20-Poly1305 and a key derived from:
| Factor | Purpose |
|---|---|
| Username | Only your OS user can decrypt |
| Hostname | Copying the vault to another machine won't work |
| Binary path | Other programs can't derive the same key |
| Passphrase (optional) | Extra protection if desired |
The vault file (~/.ghscaff/vault.enc) has 0600 permissions and the directory has 0700. Writes are atomic (temp file + rename) to prevent corruption.
ghscaff configThis wipes the vault (with confirmation) and starts fresh — new token, optional passphrase. Template secrets will be requested on the next run.
repo— Repository accessworkflow— GitHub Actions accessread:org— (Optional) Organization and team access
Note on team access: If your token lacks the read:org scope, the wizard will skip the team selection step with a warning, but the rest of the repository setup will continue normally.
The wizard guides you through 7 interactive steps:
- Repository basics — Name, description, topics
- Visibility & ownership — Public/Private, personal or org
- Team access (org only) — Select teams and assign permissions (pull, triage, push, admin)
- Language / template — Choose boilerplate (Rust, Python, etc.)
- Branches — Default branch, develop branch
- Features — LICENSE, standard labels
- Review & confirm — Verify all settings before creation
Then automatically:
- Creates the repository
- Commits all boilerplate files in a single atomic commit (
chore: init repository) - Applies branch protection to main (and develop if created)
- Adds selected teams with their assigned permissions
- Enforces standard labels (creates missing, updates changed, removes non-standard)
- Configures required GitHub Actions secrets (from vault, env, or interactive prompt)
Idempotently configure an existing repository:
ghscaff apply owner/repo
# Auto-detects from git remote if omitted
cd my-existing-project
ghscaff applyApplies:
- ✅ Atomic single commit with all boilerplate files (no individual file commits)
- ✅ Labels enforced (creates missing, updates changed, removes non-standard)
- ✅ Branch protection on
mainanddevelop(if created) - ✅ Topics (merges with existing)
- ✅ GitHub Actions secrets (from vault, env, or interactive prompt)
- ✅ CI/CD workflows (included in boilerplate)
- ✅
developbranch (creates if absent)
Safe to run multiple times — idempotent operations only.
Preview changes without making any API calls:
ghscaff --dry-run
# Or with apply mode
ghscaff apply owner/repo --dry-runEach language template includes:
- Dependency manifest — Cargo.toml, package.json, etc.
- Entry point — src/main.rs boilerplate
- README.md — Template with placeholders for name and description
- .gitignore — Language-specific (fetched from GitHub API)
- .github/workflows/ci.yml — CI/CD workflow with basic checks
- .github/workflows/release.yml — Release workflow (published on Git tags)
- LICENSE — Placeholder (user selects license type during wizard)
All files are merged into a single atomic chore: init repository commit.
7 labels are enforced on every repo. Non-standard labels are removed.
| Label | Color | Description |
|---|---|---|
bug |
#d73a4a |
Something isn't working |
feature |
#a2eeef |
New feature or request |
documentation |
#0075ca |
Improvements to docs |
breaking-change |
#e4e669 |
Introduces breaking changes |
target:main |
#1d76db |
Targets the main branch |
target:develop |
#0e8a16 |
Targets the develop branch |
help wanted |
#008672 |
Extra attention needed |
When enabled, applies to the default branch:
- ✅ Require 1 approval before merging
- ✅ Require status checks to pass (wired to CI workflow)
- ✅ Dismiss stale reviews
- ✅ Disallow force-push
Templates can declare required secrets in secrets.toml. ghscaff resolves them in order:
- Encrypted vault — previously saved secrets
- Environment variable — e.g.
CARGO_REGISTRY_TOKEN - Interactive prompt — with option to save to vault for future use
For the Rust template:
CARGO_REGISTRY_TOKEN— Required for publishing to crates.io (get one here)
MIT — see LICENSE for details.
