Skip to main content

Technitium

@jamesakeech/technitiumv2026.08.15.1· 7d agoMODELS
01README

Manage a Technitium DNS server or cluster: zones, records, block/allow lists, cache, diagnostics, settings backup and restore, and cluster membership. Written after rebuilding a live authoritative pair, and shaped by what that exposed. record_ensure is an idempotent upsert Technitium's own API cannot express — add fails on an existing record, update fails on an absent one — and it works for every record type including TLSA, because the read and write field names for TLSA, SSHFP and URI are not the same names and are mapped per type rather than renamed globally. settings_backup includes every section by default, so it produces a backup a server can actually be rebuilt from. cluster_init, cluster_join and cluster_state cover the membership a settings backup can never carry, alongside the TLS listener and certificate it also omits — the three things that make a restored node look broken.

02Models1
@jamesakeech/technitiumv2026.08.15.1technitium.ts

Global Arguments

ArgumentTypeDescription
baseUrlstringBase URL of the Technitium web service, e.g. http://192.0.2.10:5380.
apiTokenstringAPI token for a user with the rights the called methods need. Cluster
skipTlsVerify?booleanSkip TLS verification. Relevant only for an https baseUrl.
fn zone_list()
List every zone with its type and DNSSEC status.
fn zone_create(zone: string, type?: string, primaryNameServerAddresses?: string, catalog?: string)
Create a zone (Primary, Secondary, Forwarder, Catalog, …).
ArgumentTypeDescription
zonestring
type?stringPrimary | Secondary | Stub | Forwarder | Catalog | SecondaryCatalog
primaryNameServerAddresses?string
catalog?string
fn zone_delete(zone: string)
Delete a zone. Destructive — confirm WHICH copy you are deleting
ArgumentTypeDescription
zonestring
fn record_list(zone: string)
List every record in a zone.
ArgumentTypeDescription
zonestring
fn record_get(domain: string, zone?: string)
Get the records at one owner name.
ArgumentTypeDescription
domainstring
zone?string
fn record_ensure(zone?: string, records: array)
Idempotently ensure records exist with the given values (upsert),
ArgumentTypeDescription
zone?string
recordsarray
fn record_update(zone?: string, domain: string, type: string, ttl?: number, rData: record, newRData?: record)
Change an existing record's value or TTL. `rData` identifies it,
ArgumentTypeDescription
zone?string
domainstring
typestring
ttl?number
rDatarecord
newRData?record
fn record_delete(zone?: string, domain: string, type: string, rData: record)
Delete one record, identified by its rData.
ArgumentTypeDescription
zone?string
domainstring
typestring
rDatarecord
fn settings_get()
Read the server settings subset that matters after a rebuild:
fn settings_backup()
Download a COMPLETE settings backup. Every section is included by
fn settings_restore(filePath: string, deleteExistingFiles: boolean)
Restore settings from a local backup zip. Sections default TRUE,
ArgumentTypeDescription
filePathstringAbsolute path to the backup zip
deleteExistingFilesbooleanDelete config files not present in the backup. Leave false unless
fn web_service_set_tls(enableTls?: boolean, useSelfSignedCertificate?: boolean, tlsPort?: number, certificatePath?: string, certificatePassword?: string, httpToTlsRedirect?: boolean)
Configure the admin web service HTTPS listener. Needed after every
ArgumentTypeDescription
enableTls?boolean
useSelfSignedCertificate?boolean
tlsPort?number
certificatePath?string
certificatePassword?stringExport password for the PKCS#12 file.
httpToTlsRedirect?booleanEnable only AFTER verifying the certificate serves correctly —
fn zone_enable(zone: string)
Enable a disabled zone.
ArgumentTypeDescription
zonestring
fn zone_disable(zone: string)
Disable a zone without deleting it. The server stops answering
ArgumentTypeDescription
zonestring
fn record_add(zone?: string, domain: string, type: string, ttl?: number, rData: record)
Add a record, failing if one already exists. Prefer record_ensure
ArgumentTypeDescription
zone?string
domainstring
typestring
ttl?number
rDatarecord
fn blocking_get_settings()
Read the blocking-relevant settings: enable state, any temporary
fn blocking_set_state(enable: boolean)
Turn blocking on or off.
ArgumentTypeDescription
enableboolean
fn blocking_temporary_disable(minutes: number)
Disable blocking for N minutes, after which the server re-enables it
ArgumentTypeDescription
minutesnumberMinutes to disable blocking, e.g. 5, 15, 30, 60, 1440.
fn blocking_set_lists(blockListUrls?: array, allowListUrls?: array)
Replace the block and/or allow list URLs. Whichever array you pass
ArgumentTypeDescription
blockListUrls?array
allowListUrls?array
fn blocking_force_update_lists()
Force an immediate re-download of the block lists rather than
fn dnssec_validation_set(enable: boolean)
Enable or disable DNSSEC validation of upstream answers. Note this
ArgumentTypeDescription
enableboolean
fn allowed_add(domain: string)
Add a domain to the allowed list.
ArgumentTypeDescription
domainstring
fn allowed_delete(domain: string)
Remove a domain from the allowed list.
ArgumentTypeDescription
domainstring
fn allowed_list(domain?: string)
List the allowed-list entries, optionally under a sub-tree.
ArgumentTypeDescription
domain?stringSub-tree to list; root if omitted
fn allowed_flush()
Empty the allowed list entirely. Destructive.
fn blocked_add(domain: string)
Add a domain to the blocked list.
ArgumentTypeDescription
domainstring
fn blocked_delete(domain: string)
Remove a domain from the blocked list.
ArgumentTypeDescription
domainstring
fn blocked_list(domain?: string)
List the blocked-list entries, optionally under a sub-tree.
ArgumentTypeDescription
domain?stringSub-tree to list; root if omitted
fn blocked_flush()
Empty the blocked list entirely. Destructive.
fn client_resolve(domain: string, type: string, server: string, protocol: enum, dnssecValidation?: boolean)
Resolve a name through the server's own DNS client — the honest way
ArgumentTypeDescription
domainstring
typestring
serverstringthis-server | recursive-resolver | system-dns | <ip or hostname>
protocolenum
dnssecValidation?boolean
fn logs_query(appName: string, classPath: string, pageNumber?: number, entriesPerPage?: number, descendingOrder?: boolean, start?: string, end?: string, clientIpAddress?: string, protocol?: string, responseType?: string, qname?: string, qtype?: string, qclass?: string)
Query the query-log app. Depends on a logging app being installed —
ArgumentTypeDescription
appNamestring
classPathstring
pageNumber?number
entriesPerPage?number
descendingOrder?boolean
start?stringISO 8601 start time
end?stringISO 8601 end time
clientIpAddress?string
protocol?string
responseType?string
qname?string
qtype?string
qclass?string
fn dashboard_stats(start?: string, end?: string)
Dashboard counters and top-N lists for a time range.
ArgumentTypeDescription
start?stringISO 8601 start (when type=Custom)
end?stringISO 8601 end (when type=Custom)
fn cache_flush()
Flush the entire resolver cache. Harmless but not free — the server
fn cache_list(domain?: string)
List cached zones and records, optionally under a sub-tree.
ArgumentTypeDescription
domain?stringSub-tree to list; root if omitted
fn cache_delete(domain: string)
Drop one name from the cache, leaving the rest intact.
ArgumentTypeDescription
domainstring
fn cluster_state(node?: string, includeServerIpAddresses?: boolean)
Report cluster membership as THIS node sees it. Read-only. Call it
ArgumentTypeDescription
node?string
includeServerIpAddresses?boolean
fn cluster_init(clusterDomain: string, primaryNodeIpAddresses: string)
Initialize a NEW cluster with this node as Primary. MINTS A FRESH
ArgumentTypeDescription
clusterDomainstring
primaryNodeIpAddressesstringComma-separated addresses secondaries will reach this primary on.
fn cluster_join(primaryNodeIpAddress: string, primaryNodeUrl: string, primaryNodeUsername: string, primaryNodePassword: string, secondaryNodeIpAddresses?: string, primaryNodeTotp?: string, ignoreCertificateErrors?: boolean)
Join this node to an existing cluster as a Secondary, authenticating
ArgumentTypeDescription
primaryNodeIpAddressstring
primaryNodeUrlstringMUST carry the primary's DOMAIN NAME, e.g.
primaryNodeUsernamestringAn Administrator ON THE PRIMARY — a username and password, not an
primaryNodePasswordstringPassword for primaryNodeUsername, on the primary node.
secondaryNodeIpAddresses?string
primaryNodeTotp?string
ignoreCertificateErrors?booleanTechnitium clusters commonly run self-signed certificates pinned

Resources

zone(infinite)— A zone as the server reports it, with its DNSSEC status.
zoneRecord(infinite)— A single record, keyed by zone, owner, type and rData hash.
settings(30d)— The server settings subset worth asserting on in a workflow.
clusterState(30d)— Cluster membership as ONE node sees it. Worth writing per node: the
operationResult(30d)— The outcome of a mutating call that produces no resource.
listEntry(30d)— One domain on the allowed or blocked list.
dnsResponse(ephemeral)— The answer to a diagnostic resolve. Ephemeral — a resolver's answer
queryLog(7d)— One row from the query log app.
cacheEntry(1d)— A cached zone or record name.
stats(1h)— Dashboard counters for a time range.

Files

backup(application/zip)— A full settings backup (zip). CONTAINS SECRETS — auth.config carries
03Stats
A
100 / 100
Downloads
0
Archive size
44.2 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License declared1/1earned
  • Verified public repository2/2earned
04Platforms
05Labels