Oreneta is a fast desktop mail and calendar app with chat and kanban views,
and native Microsoft Exchange (EWS) support. Oreneta is Catalan for the
swallow — the bird that always finds its way home.
It is a fork of Meron by Nonbili Inc.,
which declined native Exchange support upstream. Oreneta carries everything
Meron does, plus:
- Native Exchange (EWS): mail against on-premise Exchange servers with no
IMAP bridge in between — folders, incremental sync, send, flags, move.
- A full calendar: agenda, day, week and month views; events created,
edited and deleted on the server; recurring series expanded server-side;
in the day and week views, events dragged to move or resize them, dropped
on the mini calendar, or created by dragging a range, from a slot's menu or
from the keyboard (Exchange events not yet).
- Calendars from anywhere: an account's calendars arrive with the account
(Exchange, Google Calendar), alongside local calendars and read-only
subscriptions to published
.ics addresses.
Delivery roadmap
The completion plan (2026-10-09) orders the
remaining work into three declared candidates and sixteen iterations, each with
its required tests, and defines the verification levels and quality gates.
The competitive delivery plan and
backlog audit record the 2026-10-05 execution review.
The eM Client parity plan tracks the frozen
reference, sprint backlog, architecture gates and acceptance evidence. It is a
delivery target, not a claim that Oreneta has already reached parity.
Building
cargo build --manifest-path meron-core/Cargo.toml --bin oreneta-core # the Rust engine
wails build -tags webkit2_41 # the desktop app
Google sign-in: use your own credentials
Exchange, IMAP and Outlook accounts need nothing here — this section is only
about signing in with Google.
The Google OAuth credentials compiled into this source tree are Meron's,
inherited when Oreneta forked from it. Do not ship builds that use them:
Nonbili paid for the verification behind that OAuth client, and borrowing it
would show Meron on the consent screen, spend their quota, and put their
verified status at risk for users who are not theirs.
Point a build at your own Google Cloud project instead. Both the Go app and
the Rust engine read these, and they take precedence over the compiled values:
export MERON_GOOGLE_CLIENT_ID="…apps.googleusercontent.com"
export MERON_GOOGLE_CLIENT_SECRET="GOCSPX-…"
In the Google Cloud console you will need: an OAuth client of type Desktop
app (the sign-in flow redirects to loopback, which a Web client rejects),
the Google Calendar API enabled, and the calendar scope added to the
consent screen. An app left in Testing issues refresh tokens that expire
after 7 days; publishing it to Production ends that, and no verification is
required to publish — verification only removes the "unverified app" warning
and the 100-user cap.
Distributing Oreneta publicly with Google sign-in working out of the box is a
different matter: Gmail is a restricted scope, so it needs Google's
verification, and possibly a security assessment (see
docs/oauth-registrations.md for what is
confirmed and what is not). Until someone takes that on, public builds should
ship without Google sign-in — Gmail still works over IMAP with an app
password, and Google calendars can be subscribed to read-only through their
secret .ics address.
Build anything you distribute with -tags distributable. That build compiles
in none of the inherited values — the Microsoft client ID was inherited too —
and turns off each sign-in that has no Oreneta-owned client injected at build
time, instead of falling back to Meron's. The inventory, the injection flags
and the tests are in docs/oauth-registrations.md.
License
Oreneta is licensed under the
GNU Affero General Public License v3.0, as is the Meron code it
is built on. Copyright (C) 2026 Nonbili Inc. for the original work;
Copyright (C) 2026 Adil El Haji for the fork's changes. Internal module and
crate names keep Meron's naming on purpose, so upstream fixes keep merging
cleanly; what users see, such as the engine process oreneta-core, is named
after Oreneta.