Skip to content

Releases: sphings79/amberchest

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 09 Sep 19:43

The mailbox gained the filters the search always had, both lists answer to a
right click, and a message can finally be thrown out of the archive and stay
out.

Thrown out for good, or taken back

Removing a single message used to be pointless: the mail is still on the
server, so the next backup found nothing in the index and fetched it straight
back. The archive now remembers the decision. The file goes, the row stays as a
tombstone, and the next backup recognises the message and leaves it alone.

Because a slip of the hand would otherwise be final, Discarded in the
sidebar lists everything that was thrown out — filtered by account, folder and
text — with a way back for one message, one folder or the whole account. Taking
one back fetches it again on the next run.

The decision is written to the folder's journal as well, so an index rebuilt
from the files arrives at the same answer. That matters more than it sounds:
rebuilding is what adopting an archive does, and what the far side of a move
does. Without it the first backup after either would restore everything you had
thrown away.

Right click

In the folder tree: export the attachments of this folder, export the folder
itself, or delete the local copy.

Deleting the local copy removes the files and asks first, because the server is
not consulted and there is nothing to restore from. Two things make it safe.
A message that sits in two folders is stored once and pointed at from the
second, so the file is handed to the other folder rather than deleted with the
directory. And the folder would come back with the next backup, so the dialog
offers taking it out of the selection — on by default.

On a message: save the .eml, save a PDF, search for the sender, open it in
the mail client where there is one, or throw it out of the archive.

Filters in the mailbox

The mailbox could narrow a folder by text and nothing else. It now has the same
panel as the search — sender, recipient, field, date range, size, unread,
flagged, sent to yourself — because the two ask the same questions of the same
index.

Two new ways to search

Mail you sent to yourself: notes, files moved between machines, reminders.
Both ends have to be one of your own addresses; the account address always
counts, and aliases go in a list beside it.

What takes up the room: the statistics used to show ten large messages with
no way to see more and no way to tell where they were. The card now offers both
questions — largest message and largest attachments, which are not the same
thing, a long thread being large with nothing attached — names the folder on
every row, opens the message on a click, and pages through the rest.

Fixed

The MCP settings tools handed out secrets. get_settings returned the
settings object as it stands, which contains the MCP bearer token, the MQTT
password, the notification auth header and the OAuth client secrets. Its
permission is read, the group that is on as soon as MCP is enabled at all, so
a client with nothing but read access was given the token that grants every
other permission switched on. Rotate your MCP token after updating.

The interface received secrets it never showed. The broker password, the
notification header and the client secrets travelled to the browser — and
across the network whenever the desktop app operates a container — although all
three are typed in and never read back. They stay on the server now.

The MCP token sat in a readable field. Masked, with a button to show it;
copying never needed it visible.

The mailbox stopped at 70% of the window height, leaving a third of a tall
window empty.

A message stayed white in a dark window. The viewer follows the theme, and
one message can be flipped either way. Only the page around the mail is themed:
what the sender coloured is left alone.

Also

The attachment export can be narrowed to a period, either end on its own.

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 09 Sep 11:11

Mail Archiver is now AmberChest. Same application, new name — and one thing
to know before you update: if you already run it, see Coming from Mail
Archiver
below. Nothing is lost, but the first start moves a directory.

Why

The old name collided with
s1t5/mail-archiver: sixteen months
older, two thousand stars, its own domain, and the same repository slug for the
same job. Searching for either found the other, and this one read as an
imitation of it. Better to fix that at one day old than at a thousand users.

Two different tools, for what it is worth. That one keeps mail in a PostgreSQL
database and aims at companies, with multi-user access, OIDC and audit logging.
This one writes one .eml per message into a folder tree you can read without
it, and aims at your own machine.

Coming from Mail Archiver

Update and start it. Both of these happen on their own:

  • Your configuration and index move with you. They live under the
    application's name, so the directory is renamed on first start —
    MailArchiver becomes AmberChest on macOS and Windows, mail-archiver
    becomes amberchest on Linux. Only ever when the new directory does not
    exist yet, so nothing can be overwritten.
  • Your archive stays exactly where it is. The path is stored in your
    configuration and is not touched. Only a brand new installation gets the new
    default of ~/AmberChest Archive.
  • Old environment variables keep working. A container set up with
    MAIL_ARCHIVER_* still comes up: the values are carried over to
    AMBERCHEST_* and the log says which ones. Rename them when convenient — the
    old names will stop working in a future version.

What you do have to change yourself:

Was Is
Docker image ghcr.io/sphings79/mail-archiver ghcr.io/sphings79/amberchest
macOS app Mail Archiver.app AmberChest.app — the old one can go
MQTT base topic mailarchiver amberchest, so Home Assistant creates new entities and the old ones can be deleted
Home Assistant integration domain mail_archiver domain amberchest, a fresh install
Home Assistant add-on slug mail_archiver slug amberchest, a fresh install

The old repository addresses redirect, so existing links and clones keep
working.

Also in this release

Everything from 1.2.1 carries over unchanged: the ad-hoc signed macOS build
that an Apple Silicon Mac will actually open, the illustrated guide for
reaching the add-on from outside Home Assistant, the table of what the desktop
app and the container each do, and screenshots of the OAuth and notification
screens.

Downloads

Platform File
macOS (Apple Silicon) AmberChest-2.0.0-arm64.dmg
Windows AmberChest Setup 2.0.0.exe, or the portable build
Linux amberchest_2.0.0_x86_64.AppImage or amberchest_2.0.0_amd64.deb
Docker ghcr.io/sphings79/amberchest:2.0.0

The macOS build is signed but not notarized — there is no paid Apple developer
account behind this. Open it once, let it fail, then System Settings →
Privacy & Security → Open Anyway
.

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 09 Sep 08:38

The macOS build of 1.2.0 cannot be opened at all. Update, or read below for how
to repair the copy you already have.

Fixed

"Mail Archiver is damaged and cannot be opened." Every macOS build so far
was rejected by an Apple Silicon Mac outright — not a warning to click through,
no way past it.

The packaging was told identity: null, which in electron-builder does not mean
"sign ad-hoc" but "do not sign". The app kept the signature Electron's own
binary ships with, while the packaging renamed the executable and replaced the
bundle's resources around it. What went out was therefore a bundle whose
signature no longer described its contents:

Identifier=Electron
Sealed Resources=none
codesign --verify: code has no resources but signature indicates they must be present

macOS reads that as corruption, and says so. The finished bundle is now signed
ad-hoc, which is what that setting was meant to do all along. The hardened
runtime is off, because ad-hoc signing plus library validation would refuse
better-sqlite3's prebuilt binary, and the hardened runtime only matters for
notarization — which needs a paid Apple account this project does not have.

The app is still not notarized, so the first launch still has to be allowed:
open it once, let it fail, then System Settings → Privacy & Security → Open
Anyway
. Since macOS 15 the old right-click Open route no longer works; the
install instructions said otherwise and have been corrected.

Repairing a 1.2.0 you already installed

Rather than downloading again:

xattr -dr com.apple.quarantine "/Applications/Mail Archiver.app"
codesign --force --deep --sign - "/Applications/Mail Archiver.app"

Windows and Linux builds were never affected.

Documentation

Reaching the add-on from outside Home Assistant now has a walkthrough with
pictures, on the add-on's Documentation tab and
in the add-on repository.
It is what you need for moving an archive from the desktop app into Home
Assistant, and it was previously one sentence in the middle of a paragraph.

A table of what the desktop app and the container each do, because the
seven real differences were spread over three sections. Screenshots of the
OAuth and notification screens, which had none. And the three repositories now
link to each other from the top of every README.

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 22:46

Sign in with a token, check that the archive is still intact, move it to the
server, and store a Gmail mailbox once instead of twice.

New

OAuth for Gmail and Microsoft 365. Neither accepts a password for IMAP any
more. Microsoft is connected with a device code typed in on any device; Gmail
goes through a browser once, either caught automatically by the desktop app, by
copying the address back, or through a public redirect. The token is refreshed
before every connection, so a nightly backup keeps running unattended. The
client is registered once per provider in the settings, and the consent screen
is pointed at the mailbox you are connecting.

Checking the archive. Every message now carries the checksum of what came
off the server — of the message, not of the file, so it survives encrypting the
archive. A verification reads every file, compares it, finds files the index
does not know, and on request asks the server how many messages each folder
holds. That last part answers the question one actually has: is anything
missing?

Moving an archive. An archive that started on the desktop belongs on the
server sooner or later. The files are sent to another instance, which rebuilds
its index from the journal every folder carries — so an interrupted transfer is
harmless, a second run carries only what is missing, and the first backup over
there downloads nothing. The same adoption runs on its own, which is how a lost
index database is rebuilt from the files.

Gmail: one message, several folders. Gmail shows every mail in its folder
and in All Mail, so an archive holds it twice. Switched on per account, the
duplicate is recognised from the envelope before anything is fetched: both
folders still show the message, but the bytes exist once. Half the files, half
the space.

Never delete anything before a date. Clearing old mail off the server to
win back space is normal, and the archive is where it should survive that.
Everything older than the date stays, whatever the deletion policy says.

Statistics — messages per year, the frequent senders, the largest folders
and messages, attachments by type, straight out of the index.

A register in the archive. An index.html next to the messages, one page
per folder linking to the .eml files beside it. Readable in any browser from
a plain directory, without this program.

Disk space and notifications. The free space is shown with two limits: one
that warns, one at which a running backup stops rather than filling the volume.
Notifications go to any address that takes a POST — ntfy, Gotify, Discord,
Apprise — for a failed backup, a finished one, a verification that found
something, and a volume running low.

Fixed

  • Patching one setting reset every other section to its defaults, because a
    partial schema still applies the defaults of what the client did not send.
    Changing the theme could quietly clear the archive path, the MCP token or the
    MQTT credentials.
  • On a phone the whole page scrolled, taking the navigation with it: 100% is
    measured against the taller state of the address bar. It is 100dvh now.

Also

  • The journal in every folder now records what the folder is called on the
    server, which is what makes an archive adoptable without asking it.
  • The verification does not report an account as differing from the server when
    it deliberately holds more — that is what those settings are for.

v1.1.2

Choose a tag to compare

@github-actions github-actions released this 08 Sep 20:56

The interface of 1.1.0 does not start. Update.

Fixed

The interface stayed blank in 1.1.0. A version constant was imported from
the core package to avoid having it written down twice. That package is written
for Node, and the value import pulled node:os into the browser bundle, which
threw on the first call and took the whole interface down with it. The version
is a literal again, with a comment saying why.

New

Home Assistant add-on. The container now understands /data/options.json,
which is how the Home Assistant supervisor passes an add-on its settings, and
turns it into the configuration it already knew. Its configuration lands in
/data/config and the archive in /share/mail-archive, so both survive an
add-on update.

With ingress the interface appears in the Home Assistant sidebar, and in the
Home Assistant app on your phone. Home Assistant has authenticated whoever gets
there, so the add-on runs without a login of its own — and answers the
supervisor and nobody else. Setting an interface password in the add-on options
opens the port for other clients as well.

The add-on lives in
Home Assistant App (Add-on).

GET /api/schedule reports the cron expression and the next run, which is
what the
Home Assistant integration
shows as "next scheduled backup".

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 20:06

Do not use this release. Its interface does not start: a value import from the
core package pulled Node modules into the browser bundle. Fixed in
v1.1.2.

Browse the archive like a mailbox, connect it to Home Assistant, and search with
real filters. Everything from 1.0.0 still applies: nothing on the server is
deleted, nothing is marked as read.

New

Mailbox browser. Accounts and their folder tree on the left, the messages of
the selected folder on the right, straight from the local index — no server
connection needed to read what you already archived.

Home Assistant over MQTT. Mail Archiver publishes the state of every account
to an MQTT broker, with the account in the topic
(mailarchiver/account/<account>/state). Home Assistant creates the entities
through discovery: messages, archive size, last backup, a "backup running" flag
and a button that starts one. Commands have their own switch — with it off the
bridge subscribes to nothing and stays read only.

More search filters. Recipient, a field restriction (subject, sender,
recipient, body or attachment content only), unread only, flagged only,
messages deleted on the server, a size range, and sort by relevance, date or
size. The same filters apply to the export and to the MCP tool.

Encrypt an archive that already exists. Switching archive encryption on used
to affect newly downloaded mail only. It now converts what is already on disk,
file by file, and back again. Every file is written to a temporary name and
renamed over the original, so an interrupted run leaves either the old or the
new file, never a half written one.

Installable on a phone. The web interface is a progressive web app: open it
on your phone and add it to the home screen, and it runs full screen with its
own icon.

Account filter on the accounts screen, from five accounts upwards.

Changed

  • "Back up now" opens the folder picker when no folders have been selected yet,
    instead of sitting there disabled.
  • The folder picker shows the folder list first and fills in the message counts
    afterwards, so it is no longer empty while it waits for the server.
  • The AI connection and Home Assistant each have their own item in the
    navigation.
  • The connection button says what it switches between, so it is visible that a
    remote server can be added there.
  • Star and coffee links in the sidebar.

Fixed

  • The release build packaged an application without its entry point, which is
    why 1.0.0 has no downloads. The desktop main process is now compiled before
    electron-builder runs.

Companion projects