Releases: IanShaw027/openmail
Release list
OpenMail v0.3.6
OpenMail v0.3.6
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.6
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.6
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.6Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.6.
Changelog
Added
- Server-decryptable cloud poll: upload/import with poll stores master-key credentials (
sync_enabled); SyncWorker upsertsmail_items+sync_cursors GET /api/sync/statusandGET /api/sync/delta: device HMAC incremental pull into local mailCache on vault unlock (+ 3‑minute poll)- Shared stable_id (
p:/m:/wh_+sha256) for local and cloud merge
Fixed
- SyncWorker catch-up no longer stops on a full page of already-known (overlap) mail; pages older via
before=within the since window - Cloud delta ack uses mail
updated_at+idkeyset instead of wall-clockserver_time(avoids skipped rows)
Changed
- Cloud poll is no longer client-sealed by default (sealed remains backup-only / non-poll)
OpenMail v0.3.5
OpenMail v0.3.5
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.5
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.5
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.5Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.5.
Changelog
Added
- mail.com cookie send: same web session as fetch — oauthbridge SPA grant (
urn:mam:oauth:grant-type:spa, Basicclient_id:*******,sidquery) thenwebmail-catsmailsubmissionwith BearerqX{JWT}andno_cache=auth_id - Display settings: default timezone
Asia/Shanghai(configurable); theme light / dark / system
Changed
- Cookie /
@mail.comaccounts send via session API, not SMTP;accountCanSendallows session cookies without password re-entry
OpenMail v0.3.4
OpenMail v0.3.4
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.4
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.4
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.4Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.4.
Changelog
Fixed
- Parse mail.com UI dates (
Tuesday, August 04, 2026 at 10:56 AM) for sort and since/before - CF temp-mail (ian10-mail-admin): map
created_at→ date,recipient→ to - Mail list newest-first; load-more older mail appends below
Changed
- Server-side body slim on fetch; local vault quota drops oldest mail by date first
OpenMail v0.3.3
OpenMail v0.3.3
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.3
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.3
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.3Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.3.
Changelog
Fixed
- Email HTML links with
/?redirectUrl=…(OpenAI trackers, etc.): unwrap real URL, confirm, then open; landing onmail.clomio.ai/?redirectUrl=…also confirms and navigates - 清空重拉: atomically replace the folder cache (no leftover mails after a short page)
- Short page (< requested 20): mark no older mail and stop infinite-scroll pull-up (clear-refetch, first window, load-more)
Changed
- Unified multi-folder fetch policy for list-row / panel / batch: empty folder → latest 20; has cache → catch-up since newest (up to 100×20 rounds)
- Catch-up
sinceuses newest mail − 2 minutes (clock skew)
OpenMail v0.3.2
OpenMail v0.3.2
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.2
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.2
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.2Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.2.
Changelog
Added
- Multi-folder fetch (inbox / spam / sent): empty folder → latest 20; else catch-up since newest
- Mail list infinite scroll (pull-up load older); top refresh / bottom loading status without a load-more button
- SMTP host table for GMX / Zoho; after SMTP send, best-effort IMAP APPEND to Sent
- NetEase IMAP ID after login (fixes 126/163
Unsafe Loginon SELECT) - mail.com messagelist multi-page paging for load-older / wider windows
- Client-sealed cloud accounts: re-seal envelope when password/tokens change
Changed
- Credential TXT export rebuilds lines from current secrets (no stale
rawLine) - Vault unlock migrates stale
rawLine; fetch merge reparses cached OTP codes - Delete account clears unused mailCache; system import keeps cache only for restored accounts
- 2FA cards: wider layout, multi-line account names (less aggressive ellipsis)
- Verification parser: reject years / marketing words (
purchase,two-factor, bareone-time)
Fixed
- Clear & refetch keeps the list until a successful response, then replaces
- Load-more never wipes existing messages; append only after success
- Sticky false
verification_codeon mailCache merge - Panel verification banner removed (less redundant UI)
OpenMail v0.3.1
OpenMail v0.3.1
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.1
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.1
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.1Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.1.
Changelog
Fixed
- vue-i18n Invalid linked format crash when rendering import placeholder emails (
user@…must use{'@'}escape)
OpenMail v0.3.0
OpenMail v0.3.0
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.0
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.0
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.0Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.0.
Changelog
Security
- Device HMAC body binding (
X-Device-Body-Sha256); mutating methods (POST/PUT/PATCH/DELETE) require body hash - Transfer routes require registered vault device; status limited to host/guest/claim-token; HTTP-level auth tests
- Cloud account quota floored on live
COUNT(accounts)+ conditional UPDATE; IntegrityError reconcile - Poll quota durable in DB with per-device serialization (SQLite
BEGIN IMMEDIATEwhen available) - Fetch lease token-owned DB lock with expiry, post-lease min-interval recheck,
retry_afteron contention - Client-sealed accounts reject accidental server-side credential unseal (require
_om_unwrap_sealedorclient_sealed) - HttpApi streamed response body limit (no full buffer before cap); IMAP BEFORE candidate budget
- Unique
(owner, email)migrate fail-closed with duplicate-key diagnostics
Added
- Durable
device_poll_events/ poll quota state; clouddevice_quota_state - Fetch lock
lease_token; code-API cache TTL config - Docs: security & cache review (
docs/18-security-and-cache-review.md) - Frontend: provider capability helpers, account UI meta utilities
Changed
- Credential PATCH deep-merge (empty string clears a key; partial patch no longer wipes blob)
- mailCache keys include IMAP UIDVALIDITY; upgrade path drops legacy same-folder keys
- Transfer status no longer enumerable by arbitrary registered devices
Fixed
- Concurrent cloud create / poll quota races under multi-worker
- Permanent fetch in-flight after worker crash (lease expiry)
- Transfer anonymous create / unauthenticated status
OpenMail v0.2.1
OpenMail v0.2.1
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.2.1
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.2.1
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.2.1Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.2.1.
Changelog
Added
- Unified brand logo registry (
brandLogos.ts, 100+ Simple Icons / multi-color marks) shared by mail chips, 2FA, and purpose shortcuts - Expanded 2FA service presets (OpenAI, Claude, Cloudflare, Docker, Stripe, …)
- CF temp-mail expand/collapse under the API source row (children not flat peers)
Fixed
- mail.com HTML body via lightmailer
mailbodyiframe hydrate - Mainstream body extraction: nested MIME prefer-HTML, Graph
body/uniqueBody, HttpApi field aliases - Incremental fetch no longer uses
lastFetchAtassince(empty pull after cache) - Purpose shortcuts: idle → on → used(gray) cycle, live text sync,
~~tag~~disabled form - Manage-groups modal layout consistency
- CF temp children: read-only credentials, per-child fetch, re-parent orphans on sync
- localStorage QuotaExceeded on
openmail.userSettings— drop unusedlastFetchAt, capfirstFullDone, safe persist + prune
Changed
- Brand filter includes
cf_temp, GMX, Proton, Zoho, DuckMail - ChatGPT purpose / 2FA marks resolve to OpenAI glyph
OpenMail v0.2.0
OpenMail v0.2.0
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.2.0
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.2.0
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.2.0Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.2.0.
Changelog
Added
- Device QR transfer — PC ↔ phone vault sync via short-lived server ciphertext package (approve / reject / overwrite ack)
- Brand taxonomy — CF temp-mail + regular brands (Gmail, Outlook, QQ, 163, mail.com, GMX, Proton, Zoho, DuckMail, …) with multi-color SVG chips on the console
- 2FA service brand SVGs — Google, Microsoft, GitHub, Apple, Amazon, Discord, X, Facebook, Dropbox, Steam, Binance (+ fallback mark)
- 2FA service filter chips and drag-to-reorder with
sortOrderpersisted in the vault - 2FA circular countdown (amber ≤10s / red ≤5s) instead of a thin bar
- Mail load-more — first fetch 20 messages; “load more” shows more from cache then pulls 10 older (
before+max_messageson proxy fetch; IMAP / Graph) - Clear & refetch — wipe local mailbox cache and pull latest 20
- Auto-detect unknown accounts every 5s (small concurrent batches)
- CF Worker root URL expands to known mail API paths; HttpApi auth styles expanded
- Top-nav GitHub icon → IanShaw027/openmail
- Console: purpose note chips, folder tabs (inbox / spam / sent), full-bleed topnav / resizable panes polish
- Docs: expanded README, ops, screenshots, Dependabot, security advisory path
Changed
- Mobile console actions column: no sticky freeze; collapsed ⋯ expand per row
- Copying email / secret / code / 2FA also selects that mailbox so the mail panel follows
- Default quick fetch window raised toward 20 messages; proxy supports
before+max_messages - Published image remains Docker Hub only (
ianshaw027/openmail)
Fixed
- Client-sealed accounts never hit server decrypt; clear local-secrets errors
- WARP / egress retries capped so proxy fetch stays under client timeout
- mail.com: faster first login;
logout/?ls=wdtreated as wrong password; body hydrate via detail URL - CF Worker ConnectError — TLS SNI uses original host (not pin-to-IP alone)
- 2FA form: dropdowns selectable, simplified fields, full SHA/SHA3, webcam + image QR
- Brand marks and IMAP host classification for multi-color chips
Security
- Sample / demo credentials scrubbed from docs and fixtures where present
- Vault transfer packages are opaque ciphertext; short TTL on the server
v0.1.0 — Local-first public release
OpenMail v0.1.0
Images
docker pull ghcr.io/ianshaw027/openmail:v0.1.0
docker pull ghcr.io/ianshaw027/openmail:latest
docker pull ianshaw027/openmail:v0.1.0
docker pull ianshaw027/openmail:latest
Run
export OPENMAIL_IMAGE=ghcr.io/ianshaw027/openmail:v0.1.0
docker compose pull && docker compose up -d/api/health reports version: 0.1.0.
Changelog
Security
- Strict vault device HMAC for cloud accounts, proxy fetch, and send
- Device register rejects takeover / public_id aliasing
- IMAP/SMTP/HTTP SSRF checks; DNS pin for HTTP and mail endpoints where possible
- Client vault (PBKDF2 + AES-GCM), recovery key, auto-lock clears Pinia secrets
- DOMParser-based HTML sanitization for mail bodies
- CSP headers compatible with vue-i18n and Cloudflare Insights
- IMAP TLS SNI when connecting via DNS-pinned IP; modified UTF-7 mailbox names
Added
- Published image:
ianshaw027/openmail:v0.1.0(Docker Hub), GHCR via CI - Factory reset of local vault environment; body expand modal; sent folder
- Open-source meta: LICENSE, SECURITY, CONTRIBUTING, CODE_OF_CONDUCT, CI
Changed
- Product model is local-first (no user/admin login UI)
- Cloud credentials prefer client-sealed blobs (server cannot decrypt)
docker-compose.ymldefaults to pullianshaw027/openmail:v0.1.0
Removed / deferred
- User registration, admin console, server mail search UI
- Code-API create (legacy token URLs may still resolve if present in DB)