giget vs degit vs tiged: Git Template Downloading in Node.js (2026)
TL;DR
giget is the UnJS template downloader — downloads Git repos and tar archives without git history, supports GitHub, GitLab, Bitbucket, and custom registries, used by Nuxt's nuxi init. degit is Rich Harris's project scaffolding tool — downloads repos without git history, simple CLI, created by the Svelte author. tiged is the community fork of degit — fixes bugs and adds features degit hasn't merged, drop-in replacement. In 2026: giget for programmatic template downloading, degit/tiged for CLI project scaffolding.
Key Takeaways
- giget: ~3M weekly downloads — UnJS, programmatic API, registry support, powers Nuxt CLI
- degit: ~500K weekly downloads — Rich Harris, CLI-first, simple but unmaintained
- tiged: ~100K weekly downloads — community fork of degit, maintained, bug fixes
- All three download repos without
.githistory — clean project scaffolding - giget supports custom template registries (like Nuxt starters)
- degit and tiged are CLI tools; giget has both CLI and programmatic API
The Problem
# git clone downloads the ENTIRE history:
git clone https://github.com/nuxt/starter
# → Downloads all commits, branches, tags
# → .git directory is ~50MB for large repos
# → You just wanted the latest files
# What you actually want:
# → Download just the latest files
# → No .git directory
# → No commit history
# → Ready to start a new project
giget
giget — universal template downloader:
CLI usage
# Download from GitHub:
npx giget gh:nuxt/starter my-app
npx giget github:vitejs/vite/packages/create-vite/template-react-ts my-react-app
# Short syntax:
npx giget nuxt/starter my-app
# GitLab:
npx giget gitlab:user/repo my-project
# Bitbucket:
npx giget bitbucket:user/repo my-project
# Specific branch/tag:
npx giget gh:nuxt/starter#v3 my-app
npx giget gh:vuejs/create-vue#main my-vue-app
# Subdirectory:
npx giget gh:unjs/template/ts my-ts-project
Programmatic API
import { downloadTemplate } from "giget"
// Download a template:
const { source, dir } = await downloadTemplate("gh:nuxt/starter", {
dir: "./my-app",
force: true, // Overwrite existing directory
install: false, // Don't run npm install
})
console.log(`Downloaded from ${source} to ${dir}`)
// With options:
await downloadTemplate("gh:vitejs/vite", {
dir: "./my-project",
preferOffline: true, // Use cache if available
offline: false, // Allow network requests
cwd: process.cwd(),
auth: process.env.GITHUB_TOKEN, // For private repos
})
Custom registries
import { downloadTemplate } from "giget"
// Nuxt uses a custom registry for starters:
await downloadTemplate("nuxt", {
registry: "https://raw.githubusercontent.com/nuxt/starter/templates/templates",
})
// Custom registry for your organization:
await downloadTemplate("my-template", {
registry: "https://templates.mycompany.com",
})
How Nuxt uses giget
// nuxi init uses giget to scaffold projects:
// npx nuxi init my-app
// Internally:
import { downloadTemplate } from "giget"
async function initProject(name: string, template: string = "v3") {
await downloadTemplate(`nuxt/starter#${template}`, {
dir: name,
force: false,
})
console.log(`✅ Nuxt project created in ./${name}`)
console.log(` cd ${name} && npm install`)
}
degit
degit — project scaffolding:
CLI usage
# Download from GitHub:
npx degit user/repo my-project
npx degit sveltejs/template my-svelte-app
# Specific branch:
npx degit user/repo#dev my-project
# Specific tag:
npx degit user/repo#v1.0.0 my-project
# Subdirectory:
npx degit user/repo/path/to/subdir my-project
# GitLab / Bitbucket:
npx degit gitlab:user/repo my-project
npx degit bitbucket:user/repo my-project
# With verbose output:
npx degit -v user/repo my-project
Programmatic usage
import degit from "degit"
const emitter = degit("user/repo", {
cache: true,
force: true,
verbose: true,
})
emitter.on("info", (info) => {
console.log(info.message)
})
await emitter.clone("./my-project")
degit.json actions
// degit.json — post-clone actions:
[
{
"action": "clone",
"src": "user/another-repo"
},
{
"action": "remove",
"files": ["LICENSE", ".github"]
}
]
degit limitations
degit:
✅ Simple CLI — npx degit user/repo dir
✅ Caching — downloads faster on repeat
✅ Post-clone actions (degit.json)
✅ Created by Rich Harris (Svelte author)
❌ Not actively maintained (last release 2020)
❌ GitHub API issues unfixed
❌ No private repo support (without workarounds)
❌ Limited programmatic API
❌ No TypeScript types
→ Use tiged (maintained fork) or giget instead
tiged
tiged — maintained degit fork:
CLI usage (same as degit)
# Drop-in replacement for degit:
npx tiged user/repo my-project
npx tiged sveltejs/template my-svelte-app
# All degit syntax works:
npx tiged user/repo#branch my-project
npx tiged gitlab:user/repo my-project
npx tiged user/repo/subdir my-project
Fixes over degit
tiged improvements over degit:
✅ Fixed GitHub API rate limiting issues
✅ Fixed private repo downloading
✅ Fixed subdirectory extraction bugs
✅ Active maintenance (regular releases)
✅ TypeScript support
✅ Better error messages
Same API — just replace "degit" with "tiged":
npx degit user/repo dir → npx tiged user/repo dir
Programmatic usage
import tiged from "tiged"
const emitter = tiged("user/repo", {
cache: true,
force: true,
verbose: true,
})
emitter.on("info", (info) => {
console.log(info.message)
})
emitter.on("warn", (warning) => {
console.warn(warning.message)
})
await emitter.clone("./my-project")
Feature Comparison
| Feature | giget | degit | tiged |
|---|---|---|---|
| CLI | ✅ | ✅ | ✅ |
| Programmatic API | ✅ (full) | ⚠️ (basic) | ⚠️ (basic) |
| GitHub | ✅ | ✅ | ✅ |
| GitLab | ✅ | ✅ | ✅ |
| Bitbucket | ✅ | ✅ | ✅ |
| Custom registries | ✅ | ❌ | ❌ |
| Private repos | ✅ (auth token) | ❌ | ✅ |
| Subdirectories | ✅ | ✅ | ✅ |
| Branch/tag | ✅ | ✅ | ✅ |
| Caching | ✅ | ✅ | ✅ |
| Post-clone actions | ❌ | ✅ (degit.json) | ✅ (degit.json) |
| TypeScript | ✅ | ❌ | ✅ |
| Maintained | ✅ (UnJS) | ❌ (2020) | ✅ |
| Weekly downloads | ~3M | ~500K | ~100K |
When to Use Each
Use giget if:
- Need a programmatic API for template downloading
- Building a CLI tool that scaffolds projects (like nuxi, create-*)
- Want custom template registries
- In the UnJS ecosystem
Use tiged if:
- Want a CLI-first scaffolding tool (npx tiged user/repo dir)
- Currently using degit and need bug fixes
- Need post-clone actions (degit.json)
- Want a maintained drop-in degit replacement
Use degit if:
- Already using it and it works for your use case
- Note: consider switching to tiged for bug fixes
Methodology
Download data from npm registry (weekly average, February 2026). Feature comparison based on giget v1.x, degit v2.x, and tiged v3.x.
Compare project scaffolding and developer tooling on PkgPulse →