<p align="center">
<img src="./public/logo.png" alt="Duck UI Logo" width="200" style=""/>
</p>
# π¦ duck-template
> **Fast, customizable Rust-powered project scaffolding β because smart devs donβt start from scratch.**
`duck-template` helps you scaffold and manage projects using structured JSON configurations and flexible CLI commands. With **variant** support, **remote configs**, and **dynamic flag injection**, it gives you complete control over how projects and files are created.
---
## β¨ Features
* π§± **Template-based scaffolding** using JSON
* ποΈ **Variants** for different project layouts (`api`, `web`, `cli`, etc.)
* π **Local or remote configs** (URL or file path)
* π§ **Unified flag parsing** with dynamic injection into templates
* β‘ **Blazing fast** β written in Rust
* π¦ **Modular commands**: `init`, `create`, and `create-variant`
---
## π¦ Installation
```bash
cargo install duck-template
```
---
## π Quick Start
### π§ Initialize a New Project
```bash
duck-template init --name my-app
```
This will:
* Create a directory `my-app/`
* Inject the project name into template files
* Use your local `duck-template.json`
---
### ποΈ Create From a Variant
```bash
duck-template create --variant api --config ./duck-template.json
```
With a **remote config**:
```bash
duck-template create --variant api --config https://example.com/template.json
```
With extra arguments:
```bash
duck-template create \
--variant cli \
--config ./template.json \
--outdir ./output \
--args author=Ahmed,year=2025
```
---
### β¨ Create a New Variant
```bash
duck-template create-variant \
--source ./template-source \
--name cli \
--description "Command-line app setup" \
--config ./duck-template.json
```
This will:
* Package the folder into a new variant
* Append it to the config (if valid and writable)
---
## π§© Configuration Format
Templates are defined in a `duck-template.json` file:
```json
{
"$schema": "https://zpgqhogoevbgpxustvmo.supabase.co/storage/v1/object/public/json/duck-template-schema.json",
"name": "my-template",
"version": "1.0.0",
"description": "Reusable project setup",
"outdir": "./output",
"args": {
"author": "Anonymous",
"license": "MIT"
},
"variants": [
{
"name": "api",
"description": "Express API starter",
"files": [
{ "path": "src/index.ts", "content": "console.log('API ready');" },
{ "path": "tsconfig.json", "template": "tsconfig-template.json" }
]
}
]
}
```
---
## π οΈ Command Reference
### **`init`** β Create a New Project Directory
```bash
duck-template init --name my-app
```
| `-n`, `--name` | Project name (used for folder name and inside templates). |
---
### **`create`** β Generate Files from a Variant
```bash
duck-template create --variant api --config ./config.json
```
| `-v`, `--variant` | Name of the variant to generate |
| `-d`, `--outdir` | Output directory (defaults to `./`) |
| `-c`, `--config` | Local or remote JSON config |
| `-a`, `--args` | Key=value overrides for template variables (`author=Ahmed`) |
---
### **`create-variant`** β Package a Folder into a Variant
```bash
duck-template create-variant \
--source ./starter \
--name basic \
--description "Basic setup" \
--config ./duck-template.json
```
| `-s`, `--source` | Source directory or file |
| `-n`, `--name` | Unique name for the variant |
| `-d`, `--description` | Short description of the variant |
| `-c`, `--config` | Optional path to an existing config to update |
---
## π Output Example
Given:
```bash
duck-template init --name wiseman
```
With config:
```json
{
"name": "wiseman",
"outdir": "./output",
"variants": [
{
"name": "wiseman",
"files": [
{ "path": "src/main.ts", "content": "console.log('{{name}} is wise');" }
]
}
]
}
```
Result:
```
output/
βββ src/
βββ main.ts // console.log("wiseman is wise");
```
---
## π¬ Help & Version
```bash
duck-template --help
duck-template --version
```
Also works with subcommands:
```bash
duck-template init --help
duck-template create-variant --help
```
---
## π€ Contributions
Pull requests, issues, and suggestions are welcome!
Fork, tweak, and share your own templates.
---
**π¦ duck-template** β *smart scaffolding for smart developers.*