Skip to content

Xevion/rdap

Repository files navigation

rdap

Version License CI Codecov TypeScript Next.js React

A modern RDAP query client built with Next.js and React. Query domains, IP addresses, ASNs, and more. Now with dark mode.

Domain query screenshot IPv4 query screenshot

Tip

Try the live demo at rdap.xevion.dev to query domains, IPs, ASNs, and more in real-time.

What is RDAP?

RDAP (Registration Data Access Protocol) is the modern successor to WHOIS, providing structured, machine-readable access to domain registration and network resource data. Instead of parsing inconsistent text output, RDAP delivers standardized JSON responses with richer metadata.

Why?

The tool hosted by rdap.org is fantastic, but it's too simple, and isn't as overly-complicated and annoying as I want it to be. So, I built my own. Mine has dark mode.

Inspired by the rdap.org client, this project adds several features I wanted:

  • 🌙 Dark Mode: Because the blistering white of other RDAP clients is painful to look at
  • 🔗 Shareable Links: Every query generates a unique URL you can bookmark or share
  • 🎨 Modern Interface: Intuitive type detection, status badges, and responsive design
  • 📊 Rich Data Display: Comprehensive support for all RDAP entity types, DNSSEC, JSContact, vCard, and more
  • ⚡ Advanced Features: Follow referrals to registrars, modern JSContact format support, export/copy JSON responses
  • 🏠 Self-Hostable: Static site that you can deploy anywhere for complete control

Features

Query Capabilities

  • Multiple Input Types: IPv4/IPv6 (with CIDR notation), domain names, TLDs, ASNs, entity handles, or raw RDAP URLs
  • Smart Auto-Detection: Automatically identifies query types with visual feedback
  • Manual Override: Lock query type when auto-detection isn't enough
  • Follow Referrals: Automatically follows redirects to registrar RDAP servers for complete data
  • JSContact Support: Modern JSContact (RFC 9553) format alongside traditional vCard

Supported Entity Types

Full rendering support for all RDAP object classes:

  • Domains: Name, status, nameservers, DNSSEC, registrar info, creation/expiry dates
  • IP Networks: IPv4/IPv6 ranges, allocation dates, network types, parent/child relationships
  • Autonomous Systems: AS numbers, names, registration details
  • Entities: Contacts, registrars, registrants with role information and public IDs
  • Nameservers: Hostnames with IPv4/IPv6 address mappings

Contact Information

  • Dual Format Support: Both legacy vCard (jCard) and modern JSContact (RFC 9553)
  • Rich Contact Data: Names, organizations, emails, phone numbers, addresses, URLs, titles, and roles
  • Structured Display: Clean presentation of hierarchical contact information

DNS Security (DNSSEC)

  • Zone signing and delegation status indicators
  • DS (Delegation Signer) records with key tags, algorithms, digest types
  • DNSKEY records with flags, protocols, and public keys
  • Maximum signature lifetime display

User Experience

  • 🎨 Theme Toggle: Full dark mode and light mode support with persistence
  • 📋 Data Export: Copy individual values, entire JSON responses, or download as files
  • 🔍 Raw View Toggle: Switch between formatted display and raw JSON
  • 📊 Status Badges: Interactive badges for 28+ RDAP status types with hover definitions
  • ⏱️ Relative Timestamps: Human-readable event times with precise date fallback
  • 📱 Responsive Design: Mobile-first layout that adapts from phone to desktop

Error Handling & Validation

  • Comprehensive HTTP Error Messages: Clear explanations for 302, 400, 403, 404, 500 responses
  • Input Validation: Type checking with helpful warnings when manual type doesn't match input
  • Schema Validation: Zod-based validation with readable error messages
  • Bootstrap Integration: Automatic IANA registry bootstrap for URL resolution

Technical Details

  • Registry Bootstrap: Automatic fetching from IANA bootstrap files (DNS, IPv4, IPv6, ASN, object tags)
  • CIDR Matching: Proper network range matching for IP lookups
  • Internationalization: Full Unicode domain name support
  • Type Safety: Comprehensive TypeScript types inferred from Zod schemas
  • Static Site: No backend required for basic usage, fully client-side queries

Installation & Usage

This project uses pnpm as its package manager. Make sure you have Node.js installed, then run:

# Install dependencies
pnpm install

# Run development server
pnpm dev

# Build for production
pnpm build

# Start production server
pnpm start

The development server will be available at http://localhost:3000.

Additional Commands

# Run tests
pnpm test

# Run tests with coverage
pnpm test:coverage

# Type checking and linting
pnpm check

# Fix linting issues
pnpm lint:fix

# Code formatting
pnpm format
pnpm format:check

Tech Stack

Self-Hosting

This is a fully static site with no backend required for basic usage. It generates all HTML at build time and queries RDAP servers directly from your browser.

Key characteristics:

  • ✅ All RDAP queries made directly from your browser to source servers
  • ✅ No intermediary servers logging your lookups
  • ✅ Minimal local storage (theme preference only)
  • ✅ Fully self-hostable for complete control

Note on CORS: Some RDAP servers don't enable CORS headers, preventing direct browser access. For these servers, you'll see an error. Future versions may include an optional proxy for these cases.

To self-host:

# Build the static site
pnpm build

Privacy & Telemetry

The hosted demo at rdap.xevion.dev collects optional telemetry to improve the service. Self-hosted deployments have no telemetry by default.

What's tracked: Page views, query metadata (type, success/failure, timing), user interactions, and errors.

Privacy protections: Successful query targets are never logged—only the query type and timing. Failed queries may include targets for debugging. Copy actions track text length only.

Contributing

Issues and pull requests are welcome! This project uses:

  • ESLint for linting
  • Prettier for code formatting
  • Husky for git hooks
  • Conventional Commits for commit messages

License

MIT License © 2025 Ryan Walters