Pablan, as it stands

Self-hosted knowledge management for SMEs: a split-screen Markdown editor
whose sections an LLM refines while you write, and RAG question answering
over the documents that result. FastAPI + Postgres/pgvector on the back,
SvelteKit on the front, everything OpenAI-compatible and self-hostable.

Squashed into a single commit; the development history stays local.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CA43ZJda8Rbp2hKXNy8f6b
This commit is contained in:
ProfessorNova
2026-09-04 09:21:37 +02:00
co-authored by Claude Opus 5
parent 68d3a43191
commit 784b76baf7
346 changed files with 43430 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# Not in the starter set: a company with machines adds it, an office does
# not. The headings follow how a machine is actually handed over — what it
# does, how you run it, what it needs, and what it does that only the person
# who works with it every day knows.
id: anlage
name: "Maschine oder Anlage: Betrieb und Eigenheiten"
version: "1.0"
kind: authoring
locale: de
description: >
Bedienung, Wartung und die Eigenheiten, die nur jemand kennt, der täglich
damit arbeitet.
model:
temperature: 0.35
min_class_hint: "12b"
persona: |
Du bist ein präziser technischer Redakteur. Du hältst fest, wie eine
Maschine betrieben und gewartet wird — sachlich, in vollständigen Sätzen,
Abläufe als nummerierte Liste. Typenbezeichnungen, Intervalle, Messwerte
und Fehlercodes übernimmst du exakt und erfindest keine dazu. Keine
Floskeln, keine Emojis.
title_template: "Neue Anlage"
skeleton: |
## Was die Anlage macht
## Bedienung im Alltag
## Wartung und Intervalle
## Eigenheiten und Fehlerbilder
sections:
- heading: "Was die Anlage macht"
hint: >
Typ und Aufgabe der Maschine, wo sie steht und in welchen Ablauf sie
gehört.
- heading: "Bedienung im Alltag"
hint: >
Anfahren, Rüsten, Abschalten — die Handgriffe, die jede Schicht
braucht, in ihrer Reihenfolge.
- heading: "Wartung und Intervalle"
hint: >
Was in welchem Abstand zu tun ist, mit Schmierstoffen, Ersatzteilen
und Prüfpunkten.
- heading: "Eigenheiten und Fehlerbilder"
hint: >
Was diese Maschine anders macht als das Handbuch sagt: bekannte
Fehlerbilder, Tricks, Dinge, die man nicht tun darf.
metadata:
visibility: department
+54
View File
@@ -0,0 +1,54 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `anlage` (same id, locale: en).
#
# Not in the starter set: a company with machines adds it, an office does not.
id: anlage
name: "Machine or plant: running it and its quirks"
version: "1.0"
kind: authoring
locale: en
description: >
Operation, maintenance, and the quirks only somebody who works with it
daily knows.
model:
temperature: 0.35
min_class_hint: "12b"
persona: |
You are a precise technical writer. You record how a machine is operated
and maintained — plainly, in complete sentences, procedures as a numbered
list. Type designations, intervals, readings and error codes stay exactly
as given, and you invent none. No filler, no emoji.
title_template: "New machine"
skeleton: |
## What it does
## Running it day to day
## Maintenance and intervals
## Quirks and known faults
sections:
- heading: "What it does"
hint: >
Type and purpose of the machine, where it stands and which process it
belongs to.
- heading: "Running it day to day"
hint: >
Starting, setting up, shutting down — the handling every shift needs,
in order.
- heading: "Maintenance and intervals"
hint: >
What has to be done how often, with lubricants, spare parts and check
points.
- heading: "Quirks and known faults"
hint: >
Where this machine differs from its manual: known faults, tricks,
things that must not be done.
metadata:
visibility: department
+51
View File
@@ -0,0 +1,51 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# Not in the starter set. The point of writing a decision down is the
# REASON: a year later everyone remembers the outcome and nobody remembers
# why, and then it gets re-litigated.
id: entscheidung
name: "Entscheidung: was gilt und warum"
version: "1.0"
kind: authoring
locale: de
description: >
Festhalten, was entschieden wurde, aus welchen Gründen und was daraus
folgt.
model:
temperature: 0.35
min_class_hint: "12b"
persona: |
Du bist ein präziser Fachredakteur. Du hältst eine getroffene Entscheidung
fest: das Ergebnis, die Gründe und die Folgen — sachlich, in vollständigen
Sätzen, ohne die Entscheidung zu bewerten. Zahlen, Termine, Namen und
Alternativen behältst du exakt bei. Keine Floskeln, keine Emojis.
title_template: "Entscheidung vom {{date}}"
skeleton: |
## Was entschieden wurde
## Warum
## Was daraus folgt
sections:
- heading: "Was entschieden wurde"
hint: >
Die Entscheidung in einem Satz, dazu wer sie getroffen hat und wann
sie gilt.
- heading: "Warum"
hint: >
Die ausschlaggebenden Gründe — und welche Alternativen verworfen
wurden, damit sie nicht wieder aufgemacht werden.
- heading: "Was daraus folgt"
hint: >
Was sich dadurch ändert: für welche Abläufe, ab wann, und wer davon
betroffen ist.
metadata:
visibility: department
+46
View File
@@ -0,0 +1,46 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `entscheidung` (same id, locale: en).
#
# Not in the starter set. The point of writing a decision down is the REASON:
# a year later everyone remembers the outcome and nobody remembers why.
id: entscheidung
name: "Decision: what stands and why"
version: "1.0"
kind: authoring
locale: en
description: >
Record what was decided, on what grounds, and what follows from it.
model:
temperature: 0.35
min_class_hint: "12b"
persona: |
You are a precise technical editor. You record a decision that has been
made: the outcome, the reasons and the consequences — plainly, in complete
sentences, without judging it. Numbers, dates, names and alternatives stay
exactly as given. No filler, no emoji.
title_template: "Decision on {{date}}"
skeleton: |
## What was decided
## Why
## What follows from it
sections:
- heading: "What was decided"
hint: >
The decision in one sentence, who made it, and from when it applies.
- heading: "Why"
hint: >
The reasons that settled it — and which alternatives were dropped, so
they do not get reopened.
- heading: "What follows from it"
hint: >
What changes: for which processes, from when, and who it affects.
metadata:
visibility: department
+37
View File
@@ -0,0 +1,37 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# The open one, and deliberately EMPTY: three generic headings ("Worum es
# geht / Details / Was andere wissen müssen") are what a blank page looks
# like when it is trying to be helpful, and nobody writes a document that
# way. Someone reaching for this already knows what they want to say, so the
# editor gets out of the way and the assistant matures whatever they write.
id: notiz
name: "Notiz: einfach aufschreiben"
version: "1.0"
kind: authoring
locale: de
description: >
Ohne Vorgaben schreiben. Die Gliederung ergibt sich aus dem, was du sagst.
model:
temperature: 0.5 # a touch more freedom than the structured templates
min_class_hint: "12b"
persona: |
Du bist ein präziser Fachredakteur, der Wissen aus dem Arbeitsalltag
festhält. Du formulierst sachlich und klar, in vollständigen Sätzen, und
behältst Zahlen, Namen und Beispiele exakt bei. Wo etwas eine Reihenfolge
hat, machst du eine Liste daraus. Keine Floskeln, keine Emojis, keine
Begeisterungsbekundungen.
title_template: "Notiz vom {{date}}"
# No skeleton on purpose — see the note above.
skeleton: ""
sections: []
metadata:
visibility: department
+34
View File
@@ -0,0 +1,34 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `notiz` (same id, locale: en).
#
# The open one, and deliberately EMPTY: three generic headings ("What this is
# about / Details / What others need to know") are what a blank page looks
# like when it is trying to be helpful, and nobody writes a document that
# way.
id: notiz
name: "Note: just write it down"
version: "1.0"
kind: authoring
locale: en
description: >
Write without a structure. The shape follows from what you have to say.
model:
temperature: 0.5
min_class_hint: "12b"
persona: |
You are a precise technical editor who writes down knowledge from everyday
work. You write plainly and clearly, in complete sentences, and keep
numbers, names and examples exactly as given. Where something has an
order, you make it a list. No filler, no emoji, no enthusiasm.
title_template: "Note from {{date}}"
# No skeleton on purpose — see the note above.
skeleton: ""
sections: []
metadata:
visibility: department
+52
View File
@@ -0,0 +1,52 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# The document a person writes about themselves. It replaced an "onboarding"
# blueprint somebody else filled in FOR the new colleague: nobody does that,
# and the person themselves knows the answers. The profile page starts this
# one (api/account.py PERSONAL_BLUEPRINT).
id: person
name: "Über dich: Rolle und Ansprechbarkeit"
version: "1.0"
kind: authoring
locale: de
description: >
Wofür du zuständig bist und wobei Kolleg:innen dich fragen können.
model:
temperature: 0.4
min_class_hint: "12b"
persona: |
Du bist ein präziser Fachredakteur. Du hältst fest, was eine Person im
Unternehmen macht und wobei man sie fragen kann — sachlich, in der ersten
Person, in vollständigen Sätzen. Namen, Systeme und Zuständigkeiten
behältst du exakt bei. Keine Floskeln, keine Selbstlobformeln, keine
Emojis.
title_template: "{{user.name}}"
skeleton: |
## Was ich mache
## Wobei ihr mich fragen könnt
## Womit ich arbeite
sections:
- heading: "Was ich mache"
hint: >
Die eigene Rolle in zwei, drei Sätzen: wofür man zuständig ist und was
im Alltag tatsächlich anfällt.
- heading: "Wobei ihr mich fragen könnt"
hint: >
Die Themen, bei denen man diese Person anspricht — und, wenn es das
gibt, wofür jemand anderes zuständig ist.
- heading: "Womit ich arbeite"
hint: >
Die Systeme, Maschinen oder Werkzeuge, in denen die Person zu Hause
ist.
metadata:
visibility: public
+47
View File
@@ -0,0 +1,47 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `person` (same id, locale: en).
#
# The document a person writes about themselves; the profile page starts this
# one (api/account.py PERSONAL_BLUEPRINT).
id: person
name: "About you: role and what to ask you"
version: "1.0"
kind: authoring
locale: en
description: >
What you are responsible for, and what colleagues can come to you with.
model:
temperature: 0.4
min_class_hint: "12b"
persona: |
You are a precise technical editor. You write down what a person does in
this company and what they can be asked about — plainly, in the first
person, in complete sentences. Names, systems and responsibilities stay
exactly as given. No filler, no self-praise, no emoji.
title_template: "{{user.name}}"
skeleton: |
## What I do
## What you can ask me about
## What I work with
sections:
- heading: "What I do"
hint: >
The role in two or three sentences: what it is responsible for, and
what actually fills the day.
- heading: "What you can ask me about"
hint: >
The topics people come to this person with — and, where it matters,
what somebody else handles instead.
- heading: "What I work with"
hint: >
The systems, machines or tools this person is at home in.
metadata:
visibility: public
+51
View File
@@ -0,0 +1,51 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# Not in the starter set. Kept short on purpose: a debrief that asks for a
# full project report gets written by nobody, and the only part anyone reads
# later is what would be done differently.
id: projekt-debrief
name: "Projekt-Rückblick: was wir gelernt haben"
version: "1.0"
kind: authoring
locale: de
description: >
Nach einem Projekt festhalten, was es gebracht hat und was beim nächsten
Mal anders laufen sollte.
model:
temperature: 0.4
min_class_hint: "12b"
persona: |
Du bist ein präziser Fachredakteur. Du hältst nach einem Projekt fest,
worum es ging und was daraus zu lernen ist — sachlich, in vollständigen
Sätzen, ohne Schuldzuweisung und ohne Beschönigung. Zahlen, Termine und
Namen behältst du exakt bei. Keine Floskeln, keine Emojis.
title_template: "Projekt-Rückblick vom {{date}}"
skeleton: |
## Worum es ging
## Wie es gelaufen ist
## Was wir beim nächsten Mal anders machen
sections:
- heading: "Worum es ging"
hint: >
Ausgangslage und Ziel des Projekts, in zwei, drei Sätzen, mit dem
Zeitraum und den Beteiligten.
- heading: "Wie es gelaufen ist"
hint: >
Das Ergebnis und der Weg dorthin — was funktioniert hat und wo es
gehakt hat.
- heading: "Was wir beim nächsten Mal anders machen"
hint: >
Die konkreten Schlüsse: was wiederholt und was vermieden werden
sollte.
metadata:
visibility: department
+47
View File
@@ -0,0 +1,47 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `projekt-debrief` (same id, locale: en).
#
# Not in the starter set. Kept short on purpose: a debrief that asks for a
# full project report gets written by nobody.
id: projekt-debrief
name: "Project review: what we learned"
version: "1.0"
kind: authoring
locale: en
description: >
After a project, record what came of it and what should go differently
next time.
model:
temperature: 0.4
min_class_hint: "12b"
persona: |
You are a precise technical editor. After a project you record what it was
about and what there is to learn from it — plainly, in complete sentences,
without blame and without gloss. Numbers, dates and names stay exactly as
given. No filler, no emoji.
title_template: "Project review from {{date}}"
skeleton: |
## What it was about
## How it went
## What we do differently next time
sections:
- heading: "What it was about"
hint: >
Starting point and goal of the project, in two or three sentences,
with the timeframe and who was involved.
- heading: "How it went"
hint: >
The outcome and the road to it — what worked and where it snagged.
- heading: "What we do differently next time"
hint: >
The concrete conclusions: what to repeat and what to avoid.
metadata:
visibility: department
+57
View File
@@ -0,0 +1,57 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# The most common thing anyone writes down: how something is done here. The
# headings are the questions a colleague actually asks — when does this
# apply, what do I do, what goes wrong, who do I ask.
id: prozess
name: "Ablauf: wie wir das machen"
version: "1.0"
kind: authoring
locale: de
description: >
Ein wiederkehrender Ablauf, Schritt für Schritt — so, dass jemand anderes
ihn allein schafft.
model:
temperature: 0.4
min_class_hint: "12b"
persona: |
Du bist ein präziser Fachredakteur für Arbeitsanweisungen. Du schreibst
sachlich, in vollständigen Sätzen, und machst aus einer Abfolge eine
nummerierte Liste. Zahlen, Fristen, Systemnamen und Zuständigkeiten
behältst du exakt bei und erfindest keine dazu. Keine Floskeln, keine
Emojis.
title_template: "Neuer Ablauf"
skeleton: |
## Wann das gilt
## Schritt für Schritt
## Wenn es klemmt
## Wer zuständig ist
sections:
- heading: "Wann das gilt"
hint: >
Der Auslöser: in welcher Situation dieser Ablauf greift, und wo er
nicht gilt.
- heading: "Schritt für Schritt"
hint: >
Die Schritte in ihrer Reihenfolge, jeder als eine Handlung — mit den
Systemen, Formularen und Fristen, die dazugehören.
- heading: "Wenn es klemmt"
hint: >
Die Sonderfälle und die Stellen, an denen es erfahrungsgemäß hakt,
samt dem, was dann zu tun ist.
- heading: "Wer zuständig ist"
hint: >
Wer den Ablauf verantwortet und wen man bei Rückfragen anspricht.
metadata:
visibility: department
+54
View File
@@ -0,0 +1,54 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `prozess` (same id, locale: en).
#
# The most common thing anyone writes down: how something is done here. The
# headings are the questions a colleague actually asks.
id: prozess
name: "Process: how we do this"
version: "1.0"
kind: authoring
locale: en
description: >
A recurring process, step by step — written so somebody else gets through
it alone.
model:
temperature: 0.4
min_class_hint: "12b"
persona: |
You are a precise technical editor for work instructions. You write
plainly, in complete sentences, and turn a sequence into a numbered list.
Numbers, deadlines, system names and responsibilities stay exactly as
given, and you invent none. No filler, no emoji.
title_template: "New process"
skeleton: |
## When this applies
## Step by step
## When it goes wrong
## Who owns it
sections:
- heading: "When this applies"
hint: >
The trigger: the situation this process covers, and where it does not
apply.
- heading: "Step by step"
hint: >
The steps in order, each one an action — with the systems, forms and
deadlines that belong to them.
- heading: "When it goes wrong"
hint: >
The special cases and the places this reliably snags, and what to do
then.
- heading: "Who owns it"
hint: >
Who is responsible for the process and who to ask about it.
metadata:
visibility: department
+58
View File
@@ -0,0 +1,58 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# Content is German (product content for the German market — Language policy);
# keys and structure are English.
#
# Written right after something broke, while it is still fresh — which is why
# the headings are past tense and the last one is the only forward-looking
# question worth asking.
id: stoerung
name: "Störung: was los war und was geholfen hat"
version: "1.0"
kind: authoring
locale: de
description: >
Nach einem Ausfall oder Fehler festhalten, woran es lag und wie es behoben
wurde.
model:
temperature: 0.35
min_class_hint: "12b"
persona: |
Du bist ein präziser Fachredakteur für Störungsberichte. Du schreibst
sachlich und knapp, in vollständigen Sätzen. Fehlermeldungen, Codes,
Bauteilbezeichnungen und Messwerte übernimmst du wörtlich. Du trennst
Beobachtung von Vermutung und erfindest keine Ursache dazu. Keine
Floskeln, keine Emojis.
title_template: "Störung vom {{date}}"
skeleton: |
## Was passiert ist
## Woran es lag
## Was geholfen hat
## Damit es nicht wiederkommt
sections:
- heading: "Was passiert ist"
hint: >
Das Störungsbild: was ausgefallen ist, wann, und was das für den
Betrieb bedeutet hat. Fehlermeldungen wörtlich.
- heading: "Woran es lag"
hint: >
Die Ursache, soweit sie bekannt ist — und was nur Vermutung ist, wird
als solche gekennzeichnet.
- heading: "Was geholfen hat"
hint: >
Die Maßnahme, die die Störung tatsächlich behoben hat, mit den
Schritten in ihrer Reihenfolge.
- heading: "Damit es nicht wiederkommt"
hint: >
Was vorbeugt: Wartung, Prüfung, Ersatzteil, Änderung am Ablauf. Nur
was wirklich vorgesehen ist.
metadata:
visibility: department
+52
View File
@@ -0,0 +1,52 @@
# Catalog blueprint — inert until an admin adds it (docs/authoring-templates.md).
# The English variant of `stoerung` (same id, locale: en).
#
# Written right after something broke, while it is still fresh.
id: stoerung
name: "Incident: what happened and what fixed it"
version: "1.0"
kind: authoring
locale: en
description: >
After a failure or a fault, record what caused it and how it was resolved.
model:
temperature: 0.35
min_class_hint: "12b"
persona: |
You are a precise technical editor for incident reports. You write plainly
and briefly, in complete sentences. Error messages, codes, part numbers
and readings are quoted verbatim. You separate observation from guess and
invent no cause. No filler, no emoji.
title_template: "Incident on {{date}}"
skeleton: |
## What happened
## What caused it
## What fixed it
## Keeping it from happening again
sections:
- heading: "What happened"
hint: >
The symptom: what failed, when, and what it meant for operations.
Error messages verbatim.
- heading: "What caused it"
hint: >
The cause as far as it is known — anything that is a guess is marked
as one.
- heading: "What fixed it"
hint: >
The measure that actually resolved it, with the steps in order.
- heading: "Keeping it from happening again"
hint: >
What prevents a repeat: maintenance, a check, a spare part, a change
to the process. Only what is actually planned.
metadata:
visibility: department