- name
- installing-apps-tools-and-services
- description
- Use this skill when installing applications, packages, tools, or services on the system. Handles Python (uv), Node/JS/TS (bun), Docker containers, and GitHub-sourced installations with mise-managed tools and ecosystem integration patterns.
Installing Apps and Packages
Comprehensive guide for installing applications, packages, and services following Jarad's ecosystem patterns and tool preferences.
When to Use This Skill
Trigger this skill when:
- Installing Python applications or packages (CLI tools, libraries, services)
- Installing Node.js/JavaScript/TypeScript applications or packages
- Setting up containerized applications with Docker Compose
- Cloning and installing GitHub-sourced projects
- Integrating new tools into the existing ecosystem (proxy network, traefik, shared databases)
- Configuring applications to work with mise-managed tooling
- Setting up application secrets and environment variables
General Workflow
1. Gather Data on Install Target
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 proxyKey Information to Note:
- OS: Ubuntu/Debian-based Linux
- Architecture: x86_64
- Package managers: uv (Python), bun (Node), mise (version management)
- Native services: PostgreSQL, Redis
- Docker network:
proxy(system-wide Traefik network) - Domain conventions:
*.delo.shfor services
2. Gather Data on Thing Being Installed
Use Official Channels:
- Check main GitHub repository (README, installation docs)
- Review official documentation site
- Examine release notes and installation guides
- Look for Docker Compose examples if applicable
- Check for .env.example or configuration templates
Critical Questions:
- What runtime does it require? (Python, Node, Rust, Go?)
- Is it a CLI tool, library, or service?
- Does it need a database? (Can we use native Postgres/Redis?)
- Does it expose HTTP endpoints? (Needs Traefik integration?)
- What secrets/API keys does it need? (Check ~/.config/zshyzsh/secrets.zsh)
3. Determine Installation Method
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 methodPython Applications
Core Principles
ALWAYS use uv as the package tool
- Prefer global installs over venv
- Use mise-managed
uvandpython - End goal: invoke as
someApp, notuv run someApp - Preferred bin path:
~/.local/bin
Installation Patterns
CLI Tools:
# Use uv tool install for CLI tools
uv tool install <package-name>
# Verify installation
which <tool-name>
<tool-name> --versionExample - Installing ruff:
# Install globally as CLI tool
uv tool install ruff
# Verify
ruff --versionLibraries/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.txtServices (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.txtTool Replacements
Replace these commands:
pip install→uv pip install -gpipx install→uv tool installpython -m venv→uv venv(if venv needed)
Mise Integration
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 [email protected] -- python --versionNode/JavaScript/TypeScript Applications
Core Principles
Prefer bun over npm
- Use mise-managed bun/nodejs
- Use globally installed tools
- Use latest bun/nodejs versions
- OK to use
npxorbunxfor one-off commands
Installation Patterns
CLI Tools:
# Global installation with bun
bun install -g <package-name>
# Verify
which <tool-name>
<tool-name> --versionExample - Installing typescript:
# Install globally
bun install -g typescript
# Verify
tsc --versionOne-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>Mise Integration
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 --versionGitHub-Sourced Installations
Core Principle
Always clone into ~/code
Workflow
# 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 installExample - 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 .Docker/Containerized Installations
Core Principles
Ecosystem Integration:
- Modify compose files to fit Docker container ecosystem
- Avoid common port conflicts (3000, 8080, etc.)
- Use system-wide
proxynetwork for Traefik integration - Connect to native services (Postgres, Redis, Neo4j, Qdrant)
- Use simple, common-sense subdomains (\*.delo.sh)
Workflow
1. Examine and Modify Compose File
Critical 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: [email protected] :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: truePort Management:
- Avoid exposing ports directly unless necessary
- Use Traefik labels for HTTP/HTTPS access
- If port exposure needed, choose random non-privileged port (e.g., 8473, 9234)
- Never use common ports: 3000, 8000, 8080, 5000, etc.
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: [email protected] :5432/dbname
- REDIS_URL=redis://host.docker.internal:63792. Create .env File
Resolve Secrets:
- Check provided .env.example or README
- Cross-reference with system secrets:
~/.config/zshyzsh/secrets.zsh - Generate new secrets if needed (API keys, passwords, etc.)
# 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.zshCommon Secret Locations:
- OpenAI:
$OPENAI_API_KEY - Anthropic:
$ANTHROPIC_API_KEY - GitHub:
$GITHUB_TOKEN - Database:
$POSTGRES_PASSWORD
3. Build and Deploy
# Production build preferred
docker compose build --no-cache
# Deploy with proper restart policy
docker compose up -d
# Verify
docker compose ps
docker compose logs -fContainer Naming:
- Use simple slugs:
awesome-app, notawesome-app-1orawesome-app_container - Set
container_nameexplicitly in compose file - Restart policy:
unless-stoppedis usually sufficient
Lock 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:latestTraefik Integration Patterns
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"Database Setup
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.sqlPost-Installation Verification
Check Tool Availability
# 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/healthVerify Mise Integration
# List all mise-managed tools
mise ls --current
# Verify PATH includes mise bins
echo $PATH | grep miseVerify Service Integration
# 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.shCommon Patterns
Pattern: Installing Python MCP Server
# 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.jsonPattern: Installing Node CLI Tool
# 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 -gPattern: Docker Service with Native Database
# 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/healthTroubleshooting
Tool Not Found After Installation
# 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>Docker Service Won't Start
# 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>Traefik Routing Issues
# 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.shQuick Reference
Installation Commands by Type
| 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 |
Key File Locations
- Secrets:
~/.config/zshyzsh/secrets.zsh - Docker stacks:
~/docker/trunk-main/stacks/ - Code repos:
~/code/ - Mise config:
~/.config/mise/config.toml - Local bins:
~/.local/bin/
Essential Checks
# 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/healthResources
references/
docker-compose-patterns.md- Common Docker Compose configurationstraefik-labels-reference.md- Traefik label patternsnative-service-connection.md- Connecting to native Postgres/Redis/Qdrant
scripts/
install-python-cli.sh- Template for Python CLI installationinstall-node-cli.sh- Template for Node CLI installationsetup-docker-service.sh- Template for Docker service setup
assets/
docker-compose.template.yml- Standard compose file template.env.template- Standard .env templatetraefik-labels.yml- Common Traefik label configurations
See Also
ecosystem-patternsskill - Overall ecosystem architecture and conventionsmise-task-managingskill - Managing mise tasks and tool versions- Docker Compose patterns in ecosystem-patterns/references/