Paying more than the yearly fee moves your server up: the excess counts first in the order and never decays. Points are only a tie-breaker. Details in the Terms →
+
Paying more than the yearly fee moves your server up: the excess counts first in the order and never decays. Points are only a tie-breaker. Details in the Terms →
@@ -792,6 +821,7 @@ document.getElementById('check').addEventListener('click', async () => {
const inv = document.getElementById('invoice');
inv.classList.remove('show');
document.getElementById('terms-box').classList.remove('show');
+ document.getElementById('renewal-card').hidden = true;
status.className = '';
status.textContent = 'Checking…';
try {
@@ -801,30 +831,39 @@ document.getElementById('check').addEventListener('click', async () => {
const idx = list.findIndex(d => normalizeUrl(d.url || '').toLowerCase() === url.toLowerCase());
if (idx < 0) {
status.className = 'err-line';
- status.textContent = `Not in the ${chain} list: no server with this exact URL. To list it, press "Add server".`;
+ status.textContent = `Not in the ${chain} list: no server with this exact URL. To list it, use the "Add a server" tab.`;
return;
}
const d = list[idx];
const infoResp = await fetch(`/weinfodata/${chain}/${d.id}`);
const info = infoResp.ok ? await infoResp.json() : {};
- const expiry = (info.expiry_date || '').slice(0, 10) || '—'; // '2027-07-16 00:00:00' -> the date
+ const expiry = (info.expiry_date || '').slice(0, 10); // '2027-07-16 00:00:00' -> the date
const bal = info.balance != null ? fmt(info.balance) : null;
const unc = info.unconfirmed_balance != null ? fmt(info.unconfirmed_balance) : null;
- document.getElementById('iv-chain').textContent = info.chain || chain;
- document.getElementById('iv-balance').textContent = bal ? (unc ? bal + ' (' + unc + ')' : bal) : '—';
- document.getElementById('iv-donations').textContent = info.donation != null ? fmt(info.donation) : '—';
- document.getElementById('iv-contact').textContent = '—';
- document.getElementById('iv-url').textContent = d.url;
- const weinfoEl = document.getElementById('iv-weinfo');
- weinfoEl.href = `/weinfo/${chain}/${d.id}`;
- weinfoEl.textContent = 'View page';
- document.getElementById('iv-nextdep').textContent = expiry;
- document.getElementById('iv-nextdep-row').style.display = 'flex';
- hidePaymentRows();
+ // Renewal window: from 6 months before expiry (Terms, Section 1).
+ let daysText = '—', windowText = '—', windowOpen = false;
+ if (expiry) {
+ const exp = new Date(expiry + 'T00:00:00Z');
+ const win = new Date(exp); win.setUTCMonth(win.getUTCMonth() - 6);
+ const days = Math.ceil((exp - Date.now()) / 86400000);
+ daysText = days > 0 ? `${days} days left` : 'expired';
+ windowOpen = Date.now() >= win.getTime() && days > 0;
+ windowText = windowOpen ? 'open now: you can renew' : `opens on ${win.toISOString().slice(0, 10)}`;
+ }
+ document.getElementById('rc-expiry').textContent = expiry || '—';
+ document.getElementById('rc-days').textContent = daysText;
+ const winEl = document.getElementById('rc-window');
+ winEl.textContent = windowText;
+ winEl.className = windowOpen ? 'rc-open' : '';
+ document.getElementById('rc-pos').textContent = `#${idx + 1} of ${list.length}`;
+ document.getElementById('rc-balance').textContent = bal ? (unc ? bal + ' (' + unc + ')' : bal) : '—';
+ document.getElementById('rc-donations').textContent = info.donation != null ? fmt(info.donation) : '—';
+ document.getElementById('rc-link').href = `/weinfo/${chain}/${d.id}`;
status.className = 'ok-line';
- status.textContent = `Server is listed (#${idx + 1} of ${list.length}). Expiry: ${expiry}. Renewal opens 6 months before.`;
- inv.classList.add('show');
- inv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
+ status.textContent = windowOpen ? '✓ Listed. The renewal window is open.' : '✓ Listed.';
+ const card = document.getElementById('renewal-card');
+ card.hidden = false;
+ card.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
} catch (err) {
status.className = 'err-line';
status.textContent = 'Could not check the list right now. Please try again in a moment.';
@@ -988,6 +1027,7 @@ document.getElementById('terms-accept').addEventListener('click', async function
status.className = ''; status.textContent = '';
document.getElementById('terms-box').classList.remove('show');
document.getElementById('invoice').classList.remove('show');
+ document.getElementById('renewal-card').hidden = true;
}
tabs.forEach(b => b.addEventListener('click', () => setMode(b.dataset.mode)));
if (new URLSearchParams(location.search).get('mode') === 'check') setMode('check');
diff --git a/terms.html b/terms.html
index afe83e9..b64afdc 100644
--- a/terms.html
+++ b/terms.html
@@ -256,7 +256,7 @@ footer a{color:var(--accent);text-decoration:none}
"name": "Where do I see my expiry date?",
"acceptedAnswer": {
"@type": "Answer",
- "text": "On the home page, open the “Check a server” tab, enter the exact URL of your server as it appears in the list and press “Check server”. Nothing is charged: you get the server's position in the list, its balance and donations, and its expiry date; “View page” opens the server's detail page with its WeTime activity. The date is not shown in the main table, so you need the exact URL. Knowing it also tells you when your renewal window opens (6 months before). Since the price per day is fixed and public, the expiry date shows how much a server has paid: this is intentional transparency."
+ "text": "On the home page, open the “Renewal status” tab, enter the exact URL of your server as it appears in the list and press “Show renewal status”. Nothing is charged: you see the expiry date, the days left, whether the renewal window is open (or when it opens), the position in the list, the balance and the donations, with a link to the server page. The date is not shown in the main table, so you need the exact URL. Knowing it also tells you when your renewal window opens (6 months before). Since the price per day is fixed and public, the expiry date shows how much a server has paid: this is intentional transparency."
}
},
{
@@ -663,7 +663,7 @@ l-49 -25 -880 0 -880 0 -3 704 c-2 557 0 706 10 713 7 4 407 7 888 5 818 -2
Where do I see my expiry date?
-
On the home page, open the “Check a server” tab, enter the exact URL of your server as it appears in the list and press “Check server”. Nothing is charged: you get the server's position in the list, its balance and donations, and its expiry date; “View page” opens the server's detail page with its WeTime activity. The date is not shown in the main table, so you need the exact URL. Knowing it also tells you when your renewal window opens (6 months before). Since the price per day is fixed and public, the expiry date shows how much a server has paid: this is intentional transparency. Open the Check tab →
+
On the home page, open the “Renewal status” tab, enter the exact URL of your server as it appears in the list and press “Show renewal status”. Nothing is charged: you see the expiry date, the days left, whether the renewal window is open (or when it opens), the position in the list, the balance and the donations, with a link to the server page. The date is not shown in the main table, so you need the exact URL. Knowing it also tells you when your renewal window opens (6 months before). Since the price per day is fixed and public, the expiry date shows how much a server has paid: this is intentional transparency. Open the Renewal status tab →