@heytherevibin/skillforge 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/CODE_OF_CONDUCT.md +34 -0
- package/CONTRIBUTING.md +38 -0
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/RELEASING.md +93 -0
- package/SECURITY.md +31 -0
- package/STRATEGY.md +26 -0
- package/bin/cli.js +547 -0
- package/lib/packs.js +184 -0
- package/package.json +38 -0
- package/python/app/__init__.py +0 -0
- package/python/app/__pycache__/__init__.cpython-312.pyc +0 -0
- package/python/app/__pycache__/auth.cpython-312.pyc +0 -0
- package/python/app/__pycache__/main.cpython-312.pyc +0 -0
- package/python/app/auth.py +63 -0
- package/python/app/cli.py +78 -0
- package/python/app/db_paths.py +26 -0
- package/python/app/events_cli.py +175 -0
- package/python/app/main.py +647 -0
- package/python/app/materialize.py +138 -0
- package/python/app/mcp_server.py +610 -0
- package/python/app/route_cli.py +117 -0
- package/python/requirements-dev.txt +1 -0
- package/python/requirements.txt +7 -0
- package/python/tests/test_db_paths.py +41 -0
- package/skills/accessibility/SKILL.md +145 -0
- package/skills/agent-architecture-audit/SKILL.md +256 -0
- package/skills/agent-eval/SKILL.md +144 -0
- package/skills/agent-harness-construction/SKILL.md +72 -0
- package/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/skills/agent-payment-x402/SKILL.md +224 -0
- package/skills/agent-sort/SKILL.md +214 -0
- package/skills/agentic-engineering/SKILL.md +62 -0
- package/skills/agentic-os/SKILL.md +386 -0
- package/skills/ai-first-engineering/SKILL.md +50 -0
- package/skills/ai-regression-testing/SKILL.md +384 -0
- package/skills/android-clean-architecture/SKILL.md +338 -0
- package/skills/angular-developer/SKILL.md +153 -0
- package/skills/angular-developer/references/angular-animations.md +160 -0
- package/skills/angular-developer/references/angular-aria.md +410 -0
- package/skills/angular-developer/references/cli.md +86 -0
- package/skills/angular-developer/references/component-harnesses.md +59 -0
- package/skills/angular-developer/references/component-styling.md +91 -0
- package/skills/angular-developer/references/components.md +117 -0
- package/skills/angular-developer/references/creating-services.md +97 -0
- package/skills/angular-developer/references/data-resolvers.md +69 -0
- package/skills/angular-developer/references/define-routes.md +67 -0
- package/skills/angular-developer/references/defining-providers.md +72 -0
- package/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/skills/angular-developer/references/e2e-testing.md +56 -0
- package/skills/angular-developer/references/effects.md +83 -0
- package/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/skills/angular-developer/references/host-elements.md +80 -0
- package/skills/angular-developer/references/injection-context.md +63 -0
- package/skills/angular-developer/references/inputs.md +101 -0
- package/skills/angular-developer/references/linked-signal.md +59 -0
- package/skills/angular-developer/references/loading-strategies.md +61 -0
- package/skills/angular-developer/references/mcp.md +108 -0
- package/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/skills/angular-developer/references/outputs.md +86 -0
- package/skills/angular-developer/references/reactive-forms.md +122 -0
- package/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/skills/angular-developer/references/resource.md +77 -0
- package/skills/angular-developer/references/route-animations.md +56 -0
- package/skills/angular-developer/references/route-guards.md +52 -0
- package/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/skills/angular-developer/references/router-testing.md +87 -0
- package/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/skills/angular-developer/references/signal-forms.md +795 -0
- package/skills/angular-developer/references/signals-overview.md +94 -0
- package/skills/angular-developer/references/tailwind-css.md +69 -0
- package/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/skills/api-connector-builder/SKILL.md +120 -0
- package/skills/api-design/SKILL.md +522 -0
- package/skills/architecture-decision-records/SKILL.md +178 -0
- package/skills/article-writing/SKILL.md +78 -0
- package/skills/automation-audit-ops/SKILL.md +141 -0
- package/skills/autonomous-agent-harness/SKILL.md +272 -0
- package/skills/autonomous-loops/SKILL.md +609 -0
- package/skills/backend-patterns/SKILL.md +560 -0
- package/skills/benchmark/SKILL.md +92 -0
- package/skills/blueprint/SKILL.md +104 -0
- package/skills/browser-qa/SKILL.md +86 -0
- package/skills/bun-runtime/SKILL.md +83 -0
- package/skills/canary-watch/SKILL.md +98 -0
- package/skills/carrier-relationship-management/SKILL.md +211 -0
- package/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/skills/ck/SKILL.md +147 -0
- package/skills/ck/commands/forget.mjs +44 -0
- package/skills/ck/commands/info.mjs +24 -0
- package/skills/ck/commands/init.mjs +143 -0
- package/skills/ck/commands/list.mjs +40 -0
- package/skills/ck/commands/migrate.mjs +202 -0
- package/skills/ck/commands/resume.mjs +36 -0
- package/skills/ck/commands/save.mjs +210 -0
- package/skills/ck/commands/shared.mjs +387 -0
- package/skills/ck/hooks/session-start.mjs +224 -0
- package/skills/claude-devfleet/SKILL.md +103 -0
- package/skills/click-path-audit/SKILL.md +244 -0
- package/skills/clickhouse-io/SKILL.md +438 -0
- package/skills/code-tour/SKILL.md +235 -0
- package/skills/codebase-onboarding/SKILL.md +232 -0
- package/skills/coding-standards/SKILL.md +548 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +298 -0
- package/skills/connections-optimizer/SKILL.md +188 -0
- package/skills/content-engine/SKILL.md +126 -0
- package/skills/content-hash-cache-pattern/SKILL.md +160 -0
- package/skills/context-budget/SKILL.md +134 -0
- package/skills/continuous-agent-loop/SKILL.md +44 -0
- package/skills/continuous-learning/SKILL.md +129 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +69 -0
- package/skills/continuous-learning-v2/SKILL.md +358 -0
- package/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
- package/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
- package/skills/continuous-learning-v2/config.json +8 -0
- package/skills/continuous-learning-v2/hooks/observe.sh +476 -0
- package/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
- package/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
- package/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
- package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
- package/skills/cost-aware-llm-pipeline/SKILL.md +182 -0
- package/skills/cost-tracking/SKILL.md +147 -0
- package/skills/council/SKILL.md +202 -0
- package/skills/cpp-coding-standards/SKILL.md +722 -0
- package/skills/cpp-testing/SKILL.md +323 -0
- package/skills/crosspost/SKILL.md +110 -0
- package/skills/csharp-testing/SKILL.md +320 -0
- package/skills/customer-billing-ops/SKILL.md +139 -0
- package/skills/customs-trade-compliance/SKILL.md +262 -0
- package/skills/dart-flutter-patterns/SKILL.md +562 -0
- package/skills/dashboard-builder/SKILL.md +108 -0
- package/skills/data-scraper-agent/SKILL.md +764 -0
- package/skills/database-migrations/SKILL.md +428 -0
- package/skills/deep-research/SKILL.md +158 -0
- package/skills/defi-amm-security/SKILL.md +166 -0
- package/skills/deployment-patterns/SKILL.md +426 -0
- package/skills/design-system/SKILL.md +81 -0
- package/skills/django-celery/SKILL.md +456 -0
- package/skills/django-patterns/SKILL.md +733 -0
- package/skills/django-security/SKILL.md +592 -0
- package/skills/django-tdd/SKILL.md +728 -0
- package/skills/django-verification/SKILL.md +468 -0
- package/skills/dmux-workflows/SKILL.md +190 -0
- package/skills/docker-patterns/SKILL.md +363 -0
- package/skills/documentation-lookup/SKILL.md +89 -0
- package/skills/dotnet-patterns/SKILL.md +320 -0
- package/skills/e2e-testing/SKILL.md +325 -0
- package/skills/email-ops/SKILL.md +120 -0
- package/skills/energy-procurement/SKILL.md +227 -0
- package/skills/enterprise-agent-ops/SKILL.md +49 -0
- package/skills/error-handling/SKILL.md +375 -0
- package/skills/eval-harness/SKILL.md +269 -0
- package/skills/evm-token-decimals/SKILL.md +130 -0
- package/skills/exa-search/SKILL.md +106 -0
- package/skills/fal-ai-media/SKILL.md +287 -0
- package/skills/fastapi-patterns/SKILL.md +327 -0
- package/skills/finance-billing-ops/SKILL.md +126 -0
- package/skills/flox-environments/SKILL.md +496 -0
- package/skills/flutter-dart-code-review/SKILL.md +434 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/frontend-design-direction/SKILL.md +92 -0
- package/skills/frontend-patterns/SKILL.md +641 -0
- package/skills/frontend-slides/SKILL.md +183 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/frontend-slides/animation-patterns.md +122 -0
- package/skills/frontend-slides/html-template.md +419 -0
- package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/fsharp-testing/SKILL.md +279 -0
- package/skills/gan-style-harness/SKILL.md +278 -0
- package/skills/gateguard/SKILL.md +125 -0
- package/skills/git-workflow/SKILL.md +714 -0
- package/skills/github-ops/SKILL.md +143 -0
- package/skills/golang-patterns/SKILL.md +673 -0
- package/skills/golang-testing/SKILL.md +719 -0
- package/skills/google-workspace-ops/SKILL.md +94 -0
- package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/skills/hermes-imports/SKILL.md +87 -0
- package/skills/hexagonal-architecture/SKILL.md +275 -0
- package/skills/hipaa-compliance/SKILL.md +78 -0
- package/skills/homelab-network-readiness/SKILL.md +169 -0
- package/skills/homelab-network-setup/SKILL.md +129 -0
- package/skills/homelab-pihole-dns/SKILL.md +274 -0
- package/skills/homelab-vlan-segmentation/SKILL.md +311 -0
- package/skills/homelab-wireguard-vpn/SKILL.md +305 -0
- package/skills/hookify-rules/SKILL.md +128 -0
- package/skills/inventory-demand-planning/SKILL.md +246 -0
- package/skills/investor-materials/SKILL.md +95 -0
- package/skills/investor-outreach/SKILL.md +90 -0
- package/skills/ios-icon-gen/SKILL.md +157 -0
- package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/skills/iterative-retrieval/SKILL.md +209 -0
- package/skills/java-coding-standards/SKILL.md +382 -0
- package/skills/jira-integration/SKILL.md +292 -0
- package/skills/jpa-patterns/SKILL.md +150 -0
- package/skills/knowledge-ops/SKILL.md +153 -0
- package/skills/kotlin-coroutines-flows/SKILL.md +283 -0
- package/skills/kotlin-exposed-patterns/SKILL.md +718 -0
- package/skills/kotlin-ktor-patterns/SKILL.md +688 -0
- package/skills/kotlin-patterns/SKILL.md +710 -0
- package/skills/kotlin-testing/SKILL.md +823 -0
- package/skills/laravel-patterns/SKILL.md +414 -0
- package/skills/laravel-plugin-discovery/SKILL.md +228 -0
- package/skills/laravel-security/SKILL.md +284 -0
- package/skills/laravel-tdd/SKILL.md +282 -0
- package/skills/laravel-verification/SKILL.md +178 -0
- package/skills/lead-intelligence/SKILL.md +320 -0
- package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/skills/logistics-exception-management/SKILL.md +221 -0
- package/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/skills/manim-video/SKILL.md +88 -0
- package/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/skills/market-research/SKILL.md +74 -0
- package/skills/mcp-server-patterns/SKILL.md +68 -0
- package/skills/messages-ops/SKILL.md +103 -0
- package/skills/mle-workflow/SKILL.md +345 -0
- package/skills/motion-advanced/SKILL.md +596 -0
- package/skills/motion-foundations/SKILL.md +299 -0
- package/skills/motion-patterns/SKILL.md +435 -0
- package/skills/motion-ui/SKILL.md +574 -0
- package/skills/mysql-patterns/SKILL.md +411 -0
- package/skills/nanoclaw-repl/SKILL.md +32 -0
- package/skills/nestjs-patterns/SKILL.md +229 -0
- package/skills/netmiko-ssh-automation/SKILL.md +173 -0
- package/skills/network-bgp-diagnostics/SKILL.md +167 -0
- package/skills/network-config-validation/SKILL.md +210 -0
- package/skills/network-interface-health/SKILL.md +152 -0
- package/skills/nextjs-turbopack/SKILL.md +43 -0
- package/skills/nodejs-keccak256/SKILL.md +102 -0
- package/skills/nutrient-document-processing/SKILL.md +166 -0
- package/skills/nuxt4-patterns/SKILL.md +99 -0
- package/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/skills/openclaw-persona-forge/gacha.py +224 -0
- package/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/skills/opensource-pipeline/SKILL.md +254 -0
- package/skills/perl-patterns/SKILL.md +503 -0
- package/skills/perl-security/SKILL.md +502 -0
- package/skills/perl-testing/SKILL.md +474 -0
- package/skills/plan-orchestrate/SKILL.md +253 -0
- package/skills/plankton-code-quality/SKILL.md +236 -0
- package/skills/postgres-patterns/SKILL.md +146 -0
- package/skills/product-capability/SKILL.md +140 -0
- package/skills/product-lens/SKILL.md +91 -0
- package/skills/production-audit/SKILL.md +206 -0
- package/skills/production-scheduling/SKILL.md +237 -0
- package/skills/project-flow-ops/SKILL.md +110 -0
- package/skills/prompt-optimizer/SKILL.md +398 -0
- package/skills/python-patterns/SKILL.md +749 -0
- package/skills/python-testing/SKILL.md +815 -0
- package/skills/pytorch-patterns/SKILL.md +395 -0
- package/skills/quality-nonconformance/SKILL.md +259 -0
- package/skills/quarkus-patterns/SKILL.md +721 -0
- package/skills/quarkus-security/SKILL.md +466 -0
- package/skills/quarkus-tdd/SKILL.md +810 -0
- package/skills/quarkus-verification/SKILL.md +478 -0
- package/skills/ralphinho-rfc-pipeline/SKILL.md +66 -0
- package/skills/redis-patterns/SKILL.md +402 -0
- package/skills/regex-vs-llm-structured-text/SKILL.md +219 -0
- package/skills/remotion-video-creation/SKILL.md +43 -0
- package/skills/remotion-video-creation/rules/3d.md +86 -0
- package/skills/remotion-video-creation/rules/animations.md +29 -0
- package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/skills/remotion-video-creation/rules/assets.md +78 -0
- package/skills/remotion-video-creation/rules/audio.md +172 -0
- package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/skills/remotion-video-creation/rules/charts.md +58 -0
- package/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/skills/remotion-video-creation/rules/images.md +130 -0
- package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/skills/remotion-video-creation/rules/timing.md +179 -0
- package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/skills/remotion-video-creation/rules/videos.md +171 -0
- package/skills/repo-scan/SKILL.md +78 -0
- package/skills/research-ops/SKILL.md +111 -0
- package/skills/returns-reverse-logistics/SKILL.md +239 -0
- package/skills/rules-distill/SKILL.md +263 -0
- package/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/skills/rust-patterns/SKILL.md +498 -0
- package/skills/rust-testing/SKILL.md +499 -0
- package/skills/safety-guard/SKILL.md +74 -0
- package/skills/santa-method/SKILL.md +306 -0
- package/skills/scientific-db-pubmed-database/SKILL.md +175 -0
- package/skills/scientific-db-uspto-database/SKILL.md +177 -0
- package/skills/scientific-pkg-gget/SKILL.md +166 -0
- package/skills/scientific-thinking-literature-review/SKILL.md +192 -0
- package/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
- package/skills/search-first/SKILL.md +181 -0
- package/skills/security-bounty-hunter/SKILL.md +99 -0
- package/skills/security-review/SKILL.md +502 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/seo/SKILL.md +153 -0
- package/skills/skill-comply/SKILL.md +57 -0
- package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/skills/skill-comply/prompts/classifier.md +24 -0
- package/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/skills/skill-comply/pyproject.toml +15 -0
- package/skills/skill-comply/scripts/__init__.py +0 -0
- package/skills/skill-comply/scripts/classifier.py +85 -0
- package/skills/skill-comply/scripts/grader.py +124 -0
- package/skills/skill-comply/scripts/parser.py +107 -0
- package/skills/skill-comply/scripts/report.py +170 -0
- package/skills/skill-comply/scripts/run.py +127 -0
- package/skills/skill-comply/scripts/runner.py +186 -0
- package/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/skills/skill-comply/scripts/utils.py +13 -0
- package/skills/skill-comply/tests/test_grader.py +197 -0
- package/skills/skill-comply/tests/test_parser.py +90 -0
- package/skills/skill-comply/tests/test_runner.py +172 -0
- package/skills/skill-scout/SKILL.md +139 -0
- package/skills/skill-stocktake/SKILL.md +193 -0
- package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/skills/social-graph-ranker/SKILL.md +153 -0
- package/skills/springboot-patterns/SKILL.md +313 -0
- package/skills/springboot-security/SKILL.md +271 -0
- package/skills/springboot-tdd/SKILL.md +157 -0
- package/skills/springboot-verification/SKILL.md +230 -0
- package/skills/strategic-compact/SKILL.md +129 -0
- package/skills/strategic-compact/suggest-compact.sh +54 -0
- package/skills/swift-actor-persistence/SKILL.md +142 -0
- package/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/swift-protocol-di-testing/SKILL.md +189 -0
- package/skills/swiftui-patterns/SKILL.md +259 -0
- package/skills/tdd-workflow/SKILL.md +462 -0
- package/skills/team-builder/SKILL.md +166 -0
- package/skills/terminal-ops/SKILL.md +108 -0
- package/skills/tinystruct-patterns/SKILL.md +130 -0
- package/skills/tinystruct-patterns/references/architecture.md +77 -0
- package/skills/tinystruct-patterns/references/data-handling.md +35 -0
- package/skills/tinystruct-patterns/references/routing.md +57 -0
- package/skills/tinystruct-patterns/references/system-usage.md +74 -0
- package/skills/tinystruct-patterns/references/testing.md +59 -0
- package/skills/token-budget-advisor/SKILL.md +133 -0
- package/skills/ui-demo/SKILL.md +464 -0
- package/skills/ui-to-vue/SKILL.md +134 -0
- package/skills/unified-notifications-ops/SKILL.md +186 -0
- package/skills/verification-loop/SKILL.md +125 -0
- package/skills/video-editing/SKILL.md +309 -0
- package/skills/videodb/SKILL.md +373 -0
- package/skills/videodb/reference/api-reference.md +550 -0
- package/skills/videodb/reference/capture-reference.md +407 -0
- package/skills/videodb/reference/capture.md +101 -0
- package/skills/videodb/reference/editor.md +443 -0
- package/skills/videodb/reference/generative.md +331 -0
- package/skills/videodb/reference/rtstream-reference.md +564 -0
- package/skills/videodb/reference/rtstream.md +65 -0
- package/skills/videodb/reference/search.md +230 -0
- package/skills/videodb/reference/streaming.md +406 -0
- package/skills/videodb/reference/use-cases.md +118 -0
- package/skills/videodb/scripts/ws_listener.py +282 -0
- package/skills/visa-doc-translate/README.md +86 -0
- package/skills/visa-doc-translate/SKILL.md +117 -0
- package/skills/vite-patterns/SKILL.md +448 -0
- package/skills/windows-desktop-e2e/SKILL.md +787 -0
- package/skills/workspace-surface-audit/SKILL.md +124 -0
- package/skills/x-api/SKILL.md +233 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: homelab-pihole-dns
|
|
3
|
+
description: Pi-hole installation, blocklist management, DNS-over-HTTPS setup, DHCP integration, local DNS records, and troubleshooting broken DNS resolution on a home network.
|
|
4
|
+
origin: community
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Homelab Pi-hole DNS
|
|
8
|
+
|
|
9
|
+
Pi-hole is a network-wide DNS ad blocker that runs on a Raspberry Pi or any Linux host.
|
|
10
|
+
Every device on your network gets ad and malware domain blocking automatically — no browser
|
|
11
|
+
extension needed.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- Installing Pi-hole on a Raspberry Pi or Linux host
|
|
16
|
+
- Configuring Pi-hole as the DNS server for a home network
|
|
17
|
+
- Adding or managing blocklists
|
|
18
|
+
- Setting up DNS-over-HTTPS (DoH) upstream resolvers
|
|
19
|
+
- Creating local DNS records (e.g. `nas.home.lan`, `pi.home.lan`)
|
|
20
|
+
- Troubleshooting devices that lose internet access after Pi-hole is installed
|
|
21
|
+
- Running Pi-hole alongside or instead of DHCP
|
|
22
|
+
|
|
23
|
+
## How Pi-hole Works
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Normal flow (without Pi-hole):
|
|
27
|
+
Device → requests ads.tracker.com → ISP DNS → real IP → ads load
|
|
28
|
+
|
|
29
|
+
With Pi-hole:
|
|
30
|
+
Device → requests ads.tracker.com → Pi-hole DNS → blocked (returns 0.0.0.0) → no ad
|
|
31
|
+
|
|
32
|
+
All DNS queries go through Pi-hole first.
|
|
33
|
+
Pi-hole checks against blocklists.
|
|
34
|
+
Blocked domains return a null response — the ad/tracker never loads.
|
|
35
|
+
Allowed domains get forwarded to your upstream resolver (Cloudflare, Google, etc.).
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
### Docker (Recommended)
|
|
41
|
+
|
|
42
|
+
Docker is the easiest way to install Pi-hole and makes updates and backups
|
|
43
|
+
straightforward.
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
# docker-compose.yml
|
|
47
|
+
services:
|
|
48
|
+
pihole:
|
|
49
|
+
image: pihole/pihole:<pinned-release-tag>
|
|
50
|
+
container_name: pihole
|
|
51
|
+
ports:
|
|
52
|
+
- "53:53/tcp"
|
|
53
|
+
- "53:53/udp"
|
|
54
|
+
- "80:80/tcp" # Web admin
|
|
55
|
+
environment:
|
|
56
|
+
TZ: "America/New_York"
|
|
57
|
+
WEBPASSWORD: "${PIHOLE_WEBPASSWORD}" # set via .env file or secret
|
|
58
|
+
PIHOLE_DNS_: "1.1.1.1;1.0.0.1"
|
|
59
|
+
DNSMASQ_LISTENING: "all"
|
|
60
|
+
volumes:
|
|
61
|
+
- "./etc-pihole:/etc/pihole"
|
|
62
|
+
- "./etc-dnsmasq.d:/etc/dnsmasq.d"
|
|
63
|
+
restart: unless-stopped
|
|
64
|
+
cap_add:
|
|
65
|
+
- NET_ADMIN # only needed if Pi-hole will serve DHCP
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Replace `<pinned-release-tag>` with a current Pi-hole release tag before deploying.
|
|
69
|
+
Avoid `latest` for long-lived DNS infrastructure so upgrades are deliberate and
|
|
70
|
+
reviewable.
|
|
71
|
+
|
|
72
|
+
Set `PIHOLE_WEBPASSWORD` in a `.env` file next to `docker-compose.yml`, chmod it to
|
|
73
|
+
`600`, and keep it out of git — do not put the password directly in the compose file.
|
|
74
|
+
|
|
75
|
+
Access web admin at: `http://<pi-ip>/admin`
|
|
76
|
+
|
|
77
|
+
### Bare-Metal Install (Raspberry Pi OS / Debian / Ubuntu)
|
|
78
|
+
|
|
79
|
+
Pi-hole requires a static IP before installing.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Step 1: Assign a static IP (edit /etc/dhcpcd.conf on Pi OS)
|
|
83
|
+
sudo nano /etc/dhcpcd.conf
|
|
84
|
+
# Add at the bottom:
|
|
85
|
+
interface eth0
|
|
86
|
+
static ip_address=192.168.3.2/24
|
|
87
|
+
static routers=192.168.3.1
|
|
88
|
+
static domain_name_servers=192.168.3.1
|
|
89
|
+
|
|
90
|
+
# Step 2: Download and inspect the installer before running it.
|
|
91
|
+
# Prefer the package or installer path documented by Pi-hole for your OS/version.
|
|
92
|
+
curl -sSL https://install.pi-hole.net -o pi-hole-install.sh
|
|
93
|
+
less pi-hole-install.sh # review before proceeding
|
|
94
|
+
|
|
95
|
+
# Step 3: Run
|
|
96
|
+
bash pi-hole-install.sh
|
|
97
|
+
|
|
98
|
+
# Follow the interactive installer:
|
|
99
|
+
# 1. Select network interface (eth0 for wired — recommended)
|
|
100
|
+
# 2. Select upstream DNS (Cloudflare or leave default — can change later)
|
|
101
|
+
# 3. Confirm static IP
|
|
102
|
+
# 4. Install the web admin interface (recommended)
|
|
103
|
+
# 5. Note the admin password shown at the end
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Pointing Your Network at Pi-hole
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
# Method 1: Change DNS in your router DHCP settings (recommended)
|
|
110
|
+
Router admin UI → DHCP Settings → DNS Server
|
|
111
|
+
Primary DNS: 192.168.3.2 (Pi-hole IP)
|
|
112
|
+
Secondary DNS: leave blank for strict blocking, or use a second Pi-hole.
|
|
113
|
+
A public fallback such as 1.1.1.1 improves availability during
|
|
114
|
+
rollout but can bypass blocking because clients may query it.
|
|
115
|
+
|
|
116
|
+
All devices get Pi-hole as DNS automatically on next DHCP renewal.
|
|
117
|
+
Force renewal: reconnect Wi-Fi or run 'sudo dhclient -r && sudo dhclient' on Linux
|
|
118
|
+
|
|
119
|
+
# Method 2: Per-device DNS (useful for testing before network-wide rollout)
|
|
120
|
+
Windows: Control Panel → Network Adapter → IPv4 Properties → set DNS manually
|
|
121
|
+
macOS: System Settings → Network → Details → DNS → set manually
|
|
122
|
+
Linux: /etc/resolv.conf or NetworkManager
|
|
123
|
+
|
|
124
|
+
# Method 3: Pi-hole as DHCP server (replaces router DHCP)
|
|
125
|
+
Pi-hole admin → Settings → DHCP → Enable
|
|
126
|
+
Disable DHCP on your router first — two DHCP servers on the same network cause conflicts
|
|
127
|
+
Advantage: hostname resolution works automatically (devices register their names)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Blocklist Management
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
# Pi-hole admin → Adlists → Add new adlist
|
|
134
|
+
|
|
135
|
+
# Recommended blocklists:
|
|
136
|
+
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
|
|
137
|
+
# default — 200k+ domains
|
|
138
|
+
|
|
139
|
+
https://blocklistproject.github.io/Lists/malware.txt
|
|
140
|
+
# malware domains
|
|
141
|
+
|
|
142
|
+
https://blocklistproject.github.io/Lists/tracking.txt
|
|
143
|
+
# tracking/telemetry
|
|
144
|
+
|
|
145
|
+
# After adding a list:
|
|
146
|
+
Tools → Update Gravity (downloads and compiles all blocklists)
|
|
147
|
+
|
|
148
|
+
# If a site is blocked that should not be (false positive):
|
|
149
|
+
Pi-hole admin → Whitelist → Add domain
|
|
150
|
+
Example: api.my-legitimate-service.com
|
|
151
|
+
|
|
152
|
+
# Check what is being blocked in real time:
|
|
153
|
+
Dashboard → Query Log (live DNS query stream with block/allow status)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## DNS-over-HTTPS Upstream
|
|
157
|
+
|
|
158
|
+
DNS-over-HTTPS encrypts your DNS queries so your ISP cannot see what sites you resolve.
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Install cloudflared (Cloudflare's DoH proxy).
|
|
162
|
+
# Prefer Cloudflare's package repository for automatic signed package verification.
|
|
163
|
+
# If you download a binary directly, pin a release version and verify its checksum.
|
|
164
|
+
CLOUDFLARED_VERSION="<pinned-version>"
|
|
165
|
+
curl -LO "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64"
|
|
166
|
+
# Verify the checksum/signature from Cloudflare's release notes before installing.
|
|
167
|
+
sudo mv cloudflared-linux-arm64 /usr/local/bin/cloudflared
|
|
168
|
+
sudo chmod +x /usr/local/bin/cloudflared
|
|
169
|
+
|
|
170
|
+
# Create cloudflared config
|
|
171
|
+
sudo mkdir -p /etc/cloudflared
|
|
172
|
+
sudo tee /etc/cloudflared/config.yml << EOF
|
|
173
|
+
proxy-dns: true
|
|
174
|
+
proxy-dns-port: 5053
|
|
175
|
+
proxy-dns-upstream:
|
|
176
|
+
- https://1.1.1.1/dns-query
|
|
177
|
+
- https://1.0.0.1/dns-query
|
|
178
|
+
EOF
|
|
179
|
+
|
|
180
|
+
# Create systemd service
|
|
181
|
+
sudo cloudflared service install
|
|
182
|
+
sudo systemctl start cloudflared
|
|
183
|
+
sudo systemctl enable cloudflared
|
|
184
|
+
|
|
185
|
+
# Now point Pi-hole at the local DoH proxy:
|
|
186
|
+
# Pi-hole admin → Settings → DNS → Custom upstream DNS
|
|
187
|
+
# Set to: 127.0.0.1#5053
|
|
188
|
+
# Uncheck all other upstream resolvers
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Local DNS Records
|
|
192
|
+
|
|
193
|
+
Make your services reachable by name (e.g. `nas.home.lan`, `grafana.home.lan`).
|
|
194
|
+
|
|
195
|
+
> **Domain name note:** `.home.lan` is widely used in homelabs and works in practice.
|
|
196
|
+
> The IETF-reserved suffix for local use is `.home.arpa` (RFC 8375) — use that to
|
|
197
|
+
> follow the standard. Avoid `.local` for Pi-hole DNS records as it conflicts with
|
|
198
|
+
> mDNS/Bonjour.
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
# Pi-hole admin → Local DNS → DNS Records
|
|
202
|
+
|
|
203
|
+
Domain IP
|
|
204
|
+
nas.home.lan 192.168.30.10
|
|
205
|
+
pi.home.lan 192.168.30.2
|
|
206
|
+
grafana.home.lan 192.168.30.3
|
|
207
|
+
proxmox.home.lan 192.168.30.4
|
|
208
|
+
|
|
209
|
+
# From any device on your network:
|
|
210
|
+
ping nas.home.lan → 192.168.30.10
|
|
211
|
+
http://grafana.home.lan → your Grafana dashboard
|
|
212
|
+
|
|
213
|
+
# For subdomains, add a CNAME:
|
|
214
|
+
Pi-hole admin → Local DNS → CNAME Records
|
|
215
|
+
Domain: portainer.home.lan → Target: pi.home.lan
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Troubleshooting
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Pi-hole blocking something it should not
|
|
222
|
+
pihole -q example.com # Check if domain is blocked and which list
|
|
223
|
+
pihole -w example.com # Whitelist immediately
|
|
224
|
+
|
|
225
|
+
# DNS not resolving at all
|
|
226
|
+
pihole status # Check if pihole-FTL is running
|
|
227
|
+
dig @192.168.3.2 google.com # Test DNS directly against Pi-hole
|
|
228
|
+
|
|
229
|
+
# Restart Pi-hole DNS
|
|
230
|
+
pihole restartdns
|
|
231
|
+
|
|
232
|
+
# Check query logs for a specific device
|
|
233
|
+
pihole -t # Live tail of all queries
|
|
234
|
+
# Or filter by client in the web admin Query Log
|
|
235
|
+
|
|
236
|
+
# Pi-hole gravity update (refresh blocklists)
|
|
237
|
+
pihole -g
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Anti-Patterns
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
# BAD: Depending on one Pi-hole without a recovery path
|
|
244
|
+
# If Pi-hole crashes or the Pi loses power, DNS can stop working
|
|
245
|
+
# GOOD: Keep a documented router fallback for rollback during setup
|
|
246
|
+
# BETTER: Run two Pi-hole instances for redundancy; avoid public fallback DNS for strict blocking
|
|
247
|
+
|
|
248
|
+
# BAD: Installing Pi-hole without a static IP
|
|
249
|
+
# If the Pi gets a new DHCP IP, all devices lose DNS
|
|
250
|
+
# GOOD: Set static IP first, then install Pi-hole
|
|
251
|
+
|
|
252
|
+
# BAD: Enabling Pi-hole DHCP without disabling the router's DHCP first
|
|
253
|
+
# Two DHCP servers on the same network hand out conflicting IPs
|
|
254
|
+
# GOOD: Disable router DHCP, then enable Pi-hole DHCP
|
|
255
|
+
|
|
256
|
+
# BAD: Never updating gravity (blocklists)
|
|
257
|
+
# New ad and malware domains accumulate — stale lists miss them
|
|
258
|
+
# GOOD: Schedule weekly gravity update: pihole -g (or enable in Settings → API)
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Best Practices
|
|
262
|
+
|
|
263
|
+
- Give the Pi a static IP or DHCP reservation before installing Pi-hole
|
|
264
|
+
- Use Pi-hole as primary DNS; for redundancy, add a second Pi-hole instead of a
|
|
265
|
+
public resolver if you need strict blocking
|
|
266
|
+
- Enable DoH (DNS-over-HTTPS) with cloudflared for encrypted upstream queries
|
|
267
|
+
- Set `home.lan` as your local domain and create DNS records for all your services
|
|
268
|
+
- Review the Query Log occasionally — blocked queries show you what devices are doing
|
|
269
|
+
|
|
270
|
+
## Related Skills
|
|
271
|
+
|
|
272
|
+
- homelab-network-setup
|
|
273
|
+
- homelab-vlan-segmentation
|
|
274
|
+
- homelab-wireguard-vpn
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: homelab-vlan-segmentation
|
|
3
|
+
description: Segmenting home networks into VLANs for IoT, guest, trusted, and server traffic using UniFi, pfSense/OPNsense, and MikroTik — including switch trunk config, firewall rules, and wireless SSID mapping.
|
|
4
|
+
origin: community
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Homelab VLAN Segmentation
|
|
8
|
+
|
|
9
|
+
How to split a home network into isolated VLANs so IoT devices, guests, and your main
|
|
10
|
+
PCs cannot talk to each other. The most impactful security upgrade for a home network.
|
|
11
|
+
|
|
12
|
+
All firewall rules shown here add isolation between segments — they do not remove
|
|
13
|
+
existing protections. Apply changes in a maintenance window and verify connectivity
|
|
14
|
+
between segments after each step before moving on.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
- Setting up VLANs on a home network for the first time
|
|
19
|
+
- Isolating IoT devices (smart bulbs, cameras, TVs) from trusted devices
|
|
20
|
+
- Creating a guest Wi-Fi network that cannot reach home devices
|
|
21
|
+
- Explaining how VLANs work to someone unfamiliar with the concept
|
|
22
|
+
- Configuring trunk ports, access ports, and SSID-to-VLAN mapping
|
|
23
|
+
- Troubleshooting inter-VLAN routing or firewall rule issues on pfSense/OPNsense/UniFi
|
|
24
|
+
|
|
25
|
+
## How It Works
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Without VLANs — flat network:
|
|
29
|
+
All devices on 192.168.1.0/24
|
|
30
|
+
Smart TV (potential malware) → can reach your NAS, PCs, everything
|
|
31
|
+
|
|
32
|
+
With VLANs:
|
|
33
|
+
VLAN 10 — Trusted 192.168.10.0/24 (PCs, phones, laptops)
|
|
34
|
+
VLAN 20 — IoT 192.168.20.0/24 (smart TV, bulbs, cameras)
|
|
35
|
+
VLAN 30 — Servers 192.168.30.0/24 (NAS, Pi, VMs)
|
|
36
|
+
VLAN 40 — Guest 192.168.40.0/24 (visitor Wi-Fi)
|
|
37
|
+
VLAN 99 — Management 192.168.99.0/24 (switch/AP web UIs)
|
|
38
|
+
|
|
39
|
+
Smart TV → blocked from reaching 192.168.10.0/24 and 192.168.30.0/24
|
|
40
|
+
Guests → internet only, cannot see any home devices
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## VLAN Design Template
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
VLAN Name Subnet Gateway Purpose
|
|
47
|
+
10 trusted 192.168.10.0/24 192.168.10.1 PCs, phones, laptops
|
|
48
|
+
20 iot 192.168.20.0/24 192.168.20.1 Smart home devices
|
|
49
|
+
30 servers 192.168.30.0/24 192.168.30.1 NAS, Pi, self-hosted
|
|
50
|
+
40 guest 192.168.40.0/24 192.168.40.1 Visitor Wi-Fi
|
|
51
|
+
99 management 192.168.99.0/24 192.168.99.1 Network gear web UIs
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Examples
|
|
55
|
+
|
|
56
|
+
**Typical homelab with UniFi AP and managed switch:**
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Scenario: 3-bedroom house, UniFi Dream Machine + UniFi 8-port switch + 2 APs
|
|
60
|
+
|
|
61
|
+
VLAN 10 — Trusted 192.168.10.0/24 MacBook, iPhones, iPad
|
|
62
|
+
VLAN 20 — IoT 192.168.20.0/24 Nest thermostat, Philips Hue, Ring doorbell, smart TVs
|
|
63
|
+
VLAN 30 — Servers 192.168.30.0/24 Synology NAS (192.168.30.10), Pi-hole (192.168.30.2)
|
|
64
|
+
VLAN 40 — Guest 192.168.40.0/24 Visitor Wi-Fi — internet only
|
|
65
|
+
|
|
66
|
+
SSID → VLAN mapping:
|
|
67
|
+
"Home" → VLAN 10 (WPA2, strong password, trusted devices only)
|
|
68
|
+
"IoT" → VLAN 20 (WPA2, separate password, printed on router for setup)
|
|
69
|
+
"Guest" → VLAN 40 (WPA2, simple password you can share freely)
|
|
70
|
+
|
|
71
|
+
Switch port behavior:
|
|
72
|
+
Port 1 → trunk to router (tagged VLANs 10,20,30,40,99)
|
|
73
|
+
Port 2 → trunk to APs (tagged VLANs 10,20,40; AP handles per-SSID tagging)
|
|
74
|
+
Port 3 → access VLAN 30 (NAS — untagged, no VLAN awareness needed)
|
|
75
|
+
Port 4 → access VLAN 30 (Pi-hole — untagged)
|
|
76
|
+
Port 5–8 → access VLAN 10 (wired workstations)
|
|
77
|
+
|
|
78
|
+
Firewall rules applied (all rules add isolation, none remove existing protections):
|
|
79
|
+
IoT → Trusted: BLOCK
|
|
80
|
+
IoT → Servers: BLOCK except 192.168.30.2:53 (Pi-hole DNS allowed)
|
|
81
|
+
IoT → Internet: ALLOW
|
|
82
|
+
Guest → Local networks: BLOCK
|
|
83
|
+
Guest → Internet: ALLOW
|
|
84
|
+
Trusted → everywhere: ALLOW
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## UniFi Configuration
|
|
88
|
+
|
|
89
|
+
### Create Networks in UniFi Controller
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Settings → Networks → Create New Network
|
|
93
|
+
|
|
94
|
+
For each VLAN:
|
|
95
|
+
Name: IoT
|
|
96
|
+
Purpose: Corporate (gives DHCP + routing)
|
|
97
|
+
VLAN ID: 20
|
|
98
|
+
Network: 192.168.20.0/24
|
|
99
|
+
Gateway IP: 192.168.20.1
|
|
100
|
+
DHCP: Enable
|
|
101
|
+
DHCP Range: 192.168.20.100 – 192.168.20.254
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Map SSIDs to VLANs (UniFi)
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
Settings → WiFi → Create New WiFi
|
|
108
|
+
|
|
109
|
+
Name: IoT-Network
|
|
110
|
+
Password: <separate password>
|
|
111
|
+
Network: IoT ← select your VLAN here
|
|
112
|
+
# All devices connecting to this SSID land in VLAN 20
|
|
113
|
+
|
|
114
|
+
Name: Guest
|
|
115
|
+
Password: <guest password>
|
|
116
|
+
Network: Guest
|
|
117
|
+
Guest Policy: Enable ← isolates guests from each other too
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### UniFi Firewall Rules (Traffic Rules)
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
Settings → Traffic & Security → Traffic Rules
|
|
124
|
+
|
|
125
|
+
# Block IoT from reaching Trusted VLAN
|
|
126
|
+
Action: Block
|
|
127
|
+
Category: Local Network
|
|
128
|
+
Source: IoT (192.168.20.0/24)
|
|
129
|
+
Destination: Trusted (192.168.10.0/24)
|
|
130
|
+
|
|
131
|
+
# Allow IoT to reach internet only
|
|
132
|
+
Action: Allow
|
|
133
|
+
Source: IoT
|
|
134
|
+
Destination: Internet
|
|
135
|
+
|
|
136
|
+
# Block Guest from all local networks
|
|
137
|
+
Action: Block
|
|
138
|
+
Source: Guest
|
|
139
|
+
Destination: Local Networks
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## pfSense / OPNsense Configuration
|
|
143
|
+
|
|
144
|
+
### Create VLANs
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
Interfaces → Assignments → VLANs → Add
|
|
148
|
+
|
|
149
|
+
Parent Interface: em1 (your LAN NIC)
|
|
150
|
+
VLAN Tag: 20
|
|
151
|
+
Description: IoT
|
|
152
|
+
|
|
153
|
+
# Repeat for each VLAN, then assign each VLAN to an interface:
|
|
154
|
+
Interfaces → Assignments → Add
|
|
155
|
+
Select the VLAN you created → click Add
|
|
156
|
+
Enable the interface, set IP to gateway address (192.168.20.1/24)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### DHCP for Each VLAN
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
Services → DHCP Server → Select your VLAN interface
|
|
163
|
+
|
|
164
|
+
Enable DHCP
|
|
165
|
+
Range: 192.168.20.100 to 192.168.20.254
|
|
166
|
+
DNS Servers: 192.168.30.2 ← Pi-hole IP if you have one
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Firewall Rules (pfSense/OPNsense)
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
# Rules are processed top-to-bottom, first match wins.
|
|
173
|
+
|
|
174
|
+
# On the IoT interface (VLAN 20):
|
|
175
|
+
Rule 1: Allow IoT → Pi-hole DNS ← MUST come before the RFC1918 block rule
|
|
176
|
+
Protocol: UDP/TCP
|
|
177
|
+
Source: IoT net
|
|
178
|
+
Destination: 192.168.30.2 port 53
|
|
179
|
+
Action: Allow
|
|
180
|
+
|
|
181
|
+
Rule 2: Block IoT → RFC1918 (all private IP ranges)
|
|
182
|
+
Protocol: any
|
|
183
|
+
Source: IoT net
|
|
184
|
+
Destination: RFC1918 (192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12)
|
|
185
|
+
Action: Block
|
|
186
|
+
|
|
187
|
+
Rule 3: Allow IoT → internet
|
|
188
|
+
Protocol: any
|
|
189
|
+
Source: IoT net
|
|
190
|
+
Destination: any
|
|
191
|
+
Action: Allow
|
|
192
|
+
|
|
193
|
+
# On the Trusted interface (VLAN 10):
|
|
194
|
+
Allow all (trusted devices can reach everything)
|
|
195
|
+
Source: Trusted net
|
|
196
|
+
Destination: any
|
|
197
|
+
Action: Allow
|
|
198
|
+
|
|
199
|
+
# Additional exceptions for IoT devices that need specific local services:
|
|
200
|
+
Insert before Rule 2 (the RFC1918 block):
|
|
201
|
+
Protocol: TCP
|
|
202
|
+
Source: IoT net
|
|
203
|
+
Destination: 192.168.30.x port 8123 ← Home Assistant
|
|
204
|
+
Action: Allow
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## MikroTik Configuration
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
# Step 1: Create a bridge with VLAN filtering enabled
|
|
211
|
+
/interface bridge
|
|
212
|
+
add name=bridge vlan-filtering=yes
|
|
213
|
+
|
|
214
|
+
# Step 2: Add physical ports to the bridge
|
|
215
|
+
# Trunk port to router/uplink (tagged for all VLANs)
|
|
216
|
+
/interface bridge port
|
|
217
|
+
add bridge=bridge interface=ether1 frame-types=admit-only-vlan-tagged
|
|
218
|
+
|
|
219
|
+
# Access port for trusted devices (untagged VLAN 10)
|
|
220
|
+
/interface bridge port
|
|
221
|
+
add bridge=bridge interface=ether2 pvid=10 frame-types=admit-only-untagged-and-priority-tagged
|
|
222
|
+
|
|
223
|
+
# Access port for IoT devices (untagged VLAN 20)
|
|
224
|
+
/interface bridge port
|
|
225
|
+
add bridge=bridge interface=ether3 pvid=20 frame-types=admit-only-untagged-and-priority-tagged
|
|
226
|
+
|
|
227
|
+
# Step 3: Define which VLANs are allowed on which ports
|
|
228
|
+
/interface bridge vlan
|
|
229
|
+
add bridge=bridge tagged=ether1 untagged=ether2 vlan-ids=10
|
|
230
|
+
add bridge=bridge tagged=ether1 untagged=ether3 vlan-ids=20
|
|
231
|
+
|
|
232
|
+
# Step 4: Create VLAN interfaces on the bridge (gateway IPs)
|
|
233
|
+
/interface vlan
|
|
234
|
+
add interface=bridge name=vlan10 vlan-id=10
|
|
235
|
+
add interface=bridge name=vlan20 vlan-id=20
|
|
236
|
+
|
|
237
|
+
# Step 5: Assign gateway IPs
|
|
238
|
+
/ip address
|
|
239
|
+
add interface=vlan10 address=192.168.10.1/24
|
|
240
|
+
add interface=vlan20 address=192.168.20.1/24
|
|
241
|
+
|
|
242
|
+
# Step 6: DHCP pools and servers
|
|
243
|
+
/ip pool
|
|
244
|
+
add name=pool-trusted ranges=192.168.10.100-192.168.10.254
|
|
245
|
+
add name=pool-iot ranges=192.168.20.100-192.168.20.254
|
|
246
|
+
|
|
247
|
+
/ip dhcp-server
|
|
248
|
+
add interface=vlan10 address-pool=pool-trusted name=dhcp-trusted
|
|
249
|
+
add interface=vlan20 address-pool=pool-iot name=dhcp-iot
|
|
250
|
+
|
|
251
|
+
/ip dhcp-server network
|
|
252
|
+
add address=192.168.10.0/24 gateway=192.168.10.1
|
|
253
|
+
add address=192.168.20.0/24 gateway=192.168.20.1
|
|
254
|
+
|
|
255
|
+
# Step 7: Firewall — block IoT from reaching trusted VLAN
|
|
256
|
+
/ip firewall filter
|
|
257
|
+
add chain=forward src-address=192.168.20.0/24 dst-address=192.168.10.0/24 \
|
|
258
|
+
action=drop comment="Block IoT to Trusted"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Switch Trunk vs Access Ports
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
# Trunk port: carries multiple VLANs (tagged) — connects switch-to-switch, switch-to-router, switch-to-AP
|
|
265
|
+
# Access port: carries one VLAN (untagged) — connects to end devices (PC, camera, NAS)
|
|
266
|
+
|
|
267
|
+
# A managed switch port connected to your router should be a trunk:
|
|
268
|
+
Allowed VLANs: 10, 20, 30, 40, 99
|
|
269
|
+
|
|
270
|
+
# A port connecting to a PC should be an access port:
|
|
271
|
+
VLAN: 10 (trusted)
|
|
272
|
+
No tagging — the PC does not know or care about VLANs
|
|
273
|
+
|
|
274
|
+
# A port connecting to an AP must be a trunk:
|
|
275
|
+
The AP tags traffic from each SSID with the right VLAN ID
|
|
276
|
+
Allowed VLANs: 10, 20, 40 (whichever SSIDs the AP serves)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Anti-Patterns
|
|
280
|
+
|
|
281
|
+
```
|
|
282
|
+
# BAD: Creating VLANs without adding firewall rules
|
|
283
|
+
# VLANs without firewall rules do not provide security — inter-VLAN routing is open by default
|
|
284
|
+
# GOOD: Add explicit block rules immediately after creating VLANs
|
|
285
|
+
|
|
286
|
+
# BAD: Putting the Pi-hole in the IoT VLAN
|
|
287
|
+
# IoT devices can reach it but trusted devices cannot (without extra rules)
|
|
288
|
+
# GOOD: Pi-hole in the Servers VLAN with a rule allowing all VLANs to reach port 53
|
|
289
|
+
|
|
290
|
+
# BAD: Native VLAN equals management VLAN
|
|
291
|
+
# Untagged traffic landing in your management VLAN enables VLAN hopping attacks
|
|
292
|
+
# GOOD: Use a dedicated unused VLAN as native (e.g. VLAN 999), keep management traffic tagged
|
|
293
|
+
|
|
294
|
+
# BAD: Same Wi-Fi password for IoT SSID and trusted SSID
|
|
295
|
+
# Anyone who learns the password can connect IoT devices to the wrong segment
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Best Practices
|
|
299
|
+
|
|
300
|
+
- Start with 4 VLANs: Trusted, IoT, Servers, Guest — add more as needed
|
|
301
|
+
- Put Pi-hole in the Servers VLAN (192.168.30.x)
|
|
302
|
+
- Add a firewall rule allowing DNS (port 53) from all VLANs to the Pi-hole IP — before any RFC1918 block rule
|
|
303
|
+
- Test isolation after every rule change: from the IoT VLAN, try to ping a trusted device — it should fail
|
|
304
|
+
- Use a management VLAN for switch and AP web UIs and restrict access to the Trusted VLAN only
|
|
305
|
+
- Document your VLAN design in a table (VLAN ID, name, subnet, purpose)
|
|
306
|
+
|
|
307
|
+
## Related Skills
|
|
308
|
+
|
|
309
|
+
- homelab-network-setup
|
|
310
|
+
- homelab-pihole-dns
|
|
311
|
+
- homelab-wireguard-vpn
|