1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
# DomainDig – Project Context
## What this is
An iOS utility app for querying DNS records, inspecting SSL/TLS certificates,
checking HTTP headers, measuring TCP reachability, geolocating IP addresses,
analyzing email security records, tracing redirect chains, performing reverse
DNS lookups, and scanning common ports for any domain. Designed for developers,
sysadmins, and anyone who manages or troubleshoots domains and servers.
## Target user
Technically literate adults — developers, IT/sysadmin, homelab enthusiasts.
Comfortable with terms like A record, CNAME, MX, TTL, and TLS. The UI should be
clean and information-dense, not hand-holding.
## Design principles
- Minimal, utilitarian UI — this is a tool, not a consumer app
- Results should be readable at a glance — use clear labels, monospace where
appropriate for IPs and raw values
- Dark mode preferred as the primary aesthetic
- No onboarding, no tutorials, no splash screens
- Fast — results should appear as soon as they're available, not after all
lookups complete
- Each result section loads independently with its own ProgressView
- Errors shown inline per-section, never as global alerts
## Features
### DNS Lookup
Query the following record types for any domain via DNS-over-HTTPS (use
Cloudflare 1.1.1.1 — https://cloudflare-dns.com/dns-query):
- A
- AAAA
- MX
- NS
- TXT
- CNAME
Display each record type in its own section. Show TTL alongside each result.
If a record type returns no results, show "No records found" for that type
rather than hiding the section entirely.
After the apex query, also queries `*.{domain}` for A, AAAA, MX, and TXT.
Wildcard results are shown as a sub-section beneath each record type, labelled
with `*.{domain}`. Hidden if no wildcard records are returned.
### SSL/TLS Certificate Check
Connect to the domain on port 443 via URLSession and inspect the server's
certificate chain using URLSession delegate methods. Display:
- Common name (CN)
- Subject Alternative Names (SANs)
- Issuer
- Valid from / Valid until dates
- Days until expiry — highlight in red if under 30 days, yellow if under 60
- Certificate chain depth
### HTTP Headers Check
Fire a HEAD request to `https://{domain}` and display all response headers.
Header names in cyan, values in primary. Security-relevant headers highlighted
in yellow: `strict-transport-security`, `x-frame-options`,
`x-content-type-options`, `content-security-policy`, `referrer-policy`.
Service: `HTTPHeadersService.swift`.
### Reachability / TCP Latency
Use `NWConnection` (Network framework) to attempt TCP connections on ports 443
and 80. Measure time to `.ready` state. Display green/red dot, latency in ms,
and reachable/unreachable status. Timeout after 5 seconds.
Service: `ReachabilityService.swift`.
### IP Geolocation with Map
After DNS A record resolves, take the first IP and query
`https://ipapi.co/{ip}/json/` for country, region, city, org, lat/lon.
Display in an "IP Location" section with a SwiftUI `Map` (MapKit) centered on
the coordinates with a `Marker`. Map height 180pt, `.standard` style.
Service: `IPGeolocationService.swift`.
### Email Security Analysis
Parse SPF from existing TXT records (no extra query). Query `_dmarc.{domain}`
for DMARC and try common DKIM selectors (`default`, `google`, `mail`) via DoH.
Display green checkmark if found, red ✗ if not. Full record values truncated
to 80 chars with tap-to-expand. Triggered after DNS completes.
Service: `EmailSecurityService.swift`.
### Reverse DNS / PTR Lookup
After DNS A record resolves, construct reverse DNS name (reversed octets +
`.in-addr.arpa`) and query PTR record via Cloudflare DoH. Displayed inline
in the DNS Records section below the A record sub-section.
Service: `ReverseDNSService.swift`.
### Redirect Chain
Fire HTTP request to `http://{domain}` with redirects disabled. Follow up to
10 redirects manually, recording each hop's URL and status code. Display step
number, status code in cyan, URL, and "(final)" on the last hop. Shows
"No redirects — direct connection" if the first request returns 200.
Service: `RedirectChainService.swift`.
### Common Port Scanner
Probe 10 common ports (21/FTP, 22/SSH, 25/SMTP, 80/HTTP, 443/HTTPS,
587/SMTP-TLS, 3306/MySQL, 5432/PostgreSQL, 8080/HTTP-Alt, 8443/HTTPS-Alt)
using `NWConnection` with 3-second timeout. All probes run concurrently.
Green dot for open, grey dot for closed. Closed is expected — no error shown.
Service: `PortScanService.swift`.
### Results layout
- Domain input at the top — large text field, keyboard shows on launch
- Run button to trigger all lookups simultaneously
- Results displayed in clearly separated sections:
Reachability → Redirect Chain → DNS Records (with PTR inline) →
Email Security → SSL/TLS Certificate → HTTP Headers → IP Location →
Open Ports
- Each section loads independently — don't block one section waiting for another
- Email security, PTR, and IP geolocation are chained after DNS; all others
run in parallel
### Recent searches
Store the last 20 searched domains locally using UserDefaults. Display them as
a tappable list below the text field when no results are showing. Tapping a
recent domain populates the text field and runs the lookup immediately. Include
a "Clear" button to wipe history. Most recent at the top.
### Saved domains
Bookmark button (SF Symbol: `bookmark` / `bookmark.fill`) in the results
toolbar area, next to the share button. Tapping saves/unsaves the current
domain. Filled icon when saved. Saved domains viewable from a toolbar button
that pushes to `SavedDomainsView` — a list of saved domains, tappable to run
lookups, with swipe-to-delete and an Edit button for bulk deletion.
Persisted in UserDefaults under key `savedDomains`.
### Lookup history with cached results
After each successful lookup, a snapshot of all results (DNS, SSL, HTTP headers,
reachability, geolocation, email security, PTR, redirect chain, port scan) is
saved to history in UserDefaults as JSON. Capped at 50 entries. `HistoryView`
shows past lookups with domain and timestamp. Tapping shows full cached results
in `HistoryDetailView` using the same layout, labelled as cached with the
original timestamp. Model: `HistoryEntry` (Codable).
### Share / export
A share button (SF Symbol: `square.and.arrow.up`) in the top-right of the
results area. Formats the full results as plain text and presents the iOS share
sheet via UIActivityViewController. The export includes: domain, timestamp,
reachability, redirect chain, all DNS records with TTLs and PTR, email security
records, SSL cert fields, HTTP headers, IP geolocation data, and port scan
results.
## Technical constraints
- SwiftUI, iOS only
- Fully offline except for network requests (DNS-over-HTTPS, SSL, HTTP HEAD,
TCP connections, geolocation API)
- No accounts, no analytics, no ads
- No third-party dependencies — URLSession, Network, MapKit only
- Targets latest iOS
## Architecture
- `Models.swift` — All data models (DNS, SSL, HTTP headers, reachability,
geolocation, history entry), all Codable for persistence
- `DomainViewModel.swift` — `@Observable` view model orchestrating all lookups,
managing state, history, saved domains, recent searches, and export
- `ContentView.swift` — Main screen with input, all result sections, toolbar
- `SavedDomainsView.swift` — Saved domains list with edit/delete
- `HistoryView.swift` — History list + `HistoryDetailView` for cached results
- Services: `DNSLookupService`, `SSLCheckService`, `HTTPHeadersService`,
`ReachabilityService`, `IPGeolocationService`, `EmailSecurityService`,
`ReverseDNSService`, `RedirectChainService`, `PortScanService`
## What good looks like
A developer pastes a domain, taps run, and within a couple of seconds sees a
clean breakdown of TCP reachability, redirect chain, every DNS record type with
reverse DNS, email security posture, the full SSL cert status, HTTP response
headers with security headers highlighted, IP geolocation with a map, and a
port scan of common services. It should feel like a native, polished version of
running `dig`, `openssl s_client`, `curl -I`, `nmap`, and `whois` from the
terminal.
|