<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[The Control Deck: browser administration at /]]></title><description><![CDATA[<p dir="auto">The Control Deck is the administration page hMailServer serves at <code>/</code>, on the same listener as the API and the portal. On Linux it is the only administration front end there is, because that build has no Control Panel and no COM. On Windows it does not replace the Control Panel and it does less.</p>
<p dir="auto"><strong>Turning it on.</strong> One setting, <code>RestApiPort</code>, turns on the API, the Deck and the portal together. The default is 0, which leaves all three off, so a server upgraded without touching its settings serves none of them. The listener refuses to start rather than come up without a credential or without TLS, and logs which. Four messages begin <code>RestApi: Refusing to start</code>. The two you will meet are an unset administrator password and a non-loopback bind with no certificate. The TLS exemption applies only to a bind address that is exactly <code>127.0.0.1</code>, <code>localhost</code> or <code>::1</code>. <a href="https://www.progressiverobot.com/hmailserver-documentation/#362-turning-them-on" rel="nofollow ugc">36.2</a></p>
<p dir="auto"><strong>Signing in.</strong> The password goes once to <code>POST /api/v1/session</code> and is exchanged for an <code>hmailsession</code> cookie that is <code>HttpOnly</code> and <code>SameSite=Strict</code>. Two ceilings apply, 30 minutes idle and 12 hours absolute, neither configurable. Any cookie-authenticated request whose method is not <code>GET</code> or <code>HEAD</code> must carry <code>X-Requested-With: hMailServer</code> or it answers 403; HTTP Basic and bearer keys are exempt. An API key cannot mint a session. Sessions are process-local, so a service restart ends every one. <a href="https://www.progressiverobot.com/hmailserver-documentation/#363-signing-in-to-the-control-deck" rel="nofollow ugc">36.3</a></p>
<p dir="auto"><strong>What it does.</strong> Dashboard, Domains, Delivery queue, DANE/TLSA, Settings, Rules, Routes, Certificates, Ports and Logs. 6.3.3 added full domain editing, the account editor in full, distribution lists and aliases, an IP-ranges view, fetch-account and backup views, the scripting, cache and indexing groups, and a CI harness of 292 checks.</p>
<p dir="auto">The settings forms are worth understanding. The Deck fetches <code>GET /api/v1/openapi.json</code> once per session and draws each form from the schema of that group's <code>PUT</code>. Nothing in the page lists a settings key by name, so a key added to the API appears on its own, with its type, its permitted words, and a badge when it is read-only, write-only, required, or takes effect only on restart. The Ports view carries a Restart the services now button, which posts to <code>/api/v1/server/reinitialize</code>. It drops connections in progress and ends your session with everyone else's. <a href="https://www.progressiverobot.com/hmailserver-documentation/#364-what-the-control-deck-can-do" rel="nofollow ugc">36.4</a></p>
<p dir="auto"><strong>A few write surfaces remain API-only.</strong> Measured, not asserted. <code>build/check-deck-parity.py</code> counts every field the desktop Control Panel writes against the REST API and the Deck, and reports in <code>hmailserver/docs/DeckParity.md</code>. Of 330 properties, 240 were writable over REST and 153 reachable from a Deck view when that work started; 328 and 322 by the end of it. The two still not writable over REST are groups and their members. The six between those figures are properties the API writes and the page has no control for. Use <code>curl</code> for those.</p>
<p dir="auto"><a href="https://www.progressiverobot.com/hmailserver-documentation/#365-what-the-control-deck-cannot-do-yet" rel="nofollow ugc">36.5</a> still describes the 6.3.1 gaps, which were far wider. The 6.3.3 entry in the <a href="https://www.progressiverobot.com/hmailserver-downloads/" rel="nofollow ugc">release notes</a> is the current statement until that chapter is rewritten. Check <code>DeckParity.md</code> in the <a href="https://gitlab.com/Progressiverobot/hmailserver" rel="nofollow ugc">source tree</a> before assuming a route does not exist.</p>
]]></description><link>https://www.hmailserver.co.uk/topic/28192/the-control-deck-browser-administration-at</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 04:10:12 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28192.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Sep 2026 01:35:00 GMT</pubDate><ttl>60</ttl></channel></rss>