From c7852ddab44d099e55b17ad0825ebf918137b2b3 Mon Sep 17 00:00:00 2001 From: Xevion Date: Thu, 23 Oct 2025 00:49:48 -0500 Subject: [PATCH] docs: add comprehensive README with screenshots and feature documentation - Add domain and IPv4 query screenshots to .media/ - Expand README with detailed feature list, installation guide, and architecture overview - Add badges for version, license, CI, codecov, TypeScript, Next.js, and React - Document RDAP protocol explanation, query capabilities, and supported entity types - Include dark mode feature, shareable links, and self-hosting instructions - Update copyright year to 2025 in LICENSE --- .media/domain.png | Bin 0 -> 36521 bytes .media/ipv4.png | Bin 0 -> 32281 bytes LICENSE | 2 +- README.md | 222 +++++++++++++++++++++++++++++++++++++++------- 4 files changed, 190 insertions(+), 34 deletions(-) create mode 100644 .media/domain.png create mode 100644 .media/ipv4.png diff --git a/.media/domain.png b/.media/domain.png new file mode 100644 index 0000000000000000000000000000000000000000..510e9b531ce4274aef66b8add922a5c5f3dcbef0 GIT binary patch literal 36521 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�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 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE index 76d55b3..ba30d28 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Ryan Walters +Copyright (c) 2025 Ryan Walters Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 0076031..5fbcaac 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,203 @@ # rdap -A private RDAP query client built with React & Next.js. +[![Version][badge-version]][npm] +[![License][badge-license]][license] +[![CI][badge-ci]][ci-workflow] +[![Codecov][badge-codecov]][codecov] +[![TypeScript][badge-typescript]][typescript] +[![Next.js][badge-nextjs]][nextjs] +[![React][badge-react]][react] -## Usage +[badge-version]: https://img.shields.io/badge/version-0.2.0-blue +[badge-license]: https://img.shields.io/badge/license-MIT-green +[badge-ci]: https://github.com/Xevion/rdap/actions/workflows/ci.yml/badge.svg +[badge-codecov]: https://codecov.io/gh/Xevion/rdap/branch/master/graph/badge.svg +[badge-typescript]: https://img.shields.io/badge/TypeScript-5.9-blue +[badge-nextjs]: https://img.shields.io/badge/Next.js-15.5-black +[badge-react]: https://img.shields.io/badge/React-19.2-blue -This project uses [Next.js][nextjs] (SSG only) and React. Install [Node.js][nodejs] and [Yarn][yarn], then run the following commands: +A modern RDAP query client built with Next.js and React. Query domains, IP addresses, ASNs, and more. Now with **dark mode**. -```bash -# install dependencies -yarn -# run the development server -yarn dev -# or build and run the production server -yarn build && yarn start -``` +[![Domain query screenshot](.media/domain.png)][live-demo] +[![IPv4 query screenshot](.media/ipv4.png)][live-demo] -The project is also hosted on [my website][rdap]. +> [!TIP] +> **Try the live demo at [rdap.xevion.dev][live-demo]** 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? -Built for personal use, this project is an RDAP client; a tool that lets you execute RDAP queries on any entities that are associated with an RDAP server. -In more simpler terms, it's a tool that lets you look up information about IP addresses, domain names, and autonomous systems (a network of controlled IP addresses), and a little more. +The tool hosted by [rdap.org][rdap-client] 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.** -The tool hosted by [rdap.org](https://client.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][rdap-client], this project adds several features I wanted: -But in all seriousness, my project does intend to have more features: +- **🌙 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 -- Proxying: Some RDAP servers are inaccessible over the browser, and so proxying requests through a server is necessary. -- Self Hosting: For those worried about privacy, the project can be self-hosted. -- No Tracking: The project can't track you, because it's a static site. And in terms of the proxy, you can self-host if you're worried about that. -- Better UI: I'm not a designer, but I can try. -- Dark Mode: The blistering white of the original RDAP client is painful to look at. -- Shareable Links: Each search produces a unique URL that can be shared with others to view the same query. -- Whois: RDAP is a newer protocol that is meant to replace Whois, but some servers still use Whois. I might add support for that. -- Punycode: Some domain names use punycode, which is a way to represent Unicode characters in ASCII. I might add support for working with these domains. -- Better Error Handling: The original RDAP client doesn't handle errors very well, or tell you what went wrong. I want to fix that. - - For example, when querying a TLD that does not have a RDAP server, or one that does not exist, the original client doesn't explain this very well. -- RDAP Schema Adherence: RDAP servers are supposed to follow a schema, but it appears a large number simply don't. I intend to provide handling for this. - - Essentially, two separate schemas will be available: one for basic type checking, and one for the RFC-compliant schema. - - If the server doesn't follow the RFC-compliant schema, the basic schema will be used instead. - - It's hard to tell at this moment if Typescript can handle this well, but I'll try. +## Features -[rdap]: https://rdap.xevion.dev -[nextjs]: https://nextjs.org +### 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][pnpm] as its package manager. Make sure you have [Node.js][nodejs] installed, then run: + +```bash +# 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 + +```bash +# Run tests +pnpm test + +# Run tests with UI +pnpm test:ui + +# Type checking +pnpm type-check + +# Linting +pnpm lint +pnpm lint:fix + +# Code formatting +pnpm format +pnpm format:check +``` + +## Tech Stack + +- **[Next.js 15][nextjs]**: React framework with static site generation (SSG only) +- **[React 19][react]**: UI library with modern hooks +- **[TypeScript 5.9][typescript]**: Type-safe development +- **[Radix UI Themes][radix]**: Accessible component primitives and design system +- **[Tailwind CSS 4][tailwind]**: Utility-first styling +- **[Zod 4][zod]**: Runtime schema validation +- **[Vitest][vitest]**: Fast unit testing framework +- **[next-themes][next-themes]**: Theme management + +## 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: + +```bash +# Build the static site +pnpm build +``` + +## 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][license] © 2025 Ryan Walters + + + +[live-demo]: https://rdap.xevion.dev +[rdap-client]: https://client.rdap.org +[ci-workflow]: https://github.com/Xevion/rdap/actions/workflows/ci.yml +[codecov]: https://codecov.io/gh/Xevion/rdap +[pnpm]: https://pnpm.io/ [nodejs]: https://nodejs.org -[yarn]: https://yarnpkg.com +[nextjs]: https://nextjs.org +[react]: https://react.dev +[typescript]: https://www.typescriptlang.org +[radix]: https://www.radix-ui.com +[tailwind]: https://tailwindcss.com +[zod]: https://zod.dev +[vitest]: https://vitest.dev +[next-themes]: https://github.com/pacocoursey/next-themes +[license]: LICENSE +[npm]: https://www.npmjs.com/package/rdap