Mention/notify users #474

Closed
opened 2026-02-04 20:19:14 +03:00 by OVERLORD · 31 comments
Owner

Originally created by @Awinad on GitHub (Oct 15, 2017).

For Feature Requests

Desired Feature:
Mention users by using "@". e.g. @username
Similar to how it is done here in github.
Allow to use it on pages and in comments.
Notify mentioned user by email.

Originally created by @Awinad on GitHub (Oct 15, 2017). ### For Feature Requests Desired Feature: Mention users by using "@". e.g. @username Similar to how it is done here in github. Allow to use it on pages and in comments. Notify mentioned user by email.
OVERLORD added the 🔨 Feature Request label 2026-02-04 20:19:14 +03:00
Author
Owner

@galaxyfeeder commented on GitHub (Nov 8, 2017):

+1

@galaxyfeeder commented on GitHub (Nov 8, 2017): +1
Author
Owner

@genxlee commented on GitHub (Nov 9, 2017):

+1

@genxlee commented on GitHub (Nov 9, 2017): +1
Author
Owner

@marcusforsberg commented on GitHub (Jan 27, 2018):

+1

@marcusforsberg commented on GitHub (Jan 27, 2018): +1
Author
Owner

@aljawaid commented on GitHub (Jan 27, 2018):

+1

@aljawaid commented on GitHub (Jan 27, 2018): +1
Author
Owner

@berez23 commented on GitHub (May 8, 2018):

+1

@berez23 commented on GitHub (May 8, 2018): +1
Author
Owner

@lpupillo commented on GitHub (May 8, 2018):

+1

@lpupillo commented on GitHub (May 8, 2018): +1
Author
Owner

@abossert commented on GitHub (Feb 20, 2019):

Has there been any movement or decision on this? I would very much like to see this feature.

@abossert commented on GitHub (Feb 20, 2019): Has there been any movement or decision on this? I would very much like to see this feature.
Author
Owner

@ssddanbrown commented on GitHub (Feb 20, 2019):

@abossert Not as of yet.

If people could use the thumbs-up emoji on the original post instead of the +1 comments it would give the maintainers a much better idea of support for an issue like this.

@ssddanbrown commented on GitHub (Feb 20, 2019): @abossert Not as of yet. If people could use the thumbs-up emoji on the original post instead of the `+1` comments it would give the maintainers a much better idea of support for an issue like this.
Author
Owner

@omran987 commented on GitHub (Sep 18, 2019):

+1

@omran987 commented on GitHub (Sep 18, 2019): +1
Author
Owner

@sahilbhagat09 commented on GitHub (Dec 4, 2021):

Hi, has there been any update on this feature @ssddanbrown?

@sahilbhagat09 commented on GitHub (Dec 4, 2021): Hi, has there been any update on this feature @ssddanbrown?
Author
Owner

@YuntiDevOps commented on GitHub (Apr 17, 2022):

+1

@YuntiDevOps commented on GitHub (Apr 17, 2022): +1
Author
Owner

@acrafts0 commented on GitHub (Sep 13, 2022):

Just 👍 'd it as well. This may be a blocker for my group, otherwise really enjoy the workflows so far. Pitting this versus Confluence and this is a major feature difference (IMO).

@acrafts0 commented on GitHub (Sep 13, 2022): Just :+1: 'd it as well. This may be a blocker for my group, otherwise really enjoy the workflows so far. Pitting this versus Confluence and this is a major feature difference (IMO).
Author
Owner

@FalconWorks commented on GitHub (Oct 10, 2022):

Also interested if this will get featured or not

@FalconWorks commented on GitHub (Oct 10, 2022): Also interested if this will get featured or not
Author
Owner

@mschoon85 commented on GitHub (Oct 21, 2022):

@ssddanbrown Any idea if this feature will be build into bookstack? The owner and/or the creator of a page would like to receive e-mail notifications whenever a comment is posted. I think I would be referring to #1812

@mschoon85 commented on GitHub (Oct 21, 2022): @ssddanbrown Any idea if this feature will be build into bookstack? The owner and/or the creator of a page would like to receive e-mail notifications whenever a comment is posted. I think I would be referring to #1812
Author
Owner

@BloodyIron commented on GitHub (Nov 10, 2022):

This feature has been requested for implementation in my company, so adding that to the discussion. Can we have this added please? :)

@BloodyIron commented on GitHub (Nov 10, 2022): This feature has been requested for implementation in my company, so adding that to the discussion. Can we have this added please? :)
Author
Owner

@akahan989 commented on GitHub (Mar 13, 2023):

+1

@akahan989 commented on GitHub (Mar 13, 2023): +1
Author
Owner

@nothing-fr commented on GitHub (Mar 29, 2023):

For the moment I use the webhook system to notify users of a new comment, I use n8n for the processing workflow.

It's ok for a basic use, but I'm missing some information in the json about the comments, like if it's a reply to another user a key/value "replied_to: user_id" would be welcome.
Because in this case, it's always the creator of the page who will receive the notification and not the person to whom the answer is intended.

It would be very welcome to have an internal notification system in bookstack.

@nothing-fr commented on GitHub (Mar 29, 2023): For the moment I use the webhook system to notify users of a new comment, I use n8n for the processing workflow. It's ok for a basic use, but I'm missing some information in the json about the comments, like if it's a reply to another user a key/value "replied_to: user_id" would be welcome. Because in this case, it's always the creator of the page who will receive the notification and not the person to whom the answer is intended. It would be very welcome to have an internal notification system in bookstack.
Author
Owner

@moeman2323 commented on GitHub (Jan 4, 2024):

Is there any movement on this request?

@moeman2323 commented on GitHub (Jan 4, 2024): Is there any movement on this request?
Author
Owner

@lommes commented on GitHub (Feb 28, 2024):

This seems to be still on the roadmap. Dan mentioned this in the December video and said that the WYSIWYG editor for the comment system (which is now available) is a prerequisite to implement it

@lommes commented on GitHub (Feb 28, 2024): This seems to be still on the roadmap. Dan mentioned this in the [December video](https://youtu.be/ggnTbKmHkRA?si=W7K_IR8ku3PW2koI&t=487) and said that the WYSIWYG editor for the comment system (which is now available) is a prerequisite to implement it
Author
Owner

@Grant-Smith-74 commented on GitHub (Aug 26, 2024):

+1 for user mentions

@Grant-Smith-74 commented on GitHub (Aug 26, 2024): +1 for user mentions
Author
Owner

@FabricePh commented on GitHub (Jan 10, 2025):

Hello, I propose a code from my custom theme to mention @username

I guess, with Webhooks, it's possible to listen new|edit page to read @username and send a email or store in new table to have a notification page for current user/admin

custom_theme/functions.php

<?php

use BookStack\Entities\Controllers as EntityControllers;
use BookStack\Facades\Theme;
use BookStack\Theming\ThemeEvents;
use Illuminate\Support\Facades\Route;

use Custom\Controllers as CustomControllers;

Theme::listen(ThemeEvents::ROUTES_REGISTER_WEB, function ($app) {
    Route::middleware('auth')->group(function () {
        Route::get('/api/users/search', [CustomControllers\UserController::class, 'searchUsers']);
    });
});

custom_theme/Controllers/UserController.php

<?php

namespace Custom\Controllers;

use BookStack\Http\Controller;
use BookStack\Users\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function searchUsers(Request $request)
    {
        $query = $request->get('query', '');
        $users = User::where('name', 'like', '%' . $query . '%')->limit(10)->get(['id', 'name']);
        return response()->json($users);
    }
}

custom-script.js

function getCaretCoordinatesInTinyMCE(editor) {
  const selection = editor.selection.getRng(); 
  if (!selection) {
    return null;
  }

  const rangeRect = selection.getBoundingClientRect();

  const iframe = editor.iframeElement;
  const iframeRect = iframe.getBoundingClientRect();

  return {
    top: iframeRect.top + rangeRect.bottom + window.scrollY,
    left: iframeRect.left + rangeRect.left + window.scrollX,
  };
}

document.addEventListener("editor-tinymce::setup", (event) => {
  const editor = event.detail.editor; 

  const autocompleteBox = document.createElement("div");
  autocompleteBox.style.position = "absolute";
  autocompleteBox.style.zIndex = "1000";
  autocompleteBox.style.display = "none";
  autocompleteBox.classList.add("autocomplete-box");
  document.body.appendChild(autocompleteBox);

  editor.on("keyup", async function (e) {
    const content = editor.getContent();
    const caretCoordinates = getCaretCoordinatesInTinyMCE(editor);
    autocompleteBox.style.left = `${caretCoordinates.left}px`;
    autocompleteBox.style.top = `${caretCoordinates.top}px`;

    const selection = editor.selection;
    const range = selection.getRng();
    const textBeforeCaret = range.startContainer.textContent.slice(0, range.startOffset);

    const matchMention = textBeforeCaret.match(/@([a-zA-Z0-9\._\s]+)/);

    if (matchMention) {
      const query = matchMention[1];
      if (query.length > 0) {
        const response = await fetch(`/api/users/search?query=${query}`);
        const users = await response.json();

        autocompleteBox.style.display = "none";

        if (users.length > 0) {
          autocompleteBox.style.display = "block";
          autocompleteBox.innerHTML = users.map((user) => `<div class="mention" data-username="@${user.name}" data-userid="${user.id}">${user.name}</div>`).join("");

          autocompleteBox.querySelectorAll(".mention").forEach((item) => {
            item.addEventListener("click", function () {
              const userid = this.getAttribute("data-userid");
              const username = this.getAttribute("data-username");

              const mentionSpan = range.startContainer.parentNode.closest("span.mention");
              if (mentionSpan) {
                mentionSpan.setAttribute("data-userid", userid);
                mentionSpan.innerHTML = username;
              } else {
                const mentionHTML = `<span class="mention" data-userid="${userid}">${username}</span>`;
                editor.setContent(content.replace(matchMention[0], mentionHTML + " "));
              }

              autocompleteBox.style.display = "none";
            });
          });
        }
      } else {
        autocompleteBox.style.display = "none";
      }
    } else {
      autocompleteBox.style.display = "none";
    }
  });

  document.addEventListener("click", function () {
    autocompleteBox.style.display = "none";
  });
});

custom-style.css

.mention {
  color: #007bff;
  font-weight: bold;
  cursor: pointer;
}

.mention:hover {
  text-decoration: underline;
}

.autocomplete-box {
  background: white;
  padding: 2px;
  border: 1px solid #ccc;
}
@FabricePh commented on GitHub (Jan 10, 2025): Hello, I propose a code from my custom theme to mention @username I guess, with Webhooks, it's possible to listen `new|edit page` to read @username and send a email or store in new table to have a notification page for current user/admin custom_theme/functions.php ```php <?php use BookStack\Entities\Controllers as EntityControllers; use BookStack\Facades\Theme; use BookStack\Theming\ThemeEvents; use Illuminate\Support\Facades\Route; use Custom\Controllers as CustomControllers; Theme::listen(ThemeEvents::ROUTES_REGISTER_WEB, function ($app) { Route::middleware('auth')->group(function () { Route::get('/api/users/search', [CustomControllers\UserController::class, 'searchUsers']); }); }); ``` custom_theme/Controllers/UserController.php ```php <?php namespace Custom\Controllers; use BookStack\Http\Controller; use BookStack\Users\Models\User; use Illuminate\Http\Request; class UserController extends Controller { public function searchUsers(Request $request) { $query = $request->get('query', ''); $users = User::where('name', 'like', '%' . $query . '%')->limit(10)->get(['id', 'name']); return response()->json($users); } } ``` custom-script.js ```javascript function getCaretCoordinatesInTinyMCE(editor) { const selection = editor.selection.getRng(); if (!selection) { return null; } const rangeRect = selection.getBoundingClientRect(); const iframe = editor.iframeElement; const iframeRect = iframe.getBoundingClientRect(); return { top: iframeRect.top + rangeRect.bottom + window.scrollY, left: iframeRect.left + rangeRect.left + window.scrollX, }; } document.addEventListener("editor-tinymce::setup", (event) => { const editor = event.detail.editor; const autocompleteBox = document.createElement("div"); autocompleteBox.style.position = "absolute"; autocompleteBox.style.zIndex = "1000"; autocompleteBox.style.display = "none"; autocompleteBox.classList.add("autocomplete-box"); document.body.appendChild(autocompleteBox); editor.on("keyup", async function (e) { const content = editor.getContent(); const caretCoordinates = getCaretCoordinatesInTinyMCE(editor); autocompleteBox.style.left = `${caretCoordinates.left}px`; autocompleteBox.style.top = `${caretCoordinates.top}px`; const selection = editor.selection; const range = selection.getRng(); const textBeforeCaret = range.startContainer.textContent.slice(0, range.startOffset); const matchMention = textBeforeCaret.match(/@([a-zA-Z0-9\._\s]+)/); if (matchMention) { const query = matchMention[1]; if (query.length > 0) { const response = await fetch(`/api/users/search?query=${query}`); const users = await response.json(); autocompleteBox.style.display = "none"; if (users.length > 0) { autocompleteBox.style.display = "block"; autocompleteBox.innerHTML = users.map((user) => `<div class="mention" data-username="@${user.name}" data-userid="${user.id}">${user.name}</div>`).join(""); autocompleteBox.querySelectorAll(".mention").forEach((item) => { item.addEventListener("click", function () { const userid = this.getAttribute("data-userid"); const username = this.getAttribute("data-username"); const mentionSpan = range.startContainer.parentNode.closest("span.mention"); if (mentionSpan) { mentionSpan.setAttribute("data-userid", userid); mentionSpan.innerHTML = username; } else { const mentionHTML = `<span class="mention" data-userid="${userid}">${username}</span>`; editor.setContent(content.replace(matchMention[0], mentionHTML + " ")); } autocompleteBox.style.display = "none"; }); }); } } else { autocompleteBox.style.display = "none"; } } else { autocompleteBox.style.display = "none"; } }); document.addEventListener("click", function () { autocompleteBox.style.display = "none"; }); }); ``` custom-style.css ```css .mention { color: #007bff; font-weight: bold; cursor: pointer; } .mention:hover { text-decoration: underline; } .autocomplete-box { background: white; padding: 2px; border: 1px solid #ccc; } ```
Author
Owner

@davidejalexander commented on GitHub (Mar 5, 2025):

+1 for this feature @username whenever it is possible to get it onto the work list.

@davidejalexander commented on GitHub (Mar 5, 2025): +1 for this feature @username whenever it is possible to get it onto the work list.
Author
Owner

@WiredWonder commented on GitHub (Mar 14, 2025):

+1 we want this too.

@WiredWonder commented on GitHub (Mar 14, 2025): +1 we want this too.
Author
Owner

@michealrm commented on GitHub (Mar 26, 2025):

+1, would make great use out of e-mail notifications and is necessary for efficient collaboration

@michealrm commented on GitHub (Mar 26, 2025): +1, would make great use out of e-mail notifications and is necessary for efficient collaboration
Author
Owner

@RajaRoshaan commented on GitHub (May 15, 2025):

Is this feature implemented or not? Along with this, if someone adds a comment to someone else's page then do they get an email notification or something? Without it, we would never know if someone added a comment without check the mage manually.

@RajaRoshaan commented on GitHub (May 15, 2025): Is this feature implemented or not? Along with this, if someone adds a comment to someone else's page then do they get an email notification or something? Without it, we would never know if someone added a comment without check the mage manually.
Author
Owner

@ssddanbrown commented on GitHub (May 15, 2025):

Is this feature implemented or not?

@RajaRoshaan No, hence why this issue is still open.
Having a WYSIWYG editor for comments was a requirement for this, which did get added, but we then had to move editors, which is a pending requirement (should be something I do sometime in the next few feature releases).

Along with this, if someone adds a comment to someone else's page then do they get an email notification or something?

There are notification preference options for comments on owned pages, as well as comment replies.
These need to be enabled in the user's "My Account" area, and the user will need the "Receive/manage notifications" system permission in one of their roles for these options to show.

@ssddanbrown commented on GitHub (May 15, 2025): > Is this feature implemented or not? @RajaRoshaan No, hence why this issue is still open. Having a WYSIWYG editor for comments was a requirement for this, which did get added, but we then had to move editors, which is a pending requirement (should be something I do sometime in the next few feature releases). > Along with this, if someone adds a comment to someone else's page then do they get an email notification or something? There are notification preference options for comments on owned pages, as well as comment replies. These need to be enabled in the user's "My Account" area, and the user will need the "Receive/manage notifications" system permission in one of their roles for these options to show.
Author
Owner

@prohtex commented on GitHub (Jun 23, 2025):

Hello, I propose a code from my custom theme to mention @username

I guess, with Webhooks, it's possible to listen new|edit page to read @username and send a email or store in new table to have a notification page for current user/admin

custom_theme/functions.php

<?php use BookStack\Entities\Controllers as EntityControllers; use BookStack\Facades\Theme; use BookStack\Theming\ThemeEvents; use Illuminate\Support\Facades\Route; use Custom\Controllers as CustomControllers; Theme::listen(ThemeEvents::ROUTES_REGISTER_WEB, function ($app) { Route::middleware('auth')->group(function () { Route::get('/api/users/search', [CustomControllers\UserController::class, 'searchUsers']); }); }); custom_theme/Controllers/UserController.php <?php namespace Custom\Controllers; use BookStack\Http\Controller; use BookStack\Users\Models\User; use Illuminate\Http\Request; class UserController extends Controller { public function searchUsers(Request $request) { $query = $request->get('query', ''); $users = User::where('name', 'like', '%' . $query . '%')->limit(10)->get(['id', 'name']); return response()->json($users); } } custom-script.js function getCaretCoordinatesInTinyMCE(editor) { const selection = editor.selection.getRng(); if (!selection) { return null; } const rangeRect = selection.getBoundingClientRect(); const iframe = editor.iframeElement; const iframeRect = iframe.getBoundingClientRect(); return { top: iframeRect.top + rangeRect.bottom + window.scrollY, left: iframeRect.left + rangeRect.left + window.scrollX, }; } document.addEventListener("editor-tinymce::setup", (event) => { const editor = event.detail.editor; const autocompleteBox = document.createElement("div"); autocompleteBox.style.position = "absolute"; autocompleteBox.style.zIndex = "1000"; autocompleteBox.style.display = "none"; autocompleteBox.classList.add("autocomplete-box"); document.body.appendChild(autocompleteBox); editor.on("keyup", async function (e) { const content = editor.getContent(); const caretCoordinates = getCaretCoordinatesInTinyMCE(editor); autocompleteBox.style.left = `${caretCoordinates.left}px`; autocompleteBox.style.top = `${caretCoordinates.top}px`; const selection = editor.selection; const range = selection.getRng(); const textBeforeCaret = range.startContainer.textContent.slice(0, range.startOffset); const matchMention = textBeforeCaret.match(/@([a-zA-Z0-9\._\s]+)/); if (matchMention) { const query = matchMention[1]; if (query.length > 0) { const response = await fetch(`/api/users/search?query=${query}`); const users = await response.json(); autocompleteBox.style.display = "none"; if (users.length > 0) { autocompleteBox.style.display = "block"; autocompleteBox.innerHTML = users.map((user) => `
${user.name}
`).join(""); autocompleteBox.querySelectorAll(".mention").forEach((item) => { item.addEventListener("click", function () { const userid = this.getAttribute("data-userid"); const username = this.getAttribute("data-username"); const mentionSpan = range.startContainer.parentNode.closest("span.mention"); if (mentionSpan) { mentionSpan.setAttribute("data-userid", userid); mentionSpan.innerHTML = username; } else { const mentionHTML = `${username}`; editor.setContent(content.replace(matchMention[0], mentionHTML + " ")); } autocompleteBox.style.display = "none"; }); }); } } else { autocompleteBox.style.display = "none"; } } else { autocompleteBox.style.display = "none"; } }); document.addEventListener("click", function () { autocompleteBox.style.display = "none"; }); }); custom-style.css .mention { color: #007bff; font-weight: bold; cursor: pointer; } .mention:hover { text-decoration: underline; } .autocomplete-box { background: white; padding: 2px; border: 1px solid #ccc; }

This is working pretty well for me. @ssddanbrown love the notifications on owned pages, but in many cases we are @ mentioning users in pages themselves, and it would be amazing for them to receive an email

@prohtex commented on GitHub (Jun 23, 2025): > Hello, I propose a code from my custom theme to mention @username > > I guess, with Webhooks, it's possible to listen `new|edit page` to read @username and send a email or store in new table to have a notification page for current user/admin > > custom_theme/functions.php > > <?php > > use BookStack\Entities\Controllers as EntityControllers; > use BookStack\Facades\Theme; > use BookStack\Theming\ThemeEvents; > use Illuminate\Support\Facades\Route; > > use Custom\Controllers as CustomControllers; > > Theme::listen(ThemeEvents::ROUTES_REGISTER_WEB, function ($app) { > Route::middleware('auth')->group(function () { > Route::get('/api/users/search', [CustomControllers\UserController::class, 'searchUsers']); > }); > }); > custom_theme/Controllers/UserController.php > > <?php > > namespace Custom\Controllers; > > use BookStack\Http\Controller; > use BookStack\Users\Models\User; > use Illuminate\Http\Request; > > class UserController extends Controller > { > public function searchUsers(Request $request) > { > $query = $request->get('query', ''); > $users = User::where('name', 'like', '%' . $query . '%')->limit(10)->get(['id', 'name']); > return response()->json($users); > } > } > custom-script.js > > function getCaretCoordinatesInTinyMCE(editor) { > const selection = editor.selection.getRng(); > if (!selection) { > return null; > } > > const rangeRect = selection.getBoundingClientRect(); > > const iframe = editor.iframeElement; > const iframeRect = iframe.getBoundingClientRect(); > > return { > top: iframeRect.top + rangeRect.bottom + window.scrollY, > left: iframeRect.left + rangeRect.left + window.scrollX, > }; > } > > document.addEventListener("editor-tinymce::setup", (event) => { > const editor = event.detail.editor; > > const autocompleteBox = document.createElement("div"); > autocompleteBox.style.position = "absolute"; > autocompleteBox.style.zIndex = "1000"; > autocompleteBox.style.display = "none"; > autocompleteBox.classList.add("autocomplete-box"); > document.body.appendChild(autocompleteBox); > > editor.on("keyup", async function (e) { > const content = editor.getContent(); > const caretCoordinates = getCaretCoordinatesInTinyMCE(editor); > autocompleteBox.style.left = `${caretCoordinates.left}px`; > autocompleteBox.style.top = `${caretCoordinates.top}px`; > > const selection = editor.selection; > const range = selection.getRng(); > const textBeforeCaret = range.startContainer.textContent.slice(0, range.startOffset); > > const matchMention = textBeforeCaret.match(/@([a-zA-Z0-9\._\s]+)/); > > if (matchMention) { > const query = matchMention[1]; > if (query.length > 0) { > const response = await fetch(`/api/users/search?query=${query}`); > const users = await response.json(); > > autocompleteBox.style.display = "none"; > > if (users.length > 0) { > autocompleteBox.style.display = "block"; > autocompleteBox.innerHTML = users.map((user) => `<div class="mention" data-username="@${user.name}" data-userid="${user.id}">${user.name}</div>`).join(""); > > autocompleteBox.querySelectorAll(".mention").forEach((item) => { > item.addEventListener("click", function () { > const userid = this.getAttribute("data-userid"); > const username = this.getAttribute("data-username"); > > const mentionSpan = range.startContainer.parentNode.closest("span.mention"); > if (mentionSpan) { > mentionSpan.setAttribute("data-userid", userid); > mentionSpan.innerHTML = username; > } else { > const mentionHTML = `<span class="mention" data-userid="${userid}">${username}</span>`; > editor.setContent(content.replace(matchMention[0], mentionHTML + " ")); > } > > autocompleteBox.style.display = "none"; > }); > }); > } > } else { > autocompleteBox.style.display = "none"; > } > } else { > autocompleteBox.style.display = "none"; > } > }); > > document.addEventListener("click", function () { > autocompleteBox.style.display = "none"; > }); > }); > custom-style.css > > .mention { > color: #007bff; > font-weight: bold; > cursor: pointer; > } > > .mention:hover { > text-decoration: underline; > } > > .autocomplete-box { > background: white; > padding: 2px; > border: 1px solid #ccc; > } This is working pretty well for me. @ssddanbrown love the notifications on owned pages, but in many cases we are @ mentioning users in pages themselves, and it would be amazing for them to receive an email
Author
Owner

@Kofl commented on GitHub (Aug 18, 2025):

+1

@Kofl commented on GitHub (Aug 18, 2025): +1
Author
Owner

@cittadhammo commented on GitHub (Nov 7, 2025):

+1

@cittadhammo commented on GitHub (Nov 7, 2025): +1
Author
Owner

@david-prv commented on GitHub (Nov 10, 2025):

+1

@david-prv commented on GitHub (Nov 10, 2025): +1
Author
Owner

@ssddanbrown commented on GitHub (Dec 18, 2025):

With the merge of #5944, mentions in comments has now been added and will be part of the next feature release.
I'm going to therefore close this off.

I'm aware this issue was a bit wider though, with the ability to mention from pages/content, bit it's hard to distinguish that need relative to mentions in comments, so please feel free to open/support new specific issues for mentions elsewhere.

Also, from reading some of the above, some of the support here has been for general new-comment notifications (rather than mentions) which have been available since v23.08 as detailed here: https://www.bookstackapp.com/blog/bookstack-release-v23-08/#content-notification-system

@ssddanbrown commented on GitHub (Dec 18, 2025): With the merge of #5944, mentions in comments has now been added and will be part of the next feature release. I'm going to therefore close this off. I'm aware this issue was a bit wider though, with the ability to mention from pages/content, bit it's hard to distinguish that need relative to mentions in comments, so please feel free to open/support new specific issues for mentions elsewhere. Also, from reading some of the above, some of the support here has been for general new-comment notifications (rather than mentions) which have been available since v23.08 as detailed here: https://www.bookstackapp.com/blog/bookstack-release-v23-08/#content-notification-system
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/BookStack#474