Install and enable
Activating FAQ & Knowledge Base — the extension is named knowledge_base, the four tables it creates, twelve permission keys, the single KYC gate, the optional DeepSeek key, and where the menus actually appear.
Activation is a short, fixed sequence — licence, install, switch on — and there is nothing to configure afterwards. The work is in knowing what to look for once it is on, because the label on the menu and the identifier in every error message are different words.
Before you activate
- Bicrypto core installed and running — see Installing Bicrypto
- The purchase code for Knowledge Base & FAQs — product ID
39166202— from your MashDiv dashboard - Outbound HTTPS from the server, for licence activation and the release download
- A shell on the server, for the one command that applies the install
- Optional: a DeepSeek API key, if you want the AI authoring helpers
That is the whole list. This addon has no other addon as a prerequisite, needs no ScyllaDB, adds no cron job and opens no WebSocket.
Activation
-
Open the Extension Manager. Go to Admin → System → Extension Manager — the screen at
/admin/system/extension, headed Add-ons & Integrations. On the Extensions tab (or by searching for Knowledge) find the Knowledge Base & FAQs card — product ID39166202— and click it. The card is not titled "FAQ". Until its licence is activated the card reads Activate, its switch is disabled, and the switch's tooltip reads Activate license first.- The Knowledge Base & FAQs card — click it to open the product page
- Its switch stays disabled until the licence is activated
-
Activate the licence. On the product page press Activate License. Paste the purchase code from your MashDiv dashboard, optionally an email address for update notifications, and press Activate License. The screen confirms License Activated! and returns you to the product page a couple of seconds later. If the server has no outbound access at that moment, the License File tab on the same screen takes the licence certificate downloaded from your MashDiv dashboard instead.
- Paste the purchase code here
- Activate License — then wait for the redirect back to the product page
- License File — the route for a server with no outbound HTTPS
- Product ID — for this addon it reads 39166202
-
Install the release. Back on the product page, now licensed, the Overview tab has a release panel. If it offers Install v…, press it; if it says Up to date on a product you have only just licensed, press Check for Updates once, then install whatever it offers. The Releases tab holds the notes for the version being offered — read them first.
Install downloads the release, verifies it and extracts it over the project root. It runs no migrations, builds nothing and restarts nothing, so finish it from a shell on the server:
pnpm updatorThat is the finalise chain — stop, dependencies, schema, seed data, frontend build, start — and it is what makes the addon's four tables, its routes and its screens exist. If the panel still says Up to date after the check there is nothing to download; go straight to the next step.
- Check for Updates, then Install v… when it is offered
- Releases — the notes for the version you are about to install
- The Enabled switch — step 4, not yet
-
Switch it on. Turn the Enabled switch on — in the product page heading, or on the card in the Extension Manager, which is usable now that the licence is verified. It takes effect without a restart. This is what makes Knowledge Base appear under Extensions → Business Tools in the admin navigation, pointing at
/admin/faq, and the reader area answer at/faq; until it is on, neither exists. Confirm both surfaces before you move on.
The licence gate is keyed to route prefixes, and for knowledge_base those are
/api/faq and /api/admin/faq. Both the admin screens and the reader-facing
help centre run through it — including the endpoints that need no login at all.
If the licence lapses, /faq stops returning articles for anonymous visitors, not
just for you. The failure is a 403 whose body names the extension as
knowledge_base and the product as 39166202. Neither of those strings appears
anywhere in the admin menu, which is why this looks like an unrelated fault the
first time it happens.
What activation creates
Four tables, which land when pnpm updator runs the schema step after Install:
| Table | Holds |
|---|---|
faqs |
The articles. Soft-deleted (paranoid), so filter deletedAt if you query directly |
faq_feedbacks |
One helpful/unhelpful vote per reader per article, with an optional comment |
faq_questions |
Reader-submitted questions — PENDING, ANSWERED or REJECTED |
faq_searches |
One row per recorded search, with the result count it returned |
faqs carries indexes on category, pagePath, order and status — the four
columns every list in the product filters or sorts on.
Two columns are DataTypes.JSON: tags and relatedFaqIds. That is a native
JSON column on MySQL and LONGTEXT on MariaDB, so the driver hands back an array
on one and a raw string on the other. The model normalises both to an array before
anything reads them. If you query the tables directly, you must handle either
shape yourself — this is the single most common cause of a working integration
that breaks when moved between MySQL and MariaDB.
If you deploy with DB_SYNC=none, run the backend once with sync enabled so the
tables and indexes land. If you build from source, run pnpm types:generate.
Permissions
- Open the role that will manage the knowledge base
Twelve keys ship with the platform. Assign them at /admin/crm/role.
| Key | Grants |
|---|---|
access.faq |
The Knowledge Base dashboard, the Manage screen and the AI screen |
view.faq |
Reading the admin article list, one article, the page list and per-page counts |
create.faq |
Creating an article — and every AI helper |
edit.faq |
Editing, bulk updates, reordering, and per-page enable/disable |
delete.faq |
Deleting an article, a selection, or every article on a page |
view.faq.category |
The category list — and the tag list |
access.faq.question |
The Questions screen |
view.faq.question |
Reading the submitted-question queue |
edit.faq.question |
Answering a question and changing its status |
access.faq.feedback |
The Feedback screen |
view.faq.feedback |
Reading feedback, both the global list and one article's |
create.faq.feedback |
Writing a feedback row through the admin API |
Two of those pairings are not what the names suggest, and both bite.
All six AI endpoints gate on create.faq, not on a permission of their own. Every
one of them forwards text to a metered third-party model that you are billed for.
Granting an author create.faq so they can add articles also grants them the
ability to spend your DeepSeek balance, in a loop, from the batch-improve screen.
If that matters, keep create.faq on a small set of roles.
The tag list is served under view.faq.category, not a tag key. A role that can
filter by category can filter by tag; there is no way to separate them.
The screens themselves gate on access.*: the dashboard, Manage and AI screens on
access.faq, Questions on access.faq.question, Feedback on
access.faq.feedback. A role with view.faq but no access.faq can call the API
and cannot open the page.
The one KYC gate
It appears in the KYC level builder as Knowledge Base Inquiries, in the Support category, with a recommended level of 1.
It gates exactly one thing: POST /api/faq/question. Reading articles, searching,
browsing categories and viewing statistics are all open to anonymous visitors and
have no gate at all. Voting on an article requires a signed-in account but no KYC
feature.
So the practical effect of leaving ask_faq off is that the Ask a Question form
is present, the reader fills it in, and submission is refused. If you do not want
questions, that is the switch — but consider that the submitted-question queue is
where the dashboard's most actionable figure comes from.
Rate limits
Two limiters, both enforced in Redis, both fixed in code:
| Action | Limit |
|---|---|
| Feedback vote | 20 per hour |
| Question submission | 5 per 24 hours |
Neither is configurable. If Redis is unavailable, so are these two endpoints.
The optional DeepSeek key
The AI helpers are the only part of this addon that needs anything in .env:
DEEPSEEK_API_KEY="sk-…"Leave it unset and the addon works completely — you simply write your own
articles. The AI buttons remain visible; pressing one returns 500 with
DeepSeek API key is not set, and a line is written to the backend log at boot.
There is no screen anywhere that tells you the key is missing before you press a
button.
The key is shared platform-wide, not scoped to this addon. Read AI-assisted authoring before you hand it out — that page covers what each helper sends, including the one that puts your entire published library into a single prompt.
Where everything is
The admin area is four screens plus one that is not in the menu.
| Screen | Path | Gate |
|---|---|---|
| Knowledge Base (dashboard) | /admin/faq |
access.faq |
| Manage | /admin/faq/manage |
access.faq |
| Questions | /admin/faq/question |
access.faq.question |
| Feedback | /admin/faq/feedback |
access.faq.feedback |
| AI batch improve | /admin/faq/ai |
access.faq |
/admin/faq/ai is reachable only from the AI Improve button in the header of
the Manage screen. It is a real, permission-gated page; it is simply absent from
the menu, so it cannot be found by browsing.
The reader area is three screens: the help centre at /faq, an article at
/faq/{id}, and a guided Troubleshooter at /faq/troubleshooter.
Submitted questions also surface in the platform-wide operations queue as User
Questions, counting PENDING rows, under the access.faq.question permission.
That is often the first place anyone notices a backlog.
Smoke test
-
Create an article —
/admin/faq/manage, Add FAQ. A question of at least 10 characters, an answer of at least 20, a category, and a page path. Save. -
Read it as a visitor — sign out and open
/faq. The article should appear. Open it; the view counter should move. -
Unpublish it — turn its status off in the admin list, then reload the article URL while signed out. It must return not found, not the article. Turn it back on.
-
Search for a word that is not in it — from
/faq. Then check/admin/faq— the query should appear under the search figures with no results. That proves search recording is working, which is the single most valuable thing this addon produces. -
Submit a question — as a signed-in reader who passes
ask_faq. It should appear on/admin/faq/questionas pending. -
Answer it — the asker receives an email, and an in-app notification if their address belongs to an account.
If step 4 shows nothing, see Troubleshooting; if step 6 sends no email, the fault is in your mail configuration, not here — the answer is saved either way and the failure is written to the backend log.