initial commit

This commit is contained in:
2026-03-26 22:12:36 +02:00
commit c17a30fbd4
18 changed files with 696 additions and 0 deletions

65
CHECKLIST.md Normal file
View File

@@ -0,0 +1,65 @@
# Dotfiles Checklist — Linux Mint 22.3
Planned structure (inspired by jonhoo, adapted for Cinnamon/apt):
```
configs/
├── CHECKLIST.md ← this file
├── shell/
│ ├── .bashrc ← interactive shell: prompt, aliases, history, completions
│ ├── .bash_profile ← login shell: sources .bashrc, sets PATH
│ └── .bash_aliases ← extracted aliases (sourced from .bashrc)
├── tmux/
│ └── .tmux.conf ← prefix, keybinds, catppuccin theme, tpm plugins
├── alacritty/
│ └── .config/alacritty/alacritty.toml ← font, colors, keybinds, window
├── git/
│ └── .gitconfig ← user, aliases, diff algorithm, merge tool
└── install/
├── bootstrap.sh ← run first: installs stow + calls all install scripts
├── apt-packages.sh ← base system packages via apt
├── rust.sh ← rustup + cargo tools (alacritty, bat, fd, ripgrep, etc.)
├── docker.sh ← docker engine + lazydocker
├── node.sh ← nvm + node LTS + pnpm
└── tools.sh ← misc: stow, fzf, starship, zoxide, etc.
```
---
## Status
### Shell (`configs/shell/`)
- [ ] `.bashrc` — merge current custom bits (PS1, pnpm, nvm, java, jbang, deno paths) into a clean, commented version
- [ ] `.bash_profile` — source `.bashrc` for login shells, set XDG env vars
- [ ] `.bash_aliases` — ls, git, docker, cargo shortcuts
### Tmux (`configs/tmux/`)
- [ ] `.tmux.conf` — set prefix (Ctrl+S like jonhoo, or Ctrl+A), vi keys, catppuccin theme, tpm bootstrap, pane navigation
- tpm already in `~/.tmux/plugins/tpm`
- catppuccin already in `~/.tmux/plugins/catppuccin`
### Alacritty (`configs/alacritty/`)
- [ ] `alacritty.toml` — codify current setup (FiraMono Nerd Font Mono 15pt, maximized, no decorations, Alt+C/V)
- [ ] add catppuccin color scheme import
### Git (`configs/git/`)
- [ ] `.gitconfig` — user info, useful aliases (lg, s, f), patience diff, merge tool
### Install Scripts (`configs/install/`)
- [ ] `bootstrap.sh` — entry point: sudo apt update, calls sub-scripts, runs stow
- [ ] `apt-packages.sh` — git, curl, wget, build-essential, tmux, fzf, ripgrep, fd-find, bat, stow, jq, unzip
- [ ] `rust.sh` — check/install rustup, `rustup toolchain install stable`, cargo tools: `alacritty bat fd-find ripgrep cargo-watch`
- [ ] `docker.sh` — check/install docker engine via apt, add user to docker group, install lazydocker
- [ ] `node.sh` — check/install nvm, install node LTS, install pnpm
- [ ] `tools.sh` — starship prompt, zoxide (cd replacement), fzf shell integration
---
## Tools already installed on this machine (skip install steps)
- tmux, alacritty, rustup, docker, lazydocker, git, curl
- nvm + node, pnpm, deno, jbang, Java (corretto-23)
## Notes
- Use `stow -Sv <dir>` to symlink a config group into `~`
- jonhoo reference configs are in `../jonhoo/` — check there for inspiration
- Keep catppuccin as the color theme (already in tmux, alacritty has FiraMono Nerd Font)

View File

@@ -0,0 +1,80 @@
# ─── window ───────────────────────────────────────────────────────────────────
[window]
startup_mode = "Maximized"
decorations = "None"
padding = { x = 8, y = 8 }
# ─── font ─────────────────────────────────────────────────────────────────────
[font]
size = 15.0
[font.normal]
family = "FiraMono Nerd Font Mono"
style = "Regular"
[font.bold]
family = "FiraMono Nerd Font Mono"
style = "Bold"
[font.italic]
family = "FiraMono Nerd Font Mono"
style = "Italic"
# ─── scrolling ────────────────────────────────────────────────────────────────
[scrolling]
history = 10000
multiplier = 3
# ─── selection ────────────────────────────────────────────────────────────────
[selection]
save_to_clipboard = false
# ─── cursor ───────────────────────────────────────────────────────────────────
[cursor]
style = { shape = "Block", blinking = "On" }
blink_interval = 500
# ─── colors: catppuccin mocha ─────────────────────────────────────────────────
[colors.primary]
background = "#1e1e2e"
foreground = "#cdd6f4"
[colors.cursor]
text = "#1e1e2e"
cursor = "#f5e0dc"
[colors.normal]
black = "#45475a"
red = "#f38ba8"
green = "#a6e3a1"
yellow = "#f9e2af"
blue = "#89b4fa"
magenta = "#f5c2e7"
cyan = "#94e2d5"
white = "#bac2de"
[colors.bright]
black = "#585b70"
red = "#f38ba8"
green = "#a6e3a1"
yellow = "#f9e2af"
blue = "#89b4fa"
magenta = "#f5c2e7"
cyan = "#94e2d5"
white = "#a6adc8"
# ─── keybindings ──────────────────────────────────────────────────────────────
[[keyboard.bindings]]
key = "V"
mods = "Alt"
action = "Paste"
[[keyboard.bindings]]
key = "C"
mods = "Alt"
action = "Copy"
[[keyboard.bindings]]
key = "Return"
mods = "Alt|Shift"
action = "ToggleFullscreen"

32
git/.gitconfig Normal file
View File

@@ -0,0 +1,32 @@
[user]
name = stefiosif
email = si.iosifidis@gmail.com
[core]
editor = code --wait
autocrlf = input
excludesfile = ~/.gitignore_global
[init]
defaultBranch = main
[push]
default = current
autoSetupRemote = true
[pull]
rebase = true
[merge]
tool = code
conflictstyle = diff3
[diff]
algorithm = patience
colorMoved = default
[color]
ui = auto
[credential]
helper = store

22
git/.gitignore_global Normal file
View File

@@ -0,0 +1,22 @@
# ─── OS ─── #
.DS_Store
Thumbs.db
desktop.ini
# ─── editors ─── #
.vscode/
.idea/
*.swp
*.swo
*~
# ─── rust ─── #
target/
# ─── node ─── #
node_modules/
# ─── env / secrets ─── #
.env
.env.local
.env.*.local

44
install/apt-packages.sh Executable file
View File

@@ -0,0 +1,44 @@
#!/usr/bin/env bash
set -euo pipefail
echo "==> Installing base apt packages..."
sudo apt update
PACKAGES=(
# essentials
build-essential
curl
wget
git
unzip
zip
stow
# terminal
tmux
# search / file tools
ripgrep
fd-find
tree
# network
openssh-client
rsync
# libs often needed for compiling things
pkg-config
libssl-dev
libfontconfig1-dev
)
sudo apt install -y "${PACKAGES[@]}"
if ! command -v fd &>/dev/null && command -v fdfind &>/dev/null; then
mkdir -p "$HOME/.local/bin"
ln -sf "$(which fdfind)" "$HOME/.local/bin/fd"
echo " linked fdfind -> fd"
fi
echo "==> apt packages done."

49
install/bootstrap.sh Executable file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
# bootstrap.sh — run this on a fresh Linux Mint install
set -euo pipefail
DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
CONFIGS_DIR="$DOTFILES_DIR/configs"
echo "==> Dotfiles bootstrap"
echo " dotfiles: $DOTFILES_DIR"
echo ""
# ─── install packages and tools ───────────────────────────────────────────────
bash "$CONFIGS_DIR/install/apt-packages.sh"
bash "$CONFIGS_DIR/install/rust.sh"
bash "$CONFIGS_DIR/install/docker.sh"
bash "$CONFIGS_DIR/install/node.sh"
bash "$CONFIGS_DIR/install/tools.sh"
bash "$CONFIGS_DIR/install/fonts.sh"
# ─── symlink configs with stow ────────────────────────────────────────────────
echo ""
echo "==> Symlinking configs with stow..."
cd "$CONFIGS_DIR"
for group in shell tmux alacritty git vscode; do
echo " stow $group -> ~"
stow -v --target="$HOME" "$group"
done
# ─── tmux plugins ─────────────────────────────────────────────────────────────
echo ""
echo "==> Installing tmux plugins (tpm)..."
if [ ! -d "$HOME/.tmux/plugins/tpm" ]; then
git clone https://github.com/tmux-plugins/tpm "$HOME/.tmux/plugins/tpm"
fi
# install plugins headlessly
"$HOME/.tmux/plugins/tpm/bin/install_plugins" || true
echo ""
echo "==> Installing VSCode extensions..."
if command -v code &>/dev/null; then
grep -v '^#' "$CONFIGS_DIR/vscode/extensions.txt" | grep -v '^$' | xargs -L1 code --install-extension
else
echo " code not found, skipping extensions"
fi
echo ""
echo "==> Done! Open a new terminal or run: source ~/.bashrc"

20
install/docker.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -euo pipefail
echo "==> Setting up Docker..."
if command -v docker &>/dev/null; then
echo " docker already installed: $(docker --version)"
else
echo " installing docker engine..."
# official docker install script (works on Ubuntu/Mint)
curl -fsSL https://get.docker.com | sudo sh
fi
# add current user to docker group so we don't need sudo
if ! groups | grep -q docker; then
sudo usermod -aG docker "$USER"
echo " added $USER to docker group — log out and back in to apply"
fi
echo "==> Docker done."

27
install/fonts.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
echo "==> Installing fonts..."
FONTS_DIR="$HOME/.local/share/fonts"
mkdir -p "$FONTS_DIR"
# FiraCode Nerd Font (includes FiraMono Nerd Font Mono)
FIRA_VERSION="3.3.0"
FIRA_ZIP="FiraCode.zip"
FIRA_URL="https://github.com/ryanoasis/nerd-fonts/releases/download/v${FIRA_VERSION}/${FIRA_ZIP}"
if fc-list | grep -qi "FiraCode Nerd Font"; then
echo " FiraCode Nerd Font already installed, skipping"
else
echo " downloading FiraCode Nerd Font v${FIRA_VERSION}..."
TMP_DIR=$(mktemp -d)
curl -fsSL "$FIRA_URL" -o "$TMP_DIR/$FIRA_ZIP"
unzip -q "$TMP_DIR/$FIRA_ZIP" -d "$TMP_DIR/fira"
cp "$TMP_DIR"/fira/*.ttf "$FONTS_DIR/"
rm -rf "$TMP_DIR"
fc-cache -f "$FONTS_DIR"
echo " FiraCode Nerd Font installed"
fi
echo "==> Fonts done."

29
install/node.sh Executable file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
echo "==> Setting up Node.js..."
export NVM_DIR="$HOME/.nvm"
if [ -d "$NVM_DIR" ]; then
echo " nvm already installed, loading..."
. "$NVM_DIR/nvm.sh"
else
echo " installing nvm..."
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
. "$NVM_DIR/nvm.sh"
fi
echo " installing node LTS..."
nvm install --lts
nvm use --lts
nvm alias default node
echo "==> Installing pnpm..."
if command -v pnpm &>/dev/null; then
echo " pnpm already installed: $(pnpm --version)"
else
npm install -g pnpm
fi
echo "==> Node done."

38
install/rust.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/usr/bin/env bash
set -euo pipefail
echo "==> Setting up Rust..."
if command -v rustup &>/dev/null; then
echo " rustup already installed, updating..."
rustup update stable
else
echo " installing rustup..."
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
source "$HOME/.cargo/env"
fi
rustup toolchain install stable
rustup component add clippy rustfmt rust-analyzer
echo "==> Installing cargo tools..."
CARGO_TOOLS=(
cargo-watch # watch for changes and re-run
cargo-expand # expand macros
cargo-nextest # faster test runner
cargo-flamegraph # CPU profiling / flamegraphs
cargo-deny # lint deps (licenses, duplicates, advisories)
cargo-mutants # mutation testing
cargo-audit # check deps for known vulnerabilities
)
for tool in "${CARGO_TOOLS[@]}"; do
if cargo install --list | grep -q "^${tool} "; then
echo " $tool already installed, skipping"
else
cargo install "$tool"
fi
done
echo "==> Rust done."

11
install/tools.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -euo pipefail
echo "==> Installing extra tools..."
# ─── stow ─────────────────────────────────────────────────────────────────────
if ! command -v stow &>/dev/null; then
sudo apt install -y stow
fi
echo "==> Extra tools done."

22
shell/.bash_aliases Normal file
View File

@@ -0,0 +1,22 @@
# ─── navigation ───────────────────────────────────────────────────────────────
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
# ─── ls ───────────────────────────────────────────────────────────────────────
alias ls='ls --color=auto'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# ─── grep ─────────────────────────────────────────────────────────────────────
alias grep='grep --color=auto'
# ─── system ───────────────────────────────────────────────────────────────────
alias update='sudo apt update && sudo apt upgrade -y'
alias install='sudo apt install'
alias search='apt search'
# ─── misc ─────────────────────────────────────────────────────────────────────
alias reload='source ~/.bashrc'
alias path='echo $PATH | tr ":" "\n"'

13
shell/.bash_profile Normal file
View File

@@ -0,0 +1,13 @@
# ~/.bash_profile — login shell
# source .bashrc for interactive login shells
[ -n "$BASH_VERSION" ] && [ -f "$HOME/.bashrc" ] && . "$HOME/.bashrc"
# ─── XDG ──────────────────────────────────────────────────────────────────────
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_CACHE_HOME="$HOME/.cache"
# ─── default apps ─────────────────────────────────────────────────────────────
export EDITOR="code --wait" # change to nvim if you switch editors
export VISUAL="$EDITOR"
export BROWSER="google-chrome"

73
shell/.bashrc Normal file
View File

@@ -0,0 +1,73 @@
# ~/.bashrc — interactive shell config
# not interactive? bail out
case $- in *i*) ;; *) return ;; esac
# ─── system defaults ──────────────────────────────────────────────────────────
[ -f /etc/bash.bashrc ] && source /etc/bash.bashrc
# ─── history ──────────────────────────────────────────────────────────────────
HISTCONTROL=ignoreboth
HISTSIZE=10000
HISTFILESIZE=20000
HISTIGNORE="clear:bg:fg:cd:cd -:cd ..:exit:date:ls:l:ll:* --help"
shopt -s histappend
shopt -s checkwinsize
# ─── prompt ───────────────────────────────────────────────────────────────────
# green user, blue path — simple and readable
PS1='\[\e[1;32m\]\u\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ '
# ─── colors ───────────────────────────────────────────────────────────────────
if [ -x /usr/bin/dircolors ]; then
eval "$(dircolors -b ~/.dircolors 2>/dev/null || dircolors -b)"
fi
# ─── aliases ──────────────────────────────────────────────────────────────────
[ -f ~/.bash_aliases ] && source ~/.bash_aliases
# ─── completions ──────────────────────────────────────────────────────────────
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# ─── fzf ──────────────────────────────────────────────────────────────────────
[ -f ~/.fzf.bash ] && source ~/.fzf.bash
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border"
# ─── less ─────────────────────────────────────────────────────────────────────
export LESS="-R --use-color"
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# ─── rust / cargo ─────────────────────────────────────────────────────────────
[ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env"
# ─── node / nvm ───────────────────────────────────────────────────────────────
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
# ─── pnpm ─────────────────────────────────────────────────────────────────────
export PNPM_HOME="$HOME/.local/share/pnpm"
case ":$PATH:" in
*":$PNPM_HOME:"*) ;;
*) export PATH="$PNPM_HOME:$PATH" ;;
esac
# ─── deno ─────────────────────────────────────────────────────────────────────
[ -f "$HOME/.deno/env" ] && . "$HOME/.deno/env"
# ─── java ─────────────────────────────────────────────────────────────────────
export JAVA_HOME="$HOME/.jdks/corretto-23.0.2"
export PATH="$JAVA_HOME/bin:$PATH"
# ─── jbang ────────────────────────────────────────────────────────────────────
export PATH="$HOME/.jbang/bin:$PATH"
alias j!=jbang
# ─── local bin ────────────────────────────────────────────────────────────────
[ -d "$HOME/.local/bin" ] && export PATH="$HOME/.local/bin:$PATH"
[ -d "$HOME/bin" ] && export PATH="$HOME/bin:$PATH"

19
tmux/.tmux.conf Normal file
View File

@@ -0,0 +1,19 @@
# ─── plugins ──────────────────────────────────────────────────────────────────
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# ─── mouse ────────────────────────────────────────────────────────────────────
set -g mouse on
# ─── navigation ───────────────────────────────────────────────────────────────
bind -n C-n next-window
bind -n C-p previous-window
# ─── catppuccin ───────────────────────────────────────────────────────────────
set -g @plugin 'catppuccin/tmux'
set -g @catppuccin_flavour 'mocha'
set -g @catppuccin_window_text " #W"
set -g @catppuccin_window_current_text " #W"
# ─── initialize tpm (keep at bottom) ──────────────────────────────────────────
run '~/.tmux/plugins/tpm/tpm'

View File

@@ -0,0 +1,37 @@
// VSCode keybindings
[
// navigate back/forward with Alt+Left/Right (like browser)
{
"key": "alt+left",
"command": "workbench.action.navigateBack",
"when": "canNavigateBack"
},
{
"key": "ctrl+alt+-",
"command": "-workbench.action.navigateBack",
"when": "canNavigateBack"
},
{
"key": "alt+right",
"command": "workbench.action.navigateForward",
"when": "canNavigateForward"
},
{
"key": "ctrl+shift+-",
"command": "-workbench.action.navigateForward",
"when": "canNavigateForward"
},
// shift+enter in terminal sends a line continuation
{
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\\\r\n" },
"when": "terminalFocus"
},
// disable default inlay hint escape binding
{
"key": "escape",
"command": "-inlayHints.stopReadingLineWithHint",
"when": "isReadingLineWithInlayHints"
}
]

View File

@@ -0,0 +1,58 @@
{
"workbench.colorTheme": "ZED One Theme Dark",
"workbench.startupEditor": "none",
"workbench.editor.splitInGroupLayout": "vertical",
"workbench.editor.wrapTabs": true,
// editor
"editor.fontFamily": "'IBM Plex Mono', 'FiraCode', 'DejaVu Sans Mono', monospace",
"editor.fontWeight": "500",
"editor.fontSize": 17,
"editor.minimap.enabled": false,
"editor.inlayHints.enabled": "on",
// terminal
"terminal.integrated.fontSize": 15.5,
"debug.console.fontSize": 15.5,
// git
"git.enableSmartCommit": true,
"git.autofetch": true,
"git.confirmSync": false,
"git.openRepositoryInParentFolders": "always",
// rust
"rust-analyzer.checkOnSave": true,
// svelte
"svelte.enable-ts-plugin": true,
// claude code
"claudeCode.preferredLocation": "panel",
"claudeCode.useTerminal": true,
// misc
"extensions.ignoreRecommendations": true,
"explorer.confirmDelete": false,
"explorer.confirmDragAndDrop": false,
"diffEditor.ignoreTrimWhitespace": false,
"security.workspace.trust.untrustedFiles": "open",
"lldb.suppressUpdateNotifications": true,
"dotenv.enableAutocloaking": false,
"liveServer.settings.donotShowInfoMsg": true,
"liveServer.settings.donotVerifyTags": true,
"files.associations": {
".env*": "dotenv"
},
"errorLens.enabledDiagnosticLevels": ["error", "warning", "info", "hint"],
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.tokenColorCustomizations": {
"textMateRules": []
}
}

57
vscode/extensions.txt Normal file
View File

@@ -0,0 +1,57 @@
# VSCode extensions
# Install all with: cat extensions.txt | xargs -L1 code --install-extension
# AI
anthropic.claude-code
github.copilot-chat
# themes
arrrrny.zed-one-theme
drewxs.tokyo-night-dark
enkia.tokyo-night
# rust
rust-lang.rust-analyzer
tauri-apps.tauri-vscode
vadimcn.vscode-lldb
fill-labs.dependi
# web / js / ts
bradlc.vscode-tailwindcss
dbaeumer.vscode-eslint
esbenp.prettier-vscode
svelte.svelte-vscode
vue.volar
yoavbls.pretty-ts-errors
ritwickdey.liveserver
# c / c++
llvm-vs-code-extensions.vscode-clangd
ms-vscode.cpptools
ms-vscode.cpptools-extension-pack
ms-vscode.cpp-devtools
# python
ms-python.python
ms-python.debugpy
ms-python.vscode-pylance
ms-python.vscode-python-envs
# devops / infra
github.vscode-github-actions
ms-vscode-remote.remote-ssh
ms-vscode-remote.remote-ssh-edit
ms-vscode.remote-explorer
# data / config
dotenv.dotenv-vscode
redhat.vscode-yaml
tamasfe.even-better-toml
nefrob.vscode-just-syntax
# misc
humao.rest-client
usernamehw.errorlens
wayou.vscode-todo-highlight
yzhang.markdown-all-in-one
sidthesloth.html5-boilerplate