domsniper 0.1.0 → 0.1.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/README.md CHANGED
@@ -1,246 +1,198 @@
1
- # Domain Sniper
1
+ # domsniper
2
2
 
3
- All-in-one domain intelligence toolkit -- WHOIS, DNS, security recon, portfolio management, and a self-hostable marketplace. Built with Bun and TypeScript.
3
+ All-in-one domain intelligence toolkit -- WHOIS, DNS, security recon, portfolio management, and automated domain sniping. Built with Bun.
4
+
5
+ [![npm](https://img.shields.io/npm/v/domsniper)](https://www.npmjs.com/package/domsniper)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
4
7
 
5
8
  ## Install
6
9
 
7
10
  ```bash
8
- git clone https://github.com/yourusername/domain-sniper.git
9
- cd domain-sniper
10
- bun install
11
+ # Run directly (no install)
12
+ bunx domsniper
13
+
14
+ # Install globally
15
+ bun add -g domsniper
16
+
17
+ # Or clone for development
18
+ git clone https://github.com/t-rhex/domain-sniper.git
19
+ cd domain-sniper && bun install
11
20
  ```
12
21
 
22
+ **Requirements:** [Bun](https://bun.sh) runtime, `whois` and `dig` CLI tools.
23
+
13
24
  ## Quick Start
14
25
 
15
26
  ```bash
16
- # Interactive TUI -- scan domains, browse intel, manage portfolio
17
- bun run start
27
+ # Interactive TUI
28
+ domsniper
29
+
30
+ # Check a domain
31
+ domsniper example.com --headless
18
32
 
19
- # Headless check with JSON output (pipe to jq)
20
- bun run start --headless --json example.com startup.io
33
+ # JSON output (pipe to jq)
34
+ domsniper --headless --json example.com
21
35
 
22
- # Full security recon on a target
23
- bun run start recon example.com
36
+ # Full security recon
37
+ domsniper recon example.com
38
+
39
+ # Generate name ideas
40
+ domsniper suggest startup --check
41
+
42
+ # Snipe a domain (auto-register when it drops)
43
+ domsniper snipe add expiring-domain.com
44
+ domsniper snipe run
24
45
  ```
25
46
 
26
47
  ## Features
27
48
 
28
- ### Intelligence
29
- - **WHOIS & RDAP** -- Registration info, expiry dates, registrar details
30
- - **DNS Records** -- A, AAAA, MX, TXT, CNAME resolution
31
- - **HTTP Probe** -- Status codes, redirects, parked domain detection
32
- - **SSL Certificates** -- Issuer, expiry, SANs, protocol version
33
- - **Domain Scoring** -- 0-100 based on length, TLD, readability, brandability
34
- - **Wayback Machine** -- Archive history and snapshot count
35
- - **Social Media** -- Username availability across 12 platforms
36
- - **Tech Stack** -- Detect 40+ technologies (CMS, frameworks, CDN, analytics)
37
- - **Backlink Estimation** -- PageRank and CommonCrawl page count
38
- - **Domain Suggestions** -- Generate name ideas from keywords
49
+ ### Domain Intelligence
50
+ - **WHOIS & RDAP** -- Registration, expiry, registrar details
51
+ - **DNS Records** -- A, AAAA, MX, TXT, CNAME
52
+ - **HTTP Probe** -- Status, redirects, parked domain detection
53
+ - **SSL Certificates** -- Issuer, expiry, SANs, protocol
54
+ - **Domain Scoring** -- 0-100 (length, TLD, readability, brandability, SEO)
55
+ - **Wayback Machine** -- Archive history, snapshot count
56
+ - **Social Media** -- Username availability (12 platforms)
57
+ - **Tech Stack** -- 40+ technologies (CMS, frameworks, CDN, analytics)
58
+ - **Backlinks** -- PageRank + CommonCrawl estimation
59
+ - **Suggestions** -- Name ideas from keywords
39
60
  - **TLD Expansion** -- Check a name across all major TLDs
40
61
  - **Variations** -- Typos, plurals, prefixes, suffixes
41
62
 
42
- ### Security Recon
43
- - **Port Scanner** -- TCP connect scan on 20 common ports with banner grabbing
44
- - **Security Headers** -- HSTS, CSP, X-Frame-Options audit (A+ to F grading)
45
- - **Email Security** -- SPF, DKIM, DMARC analysis
46
- - **WAF Detection** -- Identify 10 firewalls (Cloudflare, AWS, Akamai, etc.)
47
- - **Blacklist Check** -- Query 8 DNS blocklists for reputation
48
- - **Sensitive Paths** -- Scan 37 paths for exposed .env, .git, admin panels
49
- - **CORS Check** -- Test 6 attack vectors for misconfigurations
50
- - **Certificate Transparency** -- Subdomain discovery via crt.sh
51
- - **Subdomain Takeover** -- Dangling CNAME detection (16 services)
63
+ ### Security Recon (toggle with `n` key)
64
+ - **Port Scanner** -- 20 ports, banner grabbing
65
+ - **Security Headers** -- 9 headers, A+ to F grading
66
+ - **Email Security** -- SPF/DKIM/DMARC audit
67
+ - **WAF Detection** -- 10 firewalls (Cloudflare, AWS, Akamai, etc.)
68
+ - **Blacklist Check** -- 8 DNS blocklists
69
+ - **Sensitive Paths** -- 37 paths (.env, .git, admin panels, SQL dumps)
70
+ - **CORS Check** -- 6 attack vectors
71
+ - **Cert Transparency** -- Subdomain discovery via crt.sh
72
+ - **Subdomain Takeover** -- 16 services (GitHub Pages, Heroku, S3, etc.)
52
73
  - **DNS Zone Transfer** -- AXFR vulnerability check
53
- - **Reverse IP** -- Discover co-hosted domains
54
- - **ASN/Geolocation** -- Network, ISP, and location info
74
+ - **Reverse IP** -- Shared hosting discovery
75
+ - **ASN/Geolocation** -- Network, ISP, location
55
76
 
56
- ### Portfolio Management
57
- - Track owned domains with purchase price, renewal dates, registrar
58
- - Financial tracking -- P&L, transactions, valuations, ROI
59
- - Renewal calendar with 90/60/30/7 day alerts
60
- - Health monitoring -- WHOIS, DNS, HTTP, SSL checks
61
- - Categories, tags, acquisition pipeline
62
- - CSV export for portfolio, transactions, and tax reporting
77
+ ### Portfolio Manager
78
+ - Track domains with purchase price, renewal dates, registrar
79
+ - P&L tracking, transactions, valuations, ROI
80
+ - Renewal calendar with alerts (90/60/30/7 days)
81
+ - Health monitoring (WHOIS, DNS, HTTP, SSL)
82
+ - Categories, pipeline, bulk operations
83
+ - CSV export (portfolio, transactions, tax)
63
84
 
64
85
  ### Automation
65
- - **Watch Mode** -- Hourly monitoring of tagged domains
66
- - **Drop Catching** -- High-frequency polling for expiring domains
67
- - **Snipe Engine** -- Auto-register domains the moment they become available
68
- - **Webhooks** -- Slack, Discord, and email notifications
69
- - **Expiring Feed** -- Browse domains about to drop
70
-
71
- ## TUI Keyboard Shortcuts
72
-
73
- | Key | Action |
74
- |-----|--------|
75
- | `/` or `i` | Enter domains to scan |
76
- | `f` | Load domains from file |
77
- | `e` | TLD expansion |
78
- | `v` | Generate variations |
79
- | `d` | Suggest similar names |
80
- | `Space` | Tag/untag domain |
81
- | `r` | Register domain |
82
- | `R` | Bulk register (two-step confirm) |
83
- | `Tab` | Cycle intel tabs |
84
- | `n` | Toggle recon mode |
85
- | `s` | Cycle status filter |
86
- | `o` / `O` | Cycle sort / toggle order |
87
- | `p` | Add to portfolio |
88
- | `P` | Portfolio dashboard |
89
- | `M` | Marketplace |
90
- | `w` | Watch tagged domains |
91
- | `D` | Drop catch (expired) |
92
- | `h` | Scan history |
93
- | `c` | Clear cache |
94
- | `x` | Export CSV/JSON |
95
- | `Ctrl+S` | Save session |
96
- | `Ctrl+L` | Load session |
97
- | `?` | Help |
98
- | `q` | Quit |
86
+ - **Snipe Engine** -- Watch -> detect expiry -> auto-register -> notify
87
+ - **Watch Mode** -- Hourly monitoring
88
+ - **Drop Catch** -- 30-second polling for pending-delete domains
89
+ - **Webhooks** -- Slack, Discord, email notifications
90
+
91
+ ### HTTP Proxy
92
+ - Intercept and log HTTP traffic
93
+ - Request replay
94
+ - CA cert generation for HTTPS
95
+ - Credential redaction in logs
96
+
97
+ ## TUI Shortcuts
98
+
99
+ | Key | Action | Key | Action |
100
+ |-----|--------|-----|--------|
101
+ | `/` | Scan domains | `Tab` | Cycle intel tabs |
102
+ | `e` | TLD expansion | `n` | Toggle recon mode |
103
+ | `f` | Load from file | `s` | Cycle status filter |
104
+ | `v` | Variations | `o/O` | Sort field/order |
105
+ | `d` | Suggestions | `Space` | Tag/untag |
106
+ | `r` | Register | `R` | Bulk register |
107
+ | `S` | Snipe domain | `D` | Drop catch |
108
+ | `p` | Add to portfolio | `P` | Portfolio dashboard |
109
+ | `M` | Marketplace | `w` | Watch tagged |
110
+ | `h` | Scan history | `c` | Clear cache |
111
+ | `x` | Export CSV/JSON | `?` | Help |
112
+ | `Ctrl+S` | Save session | `q` | Quit |
99
113
 
100
114
  ## CLI Commands
101
115
 
102
- | Command | Description |
103
- |---------|-------------|
104
- | `domain-sniper` | Interactive TUI mode |
105
- | `domain-sniper example.com --headless` | Quick check |
106
- | `domain-sniper --headless --json example.com` | JSON output |
107
- | `domain-sniper recon example.com` | Full security recon |
108
- | `domain-sniper suggest startup` | Generate domain name ideas |
109
- | `domain-sniper portfolio --dashboard` | Portfolio overview |
110
- | `domain-sniper portfolio --health` | Run health checks |
111
- | `domain-sniper portfolio --pnl` | Profit & loss report |
112
- | `domain-sniper portfolio --renewals` | Renewal calendar |
113
- | `domain-sniper portfolio --export-csv domains.csv` | Export portfolio |
114
- | `domain-sniper expiring --tld com` | Browse expiring domains |
115
- | `domain-sniper dropcatch example.com` | Auto-snipe dropping domain |
116
- | `domain-sniper market browse` | Browse marketplace |
117
- | `domain-sniper market list example.com -p 500` | List for sale |
118
- | `domain-sniper proxy start` | Start HTTP intercept proxy |
119
- | `domain-sniper snipe add example.com` | Add snipe target |
120
- | `domain-sniper db --stats` | Database statistics |
121
- | `domain-sniper config --show` | View configuration |
122
- | `domain-sniper completions zsh` | Shell completions |
123
-
124
- ## Marketplace
125
-
126
- A self-hostable domain marketplace with authentication, listings, offers, messaging, and domain ownership verification.
127
-
128
- ```bash
129
- # Start the marketplace server
130
- bun run serve
131
-
132
- # Browse from CLI
133
- domain-sniper market browse
134
-
135
- # List a domain for sale
136
- domain-sniper market list mydomain.com --price 500
137
- ```
138
-
139
- See [marketplace/README.md](marketplace/README.md) for full API documentation, verification methods, and self-hosting instructions.
140
-
141
- ## HTTP Proxy
142
-
143
- Intercept and inspect HTTP/HTTPS traffic for domain intelligence gathering.
144
-
145
- ```bash
146
- # Start the proxy
147
- domain-sniper proxy start
148
-
149
- # Start with custom port
150
- domain-sniper proxy start --port 8888
151
- ```
152
-
153
- The proxy generates a local CA certificate at `~/.domain-sniper/ca/`. Install it in your browser to inspect HTTPS traffic.
154
-
155
- ## Snipe Engine
156
-
157
- Automatically register domains the moment they become available.
158
-
159
116
  ```bash
160
- # Add a domain to watch
161
- domain-sniper snipe add example.com
162
-
163
- # List active snipes
164
- domain-sniper snipe list
165
-
166
- # Remove a snipe
167
- domain-sniper snipe remove example.com
117
+ # Scanning
118
+ domsniper example.com --headless # Quick check
119
+ domsniper --headless --json example.com # JSON output
120
+ domsniper --headless --recon example.com # With security recon
121
+ domsniper recon example.com # Standalone recon report
122
+
123
+ # Domain discovery
124
+ domsniper suggest startup --check # Generate + check ideas
125
+ domsniper expiring --tld com # Browse expiring domains
126
+
127
+ # Sniping
128
+ domsniper snipe add example.com # Add snipe target
129
+ domsniper snipe list # List targets
130
+ domsniper snipe run # Start snipe engine
131
+ domsniper dropcatch example.com # Direct drop catch
132
+
133
+ # Portfolio
134
+ domsniper portfolio --dashboard # Overview
135
+ domsniper portfolio --pnl # Profit & loss
136
+ domsniper portfolio --health # Health check all domains
137
+ domsniper portfolio --renewals # Renewal calendar
138
+ domsniper portfolio --export-csv out.csv # Export
139
+
140
+ # Marketplace
141
+ domsniper market signup # Create account
142
+ domsniper market browse # Browse listings
143
+ domsniper market list example.com -p 500 # List for sale
144
+ domsniper market offer -l 1 -a 300 # Make offer
145
+
146
+ # Proxy
147
+ domsniper proxy start --port 8080 # Start interceptor
148
+ domsniper proxy history --host target.com # Browse captured traffic
149
+ domsniper proxy replay 42 # Replay a request
150
+
151
+ # Utilities
152
+ domsniper db --stats # Database stats
153
+ domsniper config --show # View config
154
+ domsniper check-update # Check for updates
155
+ domsniper completions zsh # Shell completions
168
156
  ```
169
157
 
170
- Requires a registrar API key configured in `.env`.
171
-
172
158
  ## Configuration
173
159
 
174
- Copy `.env.example` to `.env` and configure:
175
-
176
160
  ```bash
177
161
  cp .env.example .env
178
162
  ```
179
163
 
180
- ### Registrar API (for domain registration)
181
- - GoDaddy, Namecheap, or Cloudflare
182
- - Set `REGISTRAR_PROVIDER`, `REGISTRAR_API_KEY`, `REGISTRAR_API_SECRET`
164
+ Key settings:
165
+ - `REGISTRAR_PROVIDER` / `REGISTRAR_API_KEY` -- For domain registration (GoDaddy/Namecheap/Cloudflare)
166
+ - `MARKET_URL` -- Marketplace server URL
167
+ - `S3_BUCKET` / `S3_ACCESS_KEY_ID` -- Cloud export storage
183
168
 
184
- ### Marketplace
185
- - Set `BETTER_AUTH_SECRET` (min 32 chars) for auth
186
- - Set `BETTER_AUTH_URL` for server URL
187
- - Set `MARKET_URL` to point CLI at your marketplace instance
188
-
189
- ### Persistent config
190
169
  ```bash
191
- domain-sniper config --set concurrency=10
192
- domain-sniper config --set notifications.webhookUrl=https://hooks.slack.com/...
170
+ # Persistent config
171
+ domsniper config --set concurrency=10
172
+ domsniper config --set notifications.webhookUrl=https://hooks.slack.com/...
193
173
  ```
194
174
 
195
- ## Self-Hosting the Marketplace
196
-
197
- 1. Clone the repo
198
- 2. Set `BETTER_AUTH_SECRET` and `BETTER_AUTH_URL` in `.env`
199
- 3. Run `bun run serve`
200
- 4. Point CLI clients to your server: `domain-sniper market login --server https://your-server.com`
201
-
202
- For production, consider PostgreSQL, rate limiting, and TLS. See [marketplace/README.md](marketplace/README.md).
203
-
204
175
  ## Architecture
205
176
 
206
177
  ```
207
- src/core/ Portable business logic (40+ modules)
208
- src/proxy/ HTTP/HTTPS interceptor
209
- src/app.tsx TUI (React + @opentui)
210
- src/index.tsx CLI (Commander)
211
- src/market-client.ts Marketplace API client
212
- marketplace/ Self-hostable marketplace server
178
+ src/core/ Portable business logic (40+ modules)
179
+ src/core/db.ts SQLite database (scans, portfolio, cache, snipes)
180
+ src/proxy/ HTTP/HTTPS interceptor
181
+ src/app.tsx TUI (React + @opentui)
182
+ src/index.tsx CLI (Commander)
183
+ src/market-client.ts Marketplace API client
213
184
  ```
214
185
 
215
- See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full breakdown.
216
-
217
- ## Security
218
-
219
- - Registrar API keys never leave your machine
220
- - All inputs validated, all queries parameterized
221
- - Shell commands use `execFile` (no injection)
222
- - File paths confined to allowed directories
223
-
224
- See [docs/SECURITY.md](docs/SECURITY.md) for the full security model.
225
-
226
- ## Tech Stack
227
-
228
- - **Runtime:** Bun
229
- - **Language:** TypeScript (strict mode)
230
- - **TUI:** @opentui/react
231
- - **Database:** SQLite (bun:sqlite)
232
- - **Auth:** Better Auth
233
- - **Tests:** bun:test
186
+ See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/SECURITY.md](docs/SECURITY.md).
234
187
 
235
188
  ## Contributing
236
189
 
237
- 1. Fork the repo
238
- 2. Create a feature branch: `git checkout -b feat/my-feature`
239
- 3. Write tests first, then implement
240
- 4. Ensure `bunx tsc --noEmit` passes
241
- 5. Ensure `bun test` passes
242
- 6. Submit a pull request
190
+ 1. Fork and clone
191
+ 2. `bun install`
192
+ 3. Write tests: `bun test`
193
+ 4. Type check: `bunx tsc --noEmit`
194
+ 5. Submit PR
243
195
 
244
196
  ## License
245
197
 
246
- MIT -- see [LICENSE](LICENSE).
198
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "domsniper",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "All-in-one domain intelligence toolkit — availability checker, security recon, portfolio manager. Built with Bun.",
5
5
  "module": "src/index.tsx",
6
6
  "type": "module",
@@ -2,9 +2,18 @@ import { assertValidDomain } from "../validate.js";
2
2
  import type { HttpProbeResult } from "../types.js";
3
3
 
4
4
  const PARKED_INDICATORS = [
5
- "parked", "for sale", "buy this domain", "domain parking",
6
- "godaddy", "sedo", "afternic", "hugedomains", "dan.com",
7
- "this domain is for sale", "under construction",
5
+ "this domain is parked",
6
+ "domain is for sale",
7
+ "buy this domain",
8
+ "domain parking",
9
+ "this domain may be for sale",
10
+ "hugedomains.com",
11
+ "dan.com/buy-domain",
12
+ "this domain is for sale",
13
+ "under construction",
14
+ "parked by",
15
+ "domain has expired",
16
+ "renew this domain",
8
17
  ];
9
18
 
10
19
  export async function httpProbe(domain: string): Promise<HttpProbeResult> {
@@ -24,14 +24,14 @@ const HTML_PATTERNS: { name: string; category: string; pattern: RegExp }[] = [
24
24
  { name: "WordPress", category: "CMS", pattern: /wp-content|wp-includes|wordpress/i },
25
25
  { name: "Drupal", category: "CMS", pattern: /drupal|sites\/default\/files/i },
26
26
  { name: "Joomla", category: "CMS", pattern: /joomla|\/media\/system\/js/i },
27
- { name: "Shopify", category: "CMS", pattern: /shopify|cdn\.shopify\.com/i },
27
+ { name: "Shopify", category: "CMS", pattern: /cdn\.shopify\.com|myshopify\.com|Shopify\.theme/i },
28
28
  { name: "Squarespace", category: "CMS", pattern: /squarespace|sqsp/i },
29
29
  { name: "Wix", category: "CMS", pattern: /wix\.com|wixstatic\.com/i },
30
30
  { name: "Webflow", category: "CMS", pattern: /webflow/i },
31
31
  { name: "Ghost", category: "CMS", pattern: /ghost\.io|ghost-api/i },
32
32
  { name: "Hugo", category: "CMS", pattern: /hugo-/i },
33
33
  // Frameworks
34
- { name: "React", category: "Framework", pattern: /react|__next|_next\/static/i },
34
+ { name: "React", category: "Framework", pattern: /react\.production\.min|reactDOM|data-reactroot|__react/i },
35
35
  { name: "Next.js", category: "Framework", pattern: /_next\/|__NEXT_DATA__/i },
36
36
  { name: "Vue.js", category: "Framework", pattern: /vue\.js|__vue|nuxt/i },
37
37
  { name: "Nuxt", category: "Framework", pattern: /__nuxt|nuxt\.js/i },
package/src/core/whois.ts CHANGED
@@ -83,15 +83,15 @@ function parseWhoisResponse(domain: string, raw: string): WhoisResult {
83
83
  result.registrar = line.split(":").slice(1).join(":").trim();
84
84
  }
85
85
 
86
- // Created date
86
+ // Created date — prefer "Creation Date:" (registrar-level) over "created:" (TLD-level)
87
87
  if (
88
- !result.createdDate &&
89
- (lower.startsWith("creation date:") ||
90
- lower.startsWith("created:") ||
91
- lower.startsWith("created date:") ||
92
- lower.startsWith("registration date:"))
88
+ lower.startsWith("creation date:") ||
89
+ lower.startsWith("created date:") ||
90
+ lower.startsWith("registration date:")
93
91
  ) {
94
92
  result.createdDate = line.split(":").slice(1).join(":").trim();
93
+ } else if (!result.createdDate && lower.startsWith("created:")) {
94
+ result.createdDate = line.split(":").slice(1).join(":").trim();
95
95
  }
96
96
 
97
97
  // Updated date
package/src/index.tsx CHANGED
@@ -43,7 +43,7 @@ const program = new Command();
43
43
  program
44
44
  .name("dsniper")
45
45
  .description("All-in-one domain intelligence toolkit — availability checker, security recon, portfolio manager")
46
- .version("0.1.0")
46
+ .version("0.1.1")
47
47
  .argument("[domains...]", "Domain(s) to check")
48
48
  .option("-f, --file <path>", "Path to file with domains (one per line)")
49
49
  .option("-a, --auto-register", "Automatically register available domains", false)