Tribal knowledge, captured.
Every project owns its own articles. Editors author in BlockNote — a block editor built on ProseMirror — and readers see a rendered surface that matches the Resolvd theme. Articles tie back to tickets through a suggestion ranker and a Promote-to-KB button on every resolved ticket.
Block editor. No markdown gymnastics.
BlockNote handles the heavy lifting — rich text, headings, lists, code, callouts. Slash-command to insert a block, drag a handle to reorder. Persists as JSON in kb_articles.content_json with a plain-text mirror for full-text search.
Bundle adds ~380 KB gzipped — code-split pages/Kb* if CDN bandwidth matters.
H1 / H2 / H3 with anchor links auto-generated from slug.
Bulleted, numbered, and checkbox. Nestable.
Inline and fenced blocks with syntax highlighting.
Info / warning / tip / danger variants.
ProseMirror-backed, drag to reorder rows or columns.
Drag-drop upload — stored alongside ticket attachments under FSL terms.
Every save. Restorable.
Every save snapshots into kb_article_versions with an optional change_summary. Restore any past version with one click — the restore itself writes a new version row marked Restored from vN so the audit chain never breaks.
Article persists to kb_articles.content_json with a plain-text mirror for full-text search.
Article becomes visible to readers in the project. Submitter / Viewer roles see the rendered surface; never the editor.
New row in kb_article_versions with optional change_summary. Old version stays restorable.
Writes a new version row marked Restored from vN. Audit chain stays intact — no destructive overwrite.
Hidden from listings but kept in storage. Tech / Manager / Admin can resurrect.
Two surfaces. One signal.
Tags drive the project article index — chip filters that AND together via tags @> $1::text[]. Keywords boost the trigram similarity ranker that matches articles to tickets. Use them for SKU codes, model numbers, error strings — searchable signal that would clutter a tag chip.
tags: [hardware, hp, workstation]
keywords: [Z240, "DDR4", "blue screen", "0x7E"]
▸ Ranker boost: keyword tokens
▸ Search hit: either path
Articles meet tickets where they live.
The Resolution tab on every ticket carries a Knowledge panel. Articles surface on open, link explicitly, or get drafted fresh from the ticket itself.
Suggestion ranker
pg_trgm similarity over title || tags || keywords vs the ticket title. High-confidence matches auto-surface in the Resolution tab on ticket open.
Promote-to-KB
Drafts a new article seeded from the ticket's title + description + resolution_summary, with a kind='system' link back to the source ticket.
Resolution summary nudge
At close time, a small prompt asks the closer to capture a one-line resolution summary. Drives the new "Fix applied" filter on the ticket list (resolution_summary IS NOT NULL OR kb_link EXISTS).
Capture the next fix.
Resolve a ticket → click Promote-to-KB → tweak → publish. The next time the same error walks in, the article auto-surfaces.