Repository navigation
Releases: Busnes-app/KyPost-Server
Release list
v0.4.3.1
What's Changed
- Silver criteria: repeatable build check, release verification, coding standard, assurance case by @Yoshiofthewire in #469
- feat(pgp): HPKE device envelopes v4/v5 (wire format, needs owner sign-off) by @Yoshiofthewire in #471
- security(workers): bump undici >=7.30.1 (DoS advisories) by @Yoshiofthewire in #473
- chore(deps): bump pinned Ollama to 0.40.9 by @github-actions[bot] in #472
- ci(codeql): run the security-and-quality suite by @Yoshiofthewire in #474
- fix(push): recover native push when one process's relay registration fails (#461) by @Yoshiofthewire in #475
- fix(apns-relay): evict rejected provider token; correct README env advice (#459) by @Yoshiofthewire in #476
- fix(web): reveal settings links when the phone Settings button opens them (#456) by @Yoshiofthewire in #477
- Add OpenSSF Best Practices and Scorecard badges by @Yoshiofthewire in #478
- feat: refine Busnes webmail layout and task controls by @Yoshiofthewire in #480
- appearance: shared radio cards and the 22-theme suite catalog by @Yoshiofthewire in #481
- Sync ky-ui 0.4.1 classic theme catalog by @Yoshiofthewire in #483
- chore: push relays move to *.relay.kypost.busnes.app by @Yoshiofthewire in #482
Full Changelog: v0.4.3...v0.4.3.1
v0.4.3
Added
-
GET /api/pgp/bootstrapreturnsaccountAddresses: the account's sending
address, then its verified send-as aliases. Clients use it to leave the
account's own addresses out of Reply All when the IMAP login is not an email
address (#452).suggestedUserIDsis unchanged. -
AI agent access over MCP at
/mcp(Streamable HTTP, bearer token). Users
create tokens under Security → AI agents (GET/POST /api/agent-tokens,
PUT/DELETE /api/agent-tokens/{id}; create and widen need step-up) with
Read only or Read and organize access. Tools search, list and read mail and
threads, list folders and labels, apply and remove labels, move, archive and
save drafts; nothing sends or deletes. Encrypted mail is metadata only. The
agent skill is served at/agent/skills/kypost/SKILL.md. Tokens unused for
90 days, and all tokens on a sealed-backup restore, are revoked./mcp
refuses any request with anOriginand sends no CORS headers; token
changes need the session, its CSRF token and KyPost's own origin. -
KYPOST_DISABLE_AI_SORTING=trueturns off automatic labels instance-wide
and keeps the bundled Ollama and its model pull from starting. Filter rules
still run, and other new mail gets the fallback label. -
Docker build arg
INSTALL_OLLAMA=falsebuilds the image without Ollama. -
KyCalendar pairing (
KYPOST_KYCALENDAR_URL,KYPOST_KYCALENDAR_SECRET_FILE,
KYPOST_KYCALENDAR_ALLOW_PRIVATE; off by default). With a user's opt-in
(Settings → Mail → KyCalendar), KyCalendar sends invitations, cancellations
and replies from their own mailbox through the signed
POST /api/calendar/itip/send, and receives the DKIM-aligned invitations
that arrive there. NewPOST /api/calendar/rsvpanswers an invitation
through KyCalendar from the server-side copy; clients fall back to
calendarReplywhen it answerskycalendar_off. Contract:
docs/KYCALENDAR.md.
Fixed
-
Built with Go 1.27.3, which distrusts compromised intermediate certificates
incrypto/x509(GO-2026-6809). Outbound SMTP over TLS verified server
certificates with the affected code. -
Remove the pre-launch README’s obsolete Busnes-app owner-move upgrade section.
-
Correct the PGP documentation: server-protected key custody is retired, not
a selectable mode. Describe the retained legacy migration path and distinguish
it from client-sealed recovery and pickup copies. No key-handling code changes.
SECURITY.mdandCONTRIBUTING.mdnow say the same, and name the legacy
master key by its real file,pgp-private-key.key. -
Server → Backup no longer renders a blank page before the first local copy:
the status API answeredlocalCopies: nullfor an empty or missing
KYPOST_BACKUP_DIRand now answers[]; the page also toleratesnull. -
A failed Save Draft is shown as
Draft not saved: …instead of
Send failed: …. -
Launch-video bugs:
- The phone-layout mailbox nav no longer repeats folders. It hid rows by
exact name only, so "Sent Items" and the Scheduled heading showed beside
the quick nav. It now uses the server's special-use role and the usual
alias names, and its Drafts/Junk/Sent/Trash links open the account's
real folders. - A keyless account's forced first-login password change no longer warns
that PGP recovery status is unavailable. - Security → Encryption asks for the account password in a masked page
dialog instead of the browser's clear-textwindow.prompt. - The read and compose PGP unlock dialogs no longer share the input id
pgp-unlock-password. GET /api/imap/configand the admin per-user IMAP config no longer return
the server's on-diskpathandkeyPath, and Mail settings no longer
show them.- With automatic labels off, mail that already carries one of the account's
labels keeps it instead of also getting the fallback label. - The classifier warm-up no longer pulls a model Ollama already has. The
pull wrote into the models directory, so a pre-populated cache the
container could not write failed every warm-up and stalled
classification.
- The phone-layout mailbox nav no longer repeats folders. It hid rows by
Changes
-
Dependabot updates now ship on their own: once a day, if any merged, a
v0.4.3.Nrelease and image are published and:stablefollows it. The
version lives inbackend/internal/appversion/VERSIONalone; release images
report the full four-part version, source builds the three-part line. -
Admin → Single Sign-On: the KySignOn Preset button no longer fills in a
specific issuer address. It still enables SSO, sets the client ID to
kypostand turns on auto-provisioning; enter your own KySignOn issuer URL.
The issuer placeholder is nowhttps://auth.example.com. -
Docs: the README quick start pulls the published image instead of building
from source, and names the Ollama memory cap (KYPOST_MEM_LIMIT, now in
docs/CONFIGURATION.md).docs/Reverse_Proxy_Networking.mdcovers starting
KyPost when KyIdentity or KyNotes already createdkypost-net.
docs/INSTALLER_SETUP.mdpoints to secret file references and the directory
webhook needed for offboarding.
What's Changed
- chore(deps): bump pinned Ollama to 0.40.4 by @github-actions[bot] in #424
- docs: lead the README with what KyPost is, move the TLS note out by @Yoshiofthewire in #427
- docs: add a manual image verification procedure by @Yoshiofthewire in #426
- chore(deps): bump pinned Ollama to 0.40.5 by @github-actions[bot] in #428
- feat: add KYPOST_DISABLE_AI_SORTING and INSTALL_OLLAMA build arg by @Yoshiofthewire in #429
- feat: KyCalendar invitation mail (send, inbound, RSVP) by @Yoshiofthewire in #430
- fix: blank Backup page and draft-save error label; install docs from a test run by @Yoshiofthewire in #431
- Polish KyPost interface while preserving controls and settings by @Yoshiofthewire in #432
- docs: clarify standalone installation and test coverage by @Yoshiofthewire in #433
- Make KyPost own shared suite network bootstrap by @Yoshiofthewire in #434
- Shorten KyPost README and correct retired PGP documentation by @Yoshiofthewire in #435
- feat(mcp): add AI agent access to mail over MCP by @Yoshiofthewire in #437
- docs: stop offering retired server-protected PGP custody by @Yoshiofthewire in #438
- Remove the founder's personal urlxl hostnames from SSO config and tests by @Yoshiofthewire in #439
- Bootstrap: return accountAddresses for Reply All (#452) by @Yoshiofthewire in #453
- Build with Go 1.27.3 (GO-2026-6809) by @Yoshiofthewire in #455
- Fix KyPost-Server bugs found while filming the launch videos by @Yoshiofthewire in #454
- chore(deps): Bump github.com/go-jose/go-jose/v4 from 4.1.5 to 4.1.6 in /backend in the go group across 1 directory by @dependabot[bot] in #441
- ci: read the rspamd image pin from docker-compose.rspamd.yml by @Yoshiofthewire in #457
- Change relay URLs in .env.example by @Yoshiofthewire in #458
- chore(deps): Bump the npm-build group across 1 directory with 3 updates by @dependabot[bot] in #442
- fix(backend): log a serve error that arrives after shutdown by @Yoshiofthewire in #462
- chore(ci): Bump github.com/golangci/golangci-lint/v2 from 2.14.0 to 2.15.0 in /tools in the tools group across 1 directory by @dependabot[bot] in #445
- chore(deps): Bump the npm-runtime group across 1 directory with 2 updates by @dependabot[bot] in #443
- chore(deps): Bump the npm-lint group across 1 directory with 2 updates by @dependabot[bot] in #447
- chore(deps): Bump the relay group across 2 directories with 2 updates by @dependabot[bot] in #460
- chore(ci): Bump github/codeql-action/upload-sarif from 4.38.3 to 4.39.0 in the actions group across 1 directory by @dependabot[bot] in #448
- chore(deps): bump rspamd/rspamd from 4.2.0 to 4.2.2 by @Yoshiofthewire in #463
- chore(deps): bump pinned Ollama to 0.40.7 by @github-actions[bot] in #436
- Bump Node to 26.12.1 (CVE-2026-111497) by @Yoshiofthewire in #464
- Release Dependabot changes daily as vX.Y.Z.N by @Yoshiofthewire in #465
- deps(go-imap fork): x/net 0.61, x/text 0.43, x/sys 0.49 by @Yoshiofthewire in #466
- release: v0.4.3 by @Yoshiofthewire in #467
- docs(apns): name org.kysecurity.mail as the iOS bundle ID by @Yoshiofthewire in #468
Full Changelog: v0.4.2...v0.4.3
v0.4.2
What's Changed
- ollama-bump: only move the pin forward, and actually check the PR that does it by @Yoshiofthewire in #140
- build: pin Ollama per architecture so arm64 can build at all by @Yoshiofthewire in #141
- perf: stop sending 13 MiB of message bodies to render one by @Yoshiofthewire in #142
- docs(relay): the daily budget does not guard a provider bill by @Yoshiofthewire in #143
- docs: the one-time move from a locally built install to published images by @Yoshiofthewire in #144
- fix(contacts): one name variant no longer vetoes a whole merge group by @Yoshiofthewire in #145
- feat(api): publish the newest Linux client release to paired devices by @Yoshiofthewire in #146
- perf(read): stop paying for a full mailbox refetch on every delete by @Yoshiofthewire in #147
- fix(imap): file mail into the account's real folders, not invented ones by @Yoshiofthewire in #148
- Encrypt UnifiedPush payloads (RFC 8291), and let push-MFA follow by @Yoshiofthewire in #149
- Rename the pairing button to "Pair this device" by @Yoshiofthewire in #151
- chore(deps): bump pinned Ollama to 0.33.0 by @github-actions[bot] in #150
- chore(deps): bump dompurify from 3.4.13 to 3.4.14 in /frontend in the frontend-runtime group by @dependabot[bot] in #152
- chore(deps): bump the go-modules group in /backend with 2 updates by @dependabot[bot] in #153
- chore(deps): bump the frontend-tooling group across 1 directory with 4 updates by @dependabot[bot] in #154
- chore(deps): bump docker/setup-buildx-action from 4.2.0 to 4.3.0 in the github-actions group by @dependabot[bot] in #155
- fix: 6 verified findings (agentfixer 1/4) by @Yoshiofthewire in #156
- fix: 7 audit findings, plus the SSO link revocation and step-up reworked from review by @Yoshiofthewire in #157
- docs: add the Apple column to the compatibility matrix, and correct two wrong rows by @Yoshiofthewire in #158
- security(sso): pin the SSO account-takeover chain with probe tests by @Yoshiofthewire in #159
- Update Buy Me a Coffee username in FUNDING.yml by @Yoshiofthewire in #160
- Fix formatting for Buy Me a Coffee username by @Yoshiofthewire in #161
- Updated Relay Servers to allow for movement off of Cloudflare in the … by @Yoshiofthewire in #164
- feat: preload displayed inbox bodies by @Yoshiofthewire in #166
- Allow opt-in review account pairing by @Yoshiofthewire in #167
- allow opt-in review account pairing by @Yoshiofthewire in #168
- chore(deps): bump pinned Ollama to 0.33.2 by @github-actions[bot] in #169
- chore(deps): bump react-router from 8.3.0 to 8.3.1 in /frontend in the frontend-runtime group by @dependabot[bot] in #170
- chore(deps): bump the frontend-tooling group in /frontend with 3 updates by @dependabot[bot] in #171
- feat: get-the-apps page and sidebar polish by @Yoshiofthewire in #172
- fix: use public backend module path by @Yoshiofthewire in #173
- Adopt ky-primitives for passwords, TOTP and recovery codes by @Yoshiofthewire in #175
- chore(deps): bump pinned Ollama to 0.33.3 by @github-actions[bot] in #174
- feat: add sealed backups and shared JSON logs by @Yoshiofthewire in #176
- fix: compact the backup page by @Yoshiofthewire in #177
- fix: allow backups without optional tuning file by @Yoshiofthewire in #178
- chore(deps): bump dompurify from 3.4.14 to 3.4.15 in /frontend in the frontend-runtime group by @dependabot[bot] in #179
- chore(deps): bump the frontend-tooling group in /frontend with 3 updates by @dependabot[bot] in #180
- chore(deps): bump the go-modules group in /backend with 7 updates by @dependabot[bot] in #181
- chore(deps): bump pinned Ollama to 0.34.0 by @github-actions[bot] in #182
- Admin mailbox assignment: instance defaults, per-user credentials, optional lock by @Yoshiofthewire in #183
- feat(pgp): encrypted attachments in browser-encrypted mail by @Yoshiofthewire in #184
- feat(pgp): encrypt drafts and compose snapshots for client-custody keys by @Yoshiofthewire in #185
- feat(mailcache): encrypted rows no longer make the mailbox cold by @Yoshiofthewire in #186
- feat(pgp): real sign-only mail as RFC 3156 multipart/signed by @Yoshiofthewire in #187
- feat(pgp): default signing and show unsigned mail by @Yoshiofthewire in #188
- feat: store and test PGP recovery copies by @Yoshiofthewire in #189
- docs: design PGP key lifecycle by @Yoshiofthewire in #190
- feat: read historical PGP keyrings by @Yoshiofthewire in #191
- feat: guard PGP writes by revision by @Yoshiofthewire in #192
- pgp: guard browser writes with their source revision by @Yoshiofthewire in #193
- feat: prepare atomic PGP keyring storage by @Yoshiofthewire in #194
- feat: prepare complete keyring recovery by @Yoshiofthewire in #195
- feat: preserve keyrings across password changes by @Yoshiofthewire in #196
- feat: restore matching complete keyring backups by @Yoshiofthewire in #197
- feat: store verified complete keyring recovery by @Yoshiofthewire in #198
- feat(pgp): prepare device-envelope v3 by @Yoshiofthewire in #199
- chore(deps): bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in #200
- feat(pgp): advertise device envelope support by @Yoshiofthewire in #201
- sso: back-channel logout and session identity (KySignOn D1 #1) by @Yoshiofthewire in #202
- sso: versioned directory desired state from KySignOn (D1 #2) by @Yoshiofthewire in #203
- sso: KySignOn app roles and session role ceiling (D1 #3) by @Yoshiofthewire in #204
- sso: action-bound KySignOn re-authentication for SSO sessions (D1 #4) by @Yoshiofthewire in #205
- chore(deps): bump the go-modules group in /backend with 2 updates by @dependabot[bot] in #206
- chore(deps): bump the frontend-runtime group in /frontend with 2 updates by @dependabot[bot] in #207
- chore(deps): bump vite from 8.2.2 to 8.3.0 in /frontend in the frontend-tooling group by @dependabot[bot] in #208
- sso: keep the password step-up for generic-provider SSO sessions by @Yoshiofthewire in #209
- rename: move module and image namespace to Busnes-app by @Yoshiofthewire in #211
- pgp: device-envelope v3 delivery, generation-aware acknowledgement, stale-device send gate by @Yoshiofthewire in #210
- rename: review follow-ups (attestation identity, CI coordinate check, recorded history) by @Yoshiofthewire in #213
- pgp: browser v3 device enrollment for converted accounts, stale device rows by @Yoshiofthewire in #212
- rename: state that the old GHCR namespace is untrusted by @Yoshiofthewire in #214
- chore(deps): bump pinned Ollama to 0.34.1 by @github-actions[bot] in https://github.com/Busnes-app/KyP...
v0.3.0
The first published release of KyPost-Server.
Everything before this was built from source. From this release on there is a
published image, an immutable version tag, and a documented upgrade path:
docker compose pull && docker compose up -d
or ./scripts/update-host.sh, which records the running image's digest, verifies
the new image's build attestation before switching, and restores the recorded
digest if the post-update health check fails.
The image is ghcr.io/busness-app/kypost-server:0.3.0, built and attested by
release-image.yml. :stable moves to it
only after that attestation has been published and verified.
Highlights
- The pairing QR publishes a certificate pin. Pairing is the one call that
carries the pairing token, the push endpoint and the WebPush keys together, and
it previously sent all of it inside a trust-on-first-use window. Clients that
do not understand thepinparameter are unaffected — it is optional and
additive, and its absence means the same trust-on-first-use as before. - Servers self-register with the push relay. Set
PUSH_RELAY_URLand the
server mints its own per-server key on first start and persists it. No Firebase
account, no Apple Developer account, and nothing to ask an operator for. App Pulldelivery bypasses the relay entirely, for anyone who would
rather no notification metadata left their server.
See CHANGELOG.md for the full list, and
docs/PLATFORM_BASELINE.md for what a client must
implement to work against this server.
Upgrading
Schema changes are additive and applied on open, so starting 0.3.0 against an
existing state.db adds what it needs and changes nothing else. Rolling back the
container does not roll back the data — see the upgrade table in the changelog.