Personal development environment configuration for Linux/Codespaces and macOS.
- Shell Configuration:
.shell_common: Shared aliases, functions, and environment variables sourced by both shells..bashrc(Linux/Codespaces): Bash-specific history, completions, and prompt..zshrc(macOS): Zsh-specific history, options, and prompt.
- Editor Configuration (
.editorconfig): Enforces consistent coding styles for various file types. - Git Configuration (
.gitattributes_global,.gitconfig,.gitignore_global,.gitmessage,keys/signing.pub): Standardized settings, improved workflows, commit message templates, and SSH commit signing. - Curl Configuration (
.curlrc): Enhancedcurlsettings for security, performance, and usability. - Wget Configuration (
.wgetrc): Enhancedwgetsettings for reliability, security, and convenience. - Login Banner Suppression (
.hushlogin): Hides theLast login: ...banner (and MOTD on PAM-configured Linux/Codespaces) on login shells. - Scripts:
install.sh: A setup script for linking dotfiles and preparing the environment.prune-cspell-words: Remove stale words from acspell.jsonwords list.
This project is released under the MIT License.
Codespaces users: If you've already set this repo as your "dotfiles" in your GitHub Codespaces settings, no further setup is required—your Codespaces environment will automatically apply these configurations.
-
Clone the repository into your Codespaces or local machine:
git clone https://github.com/Jekwwer/dotfiles.git ~/.dotfiles -
Run the
install.shscript:~/.dotfiles/install.sh -
Restart your terminal or apply the changes:
macOS:
source ~/.zshrc
Linux/Codespaces:
source ~/.bashrc
Bash shell config for Linux/Codespaces. Sources .shell_common for shared settings.
- Interactive-only guard, lesspipe integration, and bash-completion setup
- History: 5 000 in memory / 10 000 on disk, dedup, ignores trivial commands, append-only, timestamped, multi-line saved as one entry
- Shell options:
globstar,dirspell,cdspell - Prompt:
user@host dir (branch)$in color
Shared config sourced by both .bashrc and .zshrc. See CHEATSHEET.md for the full alias and function
reference.
- Environment:
EDITOR/VISUAL=vim,PAGER=less,LESS=FRX, UTF-8 locale,~/binand~/.local/binonPATH,DOCKER_CLI_HINTS=false(no "What's next" prompts) - Navigation aliases:
..,...,.... - File aliases:
ll,la,l; saferm/mv/cp(with-i) - Git aliases: 21
g*-prefixed shortcuts covering status/commit/branch/diff/log/push/pull/rebase/stash etc. (see CHEATSHEET for full list) - Functions:
hgrep <text>(history search),reload(re-source config) - OS-specific:
CLICOLOR/LSCOLORS+brewupdate alias on macOS;ls --color=auto+aptupdate alias on Linux git_branchhelper used by both prompts (falls back to(short-sha)when detached)
Zsh shell config for macOS. Sources .shell_common for shared settings.
- Completion:
compinit - History: 5 000 in memory / 10 000 on disk, dedup-all, ignores trivial commands, shared across terminals, timestamped,
!expansion verified, blanks normalized - Shell options:
GLOB_STAR_SHORT,CORRECT - Prompt:
user@host dir (branch)$in color usingPROMPT_SUBST
Empty marker file that suppresses the Last login: ... banner on login shells. Existence is the flag — contents are
ignored.
- macOS Terminal/iTerm: hides the last-login line shown when opening a new login shell
- Linux/Codespaces SSH (PAM): hides last-login + MOTD via
pam_lastlog/pam_motd - No effect on non-login interactive shells (most local terminal emulators)
- Progress bar, follows redirects (capped at 10), retries 3× on transient errors (5xx/408/429/network — not 4xx)
- Timeouts: 15 s connect, 120 s max (override with
--max-time 0for large downloads) - TLS 1.2 floor (portable across all curl backends); schemeless URLs default to https
--compressed: requests gzip/deflate, transparently decompresses--fail-with-body: exits non-zero on 4xx/5xx but still prints the response
- Retries up to 3×; timeouts: 15 s connect, 20 s read, 10 s DNS
- Resumes partial downloads (
continue = on) - Uses system CA certificates (
/etc/ssl/certs)
Fallback coding-style rules when a project has no .editorconfig of its own.
- Defaults: UTF-8, LF endings, 2-space indent, trim trailing whitespace, final newline, 88-char line limit
- Lockfiles (
*.lock,package-lock.json): preserve trailing whitespace - Makefile: tab indent (4-size)
- CSS/HTML/SVG: 120-char line limit
- Markdown: 120-char limit, preserve trailing whitespace (for line breaks)
- Python: 4-space indent
- RST: 120-char line limit
- Shell scripts: 4-space indent
- Text/log files: preserve trailing whitespace
Applied globally via core.attributesfile. Per-repo .gitattributes still wins for matching patterns.
- Auto-detects text + normalizes line endings; forces LF on common languages, configs, docs, shell, build files
- Marks images, audio/video, fonts, archives, executables, packages, and databases as binary
- SVG kept as text with markup-aware diff (
diff=html) - Suppresses diffs for noisy files (
*.log,*.lock,package-lock.json) - Linguist hints: lockfiles +
dist/build/coverage/marked generated;vendor/marked vendored - Excludes temp files, editor dirs, and
node_modules/fromgit archive
See CHEATSHEET.md for the full alias reference.
- User: Evgenii Shiliaev;
~/.gitmessagetemplate; verbose commit editor - Signing: SSH-signed commits (
gpg.format = ssh,user.signingkey = ~/.ssh/id_ed25519_signing.pub); local verification via~/.config/git/allowed_signers - Core:
code --waiteditor, histogram diff,less -RFXpager, fsmonitor, untracked cache - Globals: sources
~/.gitignore_global(excludesfile) and~/.gitattributes_global(attributesfile) - Credentials: macOS Keychain with
cachefallback (1-hour timeout) - Diff polish: moved-code with reindent, mnemonic prefixes, copy detection
- Workflow: rebase on pull,
autoSetupRemote,pushf,rerere,autoStash,autoSquashof fixup commits, tags follow commits on push - Log: abbreviated hashes, ISO dates, short decorations, custom pretty format
- Branches sorted by most recent commit; tags sorted by version, pruned with refs on fetch
Applied globally via core.excludesfile. Per-repo .gitignore adds repo-specific patterns on top.
Aggregated from upstream Node, Python, and Visual Studio gitignore templates:
- Node.js: package managers (npm, pnpm, yarn), modern frameworks (Next/Nuxt/Sveltekit/Vite/Vuepress/etc.), build/cache dirs
- Python: byte-compiled, virtualenvs, packaging, test caches, Jupyter, pyenv/poetry/pdm
- Visual Studio / .NET: build dirs, IDE caches, NuGet, Azure, profilers
Conventional Commits template. Commit types that trigger a release:
| Type | Release |
|---|---|
feat |
minor |
fix, security, deps, perf, build |
patch |
Append ! for breaking changes (feat!:); add BREAKING CHANGE: <description> as the last footer — nothing after
it, or the trailing content becomes part of the changelog note.
Symlinks all dotfiles into $HOME. Detects OS to link .zshrc (macOS) or .bashrc (Linux/Codespaces).
- Self-locating: works wherever the repo is cloned
- Always symlinks:
.shell_common,.curlrc,.editorconfig,.gitattributes_global,.gitconfig,.gitignore_global,.gitmessage,.hushlogin,.wgetrc - OS-aware:
.zshrcon macOS,.bashrcon Linux/Codespaces - Creates
~/bin/and symlinksscripts/prune-cspell-wordsinto it - SSH signing: symlinks
keys/signing.pub→~/.ssh/id_ed25519_signing.puband writes~/.config/git/allowed_signersfromuser.email+ pubkey; warns ifkeys/signing.pubis missing
SSH ed25519 public key used for commit signing. Private key lives on the host and is forwarded into devcontainers via ssh-agent.
- Wired up by
install.sh: symlinked to~/.ssh/id_ed25519_signing.pub;~/.config/git/allowed_signerswritten fromuser.email+ this pubkey - Generate a fresh key (host-side):
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_signing -N '' - Replace
keys/signing.pubwith the new pubkey contents and commit - Upload to GitHub for verified-badge:
gh ssh-key add ~/.ssh/id_ed25519_signing.pub --type signing
Remove stale words from a cspell config words list. Symlinked into ~/bin/ by install.sh.
prune-cspell-words [-c PATH] [-n] [-v]
-c / --config PATH: path to cspell config (default: auto-detect standard JSON config in cwd —.cspell.json,cspell.json,.cSpell.json,cSpell.json, orcspell.config.json)-n / --dry-run: preview removals without modifying the file-v / --verbose: print each word as it is checked
For questions, reach out via evgenii.shiliaev@jekwwer.com.