myshell is a Bash-first hybrid framework for building, bootstrapping, and operating a modular user environment.
It treats the shell runtime as the technical base, then layers optional profiles, user services, and operational modules on top of it. The result is a structured system that aims for two main properties:
- modularity: each component has a clear layer, a concrete purpose, and explicit activation
- reproducibility: the managed local environment and its modular composition can be reproduced consistently
myshell is not intended to look like a classic dotfiles repository, a loose collection of personal scripts, a simple .bashrc bootstrap, or a package manager. It is meant to behave like a lightweight, Bash-based framework for managing a stable user environment and exposing reusable operational tooling.
myshell is designed to:
- bootstrap a Bash-based user environment
- manage shell runtime behavior through a structured core
- load optional profiles and user services explicitly
- expose operational modules through a stable framework structure
- integrate official external companion repositories such as
config_files
myshell is not designed to:
- manage arbitrary local state outside its declared managed components
- behave like a package manager
- present itself as a generic framework without a concrete user-environment use case
myshell is organized around the following layers:
The core is the runtime base of the framework. It provides the shell entrypoints and the structure through which the rest of the system is loaded.
This includes:
.bash_profile.bashrc- aliases
- functions
- jobs
Profiles are optional environment components loaded from core/shells/bash/profiles/.
Profiles are part of the framework core model. They are used for shell environment setup, bootstrap behavior, and managed configuration deployment.
Profiles are opt-in through explicit loader blocks in .bashrc.
Services are optional components loaded from core/shells/bash/services/.
Services are also part of the framework core model, but are intended for persistent or service-like integrations that should not live as normal shell profiles.
Typical examples are systemd --user units and their companion scripts.
Services are opt-in through explicit loader blocks in .bashrc.
Modules are operational tooling components. They expose commands and workflows on top of the stable user-environment base provided by the framework.
Modules are part of the core identity of myshell, not an afterthought.
PowerShell support exists as an optional layer. It is supported, but it is not part of the primary identity of the framework.
myshell supports official companion repositories that are external in storage but functionally part of the framework ecosystem.
The primary companion repository is:
config_files
config_files is not treated as a secondary integration. It is the official companion repository for managed external configuration consumed by myshell.
A core principle of myshell is explicit control.
When a component is active and managed by the framework, the framework is authoritative for that component.
When a component is disabled, it stops being managed.
This means:
- active managed components are expected to follow framework-defined behavior
- disabled components are outside the authority of the framework
- activation state is explicit and visible through the corresponding loader blocks
myshell aims to keep both of these stable:
- the structure of the framework
- the experience of use
What may vary:
- which profiles, services, and modules are enabled
- which components are sourced from the official companion repository
- future official external integrations in the
myshellecosystem
The framework is designed around explicit, visible activation.
The expected user experience is:
- load a predefined environment
- enable or disable explicit pieces of that environment
- use operational modules on top of a stable base
This is an opt-in modular system, not a hidden auto-magic bootstrap.
myshell is Bash-first by design.
Bash is not just the implementation language; it is part of the framework identity. The framework is intended to stay technically direct, operational, and readable while still being powerful.
The target is power within visible simplicity:
- the internal system can grow
- but the user model and framework structure should remain understandable and explicit
Current top-level structure relevant to the framework model:
core/- framework runtime and shell entrypoints
core/shells/bash/profiles/- optional managed environment components
core/shells/bash/services/- optional managed service integrations
core/shells/bash/.bash_profile- framework entrypoint
core/shells/bash/.bashrc- explicit activation surface for profiles and services
modules/- operational toolkit components
core/shells/pwsh/- optional PowerShell support
- Back up your current
$HOME/.bash_profileif needed. - Clone the repository.
- Copy the framework entrypoint to your home.
- Set
project_path. - Reload the shell session.
git clone git@github.com:e-lemongrab/myshell.git
cp -rfv myshell/core/shells/bash/.bash_profile "$HOME"
sed -i 's|$HOME/Documents/myshell|'"$(pwd)"'/myshell|g' "$HOME/.bash_profile"
exec -l "$SHELL"After that:
- run
checksto list compatibility information - run
myshellto view available commands
Once the Bash configuration is active, and if pwsh is installed, myshell can also set the PowerShell profile at:
~/.config/powershell/Microsoft.PowerShell_profile.ps1
If you want to use the PowerShell profile from Windows:
- Install a WSL2 distribution.
- Edit
$PROFILEwith the content fromcore/shells/pwsh/Microsoft.PowerShell_profile.ps1. - Set the required values in the
VARIABLE DECLARATIONsection.
myshell loads optional Bash components from core/shells/bash/profiles/ and core/shells/bash/services/ through explicit blocks in core/shells/bash/.bashrc.
Examples include:
.git-configs.appearance.completion.history.path.pwsh.software.config_files.ssh
Examples include:
.hyprland-wallpaper.nvidia-fan
These are framework-managed service integrations and are activated through .bashrc loader blocks.
.hyprland-wallpaper
- downloads
hypr-wallpaper.servicefromconfig_files - downloads
wallpaper-rotation.shfromconfig_files - installs them into local user paths
- runs
systemctl --user daemon-reload - runs
systemctl --user enable --now hypr-wallpaper.servicewhen needed
.nvidia-fan
- downloads
nvidia-fan.servicefromconfig_files - downloads
nvidiafan.shfromconfig_files - installs them into local user paths
- runs
systemctl --user daemon-reload - runs
systemctl --user enable --now nvidia-fan.servicewhen needed
.hyprland-wallpaper
hyprpaperhyprctl- a valid
~/.config/hypr/hyprpaper.conf - a local wallpaper directory configured in the script through
WALLPAPER_DIR mpvpaperif video wallpapers are used- monitor names and interval may need local adjustment
.nvidia-fan
nvidia-sminvidia-settingssudoxhost- a deployed script at
~/.config/nvidia/nvidiafan.sh sudofornvidia-settingsmust work non-interactively in the session where the service runs- the graphical session must be ready; the service definition uses a short startup delay to avoid login-time race conditions
config_files is the official companion repository of myshell.
Within the framework model:
myshellis the framework and orchestration layerconfig_filesis the managed external source of truth for supported configuration artifacts
This relationship is part of the intended architecture of the framework.
myshell is modular, but that modularity is structured.
In practice, new functionality should fit one of the framework layers:
- core runtime behavior
- profile
- service
- module
- official external companion integration
If a new component does not clearly fit one of those layers, it should not be added until its role is defined.
myshell should be understood as:
- a Bash-first hybrid framework
- a structured user-environment manager
- a modular shell and services system
- a reproducible local environment framework
- a lightweight operational platform built on top of Bash