Commit graph

124 commits

Author SHA1 Message Date
4bcca176f0 feat(payments): automate Monero invoices via wallet-rpc
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 19m10s
Add standalone invoice create/poll flow with unique subaddresses, a public
/pay/monero page, Oban poller, and optional Docker wallet-rpc sidecar. No
product unlock hooks—payments only.
2026-08-09 21:29:01 -04:00
30ef2a52e8 fix(http): route ExAws and remaining clients through Gun
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 19m16s
S3/Magpie crashed in production because ExAws still called hackney after
it was dropped from the release. Point ExAws at Elektrine.HTTP (Gun), and
move NetBird plus the DNS tunnel agent off :httpc so outbound HTTP is one
stack.
2026-08-09 04:59:34 -04:00
27803e7a90 fix(kairo): save uploads when browser MIME is blank or generic
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 15m22s
Infer content type from the filename when the client sends an empty type
or application/octet-stream. Stop canceling transfers when the file
picker closes via click-away, and surface real save errors in the flash.
2026-08-09 04:32:39 -04:00
ae28076bb3 fix(web): serve private attachments for image Accept headers
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 17m13s
Browser img tags send Accept: image/* which the browser_api pipeline
rejected with 406. Route media through a dedicated session pipeline and
block public /uploads/kairo-sources/ static access.
2026-08-09 02:17:10 -04:00
167c699195 fix(kairo): stop Links panel horizontal overflow on long titles
Long mono filenames expanded min-content width past the sidebar track.
Contain the workspace width chain and truncate or wrap wikilink text.
2026-08-09 02:17:10 -04:00
8605616d10 fix(admin): stop elevation 500s from raw passkey ids in audit logs
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 16m48s
finish_elevation logged a String.slice of the binary credential id into
JSONB, which raised Jason.EncodeError and returned 500 after a valid
passkey. Base64url-encode the prefix, JSON-sanitize audit details, and
never fail elevation if the audit row cannot be written.
2026-08-09 01:49:26 -04:00
f2d964eb6b fix(http): load TLS CA roots from OTP public_key
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
Moving hackney (and its certifi dep) out of the prod release left
GunPool calling missing :certifi.cacerts/0, which crash-looped the app
and caused edge 502s. Use :public_key.cacerts_get/0 like the rest of
the TLS client stack.
2026-08-09 01:38:40 -04:00
f14db3a229 fix(security): close audit findings across DNS, auth, mail, and deploy
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 22m59s
Prove DNS zone ownership with per-zone TXT tokens and reserved operator
domains, harden auth/mail/VPN/edge paths against the remaining audit
findings, and tighten deploy/config hygiene so self-host defaults and CI
cannot reintroduce the same failure modes.
2026-08-09 01:09:14 -04:00
1bd9defee6 feat(kairo): file links, embeds, and always-on file rename
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 17m2s
Open an upload dialog so project/tags can be set before save. Support file
wikilinks and ![[embeds]], copy [[title]], flexible title matching, and
autosave title/project/tags when selecting images and PDFs.
2026-08-08 19:30:29 -04:00
025ced5129 feat(dns): BIND-style zone file editor
Export, parse, preview, and apply zone text with managed-record protection.
Add a Zone file tab and lower the DNS raw-btn design budget after kit cleanup.
2026-08-08 19:30:29 -04:00
e245962b2e style(ui): round markdown editor and calm status badges
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 25m2s
Use a single rounded editor shell in mail and notes, keep badges from
stacking vertically, restyle uptime to match other product cards, and
pin mbox MIME extension preference.
2026-08-08 16:58:31 -04:00
44e6f0037c feat(drive): auto-finish drag-and-drop uploads
Consume OS file drops when transfer completes, keep internal folder moves
working, and highlight active drop targets.
2026-08-08 16:58:31 -04:00
d99981dbaa feat(kairo): workspace UX with links, search, and capture flow
Ship an Obsidian-style shell with wikilinks, backlinks, server search,
inbox triage, keyboard palette, mobile stack, file reader for media,
hashtag-style tags, and drag-and-drop source uploads.
2026-08-08 16:58:31 -04:00
3434b7b898 fix(email): use accept :any for import uploads
MIME extension validation crashes when mime is not recompiled with
mbox/vcard. Accept any file at the LiveView layer and validate
extensions in the import handlers instead.
2026-08-08 16:02:34 -04:00
5425e4b4f8 fix(email): register mbox and vcard MIME types for uploads
LiveView allow_upload requires known MIME extensions; mbox and vcard
were missing from the mime config, which crashed /email/settings.
2026-08-08 15:59:45 -04:00
f0aa1d56a2 feat: import data for email and nerve
Add mail import (mbox/eml/zip), contact vCard import, and Nerve
encrypted backup plus client-side CSV import. Wire settings and
Nerve UI, API export/import endpoints, and tests.
2026-08-08 15:54:23 -04:00
fc9680ccf3 feat(address): unify user@domain across chat, mail, and social
Add Address.resolve/open so one handle fans out to DM, mail compose,
and profile (local or WebFinger). Ship authenticated API endpoints,
/address LiveView contact card, nav entry, and tests.
2026-08-08 15:26:46 -04:00
5f199c7053 feat(platform): complete runtime role matrix and plane isolation
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 16m37s
Add first-class dns/web roles, Oban queue filtering by role, optional
read replica (Repo.Reader), Auth route module, optional edge compose
service, slim elektrine_edge release, and architecture docs for the
control/data-plane target. Deploy already phases app vs edge; dns
containers now use ROLE=dns.
2026-08-08 05:12:58 -04:00
15b45d4833 fix(deploy): roll app services without bouncing DNS or Caddy
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
Default force-recreate only updates app/worker/mail/vpn. Edge services
(dns, turn, caddy) stay running so public :53/:443 keep answering; Caddy
config changes reload in place. Use --force-infra when edge containers
must be recreated. Admin VPN dashboard totals now use account quotas.
Also polish the 2FA challenge UI.
2026-08-08 05:06:36 -04:00
8732b585a8 docs(legal): plain signup and account policy wording
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 1m11s
Describe registration and payments as they work. Drop guarantee-style
lines from legal pages and the register form.
2026-08-08 02:52:36 -04:00
e41770b6ba refactor: drop dead fallback clauses and unreachable error arms
Removes catch-all private function clauses and error branches that the
call sites can no longer produce, and switches the remaining callers to
plain matches so a real regression fails loudly instead of being
swallowed by a generic 500/422 arm.
2026-08-07 05:54:50 -04:00
6e7c57f63b fix(ui): drop stable scrollbar gutter in timeline sidebars
The stable gutter reserved a permanent ~15px strip on the right of the
sidebar even when no scrollbar was shown. Use a thin overlay scrollbar
instead, matching .app-sticky-sidebar-scroll.
2026-08-07 05:54:36 -04:00
968775003a docs: plain technical English and ASCII hyphens
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 21m43s
Ops and product docs use short plain technical English.
Docs, comments, and scripts use ASCII hyphens.
2026-08-07 03:03:07 -04:00
01217824bb feat(privacy): harden logs, admin access, federation, and backups
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 25m2s
Redact admin bodies, limit moderation to open reports, reject inbound
ActivityPub DMs, federate admin deletes, shorten media cache, Tor-null
and retain audit logs, scrub JSON logs, and add backup/Haraka ops scripts.
2026-08-05 15:42:15 -04:00
2198031b95 fix(ui): stop image modal over-zooming photos
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 17m3s
Cap lightbox media with viewport units only; content-sized % max-height
was invalidating constraints so images painted full-size and got clipped.
2026-08-04 15:38:45 -04:00
43dd32c607 fix(lite): ship lite.css in asset build and release
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 23m38s
priv/static/assets is gitignored, so the hand-written stylesheet never
entered production releases and /assets/lite.css returned HTML (MIME error).
2026-08-04 15:13:17 -04:00
3ab7c69b56 refactor: remove Stripe billing subscriptions
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 18m29s
Drop product subscriptions, paid registration checkout, admin products
UI, subscribe LiveView, webhooks, and stripity_stripe. Registration
with invites stays invite-only; social/RSS/push/IMAP subscribe paths
are unchanged. Add a migration to drop the billing tables.
2026-08-04 06:34:49 -04:00
4708fde5a3 feat(privacy): expire stored IPs and harden Tor/lite surfaces
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 22m12s
Null client IPs after a 14-day window, skip network metadata on Tor and
invite/payment signup, wipe privacy data on account delete, add lite 2FA
and captcha credit claims, and fix Gun plain-HTTP protocol selection so
Haraka DKIM sync no longer crashes on connecting.
2026-08-04 04:47:54 -04:00
b5a5b29fb0 feat(lite): expand no-JS auth surface and fix Nerve session persistence
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 17m34s
Add lite login/register with embedded captcha, account settings, prefer
lite/full cookies, and hardened captcha flows. Persist the Nerve
extension API token in local storage so browser restarts do not drop
auth, and save website entries via LiveView pushEvent.
2026-08-04 03:56:31 -04:00
0fd86bab7e fix(admin): make NetBird sync and passkey elevation actually apply
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 17m12s
Sync from API used a method=post link that built its form only on click, so
action-grant re-sign never attached and the POST bounced to elevate without
updating last allowlist apply. Use a real form, intercept dynamic admin POSTs,
omit empty WebAuthn transports that block the passkey prompt, and surface
elevation/sync errors instead of failing silently.
2026-08-03 05:16:21 -04:00
c7c5c3614d refactor(lite): drop no-JS challenge and credit earning
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 15m47s
Lite cannot do real browser PoW without JS, and server mining was a bad
trade. Remove /lite/challenge entirely. External mail still spends
Identity Credits earned on the full site.
2026-08-03 03:36:40 -04:00
29637c1541 refactor(lite): simplify challenge complete control flow
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
2026-08-03 03:22:21 -04:00
c26fd017dc refactor(lite): replace server PoW mining with wait-token challenge
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
Drop CPU-heavy no-JS mining. Lite credits and gate clearance use a
signed 45s wait token instead, so visitors spend time not your cores.
2026-08-03 03:22:08 -04:00
f654e922ed feat(lite): no-JS Atomine proof-of-work for email credits and gate
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
Add chunked server-side PoW under /lite/pow so Tor/JS-disabled clients
can earn Identity Credits for external mail and clear the site gate via
noscript fallback without browser mining.
2026-08-03 03:18:02 -04:00
4892889088 feat(email): add no-JS mail to lite privacy surface
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 16m12s
Inbox/folders, message view, reply, plain-text compose, and trash via
classic HTML forms under /lite/email for Tor and JS-disabled clients.
2026-08-03 02:59:15 -04:00
5b94dd5ac8 feat(web): add no-JS lite privacy surface for Tor and clearnet
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
Ship /lite as HTML+CSS only (no app.js/LiveView). Onion hosts default
/ and /login there. Includes public feed, post, cached remote actor,
and classic password login for privacy-minded clients.
2026-08-03 02:50:28 -04:00
5c6ad0b074 fix(ui): full-width main for remote community and post pages
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 15m35s
Remote actor/community/post templates already use social-page-wrap for
max-w-7xl padding. Without the layout full-width flag, the app shell
added a second pad and looked narrower than timeline.
2026-08-03 02:20:30 -04:00
42647bbd1c fix(social): stop remote community sort crashing on Message structs
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 14m40s
Hot/top sort used map Access (post["likes"]) on local Message rows,
which do not implement Access and 500 remote community pages.
2026-08-03 02:02:31 -04:00
fe18b43bcb fix(vpn): stop app HealthMonitor draining self-host servers
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 15m33s
Self-host heartbeats only reach the VPN role. The app role was seeding
those servers and marking them offline after the timeout, so the profile
UI showed zero available servers.
2026-08-03 01:28:33 -04:00
79650306c1 fix(vpn): stop defaulting client DNS to Cloudflare
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 16m21s
Prefer Elektrine DNS when configured. Last-resort resolvers use Quad9.
2026-08-02 23:29:54 -04:00
1a7be85be9 fix(deploy): give BEAM entrypoint caps and Caddy access to Bluesky
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 1m19s
Restore CHOWN/SETUID/SETGID/etc. after cap_drop ALL so containers boot.
Attach bluesky_pds to the proxy network so Caddy can resolve it.
2026-08-02 23:25:30 -04:00
d6626a0566 docs(security): note required BEAM entrypoint capabilities
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 1m16s
2026-08-02 23:21:05 -04:00
bd766e50c8 fix(deploy): restore entrypoint caps on BEAM containers
Some checks are pending
Deploy Docker Images / Build, push, and deploy (push) Waiting to run
cap_drop ALL without CHOWN/SETUID/SETGID broke docker-entrypoint
(chown /data, su to nobody, upload symlink), crash-looping app and DNS.
2026-08-02 23:20:58 -04:00
da169a3869 feat(privacy): harden session logs, admin access, and docker isolation
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Failing after 23m0s
Disable durable VPN session logs and never store client IPs. Drop admin
body decrypt and impersonation. Default mail privacy (no raw copy, no
inbound MTA IP, trash/spam retention). Tighten compose caps and split
edge/db networks; gate Tor/VPN packages by release modules. Update legal
copy and operator hardening docs.
2026-08-02 22:55:08 -04:00
663f0d0676 chore(vpn): remove unused pre-device lookup and recommended? helper
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 17m2s
Neither had remaining call sites after the device-scoped config path and
ranked server list landed.
2026-08-02 18:56:03 -04:00
48a7e87373 feat(vpn): scalable control plane — grants, scoring, paths, guests
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 21m26s
Add account-scale foundations: fleet load/capacity scoring and best-exit
ranking, signed short-lived peer grants with admit API, full/active/lazy
peer sync modes plus idle GC, policy packs/split tunnel hooks, stealth and
multi-hop path composition, guest share links, trust-tier premium/burst
quota, community node fields, agent heartbeat metrics, and docs.
2026-08-02 15:49:59 -04:00
daa47139d0 fix(vpn): enforce account-level bandwidth quota across devices
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Has been cancelled
Quota lived on each peer config, so adding a device (or revoking and
re-adding) reset usage. Track usage on vpn_account_quotas instead, suspend
all profiles when the account is over limit, and keep the ledger through
device revoke/recreate.
2026-08-02 15:34:20 -04:00
c382edf5d0 fix(deploy): seed NetBird Caddy snippet as a file before bind-mount
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 1m13s
Docker creates a directory when a missing file path is bind-mounted; ensure
the allowlist snippet exists (and is not a leftover directory) before compose up.
2026-08-02 15:23:49 -04:00
72977975ae fix(netbird): reload Caddy allowlist in place instead of recreating
Some checks failed
Deploy Docker Images / Build, push, and deploy (push) Failing after 1m18s
Peer CIDRs are written to a host-mounted Caddy snippet and applied with
caddy reload plus Phoenix rpc, so hourly NetBird sync no longer force-recreates
the edge container or restarts the app.
2026-08-02 15:20:29 -04:00
6c182b0879 fix(deploy): always clear caddy name before force-recreate
All checks were successful
Deploy Docker Images / Build, push, and deploy (push) Successful in 1m11s
Compose still planned "Creating" for elektrine_caddy_edge after NetBird
rewrites, which aborted the batch even when labels looked correct. Remove
the fixed-name container before force-recreate, retry missing services,
and include vpn in critical recovery.
2026-08-02 15:09:06 -04:00