<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: StructKit</title>
    <description>The latest articles on Forem by StructKit (@structkit).</description>
    <link>https://forem.com/structkit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12984%2F0e4f5441-0a20-4d31-9970-021e02eb1c44.png</url>
      <title>Forem: StructKit</title>
      <link>https://forem.com/structkit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/structkit"/>
    <language>en</language>
    <item>
      <title>Building a Terraform Module Scaffold with structkit</title>
      <dc:creator>Kenneth Belitzky</dc:creator>
      <pubDate>Tue, 28 Apr 2026 16:11:15 +0000</pubDate>
      <link>https://forem.com/structkit/building-a-terraform-module-scaffold-with-structkit-1dgm</link>
      <guid>https://forem.com/structkit/building-a-terraform-module-scaffold-with-structkit-1dgm</guid>
      <description>&lt;h1&gt;
  
  
  Building a Terraform Module Scaffold with structkit
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Target:&lt;/strong&gt; dev.to, /r/devops, /r/Terraform | &lt;strong&gt;SEO:&lt;/strong&gt; terraform module template generator, infrastructure as code scaffolding&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you maintain multiple Terraform modules, you know the pain: every new module starts with copy-pasting the same &lt;code&gt;main.tf&lt;/code&gt;, &lt;code&gt;variables.tf&lt;/code&gt;, &lt;code&gt;outputs.tf&lt;/code&gt;, and &lt;code&gt;.github/&lt;/code&gt; setup. &lt;a href="https://github.com/httpdss/structkit" rel="noopener noreferrer"&gt;structkit&lt;/a&gt; lets you define that structure once in YAML and generate it consistently across your team.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Terraform Module Sprawl
&lt;/h2&gt;

&lt;p&gt;As your infrastructure grows, so does your module library. Two things are always true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New modules start with copy-paste&lt;/strong&gt; — someone grabs an old module and strips it down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency degrades over time&lt;/strong&gt; — modules end up with different structures, naming conventions, CI configurations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This causes real pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Onboarding engineers spend hours understanding why Module A has a &lt;code&gt;providers.tf&lt;/code&gt; but Module B does not&lt;/li&gt;
&lt;li&gt;Security reviews find inconsistent IAM patterns across modules&lt;/li&gt;
&lt;li&gt;CI pipelines fail because some modules have &lt;code&gt;terratest&lt;/code&gt;, others do not&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What structkit Does
&lt;/h2&gt;

&lt;p&gt;structkit is a YAML-first scaffolding tool that generates project structures from templates. You define the shape of a project once and structkit materializes it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;structkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Scaffolding a Terraform Module
&lt;/h2&gt;

&lt;p&gt;Here is a complete &lt;code&gt;structkit.yaml&lt;/code&gt; for a standard Terraform module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.tf/{{@ module_name @}}/main.tf&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;# {{@ module_name @}} -- {{@ module_description@ }}&lt;/span&gt;
          &lt;span class="s"&gt;terraform {&lt;/span&gt;
            &lt;span class="s"&gt;required_version = "&amp;gt;= 1.5"&lt;/span&gt;
            &lt;span class="s"&gt;required_providers {&lt;/span&gt;
              &lt;span class="s"&gt;aws = {&lt;/span&gt;
                &lt;span class="s"&gt;source  = "hashicorp/aws"&lt;/span&gt;
                &lt;span class="s"&gt;version = "~&amp;gt; 5.0"&lt;/span&gt;
              &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.tf/{{@ module_name @}}/variables.tf&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;variable "name" {&lt;/span&gt;
              &lt;span class="s"&gt;description = "Name prefix for all resources"&lt;/span&gt;
              &lt;span class="s"&gt;type        = string&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.tf/{{@ module_name @}}/outputs.tf&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;# Add module outputs here&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.tf/{{@ module_name @}}/README.md&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;# {{module_name}}&lt;/span&gt;
            &lt;span class="s"&gt;{{module_description}}&lt;/span&gt;

            &lt;span class="s"&gt;## Usage&lt;/span&gt;
            &lt;span class="s"&gt;module "{{module_name}}" {&lt;/span&gt;
              &lt;span class="s"&gt;source = "./{{module_name}}"&lt;/span&gt;
              &lt;span class="s"&gt;name   = "my-resource"&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;.github/workflows/terraform.yml&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;name: Terraform&lt;/span&gt;
            &lt;span class="s"&gt;on:&lt;/span&gt;
              &lt;span class="s"&gt;pull_request:&lt;/span&gt;
                &lt;span class="s"&gt;branches: [main]&lt;/span&gt;
            &lt;span class="s"&gt;jobs:&lt;/span&gt;
              &lt;span class="s"&gt;validate:&lt;/span&gt;
                &lt;span class="s"&gt;runs-on: ubuntu-latest&lt;/span&gt;
                &lt;span class="s"&gt;steps:&lt;/span&gt;
                  &lt;span class="s"&gt;- uses: actions/checkout@v4&lt;/span&gt;
                  &lt;span class="s"&gt;- uses: hashicorp/setup-terraform@v3&lt;/span&gt;
                  &lt;span class="s"&gt;- run: terraform init -backend=false&lt;/span&gt;
                  &lt;span class="s"&gt;- run: terraform validate&lt;/span&gt;
                  &lt;span class="s"&gt;- run: terraform fmt -check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Generating the Module
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;structkit generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--config&lt;/span&gt; structkit.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--var&lt;/span&gt; &lt;span class="nv"&gt;module_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aws-s3-bucket &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--var&lt;/span&gt; &lt;span class="nv"&gt;module_description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Opinionated S3 bucket module with versioning and encryption"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.tf/aws-s3-bucket/
├── main.tf
├── variables.tf
├── outputs.tf
├── README.md
└── .github/workflows/terraform.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every module your team creates has the same CI setup, the same pre-commit hooks, the same README structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team-Wide Standardization
&lt;/h2&gt;

&lt;p&gt;Store templates in a central repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yourorg/structkit-templates/
├── terraform-module/structkit.yaml
├── terraform-root/structkit.yaml
├── python-service/structkit.yaml
└── github-action/structkit.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Platform teams own the templates. Product teams consume them. Everyone gets consistency without a manual review process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing Approaches
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Consistency&lt;/th&gt;
&lt;th&gt;Learning curve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Manual copy-paste&lt;/td&gt;
&lt;td&gt;Degrades over time&lt;/td&gt;
&lt;td&gt;Very low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cookiecutter&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;copier&lt;/td&gt;
&lt;td&gt;Good (with updates)&lt;/td&gt;
&lt;td&gt;Medium-high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;structkit&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Low (just YAML)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;structkit is YAML-first. If you can write YAML (which you already do for Terraform), you can write structkit templates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI/MCP integration&lt;/strong&gt;: structkit supports Claude MCP for natural-language scaffolding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt;: run structkit in CI to enforce that new modules follow templates&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;structkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/httpdss/structkit" rel="noopener noreferrer"&gt;httpdss/structkit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/structkit/" rel="noopener noreferrer"&gt;structkit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Did this help? Star &lt;a href="https://github.com/httpdss/structkit" rel="noopener noreferrer"&gt;httpdss/structkit&lt;/a&gt; and share your use case in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>iac</category>
      <category>opensource</category>
    </item>
    <item>
      <title>structkit vs cookiecutter vs copier: Which Project Scaffolding Tool Is Right for You?</title>
      <dc:creator>Kenneth Belitzky</dc:creator>
      <pubDate>Sun, 26 Apr 2026 21:36:00 +0000</pubDate>
      <link>https://forem.com/structkit/structkit-vs-cookiecutter-vs-copier-which-project-scaffolding-tool-is-right-for-you-5gag</link>
      <guid>https://forem.com/structkit/structkit-vs-cookiecutter-vs-copier-which-project-scaffolding-tool-is-right-for-you-5gag</guid>
      <description>&lt;h1&gt;
  
  
  structkit vs cookiecutter vs copier: Which Project Scaffolding Tool Is Right for You?
&lt;/h1&gt;

&lt;p&gt;If you've ever needed to scaffold a new project — a microservice, a Terraform module, a Python package — you've likely reached for &lt;strong&gt;cookiecutter&lt;/strong&gt; or &lt;strong&gt;copier&lt;/strong&gt;. They've served the community well for years. But in 2025, the needs of platform engineering teams have evolved: remote content sources, AI assistants, and organization-wide consistency at scale are now table stakes.&lt;/p&gt;

&lt;p&gt;In this post we compare three tools: &lt;strong&gt;cookiecutter&lt;/strong&gt;, &lt;strong&gt;copier&lt;/strong&gt;, and &lt;strong&gt;structkit&lt;/strong&gt; — to help you pick the right one for your workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;cookiecutter&lt;/th&gt;
&lt;th&gt;copier&lt;/th&gt;
&lt;th&gt;structkit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Template storage&lt;/td&gt;
&lt;td&gt;Git repo required&lt;/td&gt;
&lt;td&gt;Git repo required&lt;/td&gt;
&lt;td&gt;YAML file (no repo needed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote file inclusion&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ GitHub, S3, GCS, HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI / MCP integration&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update existing projects&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre/post hooks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dry run mode&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File conflict strategies&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (skip, backup, overwrite)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE schema validation&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub stars&lt;/td&gt;
&lt;td&gt;~10k&lt;/td&gt;
&lt;td&gt;~7k&lt;/td&gt;
&lt;td&gt;~14 (early)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  cookiecutter
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Simple, one-time project generation from a git template repo.&lt;/p&gt;

&lt;p&gt;cookiecutter is the original. Define a &lt;code&gt;cookiecutter.json&lt;/code&gt; and a directory of Jinja2-templated files, push it to GitHub, and anyone can run &lt;code&gt;cookiecutter gh:your-org/your-template&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Huge ecosystem of community templates&lt;/li&gt;
&lt;li&gt;Dead-simple mental model&lt;/li&gt;
&lt;li&gt;Widely understood across teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Templates must live in their own git repo&lt;/li&gt;
&lt;li&gt;Remote content ("include this CI file from our shared templates repo") means copy-pasting into the template itself&lt;/li&gt;
&lt;li&gt;No update path — once generated, you're on your own&lt;/li&gt;
&lt;li&gt;No dry run, no conflict resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cookiecutter if:&lt;/strong&gt; You need quick, one-time scaffolding and there's already a community template for your use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  copier
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Projects that need to stay in sync with their template over time.&lt;/p&gt;

&lt;p&gt;copier is the evolution of cookiecutter. It adds a killer feature: &lt;strong&gt;template updates&lt;/strong&gt;. If the upstream template changes, &lt;code&gt;copier update&lt;/code&gt; merges the diff into your existing project. It also adds dry run mode and file conflict strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Template update / migration path (huge win for long-lived projects)&lt;/li&gt;
&lt;li&gt;Dry run mode&lt;/li&gt;
&lt;li&gt;Multiple conflict strategies (skip, overwrite, patch)&lt;/li&gt;
&lt;li&gt;Jinja2 templating compatible with cookiecutter knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Templates still require a git repo&lt;/li&gt;
&lt;li&gt;Remote content still means copy-pasting&lt;/li&gt;
&lt;li&gt;No AI integration&lt;/li&gt;
&lt;li&gt;YAML config but still needs the template file tree to be managed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use copier if:&lt;/strong&gt; You manage projects that need to track upstream template changes over time — e.g. organizational standards that evolve quarterly.&lt;/p&gt;




&lt;h2&gt;
  
  
  structkit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Platform and DevOps teams managing project standards at scale, especially with remote content sources and AI-native workflows.&lt;/p&gt;

&lt;p&gt;structkit takes a fundamentally different approach: your entire project structure is defined in a &lt;strong&gt;single YAML file&lt;/strong&gt; — no template repo required. File content can come from anywhere: inline, local, GitHub, S3, GCS, or any HTTP URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;README.md&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;# {{@ project_name @}}&lt;/span&gt;
        &lt;span class="s"&gt;{{@ description @}}&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;.github/workflows/ci.yml&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github://your-org/templates/main/ci.yml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;terraform/main.tf&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;s3://your-bucket/terraform/base-module.tf&lt;/span&gt;

&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;project_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;project"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When your org updates the canonical CI template, every &lt;em&gt;new&lt;/em&gt; project generated from your structkit YAML gets the update automatically. No template repo to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes structkit different:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Remote-first content&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reference your org's canonical CI file from GitHub directly. No copy-pasting, no drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. YAML-first design&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The entire structure lives in one file. Commit it to your platform repo. Version it. Review it in a PR. No separate template repository overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. MCP / AI integration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;structkit mcp &lt;span class="nt"&gt;--server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your AI assistant (Claude, Cursor, Copilot) can generate project scaffolds from natural language, using your templates as source of truth. This is the scaffolding tool built for the AI era.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. IDE schema validation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Get autocomplete and validation on your structkit YAML in VS Code, JetBrains, or any JSON Schema-aware editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where structkit is early:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller community and ecosystem (14 stars vs 10k+)&lt;/li&gt;
&lt;li&gt;Fewer community templates available out of the box&lt;/li&gt;
&lt;li&gt;Docs are still growing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use structkit if:&lt;/strong&gt; You're a platform or DevEx team enforcing org-wide standards with remote content sources, or you want to integrate AI assistants into your project creation workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Picking the Right Tool
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Need a quick one-time scaffold from existing community templates&lt;/td&gt;
&lt;td&gt;cookiecutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Projects that need to stay in sync with evolving org templates&lt;/td&gt;
&lt;td&gt;copier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Org-wide standards with remote content sources or AI integration&lt;/td&gt;
&lt;td&gt;structkit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want to try something new with MCP/AI-native workflows&lt;/td&gt;
&lt;td&gt;structkit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting Started with structkit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;structkit
structkit generate my-template ./new-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/httpdss/structkit" rel="noopener noreferrer"&gt;httpdss/structkit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://structkit.lovable.app/docs" rel="noopener noreferrer"&gt;structkit documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP setup: &lt;code&gt;structkit mcp --server&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have questions or want to share how you're using structkit? Join the &lt;a href="https://github.com/httpdss/structkit/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;structkit is open source (MIT). Contributions and feedback welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>python</category>
      <category>tools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Consistent Project Scaffolding at Scale with structkit</title>
      <dc:creator>Kenneth Belitzky</dc:creator>
      <pubDate>Fri, 24 Apr 2026 15:06:18 +0000</pubDate>
      <link>https://forem.com/structkit/consistent-project-scaffolding-at-scale-with-structkit-d8p</link>
      <guid>https://forem.com/structkit/consistent-project-scaffolding-at-scale-with-structkit-d8p</guid>
      <description>&lt;h1&gt;
  
  
  Consistent Project Scaffolding at Scale with structkit
&lt;/h1&gt;

&lt;p&gt;Every engineering team eventually hits the same wall: onboarding a new service takes half a day of copying files, hunting down the right &lt;code&gt;.gitignore&lt;/code&gt;, figuring out which CI template is current, and hoping the intern doesn't miss the security scanning step. The solution is usually a wiki page nobody reads, a "golden repo" that's three quarters out of date, or a Slack message to the platform team that disappears into the void.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;structkit&lt;/strong&gt; exists to solve this problem definitively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is structkit?
&lt;/h2&gt;

&lt;p&gt;structkit is an open-source project scaffolding tool that lets you define entire project structures — files, folders, content, permissions, remote assets — in a single YAML file and generate them consistently, anywhere.&lt;/p&gt;

&lt;p&gt;Think of it as "infrastructure as code, but for your project structure."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;README.md&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;# {{@ project_name @}}&lt;/span&gt;
        &lt;span class="s"&gt;{{@ description @}}&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;.github/workflows/ci.yml&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github://your-org/templates/main/ci.yml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;.gitignore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github://github/gitignore/main/Python.gitignore&lt;/span&gt;

&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;project_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;project"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;One-line&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;structkit generate my-template ./new-service&lt;/code&gt; and you get a complete, consistent project scaffold in seconds — with the correct CI pipeline, the right &lt;code&gt;.gitignore&lt;/code&gt;, and your org's standard README structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Alternatives
&lt;/h2&gt;

&lt;p&gt;If you've tried &lt;strong&gt;cookiecutter&lt;/strong&gt; or &lt;strong&gt;copier&lt;/strong&gt;, you know they're powerful but have friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Templates live in git repos, making version management manual&lt;/li&gt;
&lt;li&gt;Remote content (your org's standard CI file) means copy-pasting into the template&lt;/li&gt;
&lt;li&gt;No AI integration — you're on your own for keeping templates smart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;structkit takes a different approach:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;cookiecutter&lt;/th&gt;
&lt;th&gt;copier&lt;/th&gt;
&lt;th&gt;structkit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Remote content (GitHub, S3, GCS, HTTP)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI / MCP integration&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre/post hooks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dry run mode&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML-first (no template repo needed)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple file strategies (skip, backup, overwrite)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The AI-Native Angle: MCP Integration
&lt;/h2&gt;

&lt;p&gt;The part of structkit that gets developers most excited in 2025 is the MCP (Model Context Protocol) integration. structkit ships with a built-in MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;structkit mcp &lt;span class="nt"&gt;--server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means your AI assistant (Claude, Cursor, Copilot, etc.) can generate project scaffolds directly from natural language:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a new Terraform module with the standard organization security baseline and a README pre-filled with this module's purpose"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your templates encode organizational knowledge. The AI executes them. The result is consistent, governed project creation at the speed of conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Platform engineering teams&lt;/strong&gt; use structkit to enforce org-wide standards: every new microservice gets the same observability setup, security scanning, and documentation structure — automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevEx teams&lt;/strong&gt; use structkit to reduce onboarding time for new engineers. Instead of "read the wiki and copy the golden repo," it's &lt;code&gt;structkit generate service ./my-new-service&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Individual developers&lt;/strong&gt; use structkit to stop recreating the same boilerplate across side projects — define it once, use it forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;structkit
structkit generate terraform-module ./my-new-module
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full documentation: &lt;a href="https://github.com/httpdss/structkit/tree/main/docs" rel="noopener noreferrer"&gt;structkit docs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;structkit is open source (MIT) and actively developed. Star us on GitHub and join the &lt;a href="https://github.com/httpdss/structkit/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>platformengineering</category>
      <category>yaml</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
