Skip to main content

giget vs degit vs tiged: Git Template Downloading in Node.js (2026)

·PkgPulse Team

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 .git history — 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

Featuregigetdegittiged
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 →

Comments

Stay Updated

Get the latest package insights, npm trends, and tooling tips delivered to your inbox.