https://github.com/e-lemongrab/myshell
Framework for bash
https://github.com/e-lemongrab/myshell
bash bash-alias bash-completion bash-profile bash-prompt bitwarden cloud docker shell terminal
Last synced: 6 days ago
JSON representation
Framework for bash
- Host: GitHub
- URL: https://github.com/e-lemongrab/myshell
- Owner: e-lemongrab
- License: mit
- Created: 2025-03-19T19:58:00.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-03-20T19:02:02.000Z (about 1 year ago)
- Last Synced: 2025-03-20T20:37:38.214Z (about 1 year ago)
- Topics: bash, bash-alias, bash-completion, bash-profile, bash-prompt, bitwarden, cloud, docker, shell, terminal
- Language: Shell
- Homepage:
- Size: 4.58 MB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Codeowners: CODEOWNERS
Awesome Lists containing this project
README
# myshell
`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.
## Scope
`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
## Core model
`myshell` is organized around the following layers:
### Core
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
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
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
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.
### Optional components
PowerShell support exists as an optional layer. It is supported, but it is not part of the primary identity of the framework.
### Official external companion repositories
`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`.
## Managed vs unmanaged behavior
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
## Stability model
`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 `myshell` ecosystem
## Activation model
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.
## Why Bash-first matters
`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
## Repository structure
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
## Installation
### Bash
1. Back up your current `$HOME/.bash_profile` if needed.
2. Clone the repository.
3. Copy the framework entrypoint to your home.
4. Set `project_path`.
5. Reload the shell session.
```bash
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 `checks` to list compatibility information
- run `myshell` to view available commands
### PowerShell
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:
1. Install a WSL2 distribution.
2. Edit `$PROFILE` with the content from `core/shells/pwsh/Microsoft.PowerShell_profile.ps1`.
3. Set the required values in the `VARIABLE DECLARATION` section.
## Profiles and services
`myshell` loads optional Bash components from `core/shells/bash/profiles/` and `core/shells/bash/services/` through explicit blocks in `core/shells/bash/.bashrc`.
### Profiles currently loaded by default blocks in `.bashrc`
Examples include:
- `.git-configs`
- `.appearance`
- `.completion`
- `.history`
- `.path`
- `.pwsh`
- `.software`
- `.config_files`
- `.ssh`
### Services currently supported
Examples include:
- `.hyprland-wallpaper`
- `.nvidia-fan`
These are framework-managed service integrations and are activated through `.bashrc` loader blocks.
### Current service behavior
`.hyprland-wallpaper`
- downloads `hypr-wallpaper.service` from `config_files`
- downloads `wallpaper-rotation.sh` from `config_files`
- installs them into local user paths
- runs `systemctl --user daemon-reload`
- runs `systemctl --user enable --now hypr-wallpaper.service` when needed
`.nvidia-fan`
- downloads `nvidia-fan.service` from `config_files`
- downloads `nvidiafan.sh` from `config_files`
- installs them into local user paths
- runs `systemctl --user daemon-reload`
- runs `systemctl --user enable --now nvidia-fan.service` when needed
### Service prerequisites
`.hyprland-wallpaper`
- `hyprpaper`
- `hyprctl`
- a valid `~/.config/hypr/hyprpaper.conf`
- a local wallpaper directory configured in the script through `WALLPAPER_DIR`
- `mpvpaper` if video wallpapers are used
- monitor names and interval may need local adjustment
`.nvidia-fan`
- `nvidia-smi`
- `nvidia-settings`
- `sudo`
- `xhost`
- a deployed script at `~/.config/nvidia/nvidiafan.sh`
- `sudo` for `nvidia-settings` must 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
## Companion repository: `config_files`
`config_files` is the official companion repository of `myshell`.
Within the framework model:
- `myshell` is the framework and orchestration layer
- `config_files` is the managed external source of truth for supported configuration artifacts
This relationship is part of the intended architecture of the framework.
## Extension model
`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.
## Summary
`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