Skip to main content
Version: 4.1

Webmail parity (Community vs Enterprise)

Community's webmail and Enterprise's webmail (HiTechCloud Webmail, the webmail module, the hitechcloudmail repository's webmail/ tree, installed by hitechcloudcli webmail) are different applications. The owner's rule for this pairing is unconditional: Enterprise is a superset. Whatever Community's webmail gives an end user, Enterprise's must give too — an account upgrading from Community must not find a single thing missing.

This page is the gap audit against that rule: what a stock installation of Community's webmail gives an end user (the mail client itself, plus the settings a user relies on day to day), checked against what is actually implemented in hitechcloudmail/webmail's source — not assumed, not inferred from a feature's name, but read in the code. The table is kept current by whoever closes a gap: closing one flips its verdict and its "where it lives" column in the same change that closes it.

Summary​

VerdictCount
Present17
Partial2
Missing2
Total items audited21

The table​

ItemCommunity's webmailEnterprise's webmail (HiTechCloud Webmail)VerdictWhere it lives / what is needed
Folder management — create, rename, purgeYesYesPresenthitechcloudmail/webmail/backend/src/routes/mail.js (POST /folders, /folders/rename, /folders/empty), backend/src/routes/accounts.js (GET /:id/folders)
Folder management — subscribe/unsubscribeYes (true IMAP SUBSCRIBE)Hide/unhide only (a client-side preference, not an IMAP subscription)Partialfrontend/src/components/Sidebar.jsx (folderMenu.hide/unhide). A real IMAP SUBSCRIBE/UNSUBSCRIBE would only matter to another IMAP client sharing the same mailbox — lower priority than the items below, left open
Identities with signatures (plain and HTML)YesYesPresentaccount_aliases table (reply_to, bcc, signature) plus the primary account's own signature column; frontend/src/components/SignatureEditor.jsx, frontend/src/components/AdminPanel.jsx (Accounts tab); HTML signatures pass through services/emailSanitizer.js
Address book / contacts, with groupsYesYesPresentcontacts, address_books, contact_groups, contact_group_members tables; backend/src/services/contactGroups.js; frontend/src/components/ContactsPage.jsx (group filter chips, per-contact group toggles)
Contact import and export (vCard / CSV)YesYesPresentbackend/src/routes/contacts.js (GET /export, POST /import), backend/src/utils/vcard.js, backend/src/utils/csv.js
Message search, including in a selected folder and by headerYesYesPresentbackend/src/routes/search.js (parseSearchQuery): from:, to:, subject:, has:, is:, after:, before:, in:<folder> operators plus free text
Threading and sortingYesYesPresentbackend/src/routes/mail.js (thread-grouped inbox, threadId); list sort order in frontend/src/store/index.js
Filters / SieveYes (enforced by the mail server itself, so it runs even while the client is closed)An in-app rule engine only — runs while the webmail's own process is polling the mailboxPartialbackend/src/routes/rules.js, backend/src/services/inboxRules.js, backend/src/services/ruleForwarder.js. Real parity needs server-side Sieve (ManageSieve) enforcement, which lives with the mail server (Dovecot/Postfix), not in this repository — flagged for a follow-up round scoped to hitechcloudcli's mail module
Vacation / autoresponderYesNoMissingNo route, service or UI exists. Same dependency as Sieve above: needs MTA/ManageSieve-level infrastructure outside this repository
Spell checkYes (browser-native)Yes (browser-native)PresentThe compose editor's contenteditable surface (frontend/src/components/ComposeModal.jsx) uses the browser's own spellchecker, the same mechanism most webmail clients rely on
Message-list preferences (layout, preview pane, page size)YesYesPresentfrontend/src/layouts.js, frontend/src/components/AdminPanel.jsx (Appearance › Layout tab), mailflow_page_size preference
Composing options (HTML/plain default, reply quoting, forward as attachment, save-to-sent, drafts autosave)YesYesPresentplaintextEmail preference; replies always quote the original; forwarding preserves original attachments; sentCopySaved tracking in backend/src/services/outboundMail.js; frontend/src/utils/draftAutosave.js
Attachment handling and inline imagesYesYesPresentCore message compose/view path throughout backend/src/routes/mail.js and send.js, and frontend/src/utils/inlineImages.js
Keyboard shortcutsYes (fixed set)Yes (customizable)Presentfrontend/src/utils/defaultShortcuts.js, frontend/src/utils/shortcutBus.js, Settings › Shortcuts tab
PrintingYesYesPresenthandlePrint in frontend/src/components/MessagePane.jsx
Message source ("view source" / "show original")YesYesPresentGET /api/mail/messages/:id/source (backend/src/routes/mail.js, imapManager.fetchRawSource); reachable from the message toolbar, the mobile "more" menu and the right-click menu
Mark-as-read behaviourYes (immediate / on-open-delay / manual, configurable)Yes, same three modesPresentmarkReadBehavior / markReadDelay preferences, frontend/src/utils/gtd.js
Delete-to-trash vs purgeYesYesPresentA normal delete moves a message to Trash; emptying a folder or a bulk delete from Trash/Junk expunges it — backend/src/routes/mail.js
Interface languageYesYes (10 languages)Presentfrontend/src/locales/*.json, Settings › Appearance › Fonts and Language
Timezone for displaying message datesYesYesPresentNew "Display timezone" preference (this round): frontend/src/utils/formatDate.js, Settings › Appearance › Fonts and Language
Changing the mailbox passwordYesNoMissingThe webmail's backend process runs unprivileged and only ever speaks IMAP and its own database — it has no path to change the system/Dovecot password. Needs a privileged system-level helper outside this repository (candidate: a hitechcloudcli mail-module command that a settings page could call)
Per-identity Reply-To / BccYesYes, on every identity except the primary one (same scope the existing Reply-To field already had)Presentaccount_aliases.reply_to / account_aliases.bcc, applied at send time in backend/src/services/outboundMail.js (resolveIdentity, mergeIdentityBcc)
Responsive / mobile layoutYesYesPresentfrontend/src/hooks/useMobile.js and mobile-specific branches throughout frontend/src/components/; native mobile/desktop shells under frontend/packages/

What was carried over from Community, and how​

A mailbox's Community-edition data (contacts, contact groups, sender identities and their signatures, and the interface language) is copied — never moved — into its Enterprise data the first time that mailbox signs in to Enterprise's webmail on a server where Community's mail-client database is still reachable. Community's own database is never written to: a customer who goes back to Community's webmail finds it exactly as they left it. The import is idempotent (skips anything that already exists here, matched by address), runs at most once per mailbox, logs what it did, and never blocks or fails the sign-in it runs alongside.

See hitechcloudmail/backend/src/services/legacyImport.js. It activates only when LEGACY_WEBMAIL_DB_URL is set in that service's environment — wiring that env var from wherever the Community installer records its own database connection is follow-up work for the installer round, not this one.

What is left open, and why​

  • Mailbox password change and server-side Sieve filters / vacation-while-offline both need something outside hitechcloudmail's own process: a privileged system helper for the former, mail-server (ManageSieve) enforcement for the latter. Both are flagged above rather than built here, so the gap is visible instead of silently accepted.
  • True IMAP-level folder subscription is a smaller gap: Enterprise's webmail already gives its own users an equivalent (hide/unhide), and the difference only shows up for a second IMAP client sharing the same mailbox.
Was this helpful?