Skip to content

Added README for Apps#1704

Draft
zbalkan wants to merge 2 commits intoTechnitiumSoftware:masterfrom
zbalkan:docs/app-docs
Draft

Added README for Apps#1704
zbalkan wants to merge 2 commits intoTechnitiumSoftware:masterfrom
zbalkan:docs/app-docs

Conversation

@zbalkan
Copy link
Contributor

@zbalkan zbalkan commented Jan 27, 2026

Recreated due to branch renaming.

Original PR: #1693

Copilot AI review requested due to automatic review settings January 27, 2026 15:27
@zbalkan zbalkan changed the title Docs/app docs Added README for Apps Jan 27, 2026
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds (or replaces) per-app documentation files under Apps/* to provide installation, configuration, and usage guidance for multiple Technitium DNS Server apps, including converting some legacy ReadMe.txt files to README.md.

Changes:

  • Added new README.md documentation for many apps (configuration, examples, troubleshooting).
  • Replaced legacy ReadMe.txt files in Geo* apps with Markdown equivalents.
  • Expanded and reformatted the existing FilterAaaaApp/README.md.

Reviewed changes

Copilot reviewed 27 out of 27 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
Apps/ZoneAliasApp/README.md Adds Markdown documentation for Zone Alias app.
Apps/WildIpApp/README.md Adds Markdown documentation for WildIp app.
Apps/WhatIsMyDnsApp/README.md Adds Markdown documentation for WhatIsMyDns app.
Apps/WeightedRoundRobinApp/README.md Adds Markdown documentation for Weighted Round Robin app.
Apps/QueryLogsSqliteApp/README.md Adds Markdown documentation for SQLite query logging app.
Apps/QueryLogsSqlServerApp/README.md Adds Markdown documentation for SQL Server query logging app.
Apps/QueryLogsMySqlApp/README.md Adds Markdown documentation for MySQL query logging app.
Apps/NxDomainOverrideApp/README.md Adds Markdown documentation for NXDOMAIN override app.
Apps/NxDomainApp/README.md Adds Markdown documentation for NXDOMAIN app.
Apps/NoDataApp/README.md Adds Markdown documentation for NoData app.
Apps/GeoDistanceApp/README.md Adds Markdown documentation for GeoDistance app.
Apps/GeoCountryApp/ReadMe.txt Removes legacy text readme in favor of Markdown.
Apps/GeoCountryApp/README.md Adds Markdown documentation for GeoCountry app.
Apps/GeoContinentApp/ReadMe.txt Removes legacy text readme in favor of Markdown.
Apps/GeoContinentApp/README.md Adds Markdown documentation for GeoContinent app.
Apps/FilterAaaaApp/README.md Major expansion/rewrite of Filter AAAA documentation.
Apps/DropRequestsApp/README.md Adds Markdown documentation for Drop Requests app.
Apps/DnsRebindingProtectionApp/README.md Adds Markdown documentation for DNS rebinding protection app.
Apps/DnsBlockListApp/README.md Adds Markdown documentation for DNSBL/block list app.
Apps/Dns64App/README.md Adds Markdown documentation for DNS64 app.
Apps/DefaultRecordsApp/README.md Adds Markdown documentation for Default Records app.
Apps/BlockPageApp/README.md Adds Markdown documentation for Block Page app.
Apps/AutoPtrApp/README.md Adds Markdown documentation for Auto PTR app.
Apps/AdvancedForwardingApp/README.md Adds Markdown documentation for Advanced Forwarding app.
Apps/AdvancedBlockingApp/README.md Adds Markdown documentation for Advanced Blocking app.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +68 to +77
| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `enableFilterAAAA` | Boolean | `false` | Enables AAAA filtering globally for all DNS queries processed by the app |
| `defaultTtl` | Integer | `30` | TTL (in seconds) for NODATA responses returned when AAAA records are filtered |
| `bypassLocalZones` | Boolean | `false` | When true, authoritative answers from local zones are passed through unmodified |
| `bypassNetworks` | Array | `[]` | List of client networks (CIDR notation) excluded from filtering |
| `bypassDomains` | Array | `[]` | List of domain names (including subdomains) excluded from filtering |
| `filterDomains` | Array | `[]` | List of domain names to filter; when empty, all domains are filtered |
| `enableFilterAAAAOnNetworks` | Boolean | `false` | *(Deprecated - use `bypassNetworks` instead)* Enables network-specific AAAA filtering |
| `filterAAAAOnNetworks` | Array | `[]` | *(Deprecated - use `bypassNetworks` instead)* Network-specific filtering policies |
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documented configuration keys here (e.g., enableFilterAAAA, plus the implied casing) do not match what the app actually parses (enableFilterAaaa in Apps/FilterAaaaApp/App.cs:67). As written, users following this README will configure the app incorrectly. Please update the property names and examples to match the implementation (enableFilterAaaa/defaultTtl/bypassLocalZones/bypassNetworks/bypassDomains/filterDomains).

Copilot uses AI. Check for mistakes.
1. Verify `enableFilterAAAA` or `enableFilterAAAAOnNetworks` is set to `true`
2. Check client IP against `network` CIDR blocks in configuration
3. Review DNS server logs for filter decision messages
4. Confirm queried domain is **not** in `filterAAAAExceptionDomains`
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section references filterAAAAExceptionDomains, but the app does not support that option (it uses bypassDomains instead; see Apps/FilterAaaaApp/App.cs:90 and matching logic at 168-172). Please rename/update this troubleshooting guidance to reflect the real config keys so it’s actionable.

Suggested change
4. Confirm queried domain is **not** in `filterAAAAExceptionDomains`
4. Confirm queried domain is **not** listed in the applicable `bypassDomains` configuration

Copilot uses AI. Check for mistakes.
Comment on lines +35 to +49
## Configuration

The app is configured using a JSON-based configuration file named `dnsApp.config`, which must be placed within the zone directory where the app is enabled.

The configuration structure supports defining weighted records at the zone level, with each record entry specifying the DNS record type, value, and weight. The app processes these entries during query resolution to select records according to their configured weights.

All configuration options are defined below.

### Root Configuration Options

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | Boolean | `true` | Controls whether the weighted round robin mechanism is active for this zone |
| `records` | Array | `[]` | List of weighted record objects defining the DNS records and their weights |

Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The README describes a per-zone dnsApp.config schema (enabled, records, weight, etc.), but the actual app is an APP-record request handler that reads per-record JSON from the APP record data (ipv4Addresses / ipv6Addresses with address, weight, enabled) and does not read dnsApp.config (see Apps/WeightedRoundRobinApp/Address.cs and CNAME.cs). Please rewrite the configuration section to match the real APP record data format and behavior.

Copilot uses AI. Check for mistakes.
Comment on lines +3 to +65
A DNS App for Technitium DNS Server that enables wildcard IP address resolution by dynamically generating DNS responses containing IP addresses derived from subdomain labels. This app allows you to create DNS zones where the IP address is encoded directly in the hostname, supporting both IPv4 and IPv6 addresses with flexible encoding formats.

## Overview

WildIp extends the core DNS server functionality by **intercepting DNS queries and dynamically generating A or AAAA records** based on patterns embedded in the queried domain name. Rather than maintaining static zone files, the app parses the subdomain structure to extract IP addresses encoded using various formats (dash-separated, hexadecimal, or custom separators).

**Key capabilities:**

- **Dynamic IPv4 and IPv6 resolution** from subdomain labels
- **Multiple encoding format support** including dash-separated (`192-168-1-1`), hex (`c0a80101`), and custom separators
- **Flexible zone configuration** with pattern matching and validation
- **TTL and response customization** per zone
- **Reverse DNS (PTR) support** for dynamically generated addresses

This app provides administrators with a powerful tool for creating dynamic DNS testing environments, IP-based service routing, and simplified DNS-based IP addressing schemes without maintaining extensive zone files.

## Installation

1. Open the Technitium DNS Server web console
2. Navigate to **Apps** in the main menu
3. Click **Install** or **Update** and upload the WildIp app package
4. Configure the app using the `dnsApp.config` file as described below

## Configuration

The app is configured through a JSON file named **`dnsApp.config`** located in the app's installation directory.

The configuration consists of a root object containing global settings and an array of zone definitions. Each zone specifies the domain pattern, IP format, and response behavior.

### Root Configuration Options

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `zones` | Array | `[]` | Array of zone configuration objects defining wildcard IP patterns |

### Zone Configuration

Each zone object in the `zones` array defines a wildcard IP pattern for a specific domain.

#### Zone Object Properties

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `zone` | String | *Required* | The DNS zone name (e.g., `ip.example.com`) where wildcard IP resolution applies |
| `ipv4Format` | String | `"dash"` | Format for encoding IPv4 addresses. Options: `"dash"`, `"hex"`, or a custom separator character |
| `ipv6Format` | String | `"dash"` | Format for encoding IPv6 addresses. Options: `"dash"`, `"hex"`, or a custom separator character |
| `ttl` | Integer | `300` | Time-To-Live (in seconds) for generated DNS responses |
| `soaSerial` | Integer | `1` | SOA record serial number for the zone |
| `soaRefresh` | Integer | `3600` | SOA refresh interval in seconds |
| `soaRetry` | Integer | `900` | SOA retry interval in seconds |
| `soaExpire` | Integer | `604800` | SOA expire time in seconds |
| `soaMinimum` | Integer | `300` | SOA minimum TTL in seconds |
| `soaPrimaryNameServer` | String | `"ns.example.com"` | SOA primary name server hostname |
| `soaResponsiblePerson` | String | `"admin.example.com"` | SOA responsible person email (in DNS format) |

### IPv4 Format Options

The `ipv4Format` property controls how IPv4 addresses are encoded in subdomains:

- **`"dash"`**: Octets separated by dashes (e.g., `192-168-1-1.ip.example.com` → `192.168.1.1`)
- **`"hex"`**: Hexadecimal representation without separators (e.g., `c0a80101.ip.example.com` → `192.168.1.1`)
- **Custom separator**: Any single character (e.g., `"_"` for `192_168_1_1.ip.example.com` → `192.168.1.1`)

Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This README claims the app is configured via dnsApp.config with a zones array and supports TTL/SOA/PTR behavior. The current implementation has no global configuration and only returns A/AAAA by parsing an encoded IP from the QNAME under an APP record (Apps/WildIpApp/App.cs); there is no PTR handling or zone/format configuration. Please update the documentation to match the implementation (or update the app to support the documented config).

Suggested change
A DNS App for Technitium DNS Server that enables wildcard IP address resolution by dynamically generating DNS responses containing IP addresses derived from subdomain labels. This app allows you to create DNS zones where the IP address is encoded directly in the hostname, supporting both IPv4 and IPv6 addresses with flexible encoding formats.
## Overview
WildIp extends the core DNS server functionality by **intercepting DNS queries and dynamically generating A or AAAA records** based on patterns embedded in the queried domain name. Rather than maintaining static zone files, the app parses the subdomain structure to extract IP addresses encoded using various formats (dash-separated, hexadecimal, or custom separators).
**Key capabilities:**
- **Dynamic IPv4 and IPv6 resolution** from subdomain labels
- **Multiple encoding format support** including dash-separated (`192-168-1-1`), hex (`c0a80101`), and custom separators
- **Flexible zone configuration** with pattern matching and validation
- **TTL and response customization** per zone
- **Reverse DNS (PTR) support** for dynamically generated addresses
This app provides administrators with a powerful tool for creating dynamic DNS testing environments, IP-based service routing, and simplified DNS-based IP addressing schemes without maintaining extensive zone files.
## Installation
1. Open the Technitium DNS Server web console
2. Navigate to **Apps** in the main menu
3. Click **Install** or **Update** and upload the WildIp app package
4. Configure the app using the `dnsApp.config` file as described below
## Configuration
The app is configured through a JSON file named **`dnsApp.config`** located in the app's installation directory.
The configuration consists of a root object containing global settings and an array of zone definitions. Each zone specifies the domain pattern, IP format, and response behavior.
### Root Configuration Options
| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `zones` | Array | `[]` | Array of zone configuration objects defining wildcard IP patterns |
### Zone Configuration
Each zone object in the `zones` array defines a wildcard IP pattern for a specific domain.
#### Zone Object Properties
| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `zone` | String | *Required* | The DNS zone name (e.g., `ip.example.com`) where wildcard IP resolution applies |
| `ipv4Format` | String | `"dash"` | Format for encoding IPv4 addresses. Options: `"dash"`, `"hex"`, or a custom separator character |
| `ipv6Format` | String | `"dash"` | Format for encoding IPv6 addresses. Options: `"dash"`, `"hex"`, or a custom separator character |
| `ttl` | Integer | `300` | Time-To-Live (in seconds) for generated DNS responses |
| `soaSerial` | Integer | `1` | SOA record serial number for the zone |
| `soaRefresh` | Integer | `3600` | SOA refresh interval in seconds |
| `soaRetry` | Integer | `900` | SOA retry interval in seconds |
| `soaExpire` | Integer | `604800` | SOA expire time in seconds |
| `soaMinimum` | Integer | `300` | SOA minimum TTL in seconds |
| `soaPrimaryNameServer` | String | `"ns.example.com"` | SOA primary name server hostname |
| `soaResponsiblePerson` | String | `"admin.example.com"` | SOA responsible person email (in DNS format) |
### IPv4 Format Options
The `ipv4Format` property controls how IPv4 addresses are encoded in subdomains:
- **`"dash"`**: Octets separated by dashes (e.g., `192-168-1-1.ip.example.com``192.168.1.1`)
- **`"hex"`**: Hexadecimal representation without separators (e.g., `c0a80101.ip.example.com``192.168.1.1`)
- **Custom separator**: Any single character (e.g., `"_"` for `192_168_1_1.ip.example.com``192.168.1.1`)
A DNS App for Technitium DNS Server that enables wildcard IP address resolution by dynamically generating DNS responses containing IP addresses derived from subdomain labels. This app allows you to encode an IP address directly in the hostname and have it returned in DNS answers, without maintaining static zone files.
## Overview
WildIp extends the core DNS server functionality by **intercepting DNS queries and dynamically generating A or AAAA records** based on an IP address embedded in the queried domain name. The app parses the requested name under the APP record and extracts an encoded IPv4 or IPv6 address from the subdomain label, then returns that address in the DNS response.
**Key capabilities:**
- **Dynamic IPv4 and IPv6 resolution** from subdomain labels
- **Wildcard-style resolution** where many hostnames can be served without defining individual records
- **No zone files or app-specific configuration required** — behavior is fixed in the app
This app is useful for creating dynamic DNS testing environments, simple IP-echo services, and IP-based routing tests where the requested hostname directly determines the address returned.
## Installation
1. Open the Technitium DNS Server web console
2. Navigate to **Apps** in the main menu
3: Click **Install** or **Update** and upload the WildIp app package
4. Create or edit an **APP** record in the relevant zone and attach the WildIp app to that record
## Configuration & Usage
WildIp does **not** use a `dnsApp.config` file and does **not** expose per-zone settings such as custom TTLs, SOA parameters, or PTR handling. Its behavior is fixed:
- The app is invoked via an APP record.
- For matching A or AAAA queries, it parses the requested name, extracts the encoded IP address from the subdomain portion, and returns that IP in the answer section.
- If the requested name does not contain a valid encoded IP address in the expected format, the app does not synthesize an address.
Refer to the app's source code (`Apps/WildIpApp/App.cs`) for the exact hostname encoding format it accepts when extracting IPv4 and IPv6 addresses.
WildIp does **not** currently provide:
- Reverse DNS (PTR) record generation
- Custom TTL configuration
- SOA record customization or zone management
All such behavior, if required, must be configured separately on the Technitium DNS Server, outside of this app.
### IPv4 and IPv6 encoding
The app expects the IP address to be embedded in the hostname under the APP record in a specific encoded format. When a valid encoding is detected, that address is returned as the response for A (IPv4) or AAAA (IPv6) queries. Consult the implementation for details on the supported encoding scheme.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +16
# WhatIsMyDns

A DNS App for Technitium DNS Server that returns the client's IP address, geolocation, and network information in response to DNS queries. This app enables DNS-based client identification and IP diagnostics, making it useful for network troubleshooting, geolocation services, and client information disclosure.

## Overview

**WhatIsMyDns** extends the core DNS server functionality by intercepting queries to a designated domain and responding with the client's own network information encoded in DNS records. Instead of performing standard DNS resolution, the app returns the querying client's IP address and associated metadata through TXT, A, or AAAA records.

Key capabilities:

- **Client IP disclosure** via A/AAAA records containing the client's source address
- **Geolocation data** including country, region, city, and coordinates via TXT records
- **ISP and ASN information** identifying the client's network provider
- **Multiple query format support** including standard queries and special subdomains for specific data
- **MaxMind GeoIP2 integration** for accurate location and network intelligence

Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The README states this app returns geolocation/ISP/ASN info and integrates with MaxMind GeoIP2. The current implementation only returns the client source IP in A/AAAA/TXT for matching APP record names and has no GeoIP integration or extra query formats (Apps/WhatIsMyDnsApp/App.cs). Please revise the overview/features to reflect actual behavior (or implement the described functionality).

Copilot uses AI. Check for mistakes.

**GeoDistance** is a DNS application that performs **geographic proximity routing** by calculating the physical distance between a DNS client's subnet and one or more configured server endpoints using latitude/longitude coordinates.

***WARNING:*** Latitude and longitude are not precise and should not be used to identify a particular street address or household.*
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Markdown formatting issue: the warning line ends with an extra trailing *, which will render incorrectly. Please remove the stray asterisk so the emphasis formatting is balanced.

Suggested change
***WARNING:*** Latitude and longitude are not precise and should not be used to identify a particular street address or household.*
***WARNING:*** Latitude and longitude are not precise and should not be used to identify a particular street address or household.

Copilot uses AI. Check for mistakes.
1. Download the **GeoIP2-City.mmdb** file from your MaxMind account
2. Create a **ZIP archive** containing the `.mmdb` file
3. In the Technitium DNS Server web console, navigate to **Apps**
4. Select **GeoContinentApp** and click **Update**
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The GeoIP database update steps reference selecting GeoContinentApp. For GeoDistance, this should reference updating the GeoDistance app/package itself (otherwise readers will update the wrong app). Please correct the app name in the instructions.

Suggested change
4. Select **GeoContinentApp** and click **Update**
4. Select **GeoDistance** and click **Update**

Copilot uses AI. Check for mistakes.
1. Download the **GeoIP2-Country.mmdb** file from your MaxMind account
2. Create a **ZIP archive** containing the `.mmdb` file
3. In the Technitium DNS Server web console, navigate to **Apps**
4. Select **GeoContinentApp** and click **Update**
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The GeoIP database update steps reference selecting GeoContinentApp. For GeoCountry, this should reference updating the GeoCountry app/package itself (otherwise readers will update the wrong app). Please correct the app name in the instructions.

Suggested change
4. Select **GeoContinentApp** and click **Update**
4. Select **GeoCountry** and click **Update**

Copilot uses AI. Check for mistakes.
**Required format:**

```json
"connectionString": "Data Source=tcp:<server>,<port>; User ID=<username>; Password=<password>; TrustServerCertificate=true;"
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The example connectionString uses TrustServerCertificate=true, which disables proper TLS certificate validation for SQL Server connections and makes it possible for a man‑in‑the‑middle on the network to impersonate the database server and read or tamper with logged DNS query data. This is especially risky when the SQL Server is reached over untrusted or shared networks because the client will accept any certificate presented by the endpoint. To avoid encouraging insecure configurations, remove TrustServerCertificate=true from the example and instead recommend a configuration that validates the server certificate (for example, by using encryption with a certificate issued by a trusted CA or a properly managed internal PKI).

Copilot uses AI. Check for mistakes.
@zbalkan zbalkan marked this pull request as draft January 28, 2026 17:18
@zbalkan
Copy link
Contributor Author

zbalkan commented Jan 28, 2026

Some hallucinations happened. Manual intervention needed. Draft until manual review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant