diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..36df5e7
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Red Matter and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index fad0d21..a53825f 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,178 @@
# git-version
-Module for retrieving versions from the git repo from which the parent module is running.
+Terraform module for retrieving version information from the Git repository in which the parent module is running. This module uses `git describe` to generate semantic version strings based on Git tags, commit history, and working tree state.
-## Overrides
+> **Windows Users:** See the [Windows Compatibility Guide](WINDOWS.md) for detailed setup instructions and troubleshooting.
-The version returned can be overridden via the environment and via a passed in override variable.
+## Features
-### Environment
+- **Zero external dependencies** - Only requires Bash (3.2+) and Git
+- **Cross-platform compatible** - Works on Linux, macOS, and other Unix-like systems
+- **Flexible version override system** - Support for environment variables and explicit overrides
+- **CI/CD friendly** - Handles scenarios where Git may not be available during apply-time
-By default, if the `TF_MODULE_VERSION` environment variable is set, this module will return the value of that variable
-instead of using Git to determine a version.
+## Dependencies
-The environment variable to check can be changed by setting the `version_environment_variable` variable.
+This module requires the following to be available in the execution environment:
-### Override variable
+| Dependency | Minimum Version | Purpose | Notes |
+|------------|-----------------|---------|-------|
+| **Terraform** | >= 0.12.0 | Infrastructure as Code runtime | Required |
+| **Bash** | >= 3.2 | Shell script execution | Compatible with macOS default bash |
+| **Git** | Any | Version control system | Must be available in PATH unless using overrides |
-The `version_override` variable defaults to `null`, but if set will be returned.
-In this case neither the Git repo nor the environment will be checked.
+### Platform Compatibility
-This can be useful as a way to allow parent modules to override the version via a variable without needing to implement
-logic of their own to optionally use the module depending on the status of their override variable.
-Instead, they can just pass the override variable in and if it's `null` then it will be ignored.
+- ✅ **Linux** - All distributions with bash and git
+- ✅ **macOS** - Compatible with default bash 3.2 (no Homebrew updates required)
+- ✅ **Windows** - Git Bash, WSL, or Cygwin environments ([detailed Windows guide](WINDOWS.md))
+- ✅ **CI/CD** - Works with environment variable overrides when Git is unavailable
+
+**Windows Users:** Git Bash is automatically included with Git for Windows. No additional installation required. See the [Windows Compatibility Guide](WINDOWS.md) for details.
+
+## Usage
+
+### Basic Usage
+
+```hcl
+module "version" {
+ source = "path/to/git-version"
+}
+
+output "current_version" {
+ value = module.version.version
+}
+```
+
+### With Custom Environment Variable
+
+```hcl
+module "version" {
+ source = "path/to/git-version"
+
+ version_environment_variable = "MY_CUSTOM_VERSION_VAR"
+}
+```
+
+### With Explicit Override
+
+```hcl
+module "version" {
+ source = "path/to/git-version"
+
+ version_override = "1.2.3-custom"
+}
+```
+
+## Version Resolution
+
+The module resolves versions using the following priority order (highest to lowest):
+
+### 1. Explicit Override (Highest Priority)
+
+The `version_override` variable directly sets the version, bypassing both environment variables and Git.
+
+```hcl
+version_override = "2.0.0-rc1"
+```
+
+**Use case:** Parent modules that need to conditionally override versions without implementing their own logic.
+
+### 2. Environment Variable Override
+
+By default, the `TF_MODULE_VERSION` environment variable is checked. If set, its value is returned instead of querying Git.
+
+```bash
+export TF_MODULE_VERSION=1.5.0
+terraform plan
+```
+
+The environment variable name can be customized:
+
+```hcl
+version_environment_variable = "DEPLOYMENT_VERSION"
+```
+
+**Use case:** CI/CD pipelines where Git may not be available during `terraform apply`, or when you want to pin a specific version for a deployment.
+
+### 3. Git Describe (Default Fallback)
+
+If no overrides are set, the module executes:
+
+```bash
+git describe --tags --long --dirty --always
+```
+
+This produces version strings like:
+
+- `1.2.3-0-ga1b2c3d` - On a tagged commit
+- `1.2.3-5-ga1b2c3d` - 5 commits after tag 1.2.3
+- `1.2.3-5-ga1b2c3d-dirty` - Same as above with uncommitted changes
+- `a1b2c3d` - No tags found (falls back to commit hash)
+
+**Use case:** Standard development workflow where Git history accurately reflects versioning.
+
+## Inputs
+
+| Name | Description | Type | Default | Required |
+|------|-------------|------|---------|----------|
+| `version_environment_variable` | Name of the environment variable to check for version override | `string` | `"TF_MODULE_VERSION"` | No |
+| `version_override` | Explicit version string to return (bypasses Git and environment) | `string` | `null` | No |
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| `version` | The resolved version string from Git, environment, or override |
+
+## How It Works
+
+The module uses Terraform's `external` data source to execute a bash script ([git_describe.sh](git_describe.sh)) that:
+
+1. Checks if the specified environment variable contains a version
+2. If not, executes `git describe --tags --long --dirty --always`
+3. Returns the version as JSON: `{"version": "..."}`
+4. Falls back to `"UNKNOWN"` if Git command fails
+
+## CI/CD Integration
+
+### GitHub Actions Example
+
+```yaml
+- name: Terraform Plan
+ env:
+ TF_MODULE_VERSION: ${{ github.ref_name }}
+ run: terraform plan
+```
+
+### GitLab CI Example
+
+```yaml
+terraform:
+ variables:
+ TF_MODULE_VERSION: $CI_COMMIT_TAG
+ script:
+ - terraform apply
+```
+
+### Jenkins Example
+
+```groovy
+environment {
+ TF_MODULE_VERSION = "${env.GIT_TAG}"
+}
+```
+
+## Migration Notes
+
+**Version 1.2.0+**: Removed Python dependency in favor of Bash. The Python script (`git_describe.py`) is no longer used or required. If you have older versions of this module pinned, no changes are needed - the bash implementation produces identical output.
+
+**For Windows users:** Git Bash (included with Git for Windows) provides all required functionality. No additional setup needed beyond Git, which is already required for version control. See [WINDOWS.md](WINDOWS.md) for comprehensive Windows compatibility information, troubleshooting, and FAQs.
+
+## License
+
+This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
+
+## Contributing
+
+When modifying the bash script, ensure compatibility with bash 3.2+ for macOS support. Test on both modern Linux (bash 5.x) and macOS (bash 3.2) before submitting changes.
diff --git a/WINDOWS.md b/WINDOWS.md
new file mode 100644
index 0000000..42d7397
--- /dev/null
+++ b/WINDOWS.md
@@ -0,0 +1,272 @@
+# Windows Compatibility Guide
+
+**TL;DR:** Got Git? You're good to go! 🎉
+
+If you have Git for Windows installed (which you need for Terraform anyway), this module works immediately. No extra setup, no Python, no WSL required.
+
+```bash
+# In Git Bash (comes with Git for Windows)
+cd your-terraform-project
+terraform plan
+```
+
+**That's it.** Read on if you need troubleshooting or want to understand why this works.
+
+---
+
+## What You Need
+
+✅ **Git for Windows** - You already have this (required for Terraform development)
+✅ **Terraform CLI** - You already have this
+❌ **Python** - Not needed anymore!
+❌ **WSL** - Not needed (though it works if you have it)
+❌ **Cygwin/MinGW** - Not needed (though they work too)
+
+
+📖 Why does this work? (click to expand)
+
+When you install Git for Windows, you automatically get:
+
+- `git.exe` - the Git command
+- `bash.exe` - the Bash shell
+- Git Bash terminal - a Unix-like environment
+
+This module needs both `git` and `bash` commands. Since Git for Windows bundles them together, you're already set! No Python installation, no WSL setup, no extra steps.
+
+
+
+---
+
+## How to Use It
+
+### Step 1: Open Git Bash
+
+Find "Git Bash" in your Start Menu and open it. (It came with Git for Windows)
+
+### Step 2: Run Terraform
+
+```bash
+cd your-terraform-project
+terraform plan
+```
+
+**Done!** The module works automatically.
+
+
+🔧 First time setup? (click if you don't have Git yet)
+
+**Install Git for Windows:**
+
+1. Download from [git-scm.com/download/win](https://git-scm.com/download/win)
+2. Run installer with default settings
+3. Git Bash is installed automatically
+
+**Verify it works:**
+
+```bash
+# Open Git Bash and check:
+git --version # Should show: git version 2.x.x
+bash --version # Should show: GNU bash, version 4.x.x
+terraform version # Should show: Terraform v1.x.x
+```
+
+
+
+
+💻 Can I use PowerShell or CMD? (click to expand)
+
+**Yes!** All Windows terminals work:
+
+- **Git Bash** ✅ Recommended - native bash environment
+- **PowerShell** ✅ Works - calls bash.exe automatically
+- **CMD** ✅ Works - calls bash.exe automatically
+- **WSL** ✅ Works - full Linux environment
+
+When Terraform runs `program = ["bash", "..."]`, Windows finds `bash.exe` from your Git installation (it's in your PATH). You don't need to do anything special.
+
+
+
+---
+
+## Common Questions
+
+### "Do I need to install WSL?"
+
+**No.** Git Bash (included with Git) is enough. WSL works if you already have it, but it's not required.
+
+### "Do I need Python?"
+
+**No.** We removed the Python dependency in v1.2.0. This module now uses only Bash and Git - both included with Git for Windows.
+
+### "What about AWS credentials or cloud provider setup?"
+
+**Not relevant.** This module doesn't touch AWS, Azure, or any cloud provider. It only:
+
+- Reads an optional environment variable
+- Runs `git describe` to get your version
+- Returns the result
+
+Your cloud credentials are handled by Terraform itself, not this module.
+
+### "Will this work in CI/CD?"
+
+**Yes!** Most Windows CI/CD runners include Git by default:
+
+- ✅ GitHub Actions (Git pre-installed)
+- ✅ GitLab CI (Git pre-installed)
+- ✅ Azure DevOps (Git pre-installed)
+- ✅ Jenkins (install Git on agent)
+
+
+📋 Example: GitHub Actions (click to expand)
+
+```yaml
+- name: Setup Terraform
+ uses: hashicorp/setup-terraform@v2
+
+- name: Terraform Plan
+ run: terraform plan
+ # Works automatically - GitHub Windows runners include Git Bash
+```
+
+
+
+### "I'm behind a corporate proxy?"
+
+**No problem.** Configure Git proxy and everything works:
+
+```bash
+git config --global http.proxy http://proxy.example.com:8080
+git config --global https.proxy http://proxy.example.com:8080
+```
+
+This module only uses local Git commands anyway - no network calls (unless you're fetching remote tags).
+
+---
+
+## Troubleshooting
+
+### 🚫 Error: "bash: command not found"
+
+**Fix:** Install Git for Windows from [git-scm.com/download/win](https://git-scm.com/download/win)
+
+
+🔍 Still not working? Check your PATH (click to expand)
+
+```powershell
+# In PowerShell, verify Git is in PATH:
+$env:PATH -split ';' | Select-String 'Git'
+# Should show: C:\Program Files\Git\bin
+```
+
+If missing, add `C:\Program Files\Git\bin` to System PATH:
+
+1. Windows Search → "Environment Variables"
+2. Edit "System PATH"
+3. Add `C:\Program Files\Git\bin`
+4. Restart terminal
+
+
+
+### 🚫 Module returns "UNKNOWN"
+
+**Cause:** No Git repository or no tags found.
+
+**Quick fixes:**
+
+```bash
+# Check you're in a Git repo:
+git status
+
+# Create a tag if none exist:
+git tag v1.0.0
+
+# Or bypass Git entirely:
+export TF_MODULE_VERSION=1.0.0
+terraform plan
+```
+
+
+🔧 More troubleshooting options (click to expand)
+
+**Check for tags:**
+
+```bash
+git tag # Should list tags like v1.0.0
+```
+
+**Use Terraform override:**
+
+```hcl
+module "version" {
+ source = "..."
+ version_override = "1.0.0" # Bypasses Git
+}
+```
+
+**Enable debug logging:**
+
+```bash
+TF_LOG=DEBUG terraform plan 2>&1 | grep -i external
+```
+
+
+
+### 🚫 Error: Permission denied
+
+Rare, but if it happens:
+
+```bash
+chmod +x git_describe.sh
+```
+
+---
+
+## Still Want to Use Python?
+
+If you have Python standardized in your environment and prefer it:
+
+
+🐍 Switch back to Python (click to expand)
+
+**Change main.tf to use Python:**
+
+```hcl
+data "external" "version" {
+ count = var.version_override == null ? 1 : 0
+ program = ["python", "${path.module}/git_describe.py", var.version_environment_variable]
+}
+```
+
+**Ensure Python is installed:**
+
+```powershell
+python --version # or python3 --version
+```
+
+**Install if needed:** [python.org/downloads](https://www.python.org/downloads/) (check "Add Python to PATH")
+
+**Why Bash is recommended:**
+
+| Aspect | Bash (Default) | Python (Alternative) |
+|--------|----------------|---------------------|
+| Installation | Included with Git | Separate install |
+| PATH config | Automatic | Manual |
+| Dependencies | Git only | Git + Python |
+
+
+
+---
+
+## Bottom Line
+
+**You already have everything you need.** Git for Windows = Git + Bash. This module uses both. No extra setup required.
+
+Questions? Problems? Test the script directly:
+
+```bash
+bash git_describe.sh
+# Should output: {"version": "..."}
+```
+
+That's all there is to it! 🎉
diff --git a/git_describe.sh b/git_describe.sh
new file mode 100755
index 0000000..e28c3b5
--- /dev/null
+++ b/git_describe.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+# Compatible with bash 3.2+ (including macOS default bash)
+
+version=""
+
+# Check if an environment variable name was passed as argument
+if [ $# -ge 1 ]; then
+ # Indirect variable expansion - get the value of the variable named in $1
+ # This syntax works in bash 3.2+
+ eval "version=\${$1}"
+fi
+
+# If version is still empty, try to get it from git
+if [ -z "$version" ]; then
+ # Redirect stderr to /dev/null to suppress error messages
+ if version=$(git describe --tags --long --dirty --always 2>/dev/null); then
+ # Success - version is already set
+ :
+ else
+ # Git command failed
+ version="UNKNOWN"
+ fi
+fi
+
+# Output JSON - escape special characters to ensure valid JSON
+# Using bash 3.2+ compatible parameter expansion: ${var//pattern/replacement}
+# Order matters: escape backslashes first (to avoid double-escaping), then quotes
+version_escaped="${version//\\/\\\\}" # Replace \ with \\
+version_escaped="${version_escaped//\"/\\\"}" # Replace " with \"
+
+printf '{"version": "%s"}\n' "$version_escaped"
diff --git a/main.tf b/main.tf
index 0f8ada2..8173dd4 100644
--- a/main.tf
+++ b/main.tf
@@ -1,4 +1,4 @@
data "external" "version" {
count = var.version_override == null ? 1 : 0
- program = ["python", "${path.module}/git_describe.py", var.version_environment_variable]
+ program = ["bash", "${path.module}/git_describe.sh", var.version_environment_variable]
}