Template Customization
SpecifyX allows you to customize two types of templates to fit your project workflow and AI assistant preferences.
What You Can Customize
1. Runtime Templates
These templates define the structure of your specifications, plans, and tasks. Located in your project's .specify/templates/ directory.
Available Runtime Templates:
spec-template.md.j2- Feature specification structureplan-template.md.j2- Implementation plan formattasks-template.md.j2- Task breakdown template
2. Agent Templates
These templates generate AI assistant-specific prompt files. Located in src/specify_cli/templates/agent-templates/.
Customizing Runtime Templates
Runtime templates are copied to your project during specifyx init and can be freely modified.
Project Template Structure
.specify/
└── templates/
├── spec-template.md.j2
├── plan-template.md.j2
├── tasks-template.md.j2
├── ...
Example: Customizing Specification Template
Edit .specify/templates/spec-template.md.j2:
# Feature Specification: {{ feature_name | default('[FEATURE NAME]') }}
**Feature Branch**: `{{ branch_name | default('[###-feature-name]') }}`
**Created**: {{ date | default('[DATE]') }}
**Author**: {{ template_variables.author_name | default('[AUTHOR]') }}
## Overview
{{ feature_description | default('[Describe what this feature does and why it\'s needed]') }}
## User Stories
### Primary User Story
As a [user type], I want [goal] so that [benefit].
## Requirements
- **FR-001**: System MUST [capability]
- **FR-002**: Users MUST be able to [action]
{% if template_variables.include_security_section %}
## Security Considerations
- Authentication requirements
- Authorization rules
- Data protection needs
{% endif %}
## Success Criteria
- [ ] [Measurable outcome]
- [ ] [User feedback metric]
## Implementation Notes
{% if ai_assistant == 'claude' %}
- Use Claude Code subagents for complex implementations
- Leverage `/tasks` command to break down work
{% elif ai_assistant == 'gemini' %}
- Use Gemini Code for implementation assistance
{% elif ai_assistant == 'copilot' %}
- Use GitHub Copilot for code completion
{% endif %}
Available Template Variables
Built-in Variables:
project_name- Current project namefeature_name- Current feature namebranch_name- Current branch namedate- Current date (YYYY-MM-DD)ai_assistant- Selected AI assistant (claude, gemini, copilot)feature_description- User-provided feature description
Custom Variables from .specify/config.toml:
template_variables.author_name- Your nametemplate_variables.company_name- Your companytemplate_variables.include_security_section- Boolean for security sections- Any other variables you define in config
Configuration Example
Add custom variables in .specify/config.toml:
[template_variables]
author_name = "Your Name"
company_name = "Your Company"
include_security_section = true
default_tech_stack = "Python + FastAPI"
include_api_design = true
Use in templates:
**Author**: {{ template_variables.author_name | default('[AUTHOR]') }}
**Company**: {{ template_variables.company_name | default('[COMPANY]') }}
{% if template_variables.include_api_design %}
## API Design
[API endpoints and design]
{% endif %}
Customizing Agent Templates
Agent templates generate AI assistant-specific files and are modified in the SpecifyX source code.
When to Customize Agent Templates
- Adding support for a new AI assistant
- Modifying prompts for existing assistants
- Customizing agent behavior and instructions
Agent Template Structure
src/specify_cli/templates/agent-templates/
├── claude/
│ ├── agent-prompt.md.j2
│ └── commands.md.j2
├── gemini/
│ ├── agent-prompt.md.j2
│ └── commands.md.j2
└── copilot/
├── agent-prompt.md.j2
└── commands.md.j2
Template Syntax (Jinja2)
Conditionals
{% if ai_assistant == 'claude' %}
Use Claude Code specific instructions
{% elif ai_assistant == 'gemini' %}
Use Gemini specific instructions
{% else %}
Use generic instructions
{% endif %}
Defaults for Missing Variables
{{ feature_name | default('[FEATURE NAME]') }}
{{ template_variables.author_name | default('[AUTHOR]') }}
Text Transformations
{{ feature_name | title }} <!-- Title Case -->
{{ feature_name | lower }} <!-- lowercase -->
{{ feature_name | upper }} <!-- UPPERCASE -->
Best Practices
1. Always Provide Defaults
{# ✅ Good #}
{{ feature_name | default('[FEATURE NAME]') }}
{# ❌ Bad #}
{{ feature_name }}
2. Keep Conditionals Simple
{# ✅ Good #}
{% if ai_assistant == 'claude' %}
Claude-specific content
{% endif %}
{# ❌ Too Complex #}
{% if ai_assistant == 'claude' and template_variables.advanced_mode and project_name != 'legacy' %}
Complex conditional
{% endif %}
3. Use Meaningful Placeholders
{# ✅ Good #}
{{ feature_description | default('[Describe what this feature does and why it\'s needed]') }}
{# ❌ Bad #}
{{ feature_description | default('[TODO]') }}
Getting Help
- View existing templates:
.specify/templates/
Need more customization? Consider contributing agent templates for new AI assistants or suggesting improvements to runtime templates.