Use this skill when installing applications, packages, tools, or services on the system...
Comprehensive guide for installing applications, packages, and services following Jarad's ecosystem patterns and tool preferences.
Trigger this skill when:
Inspect Current Host:
# Check OS and architecture
uname -a
lsb_release -a
arch
# Check mise-managed tools
mise ls --current
# Check available databases/services
systemctl status postgresql redis neo4j qdrant
# Check Docker network
docker network ls | grep proxy
Key Information to Note:
proxy (system-wide Traefik network)*.delo.sh for servicesUse Official Channels:
Critical Questions:
Decision Tree:
Is it available in the mise registry?
โโ Yes? โ mise install <package> #easy peasy done!
Is it Python-based?
โโ CLI tool โ uv tool install
โโ Library โ uv pip install -g
โโ Service โ Docker or uv pip install -g
Is it Node/JS/TS-based?
โโ CLI tool โ bun install -g or bunx (one-offs)
โโ Library โ bun add
โโ Service โ Docker or native bun
Is it containerized?
โโ Follow Docker/Containerized Workflow
Is it from GitHub?
โโ Clone to ~/code and apply appropriate install method
ALWAYS use uv as the package tool
uv and pythonsomeApp, not uv run someApp~/.local/binCLI Tools:
# Use uv tool install for CLI tools
uv tool install <package-name>
# Verify installation
which <tool-name>
<tool-name> --version
Example - Installing ruff:
# Install globally as CLI tool
uv tool install ruff
# Verify
ruff --version
Libraries/Packages:
# Use uv sync first if pyproject allows
uv sync
# Use global install instead of pip install
uv pip install -g <package-name>
# If docs say "pip install -r requirements.txt", translate to:
uv pip install -r requirements.txt
Services (Python-based):
For services like FastAPI apps, Agno agents, etc.:
# Clone to ~/code if from GitHub
cd ~/code
gh repo clone <repo-url>
cd <project-name>
# Install dependencies globally or in project
uv sync
# Or use project-specific environment
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
Replace these commands:
pip install โ uv pip install -gpipx install โ uv tool installpython -m venv โ uv venv (if venv needed)Ensure mise manages Python and uv:
# Check current versions
mise ls --current
# Install/update if needed
mise use python@latest uv@latest -g
# Verify
which python
which uv
# Explicitly invoke
mise x -- uv --version
mise x python@3.12 -- python --version
Prefer bun over npm
npx or bunx for one-off commandsCLI Tools:
# Global installation with bun
bun install -g <package-name>
# Verify
which <tool-name>
<tool-name> --version
Example - Installing typescript:
# Install globally
bun install -g typescript
# Verify
tsc --version
One-off Commands:
# Use bunx for one-time executions
bunx create-react-app my-app
bunx prettier --write .
Project Dependencies:
# For project-specific packages
cd ~/code/<project-name>
bun install
bun add <package-name>
Ensure mise manages bun/node:
# Install/update globally
mise use bun@latest -g
mise use node@latest -g
# Verify
which bun
which node
bun --version
node --version
Always clone into ~/code
# 1. Clone to standard location
cd ~/code
git clone <repo-url>
cd <project-name>
# 2. Initialize with iMi (optional, if it's a project you'll develop)
imi init
# 3. Apply appropriate installation method based on type
# - Python: uv pip install -g -r requirements.txt
# - Node: bun install
# - Rust: cargo install --path .
# - Go: go install
Example - Installing a Python CLI from GitHub:
cd ~/code
git clone https://github.com/user/awesome-tool
cd awesome-tool
# Install as tool
uv tool install .
# Or if it has requirements
uv pip install -g -r requirements.txt
uv pip install -g .
Ecosystem Integration:
proxy network for Traefik integrationCritical Modifications:
# docker-compose.yml
services:
app:
image: awesome-app:latest
container_name: awesome-app # Simple slug, no numbers/postfixes
restart: unless-stopped
networks:
- proxy # System-wide network
environment:
# Use native databases
- DATABASE_URL=postgresql://user:pass@host.docker.internal:5432/dbname
- REDIS_URL=redis://host.docker.internal:6379
- QDRANT_URL=http://host.docker.internal:6333
labels:
# Traefik configuration
- "traefik.enable=true"
- "traefik.http.routers.awesome-app.rule=Host(`awesome.delo.sh`)"
- "traefik.http.routers.awesome-app.entrypoints=websecure"
- "traefik.http.routers.awesome-app.tls.certresolver=letsencrypt"
- "traefik.http.services.awesome-app.loadbalancer.server.port=8000"
networks:
proxy:
external: true
Port Management:
Database Integration:
# DON'T add separate database services
services:
postgres: # โ Don't do this
image: postgres:16
...
# DO connect to native instances
environment:
# โ
Use host.docker.internal
- DATABASE_URL=postgresql://user:pass@host.docker.internal:5432/dbname
- REDIS_URL=redis://host.docker.internal:6379
Resolve Secrets:
~/.config/zshyzsh/secrets.zsh# Example .env file
DATABASE_URL=postgresql://delorenj:${POSTGRES_PASSWORD}@host.docker.internal:5432/awesome_app
REDIS_URL=redis://host.docker.internal:6379
SECRET_KEY=${AWESOME_APP_SECRET_KEY} # From secrets.zsh
API_KEY=${OPENAI_API_KEY} # From secrets.zsh
Common Secret Locations:
$OPENAI_API_KEY$ANTHROPIC_API_KEY$GITHUB_TOKEN$POSTGRES_PASSWORD# Production build preferred
docker compose build --no-cache
# Deploy with proper restart policy
docker compose up -d
# Verify
docker compose ps
docker compose logs -f
Container Naming:
awesome-app, not awesome-app-1 or awesome-app_containercontainer_name explicitly in compose fileunless-stopped is usually sufficientLock Down Configuration:
For production deployments, create custom image and push to Docker Hub:
# Build custom image
docker build -t delorenj/awesome-app:latest .
# Push to Docker Hub
docker push delorenj/awesome-app:latest
# Update compose to use locked image
services:
app:
image: delorenj/awesome-app:latest
Basic HTTP Service:
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.delo.sh`)"
- "traefik.http.routers.app.entrypoints=websecure"
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
Service with Path Prefix:
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`delo.sh`) && PathPrefix(`/app`)"
- "traefik.http.middlewares.app-strip.stripprefix.prefixes=/app"
- "traefik.http.routers.app.middlewares=app-strip"
WebSocket Support:
labels:
- "traefik.http.routers.app.rule=Host(`ws.delo.sh`)"
- "traefik.http.services.app.loadbalancer.server.port=8080"
Create Database (if needed):
# Connect to native Postgres
psql -U delorenj -d postgres
# Create database
CREATE DATABASE awesome_app;
# Create user if needed
CREATE USER awesome_app WITH PASSWORD 'secure_password';
GRANT ALL PRIVILEGES ON DATABASE awesome_app TO awesome_app;
Initialize Schema:
# If app has migrations
docker compose exec app python manage.py migrate
# Or run SQL files
psql -U delorenj -d awesome_app -f schema.sql
# For CLI tools
which <tool-name>
<tool-name> --version
# For Python packages
python -c "import <package>"
# For Node packages
node -e "require('<package>')"
# For Docker services
docker compose ps
curl http://localhost:<port>/health
curl https://app.delo.sh/health
# List all mise-managed tools
mise ls --current
# Verify PATH includes mise bins
echo $PATH | grep mise
# Test database connection
psql -U delorenj -d awesome_app -c "SELECT 1"
# Test Redis connection
redis-cli ping
# Test Traefik routing
curl -I https://app.delo.sh
# 1. Clone to ~/code
cd ~/code
git clone https://github.com/user/mcp-server
cd mcp-server
# 2. Install globally
uv pip install -g .
# 3. Verify
which mcp-server
mcp-server --version
# 4. Configure in Claude Code
# Add to claude_desktop_config.json
# 1. Install globally with bun
bun install -g awesome-cli
# 2. Verify
which awesome-cli
awesome-cli --version
# 3. Add to mise if version pinning needed
mise use awesome-cli@latest -g
# 1. Create project structure
cd ~/docker/trunk-main/stacks/ai
mkdir awesome-service
cd awesome-service
# 2. Create compose file
cat > docker-compose.yml << 'EOF'
services:
awesome:
image: awesome/service:latest
container_name: awesome-service
restart: unless-stopped
networks:
- proxy
environment:
- DATABASE_URL=postgresql://delorenj:${POSTGRES_PASSWORD}@host.docker.internal:5432/awesome
labels:
- "traefik.enable=true"
- "traefik.http.routers.awesome.rule=Host(`awesome.delo.sh`)"
- "traefik.http.routers.awesome.entrypoints=websecure"
- "traefik.http.routers.awesome.tls.certresolver=letsencrypt"
networks:
proxy:
external: true
EOF
# 3. Create .env from secrets
cat > .env << 'EOF'
POSTGRES_PASSWORD=<from secrets.zsh>
OPENAI_API_KEY=<from secrets.zsh>
EOF
# 4. Create database
psql -U delorenj -d postgres -c "CREATE DATABASE awesome"
# 5. Deploy
docker compose up -d
# 6. Verify
docker compose logs -f
curl https://awesome.delo.sh/health
# Check if installed
uv tool list
bun pm ls -g
# Check PATH
echo $PATH | grep -E '(\.local/bin|mise)'
# Verify mise activation
mise doctor
# Reinstall if needed
uv tool uninstall <tool>
uv tool install <tool>
# Check logs
docker compose logs
# Verify network exists
docker network ls | grep proxy
# Test database connectivity
docker compose exec app psql $DATABASE_URL -c "SELECT 1"
# Check port conflicts
ss -tulpn | grep :<port>
# Check Traefik dashboard
# (Access via configured dashboard URL)
# Verify labels are applied
docker inspect <container> | grep traefik
# Test DNS resolution
nslookup app.delo.sh
# Check certificate
curl -I https://app.delo.sh
| Type | Install Command | Example |
|---|---|---|
| Python CLI | uv tool install <pkg> |
uv tool install ruff |
| Python lib | uv pip install -g <pkg> |
uv pip install -g requests |
| Node CLI | bun install -g <pkg> |
bun install -g typescript |
| Node one-off | bunx <cmd> |
bunx prettier --write . |
| GitHub repo | cd ~/code && git clone <url> |
Clone then apply above |
| Docker service | docker compose up -d |
With ecosystem mods |
~/.config/zshyzsh/secrets.zsh~/docker/trunk-main/stacks/~/code/~/.config/mise/config.toml~/.local/bin/# Before installing
mise ls --current
which python uv bun node
docker network ls | grep proxy
# After installing
which <tool>
<tool> --version
mise doctor
# For Docker services
docker compose ps
docker compose logs
curl https://app.delo.sh/health
docker-compose-patterns.md - Common Docker Compose configurationstraefik-labels-reference.md - Traefik label patternsnative-service-connection.md - Connecting to native Postgres/Redis/Qdrantinstall-python-cli.sh - Template for Python CLI installationinstall-node-cli.sh - Template for Node CLI installationsetup-docker-service.sh - Template for Docker service setupdocker-compose.template.yml - Standard compose file template.env.template - Standard .env templatetraefik-labels.yml - Common Traefik label configurationsecosystem-patterns skill - Overall ecosystem architecture and conventionsmise-task-managing skill - Managing mise tasks and tool versions