Initial commit

This commit is contained in:
2025-11-25 08:37:43 +01:00
commit bd28479f8f
17 changed files with 1224 additions and 0 deletions

34
.editorconfig Executable file
View File

@@ -0,0 +1,34 @@
# EditorConfig is awesome: https://editorconfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_size = 2
# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8
# 4 space indentation
[*.py]
indent_style = space
indent_size = 4
# Tab indentation (no size specified)
[Makefile]
indent_style = tab
# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2
# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

16
.gitconfig Executable file
View File

@@ -0,0 +1,16 @@
[user]
name = Sebastian Krüger
email = valknar@pivoine.art
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[core]
editor = nano
[init]
defaultBranch = main
[alias]
squash-all = "!f(){ git reset $(git commit-tree \"HEAD^{tree}\" \"$@\");};f"
[push]
autoSetupRemote = true

30
.gitignore vendored Executable file
View File

@@ -0,0 +1,30 @@
# Ignore everything
*
# But not these files.
!CLAUDE.md
!.gitignore
!.gitconfig
!.gitmodules
!README.md
!.editorconfig
!.nvmrc
!.ruby-version
!.python-version
!.p10k.zsh
!.zprofile
!.zlogout
!.zlogin
!.zshrc
!.zshenv
!.hushlogin
!arty.yml
!signature.txt
# Ignore so we won't commit these in the allowed dirctories.
.DS_Store
*.log*
*.db*
*.vscdb*
*.sqlite*
*.bnk*

0
.hushlogin Normal file
View File

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
v20.19.1

193
.p10k.zsh Normal file
View File

@@ -0,0 +1,193 @@
# Generated by Powerlevel10k configuration wizard on 2025-09-04 at 02:33 CEST.
# Based on romkatv/powerlevel10k/config/p10k-pure.zsh, checksum 07533.
# Wizard options: nerdfont-v3 + powerline, small icons, pure, snazzy, 24h time, 1 line,
# compact, instant_prompt=verbose.
# Type `p10k configure` to generate another config.
#
# Config file for Powerlevel10k with the style of Pure (https://github.com/sindresorhus/pure).
#
# Differences from Pure:
#
# - Git:
# - `@c4d3ec2c` instead of something like `v1.4.0~11` when in detached HEAD state.
# - No automatic `git fetch` (the same as in Pure with `PURE_GIT_PULL=0`).
#
# Apart from the differences listed above, the replication of Pure prompt is exact. This includes
# even the questionable parts. For example, just like in Pure, there is no indication of Git status
# being stale; prompt symbol is the same in command, visual and overwrite vi modes; when prompt
# doesn't fit on one line, it wraps around with no attempt to shorten it.
#
# If you like the general style of Pure but not particularly attached to all its quirks, type
# `p10k configure` and pick "Lean" style. This will give you slick minimalist prompt while taking
# advantage of Powerlevel10k features that aren't present in Pure.
# Temporarily change options.
'builtin' 'local' '-a' 'p10k_config_opts'
[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases')
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
() {
emulate -L zsh -o extended_glob
# Unset all configuration options.
unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR'
# Zsh >= 5.1 is required.
[[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return
# Prompt colors.
local grey='242'
local red='#FF5C57'
local yellow='#F3F99D'
local blue='#57C7FF'
local magenta='#FF6AC1'
local cyan='#9AEDFE'
local white='#F1F1F0'
# Left prompt segments.
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
context # user@host
dir # current directory
vcs # git status
command_execution_time # previous command duration
# virtualenv # python virtual environment
prompt_char # prompt symbol
)
# Right prompt segments.
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
# command_execution_time # previous command duration
# virtualenv # python virtual environment
# context # user@host
time # current time
)
# Basic style options that define the overall prompt look.
typeset -g POWERLEVEL9K_BACKGROUND= # transparent background
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol
typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons
# Add an empty line before each prompt except the first. This doesn't emulate the bug
# in Pure that makes prompt drift down whenever you use the Alt-C binding from fzf or similar.
typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false
# Magenta prompt symbol if the last command succeeded.
typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=$magenta
# Red prompt symbol if the last command failed.
typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=$red
# Default prompt symbol.
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION=''
# Prompt symbol in command vi mode.
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION=''
# Prompt symbol in visual vi mode is the same as in command mode.
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION=''
# Prompt symbol in overwrite vi mode is the same as in command mode.
typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false
# Grey Python Virtual Environment.
typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=$grey
# Don't show Python version.
typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false
typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=
# Blue current directory.
typeset -g POWERLEVEL9K_DIR_FOREGROUND=$blue
# Context format when root: user@host. The first part white, the rest grey.
typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE="%F{$white}%n%f%F{$grey}@%m%f"
# Context format when not root: user@host. The whole thing grey.
typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE="%F{$grey}%n@%m%f"
# Don't show context unless root or in SSH.
typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION=
# Show previous command duration only if it's >= 5s.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=5
# Don't show fractional seconds. Thus, 7s rather than 7.3s.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
# Duration format: 1d 2h 3m 4s.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s'
# Yellow previous command duration.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$yellow
# Grey Git prompt. This makes stale prompts indistinguishable from up-to-date ones.
typeset -g POWERLEVEL9K_VCS_FOREGROUND=$grey
# Disable async loading indicator to make directories that aren't Git repositories
# indistinguishable from large Git repositories without known state.
typeset -g POWERLEVEL9K_VCS_LOADING_TEXT=
# Don't wait for Git status even for a millisecond, so that prompt always updates
# asynchronously when Git state changes.
typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0
# Cyan ahead/behind arrows.
typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=$cyan
# Don't show remote branch, current tag or stashes.
typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind)
# Don't show the branch icon.
typeset -g POWERLEVEL9K_VCS_BRANCH_ICON=
# When in detached HEAD state, show @commit where branch normally goes.
typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@'
# Don't show staged, unstaged, untracked indicators.
typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON=
# Show '*' when there are staged, unstaged or untracked files.
typeset -g POWERLEVEL9K_VCS_DIRTY_ICON='*'
# Show '⇣' if local branch is behind remote.
typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON=':⇣'
# Show '⇡' if local branch is ahead of remote.
typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON=':⇡'
# Don't show the number of commits next to the ahead/behind arrows.
typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1
# Remove space between '⇣' and '⇡' and all trailing spaces.
typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${${${P9K_CONTENT/⇣* :⇡/⇣⇡}// }//:/ }'
# Grey current time.
typeset -g POWERLEVEL9K_TIME_FOREGROUND=$grey
# Format for the current time: 09:51:02. See `man 3 strftime`.
typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}'
# If set to true, time will update when you hit enter. This way prompts for the past
# commands will contain the start times of their commands rather than the end times of
# their preceding commands.
typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false
# Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt
# when accepting a command line. Supported values:
#
# - off: Don't change prompt when accepting a command line.
# - always: Trim down prompt when accepting a command line.
# - same-dir: Trim down prompt when accepting a command line unless this is the first command
# typed after changing current working directory.
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=off
# Instant prompt mode.
#
# - off: Disable instant prompt. Choose this if you've tried instant prompt and found
# it incompatible with your zsh configuration files.
# - quiet: Enable instant prompt and don't print warnings when detecting console output
# during zsh initialization. Choose this if you've read and understood
# https://github.com/romkatv/powerlevel10k#instant-prompt.
# - verbose: Enable instant prompt and print a warning when detecting console output during
# zsh initialization. Choose this if you've never tried instant prompt, haven't
# seen the warning, or if you are unsure what this all means.
typeset -g POWERLEVEL9K_INSTANT_PROMPT=off
# Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized.
# For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload
# can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you
# really need it.
typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=off
# If p10k is already loaded, reload configuration.
# This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true.
(( ! $+functions[p10k] )) || p10k reload
}
# Tell `p10k configure` which file it should overwrite.
typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a}
(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}
'builtin' 'unset' 'p10k_config_opts'

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.10.17

1
.ruby-version Normal file
View File

@@ -0,0 +1 @@
3.4.1

14
.zlogin Executable file
View File

@@ -0,0 +1,14 @@
HIDRIVE=/mnt/hidrive
HIDRIVE_VALKNAR="$HIDRIVE/users/valknar"
mount "$HIDRIVE" 2>/dev/null
ln -s "$HIDRIVE_VALKNAR/Documents" "$HOME/Documents" 2>/dev/null
ln -s "$HIDRIVE_VALKNAR/Pictures" "$HOME/Pictures" 2>/dev/null
ln -s "$HIDRIVE_VALKNAR/Videos" "$HOME/Videos" 2>/dev/null
ln -s "$HIDRIVE_VALKNAR/Music" "$HOME/Music" 2>/dev/null
xdg-user-dirs-update --set DOCUMENTS "$HOME/Documents"
xdg-user-dirs-update --set PICTURES "$HOME/Pictures"
xdg-user-dirs-update --set VIDEOS "$HOME/Videos"
xdg-user-dirs-update --set MUSIC "$HOME/Music"

0
.zlogout Executable file
View File

0
.zprofile Executable file
View File

0
.zshenv Normal file
View File

189
.zshrc Normal file
View File

@@ -0,0 +1,189 @@
if [ -d "$HOME/bin" ]; then
export PATH="$HOME/bin:$PATH"
fi
if [ -d "$HOME/.local/bin" ]; then
export PATH="$HOME/.local/bin:$PATH"
fi
if [ -d "$HOME/.rbenv/bin" ]; then
export PATH="$PATH:$HOME/.rbenv/bin"
fi
if [ -d "$HOME/.pyenv/bin" ]; then
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
fi
if [ -d "$HOME/.cargo/bin" ]; then
export PATH="$PATH:$HOME/.cargo/bin"
fi
if [ -d "/usr/local/go/bin" ]; then
export PATH="$PATH:/usr/local/go/bin"
fi
if [ -d "$HOME/go/bin" ]; then
export PATH="$PATH:$HOME/go/bin"
fi
if [ -d "$HOME/node_modules/.bin" ]; then
export PATH="$PATH:$HOME/node_modules/.bin"
fi
# Source .env file early to export environment variables
if [ -f "$HOME/.env" ] ; then
set -a
source "$HOME/.env"
set +a
fi
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
if [ -s "$NVM_DIR/nvm.sh" ] ; then
. "$NVM_DIR/nvm.sh"
fi
if [ -s "$NVM_DIR/bash_completion" ] ; then
. "$NVM_DIR/bash_completion"
fi
if [ -s "$HOME/.rvm/scripts/rvm" ] ; then
. "$HOME/.rvm/scripts/rvm"
fi
if [ -s "$HOME/.cargo/env" ] ; then
. "$HOME/.cargo/env"
fi
if command -v oh-my-posh 2>&1 >/dev/null; then
eval "$(! oh-my-posh init zsh --config=~/worker.omp.json)"
fi
if command -v rbenv 2>&1 >/dev/null; then
eval "$(rbenv init - --no-rehash zsh)"
fi
if command -v pyenv 2>&1 >/dev/null; then
eval "$(pyenv init --path)"
fi
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH
# Path to your Oh My Zsh installation.
export ZSH="$HOME/.oh-my-zsh"
# Set name of the theme to load --- if set to "random", it will
# load a random theme each time Oh My Zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"
# Set list of themes to pick from when loading at random
# Setting this variable when ZSH_THEME=random will cause zsh to load
# a theme from this variable instead of looking in $ZSH/themes/
# If set to an empty array, this variable will have no effect.
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"
# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"
# Uncomment one of the following lines to change the auto-update behavior
# zstyle ':omz:update' mode disabled # disable automatic updates
# zstyle ':omz:update' mode auto # update automatically without asking
# zstyle ':omz:update' mode reminder # just remind me to update when it's time
# Uncomment the following line to change how often to auto-update (in days).
# zstyle ':omz:update' frequency 13
# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS="true"
# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"
# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"
# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"
# Uncomment the following line to display red dots whilst waiting for completion.
# You can also set it to another string to have that shown instead of the default red dots.
# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f"
# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765)
# COMPLETION_WAITING_DOTS="true"
# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# or set a custom format using the strftime function format specifications,
# see 'man strftime' for details.
# HIST_STAMPS="mm/dd/yyyy"
# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder
# Which plugins would you like to load?
# Standard plugins can be found in $ZSH/plugins/
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git pm2 gh sudo ssh ruby rust python node github rsync nvm rbenv pyenv docker docker-compose qrcode zsh-autosuggestions zsh-syntax-highlighting zsh-interactive-cd zsh-navigation-tools)
[[ ! -f $ZSH/oh-my-zsh.sh ]] || source $ZSH/oh-my-zsh.sh
# User configuration
# export MANPATH="/usr/local/man:$MANPATH"
# You may need to manually set your language environment
# export LANG=en_US.UTF-8
# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
# export EDITOR='vim'
# else
# export EDITOR='nvim'
# fi
# Compilation flags
# export ARCHFLAGS="-arch $(uname -m)"
# Set personal aliases, overriding those provided by Oh My Zsh libs,
# plugins, and themes. Aliases can be placed here, though Oh My Zsh
# users are encouraged to define aliases within a top-level file in
# the $ZSH_CUSTOM folder, with .zsh extension. Examples:
# - $ZSH_CUSTOM/aliases.zsh
# - $ZSH_CUSTOM/macos.zsh
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

214
CLAUDE.md Normal file
View File

@@ -0,0 +1,214 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
This is a personal home directory repository managed as a git repository with selective tracking via `.gitignore`. The repository tracks dotfiles and configuration for a Debian development environment supporting Node.js, Python, Ruby, Rust, and Go development.
## Key Architecture
### Initialization System
Shell initialization is managed through `.init/init.sh`, which sources modular configuration in this order:
1. `.init/path.sh` - PATH environment setup for all language toolchains (Node, Python, Ruby, Rust, Go, Flatpak)
2. `.init/export.sh` - Environment variable exports
3. `.init/alias.sh` - Custom shell aliases (ri, g0-g2, rs, ss, yt)
4. `.init/source.sh` - Source language version managers (nvm, rbenv, pyenv)
5. `.init/functions.sh` - Custom shell functions for deployment and media processing
6. `.init/links.sh` - Symbolic link setup
7. `.init/eval.sh` - Commands requiring eval (rbenv init, pyenv init)
8. `.init/trap.sh` - Shell trap handlers
9. `.init/start.sh` - Startup commands
10. `.init/bin/` - Custom executable scripts
### Arty Configuration
`arty.yml` defines the repository structure using Arty (artifact/repository manager):
- **references**: Git subrepositories to clone into specific paths
- **envs**: Environment profiles (dev/prod) for selective repository management
- Manages both development projects and language version managers (nvm, rbenv, pyenv, gvm)
### Ansible Provisioning
`playbook.yml` is an Ansible playbook for system setup:
- Installs and configures language runtimes (Node, Python, Ruby, Rust, Go)
- Sets up Docker, PostgreSQL 18, and development tools
- Configures Zsh with Oh-My-Zsh and Powerlevel10k theme for user and root
- Manages system packages via apt
Available Ansible tags:
- `base` - Base packages (make, build-essential, git, curl, wget, rsync, imagemagick, ffmpeg, yt-dlp, fzf)
- `node` - Node.js via nvm, corepack, and pnpm packages
- `python` - Python via pyenv, pip packages, and pre-commit setup
- `ruby` - Ruby via rbenv, bundler, and bundle install
- `rust` - Rust via rustup with required system packages
- `zsh` - Zsh shell configuration for user
- `oh-my-posh` - Oh-My-Posh prompt for root
- `postgres` - PostgreSQL 18 from official PGDG repository
- `docker` - Docker Engine with user group membership
- `flatpak` - Flatpak with Flathub repository
- `github` - GitHub CLI (gh)
- `fonts` - Font cache update
### Git Selective Tracking
The `.gitignore` uses an inverted pattern (ignore everything, then selectively allow):
- Tracks only specific dotfiles and configuration files
- Allows `.github/`, `.vscode/` directories
- Excludes logs, databases, and temporary files
- **Note**: The `.init/` directory is NOT tracked in git - it exists locally only
## Development Environment
### Language Version Management
- **Node.js**: Managed by nvm, version specified in `.nvmrc`
- **Ruby**: Managed by rbenv, version in `.ruby-version`
- **Python**: Managed by pyenv, version in `.python-version`
- **Rust**: Via rustup (`.cargo/`, `.rustup/`)
- **Go**: Via gvm (`.gvm/`)
### Shell Environment
- **Shell**: Zsh with Oh-My-Zsh framework
- **Theme**: Powerlevel10k (`.p10k.zsh`)
- **Plugins**: git, pm2, gh, docker, language-specific plugins, zsh-autosuggestions, zsh-syntax-highlighting
- **Login Configuration**: `.zlogin` mounts HiDrive storage and creates symbolic links for Documents, Pictures, Videos, and Music directories from `/mnt/hidrive/users/valknar/` to `$HOME/`
## Common Commands
### Environment Setup
```bash
# Reinitialize shell environment
ri # alias for: source ~/.init/init.sh
# Bootstrap system (run as user, prompts for sudo)
sudo -u $USER ansible-playbook -K playbook.yml
# Run specific Ansible tags
ansible-playbook --tags node,python,ruby -K playbook.yml
```
### Arty Repository Management
```bash
# Debug Arty configuration
pnpm arty debug
# Clone/update repositories based on environment
pnpm arty sync --env dev
```
### Git Workflow
```bash
# Stage all changes and check if clean
g0 # alias for: git add . && git diff --quiet && git diff --cached --quiet
# Reset to single commit
g1 # alias for: git reset $(git commit-tree "HEAD^{tree}" -m "A new start")
# Get last commit message
g2 # alias for: git log --format=%B -n 1 HEAD | head -n 1
```
### Code Quality
```bash
# Python pre-commit hooks (configured in .pre-commit-config.yaml)
pre-commit run --all-files
# Ruby style checking
rubocop
# Node.js linting
pnpm eslint
```
### Utility Functions & Scripts
Shell functions from `.init/functions.sh`:
**Deployment functions** (internal use, deploy to remote server via rsync):
- `_site_deploy_jekyll <site>` - Build Jekyll site and deploy to remote
- `_site_deploy_nuxt <site>` - Build Nuxt site and deploy to remote
- `_site_deploy_static <site>` - Deploy static files to remote
- `_site_run_jekyll <site>` - Run Jekyll dev server with livereload
- `_site_run_nuxt <site>` - Run Nuxt dev server
- `_site_run_static <site>` - Serve static files locally on port 8000
**Media processing functions**:
- `batch_file_sequence <prefix> <extension>` - Rename files with sequence numbers
- `batch_image_webp` - Convert JPG/PNG images to WebP format
- `batch_video_x264` - Convert videos to x264 codec
**Git/home management functions** (internal):
- `_home_push [message]` - Commit and push home repository changes
- `_home_pull` - Pull home repository (stashes/unstashes changes, handles `.last_pwd`)
Shell scripts in `.init/bin/`:
- `artifact_github_download.sh <repo> [-n name] [-o output]` - Download GitHub Actions artifacts
- `mime_mp4_gif.sh [options] <input.mp4> [output.gif]` - Advanced MP4 to animated GIF converter with keyframe extraction and interpolation algorithms
- `doc_bash_generate.sh [options] <executables>` - Auto-generate README.md documentation with animated GIFs:
- Supports glob patterns for multiple executables
- Parses `--help` output to extract usage, options, and examples
- Records asciinema demos and converts to animated GIFs
- Custom demos via `.demo` files (place next to executable)
- Output formats: Markdown with collapsible sections, embedded GIFs, table of contents
- Dependencies: asciinema, agg (for GIF generation, optional with `--no-gif`)
- Example: `doc_bash_generate.sh -t "My Tools" -o docs/README.md *.sh`
**CSS Color Utilities** (pure bash implementations using only `bc`):
- `css_color_palette.sh <color> [options]` - Generate comprehensive color palettes with multiple harmony types:
- Palette types: monochromatic, analogous, complementary, split-complementary, triadic, tetradic
- Complete color scales: 50-950 (11 shades) following yamada-colors format
- Style variations: shades, tints, tones, all
- Light/dark mode support
- Output formats: YAML (default), JSON
- Interactive mode with colored terminal preview
- Example: `css_color_palette.sh "#3498db" -p triadic -o palette.json`
- `css_color_filter.sh <color> [options]` - Generate CSS filter values to transform black elements into any target color:
- Uses SPSA (Simultaneous Perturbation Stochastic Approximation) optimization
- Generates filter combinations: invert, sepia, saturate, hue-rotate, brightness, contrast
- Supports hex colors (#FF5733) or RGB (255,87,51)
- Interactive mode with accuracy metrics
- Clipboard support for quick copying
- Note: Takes 2-5 minutes per color due to optimization algorithm
- Example: `css_color_filter.sh "#FF5733" -c` (copies result to clipboard)
## Projects Structure
Projects are managed by Arty and cloned into `Projects/` or `repos/`:
- **butter-sh/** - Butter shell GitHub pages site
- **docker-compose/** - Docker compose configurations (both dev/prod envs)
- **pivoine.art/** - Jekyll-based art portfolio site
- **sexy.pivoine.art/** - Contains Rust package (`packages/buttplug/`)
- **node.js/** - Node.js applications:
- `awesome/` - Main Node.js app (dev/prod)
- `awesome-app/` - Companion app (dev only)
Personal media directories (dev env only):
- **Bilder/** - Pictures (from home-pictures repo)
- **Videos/** - Videos (from home-videos repo)
- **Musik/** - Music (from home-music repo)
## Package Management
### Node.js
- **Package manager**: pnpm (enabled via corepack)
- **Global packages**: Installed to `~/node_modules/`, available via `~/node_modules/.bin/`
- **PM2**: Configured via `ecosystem.config.js` for GitHub Copilot language server
- **Dependencies**: playwright (dev dependency)
### Python
- **Installer**: pip
- **Dependencies**: Listed in `requirements.txt` (currently: pre-commit)
### Ruby
- **Bundler**: Gemfile specifies Jekyll 4.3 and rubocop
## Important Notes
- **Selective Git Tracking**: This repository uses an inverted `.gitignore` pattern - everything is ignored by default (`*`), then specific files/directories are explicitly allowed (`!CLAUDE.md`, `!.zshrc`, etc.). When adding new tracked files, you must explicitly allow them in `.gitignore`. The `.init/` directory is NOT tracked in git - it exists locally only for shell initialization.
- **Shell Initialization**: Shell must source `.init/init.sh` for full environment setup (automatically done in `.zshrc`). Use `ri` alias to reinitialize without restarting shell.
- **Language Runtimes**: All language versions are managed by version managers (nvm, rbenv, pyenv, gvm) and installed via Ansible playbook. Version files (`.nvmrc`, `.ruby-version`, `.python-version`) specify the versions.
- **Docker**: User must be in `docker` group (managed by Ansible). May require logout/login after Ansible provisioning.
- **Working Directory**: `.last_pwd` tracks the last working directory for shell navigation across sessions.
- **Arty Repository Manager**: `arty.yml` manages git subrepositories. Use `pnpm arty sync --env dev` to clone/update all dev repositories, or `--env prod` for production only.
- Always use arty to utlize docker in this project
- Always run `arty up -d CONTAINER(s)` instead `arty restart CONTAINER(S)`
- Always push with the valknarthing ssh key.
- Please make sure the ssh agent only takes one key to push.

416
README.md Executable file
View File

@@ -0,0 +1,416 @@
<div align="center">
<pre>
_ _____ __ __ __ _ _____ ____ _ _____
| | / / | / / / //_// | / / | / __ ( ) ___/
| | / / /| | / / / ,< / |/ / /| | / /_/ //\__ \
| |/ / ___ |/ /___/ /| |/ /| / ___ |/ _, _/ ___/ /
|___/_/ |_/_____/_/ |_/_/ |_/_/ |_/_/ |_| /____/
__________ ____ ____________
/ ____/ __ \/ __ \/ ____/ ____/
/ /_ / / / / /_/ / / __/ __/
/ __/ / /_/ / _, _/ /_/ / /___
/_/ \____/_/ |_|\____/_____/
</pre>
# ⚡🔥 WHERE CODE MEETS CHAOS 🔥⚡
[![Debian](https://img.shields.io/badge/Debian-Trixie-A81D33?style=for-the-badge&logo=debian&logoColor=white)](https://www.debian.org/)
[![Powered by Metal](https://img.shields.io/badge/POWERED%20BY-METAL-FF0000?style=for-the-badge)](https://www.slayer.net/)
[![Built with Blood](https://img.shields.io/badge/BUILT%20WITH-BLOOD%20%26%20SWEAT-8B0000?style=for-the-badge)](/)
[![License: MIT](https://img.shields.io/badge/License-MIT-990000?style=for-the-badge)](LICENSE)
**My Debian home directory - forged in the fires of chaos, tempered with configuration files,**
**and wielded with the fury of a thousand riffs.**
*This is where dotfiles headbang and shell scripts scream.*
</div>
---
## ⚡ THE ARSENAL ⚡
### 🎸 **WEAPONS OF MASS DEVELOPMENT**
```
┌─────────────────────────────────────────────────┐
│ ⚔️ NODE.JS │ Managed by nvm │
│ ⚔️ PYTHON │ Managed by pyenv │
│ ⚔️ RUBY │ Managed by rbenv │
│ ⚔️ RUST │ Managed by rustup │
│ ⚔️ GO │ Managed by gvm │
│ ⚔️ DOCKER │ Containerized destruction │
│ ⚔️ POSTGRES │ Version 18 database engine │
└─────────────────────────────────────────────────┘
```
---
## 🩸 QUICK START RITUAL 🩸
### **Summoning the Environment**
```bash
# 1. Clone this unholy repository
git init && git remote add origin git@github.com:valknarogg/home.git
git fetch && git reset --hard origin/main
git branch --set-upstream-to=origin/main main
# 2. Configure git
git config --global init.defaultBranch main
git config --global --add safe.directory /home/$USER
# 3. Install essential packages using arty scripts
arty debian/install # Base packages (curl, zsh, fzf, davfs2, etc.)
arty rust/install # Rust toolchain via rustup
arty zed/install # Zed editor
arty claude/install # Claude CLI
# 4. Sync shell configuration and version managers
arty sync
# 5. Source the shell configuration
source ~/.zshrc
```
### **Available Installation Scripts**
Arty provides installation scripts for various tools:
```bash
arty debian/update # Enable non-free repos and update sources
arty debian/install # curl, zsh, fzf, davfs2, krusader, make, imagemagick, ffmpeg, yt-dlp, thunderbird, etc.
arty rust/install # Rust toolchain via rustup
arty uv/install # uv Python package manager
arty zed/install # Zed code editor
arty claude/install # Claude AI CLI
arty spotify/install # Spotify desktop client
arty mattermost/install # Mattermost desktop client
arty joplin/install # Joplin note-taking app
arty yq/install # yq YAML processor
```
---
## 🎯 ARTY - REPOSITORY ORCHESTRATION 🎯
### **What is Arty?**
**Arty.sh** is a bash-based dependency and repository manager that orchestrates git subrepositories like a conductor of chaos. It's part of the [butter.sh](https://github.com/butter-sh/butter-sh.github.io) ecosystem - a suite of bash development tools.
### **Installing Arty**
Arty is already installed globally at `/usr/local/bin/arty`. If you need to install/update it:
```bash
# Clone butter.sh ecosystem
git clone https://github.com/butter-sh/butter-sh.github.io.git ~/Projects/butter-sh
# Install arty globally (requires sudo)
cd ~/Projects/butter-sh/projects/arty.sh
sudo ./arty.sh install
```
### **The `arty.yml` Configuration**
The root `~/arty.yml` defines your repository dependencies and installation scripts:
```yaml
name: "Valknar's home"
version: '1.0.0'
description: "Valknar's home repository"
author: 'valknar@pivoine.art'
license: 'MIT'
references:
# Custom scripts and binaries
- url: https://dev.pivoine.art/valknar/bin.git
into: bin
- url: https://dev.pivoine.art/valknar/home-llmx.git
into: .llmx
# Version managers
- url: https://github.com/nvm-sh/nvm.git
into: .nvm
- url: https://github.com/rbenv/rbenv.git
into: .rbenv
- url: https://github.com/pyenv/pyenv.git
into: .pyenv
- url: https://github.com/moovweb/gvm.git
into: .gvm
# Shell configuration
- url: https://github.com/ohmyzsh/ohmyzsh.git
into: .oh-my-zsh
- url: https://github.com/romkatv/powerlevel10k.git
into: .oh-my-zsh/custom/themes/powerlevel10k
scripts:
debian/update: sudo sed -i 's/main.../main contrib non-free non-free-firmware/g' /etc/apt/sources.list && sudo apt update
debian/install: sudo apt install curl zsh fzf davfs2 krusader make imagemagick ffmpeg yt-dlp thunderbird pkg-config blueman libffi-dev zlib1g-dev libyaml-dev libssl-dev tree
rust/install: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
uv/install: curl -LsSf https://astral.sh/uv/install.sh | sh
zed/install: curl -f https://zed.dev/install.sh | sh
claude/install: curl -fsSL https://claude.ai/install.sh | bash
```
### **Using Arty**
```bash
# Sync all repositories defined in arty.yml
arty sync
# Run installation scripts
arty debian/install
arty rust/install
arty zed/install
# Update all references
arty update
# Show configuration info
arty info
```
### **What Arty Manages:**
-**Version managers** (nvm, rbenv, pyenv, gvm)
-**Shell configuration** (Oh-My-Zsh, Powerlevel10k, plugins)
-**Custom binaries** (from valknarogg/bin repository)
-**Installation scripts** (system packages, development tools)
### **Simplified Repository Management**
The configuration has been streamlined to focus on essential tooling and version managers. Project-specific repositories should be managed separately in their respective locations (e.g., `~/Projects/`), while arty handles the core development environment setup.
---
## 🔥 COMMAND LINE BRUTALITY 🔥
### **Git Operations**
```bash
g0 # Stage all changes and verify clean state
g1 # Nuclear reset to single commit
g2 # Show last commit message
git add -A && git commit -m "$(g2)" # Reuse last commit message
```
### **Media Processing**
```bash
# Convert all images in directory to WebP
batch_image_webp
# Rename files with sequence numbers
batch_file_sequence artwork webp
# Optimize video
_video_optimize input.mov
# Download YouTube video as MP3
yt "https://youtube.com/watch?v=..."
```
### **Development Servers**
```bash
# Serve current directory on port 8000
ss
# Run Jekyll site with livereload
cd ~/Projects/pivoine.art && bundle exec jekyll serve --livereload
# Run Node.js dev server
cd ~/Projects/node.js/awesome && pnpm dev
```
### **Rsync Power**
```bash
# Sync to remote with sudo
rs /local/path/ user@host:/remote/path/
```
---
## 📁 ENVIRONMENT STRUCTURE 📁
```
~/
├── bin/ # Custom scripts and executables
├── .llmx/ # LLM configuration (Claude, etc.)
├── .nvm/ # Node Version Manager
├── .rbenv/ # Ruby Version Manager
├── .pyenv/ # Python Version Manager
├── .gvm/ # Go Version Manager
├── .oh-my-zsh/ # Oh-My-Zsh framework
│ └── custom/
│ ├── themes/
│ │ └── powerlevel10k/
│ └── plugins/
│ ├── zsh-autosuggestions/
│ └── zsh-syntax-highlighting/
├── Projects/ # Development projects (managed separately)
├── Documents/ # → /mnt/hidrive/users/valknar/Documents
├── Pictures/ # → /mnt/hidrive/users/valknar/Pictures
├── Videos/ # → /mnt/hidrive/users/valknar/Videos
└── Music/ # → /mnt/hidrive/users/valknar/Music
```
---
## 🛠️ DOTFILE HIGHLIGHTS 🛠️
### **Shell Configuration**
- **`.zshrc`** - Oh-My-Zsh with Powerlevel10k theme
- **`.zlogin`** - Login script (mounts HiDrive, creates symbolic links)
- **`.p10k.zsh`** - Powerlevel10k configuration
- **`.bashrc`** - Bash configuration (fallback)
### **Version Files**
- **`.nvmrc`** - Node.js version
- **`.ruby-version`** - Ruby version
- **`.python-version`** - Python version
### **Code Quality**
- **`.pre-commit-config.yaml`** - Pre-commit hooks (Python)
- **`.rubocop.yml`** - Ruby style enforcement
- **`eslint.config.mts`** - JavaScript/TypeScript linting
- **`.prettierrc`** - Code formatting rules
- **`biome.json`** - Fast linter/formatter
### **Package Management**
- **`requirements.txt`** - Python packages (pip)
- **`Gemfile`** - Ruby gems (bundler)
### **Git Configuration**
- **`.gitignore`** - INVERTED PATTERN (ignore all, allow specific files)
- **`.gitconfig`** - Git user configuration
### **Orchestration**
- **`arty.yml`** - Repository and dependency management with installation scripts
### **Personal**
- **`signature.txt`** - ASCII art email signature with contact information
---
## 🔗 HIDRIVE INTEGRATION 🔗
The `.zlogin` script automatically:
- **Mounts HiDrive** storage at `/mnt/hidrive` on shell login
- **Creates symbolic links** from HiDrive to home directory:
- `~/Documents``/mnt/hidrive/users/valknar/Documents`
- `~/Pictures``/mnt/hidrive/users/valknar/Pictures`
- `~/Videos``/mnt/hidrive/users/valknar/Videos`
- `~/Music``/mnt/hidrive/users/valknar/Music`
This provides seamless access to cloud-stored media and documents from your home directory.
---
## ⚙️ GIT SELECTIVE TRACKING ⚙️
This repository uses an **inverted `.gitignore`** pattern:
```gitignore
# Ignore everything
*
# Allow specific files
!CLAUDE.md
!README.md
!.gitignore
!.zshrc
!.zlogin
!arty.yml
...
```
**Why?** To track only essential dotfiles and configurations while ignoring cache, logs, and user data. Your home directory becomes a git repository without the chaos.
**Note**: The `.init/` directory is NOT tracked in git - it exists locally only for shell initialization. This keeps your shell configuration private and machine-specific.
---
## 🎸 SHELL PLUGIN POWER 🎸
**Oh-My-Zsh Plugins Loaded:**
```
git pm2 gh sudo ssh ruby rust python node github
rsync nvm rbenv pyenv docker docker-compose qrcode
zsh-autosuggestions zsh-syntax-highlighting
zsh-interactive-cd zsh-navigation-tools
```
---
## 🔗 USEFUL RESOURCES 🔗
### System & Shell
- [Ansible Documentation](https://docs.ansible.com/)
- [Oh-My-Zsh](https://ohmyz.sh/)
- [Powerlevel10k](https://github.com/romkatv/powerlevel10k)
### Language Managers
- [nvm](https://github.com/nvm-sh/nvm) - Node Version Manager
- [rbenv](https://github.com/rbenv/rbenv) - Ruby Version Manager
- [pyenv](https://github.com/pyenv/pyenv) - Python Version Manager
- [gvm](https://github.com/moovweb/gvm) - Go Version Manager
- [rustup](https://rustup.rs/) - Rust Toolchain Manager
### Orchestration
- [Arty.sh Documentation](https://github.com/butter-sh/butter-sh.github.io)
- [Butter.sh Ecosystem](https://butter.sh)
---
## 🖤 LICENSE 🖤
MIT License - Do whatever the hell you want with it.
---
<div align="center">
<pre>
═════════════════════════════════════════════════════════════════
__________ ____ ______ _________
/ ____/ __ \/ __ \/ ____/ / _/ ___/
/ / / / / / / / / __/ / / \__ \
/ /___/ /_/ / /_/ / /___ _/ / ___/ /
\____/\____/_____/_____/ /___//____/
______________ _______ ____ ____ ___ ______ __
/_ __/ ____/ |/ / __ \/ __ \/ __ \/ | / __ \ \/ /
/ / / __/ / /|_/ / /_/ / / / / /_/ / /| | / /_/ /\ /
/ / / /___/ / / / ____/ /_/ / _, _/ ___ |/ _, _/ / /
/_/ /_____/_/ /_/_/ \____/_/ |_/_/ |_/_/ |_| /_/
__ __________________ __ _________
/ |/ / ____/_ __/ | / / / _/ ___/
/ /|_/ / __/ / / / /| | / / / / \__ \
/ / / / /___ / / / ___ |/ /___ _/ / ___/ /
/_/ /_/_____/ /_/ /_/ |_/_____/ /___//____/
______________________ _ _____ __
/ ____/_ __/ ____/ __ \/ | / / | / /
/ __/ / / / __/ / /_/ / |/ / /| | / /
/ /___ / / / /___/ _, _/ /| / ___ |/ /___
/_____/ /_/ /_____/_/ |_/_/ |_/_/ |_/_____/
═════════════════════════════════════════════════════════════════
🔥⚡ FORGED BY VALKNAR ⚡🔥
valknar@pivoine.art
Powered by Debian | Fueled by Metal
🤘 🤘 🤘
</pre>
**[⚔️ BACK TO THE TOP ⚔️](#)**
</div>

105
arty.yml Normal file
View File

@@ -0,0 +1,105 @@
name: "Valknar's home"
version: "1.0.0"
description: "Valknar's home repository"
author: "valknar@pivoine.art"
license: "MIT"
notes: |
# Valknar's Home Repository
This is a **personal development environment** configuration managed with `arty`.
## Quick Start
```bash
# Install all dependencies
arty deps
# Update system packages
arty debian/update && arty debian/install
# Install development tools
arty node/install
arty rust/install
arty python/install
```
## Key Features
- **Shell Configuration**: Zsh with Oh-My-Zsh and Powerlevel10k theme
- **Version Managers**: nvm (Node), rbenv (Ruby), pyenv (Python), gvm (Go)
- **Development Tools**: Docker, Rust, Node.js, Python, Ruby
- **Utilities**: Custom scripts in `bin/` directory
## Important Commands
1. **System Setup** - Run Ansible playbook for complete setup
2. **Environment Variables** - Loaded from `.init/export.sh`
3. **Custom Functions** - Available in `.init/functions.sh`
## Links
- [Repository](ssh://git@dev.pivoine.art:2222/valknar/bin.git)
- [Documentation](https://docs.pivoine.art)
## Notes
- Always use `arty` to manage Docker containers
- Run `arty up -d CONTAINER` instead of `arty restart CONTAINER`
- Push with the `valknarthing` SSH key
- Ensure SSH agent has only one key for pushing
references:
- url: https://dev.pivoine.art/valknar/bin.git
into: bin
- url: https://dev.pivoine.art/valknar/home-llmx.git
into: .llmx
- url: https://github.com/nvm-sh/nvm.git
into: .nvm
- url: https://github.com/moovweb/gvm.git
into: .gvm
- url: https://github.com/rbenv/rbenv.git
into: .rbenv
- url: https://github.com/rbenv/ruby-build.git
into: .rbenv/plugins/ruby-build
- url: https://github.com/pyenv/pyenv.git
into: .pyenv
- url: https://github.com/ohmyzsh/ohmyzsh.git
into: .oh-my-zsh
- url: https://github.com/romkatv/powerlevel10k.git
into: .oh-my-zsh/custom/themes/powerlevel10k
- url: https://github.com/zsh-users/zsh-autosuggestions.git
into: .oh-my-zsh/custom/plugins/zsh-autosuggestions
- url: https://github.com/zsh-users/zsh-syntax-highlighting.git
into: .oh-my-zsh/custom/plugins/zsh-syntax-highlighting
scripts:
debian/update: sudo sed -i 's/main non-free-firmware/main contrib non-free non-free-firmware/g' /etc/apt/sources.list && sudo apt update
debian/install:
sudo apt install curl zsh fzf davfs2 krusader make imagemagick ffmpeg yt-dlp
thunderbird pkg-config blueman libffi-dev zlib1g-dev libyaml-dev libssl-dev tree firmware-linux-nonfree firmware-realtek
debian/remove: sudo apt remove pulseaudio-module-bluetooth
docker/install: curl -fsSL -o- https://get.docker.com | sudo sh && sudo usermod -aG docker $USER
rust/install: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
node/install: nvm install
ruby/install: rbenv install
python/install: pyenv install
uv/install: curl -LsSf https://astral.sh/uv/install.sh | sh
zed/install: curl -f https://zed.dev/install.sh | sh
claude/install: curl -fsSL https://claude.ai/install.sh | bash
mattermost/install:
curl -fsS -o- https://deb.packages.mattermost.com/setup-repo.sh | sudo bash
&& sudo apt install mattermost-desktop
joplin/install: wget -O -
https://raw.githubusercontent.com/laurent22/joplin/dev/Joplin_install_and_update.sh | bash
yq/install:
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
-O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
spotify/install:
curl -sS https://download.spotify.com/debian/pubkey_C85668DF69375001.gpg |
sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/spotify.gpg && echo "deb
https://repository.spotify.com stable non-free" | sudo tee
/etc/apt/sources.list.d/spotify.list && sudo apt-get update && sudo apt-get
install spotify-client
npm/install: npm i -g npm pnpm @valknarthing/llmx
gem/install: gem install bundler

10
signature.txt Normal file
View File

@@ -0,0 +1,10 @@
██╗ ██╗ █████╗ ██╗ ██╗ ██╗███╗ ██╗ █████╗ ██████╗
██║ ██║██╔══██╗██║ ██║ ██╔╝████╗ ██║██╔══██╗██╔══██╗
██║ ██║███████║██║ █████╔╝ ██╔██╗ ██║███████║██████╔╝
╚██╗ ██╔╝██╔══██║██║ ██╔═██╗ ██║╚██╗██║██╔══██║██╔══██╗
╚████╔╝ ██║ ██║███████╗██║ ██╗██║ ╚████║██║ ██║██║ ██║
╚═══╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝
───────────────────────────────────────────────────────────────────
valknar@pivoine.art │ (+49) 174 8188918 │ https://pivoine.art
───────────────────────────────────────────────────────────────────