Four more ptest workers are live, so the Rule Test grid grows to
twelve cards and the README rule snippets cover them. The note above
the grid used to spell out the count in every locale; it now takes
the number from the card list, so the next change in count touches
one line. The CrossingTheWall rule keeps its eight-IP threshold.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Proxy-Seller joins the paid sponsors in all six READMEs and the footer
acknowledgement list. Each sponsor's bold name in the description line now
links to the same destination as its logo, so the copy is clickable too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The README listed every sponsor as an equal-size logo at the bottom, with
the only ad copy hidden in a hover-only title attribute. Paid sponsors now
get their own group with a visible one-line description under each logo;
free-plan supporters share one row of smaller logos. V.PS links carry the
README's locale in utm_content.
SwiftProxy joins the paid group and the footer acknowledgement list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
READMEs and the AGENTS overview list the new tool; frontend/AGENTS.md
records the shareable `?q=` input pattern. TRANSLATING.md no longer quotes
the number of changelog entries, which went stale on every release.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The feature list had fallen behind the product (v7.x additions missing,
stale copy) and 18 flat bullets scanned poorly. Regroup features into
five sections, adopt GFM alerts for the required configuration, collapse
the proxy rules into a details block, put Docker before Node, add the
missing License section, and fix long-standing typos. All five
translations are rebuilt from the new English text with tool names
aligned to each UI locale pack, plus a community-maintained disclaimer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Translate README_ZH into Taiwan-terminology Traditional Chinese, link it
from every README's language switcher next to Simplified Chinese, extend
the language-support line in all five, and count it among the maintained
READMEs in CONTRIBUTING.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TRANSLATING.md walks a contributor from pnpm i18n-new to a mergeable
partial pack: the skeleton convention, the registry line, what the gate
enforces, the fallback chain users see, and the beta-to-full promotion
bar. CONTRIBUTING flips its "adding a locale is heavier than it looks"
warning into an invitation, AGENTS.md restates the i18n rule in
full/beta terms, and the README points translators at the guide.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The READMEs — the project's highest-traffic pages — carried no
contribution invitation. All four gain a short Contributing section
pointing at the good-first-issue label and CONTRIBUTING.md, which now
also documents community-maintained README translations (English stays
canonical) as a starter area distinct from UI translations.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The docs center now carries the full env-var reference and deployment
guides, so the READMEs keep only the two settings a first deploy must
get right (MaxMind, ALLOWED_DOMAINS) and link out for the rest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
GA shows <10 daily Turkish-language visitors after years of a native
UI, while ~100 Russian-language visitors show the longest engagement
on the site despite seeing English. Swap keeps the maintenance surface
at four locales. Stored lang=tr preferences fall back gracefully, and
MaxMind natively carries ru geo names (it never had tr ones).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
POST /api/report validates an untrusted report against the shared schema
whitelist (free text cannot enter storage), caps it at 32KB and writes it
to Workers KV under a 128-bit unguessable id with a user-chosen TTL
(1/7/30 days); GET /api/report/:id serves the read-only report page and
AI agents, behind a short edge cache since reports are immutable. The
whole feature is env-gated on the three CLOUDFLARE_* variables and
surfaced to the frontend as configs.reportSharing. Rate limiting is
deliberately left to the deployment layer (edge rules / the env-gated
global /api limiter), not the handler.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add CAIDA_AUTO_UPDATE row to env tables in all four README locales
and to .env.example.
- Add RIPE NCC + CAIDA to Footer thanks list.
- Small locale + ASN Connectivity touch-ups.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New /api/asn-history handler queries RIPEstat routing-history for an IP
and enriches each historical ASN with its holder name via as-overview
(parallel, best-effort — org=null on timeout, ASN timeline still ships).
Filters out leak-grade prefixes (< /8 v4, < /19 v6) and low-visibility
announcements (< 30 full-feed peers) before fetching org names.
UI: ASN row in IpDetailPanel now has two view-toggles (Info / History)
sharing one Collapsible; at most one open at a time. Session-cached
per IP. Locale keys added in en/zh/fr/tr; bumps version to 6.2.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace all backend console.* with a shared pino singleton at
common/logger.js. Startup-style lines get emoji prefixes (🚀 listening,
📦 maxmind ready, 📥 downloading, 🗓️ schedule, ⚠️ warning, ❌ failure);
per-handler / per-request logs stay plain.
Three .env-driven knobs, all without NODE_ENV:
- LOG_LEVEL (default info) — pino level filter
- LOG_FORMAT (default pretty) — "json" for log shippers
- LOG_HTTP (default off) — pino-http on /api/* gated behind this flag
so pm2 logs don't bloat with 2xx/3xx request lines on every deploy;
when enabled, 4xx log as warn and 5xx as error
logger.js calls dotenv.config({ quiet: true }) itself because ES module
imports are hoisted above backend-server.js's dotenv call — without that
LOG_LEVEL from .env was silently ignored.
Fixes in common/rdap.js:
- err: res.status → status: res.status (pino's err serializer expects
an Error object, not a number)
- broken single-quoted template literal in "No RDAP endpoint" message
- demote "No RDAP endpoint" and "Domain not found" from error to warn
(they're expected outcomes for user input, not server failures)
README (en/zh/fr/tr) + .env.example + AGENTS.md (root and api/) all
updated to document the three new vars and the "no console.* in backend"
convention.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The GeoLite2 `.mmdb` files are no longer tracked in the repo (MaxMind's
EULA prohibits redistribution), so fresh deployments — especially via
Docker — start with an empty `common/maxmind-db/` directory and serve
503s from `/api/maxmind` until credentials are configured. The README
still labeled the MaxMind env vars as optional, which misled users.
Changes (applied to en / zh / fr / tr READMEs):
- `MAXMIND_ACCOUNT_ID`, `MAXMIND_LICENSE_KEY`, `MAXMIND_AUTO_UPDATE`
flip to **Yes** in the Required column, with notes clarifying that
`AUTO_UPDATE` can stay false only if `.mmdb` files were pre-seeded
manually.
- Reordered the table so all required vars sit at the top.
- New "MaxMind Databases (Required)" subsection before the table,
explaining why the vars matter, giving the exact signup + license-key
steps, and including a prominent warning for Docker deployers that a
missing setup silently breaks the MaxMind IP source and the WebRTC
country badges.
- Updated the Node and Docker env-var examples to include the three
MaxMind variables so copy/paste deployers end up with a working
configuration by default.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The language switcher at the top of every README has listed Türkçe since
the tr locale was added, but the "also supports" bullet lower in the
page was never updated to match — all four READMEs still read "English,
Chinese, and French". Catches the four translations up.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>