Skip to content

Commit 83fbfb5

Browse files
committed
feat: add threads, toolbar customization, and SSO/auth flow improvements
1 parent 47454da commit 83fbfb5

20 files changed

Lines changed: 2244 additions & 149 deletions

CHANGELOG.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,26 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). Haven uses [Sema
1111
1212
---
1313

14+
## [3.5.0] — 2026-04-20
15+
16+
### Added
17+
- **Threaded replies panel** — message threads now open in a dedicated right-side panel with parent context, inline reply flow, and live updates.
18+
- **Thread previews in channel chat** — parent messages now show thread activity summaries with reply count, recent participants, and last activity timestamp.
19+
- **Thread panel PiP mode and resize handle** — thread conversations can be popped out into a floating panel and resized for multitasking.
20+
- **Toolbar icon and layout customization** — settings now include monochrome vs emoji toolbar styles, visible action slot count, and per-action order controls.
21+
22+
### Fixed
23+
- **SSO approval reliability and feedback** — improved SSO consent/auth flow with clearer status messages, timeout handling, profile return via `postMessage`, and stronger fallback behavior.
24+
- **Vanity invite continuity through auth redirects**`invite` query params now persist through login/register flows and redirect correctly into `/app`.
25+
- **Thread-aware message queries** — primary channel history now excludes thread replies to prevent duplicate rendering and keep main timelines clean.
26+
- **Cache-busting version query injection** — static asset version query strings are now auto-injected more reliably to reduce stale client bundles after updates.
27+
28+
### Changed
29+
- **SSO response metadata** — SSO auth responses now include display name data and stricter CORS/origin handling for cross-origin auth handoff.
30+
- **Database schema for threads** — added `messages.thread_id` migration and index to support efficient threaded message fetches.
31+
32+
---
33+
1434
## [3.4.0] — 2026-04-19
1535

1636
### Added

docs/index.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,12 +1415,12 @@ <h2>Download Haven</h2>
14151415
</div>
14161416

14171417
<div class="download-card fade-in">
1418-
<h2>&#x2B21; Haven Server &mdash; v3.4.0</h2>
1418+
<h2>&#x2B21; Haven Server &mdash; v3.5.0</h2>
14191419
<p class="download-version">Latest stable release &middot; Windows, macOS &amp; Linux &middot; ~5 MB</p>
14201420

14211421
<div class="download-btn-group">
1422-
<a href="https://github.com/ancsemi/Haven/archive/refs/tags/v3.4.0.zip" class="btn btn-primary download-main">
1423-
<span class="icon">&#x2B07;</span> Download v3.4.0 (.zip)
1422+
<a href="https://github.com/ancsemi/Haven/archive/refs/tags/v3.5.0.zip" class="btn btn-primary download-main">
1423+
<span class="icon">&#x2B07;</span> Download v3.5.0 (.zip)
14241424
</a>
14251425
<div class="download-alt-links">
14261426
<a href="https://github.com/ancsemi/Haven" target="_blank">&#9965; View on GitHub</a>
@@ -1437,7 +1437,11 @@ <h2>&#x2B21; Haven Server &mdash; v3.4.0</h2>
14371437
<div class="version-list">
14381438
<div class="version-list-inner">
14391439
<div class="version-item">
1440-
<div><span class="v-name">v3.4.0</span><span class="v-tag latest">Latest</span></div>
1440+
<div><span class="v-name">v3.5.0</span><span class="v-tag latest">Latest</span></div>
1441+
<a href="https://github.com/ancsemi/Haven/archive/refs/tags/v3.5.0.zip">Download &rarr;</a>
1442+
</div>
1443+
<div class="version-item">
1444+
<div><span class="v-name">v3.4.0</span> &mdash; Quote/edit UX, bot API upgrades, SSO quality fixes</div>
14411445
<a href="https://github.com/ancsemi/Haven/archive/refs/tags/v3.4.0.zip">Download &rarr;</a>
14421446
</div>
14431447
<div class="version-item">

donor-order.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@
99
],
1010
"donors": [
1111
"Andrew Schott",
12-
"Taylan",
1312
"birdycrazy",
13+
"Taylan",
1414
"(,,•ᴗ•,,)",
1515
"Morgan",
1616
"deNully",
17-
"wreckedcarzz",
18-
"khyrna",
1917
"HoppyGamers",
18+
"khyrna",
19+
"wreckedcarzz",
2020
"c0urier",
21-
"JollyOrc",
2221
"Ezmana",
2322
"john doe",
23+
"JollyOrc",
24+
"lataxd9",
2425
"ohmygdala",
2526
"Orange Lantern",
26-
"lataxd9",
2727
"MutantRabbbit767",
28-
"haruna",
2928
"CloneBtw",
29+
"haruna",
3030
"ArtyDaSmarty",
3131
"6yBbBc"
3232
]

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "haven",
3-
"version": "3.4.0",
3+
"version": "3.5.0",
44
"description": "Haven — self-hosted private chat for your server, your rules",
55
"license": "AGPL-3.0",
66
"main": "server.js",

public/app.html

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,37 @@ <h3 data-i18n="modals.move_messages.title">Move Messages</h3>
711711
</div>
712712
</div>
713713

714+
<!-- Thread Panel (slides in from right) -->
715+
<div id="thread-panel" class="thread-panel" style="display:none">
716+
<div class="thread-panel-resizer" id="thread-panel-resizer" aria-hidden="true"></div>
717+
<div class="thread-panel-header">
718+
<div class="thread-panel-header-top">
719+
<span class="thread-panel-icon">🧵</span>
720+
<span id="thread-panel-title" class="thread-panel-title">Thread</span>
721+
<button id="thread-panel-pip" class="icon-btn small" title="Pop out thread (PiP)" aria-pressed="false"></button>
722+
<button id="thread-panel-close" class="icon-btn small">&times;</button>
723+
</div>
724+
<div class="thread-parent-meta" id="thread-parent-meta">
725+
<div class="thread-parent-avatar-wrap" id="thread-parent-avatar-wrap"></div>
726+
<span class="thread-parent-name" id="thread-parent-name">Thread starter</span>
727+
</div>
728+
<div class="thread-parent-preview" id="thread-parent-preview"></div>
729+
</div>
730+
<div class="thread-messages" id="thread-messages"></div>
731+
<div class="thread-reply-bar" id="thread-reply-bar" style="display:none">
732+
<span id="thread-reply-preview-text"></span>
733+
<button id="thread-reply-close-btn" class="icon-btn small" aria-label="Cancel thread reply">&times;</button>
734+
</div>
735+
<div class="thread-input-area">
736+
<textarea id="thread-input" class="thread-input" placeholder="Reply in thread..." rows="1"></textarea>
737+
<button id="thread-send-btn" class="thread-send-btn">
738+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5">
739+
<path d="M22 2L11 13"/><path d="M22 2L15 22L11 13L2 9L22 2Z"/>
740+
</svg>
741+
</button>
742+
</div>
743+
</div>
744+
714745
<!-- First-Time Setup Wizard (Admin only) -->
715746
<div class="modal-overlay" id="setup-wizard-modal" style="display:none">
716747
<div class="modal modal-wizard">
@@ -1106,6 +1137,41 @@ <h5 class="settings-section-title">🎨 Role Display</h5>
11061137
<small class="settings-hint" style="margin-top:4px;display:block">How role colors are shown next to usernames in chat and the member list.</small>
11071138
</div>
11081139

1140+
<!-- Toolbar Icon Style -->
1141+
<div class="settings-section" id="section-toolbar-icons" style="border-top: 1px solid var(--border-light); padding-top: 16px; margin-top: 8px;">
1142+
<h5 class="settings-section-title">🎛️ Toolbar Icons</h5>
1143+
<div class="density-picker" id="toolbar-icon-picker">
1144+
<button type="button" class="density-btn active" data-toolbaricons="mono" title="Use sleek monochrome icons in message toolbars">
1145+
<span class="density-icon" aria-hidden="true">
1146+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8">
1147+
<circle cx="12" cy="12" r="9"></circle>
1148+
<path d="M8.5 14.5c1 1.2 2.2 1.8 3.5 1.8s2.5-.6 3.5-1.8" stroke-linecap="round"></path>
1149+
<circle cx="9.2" cy="10.2" r="1" fill="currentColor" stroke="none"></circle>
1150+
<circle cx="14.8" cy="10.2" r="1" fill="currentColor" stroke="none"></circle>
1151+
</svg>
1152+
</span>
1153+
<span class="density-label">Monochrome</span>
1154+
</button>
1155+
<button type="button" class="density-btn" data-toolbaricons="emoji" title="Use colorful emoji icons in message toolbars">
1156+
<span class="density-icon">😀</span>
1157+
<span class="density-label">Colorful Emoji</span>
1158+
</button>
1159+
</div>
1160+
<label class="toolbar-slots-row" for="toolbar-visible-slots">
1161+
<span>Visible toolbar slots before overflow</span>
1162+
<input type="range" id="toolbar-visible-slots" min="1" max="7" step="1" value="3">
1163+
<span id="toolbar-visible-slots-value" class="toolbar-slots-value">3</span>
1164+
</label>
1165+
<div class="toolbar-order-wrap">
1166+
<div class="toolbar-order-head">
1167+
<span>Toolbar slot order</span>
1168+
<button type="button" class="btn-sm" id="toolbar-order-reset-btn">Reset</button>
1169+
</div>
1170+
<div id="toolbar-order-list" class="toolbar-order-list"></div>
1171+
</div>
1172+
<small class="settings-hint" style="margin-top:4px;display:block">Applies to message and thread hover action bars.</small>
1173+
</div>
1174+
11091175
<!-- Image Display Mode -->
11101176
<div class="settings-section" id="section-density" style="border-top: 1px solid var(--border-light); padding-top: 16px; margin-top: 8px;">
11111177
<h5 class="settings-section-title">🖼️ <span data-i18n="settings.image_display.title">Image Display</span></h5>

0 commit comments

Comments
 (0)