vnext: Proposal - Scaffolding end to end templates from GitHub repos#5026
vnext: Proposal - Scaffolding end to end templates from GitHub repos#5026manvkaur wants to merge 8 commits into
Conversation
|
|
||
| Today's function app templates are scattered across multiple sources — the CLI binary, extension bundle, VS Code extension, and Maven repository — each shipping on its own cadence. Getting a template in front of a developer requires a coordinated release across several of these channels, with a minimum turnaround of 6–8 weeks from merge to broad availability. Templates are also bundled inside the CLI binary itself, meaning every addition or update requires a full CLI release. | ||
|
|
||
| This design introduces `func new templates`: a command that downloads **complete, immediately runnable function app templates** directly from GitHub. Templates are discovered via a live manifest hosted on the Azure Functions CDN. Adding a new template is as simple as publishing a GitHub repo and adding an entry to the manifest — no CLI release required. The manifest is versioned independently; the CLI picks up new templates automatically on the next manifest refresh. |
There was a problem hiding this comment.
This doesn't provide templating behaviour so I am reluctant for us to call these templates. There's no parameterization, no conditional inclusion, no post-actions. It clones a GitHub repo into a folder. We have a separate templates workload in flight that will provide real templating (engine + manifest + unified sources), and naming this templates will collide with it both conceptually and in the CLI surface. Let's pick a name that reflects what it actually is: bootstrapping a project from a curated sample repo
For this new experience, I recommend:
func new samplefunc new bootstrapfunc quickstartfunc clone
I think func new sample (with func new sample list / func new sample info ) makes the most sense as it's the most accurate, and doesn't overload "template. I also like func quickstart
Thoughts?
There was a problem hiding this comment.
The reasoning of using the word templates is mainly following what vercel, bolt.new, AI Template Gallery, and AZD Templates call it.
Lambda folks use "blueprints" but I don't want to use the same word as AWS Lambda.
For this new experience, I recommend:
func new samplefunc new bootstrapfunc quickstartfunc cloneI think func new sample (with func new sample list / func new sample info ) makes the most sense as it's the most accurate, and doesn't overload "template. I also like func quickstart
suggestions are good but limiting the feature to "quickstart" would be incorrect and leaving options for advanced samples.
We are calling it Template Gallery in VSCode as well - as it is a template gallery

There was a problem hiding this comment.
There's no parameterization, no conditional inclusion, no post-actions
I don't think core tools today does all the features mentioned for all the templates X languages matrix - i think it is only done in few cases, and we can explore how to add support for it.
| | --- | --- | --- | --- | --- | | ||
| | **`templates`** (proposed) | `func new templates` | `list`, `info` | Familiar term; matches industry use for e2e prod ready apps | Collides with templates workload; | | ||
| | **`sample`** | `func new sample` | `list`, `info` | These are sample repos; no overloading of "template" | Might imply "not production-ready" | | ||
| | **`quickstart`** | `func quickstart` | `list`, `info` | Clear intent; aligns with Azure Samples naming (`*-quickstart-*-azd`) | Longer to type; top-level only (not under `func new`) | |
There was a problem hiding this comment.
top-level only (not under func new`)
Doesn't have to be, could also live on func new if folks prefer that
| | **`templates`** (proposed) | `func new templates` | `list`, `info` | Familiar term; matches industry use for e2e prod ready apps | Collides with templates workload; | | ||
| | **`sample`** | `func new sample` | `list`, `info` | These are sample repos; no overloading of "template" | Might imply "not production-ready" | | ||
| | **`quickstart`** | `func quickstart` | `list`, `info` | Clear intent; aligns with Azure Samples naming (`*-quickstart-*-azd`) | Longer to type; top-level only (not under `func new`) | | ||
| | **`bootstrap`** | `func new bootstrap` | `list`, `info` | Accurate for "set up a project from scratch" | Less discoverable; not a common Azure CLI verb | |
There was a problem hiding this comment.
Would love to understand why this would be less discoverable than say func new templates templates on new doesn't exist today either so I think the discoverability journey is exactly the same. When customers run func --help or func new --help they will be able to see all of the subcommands/commands available to them so I don't think naming has anything to do with discoverability
| | **`bootstrap`** | `func new bootstrap` | `list`, `info` | Accurate for "set up a project from scratch" | Less discoverable; not a common Azure CLI verb | | ||
| | **`clone`** | `func new clone` | `list`, `info` | Technically accurate (it clones a repo) | Implies git; doesn't convey curation or discovery | | ||
|
|
||
| **Recommendation:** `templates` — this is the industry used term for scaffolding a new project, including production-ready starting points. We will need resolve conflict with the in-flight templates workload and establish distinction. |
There was a problem hiding this comment.
My recommendation is we go with quickstart or bootstrap (whether on func root or func new).
The claim that templates is the industry term for this doesn't match either CLI conventions or Azure's own vocabulary.
CLI verbs: Across the most-used scaffolding tools (create-react-app, npm create *, ng new, rails new, nest new, dotnet new, cargo new, yo, hugo new, nuxi init, cookiecutter, degit), the primary verbs are create, new, and init. "Template" almost always appears as a noun or flag (--template, dotnet new ), not the command itself.
Microsoft/Azure usage: Azure docs already draw clean distinctions:
Quickstart → "Ready-to-run, minimal-fuss starting point for a project."
Sample → "End-to-end application/code repos demonstrating real scenarios. Often production-shaped."
Template → "A parameterized, declarative IaC definition. ARM/Bicep templates have a parameters section that is rendered against user input."
When Azure uses "template", the artifact is parameterized and rendered. So by Azure's own established vocabulary it is a sample or quickstart, not a template. "Bootstrap" and "quickstart" are at least as defensible as "templates" here.
There was a problem hiding this comment.
Provided my comments above.
Repasting it
The reasoning of using the word templates is mainly following what vercel, bolt.new, AI Template Gallery, and AZD Templates call it.
Lambda folks use "blueprints" but I don't want to use the same word as AWS Lambda.
For this new experience, I recommend:
func new samplefunc new bootstrapfunc quickstartfunc cloneI think func new sample (with func new sample list / func new sample info ) makes the most sense as it's the most accurate, and doesn't overload "template. I also like func quickstart
suggestions are good but limiting the feature to "quickstart" would be incorrect and leaving options for advanced samples.
We are calling it Template Gallery in VSCode as well - as it is a template gallery

| | **`bootstrap`** | `func new bootstrap` | `list`, `info` | Accurate for "set up a project from scratch" | Less discoverable; not a common Azure CLI verb | | ||
| | **`clone`** | `func new clone` | `list`, `info` | Technically accurate (it clones a repo) | Implies git; doesn't convey curation or discovery | | ||
|
|
||
| **Recommendation:** `templates` — this is the industry used term for scaffolding a new project, including production-ready starting points. We will need resolve conflict with the in-flight templates workload and establish distinction. |
There was a problem hiding this comment.
In addition to the concerns brought up about the conflict and confusion with the existing experience, this scaffolding is not providing templating behavior, the command shape func new templates reads unnaturally to me. In a new <noun> pattern, the noun after new is usually the thing being created, so this reads like “create a new template” not “create a new app from a template.” Since the template/sample is the source rather than the target artifact, I’d avoid this shape. func quickstart, func new --sample <id>, or another source-oriented name would be clearer.
- Rename user-facing .NET label (drop 'isolated worker model') - Simplify --language flag: dotnet (not dotnet-isolated) - Remove --env section (out of scope, belongs in func start) - Add gitRef as required manifest field (no default-branch assumption) - Add Release & Compliance Model section (staging CDN, PR approval, FUNC_TEMPLATE_MANIFEST_URL override) - Add --fetch git|http flag with graceful fallback - Add Git Process Requirements (IGitRunner, timeout, cancellation, non-interactive, argument-array) - Align home directory with cli-profiles spec (~/.azure-functions/<verb>/) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
50a729a to
c520343
Compare
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
c520343 to
6bc9379
Compare
No other CLI command has a --yes flag. Non-interactive use is covered by --template (skips all prompts) and non-TTY detection (errors if --language not supplied). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Rename templates-e2e.md to quickstarts-e2e.md - Resolve terminology: 'template' is the noun, 'quickstart' is the transitional command verb converging into func templates - Document existing func templates surface (templating engine, tokenization, snippets) and convergence intent - Update IInteractionService section from 'Prompt Gap' to 'Prompt Support' reflecting PR 4 additions (PromptForSelectionAsync, EnableSearch) - Align service names, file layout, env vars, and error messages with current implementation on quickstart-handler branch - Update --force from deferred to implemented Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
vnext: Proposal - Scaffolding end to end apps from GitHub repos
Design:
func quickstartfor vNextAdds a design proposal for
func quickstart— a new command that scaffolds complete function apps from GitHub-hosted templates discovered via a CDN manifest.Design doc: proposed/templates-e2e.md
What's proposed
func quickstart,func quickstart list,func quickstart info <id>— scaffolds a complete function app from a curated GitHub repoFUNC_TEMPLATE_MANIFEST_URL)gitRefrequired per manifest entry — templates pinned to immutable tags/SHAs, no default-branch resolutionazure-functions-templatesrepo, requires PR + approval, staging → production promotion--fetch git|http(git default, graceful fallback to HTTP when git not on PATH)IGitRunnerabstraction, timeout, cancellation, non-interactive, argument-array invocation--language,--template,--yes).NET,Node,Python,Java,Powershell) with sub-prompts for .NET (C#/F#) and Node (JS/TS)--pathfor target directory control (must be empty or absent)~/.azure-functions/<verb>/Explicitly deferred
--force/ file conflict handling (tracked as follow-up)Open questions for reviewers
quickstart,sample,bootstrap, or onfunc new)--languageis omitted interactivelyfunc newshould redirect to this flow when no workloads are installedTemplate Manifest Updates
Azure/azure-functions-templates#1787