create-react-app, degit, and sao are command-line tools designed to accelerate the setup of new JavaScript projects by generating starter code from templates. create-react-app is a batteries-included tool specifically for React applications, providing a complete development environment with zero configuration. degit is a minimal, lightweight utility that clones GitHub (or other Git) repositories without Git history, making it ideal for copying static project templates. sao is a flexible scaffolding engine that runs configurable generators—often written as npm packages—to produce customized project structures based on user prompts and logic.
When kicking off a new JavaScript project, you rarely start from scratch. Instead, you use a scaffolding tool to generate a baseline structure. But not all tools serve the same purpose. create-react-app, degit, and sao each solve different problems in the project initialization workflow. Let’s break down how they work, when to use them, and what trade-offs they involve.
create-react-app is an opinionated, full-stack setup for React apps. It bundles Webpack, Babel, ESLint, Jest, and more into a single dependency, hiding configuration behind a stable abstraction.
# One command gives you a complete dev environment
npx create-react-app my-app
It assumes you’re building a React app and provides everything needed out of the box — including hot reloading, testing, and optimized production builds.
degit is a dumb file copier. It clones a Git repo but strips away the .git folder and history, leaving only the raw files. There’s no logic, no prompts, no transformation.
# Copies files from a repo as plain text
npx degit user/repo my-project
Think of it as git clone --depth 1 followed by rm -rf .git, but faster and more reliable for templates.
sao is a programmable scaffolding engine. You write a sao.js config file that defines prompts, file templates, and actions. When run, it asks questions and generates a tailored project.
# Runs a generator (published as an npm package or local path)
npx sao my-generator my-project
It’s designed for authors who want to distribute reusable, interactive project starters.
create-react-app uses a fixed, internal template. You can’t change it without ejecting (which exposes all config and makes updates impossible). The template includes React, ReactDOM, and basic CSS support.
// No user-facing template customization
// The template is hardcoded in the package
degit copies static files verbatim. If your template has {{name}} placeholders, they stay as literal text unless you add your own post-processing.
# Template file: src/index.js
console.log('Hello from {{projectName}}!');
# After degit:
# File remains unchanged — no variable substitution
sao supports dynamic templating using EJS-like syntax. It processes files through a template engine, replacing variables based on user answers or context.
// sao.js generator config
export default {
prompts: [{ name: 'name', message: 'Project name?', default: 'my-app' }],
actions: [{ type: 'add', files: '**', templateDir: 'template' }]
};
// template/src/index.js
console.log('Hello from <%= name %>!');
// Output after running sao:
// console.log('Hello from my-cool-app!');
create-react-app is non-interactive. It takes a project name and runs. No questions asked. This ensures consistency but offers no flexibility during creation.
npx create-react-app dashboard # Done. No prompts.
degit is also non-interactive. It’s a fire-and-forget copy operation. Great for scripts or CI, but not for guided setups.
npx degit vitejs/vite my-app # Copies instantly
sao is built for interaction. It uses Inquirer.js under the hood to ask questions, validate input, and branch logic.
// sao.js
export default {
prompts: [
{ name: 'typescript', type: 'confirm', message: 'Use TypeScript?' },
{
name: 'lint',
type: 'confirm',
message: 'Add ESLint?',
when: answers => answers.typescript // Only ask if TS is chosen
}
]
};
This makes it ideal for public generators where users expect choices.
create-react-app is not extensible without ejecting. Once you eject, you own all 50+ config files forever. The React team explicitly discourages ejecting and focuses on keeping the default setup modern via upgrades.
# Ejecting is a one-way door
npm run eject
degit has zero extensibility — and that’s by design. It does one thing well. If you need more, you layer other tools on top (e.g., run a script after degit).
npx degit user/template my-app && cd my-app && npm install
sao is highly extensible. Generators can include lifecycle hooks (prepare, post), custom actions, and even call external binaries. You can publish your generator to npm and version it independently.
// sao.js
export default {
async prepare() {
// Run before file generation
},
async post({ chalk }) {
console.log(chalk.green('Project ready!'));
}
};
You’re building a marketing site with React and need something that just works.
create-react-appnpx create-react-app promo-site
Your team maintains a private GitHub repo with a pre-configured Vite + Vue 3 setup.
degitnpx degit github:myorg/vue-template my-project
You’re publishing an open-source generator for Node.js CLI tools that supports TypeScript, tests, and bin linking.
saonpx sao sao-cli my-cli-tool
# Prompts: TypeScript? Yes/No
# Prompts: Include tests? Yes/No
# Generates tailored package.json, src/, etc.
As of 2024, create-react-app is in maintenance mode. The React team recommends using frameworks like Next.js or Remix for new projects, or Vite for simpler setups. While it still works, it won’t receive major new features.
degit and sao remain actively useful for their respective niches. degit is stable and minimal; sao continues to be used by projects like Poi and SAO-based generators in the ecosystem.
| Feature | create-react-app | degit | sao |
|---|---|---|---|
| Primary Use | React app setup | Copy static templates | Interactive generators |
| Interactivity | ❌ None | ❌ None | ✅ Full prompts & logic |
| Templating | ❌ Fixed internal | ❌ Static files only | ✅ Dynamic (EJS-style) |
| Extensibility | ❌ Only via eject | ❌ None | ✅ Hooks, actions, npm |
| Best For | Standard React apps | Quick template cloning | Reusable, smart starters |
create-react-app (but consider Vite or Next.js for new greenfield projects).degit.sao.These tools aren’t competitors — they’re specialists. Pick the one that matches your workflow: opinionated stack, silent copier, or programmable scaffold.
Choose create-react-app if you're starting a standard React application and want a fully configured, production-ready build setup with no initial configuration overhead. It’s maintained by the React team and includes optimized defaults for development, testing, and deployment. However, avoid it if you need early customization of build tools like Webpack or Babel, as ejecting is irreversible and discouraged.
Choose degit if you need a fast, no-frills way to copy a static project template from a Git repository without any interactivity or logic. It’s ideal for internal team templates or simple starter kits where you just want the files as-is, with no prompts or transformations. Since it doesn’t process templates or run code, it’s not suitable when you need dynamic file generation based on user input.
Choose sao if you require a customizable, interactive scaffolding experience that can generate projects based on user responses, conditional logic, and file transformations. It’s well-suited for creating reusable, shareable generators (e.g., for company-wide standards or open-source boilerplates) that support prompts, templating, and post-generation hooks. Avoid it for one-off projects where a static template suffices, as it adds generator-authoring complexity.
This package includes the global command for Create React App.
Please refer to its documentation: