Published on

🗂️ Profile-Based Dotfiles

Profile-Based Dotfiles

How a dotfiles setup transformed my development workflow across multiple projects and clients

As a consultant/contractor working across diverse projects and clients, I've learned that one of the biggest productivity killers is the time spent recreating and switching between development environments. After years of manually configuring terminals, managing conflicting environment variables, and losing precious time to setup friction, I built a profile-based dotfiles system that has revolutionized my workflow.

The Problem: Multiple Environments, One Developer

Picture this: This month, you're working on a Node.js microservice using AWS and specific deployment tools. Next month, you're switching to a legacy Java application with completely different database connections, authentication systems, and deployment pipelines. You also have your own personal computer where you're prototyping a personal project with entirely different tech stack requirements.

Each context switch meant:

  • 🔄 Manually updating environment variables
  • 🛠️ Reconfiguring CLI tools and aliases
  • 🎯 Adjusting productivity shortcuts for each project (!important)
  • ⚠️ Risk of cross-contamination between environments

The Solution: Profile-Based Environment Management

My dotfiles starter introduces a profile-based architecture that treats each client/project as an isolated environment while maintaining shared productivity configurations.

# Personal projects
source ~/.dotfiles/init/init.sh --profile=peronal

# Client A profile  
source ~/.dotfiles/init/init.sh --profile=datacom

# Client B profile
source ~/.dotfiles/init/init.sh --profile=bnz

Environment Isolation: No More Cross-Contamination

The profile system ensures complete isolation between profiles:

profiles/
├── common/              # Shared productivity tools
│   ├── aliases/         # Universal shortcuts (git, docker)
│   ├── functions/       # Helper utilities
│   └── configs/         # Editor configurations
├── profile-one/        
│   ├── envs/           
│   ├── secrets/        
│   └── functions/      
|
├── profile-two/        
│   ├── envs/           
│   ├── secrets/        
│   └── functions/      
└── personal/         
    ├── envs/         
    ├── secrets/      
    └── functions/    

Key isolation benefits:

  • 🛡️ Security: Client secrets never mix or leak
  • 🎯 Consistency: Same tools, different configurations
  • 🔄 Reproducibility: Onboard new team members instantly
  • Speed: No manual environment variable juggling

Automated Setup

  • ✅ Environment variables
  • ✅ Tool configurations
  • ✅ Shell aliases and functions
  • ✅ Git settings
  • ✅ Development tool paths
  • ✅ Secret management

Built-in Validation and Error Handling

  • ❌ Invalid profile names
  • ❌ Configure validation of required tools (e.g., node, jq)
  • ❌ Configuration conflicts

Repository

Check out my dotfiles starter repository for a complete implementation.