Survey of self-host OSS for agency↔client secret-data exchange on boas.dev infrastructure. Three product layers covered. Both E2E and SSE trust tiers. Reuse hostinger-vps + R2 where viable. No SOC 2 / ISO 27001 cert gate.
Client-held-key encrypted libraries for high-sensitivity persistent storage. R2 broken — use local FS + nightly encrypted R2 backup.
C1 · Vault (SSE + collab)
Nextcloud Hub + ONLYOFFICE
AGPL-3.0
SSE
Server-side encryption with collab editing. Nextcloud-native E2EE rejected (mnemonic-loss = data-loss, no browser collab on E2EE).
C2 · SSO/Auth
Authentik
MIT
—
First-class connectors for Vaultwarden + Nextcloud. Forward-auth proxy for legacy (covers Seafile CE SAML-Pro gap via LDAP outpost). Invitation wizard + magic-link.
Combined Architecture
Auth glue · single OIDC realmAuthentik · id.boas.dev
↓ OIDC tokens · forward-auth for legacy
vault.boas.devPsonoCredentials, API keys. Link-share to non-account clients.
Non-account clients enter per-tool (magic links, share links). Account clients flow through Authentik invitation wizard once → SSO across all five services. Per-client tenancy via Authentik groups (operator decides single-Authentik-with-groups vs one-per-client at sequencing).
Cross-Cutting Findings
License — AGPL exposure
3-of-5 cores (Lufi, Seafile, Nextcloud) AGPL-3.0. Fine for agency self-host serving clients. Forecloses future SaaS productization. Forward-flag.
Seafile + R2 = broken
Date-header parse failures, open 2023–2024 GH issues, no fix. Workaround: local FS + nightly encrypted R2 backup. Cross-route flag for atlas if Seafile adopted.
Bus-factor watch
Lufi single-maintainer. YOPass small team (strong 2026-05-28 release signal). Padloc, YeetFile, timvisee/send all rejected for stagnation.
Audit-log gaps to validate
Psono granularity (per-secret-view detail unverified). YOPass NDJSON licence-key gating ambiguous. Both need Layer-2 confirmation before client-evidence promises.
Hosting footprint
~3.5–4 GB steady, ~5 CPU cores under load. Co-locates on existing hostinger-vps with plutus. Exception: credentials likely deserve isolated VPS (~€4-7/mo Hetzner CX22) for blast-radius separation.
Non-account-client UX (load-bearing)
All 5 picks satisfy bidirectional + non-account-client natively. Psono Link Share, Lufi anonymous, YOPass expiring, Nextcloud public-link, Authentik magic-link.
AV on ciphertext = useless
ClamAV server-side can't see inside E2E payloads. Any malware-scan strategy must run post-decrypt at agency endpoint. Cross-route candidate for Hades or defer.
R2 reuse posture
Lufi · YOPass · Nextcloud — R2-compatible, confirmed. Seafile broken (see above). No net-new storage spend for v1.
Sequencing (if adopt-arc elected)
1AuthentikFoundation. All other layers consume it.
5SeafileDefer until persistent client-held-key demand materializes.
Each step independently abortable. Not Pantheon-ceremony — research-arc brief, not adoption-execution arc.
Open Questions for Operator
Hosting layout — colocate full stack on hostinger-vps with plutus, or break out credentials (Psono) to separate small VPS for blast-radius isolation?
YOPass audit-log gating — confirm whether NDJSON audit-log is OSS-free or license-key-gated (vendor docs ambiguous). Affects GDPR-record posture.
R2 custody for ciphertext KYC — comfortable holding E2E ciphertext on Cloudflare R2, or pin all KYC ciphertext to Hetzner/Advania EU disk?
Single vault vs two-tier — pick Nextcloud SSE-only (accept E2E gap) vs recommended Seafile+Nextcloud split?
Cryptomator Hub overlay — adopt as separate encryption-overlay product, or skip for simplicity?
Per-client tenancy in Authentik — single Authentik with per-client groups (ops simplicity) vs one-Authentik-per-client (stronger isolation)?
Client-side IdP federation — accept federation to client's Google Workspace / Microsoft Entra (lower friction) vs require fresh Authentik account per client (cleaner audit)?
DocuSeal handoff for client-intake — front the intake door with DocuSeal (already adopted) + webhook into Psono/Lufi, or run parallel intake UX?
Endpoint AV strategy — pursue post-decrypt ClamAV at agency endpoint now, or defer until incident motivates?