{ "repository": "OpenVibers/OpenVibe.Domains", "version": "0.2.0", "stage": "product", "code": true, "wave": "v1", "plan": "OpenVibe.Domains v1: a stateless read-only front over OpenVibe.Host's domain price catalog and OpenVibe.Tools' public domain history — name checks, one page per ending, one page per domain, a JSON API, and the service skeleton (deploy, discovery, readiness, tests)", "runtime": "node 22, express 4", "port": "5070", "domain": "openvibe.domains", "contracts": "openvibe-contracts v0.419.0", "sdk": "openvibe-sdk v0.161.0", "shared": "openvibe-shared v4.238.0", "packages": [ "openvibe-contracts v0.419.0", "openvibe-sdk v0.161.0", "openvibe-shared v4.238.0" ], "summary": "OpenVibe.Domains is a stateless front: no database, no sign-in, no events. It reads OpenVibe.Host's internal catalog (GET /api/v1/catalog/domains, /domains/check?name=, /domains/:tld) and OpenVibe.Tools' public history (GET /api/v1/domains, /domains/:domain) through small in-process caches, prices every registrar row into one-, three- and five-year totals with the cheap-first-year renewal trap, and serves server-rendered pages (home, name search, one ending, one domain) plus a read-only JSON API. It has the service plumbing the other OpenVibe sites have: helmet/CSP, health and truthful readiness (degraded, never 503, when either upstream is down), release.json and /release-metrics, /shared, robots/sitemap/llms, a per-IP limit on /api/v1 and /search, graceful stop, deploy files and tests.", "works": [ "Name parsing (server/names.js): URLs, ports, a leading www., spaces and underscores in the label, IDNs via url.domainToASCII, co.uk endings, 1-63 character labels and the 253-character limit; display keeps Unicode", "Pricing (server/pricing.js): y1 = register, y3 = register + 2 renew, y5 = five_year or register + 4 renew, the renewal trap, cents rounding, USD rows compared and sorted by y3 with non-USD rows flagged and kept after them", "Two cached data clients (server/data/): injectable fetchImpl, 8 s timeouts, a 2,000-entry expiry Map, 10/10/2/10-minute TTLs, a failure is null and one short log line", "Pages (server/http/pages.js, server/views/index.js): / with the popular catalog and Tools lists, /search?q= (noindex), /tld/:tld, /.dev 301, /d/:domain and a 404; plain placeholder views on the shared Frame with the service id domains", "Read-only JSON API at /api/v1: search, tlds, one tld, one domain; CORS-open; 400 problem+json for a bad name and 404 for an unknown ending; 120/min per IP shared with /search", "Service plumbing: helmet with Help's CSP, /api/health, /api/ready (Host and Tools optional, so a failure is degraded not 503), release.json and /release-metrics, /shared, /robots.txt, /sitemap.xml (every catalog ending, lastmod from the release), /llms.txt, /metrics on loopback, graceful stop", "Deploy files: systemd unit on /opt/openvibe.domains, nginx vhost with www -> apex, TLS, security headers, GET-only /api/v1 and loopback-only /metrics", "Tests: names, pricing, the data clients' cache/expiry/failure/timeout, and the booted app's pages, redirects, API shapes, CORS, discovery and degraded readiness", "Control panel (DOM-2): sign-in with OpenVibe.Network (client domains); connect Cloudflare (token verified, stored as a secret in the person's own Network project granted for reveal to api.cloudflare.com only); zones synced; records read live; every change a domains.proposal@1 approved on its page or in the Action Center (domains.actions.read, domains.proposal.decide), applied in order with a stale check, rolled back in one step; audit; account export and deletion" ], "notYet": [ "The pages are plain placeholders (server/views/index.js) written for v1's plumbing; the main session replaces server/views/ with the real design", "No service manifest in openvibe-contracts yet: no domains.* capability is registered and no other service calls this one", "No database, no sign-in, no sessions, no event subscriptions and no stored data (v1 is deliberately stateless)", "No registrar links or affiliate handling: prices are shown with the registrar's name, not linked out yet", "Only /api/v1 and /search are rate limited; the HTML pages are served to everyone", "Porkbun, Namecheap and Spaceship connections; DNSSEC DS at the registrar; bulk nameserver changes; agents proposing through MCP" ], "capabilitiesRegistered": false, "serviceManifestRegistered": false, "deployed": false, "placeholderInSites": true, "features": [ "name parsing", "registry availability check", "three- and five-year price totals", "renewal trap", "one page per ending", "one page per domain with public history", "read-only JSON API", "cached upstream clients", "truthful readiness", "discovery", "deploy files" ], "deployment": "Not deployed yet. Reference unit deploy/systemd/openvibe-domains.service (127.0.0.1:5070, /opt/openvibe.domains, /etc/openvibe/domains.env, user ubuntu) and vhost deploy/nginx/openvibe.domains.conf (openvibe.domains and www, certs under /etc/letsencrypt/live/openvibe.domains/).", "updated": "2026-11-13" }