#727 by GitHub stars

retlehs/quien

Use the quien CLI for domain and IP lookups: WHOIS/RDAP, DNS, mail authentication, TLS certificates, HTTP headers, SEO analysis, and tech stack detection. Activate when the user asks about a domain's owner, registrar, expiry, DNS records, mail config (SPF, DMARC, DKIM, BIMI), SSL certificate, HTTP h

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

417632b44244 → 417632b44244

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 417632b44244

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 417632b44244183a77e599e6b6be4430923717d0

1.3kGitHub stars
0stars in 7 days
1skill in this repository
2commits in 30 days

Heat

2.3
  • Star growth, last 7 daysAhead of 6% of tracked repositories
  • Star growth, last 24 hoursAhead of 70% of tracked repositories
  • Rank movement, last 7 daysAhead of 4% of tracked repositories
  • Commits, last 30 daysAhead of 60% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Jul 31, 2026Nov 6, 20261,308

Individual skills in this repository

How it works

quien

When your agent uses it

Use the quien CLI for domain and IP lookups: WHOIS/RDAP, DNS, mail authentication, TLS certificates, HTTP headers, SEO analysis, and tech stack detection. Activate when the user asks about a domain's owner, registrar, expiry, DNS records, mail config (SPF, DMARC, DKIM, BIMI), SSL certificate, HTTP headers, SEO, Core Web Vitals, tech stack, CMS, hosting, or IP address info (ASN, network, abuse contact).

What it loads into context

Frontmatter

107 tokens

Always available to the agent

SKILL.md

548 tokens

When the skill is activated

Reference documents

2,145 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Commands
  2. When to use
  3. Install

Scripts executed separately

  • cmd/all.go
  • cmd/dns.go
  • cmd/http.go
  • cmd/mail.go
  • cmd/mail_test.go
  • cmd/root.go
  • cmd/seo.go
  • cmd/stack.go
  • cmd/tls.go
  • cmd/whois.go
  • internal/bgp/client.go
  • internal/bgp/client_test.go
  • internal/display/display.go
  • internal/display/display_test.go
  • internal/display/dns.go
  • internal/display/dns_test.go
  • internal/display/http.go
  • internal/display/interactive.go
  • internal/display/interactive_test.go
  • internal/display/ip.go
  • internal/display/mail.go
  • internal/display/prompt.go
  • internal/display/raw.go
  • internal/display/seo.go
  • internal/display/stack.go
  • internal/display/theme.go
  • internal/display/tls.go
  • internal/dns/dns.go
  • internal/dns/dns_test.go
  • internal/dnsutil/resolve.go
  • internal/dnsutil/resolve_test.go
  • internal/dnsutil/resolver.go
  • internal/dnsutil/resolver_test.go
  • internal/httpinfo/httpinfo.go
  • internal/mail/bimi.go
  • internal/mail/bimi_roots.go
  • internal/mail/bimi_test.go
  • internal/mail/mail.go
  • internal/mail/mail_test.go
  • internal/mail/spf.go
  • internal/mail/spf_test.go
  • internal/model/domain.go
  • internal/peeringdb/client.go
  • internal/peeringdb/client_test.go
  • internal/rdap/bootstrap.go
  • internal/rdap/client.go
  • internal/rdap/ip.go
  • internal/resolver/normalize.go
  • internal/resolver/normalize_test.go
  • internal/resolver/resolver.go
  • internal/resolver/resolver_test.go
  • internal/retry/retry.go
  • internal/retry/retry_test.go
  • internal/seo/crux.go
  • internal/seo/crux_test.go
  • internal/seo/seo.go
  • internal/seo/seo_test.go
  • internal/stack/stack.go
  • internal/stack/stack_test.go
  • internal/tlsinfo/tlsinfo.go
  • internal/tlsinfo/tlsinfo_test.go
  • internal/whois/client.go
  • internal/whois/client_test.go
  • internal/whois/parser.go
  • internal/whois/parser_test.go
  • internal/whois/servers.go
  • internal/whois/tlds.go
  • internal/whois/tlds_test.go
  • main.go

Files

  • .github/renovate.jsonasset1,320 bytes
  • .github/workflows/ci.ymlasset1,373 bytes
  • .github/workflows/nix-update.ymlasset858 bytes
  • .github/workflows/release.ymlasset6,750 bytes
  • .gitignoreasset33 bytes
  • .goreleaser.ymlasset739 bytes
  • CONTRIBUTING.mddoc1,957 bytes
  • LICENSE.mddoc1,060 bytes
  • README.mddoc5,110 bytes
  • SKILL.mdcore1,977 bytes
  • SKILL.mdcore1,977 bytes
  • SKILL.mdcore1,977 bytes
  • SKILL.mdcore1,977 bytes
  • cmd/all.goruns2,724 bytes
  • cmd/dns.goruns1,214 bytes
  • cmd/http.goruns674 bytes
  • cmd/mail.goruns1,175 bytes
  • cmd/mail_test.goruns516 bytes
  • cmd/root.goruns4,225 bytes
  • cmd/seo.goruns659 bytes
  • cmd/stack.goruns695 bytes
  • cmd/tls.goruns693 bytes
  • cmd/whois.goruns761 bytes
  • demo.gifasset1,116,251 bytes
  • demo.tapeasset400 bytes
  • flake.lockasset1,494 bytes
  • flake.nixasset1,093 bytes
  • go.modasset1,282 bytes
  • go.sumasset5,701 bytes
  • internal/bgp/client.goruns1,935 bytes
  • internal/bgp/client_test.goruns2,376 bytes
  • internal/display/display.goruns9,040 bytes
  • internal/display/display_test.goruns2,812 bytes
  • internal/display/dns.goruns5,072 bytes
  • internal/display/dns_test.goruns2,536 bytes
  • internal/display/http.goruns2,527 bytes
  • internal/display/interactive.goruns24,181 bytes
  • internal/display/interactive_test.goruns3,343 bytes
  • internal/display/ip.goruns3,054 bytes
  • internal/display/mail.goruns7,447 bytes
  • internal/display/prompt.goruns2,596 bytes
  • internal/display/raw.goruns130 bytes
  • internal/display/seo.goruns9,390 bytes
  • internal/display/stack.goruns2,826 bytes
  • internal/display/theme.goruns1,326 bytes
  • internal/display/tls.goruns1,465 bytes
  • internal/dns/dns.goruns8,225 bytes
  • internal/dns/dns_test.goruns6,566 bytes
  • internal/dnsutil/resolve.goruns2,231 bytes
  • internal/dnsutil/resolve_test.goruns2,728 bytes
  • internal/dnsutil/resolver.goruns3,121 bytes
  • internal/dnsutil/resolver_test.goruns2,319 bytes
  • internal/httpinfo/httpinfo.goruns3,524 bytes
  • internal/mail/bimi.goruns5,928 bytes
  • internal/mail/bimi_roots.goruns4,383 bytes
  • internal/mail/bimi_test.goruns10,681 bytes
  • internal/mail/mail.goruns7,065 bytes
  • internal/mail/mail_test.goruns7,900 bytes
  • internal/mail/spf.goruns8,894 bytes
  • internal/mail/spf_test.goruns19,960 bytes
  • internal/model/domain.goruns1,081 bytes
  • internal/peeringdb/client.goruns2,599 bytes
  • internal/peeringdb/client_test.goruns3,174 bytes
  • internal/rdap/bootstrap.goruns1,636 bytes
  • internal/rdap/client.goruns4,242 bytes
  • internal/rdap/ip.goruns8,270 bytes
  • internal/resolver/normalize.goruns2,839 bytes
  • internal/resolver/normalize_test.goruns3,538 bytes
  • internal/resolver/resolver.goruns2,950 bytes
  • internal/resolver/resolver_test.goruns3,934 bytes
  • internal/retry/retry.goruns589 bytes
  • internal/retry/retry_test.goruns1,645 bytes
  • internal/seo/crux.goruns7,055 bytes
  • internal/seo/crux_test.goruns4,353 bytes
  • internal/seo/seo.goruns12,809 bytes
  • internal/seo/seo_test.goruns12,764 bytes
  • internal/stack/stack.goruns14,145 bytes
  • internal/stack/stack_test.goruns9,388 bytes
  • internal/tlsinfo/tlsinfo.goruns2,021 bytes
  • internal/tlsinfo/tlsinfo_test.goruns944 bytes
  • internal/whois/client.goruns4,677 bytes
  • internal/whois/client_test.goruns595 bytes
  • internal/whois/parser.goruns6,470 bytes
  • internal/whois/parser_test.goruns7,727 bytes
  • internal/whois/servers.goruns1,791 bytes
  • internal/whois/tlds.goruns5,018 bytes
  • internal/whois/tlds_test.goruns6,788 bytes
  • main.goruns347 bytes
  • packaging/aur/quien-bin/PKGBUILD.templateasset829 bytes
  • packaging/aur/quien/PKGBUILD.templateasset945 bytes
Read SKILL.md

# quien — domain & IP lookup tool

When the user asks questions about domains or IP addresses, use `quien` instead of `whois`, `dig`, `nslookup`, or `curl`.

## Commands

```bash
# WHOIS / domain registration
quien whois example.com

# DNS records (A, AAAA, CNAME, MX, NS, TXT, PTR, SOA, DNSSEC)
quien dns example.com

# Mail config (MX, SPF, DMARC, DKIM)
View the complete source on GitHub

Skills included

  • quien

Repository facts

License
MIT
Created
Apr 10, 2026
Last pushed
Oct 28, 2026
Forks
34
Open issues
9
Project activity
Active

Rank over the last 12 weeks

Now #727 · best #479 · down 146 in 30 days

  1. #711 on Nov 1
  2. #715 on Nov 2
  3. #720 on Nov 3
  4. #723 on Nov 4
  5. #724 on Nov 5
  6. #727 since Nov 6
47 earlier periods
  1. #513 on Aug 1
  2. #473 on Aug 5
  3. #479 on Aug 9
  4. #499 on Aug 10
  5. #493 on Aug 12
  6. #499 on Aug 13
  7. #479 on Aug 15
  8. #494 on Aug 17
  9. #508 on Aug 18
  10. #503 on Aug 19
  11. #503 on Aug 21
  12. #487 on Aug 22
  13. #518 on Aug 25
  14. #522 on Aug 27
  15. #521 on Aug 28
  16. #526 on Sep 1
  17. #529 on Sep 3
  18. #512 on Sep 4
  19. #526 on Sep 12
  20. #548 on Sep 14
  21. #548 on Sep 16
  22. #544 on Sep 17
  23. #535 on Sep 19
  24. #552 on Sep 21
  25. #563 on Sep 22
  26. #559 on Sep 23
  27. #544 on Sep 24
  28. #541 on Sep 25
  29. #562 on Sep 27
  30. #580 on Sep 30
  31. #572 on Oct 2
  32. #571 on Oct 5
  33. #581 on Oct 6
  34. #610 on Oct 8
  35. #581 on Oct 10
  36. #584 on Oct 11
  37. #612 on Oct 15
  38. #617 on Oct 16
  39. #637 on Oct 20
  40. #645 on Oct 21
  41. #625 from Oct 22 to Oct 23
  42. #612 on Oct 24
  43. #691 on Oct 25
  44. #699 on Oct 28
  45. #701 on Oct 29
  46. #704 on Oct 30
  47. #710 on Oct 31

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 3, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 3 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 260 signals by file

.github/renovate.json

  • Network accessline 1
    {   "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  • Network accessline 2
    "$schema": "https://docs.renovatebot.com/renovate-schema.json",

.github/workflows/release.yml

  • Dangerous shell operationline 42
    run: sudo apt-get update && sudo apt-get install -y apt-utils gnupg rclone
  • Access to secretsline 49
    [Credential-related source omitted]
  • Access to secretsline 64
    [Credential-related source omitted]
  • Network accessline 123
    if [ "$(id -u)" -ne 0 ]; then             echo "This script must be run as root (try: curl -fsSL https://apt.quien.dev/install.sh | sudo sh)" >&2
  • Dangerous shell operationline 124
    echo "This script must be run as root (try: curl -fsSL https://apt.quien.dev/install.sh | sudo sh)" >&2
  • Network accessline 124
    echo "This script must be run as root (try: curl -fsSL https://apt.quien.dev/install.sh | sudo sh)" >&2
  • Network accessline 130
    curl -fsSL https://apt.quien.dev/pubkey.gpg | gpg --dearmor -o "$KEYRING"
  • Network accessline 133
    echo "deb [signed-by=$KEYRING] https://apt.quien.dev stable main" > "$SOURCES"
  • Network accessline 149
    run: |           VERSION="${{ steps.version.outputs.version }}"           SHA_SRC=$(curl -fsSL "https://github.com/${{ github.repository }}/archive/${{ github.ref_name }}.tar.gz" | sha256sum | awk '{print $1}')
  • Network accessline 150
    VERSION="${{ steps.version.outputs.version }}"           SHA_SRC=$(curl -fsSL "https://github.com/${{ github.repository }}/archive/${{ github.ref_name }}.tar.gz" | sha256sum | awk '{print $1}')           SHA_AMD64=$(sha256sum dist/quien_lin
  • Network accessline 151
    SHA_SRC=$(curl -fsSL "https://github.com/${{ github.repository }}/archive/${{ github.ref_name }}.tar.gz" | sha256sum | awk '{print $1}')

.goreleaser.yml

  • Network accessline 28
    package_name: quien     vendor: retlehs     homepage: https://github.com/retlehs/quien
  • Network accessline 29
    vendor: retlehs     homepage: https://github.com/retlehs/quien     maintainer: Ben Word <ben@benword.com>
  • Network accessline 30
    homepage: https://github.com/retlehs/quien

README.md

  • Network accessline 3
    [![Build status](https://img.shields.io/github/actions/workflow/status/retlehs/quien/ci.yml?branch=main&style=flat-square)](https://github.com/retlehs/quien/actions)
  • Network accessline 4
    ![GitHub release](https://img.shields.io/github/release/retlehs/quien?style=flat-square)
  • Network accessline 5
    ![GitHub downloads](https://img.shields.io/github/downloads/retlehs/quien/total?label=github%20downloads&style=flat-square)
  • Dangerous shell operationline 24
    curl -fsSL https://apt.quien.dev/install.sh | sudo sh
  • Network accessline 24
    curl -fsSL https://apt.quien.dev/install.sh | sudo sh
  • Access to secretsline 106
    [Credential-related source omitted]
  • Network accessline 114
    1. Go to the [Google Cloud Console](https://console.cloud.google.com/)
  • Access to secretsline 121
    [Credential-related source omitted]
  • Network accessline 155
    Add quien as a [agent skill](https://skills.sh/) so agents use it for domain and IP lookups:

cmd/all.go

  • Executable scriptline 1
    Executable file

cmd/dns.go

  • Executable scriptline 1
    Executable file

cmd/http.go

  • Executable scriptline 1
    Executable file

cmd/mail.go

  • Executable scriptline 1
    Executable file

cmd/mail_test.go

  • Executable scriptline 1
    Executable file

cmd/root.go

  • Executable scriptline 1
    Executable file

cmd/seo.go

  • Executable scriptline 1
    Executable file

cmd/stack.go

  • Executable scriptline 1
    Executable file

cmd/tls.go

  • Executable scriptline 1
    Executable file

cmd/whois.go

  • Executable scriptline 1
    Executable file

internal/bgp/client.go

  • Executable scriptline 1
    Executable file
  • Network accessline 10
    const ( 	defaultBaseURL = "https://stat.ripe.net/data"
  • Network accessline 11
    defaultBaseURL = "https://stat.ripe.net/data"
  • Network accessline 12
    userAgent      = "quien/0 (+https://github.com/retlehs/quien)"
  • Network accessline 15
    var ( 	baseURL = defaultBaseURL 	client  = &http.Client{Timeout: 10 * time.Second}
  • Network accessline 16
    baseURL = defaultBaseURL 	client  = &http.Client{Timeout: 10 * time.Second} )
  • Network accessline 17
    client  = &http.Client{Timeout: 10 * time.Second}

internal/bgp/client_test.go

  • Executable scriptline 1
    Executable file

internal/display/display.go

  • Executable scriptline 1
    Executable file

internal/display/display_test.go

  • Executable scriptline 1
    Executable file

internal/display/dns.go

  • Executable scriptline 1
    Executable file

internal/display/dns_test.go

  • Executable scriptline 1
    Executable file

internal/display/http.go

  • Executable scriptline 1
    Executable file

internal/display/interactive.go

  • Executable scriptline 1
    Executable file

internal/display/interactive_test.go

  • Executable scriptline 1
    Executable file

internal/display/ip.go

  • Executable scriptline 1
    Executable file

internal/display/mail.go

  • Executable scriptline 1
    Executable file

internal/display/prompt.go

  • Executable scriptline 1
    Executable file

internal/display/raw.go

  • Executable scriptline 1
    Executable file

internal/display/seo.go

  • Executable scriptline 1
    Executable file
  • Access to secretsline 46
    [Credential-related source omitted]

internal/display/stack.go

  • Executable scriptline 1
    Executable file

internal/display/theme.go

  • Executable scriptline 1
    Executable file

internal/display/tls.go

  • Executable scriptline 1
    Executable file

internal/dns/dns.go

  • Executable scriptline 1
    Executable file

internal/dns/dns_test.go

  • Executable scriptline 1
    Executable file

internal/dnsutil/resolve.go

  • Executable scriptline 1
    Executable file

internal/dnsutil/resolve_test.go

  • Executable scriptline 1
    Executable file

internal/dnsutil/resolver.go

  • Executable scriptline 1
    Executable file

internal/dnsutil/resolver_test.go

  • Executable scriptline 1
    Executable file

internal/httpinfo/httpinfo.go

  • Executable scriptline 1
    Executable file
  • Network accessline 31
    // Lookup performs a HEAD request to https://{domain}, follows redirects,
  • Network accessline 36
    client := &http.Client{

internal/mail/bimi.go

  • Executable scriptline 1
    Executable file
  • Network accessline 63
    client := &http.Client{
  • Network accessline 125
    // checkHTTPSRedirect refuses redirect targets that downgrade to plaintext, // so an attacker can't publish a BIMI record that 302s from https://... to
  • Network accessline 126
    // so an attacker can't publish a BIMI record that 302s from https://... to
  • Network accessline 127
    // http://... and swap the VMC mid-flight.

internal/mail/bimi_roots.go

  • Executable scriptline 1
    Executable file

internal/mail/bimi_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 29
    { 			name: "full record", 			raw:  "v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/vmc.pem",
  • Network accessline 30
    name: "full record", 			raw:  "v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/vmc.pem", 			logo: "https://example.com/logo.svg",
  • Network accessline 31
    raw:  "v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/vmc.pem",
  • Network accessline 32
    logo: "https://example.com/logo.svg",
  • Network accessline 33
    vmc:  "https://example.com/vmc.pem",
  • Network accessline 35
    { 			name: "no spaces", 			raw:  "v=BIMI1;l=https://example.com/logo.svg;a=https://example.com/vmc.pem",
  • Network accessline 36
    name: "no spaces", 			raw:  "v=BIMI1;l=https://example.com/logo.svg;a=https://example.com/vmc.pem", 			logo: "https://example.com/logo.svg",
  • Network accessline 37
    raw:  "v=BIMI1;l=https://example.com/logo.svg;a=https://example.com/vmc.pem",
  • Network accessline 38
    logo: "https://example.com/logo.svg",
  • Network accessline 39
    vmc:  "https://example.com/vmc.pem",
  • Network accessline 41
    { 			name: "missing vmc", 			raw:  "v=BIMI1; l=https://example.com/logo.svg",
  • Network accessline 42
    name: "missing vmc", 			raw:  "v=BIMI1; l=https://example.com/logo.svg", 			logo: "https://example.com/logo.svg",
  • Network accessline 43
    raw:  "v=BIMI1; l=https://example.com/logo.svg",
  • Network accessline 44
    logo: "https://example.com/logo.svg",
  • Network accessline 47
    { 			name: "missing logo", 			raw:  "v=BIMI1; a=https://example.com/vmc.pem",
  • Network accessline 48
    name: "missing logo", 			raw:  "v=BIMI1; a=https://example.com/vmc.pem", 			logo: "",
  • Network accessline 49
    raw:  "v=BIMI1; a=https://example.com/vmc.pem",
  • Network accessline 50
    logo: "", 			vmc:  "https://example.com/vmc.pem", 		},
  • Network accessline 51
    vmc:  "https://example.com/vmc.pem",
  • Network accessline 53
    { 			name: "uppercase keys", 			raw:  "v=BIMI1; L=https://example.com/logo.svg; A=https://example.com/vmc.pem",
  • Network accessline 54
    name: "uppercase keys", 			raw:  "v=BIMI1; L=https://example.com/logo.svg; A=https://example.com/vmc.pem", 			logo: "https://example.com/logo.svg",
  • Network accessline 55
    raw:  "v=BIMI1; L=https://example.com/logo.svg; A=https://example.com/vmc.pem",
  • Network accessline 56
    logo: "https://example.com/logo.svg",
  • Network accessline 57
    vmc:  "https://example.com/vmc.pem",
  • Network accessline 59
    { 			name: "extra whitespace", 			raw:  "  v=BIMI1 ;  l =  https://example.com/logo.svg  ;  a =  https://example.com/vmc.pem  ",
  • Network accessline 60
    name: "extra whitespace", 			raw:  "  v=BIMI1 ;  l =  https://example.com/logo.svg  ;  a =  https://example.com/vmc.pem  ", 			logo: "https://example.com/logo.svg",
  • Network accessline 61
    raw:  "  v=BIMI1 ;  l =  https://example.com/logo.svg  ;  a =  https://example.com/vmc.pem  ",
  • Network accessline 62
    logo: "https://example.com/logo.svg",
  • Network accessline 63
    vmc:  "https://example.com/vmc.pem",
  • Network accessline 124
    func TestFetchVMCRejectsNonHTTPS(t *testing.T) { 	cases := []string{ 		"http://example.com/vmc.pem",
  • Network accessline 125
    cases := []string{ 		"http://example.com/vmc.pem", 		"file:///etc/passwd",
  • Network accessline 126
    "http://example.com/vmc.pem",
  • Network accessline 144
    func TestCheckHTTPSRedirect(t *testing.T) { 	httpsReq := &http.Request{URL: mustParseURL(t, "https://example.com/next.pem")}
  • Network accessline 145
    httpsReq := &http.Request{URL: mustParseURL(t, "https://example.com/next.pem")}
  • Network accessline 146
    httpReq := &http.Request{URL: mustParseURL(t, "http://example.com/next.pem")}

internal/mail/mail.go

  • Executable scriptline 1
    Executable file

internal/mail/mail_test.go

  • Executable scriptline 1
    Executable file

internal/mail/spf.go

  • Executable scriptline 1
    Executable file
  • Network accessline 75
    records, void, err := fetch(domain)
  • Network accessline 255
    continue 		} 		records, void, err := fetch(c.Target)
  • Network accessline 256
    } 		records, void, err := fetch(c.Target) 		if err != nil {
  • Network accessline 257
    records, void, err := fetch(c.Target)

internal/mail/spf_test.go

  • Executable scriptline 1
    Executable file

internal/model/domain.go

  • Executable scriptline 1
    Executable file

internal/peeringdb/client.go

  • Executable scriptline 1
    Executable file
  • Network accessline 11
    const defaultBaseURL = "https://www.peeringdb.com/api"
  • Network accessline 12
    const userAgent = "quien/0 (+https://github.com/retlehs/quien)"
  • Network accessline 14
    var ( 	baseURL = defaultBaseURL 	client  = &http.Client{Timeout: 10 * time.Second}
  • Network accessline 15
    baseURL = defaultBaseURL 	client  = &http.Client{Timeout: 10 * time.Second} )
  • Network accessline 16
    client  = &http.Client{Timeout: 10 * time.Second}

internal/peeringdb/client_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 18
    t.Fatalf("user-agent = %q, want %q", got, want) 		} 		_, _ = w.Write([]byte(`{"data":[{"asn":15169,"name":"GOOGLE","name_long":"Google LLC","website":"https://google.com","policy_general":"Open","policy_ratio":false,"policy_locations":"Not 
  • Network accessline 19
    } 		_, _ = w.Write([]byte(`{"data":[{"asn":15169,"name":"GOOGLE","name_long":"Google LLC","website":"https://google.com","policy_general":"Open","policy_ratio":false,"policy_locations":"Not Required","info_traffic":"100+Tbps","ix_count":200
  • Network accessline 20
    _, _ = w.Write([]byte(`{"data":[{"asn":15169,"name":"GOOGLE","name_long":"Google LLC","website":"https://google.com","policy_general":"Open","policy_ratio":false,"policy_locations":"Not Required","info_traffic":"100+Tbps","ix_count":200,"fa

internal/rdap/bootstrap.go

  • Executable scriptline 1
    Executable file
  • Network accessline 12
    const bootstrapURL = "https://data.iana.org/rdap/dns.json"
  • Network accessline 45
    func loadBootstrap() error { 	client := &http.Client{Timeout: 10 * time.Second}
  • Network accessline 46
    client := &http.Client{Timeout: 10 * time.Second}

internal/rdap/client.go

  • Executable scriptline 1
    Executable file
  • Network accessline 62
    client := &http.Client{Timeout: timeout}

internal/rdap/ip.go

  • Executable scriptline 1
    Executable file
  • Network accessline 85
    const ( 	ipv4BootstrapURL = "https://data.iana.org/rdap/ipv4.json"
  • Network accessline 86
    ipv4BootstrapURL = "https://data.iana.org/rdap/ipv4.json"
  • Network accessline 87
    ipv6BootstrapURL = "https://data.iana.org/rdap/ipv6.json"
  • Network accessline 107
    url := baseURL + "ip/" + ip 	client := &http.Client{Timeout: 10 * time.Second}
  • Network accessline 108
    client := &http.Client{Timeout: 10 * time.Second}
  • Network accessline 318
    client := &http.Client{Timeout: 10 * time.Second}

internal/resolver/normalize.go

  • Executable scriptline 1
    Executable file

internal/resolver/normalize_test.go

  • Executable scriptline 1
    Executable file

internal/resolver/resolver.go

  • Executable scriptline 1
    Executable file

internal/resolver/resolver_test.go

  • Executable scriptline 1
    Executable file

internal/retry/retry.go

  • Executable scriptline 1
    Executable file

internal/retry/retry_test.go

  • Executable scriptline 1
    Executable file

internal/seo/crux.go

  • Executable scriptline 1
    Executable file
  • Network accessline 40
    const cruxAPI = "https://chromeuxreport.googleapis.com/v1/records:queryRecord"
  • Network accessline 41
    const cruxHistoryAPI = "https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord"
  • Access to secretsline 43
    [Credential-related source omitted]
  • Access to secretsline 48
    [Credential-related source omitted]
  • Network accessline 64
    client := &http.Client{Timeout: 10 * time.Second}
  • Network accessline 79
    func queryCrUXRecord(client *http.Client, apiKey, origin string) (*CWVData, error) {
  • Network accessline 113
    func queryCrUXHistory(client *http.Client, apiKey, origin string) (*CWVTrend, error) {
  • Network accessline 223
    // Rating based on Google's published p75 thresholds: 	// https://web.dev/articles/vitals
  • Network accessline 224
    // https://web.dev/articles/vitals

internal/seo/crux_test.go

  • Executable scriptline 1
    Executable file

internal/seo/seo.go

  • Executable scriptline 1
    Executable file
  • Network accessline 93
    client := &http.Client{
  • Network accessline 119
    func parseIndexability(r *Result, client *http.Client, baseURL string, headers http.Header, lower string) {
  • Network accessline 144
    func fetchRobotsTxt(r *Result, client *http.Client, baseURL string) {
  • Network accessline 297
    // Compression — Go's http.Client transparently decompresses and strips
  • Network accessline 323
    func checkCompression(r *Result, baseURL string) { 	client := &http.Client{
  • Network accessline 324
    client := &http.Client{

internal/seo/seo_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 193
    <meta property="og:title" content="OG Title"> 		<meta property="og:description" content="OG Description"> 		<meta property="og:image" content="https://example.com/image.png">
  • Network accessline 194
    <meta property="og:description" content="OG Description"> 		<meta property="og:image" content="https://example.com/image.png"> 		<meta property="og:type" content="website">
  • Network accessline 195
    <meta property="og:image" content="https://example.com/image.png">
  • Network accessline 206
    t.Errorf("OGDescription = %q", r.Social.OGDescription) 	} 	if r.Social.OGImage != "https://example.com/image.png" {
  • Network accessline 207
    } 	if r.Social.OGImage != "https://example.com/image.png" { 		t.Errorf("OGImage = %q", r.Social.OGImage)
  • Network accessline 208
    if r.Social.OGImage != "https://example.com/image.png" {
  • Network accessline 360
    func TestParseIndexability_Canonical(t *testing.T) { 	html := `<link rel="canonical" href="https://example.com/page">`
  • Network accessline 361
    html := `<link rel="canonical" href="https://example.com/page">`
  • Network accessline 365
    r.Indexability.Canonical = m[1] 	} 	if r.Indexability.Canonical != "https://example.com/page" {
  • Network accessline 366
    } 	if r.Indexability.Canonical != "https://example.com/page" { 		t.Errorf("Canonical = %q", r.Indexability.Canonical)
  • Network accessline 367
    if r.Indexability.Canonical != "https://example.com/page" {
  • Network accessline 379
    Sitemap: https://www.example.com/store/sitemap-index.xml
  • Network accessline 380
    Sitemap: https://www.example.com/surface/surface.index.xml
  • Network accessline 381
    Sitemap: https://www.example.com/sitemaps/ai/sitemapindex.xml
  • Network accessline 400
    } 	want := []string{ 		"https://www.example.com/store/sitemap-index.xml",
  • Network accessline 401
    want := []string{ 		"https://www.example.com/store/sitemap-index.xml", 		"https://www.example.com/surface/surface.index.xml",
  • Network accessline 402
    "https://www.example.com/store/sitemap-index.xml",
  • Network accessline 403
    "https://www.example.com/surface/surface.index.xml",
  • Network accessline 404
    "https://www.example.com/sitemaps/ai/sitemapindex.xml",
  • Network accessline 418
    <link rel="preload" href="/font.woff2" as="font"> 		<link rel="preload" href="/critical.css" as="style"> 		<link rel="preconnect" href="https://fonts.googleapis.com">
  • Network accessline 419
    <link rel="preload" href="/critical.css" as="style"> 		<link rel="preconnect" href="https://fonts.googleapis.com"> 		<link rel="stylesheet" href="/style.css">
  • Network accessline 420
    <link rel="preconnect" href="https://fonts.googleapis.com">

internal/stack/stack.go

  • Executable scriptline 1
    Executable file
  • Network accessline 79
    Headers http.Header 	Body    []byte 	BaseURL string // the URL that succeeded (https:// or http://)
  • Network accessline 80
    Body    []byte 	BaseURL string // the URL that succeeded (https:// or http://) }
  • Network accessline 81
    BaseURL string // the URL that succeeded (https:// or http://)
  • Network accessline 85
    func FetchPage(domain string) (*PageData, error) { 	client := &http.Client{
  • Network accessline 86
    client := &http.Client{
  • Network accessline 148
    wpSignals := []string{ 		`rel="https://api.w.org/"`, // REST API discovery link
  • Network accessline 149
    `rel="https://api.w.org/"`, // REST API discovery link

internal/stack/stack_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 18
    want bool 	}{ 		{"REST API link", `<link rel="https://api.w.org/" href="https://example.com/wp-json/" />`, true},
  • Network accessline 19
    }{ 		{"REST API link", `<link rel="https://api.w.org/" href="https://example.com/wp-json/" />`, true}, 		{"wp-includes", `<script src="/wp-includes/js/jquery.min.js"></script>`, true},
  • Network accessline 20
    {"REST API link", `<link rel="https://api.w.org/" href="https://example.com/wp-json/" />`, true},
  • Network accessline 154
    { 			name: "Webflow not detected from a link to webflow.com", 			html: `<a href="https://webflow.com">Built with Webflow</a>`,
  • Network accessline 155
    name: "Webflow not detected from a link to webflow.com", 			html: `<a href="https://webflow.com">Built with Webflow</a>`, 			want: "",
  • Network accessline 156
    html: `<a href="https://webflow.com">Built with Webflow</a>`,
  • Network accessline 193
    { 			name: "jQuery", 			html: `<script src="https://cdn.jsdelivr.net/npm/jquery.min.js"></script>`,
  • Network accessline 194
    name: "jQuery", 			html: `<script src="https://cdn.jsdelivr.net/npm/jquery.min.js"></script>`, 			want: []string{"jQuery"},
  • Network accessline 195
    html: `<script src="https://cdn.jsdelivr.net/npm/jquery.min.js"></script>`,
  • Network accessline 203
    { 			name: "Preact from submodule import", 			html: `<script type="importmap">{"imports":{"preact/hooks":"https://esm.sh/preact/hooks"}}</script>`,
  • Network accessline 204
    name: "Preact from submodule import", 			html: `<script type="importmap">{"imports":{"preact/hooks":"https://esm.sh/preact/hooks"}}</script>`, 			want: []string{"Preact"},
  • Network accessline 205
    html: `<script type="importmap">{"imports":{"preact/hooks":"https://esm.sh/preact/hooks"}}</script>`,
  • Network accessline 308
    html := `<html> <head> 	<script src="https://cdn.jsdelivr.net/npm/alpine.js"></script>
  • Network accessline 309
    <head> 	<script src="https://cdn.jsdelivr.net/npm/alpine.js"></script> 	<script src="https://www.googletagmanager.com/gtag/js"></script>
  • Network accessline 310
    <script src="https://cdn.jsdelivr.net/npm/alpine.js"></script>
  • Network accessline 311
    <script src="https://www.googletagmanager.com/gtag/js"></script>
  • Network accessline 312
    <link href="https://fonts.googleapis.com/css2?family=Inter" rel="stylesheet">
  • Network accessline 337
    func TestParseExternalServices_ExcludesSameDomain(t *testing.T) { 	html := `<script src="https://example.com/app.js"></script>
  • Network accessline 338
    html := `<script src="https://example.com/app.js"></script>
  • Network accessline 339
    <script src="https://www.example.com/other.js"></script>
  • Network accessline 340
    <script src="https://cdn.external.com/lib.js"></script>`

internal/tlsinfo/tlsinfo.go

  • Executable scriptline 1
    Executable file

internal/tlsinfo/tlsinfo_test.go

  • Executable scriptline 1
    Executable file

internal/whois/client.go

  • Executable scriptline 1
    Executable file

internal/whois/client_test.go

  • Executable scriptline 1
    Executable file

internal/whois/parser.go

  • Executable scriptline 1
    Executable file
  • Network accessline 67
    // Clean up status values (remove URLs appended after space, e.g. "clientDeleteProhibited https://...")

internal/whois/parser_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 10
    Registry Domain ID: 2336799_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.iana.org Registrar URL: http://www.iana.org
  • Network accessline 11
    Registrar WHOIS Server: whois.iana.org Registrar URL: http://www.iana.org Updated Date: 2024-08-14T07:01:38Z
  • Network accessline 12
    Registrar URL: http://www.iana.org
  • Network accessline 15
    Registry Expiry Date: 2025-08-13T04:00:00Z Registrar: RESERVED-Internet Assigned Numbers Authority Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited
  • Network accessline 16
    Registrar: RESERVED-Internet Assigned Numbers Authority Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
  • Network accessline 17
    Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited
  • Network accessline 18
    Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
  • Network accessline 136
    func TestParse_StatusURLStripping(t *testing.T) { 	raw := `Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited`
  • Network accessline 137
    raw := `Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited`

internal/whois/servers.go

  • Executable scriptline 1
    Executable file

internal/whois/tlds.go

  • Executable scriptline 1
    Executable file

internal/whois/tlds_test.go

  • Executable scriptline 1
    Executable file
  • Network accessline 111
    Last Modified: 2023-07-05T00:23:15Z Registrar Name: auDA Status: serverDeleteProhibited https://identitydigital.au/whois-status-codes#serverDeleteProhibited
  • Network accessline 112
    Registrar Name: auDA Status: serverDeleteProhibited https://identitydigital.au/whois-status-codes#serverDeleteProhibited Registrant Contact ID: 5b8528848e1b48ddbf62fa592f627c57-AU
  • Network accessline 113
    Status: serverDeleteProhibited https://identitydigital.au/whois-status-codes#serverDeleteProhibited
  • Network accessline 178
    "http://whois.markmonitor.com":  "whois.markmonitor.com",
  • Network accessline 179
    "https://whois.markmonitor.com": "whois.markmonitor.com",
  • Network accessline 181
    "HTTPS://whois.markmonitor.com": "whois.markmonitor.com",
  • Network accessline 182
    "Http://whois.example.com":      "whois.example.com",
  • Network accessline 186
    "https://whois.example.com/path":    "whois.example.com",
  • Network accessline 187
    "https://whois.example.com/p?q=1":   "whois.example.com",
  • Network accessline 188
    "https://whois.example.com#section": "whois.example.com",
  • Network accessline 189
    "  https://whois.example.com/path ": "whois.example.com",
  • Network accessline 191
    "whois.example.com:43":         "whois.example.com", 		"whois.example.com:4343":       "whois.example.com", 		"https://whois.example.com:43": "whois.example.com",
  • Network accessline 192
    "whois.example.com:4343":       "whois.example.com", 		"https://whois.example.com:43": "whois.example.com", 		"http://whois.example.com:43/": "whois.example.com",
  • Network accessline 193
    "https://whois.example.com:43": "whois.example.com",
  • Network accessline 194
    "http://whois.example.com:43/": "whois.example.com",

main.go

  • Executable scriptline 1
    Executable file

packaging/aur/quien-bin/PKGBUILD.template

  • Network accessline 6
    pkgdesc="A better whois and domain intelligence toolkit (pre-built binary)" arch=('x86_64' 'aarch64') url="https://github.com/retlehs/quien"
  • Network accessline 7
    arch=('x86_64' 'aarch64') url="https://github.com/retlehs/quien" license=('MIT')
  • Network accessline 8
    url="https://github.com/retlehs/quien"

packaging/aur/quien/PKGBUILD.template

  • Network accessline 5
    pkgdesc="A better whois and domain intelligence toolkit" arch=('x86_64' 'aarch64') url="https://github.com/retlehs/quien"
  • Network accessline 6
    arch=('x86_64' 'aarch64') url="https://github.com/retlehs/quien" license=('MIT')
  • Network accessline 7
    url="https://github.com/retlehs/quien"

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 6 facts
  • Contacts stat.ripe.net, which SKILL.md, the README and the plugin manifest do not mentioninternal/bgp/client.go:11High confidence
  • Contacts www.peeringdb.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/peeringdb/client.go:11High confidence
  • Contacts data.iana.org, which SKILL.md, the README and the plugin manifest do not mentioninternal/rdap/bootstrap.go:12High confidence
  • Contacts data.iana.org, which SKILL.md, the README and the plugin manifest do not mentioninternal/rdap/ip.go:86High confidence
  • Contacts chromeuxreport.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentioninternal/seo/crux.go:40High confidence
  • Contacts api.w.org, which SKILL.md, the README and the plugin manifest do not mentioninternal/stack/stack.go:149High confidence
Signal confidence: 238 facts

and 188 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

retlehs/quien: #727 on hotskills, 1.3k stars

[![retlehs/quien on hotskills](https://hotskills.dev/badge/retlehs-quien.svg)](https://hotskills.dev/skill/retlehs-quien/)