Repository navigation
Releases: odaiameera/zajel-mail
Release list
v0.5.0 — Zajel Mail
ameera. is now Zajel Mail. Zajel (زاجل) is the carrier pigeon, the bird that has carried mail for a thousand years. The app and its agent now share that name: Zajel Mail is the workspace, and Zajel is your agent (formerly Raven). The repository moves to odaiameera/zajel-mail, and GitHub redirects the old URLs.
The rename doesn't touch your data. The database file, the key that encrypts your linked mail passwords, and the signatures in your existing drafts all keep working.
This is also the biggest release yet:
- an Inbox that sorts itself, with Jev
- Zajel, an agent that can run on OpenAI's GPT-5.6
- Send later and Undo send, handled by the server
- a redesign of the whole interface, from the composer to the phone layout
Jev: Inbox tabs, plain-English rules and spam checks
The Inbox can now split into Important, Updates, Newsletters and Promotions. Sort mail into a tab by dragging it there, with Move to tab, or with Jev, TypeSafe's decision model.
How Jev sorts
- Jev judges each new email once, with facts the app works out about it: is the sender a contact, have you written to them, is it a mailing list, does it carry a sign-in code.
- A confident pick is applied. Anything else stays in Important, and the message view shows why a message landed where it did.
- Jev never moves mail you've sorted yourself. Your moves teach it, and you can pin a sender or a whole
@domainto a tab. - Try Jev previews where your newest 200 emails would go, without moving anything.
- Mail already in your Inbox can be sorted in the background, with a cost estimate first.
Rules in plain English. Rules can now have conditions Jev judges, such as "it's an invoice or a request for payment". Each has a strictness (Loose 60%, Normal 80%, Strict 95%), can be mixed with exact matches, and can be tested on recent mail before you save. Rules with a Jev condition never delete.
Spam checks. Jev can give a second opinion beside Stalwart's filter.
- Watch only reports where the two disagree.
- Active moves mail Jev is at least 90% sure about to Junk. It never moves mail from your contacts or people you've written to, and it rescues mail from Junk when Jev is very sure and the sender passed DMARC.
Jev is off until you switch it on, account by account. Set JEV_MOCK=1 to try it without a key.
Zajel, your agent
The assistant is now Zajel, a window in the bottom-right corner.
- It searches the whole mailbox and calendar, one tool at a time, until it can answer.
- It summarises your day, prepares you for tomorrow, drafts replies, and proposes events and tasks.
- It changes nothing until you confirm.
Zajel runs on OpenAI's GPT-5.6 when OPENAI_API_KEY is set: gpt-5.6-terra by default, or gpt-5.6-luna through OPENAI_MODEL. It uses the Responses API with store: false, so OpenAI keeps no copy of your mail. Without that key, Zajel runs on Ollama, as before.
Send later and Undo send
- Send later offers tomorrow morning, tomorrow afternoon, Monday morning or any date and time you pick.
- Undo send gives you 5 to 30 seconds to take a message back.
- The server sends both. A scheduled message goes out on time even with every tab closed.
A new composer
The composer is redesigned:
- a full formatting toolbar, with text colour, highlight, lists, quotes and alignment
- recipient chips with autocomplete
- attachment cards, an emoji picker and importance
- signatures for each identity
It now opens above the corner buttons. Minimize and full screen work. Closing a message with anything in it saves a draft. Drafts, threading and sending were fixed along the way, and menus now open above dialogs instead of being clipped.
A new look across the app
- One visual system, including a phone layout with a bottom tab bar and drawers.
- The + button. Start a message, an event or a contact from any page.
- One icon set. About 230 inline icons, which had drifted into 136 drawings in 14 sizes and 8 stroke weights, now come from one Lucide registry. Every icon is named by the job it does.
- Icons for folders and labels, chosen from the full Lucide set of about 1,900 icons, in the folder's or label's own colour.
- Brighter sidebar names, so they read as clearly as the mail list.
- Sign-in codes are detected and get a Copy code button, which can also move the email to Trash.
- Remote images load through a server-side proxy, so senders' image hosts see your server's address, not yours.
- Trash can empty itself after 7 or 30 days.
- The reading pane stays open when a filter has no results.
- Archive works on servers with no archive-role folder: it uses the top-level
Archivefolder. - Row actions report failures instead of failing silently.
Calendar and Contacts
- The calendar remembers your view, and the week view's header lines up with its grid.
- Event dialog: redesigned.
- Contacts load with the page: switching back to Contacts now takes about 0.03 s instead of 0.2–0.4 s behind a spinner.
- Contact lists: new in this release.
- New contact form: simpler.
Documentation
The README is rewritten for Zajel Mail:
- a tour of every app, with 16 screenshots taken against fictional data
- a step-by-step Jev setup
- Zajel on OpenAI or Ollama
- a full security and privacy section
- a contributing guide
Upgrading
Pull, then run npm ci and rebuild; for Docker, docker compose up --build. This release adds the lucide-static dependency.
Migrations 010 to 018 apply automatically on start. They're forward-only, so back up your database first.
All new configuration is optional:
| Variable | What it does |
|---|---|
OPENAI_API_KEY, OPENAI_MODEL |
Run Zajel on OpenAI GPT-5.6. |
TYPESAFE_API_KEY, JEV_MODEL, TYPESAFE_BASE_URL |
Enable Jev. |
JEV_MOCK=1 |
Try Jev without a key. |
Verified before tagging: svelte-check reports 0 errors, and all 401 tests across 51 files pass.
Full changelog: v0.3.0...v0.5.0
v0.3.0 — Primer theme, sender trust, SQLite preferences
A theme and consistency release: the interface moves to GitHub's Primer palette, sender trust becomes explicit, and identity and preferences move from the browser to the database.
Interface
The app now uses GitHub's Primer palette for both light and dark themes. Light mode no longer renders text thinner than dark, dividers use Primer's muted border, and the mail content sits on a tray that separates it from the surrounding chrome.
Type sizes are consolidated onto a single scale, ad-hoc sizes are named rather than inlined, and keyboard focus is visible throughout — a genuine accessibility fix, not only a cosmetic one.
Folders align with the system rows, sidebar icons are heavier and sharper, and the date-header band no longer clips. Opaque favicons render edge to edge, and the avatar backing plate is sampled from the image itself instead of assumed — transparent logos no longer sit on a colour that fights them.
Sender trust
Senders can be trusted through the address book, and when a message is flagged the interface says why. Previously the reasoning was invisible.
Identity and preferences
Account identity and app preferences move to SQLite, keyed to the login, rather than living in the browser. Settings now follow the account across devices and survive a cleared browser.
Adds migration 009_account_identity.sql. Migrations are forward-only; existing databases upgrade in place on start.
App rail
The rail is reordered, and Tasks appears marked as coming soon. Tasks and Notes are next, backed by a local store independent of the mail server.
Documentation
The README is rewritten around what the project is and where it's going, with a roadmap covering Tasks and Notes, IMAP and POP3 support for servers without a JMAP endpoint, and cross-app assistant context.
Feature claims are now verified against the code: composer recipient autocomplete and import-time duplicate detection already ship and have moved out of the roadmap, and the sender-avatar resolver — BIMI, favicon, and Gravatar resolution cached server-side with misses negative-cached — is documented for the first time.
Upgrading
No configuration changes are required. Pull, rebuild, and restart; migration 009 applies automatically.
Verified before tagging: svelte-check reports 0 errors, and all 176 tests across 19 files pass.
Full changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
- Fix AI agent error reporting and overlay it as a drawer by @odaiameera in #12
- Add CI and make the AI model tag verifiable by @odaiameera in #13
- Markdown replies, chat sessions, and mailbox-wide search by @odaiameera in #14
- Match the drawer to the app, and give the agent real search tools by @odaiameera in #15
- Let the agent search the calendar and propose event changes by @odaiameera in #16
- Default to deepseek-v4-flash:cloud by @odaiameera in #17
Full Changelog: v0.1.0...v0.2.0