pihole-dns-setup
Configures Pi-hole local DNS records to enable local network resolution of *.temet.ai domains. Use when you need to set up DNS, add local DNS entries, configure Pi-hole DNS, troubleshoot DNS resolution, or make services resolve locally. Triggers on "setup DNS", "configure Pi-hole DNS", "add DNS record", "DNS not resolving", "local DNS setup", or "why can't I access [service].temet.ai locally". Works with Pi-hole container, domains.toml, docker-compose.yml, and manage-domains.sh.
What this skill does
# Pi-hole DNS Setup Skill
Configure Pi-hole local DNS records for local network resolution of temet.ai domains.
## Quick Start
Run automated DNS setup from domains.toml:
```bash
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh apply
```
Or manually add a single DNS record:
```bash
# Get Pi IP
PI_IP=$(hostname -I | awk '{print $1}')
# Test DNS resolution
dig @localhost pihole.temet.ai +short
```
## Table of Contents
1. [When to Use This Skill](#1-when-to-use-this-skill)
2. [What This Skill Does](#2-what-this-skill-does)
3. [Instructions](#3-instructions)
- 3.1 Detect Pi IP Address
- 3.2 Get Domains from Configuration
- 3.3 Apply DNS Changes
- 3.4 Verify DNS Resolution
- 3.5 Router DNS Reminder
4. [Supporting Files](#4-supporting-files)
5. [Expected Outcomes](#5-expected-outcomes)
6. [Requirements](#6-requirements)
7. [Red Flags to Avoid](#7-red-flags-to-avoid)
## When to Use This Skill
**Explicit Triggers:**
- "Set up Pi-hole DNS"
- "Configure local DNS"
- "Add DNS record for [domain]"
- "Set up DNS entries"
- "Make [service].temet.ai resolve locally"
**Implicit Triggers:**
- After adding a new service to domains.toml
- When local resolution fails for temet.ai domains
- Setting up a fresh Pi-hole installation
- Migrating services to new IP addresses
**Debugging Triggers:**
- "DNS not resolving"
- "Can't access [service].temet.ai on local network"
- "dig returns wrong IP"
- "Works remotely but not locally"
## What This Skill Does
1. **Detects Pi IP** - Auto-discovers the Raspberry Pi's local IP address
2. **Reads Configuration** - Gets domain list from domains.toml
3. **Updates DNS** - Configures Pi-hole with local DNS entries via docker-compose.yml
4. **Verifies Resolution** - Tests DNS resolution works correctly
5. **Provides Guidance** - Reminds about router DNS configuration
## Instructions
### 3.1 Detect Pi IP Address
Get the Pi's local IP automatically:
```bash
hostname -I | awk '{print $1}'
```
Expected output: `192.168.68.135` (or similar)
Alternative methods if needed:
```bash
# From network interface
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
# From Pi-hole container environment
docker exec pihole printenv | grep PIHOLE_INTERFACE
```
### 3.2 Get Domains from Configuration
Read domains from `domains.toml`:
```bash
# List all configured services with DNS entries
./scripts/manage-domains.sh list
```
Or parse directly:
```bash
grep -E "^subdomain = |^dns_ip = " /home/dawiddutoit/projects/network/domains.toml
```
**Current domains defined in domains.toml:**
| Service | Domain | DNS IP |
|---------|--------|--------|
| Pi-hole | pihole.temet.ai | 192.168.68.135 |
| Jaeger | jaeger.temet.ai | 192.168.68.135 |
| Langfuse | langfuse.temet.ai | 192.168.68.135 |
| Home Assistant | ha.temet.ai | 192.168.68.135 |
| Code Server | code.temet.ai | 192.168.68.135 |
| Sprinkler | sprinkler.temet.ai | 192.168.68.105 |
| Webhook | webhook.temet.ai | 192.168.68.135 |
| Root | temet.ai | 192.168.68.135 |
### 3.3 Apply DNS Changes
**Automated Method (Recommended):**
```bash
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh apply
```
This runs `generate-pihole-dns.py` which:
1. Reads domains.toml
2. Updates `FTLCONF_dns_hosts` in docker-compose.yml
3. Restarts Pi-hole to apply changes
**Manual DNS Entry (Single Domain):**
If you need to add a single entry without full apply:
```bash
# Edit docker-compose.yml FTLCONF_dns_hosts section
# Then restart Pi-hole
docker compose -f /home/dawiddutoit/projects/network/docker-compose.yml restart pihole
```
**How DNS Configuration Works:**
Pi-hole v6 uses `FTLCONF_dns_hosts` environment variable for custom DNS:
```yaml
environment:
FTLCONF_dns_hosts: |
192.168.68.135 pihole.temet.ai
192.168.68.135 jaeger.temet.ai
192.168.68.105 sprinkler.temet.ai
```
### 3.4 Verify DNS Resolution
After applying changes, verify DNS works:
**Test individual domain:**
```bash
dig @localhost pihole.temet.ai +short
# Expected: 192.168.68.135
```
**Test all configured domains:**
```bash
for domain in pihole jaeger langfuse ha code webhook; do
echo -n "$domain.temet.ai -> "
dig @localhost $domain.temet.ai +short
done
```
**Test from another device on the network:**
```bash
# Replace 192.168.68.135 with Pi's IP
dig @192.168.68.135 pihole.temet.ai +short
```
**Check Pi-hole DNS logs:**
```bash
docker exec pihole pihole -t
# Watch live DNS queries
```
### 3.5 Router DNS Reminder
**Important:** For DNS to work network-wide, configure your router:
1. Set router's DHCP to use Pi-hole as primary DNS:
- Primary DNS: `192.168.68.135` (Pi's IP)
- Secondary DNS: `1.1.1.1` (fallback)
2. Or configure each device individually to use Pi-hole DNS
**Verify device is using Pi-hole:**
```bash
# On the device, check what DNS server it's using
cat /etc/resolv.conf
# Should show: nameserver 192.168.68.135
```
## Supporting Files
| File | Purpose |
|------|---------|
| `references/reference.md` | DNS configuration deep-dive, Pi-hole internals, troubleshooting |
| `examples/examples.md` | Common scenarios and configurations |
| `scripts/verify-dns.sh` | DNS verification script |
## Expected Outcomes
**Success:**
- All domains resolve to correct IPs locally
- `dig @localhost domain.temet.ai` returns expected IP
- Services accessible at `https://domain.temet.ai` on local network
**Partial Success:**
- DNS works from Pi but not from other devices
- Cause: Router not configured to use Pi-hole as DNS
**Failure Indicators:**
- `dig` returns NXDOMAIN -> DNS entry not configured
- `dig` returns wrong IP -> Stale configuration
- Pi-hole not responding -> Container not running
## Requirements
**Environment:**
- Pi-hole container running: `docker ps | grep pihole`
- Docker Compose available
- domains.toml configured
**Tools needed:**
- Read (configuration files)
- Bash (dig, docker commands)
- Grep (parsing domains)
## Red Flags to Avoid
- [ ] Do not add DNS entries directly to Pi-hole web UI (use domains.toml)
- [ ] Do not forget to restart Pi-hole after config changes
- [ ] Do not skip the router DNS configuration reminder
- [ ] Do not use `127.0.0.1` as DNS IP (use actual Pi IP)
- [ ] Do not assume DNS propagates instantly (may take 1-2 minutes)
- [ ] Do not forget IoT devices may need different IPs (sprinkler -> 192.168.68.105)
## Notes
- DNS entries are stored in docker-compose.yml `FTLCONF_dns_hosts`
- The `generate-pihole-dns.py` script reads domains.toml and updates docker-compose.yml
- Local DNS resolution allows fast LAN access without internet roundtrip
- Remote access uses Cloudflare DNS (separate from Pi-hole)
- Always verify DNS after changes with `dig @localhost domain +short`
Related in Cloud & DevOps
appbuilder-action-scaffolder
IncludedCreate, implement, deploy, and debug Adobe Runtime actions with consistent layout, validation, and error handling. Use this skill whenever the user needs to add actions to an App Builder project, understand action structure (params, response format, web/raw actions), configure actions in the manifest, use App Builder SDKs (State, Files, Events, database), deploy and invoke actions via CLI, debug action issues, or implement patterns such as webhook receivers, custom event providers, journaling consumers, large payload redirects, action sequence pipelines, and Asset Compute workers. Also trigger when users mention serverless functions in Adobe context, action logging, IMS authentication for actions, or cron-style scheduled actions.
orchestrating-datacloud
IncludedSalesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows. Use this skill when the user needs a multi-step Data Cloud pipeline, cross-phase troubleshooting, or data space and data kit management. TRIGGER when: user needs a multi-step Data Cloud pipeline, asks to set up or troubleshoot Data Cloud across phases, manages data spaces or data kits, or wants a cross-phase sf data360 workflow. DO NOT TRIGGER when: work is isolated to a single phase (use the matching phase-specific skill), the task is STDM/session tracing/parquet telemetry (use observing-agentforce), standard CRM SOQL (use querying-soql), or Apex implementation (use generating-apex).
github-project-automation
IncludedAutomate GitHub repository setup with CI/CD workflows, issue templates, Dependabot, and CodeQL security scanning. Includes 12 production-tested workflows and prevents 18 errors: YAML syntax, action pinning, and configuration. Use when: setting up GitHub Actions CI/CD, creating issue/PR templates, enabling Dependabot or CodeQL scanning, deploying to Cloudflare Workers, implementing matrix testing, or troubleshooting YAML indentation, action version pinning, secrets syntax, runner versions, or CodeQL configuration. Keywords: github actions, github workflow, ci/cd, issue templates, pull request templates, dependabot, codeql, security scanning, yaml syntax, github automation, repository setup, workflow templates, github actions matrix, secrets management, branch protection, codeowners, github projects, continuous integration, continuous deployment, workflow syntax error, action version pinning, runner version, github context, yaml indentation error
sf-datacloud
IncludedSalesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows. TRIGGER when: user needs a multi-step Data Cloud pipeline, asks to set up or troubleshoot Data Cloud across phases, manages data spaces or data kits, or wants a cross-phase `sf data360` workflow. DO NOT TRIGGER when: work is isolated to a single phase (use the matching sf-datacloud-* skill), the task is STDM/session tracing/parquet telemetry (use sf-ai-agentforce-observability), standard CRM SOQL (use sf-soql), or Apex implementation (use sf-apex).
fabric-cli
IncludedUse this skill for Fabric.so CLI workflows with the `fabric` terminal command: diagnose/install/login, search or browse a Fabric library, save notes/links/files, create folders, ask the Fabric AI assistant, manage tasks/workspaces, generate shell completion, check subscription usage, produce JSON output, and use Fabric as persistent agent memory. Do not use for Microsoft Fabric/Azure/Power BI `fab`, Daniel Miessler's Fabric framework, Python Fabric SSH, Fabric.js, or textile/fashion fabric.
lark
IncludedLark/Feishu CLI skills: lark-cli operations for docs, markdown, sheets, base, calendar, im, mail, task, okr, drive, wiki, slides, whiteboard, apps, approval, attendance, contact, vc, minutes, event. Use when the user needs to operate Lark/Feishu resources via lark-cli, send messages, manage documents, spreadsheets, calendars, tasks, OKRs, deploy web pages, or any Feishu/Lark workspace operations.