Commit Graph
75 Commits
Author SHA1 Message Date
ancsemi 212d592b56 Send silent messages with @silent: no sound, pop-up or push 2026-10-16 12:19:12 -04:00
ancsemi 255e828de5 Document that only published theme files reach members 2026-10-16 10:45:38 -04:00
ancsemi e191678d9f Document the theme picker's sections, search and publish switch 2026-10-16 10:32:33 -04:00
Amnibro 04648a4b1b Ferry sends attachments addressed to Discord, in DMs and as spoilers (#5795) 2026-10-16 00:57:55 -04:00
ancsemi 36535be064 Explain adding the Ferry bot's role to private Discord channels 2026-10-15 18:24:26 -04:00
ancsemi 9ab7718935 Document the bot username and avatar_url rules 2026-10-15 00:49:01 -04:00
ancsemi 7f85ac60ea Send proxied requests to the checked address; refuse unresolved names 2026-10-15 00:40:41 -04:00
ancsemi 92d68cc127 GUIDE: Admin tab name, tunnel steps, voice on localhost 2026-10-14 22:59:04 -04:00
ancsemi 3f43f39352 Ferry uploads Haven pictures and files to Discord instead of sending their paths 2026-10-14 19:06:03 -04:00
ancsemi 7fe9fa31bb Docs and homepage: 11 languages, named in their own scripts 2026-10-12 12:14:24 -04:00
ancsemi d0099f476c Move the layout picker into Settings, Layout 2026-10-11 14:35:04 -04:00
ancsemi 1e215b8c51 Guide: merge the two Themes sections, drop heading emoji 2026-10-10 16:14:37 -04:00
ancsemi 45e3f6daea Docs: Node 22 to 26, and mention the optional voice relay 2026-10-10 16:13:59 -04:00
ancsemi fb0d6fb18d Replace em dashes in the docs and web pages 2026-10-10 16:08:55 -04:00
ancsemi 8406aef238 Fix the Channel Tabs file name and typo in the guide (#5749) 2026-10-10 16:01:17 -04:00
birdcrazy 7b911be08e Create channelTabsLayout plugin (#5749) 2026-10-10 15:42:21 -04:00
Amnibro a388655e12 feat(layout): ship Chrome Layout as standalone layout plugin (#5681)
- Package sidebar condensation into plugins/ChromeLayout.plugin.js
- Promotes channel creation, joining, and temp channels to prominent header action menu
- Docks DMs and People in footer with unread badges and sliding drawer
- Equips channel rows with voice controls (join/leave)
- Adds quick settings menu to home server icon
- Full height channel section with category group dividers
- Conforms to the Layout picker contract in docs/theme-authoring.md
- Adds test suite in test/chromeLayout.test.js and entry in GUIDE.md
2026-10-05 17:59:08 -04:00
Amnibro 50a8ea1889 Themes: Glassy Neon and seasonal themes (Christmas, Halloween, Thanksgiving) (#5730)
* Themes: Glassy Neon and seasonal themes (Christmas, Halloween, Thanksgiving)

- Add themes/glassy-neon.theme.css: Tron-inspired cyberpunk glassmorphism with perspective neon floor grid, laser glow borders, and rotating identity disc.
- Add themes/christmas.theme.css: Festive evergreen pine with twinkling string lights, falling snow, candy-cane borders, and glowing Christmas tree (@section Seasonal).
- Add themes/halloween.theme.css: Eerie gothic midnight with drifting ghostly mist, flying witch moon, carved jack-o'-lantern, blinking black cat, and dripping toxic slime borders (@section Seasonal).
- Add themes/thanksgiving.theme.css: Warm autumn harvest with tumbling fall leaves, waddling turkey watermark, harvest garland, and striped borders (@section Seasonal).
- Parse optional @section and @category metadata tags in src/themeMetadata.js.
- Organize theme pickers and admin settings so seasonal themes appear in a dedicated 'Seasonal' group.
- Support prefers-reduced-motion in all four new themes.
- Document bundled additions in GUIDE.md.

* Themes: rebuild Glassy Neon and the seasonal themes as full scenes

Restyle every surface of the four themes (server rail, sidebars, header,
topic bar, message list, composer, buttons, inputs, scrollbars, modals,
theme popup and the login page) and give each a layered, animated scene
drawn with self-contained SVG data URIs.

- Glassy Neon: Haven on the Grid. Opaque holo-glass panels with lit cyan
  and orange edge rails, circuit traces, data streams running down the
  rails, light-cycle trails along the header and composer, a perspective
  light floor that races toward the viewer, horizon ridges, a scan sweep,
  counter-rotating identity disc rings and glitch hover accents.
- Christmas: a cozy cabin looking out on a moonlit pine forest. Plaid
  walls, a fireplace with stockings and flickering flames, a decorated tree
  with twinkling lights and presents, garland and string lights on the
  header, snow caps, frosted window corners and three parallax snow layers.
- Halloween: a cartoony haunted night. Bats crossing a big moon, graveyard
  fog, a floating ghost, flickering jack-o'-lanterns, a black cat with
  glowing eyes and a swishing tail, a bubbling cauldron, cobwebs, a
  dangling spider and green goo that drips from the header and composer.
- Thanksgiving: a harvest evening. Two parallax layers of falling leaves,
  swaying maple trees, a farmstead sunset, a leaf garland, flannel and
  barn-wood panels, hay bales, corn shocks, pumpkins, and two turkeys that
  wobble, gobble and strut.

Decorations use pointer-events: none and sit behind content in negative
z-index layers, the message column keeps a dark veil so message text stays
above WCAG AA, animations only change transform and opacity, and
prefers-reduced-motion stops every animation. Pseudo-element rules raise
their specificity so the effects overlay system does not strip them.

Move the seasonal-theme check into HavenThemeCompat.isSeasonalTheme so the
theme bar, plugin loader and admin list share one implementation, and test
it.
2026-10-05 17:16:44 -04:00
ancsemi a12da8d447 Theme menu: one Layout picker for Original and every layout plugin
The Braid and Compact switches become a single picker: Original (Haven's
own layout) and every <Name>Layout.plugin.js on the server, one at a time.
A new layout plugin shows up without any change to Haven, so alternative
sidebars can ship as layouts while Original stays the default. The picker
shows the chosen layout even while it waits (Compact needs a wide window,
Braid waits for Mod Mode), and follows Braid's own shortcut and menu.
theme-authoring.md says what a plugin needs to appear there.
2026-10-04 11:38:43 -04:00
Josh Stevenson-WoodsandJosh Stevenson-Woods e84e562b53 Add manual plugin and theme updates (#5588)
* docs: propose extension release and blocklist contracts

* feat: add manual plugin and theme updates

---------

Co-authored-by: Josh Stevenson-Woods <5860234+jkswoods@users.noreply.github.com>
2026-10-03 15:35:49 -04:00
ancsemi a938fcb4db Setup wizard: Restore from a backup (#5713)
The first page of the setup wizard now offers Restore from a backup next to
Get Started. It takes a backup made with Messages ticked and brings back the
accounts, channels, messages, settings and (when included) uploaded files,
so there is no new admin to create and then import over. Data already on the
computer is kept as .pre-restore copies, a bad or partial backup is refused
before anything is touched, and the new .env names the restored admin. The
restore itself is installer/restore-backup.js, using the same extractor as a
restore from Settings.
2026-10-03 11:34:51 -04:00
ancsemi 2ee20f9ecc Guide: how to update Haven under Podman (Haven #5714)
The container runs the copy of Haven inside the image, so extracting a new
zip does nothing; pull the image and recreate the container instead.
2026-10-02 17:28:28 -04:00
Matt eb220e9189 Outgoing proxy support for servers behind a proxy (#5710)
For servers that can only reach the internet through a proxy: set
https_proxy, http_proxy and no_proxy in .env and Haven's outgoing requests
(link previews, the media proxy, bot callbacks, push notifications, update and
DDNS checks) go through it. Only http:// proxy addresses are supported, and
voice is unaffected.

With no proxy set, nothing changes. With one set, Haven warns at startup that
the proxy becomes part of its security: requests through it cannot be pinned
to the address Haven checked, so the proxy should be limited to the
destinations Haven needs. .env.example and GUIDE.md ("Outgoing Proxy") explain
it. Proxy passwords are hidden in the log, HTTPS certificates are checked
against the real target, and proxied requests time out and can be cancelled.
2026-10-02 12:25:26 -04:00
ancsemi fa4d1bb7d9 Guide: the Podman owner fix for containers started with --userns=keep-id 2026-10-02 10:43:52 -04:00
ancsemi 8b477d6754 Containers fix the owner of the database and certificate files, not just the folder, and a database Haven cannot open says why
The entrypoint handed /data to the node user only when the folder itself
belonged to someone else. Files copied in from another machine, or made by
running Haven once outside the container, could belong to another user inside
a folder that looked fine, so the database could not be opened and the
container restarted in a loop with a bare SQLITE_CANTOPEN. It now checks the
database, its WAL files, .env, the certificates and uploads too, and says so
when it cannot fix them. The server's own error names the folder and the
command that fixes it. The guide has a short Podman section (SELinux :Z,
ports below 1024, file owners).
2026-10-02 10:43:25 -04:00
ancsemi 86f79ed0b4 Ferry bridges forums: a Discord forum pairs with a Haven forum, new posts on either side become posts on the other with title, tags and author, replies cross both ways, and which topic is which post survives a restart; a forum only pairs with a forum 2026-10-02 00:20:14 -04:00
ancsemi 7936e09097 Auto-Cleanup can cap the uploads folder: past a size you set, the oldest messages with files are removed until it is back under, and their files go to deleted-attachments. Pinned, archived and exempt messages stay, and avatars, emoji and stickers are never removed (Discussion 59) 2026-09-30 17:06:15 -04:00
ancsemi db637e0da5 Bots can post into threads: the webhook API takes thread_id (a top-level message in the bot's channel), and the reply shows in the thread the same way a person's does (#5706) 2026-09-29 17:56:05 -04:00
ancsemi fdd2e5c1d5 Discord import can use the Ferry bot: one button, nothing to paste, within Discord's rules; channels the bot can't see are skipped and named, and the guide walks through it step by step 2026-09-27 01:29:29 -04:00
ancsemi 24eb3c2ea1 Discord import: the personal-token Connect tab sits behind a warning and a checkbox, and the guide only describes the bot export and Discord's own data package 2026-09-27 01:05:17 -04:00
Amnibro c9fd609362 Themes: Amni-Scient and Amni-Scient Light (#5695) 2026-09-25 21:32:51 -04:00
Bernardo Costa 60f7f76670 Haven Glyphs: an optional plugin that draws interface icons with a bundled Font Awesome font (#5673) 2026-09-16 23:50:50 -04:00
ancsemi 724f5547b7 Mention KLIPY in the GIF setup guide and the privacy table 2026-09-10 22:57:27 -04:00
ancsemi 9b4560cf08 Deleted attachments expire after a week by default, whether or not auto-cleanup is on
Files from deleted messages and channels were parked in deleted-attachments and only ever removed when auto-cleanup was enabled with a max age set, and even then only from the folder's top level, so on most servers they sat there forever. They now expire on their own clock, a week after deletion by default, with a Keep deleted files for (days) setting under Auto-Cleanup (1 to 3650, validated on the server). The move stamps the file's time so the window counts from the deletion rather than the upload, and the sweep walks sub-folders and prunes the empty ones.
2026-09-10 21:52:56 -04:00
Amnibro 4a4435afe0 Every install path uses Haven's own certificate generator (#5586)
4.5.0 taught the server to make its certificate itself, but Start Haven.bat, Install Haven.ps1 and the web installer still went looking for openssl.exe first and reported a skipped certificate as done. They now call the same generator through scripts/gen-cert.js, the certificate carries the CA and server-auth flags phones expect when you import it, and the guide and support page stop telling people to install OpenSSL. Reported by MutantRabbit767.
2026-09-08 17:23:38 -04:00
ancsemi 3190f4e291 Queue every dropped file and make the attachment cap an admin setting (#5561)
Dropping, pasting or picking several files at once used to keep the first
and drop the rest, and the queue stopped at a fixed five. Every file now
queues, in the main composer, threads and the DM PiP alike, up to a new
Max Attachments per Message setting under Uploads & Limits (1 to 50,
default 10) that counts images and other files together. A batch that
has nowhere to go, or runs past the cap, gets one toast instead of one
per file. The per-minute upload allowance follows the setting (twice it,
never under the old ten) so a full drop is not cut off part way.

Also bumps the cache busters for the modules touched today and adds the
Unreleased CHANGELOG entries for #5561, #5426 and #5574.

Requested by Sheoji.
2026-09-07 22:47:41 -04:00
ancsemi a311bbb21d Guide and changelog for the self-made certificate and newest-first forums 2026-09-07 19:50:25 -04:00
ancsemi bb195b2f6b Guide and changelog for forum cues, the Private toggle, and role mentions 2026-09-07 19:24:49 -04:00
ancsemi 0272b98f9c Changelog and guide for the merged PRs and fixes 2026-09-07 13:01:05 -04:00
ancsemi e96b8205fc Add timestamps that render in each reader's own timezone 2026-09-05 20:40:15 -04:00
ancsemi 39566120b7 Give forum channels an icon that is not the organize button
The sidebar was using the same clipboard icon for forum channels and for the organize buttons next to the Channels and DMs headers.
2026-09-03 00:38:20 -04:00
ancsemi 4614e8da1b Add forum channels (#144)
A forum is a regular channel where every top-level message is a topic.
Replies go in the message's thread, the topic shows its reply count, and a
reply bumps the topic to the newest end of the channel, so old topics
resurface instead of sinking. Toggle it in Channel Functions or tick Forum
when creating a channel.

The history query orders topics by their latest activity, with cursors
resolved to activity stamps so paging keeps working, and topics never
compact into each other so a bump can move the node in place. Covered by an
integration test that boots a scratch server.
2026-09-03 00:33:30 -04:00
Bernardo Costa 14116a4540 Add the Compact Layout plugin and shared layout ownership for structural plugins (#5552)
* Add reversible Compact Layout plugin

* Keep structural layouts stable through Mod Mode
2026-09-02 23:30:35 -04:00
b3cd0b4f0b GIF search: GIPHY is the supported provider again, not Tenor (#5546)
5472 preferred Tenor because GIPHY looked dead. That was backwards: GIPHY still works, and Tenor is no longer offered for new setup. Existing Tenor keys still serve if no GIPHY key is set.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: ancsemi <ancsemi@gmail.com>
2026-09-01 21:59:49 -04:00
Bernardo Costa dce7bd322e Add Compact Theme API v1 theme (#5549) 2026-09-01 19:28:11 -04:00
Bernardo Costa c68674f789 Add theme compatibility and recovery safeguards (#5545) 2026-09-01 00:59:54 -04:00
ancsemi 98a417428b Point the TURN troubleshooting section at the built-in test first 2026-09-01 00:41:24 -04:00
Bernardo Costa 026947a125 Add stable Theme API v1 contract (#5544) 2026-08-30 13:59:16 -04:00
Bernardo Costa 857a49735e Add webhook bulk message deletion (#5541)
* Add webhook bulk message deletion

* Fix bulk attachment retention scoping
2026-08-30 13:55:01 -04:00
ancsemi a33779a073 Point at eturnal as a TURN alternative, and name the setting people miss
The NAT section assumed coturn, and the recurring report is that coturn behind
a home router is where people give up. Several running Haven at home have
landed on eturnal instead and got it working, so the guide should say it is an
option rather than reading as though coturn is the only one.

The useful part is that the mistake is identical in both: eturnal's
relay_ipv4_addr is coturn's external-ip, its autodetection does not find the
public address behind NAT either, and everything else on the page carries over
unchanged. Haven only ever sees the TURN_URL, so it does not care which is
running. (#5542)
2026-08-29 23:50:22 -04:00