From f308cbea4afaea215b3f92d9d41361e844d6d72f Mon Sep 17 00:00:00 2001 From: Xevion Date: Fri, 26 Dec 2025 14:24:37 -0600 Subject: [PATCH] chore: reword README.md, cleanup .gitignore, remove .env.example --- .env.example | 10 ---- .gitignore | 40 ++++--------- README.md | 165 +++++++++------------------------------------------ package.json | 3 +- 4 files changed, 41 insertions(+), 177 deletions(-) delete mode 100644 .env.example diff --git a/.env.example b/.env.example deleted file mode 100644 index a6755f1..0000000 --- a/.env.example +++ /dev/null @@ -1,10 +0,0 @@ -# Since .env is gitignored, you can use .env.example to build a new `.env` file when you clone the repo. -# Keep this file up-to-date when you add new variables to `.env`. - -# This file will be committed to version control, so make sure not to have any secrets in it. -# If you are cloning this repo, create a copy of this file named `.env` and populate it with your secrets. - -# When adding additional env variables, the schema in /env/schema.mjs should be updated accordingly -# Example: -# SERVERVAR=foo -# NEXT_PUBLIC_CLIENTVAR=bar diff --git a/.gitignore b/.gitignore index ec5f1e9..d55779a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,45 +1,25 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -.idea -.log* -.yarn - # dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# database -/prisma/db.sqlite -/prisma/db.sqlite-journal +node_modules # next.js -/.next/ -/out/ +.next +out next-env.d.ts -# production -/build +# testing +coverage # misc .DS_Store *.pem +*.log -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -# do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables +# env files .env .env*.local -# vercel -.vercel - # typescript *.tsbuildinfo + +# vercel +.vercel diff --git a/README.md b/README.md index 9fac6b6..386bcb3 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,15 @@ [![Next.js][badge-nextjs]][nextjs] [![React][badge-react]][react] -[badge-version]: https://img.shields.io/badge/version-0.9.0-blue +[badge-version]: https://img.shields.io/badge/version-0.9.1-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 +[badge-nextjs]: https://img.shields.io/badge/Next.js-16-black +[badge-react]: https://img.shields.io/badge/React-19-blue -A modern RDAP query client built with Next.js and React. Query domains, IP addresses, ASNs, and more. Now with **dark mode**. +A web-based RDAP client for querying domains, IP addresses, and ASNs. Has dark mode. [![Domain query screenshot](.media/domain.png)][live-demo] [![IPv4 query screenshot](.media/ipv4.png)][live-demo] @@ -26,165 +26,58 @@ A modern RDAP query client built with Next.js and React. Query domains, IP addre ## 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. +RDAP (Registration Data Access Protocol) is the successor to WHOIS. It returns structured JSON instead of inconsistent plaintext, making it easier to parse and use programmatically. ## Why? -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 [rdap.org client][rdap-client] works fine, but I wanted something with dark mode and shareable URLs. Plus it was a good excuse to learn Next.js 16. -Inspired by the [rdap.org client][rdap-client], this project adds several features I wanted: +Main additions: -- **πŸŒ™ 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 +- Dark mode (actually important when you stare at this stuff all day) +- Every query gets a shareable URL +- Better type detection for inputs +- Cleaner UI with status badges and collapsible sections +- JSContact support alongside vCard +- Static export, no backend needed ## Features -### Query Capabilities +**Query types**: domains, IPv4/IPv6 (with CIDR), ASNs, entity handles, nameservers, or raw RDAP URLs. Type detection is automatic but can be overridden. -- **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 objects**: domains, IP networks, autonomous systems, entities (contacts/registrars), and nameservers. Shows all the standard RDAP fields plus DNSSEC info when available. -### Supported Entity Types +**Contacts**: Displays both vCard (jCard) and JSContact (RFC 9553) formats. Shows names, organizations, emails, phones, addresses, etc. -Full rendering support for all RDAP object classes: +**UI stuff**: Dark/light mode, copy buttons everywhere, collapsible sections, status badges with hover tooltips, relative timestamps ("2 days ago"), responsive layout. -- **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 +**Technical**: Uses IANA bootstrap files to resolve RDAP server URLs. All queries happen client-side from your browser. Zod schemas for validation. Fully static build. -### Contact Information +## Development -- **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: +Uses pnpm: ```bash -# Install dependencies pnpm install - -# Run development server -pnpm dev - -# Build for production -pnpm build - -# Start production server -pnpm start +pnpm dev # localhost:3000 +pnpm build # static export +pnpm test # vitest +pnpm check # tsc + eslint ``` -The development server will be available at `http://localhost:3000`. - -### Additional Commands - -```bash -# 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 - -- **[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. +Fully static. Queries go directly from your browser to RDAP servers (no backend). Just run `pnpm build` and host the output anywhere. -**Key characteristics**: +CORS issue: Some RDAP servers don't set CORS headers, so those queries will fail in the browser. Might add an optional proxy later. -- βœ… 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 +## Privacy -**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 -``` - -## Privacy & Telemetry - -The hosted demo at [rdap.xevion.dev][live-demo] 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. +The demo at [rdap.xevion.dev][live-demo] has telemetry (PostHog) to track what breaks. Query targets aren't logged for successful queries, only type/timing. Failed queries might include the target for debugging. Self-hosted builds have no telemetry. ## 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 +PRs welcome. Uses ESLint, Prettier, Husky git hooks, and conventional commits. ## License diff --git a/package.json b/package.json index 08d9db8..3ed1311 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,9 @@ { "name": "rdap", - "version": "0.9.0", + "version": "0.9.1", "private": true, "scripts": { + "preinstall": "npx only-allow pnpm", "build": "next build", "dev": "next dev", "start": "next start",