openvibers/openvibe.host Commits
Inner pages: no site name above catalog, domains and inference titles (#374)
Changes
@@@ -95,7 +95,7 @@ ${canRemove ? `<form method="post" action="/catalog/benchmarks/${esc(b.id)}/remofunction submitForm({ viewer, providers = [], plans = [], csrf = '', error = null, query = {} }) {const head = `<nav class="hc-crumbs" aria-label="Breadcrumb">${link('/catalog/benchmarks', 'Benchmarks')} / Submit</nav>--<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · benchmarks</p><h1>Benchmark your server</h1>++<header class="hc-head"><h1>Benchmark your server</h1><p class="hc-lede">Name the provider and plan, get a one-time link, and run one command on the server. YABS measures the CPU (Geekbench), the disk (fio) and the network (iperf3) in about 10 to 15 minutes, then posts the result here.</p></header>`;if (!viewer || viewer.kind !== 'user') {return `${head}<div class="hc-empty hc-empty-rich"><p><strong>Sign in to submit a benchmark.</strong></p><p>Results are public; who submitted them is not. Signing in lets you remove your own results later.</p><p>${link('/auth/login?next=%2Fcatalog%2Fbenchmarks%2Fnew', 'Sign in', 'button')}</p></div>`;@@@ -240,7 +240,6 @@ ${planTable(dedicated.plans.slice(0, 10), { caption: `Dedicated servers, lowest${dedicated.plans.length > 10 ? `<p class="hc-more">${link('/catalog?kind=dedicated', `All ${dedicated.total} dedicated servers →`, 'button hc-button-quiet')}</p>` : ''}</section>` : '';return `<header class="hc-head">--<p class="hc-eyebrow">OpenVibe.Host · hosting compared · alpha</p><h1>Compare hosting plans</h1><p class="hc-lede">Cloud, VPS and dedicated plans side by side, each with the day its price was checked and a link to where it came from.</p></header>@@@ -253,7 +252,7 @@ ${method(plans.some((p) => p.affiliate_url))}`;}function providerList(providers) {-- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · hosting compared</p><h1>Providers</h1>++ return `<header class="hc-head"><h1>Providers</h1><p class="hc-lede">Every provider in the catalog, with where its plans come from.</p></header>${providers.length ? `<ul class="hc-providers">${providers.map((p) => `<li>${link(`/catalog/providers/${encodeURIComponent(p.slug)}`, `<strong>${esc(p.name)}</strong>`)}${p.description ? `<span>${esc(p.description)}</span>` : ''}${p.affiliate_url ? '<span class="hc-chip">Affiliate</span>' : ''}</li>`).join('')}</ul>` : '<div class="hc-empty"><p>No provider is listed yet.</p></div>'}${providers.some((p) => p.affiliate_url) ? `<p class="hc-disclosure">${esc(DISCLOSURE)}</p>` : ''}`;@@@ -280,7 +279,7 @@ const PROMO_RULES = `<div class="hc-empty hc-empty-rich"><p><strong>No promotion<p>${link('/catalog', 'Compare every plan')} · ${link('/providers', 'See the providers')}</p></div>`;function promos(list) {-- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · hosting compared</p><h1>Hosting promotions</h1>++ return `<header class="hc-head"><h1>Hosting promotions</h1><p class="hc-lede">Offers running now, with their codes and end dates as the provider states them. An ended offer drops off by itself.</p></header>${list.length ? promoCards(list) : PROMO_RULES}${list.some((p) => p.affiliate) ? `<p class="hc-disclosure">${esc(DISCLOSURE)}</p>` : ''}@@@ -391,7 +390,7 @@ function offers({ result, query = {}, now = Date.now() }) {const list = result.offers;const filtered = ['currency', 'max_monthly', 'source', 'priced'].some((k) => q[k]);const next = result.next_cursor ? `<p class="hc-more">${link(`/catalog/offers?${new URLSearchParams({ ...q, cursor: result.next_cursor })}`, 'Next 50 offers →', 'button hc-button-quiet')}</p>` : '';-- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · hosting compared</p><h1>Hosting offers</h1>++ return `<header class="hc-head"><h1>Hosting offers</h1><p class="hc-lede">What providers post on LowEndSpirit's Offers board, with the price each headline states and that price a month. Sort by the monthly price within one currency; nothing is converted.</p></header><form class="hc-filters" method="get" action="/catalog/offers" role="search" aria-label="Filter hosting offers">${select('sort', 'Sort by', OFFER_SORTS, q.sort || 'new')}@@@ -88,7 +88,7 @@ ${select('sort', 'Sort by', SORTS, q.sort || 'popular')}</form>${tldTable(rows, { caption: `${rows.length}${result.next_cursor ? '+' : ''} ending${rows.length === 1 ? '' : 's'}, ${sortLabel}; the cheapest price at any registrar` })}${!rows.length && filtered ? `<div class="hc-empty"><p><strong>No ending matches.</strong></p><p>${link('/catalog/domains', 'Clear the filters')} or try another ending.</p></div>` : ''}${next}` : '';-- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · domains compared</p><h1>Compare domain prices</h1>++ return `<header class="hc-head"><h1>Compare domain prices</h1><p class="hc-lede">${stats.tlds ? `${stats.tlds.toLocaleString('en')} endings with what registrars charge for the first year, a renewal and a transfer, and the total over five years.` : 'What registrars charge for each ending, for the first year, a renewal and a transfer.'} Check whether a name is taken, then register it wherever it costs least.</p></header>${checkForm({ autofocus: !filtered && !q.sort && !q.cursor })}${prices}@@@ -100,7 +100,7 @@ function page(result) {const needs = result.summary.needs_owner_budget;const demand = demandText(result.demand);return `<header class="hc-head">--<p class="hc-eyebrow">OpenVibe.Host · staff · inference</p>++<p class="hc-eyebrow">Staff</p><h1>Inference placement planner</h1><p class="hc-lede">A forecast and a monthly break-even for a warm rented GPU, scale-to-zero and wholesale. This page recommends; it never starts, stops or rents anything. The owner approves every rental.</p></header>@@@ -114,7 +114,7 @@ ${method()}`;/** A staff-only error page: no result is shown and nothing is acted on. */function errorPage(message, { input = false } = {}) {-- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · staff · inference</p><h1>Inference placement planner</h1>++ return `<header class="hc-head"><p class="hc-eyebrow">Staff</p><h1>Inference placement planner</h1><p class="hc-lede">The planner could not show a plan. Nothing was started, stopped or rented.</p></header><div class="hc-empty"><p><strong>${input ? 'The planning input is unavailable.' : 'The planner has no plan to show.'}</strong></p><p>${esc(message)}</p>${input ? '<p>Set <code>HOST_INFERENCE_PLANNER_INPUT</code> to a readable planning JSON and reload.</p>' : ''}</div>`;}
@@ -95,7 +95,7 @@ ${canRemove ? `<form method="post" action="/catalog/benchmarks/${esc(b.id)}/remo
@@ -95,7 +95,7 @@ ${canRemove ? `<form method="post" action="/catalog/benchmarks/${esc(b.id)}/remo
function submitForm({ viewer, providers = [], plans = [], csrf = '', error = null, query = {} }) {
function submitForm({ viewer, providers = [], plans = [], csrf = '', error = null, query = {} }) {
const head = `<nav class="hc-crumbs" aria-label="Breadcrumb">${link('/catalog/benchmarks', 'Benchmarks')} / Submit</nav>
const head = `<nav class="hc-crumbs" aria-label="Breadcrumb">${link('/catalog/benchmarks', 'Benchmarks')} / Submit</nav>
-<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · benchmarks</p><h1>Benchmark your server</h1>
+<header class="hc-head"><h1>Benchmark your server</h1>
<p class="hc-lede">Name the provider and plan, get a one-time link, and run one command on the server. YABS measures the CPU (Geekbench), the disk (fio) and the network (iperf3) in about 10 to 15 minutes, then posts the result here.</p></header>`;
<p class="hc-lede">Name the provider and plan, get a one-time link, and run one command on the server. YABS measures the CPU (Geekbench), the disk (fio) and the network (iperf3) in about 10 to 15 minutes, then posts the result here.</p></header>`;
if (!viewer || viewer.kind !== 'user') {
if (!viewer || viewer.kind !== 'user') {
return `${head}<div class="hc-empty hc-empty-rich"><p><strong>Sign in to submit a benchmark.</strong></p><p>Results are public; who submitted them is not. Signing in lets you remove your own results later.</p><p>${link('/auth/login?next=%2Fcatalog%2Fbenchmarks%2Fnew', 'Sign in', 'button')}</p></div>`;
return `${head}<div class="hc-empty hc-empty-rich"><p><strong>Sign in to submit a benchmark.</strong></p><p>Results are public; who submitted them is not. Signing in lets you remove your own results later.</p><p>${link('/auth/login?next=%2Fcatalog%2Fbenchmarks%2Fnew', 'Sign in', 'button')}</p></div>`;
@@ -240,7 +240,6 @@ ${planTable(dedicated.plans.slice(0, 10), { caption: `Dedicated servers, lowest
@@ -240,7 +240,6 @@ ${planTable(dedicated.plans.slice(0, 10), { caption: `Dedicated servers, lowest
${dedicated.plans.length > 10 ? `<p class="hc-more">${link('/catalog?kind=dedicated', `All ${dedicated.total} dedicated servers →`, 'button hc-button-quiet')}</p>` : ''}
${dedicated.plans.length > 10 ? `<p class="hc-more">${link('/catalog?kind=dedicated', `All ${dedicated.total} dedicated servers →`, 'button hc-button-quiet')}</p>` : ''}
</section>` : '';
</section>` : '';
return `<header class="hc-head">
return `<header class="hc-head">
-<p class="hc-eyebrow">OpenVibe.Host · hosting compared · alpha</p>
<h1>Compare hosting plans</h1>
<h1>Compare hosting plans</h1>
<p class="hc-lede">Cloud, VPS and dedicated plans side by side, each with the day its price was checked and a link to where it came from.</p>
<p class="hc-lede">Cloud, VPS and dedicated plans side by side, each with the day its price was checked and a link to where it came from.</p>
</header>
</header>
@@ -253,7 +252,7 @@ ${method(plans.some((p) => p.affiliate_url))}`;
@@ -253,7 +252,7 @@ ${method(plans.some((p) => p.affiliate_url))}`;
}
}
function providerList(providers) {
function providerList(providers) {
- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · hosting compared</p><h1>Providers</h1>
+ return `<header class="hc-head"><h1>Providers</h1>
<p class="hc-lede">Every provider in the catalog, with where its plans come from.</p></header>
<p class="hc-lede">Every provider in the catalog, with where its plans come from.</p></header>
${providers.length ? `<ul class="hc-providers">${providers.map((p) => `<li>${link(`/catalog/providers/${encodeURIComponent(p.slug)}`, `<strong>${esc(p.name)}</strong>`)}${p.description ? `<span>${esc(p.description)}</span>` : ''}${p.affiliate_url ? '<span class="hc-chip">Affiliate</span>' : ''}</li>`).join('')}</ul>` : '<div class="hc-empty"><p>No provider is listed yet.</p></div>'}
${providers.length ? `<ul class="hc-providers">${providers.map((p) => `<li>${link(`/catalog/providers/${encodeURIComponent(p.slug)}`, `<strong>${esc(p.name)}</strong>`)}${p.description ? `<span>${esc(p.description)}</span>` : ''}${p.affiliate_url ? '<span class="hc-chip">Affiliate</span>' : ''}</li>`).join('')}</ul>` : '<div class="hc-empty"><p>No provider is listed yet.</p></div>'}
${providers.some((p) => p.affiliate_url) ? `<p class="hc-disclosure">${esc(DISCLOSURE)}</p>` : ''}`;
${providers.some((p) => p.affiliate_url) ? `<p class="hc-disclosure">${esc(DISCLOSURE)}</p>` : ''}`;
@@ -280,7 +279,7 @@ const PROMO_RULES = `<div class="hc-empty hc-empty-rich"><p><strong>No promotion
@@ -280,7 +279,7 @@ const PROMO_RULES = `<div class="hc-empty hc-empty-rich"><p><strong>No promotion
<p>${link('/catalog', 'Compare every plan')} · ${link('/providers', 'See the providers')}</p></div>`;
<p>${link('/catalog', 'Compare every plan')} · ${link('/providers', 'See the providers')}</p></div>`;
function promos(list) {
function promos(list) {
- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · hosting compared</p><h1>Hosting promotions</h1>
+ return `<header class="hc-head"><h1>Hosting promotions</h1>
<p class="hc-lede">Offers running now, with their codes and end dates as the provider states them. An ended offer drops off by itself.</p></header>
<p class="hc-lede">Offers running now, with their codes and end dates as the provider states them. An ended offer drops off by itself.</p></header>
${list.length ? promoCards(list) : PROMO_RULES}
${list.length ? promoCards(list) : PROMO_RULES}
${list.some((p) => p.affiliate) ? `<p class="hc-disclosure">${esc(DISCLOSURE)}</p>` : ''}
${list.some((p) => p.affiliate) ? `<p class="hc-disclosure">${esc(DISCLOSURE)}</p>` : ''}
@@ -391,7 +390,7 @@ function offers({ result, query = {}, now = Date.now() }) {
@@ -391,7 +390,7 @@ function offers({ result, query = {}, now = Date.now() }) {
const list = result.offers;
const list = result.offers;
const filtered = ['currency', 'max_monthly', 'source', 'priced'].some((k) => q[k]);
const filtered = ['currency', 'max_monthly', 'source', 'priced'].some((k) => q[k]);
const next = result.next_cursor ? `<p class="hc-more">${link(`/catalog/offers?${new URLSearchParams({ ...q, cursor: result.next_cursor })}`, 'Next 50 offers →', 'button hc-button-quiet')}</p>` : '';
const next = result.next_cursor ? `<p class="hc-more">${link(`/catalog/offers?${new URLSearchParams({ ...q, cursor: result.next_cursor })}`, 'Next 50 offers →', 'button hc-button-quiet')}</p>` : '';
- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · hosting compared</p><h1>Hosting offers</h1>
+ return `<header class="hc-head"><h1>Hosting offers</h1>
<p class="hc-lede">What providers post on LowEndSpirit's Offers board, with the price each headline states and that price a month. Sort by the monthly price within one currency; nothing is converted.</p></header>
<p class="hc-lede">What providers post on LowEndSpirit's Offers board, with the price each headline states and that price a month. Sort by the monthly price within one currency; nothing is converted.</p></header>
<form class="hc-filters" method="get" action="/catalog/offers" role="search" aria-label="Filter hosting offers">
<form class="hc-filters" method="get" action="/catalog/offers" role="search" aria-label="Filter hosting offers">
${select('sort', 'Sort by', OFFER_SORTS, q.sort || 'new')}
${select('sort', 'Sort by', OFFER_SORTS, q.sort || 'new')}
@@ -88,7 +88,7 @@ ${select('sort', 'Sort by', SORTS, q.sort || 'popular')}
@@ -88,7 +88,7 @@ ${select('sort', 'Sort by', SORTS, q.sort || 'popular')}
</form>
</form>
${tldTable(rows, { caption: `${rows.length}${result.next_cursor ? '+' : ''} ending${rows.length === 1 ? '' : 's'}, ${sortLabel}; the cheapest price at any registrar` })}
${tldTable(rows, { caption: `${rows.length}${result.next_cursor ? '+' : ''} ending${rows.length === 1 ? '' : 's'}, ${sortLabel}; the cheapest price at any registrar` })}
${!rows.length && filtered ? `<div class="hc-empty"><p><strong>No ending matches.</strong></p><p>${link('/catalog/domains', 'Clear the filters')} or try another ending.</p></div>` : ''}${next}` : '';
${!rows.length && filtered ? `<div class="hc-empty"><p><strong>No ending matches.</strong></p><p>${link('/catalog/domains', 'Clear the filters')} or try another ending.</p></div>` : ''}${next}` : '';
- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · domains compared</p><h1>Compare domain prices</h1>
+ return `<header class="hc-head"><h1>Compare domain prices</h1>
<p class="hc-lede">${stats.tlds ? `${stats.tlds.toLocaleString('en')} endings with what registrars charge for the first year, a renewal and a transfer, and the total over five years.` : 'What registrars charge for each ending, for the first year, a renewal and a transfer.'} Check whether a name is taken, then register it wherever it costs least.</p></header>
<p class="hc-lede">${stats.tlds ? `${stats.tlds.toLocaleString('en')} endings with what registrars charge for the first year, a renewal and a transfer, and the total over five years.` : 'What registrars charge for each ending, for the first year, a renewal and a transfer.'} Check whether a name is taken, then register it wherever it costs least.</p></header>
${checkForm({ autofocus: !filtered && !q.sort && !q.cursor })}
${checkForm({ autofocus: !filtered && !q.sort && !q.cursor })}
${prices}
${prices}
@@ -100,7 +100,7 @@ function page(result) {
@@ -100,7 +100,7 @@ function page(result) {
const needs = result.summary.needs_owner_budget;
const needs = result.summary.needs_owner_budget;
const demand = demandText(result.demand);
const demand = demandText(result.demand);
return `<header class="hc-head">
return `<header class="hc-head">
-<p class="hc-eyebrow">OpenVibe.Host · staff · inference</p>
+<p class="hc-eyebrow">Staff</p>
<h1>Inference placement planner</h1>
<h1>Inference placement planner</h1>
<p class="hc-lede">A forecast and a monthly break-even for a warm rented GPU, scale-to-zero and wholesale. This page recommends; it never starts, stops or rents anything. The owner approves every rental.</p>
<p class="hc-lede">A forecast and a monthly break-even for a warm rented GPU, scale-to-zero and wholesale. This page recommends; it never starts, stops or rents anything. The owner approves every rental.</p>
</header>
</header>
@@ -114,7 +114,7 @@ ${method()}`;
@@ -114,7 +114,7 @@ ${method()}`;
/** A staff-only error page: no result is shown and nothing is acted on. */
/** A staff-only error page: no result is shown and nothing is acted on. */
function errorPage(message, { input = false } = {}) {
function errorPage(message, { input = false } = {}) {
- return `<header class="hc-head"><p class="hc-eyebrow">OpenVibe.Host · staff · inference</p><h1>Inference placement planner</h1>
+ return `<header class="hc-head"><p class="hc-eyebrow">Staff</p><h1>Inference placement planner</h1>
<p class="hc-lede">The planner could not show a plan. Nothing was started, stopped or rented.</p></header>
<p class="hc-lede">The planner could not show a plan. Nothing was started, stopped or rented.</p></header>
<div class="hc-empty"><p><strong>${input ? 'The planning input is unavailable.' : 'The planner has no plan to show.'}</strong></p><p>${esc(message)}</p>${input ? '<p>Set <code>HOST_INFERENCE_PLANNER_INPUT</code> to a readable planning JSON and reload.</p>' : ''}</div>`;
<div class="hc-empty"><p><strong>${input ? 'The planning input is unavailable.' : 'The planner has no plan to show.'}</strong></p><p>${esc(message)}</p>${input ? '<p>Set <code>HOST_INFERENCE_PLANNER_INPUT</code> to a readable planning JSON and reload.</p>' : ''}</div>`;
}
}