feat(docs): standalone docs page, Hilfe nav entry, rewritten user guide

- docs route renders without the app shell (own header, back-to-app link,
  theme toggle)
- nav entry renamed to Hilfe (de) / Help (en)
- reference links now case-insensitive (schema/tag slugs)
- handbook rewritten as 17-page user guide with links into the API reference
- release notes v0.8.1 added
This commit is contained in:
opencode
2026-08-03 22:52:14 +02:00
parent 9ceb11e7f9
commit fdf2d741a1
24 changed files with 833 additions and 323 deletions
@@ -37,31 +37,6 @@ function buildCrumbs(location: string, t: TFunction): Crumb[] {
crumbs.push({ label: t("compare.title") }); crumbs.push({ label: t("compare.title") });
} else if (location.startsWith("/analytics")) { } else if (location.startsWith("/analytics")) {
crumbs.push({ label: t("nav.analytics") }); crumbs.push({ label: t("nav.analytics") });
} else if (location.startsWith("/docs")) {
crumbs.push({ href: "/docs", label: t("docs.title") });
const m = location.replace(/^\/docs\/?/, "");
if (m.startsWith("handbook/")) {
crumbs.push({ href: "/docs/handbook", label: t("docs.guides") });
const slug = m.replace(/^handbook\//, "").split("#")[0];
if (slug) crumbs.push({ label: slug });
} else if (m.startsWith("reference/")) {
crumbs.push({ href: "/docs/reference/endpoints", label: t("docs.reference") });
const rest = m.replace(/^reference\//, "").split("#")[0];
if (rest.startsWith("schemas/")) {
crumbs.push({ label: t("docs.schemas") });
const name = rest.replace(/^schemas\//, "");
if (name) crumbs.push({ label: name });
} else {
const tag = rest.replace(/^endpoints\//, "");
if (tag) crumbs.push({ label: tag });
}
} else if (m.startsWith("releases/")) {
crumbs.push({ href: "/docs/releases", label: t("docs.releases") });
const version = m.replace(/^releases\//, "").split("#")[0];
if (version) crumbs.push({ label: version });
} else if (m) {
crumbs.push({ label: m });
}
} else if (location.startsWith("/login")) { } else if (location.startsWith("/login")) {
crumbs.push({ label: t("auth.signIn") }); crumbs.push({ label: t("auth.signIn") });
} }
+13 -2
View File
@@ -12,7 +12,7 @@
"trash": "Papierkorb", "trash": "Papierkorb",
"admin": "Admin", "admin": "Admin",
"redundancy": "Redundanz", "redundancy": "Redundanz",
"docs": "Doku", "docs": "Hilfe",
"search": "Tools suchen…" "search": "Tools suchen…"
}, },
"auth": { "auth": {
@@ -198,7 +198,18 @@
"reference": "API-Referenz", "reference": "API-Referenz",
"referenceIntro": "Automatisch aus der OpenAPI-Spezifikation generiert — alle Endpunkte und Datenfelder der aktuellen Version.", "referenceIntro": "Automatisch aus der OpenAPI-Spezifikation generiert — alle Endpunkte und Datenfelder der aktuellen Version.",
"onThisPage": "Auf dieser Seite", "onThisPage": "Auf dieser Seite",
"searchPlaceholder": "Doku durchsuchen…" "searchPlaceholder": "Doku durchsuchen…",
"backToApp": "Zur App",
"field": "Feld",
"type": "Typ",
"required": "Pflicht",
"description": "Beschreibung",
"status": "Status",
"schema": "Schema",
"parameter": "Parameter",
"noResults": "Keine Treffer",
"fields": "Felder",
"fieldHelpHint": "Hinweis: Formular-Felder verlinken per ?-Icon direkt zu den jeweiligen Zeilen dieser Tabelle."
}, },
"command": { "command": {
"navigate": "Navigation", "navigate": "Navigation",
+13 -2
View File
@@ -12,7 +12,7 @@
"trash": "Trash", "trash": "Trash",
"admin": "Admin", "admin": "Admin",
"redundancy": "Redundancy", "redundancy": "Redundancy",
"docs": "Docs", "docs": "Help",
"search": "Search tools…" "search": "Search tools…"
}, },
"auth": { "auth": {
@@ -198,7 +198,18 @@
"reference": "API reference", "reference": "API reference",
"referenceIntro": "Generated automatically from the OpenAPI spec — all endpoints and data fields of the current version.", "referenceIntro": "Generated automatically from the OpenAPI spec — all endpoints and data fields of the current version.",
"onThisPage": "On this page", "onThisPage": "On this page",
"searchPlaceholder": "Search docs…" "searchPlaceholder": "Search docs…",
"backToApp": "Back to app",
"field": "Field",
"type": "Type",
"required": "Required",
"description": "Description",
"status": "Status",
"schema": "Schema",
"parameter": "Parameter",
"noResults": "No results",
"fields": "Fields",
"fieldHelpHint": "Note: form fields link via the ? icon directly to the respective rows of this table."
}, },
"command": { "command": {
"navigate": "Navigate", "navigate": "Navigate",
+51 -21
View File
@@ -3,11 +3,11 @@ import { Link, useLocation } from "wouter";
import { Marked } from "marked"; import { Marked } from "marked";
import DOMPurify from "dompurify"; import DOMPurify from "dompurify";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Layout } from "@/components/layout";
import { Skeleton } from "@/components/ui/skeleton"; import { Skeleton } from "@/components/ui/skeleton";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { ThemeToggle } from "@/components/theme-toggle";
import { import {
Select, Select,
SelectContent, SelectContent,
@@ -17,6 +17,7 @@ import {
} from "@/components/ui/select"; } from "@/components/ui/select";
import { useGetVersion, getGetVersionQueryKey } from "@workspace/api-client-react"; import { useGetVersion, getGetVersionQueryKey } from "@workspace/api-client-react";
import { import {
ArrowLeft,
BookOpen, BookOpen,
CalendarDays, CalendarDays,
ExternalLink, ExternalLink,
@@ -27,6 +28,7 @@ import {
Search, Search,
Server, Server,
Tag, Tag,
Wrench,
type LucideIcon, type LucideIcon,
} from "lucide-react"; } from "lucide-react";
@@ -485,15 +487,16 @@ function FieldTypeChip({ type }: { type: FieldType }) {
} }
function FieldTable({ fields }: { fields: Field[] }) { function FieldTable({ fields }: { fields: Field[] }) {
const { t } = useTranslation();
return ( return (
<div className="overflow-x-auto rounded-lg border"> <div className="overflow-x-auto rounded-lg border">
<table className="w-full text-sm"> <table className="w-full text-sm">
<thead> <thead>
<tr className="border-b bg-muted/50 text-left text-xs uppercase tracking-wider text-muted-foreground"> <tr className="border-b bg-muted/50 text-left text-xs uppercase tracking-wider text-muted-foreground">
<th className="px-3 py-2 font-semibold">Feld</th> <th className="px-3 py-2 font-semibold">{t("docs.field")}</th>
<th className="px-3 py-2 font-semibold">Typ</th> <th className="px-3 py-2 font-semibold">{t("docs.type")}</th>
<th className="px-3 py-2 font-semibold">Pflicht</th> <th className="px-3 py-2 font-semibold">{t("docs.required")}</th>
<th className="px-3 py-2 font-semibold">Beschreibung</th> <th className="px-3 py-2 font-semibold">{t("docs.description")}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -529,6 +532,7 @@ function FieldTable({ fields }: { fields: Field[] }) {
} }
function SchemaView({ schema }: { schema: SchemaModel }) { function SchemaView({ schema }: { schema: SchemaModel }) {
const { t } = useTranslation();
const headings: Heading[] = schema.fields.map((f) => ({ id: f.name, text: f.name, level: 2 })); const headings: Heading[] = schema.fields.map((f) => ({ id: f.name, text: f.name, level: 2 }));
return ( return (
<div className="flex flex-col lg:flex-row gap-8"> <div className="flex flex-col lg:flex-row gap-8">
@@ -540,15 +544,16 @@ function SchemaView({ schema }: { schema: SchemaModel }) {
<FieldTable fields={schema.fields} /> <FieldTable fields={schema.fields} />
<p className="text-xs text-muted-foreground"> <p className="text-xs text-muted-foreground">
<HelpCircle className="h-3.5 w-3.5 inline mr-1" /> <HelpCircle className="h-3.5 w-3.5 inline mr-1" />
Hinweis: Formular-Felder verlinken per ?-Icon direkt zu den jeweiligen Zeilen dieser Tabelle. {t("docs.fieldHelpHint")}
</p> </p>
</div> </div>
<Toc headings={headings} title="Felder" /> <Toc headings={headings} title={t("docs.fields")} />
</div> </div>
); );
} }
function EndpointTagView({ tag }: { tag: TagGroup }) { function EndpointTagView({ tag }: { tag: TagGroup }) {
const { t } = useTranslation();
const headings: Heading[] = tag.endpoints.map((e) => ({ const headings: Heading[] = tag.endpoints.map((e) => ({
id: e.operationId, id: e.operationId,
text: `${e.method} ${e.path}`, text: `${e.method} ${e.path}`,
@@ -577,16 +582,16 @@ function EndpointTagView({ tag }: { tag: TagGroup }) {
{ep.parameters.length > 0 && ( {ep.parameters.length > 0 && (
<div className="mb-3"> <div className="mb-3">
<p className="mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground">Parameter</p> <p className="mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground">{t("docs.parameter")}</p>
<div className="overflow-x-auto rounded-lg border"> <div className="overflow-x-auto rounded-lg border">
<table className="w-full text-sm"> <table className="w-full text-sm">
<thead> <thead>
<tr className="border-b bg-muted/50 text-left text-xs uppercase tracking-wider text-muted-foreground"> <tr className="border-b bg-muted/50 text-left text-xs uppercase tracking-wider text-muted-foreground">
<th className="px-3 py-2 font-semibold">Name</th> <th className="px-3 py-2 font-semibold">Name</th>
<th className="px-3 py-2 font-semibold">In</th> <th className="px-3 py-2 font-semibold">In</th>
<th className="px-3 py-2 font-semibold">Typ</th> <th className="px-3 py-2 font-semibold">{t("docs.type")}</th>
<th className="px-3 py-2 font-semibold">Pflicht</th> <th className="px-3 py-2 font-semibold">{t("docs.required")}</th>
<th className="px-3 py-2 font-semibold">Beschreibung</th> <th className="px-3 py-2 font-semibold">{t("docs.description")}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -623,9 +628,9 @@ function EndpointTagView({ tag }: { tag: TagGroup }) {
<table className="w-full text-sm"> <table className="w-full text-sm">
<thead> <thead>
<tr className="border-b bg-muted/50 text-left text-xs uppercase tracking-wider text-muted-foreground"> <tr className="border-b bg-muted/50 text-left text-xs uppercase tracking-wider text-muted-foreground">
<th className="px-3 py-2 font-semibold">Status</th> <th className="px-3 py-2 font-semibold">{t("docs.status")}</th>
<th className="px-3 py-2 font-semibold">Beschreibung</th> <th className="px-3 py-2 font-semibold">{t("docs.description")}</th>
<th className="px-3 py-2 font-semibold">Schema</th> <th className="px-3 py-2 font-semibold">{t("docs.schema")}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -642,7 +647,7 @@ function EndpointTagView({ tag }: { tag: TagGroup }) {
</section> </section>
))} ))}
</div> </div>
<Toc headings={headings} title="Endpunkte" /> <Toc headings={headings} title={t("docs.endpoints")} />
</div> </div>
); );
} }
@@ -737,12 +742,13 @@ function useDocsSearch(query: string) {
} }
function SearchOverlay({ query, onClose }: { query: string; onClose: () => void }) { function SearchOverlay({ query, onClose }: { query: string; onClose: () => void }) {
const { t } = useTranslation();
const { results } = useDocsSearch(query); const { results } = useDocsSearch(query);
if (!query.trim()) return null; if (!query.trim()) return null;
return ( return (
<div className="mt-3 rounded-lg border bg-card p-2 shadow-md max-h-96 overflow-auto"> <div className="mt-3 rounded-lg border bg-card p-2 shadow-md max-h-96 overflow-auto">
{results.length === 0 ? ( {results.length === 0 ? (
<p className="px-3 py-2 text-sm text-muted-foreground">Keine Treffer</p> <p className="px-3 py-2 text-sm text-muted-foreground">{t("docs.noResults")}</p>
) : ( ) : (
results.map((r) => ( results.map((r) => (
<Link <Link
@@ -849,7 +855,9 @@ export default function Docs() {
} else if (section === "handbook" && param) { } else if (section === "handbook" && param) {
content = <HandbookView slug={param} />; content = <HandbookView slug={param} />;
} else if (section === "reference" && param === "endpoints" && path[2]) { } else if (section === "reference" && param === "endpoints" && path[2]) {
const tag = reference?.tags.find((tg) => tg.name === path[2]); const tag = reference?.tags.find(
(tg) => tg.name.toLowerCase() === path[2].toLowerCase(),
);
content = tag ? ( content = tag ? (
<EndpointTagView tag={tag} /> <EndpointTagView tag={tag} />
) : refError || (reference && !tag) ? ( ) : refError || (reference && !tag) ? (
@@ -858,7 +866,9 @@ export default function Docs() {
<Skeleton className="h-64 w-full" /> <Skeleton className="h-64 w-full" />
); );
} else if (section === "reference" && param === "schemas" && path[2]) { } else if (section === "reference" && param === "schemas" && path[2]) {
const schema = reference?.schemas.find((s) => s.name === path[2]); const schema = reference?.schemas.find(
(s) => s.name.toLowerCase() === path[2].toLowerCase(),
);
content = schema ? ( content = schema ? (
<SchemaView schema={schema} /> <SchemaView schema={schema} />
) : refError || (reference && !schema) ? ( ) : refError || (reference && !schema) ? (
@@ -923,8 +933,28 @@ export default function Docs() {
const showSearch = version === null && section !== "releases"; const showSearch = version === null && section !== "releases";
return ( return (
<Layout> <div className="min-h-screen bg-background flex flex-col">
<div className="mx-auto max-w-6xl space-y-6 pb-10"> <header className="border-b bg-card shrink-0">
<div className="mx-auto max-w-6xl px-4 md:px-6 h-14 flex items-center justify-between gap-3">
<Link
href="/"
className="inline-flex items-center gap-2 text-primary font-bold text-lg min-w-0"
data-testid="link-docs-back"
>
<Wrench className="w-5 h-5 shrink-0" />
<span className="truncate">toolr</span>
<span className="hidden md:inline-flex items-center gap-1 text-xs font-normal text-muted-foreground border-l pl-2 ml-1">
<ArrowLeft className="w-3.5 h-3.5" />
{t("docs.backToApp")}
</span>
</Link>
<div className="flex items-center gap-1.5 shrink-0">
<ThemeToggle />
</div>
</div>
</header>
<div className="mx-auto max-w-6xl w-full flex-1 space-y-6 px-4 md:px-6 py-6 pb-12">
<DocsHeader <DocsHeader
versions={releases ?? []} versions={releases ?? []}
activeVersion={version} activeVersion={version}
@@ -948,6 +978,6 @@ export default function Docs() {
<div className="min-w-0">{content}</div> <div className="min-w-0">{content}</div>
</div> </div>
</div> </div>
</Layout> </div>
); );
} }
+47 -43
View File
@@ -1,61 +1,65 @@
--- ---
title: Administration & Papierkorb title: Administration
order: 7 order: 13
--- ---
# Administration & Papierkorb # Administration
Diese Bereiche sind nur für **Administrator:innen** sichtbar und nutzbar. Der Bereich **Admin** (`/admin`) ist ausschließlich für Admins zugänglich.
Ohne Admin-Rolle erscheint eine Zugriffsverweigerung.
## Nutzerverwaltung > Oben rechts führt die Schaltfläche **Redundanz-Dashboard** zur automatischen
> Doppelungs-Erkennung (siehe [Redundanz](/docs/handbook/redundanz)).
Unter **Admin → Nutzer** kannst du: ## Tab „Nutzer"
- **Lokale Nutzer anlegen** (Benutzername, Passwort, E-Mail, Rolle, Tier). Verwaltung der lokalen Konten.
- **Rollen/Tier ändern** (`admin`/`user`, `free`/`premium`/`enterprise`).
- **Passwörter zurücksetzen** (nur lokale Nutzer).
- **Nutzer löschen**.
Zugehörige Endpunkte (Admin-only): - **Nutzer hinzufügen:** Benutzername (Pflicht), Passwort (mind. 6 Zeichen),
E-Mail (optional), **Rolle** (User/Admin), **Tarif** (Free/Premium/Enterprise).
- **Nutzer bearbeiten:** Rolle, Tarif und (für lokale Konten) ein neues Passwort
setzen. Für OIDC-Konten wird die Passwortverwaltung im Identitätsanbieter
(z. B. Keycloak) angeboten.
- **Nutzer löschen:** Entfernt das Konto endgültig (nicht für das eigene Konto).
- [`GET /users`](/docs/reference/endpoints/users#listusers) API-Referenz:
- [`POST /users`](/docs/reference/endpoints/users#createuser) [`POST /users`](/docs/reference/endpoints/users#createUser),
- [`PATCH /users/{id}`](/docs/reference/endpoints/users#updateuser) [`PATCH /users/{id}`](/docs/reference/endpoints/users#updateUser),
- [`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteuser) [`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteUser).
- [`PATCH /users/{id}/password`](/docs/reference/endpoints/users#setuserpassword)
## Audit-Log ## Tab „Tools"
Das **Audit-Log** protokolliert sicherheitsrelevante Änderungen (wer hat wann Zentraler Zugriff auf den Tool-Katalog.
was geändert). Es ist über
[`GET /audit-logs`](/docs/reference/endpoints/audit#listauditlogs) abrufbar und
filterbar nach Entitätstyp, Entitäts-ID und Limit.
## Papierkorb (Trash) - **Suchen** nach Tools.
- Tools einzeln ansehen, bearbeiten oder in den Papierkorb verschieben.
- **Massenaktion:** mehrere Tools auswählen und in den Papierkorb verschieben
(Bestätigungsdialog; soft gelöschte Tools sind aus allen öffentlichen Ansichten
entfernt und können wiederhergestellt oder endgültig gelöscht werden).
Tools werden nicht sofort gelöscht, sondern zuerst **soft gelöscht** (in den ## Tab „Audit-Log"
Papierkorb verschoben):
- **Liste:** [`GET /tools/trash`](/docs/reference/endpoints/tools#listtrashedtools) Chronologisches Protokoll aller Anlage-, Änderungs- und Löschvorgänge
- **In den Papierkorb verschieben:** [`POST /tools/trash`](/docs/reference/endpoints/tools#trashtools) (max. 100 Einträge): Aktion, Entität + ID, Zeitstempel, ausführende Person und
- **Wiederherstellen:** [`POST /tools/trash/restore`](/docs/reference/endpoints/tools#restoretools) geänderte Felder.
- **Endgültig löschen (einzeln):** [`DELETE /tools/trash`](/docs/reference/endpoints/tools#deletetrashedtools)
- **Papierkorb leeren:** [`POST /tools/trash/empty`](/docs/reference/endpoints/tools#emptytrash)
> Die Aufbewahrungsfrist des Papierkorbs (in Tagen) ist im API-Referenz: [`GET /audit-logs`](/docs/reference/endpoints/audit#listAuditLogs).
> [`VersionInfo`](/docs/reference/schemas/versioninfo)-Schema als
> `trashRetentionDays` verfügbar.
## Felder im Überblick ## Tab „System"
### User Versionsinformationen der laufenden Instanz:
| Feld | Typ | Bedeutung | - **Version** (z. B. `v0.8.1`),
| --- | --- | --- | - **Commit** (7-stelliger SHA, verlinkt zum Repository),
| `id` | integer | Eindeutige Nutzer-ID. | - **Build-Datum**,
| `username` | string | Anmeldename. | - **Papierkorb-Aufbewahrung** („N Tage" oder „Für immer").
| `email` | string? | E-Mail-Adresse. |
| `role` | string | `admin` oder `user`. | ## Tool-Verknüpfungen (Admin)
| `tier` | string | `free`, `premium` oder `enterprise`. |
| `authProvider` | string | `local` oder `oidc`. | Auf der Detailseite eines Tools kannst du als Admin **Verknüpfungen**
| `createdAt` | date-time | Erstellungszeitpunkt. | (eigene/„manual" sowie automatisch erkannte) verwalten:
- **Tool verknüpfen:** Dialog mit Tool-ID, **Beziehungstyp**
(Ähnlich / Ersetzt / Abgelöst durch) und optionalen Notizen.
- Beziehungstypen werden als Badges auf der Detailseite angezeigt.
- Manuelle Verknüpfungen lassen sich per Papierkorb-Icon wieder entfernen.
+21 -25
View File
@@ -1,37 +1,33 @@
--- ---
title: Analytics title: Analytics
order: 6 order: 10
--- ---
# Analytics # Analytics
Der Bereich **Analytics** fasst die Plattform-Statistiken zusammen — für alle Der Bereich **Analytics** (`/analytics`) ist ein öffentliches Dashboard mit
Nutzer:innen ohne Einschränkung sichtbar. Kennzahlen und Diagrammen auf Basis aller Tools und Bewertungen.
## Übersicht ## Kennzahlen (KPI-Karten)
| Widget | Quelle (Endpunkt) | Inhalt | - **Anzahl Tools** — wie viele Tools sind im Katalog erfasst.
| --- | --- | --- | - **Anzahl Bewertungen** — wie viele Bewertungen wurden insgesamt abgegeben.
| **Plattform-Kennzahlen** | [`GET /analytics/summary`](/docs/reference/endpoints/analytics#getanalyticssummary) | Gesamtzahl Tools, Bewertungen, Durchschnittswerte, Kategorienzahl. | - **Aktive Kategorien** — wie viele Kategorien existieren.
| **Top-Tools** | [`GET /analytics/top-tools`](/docs/reference/endpoints/analytics#gettoppertools) | Bestbewertete Tools nach wählbarer Metrik (Nützlichkeit, Bedienbarkeit, kombiniert). | - **Durchschnittliche Bewertung** — globaler kombinierter Wert.
| **Nach Kategorie** | [`GET /analytics/by-category`](/docs/reference/endpoints/analytics#getanalyticsbycategory) | Kennzahlen je Kategorie. |
| **Verteilung** | [`GET /analytics/rating-distribution`](/docs/reference/endpoints/analytics#getratingdistribution) | Verteilung der Bewertungswerte (optional je Tool). |
## Datenfelder ## Diagramme
### AnalyticsSummary | Diagramm | Inhalt |
| --- | --- |
| **Top 8 Tools** | Balkendiagramm der Tools mit der höchsten kombinierten Punktzahl (05) |
| **Tools je Kategorie** | Radar-Diagramm der Tool-Anzahl pro Kategorie |
| **Punkteverteilung** | Zwei horizontale Balken-Diagramme (Nützlichkeit & Bedienbarkeit) pro Stern |
| Feld | Typ | Bedeutung | Die Diagramme sind interaktiv (Tooltips beim Überfahren).
| --- | --- | --- |
| `totalTools` | integer | Anzahl aller Tools. |
| `totalRatings` | integer | Anzahl aller Bewertungen. |
| `avgUsefulness` | number? | Durchschnittliche Nützlichkeit. |
| `avgUsability` | number? | Durchschnittliche Bedienbarkeit. |
| `avgCombined` | number? | Durchschnitt kombinierter Wert. |
| `categoriesCount` | integer | Anzahl der Kategorien. |
| `mostRatedTool` | ToolWithStats | Das meistbewertete Tool. |
Vollständige Feldlisten: [`AnalyticsSummary`](/docs/reference/schemas/analyticssummary), ## API
[`TopToolEntry`](/docs/reference/schemas/topptoolentry),
[`CategoryStats`](/docs/reference/schemas/categorystats), - [`GET /analytics/summary`](/docs/reference/endpoints/analytics#getAnalyticsSummary)
[`RatingDistribution`](/docs/reference/schemas/ratingdistribution). - [`GET /analytics/top-tools`](/docs/reference/endpoints/analytics#getTopTools)
- [`GET /analytics/by-category`](/docs/reference/endpoints/analytics#getAnalyticsByCategory)
- [`GET /analytics/rating-distribution`](/docs/reference/endpoints/analytics#getRatingDistribution)
+43
View File
@@ -0,0 +1,43 @@
---
title: Bewerten
order: 7
---
# Bewerten
Auf der Detailseite eines Tools kannst du deine Erfahrung teilen. Klicke auf
**Bewertung abgeben** (erfordert ein Konto).
## Formularfelder
| Feld | Pflicht | Hinweise |
| --- | --- | --- |
| **Nützlichkeit** | Ja | 15 Sterne |
| **Bedienbarkeit** | Ja | 15 Sterne |
| **Kommentar** | Nein | Freitext |
| **Name** | Nein | Standard „Anonym" |
Neben den Feldern führt das **?Icon** direkt zur zugehörigen Feldbeschreibung
in der [Datenmodell-Referenz](/docs/reference/schemas/ratinginput).
## Was passiert nach dem Abgeben?
- Deine Bewertung wird sofort gespeichert und erscheint in der
**Bewertungsliste** der Detailseite.
- Die **Durchschnittswerte** (Nützlichkeit, Bedienbarkeit, Kombiniert) und die
**Punkteverteilung** werden aktualisiert.
- Die **Statistiken** im Bereich [Analytics](/docs/handbook/analytics) werden
neu berechnet.
## Statistik-Bereiche auf der Detailseite
- **Bewertungsübersicht:** Nützlichkeit & Bedienbarkeit als Durchschnitt mit
Fortschrittsbalken.
- **Punkteverteilung:** Anzahl der Bewertungen pro Stern (1★–5★).
- **Verlauf:** Linienchart der kombinierten/Teilwerte über die Zeit
(erst ab mehreren Bewertungen sichtbar).
## API
- [`POST /tools/{id}/ratings`](/docs/reference/endpoints/ratings#createRating) — Bewertung abgeben
- [`GET /tools/{id}/ratings`](/docs/reference/endpoints/ratings#listToolRatings) — Bewertungen eines Tools
-45
View File
@@ -1,45 +0,0 @@
---
title: Bewertungen
order: 4
---
# Bewertungen
Bewertungen sind das Herz von toolr: Sie zeigen, wie nützlich und wie gut
bedienbar ein Tool in den Augen der Community ist.
## Wie funktioniert die Bewertung?
Auf der Detailseite eines Tools vergibst du zwei Werte (15 Sterne):
- **Nützlichkeit** — Wie gut löst das Tool sein Kernproblem?
- **Bedienbarkeit** — Wie einfach ist es zu bedienen?
Optional kannst du einen **Kommentar** und deinen **Namen** hinterlassen. Die
Eingabefelder entsprechen dem Schema
[`RatingInput`](/docs/reference/schemas/ratinginput).
## Was passiert mit meiner Bewertung?
- Deine Bewertung wird sofort gespeichert und in den Durchschnittswerten des
Tools berücksichtigt.
- Jede Bewertung ist über [`GET /tools/{id}/ratings`](/docs/reference/endpoints/ratings#listtoolratings)
abrufbar.
- Der **Rating-Verlauf** über die Zeit ist über
[`GET /tools/{id}/rating-history`](/docs/reference/endpoints/tools#gettoolratinghistory)
einsehbar (grafisch auf der Detailseite).
## Datenfelder
Eine Bewertung besteht aus diesen Feldern
([`Rating`](/docs/reference/schemas/rating)):
| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `id` | integer | Eindeutige ID der Bewertung. |
| `toolId` | integer | ID des bewerteten Tools. |
| `usefulness` | integer (15) | Nützlichkeitsbewertung. |
| `usability` | integer (15) | Bedienbarkeitsbewertung. |
| `comment` | string? | Optionaler Kommentar. |
| `reviewerName` | string? | Optionaler Anzeigename des Bewerters. |
| `createdAt` | date-time | Zeitpunkt der Bewertung. |
+57 -43
View File
@@ -1,60 +1,74 @@
--- ---
title: Datenmodell & Felder title: Datenmodell
order: 8 order: 17
--- ---
# Datenmodell & Felder # Datenmodell
Dieses Handbuch erklärt die zentralen Objekte von toolr auf verständliche Dieses Kapitel erklärt die zentralen Datenobjekte von toolr auf Ebene der
Weise. Die **vollständige, maschinell generierte Feld-Referenz** findest du in Anwendung. Die vollständige, automatisch generierte Referenz aller Felder,
der [Referenz](/docs/reference/schemas/tool) — dort sind alle Typen, Pflicht- Typen und Constraints findest du in der
angaben und Constraints der aktuellen Version dokumentiert. [API-Referenz](/docs/reference/schemas/tool).
> Die Referenz ist **versionsgebunden**: Über das Versions-Dropdown oben ## Tool
> kannst du ältere API-Stände einsehen.
## Die wichtigsten Objekte Das Herzstück: ein im Katalog erfasstes Werkzeug.
### Tool | Eigenschaft | Beschreibung |
Ein Tool ist der zentrale Eintrag im Katalog
([Feld-Referenz](/docs/reference/schemas/tool)):
| Feld | Bedeutung |
| --- | --- | | --- | --- |
| `id` | Eindeutige ID. | | `id` | Eindeutige Kennung |
| `name` | Anzeigename. | | `name` | Anzeigename |
| `description` | Kurzbeschreibung. | | `description` | Beschreibung (Was macht das Tool?) |
| `category` | Kategorie-Zuordnung. | | `category` | Kategorie-Zuordnung |
| `websiteUrl` / `iconUrl` | Offizielle Website bzw. Logo-Link (optional). | | `websiteUrl` | Offizielle Website (optional) |
| `createdBy` | Nutzer, der das Tool angelegt hat (optional). | | `iconUrl` | Logo-/Icon-URL (optional) |
| `features` / `tags` | Listen von Schlüsselfähigkeiten bzw. Schlagwörtern. | | `features` | Liste von Fähigkeiten |
| `createdAt` / `updatedAt` | Zeitstempel. | | `tags` | Liste von Schlagwörtern |
| `deletedAt` / `deletedBy` | Soft-Delete-Informationen (Papierkorb). | | `createdAt` / `updatedAt` | Zeitstempel |
| `createdBy` | Erstellende Person |
| `deletedAt` / `deletedBy` | Soft-Löschung (Papierkorb) |
> **ToolWithStats** erweitert `Tool` um die Aggregatwerte `ratingCount`, Eingabe-Formulare verwenden die abgeleiteten Schemas
> `avgUsefulness`, `avgUsability` und `avgCombined` (siehe [`ToolInput`](/docs/reference/schemas/toolinput) und
> [Feld-Referenz](/docs/reference/schemas/toolwithstats)). [`ToolUpdate`](/docs/reference/schemas/toolupdate).
Aggregierte Ansichten liefert [`ToolWithStats`](/docs/reference/schemas/toolwithstats)
(z. B. mit Durchschnittsbewertung).
### Rating ## Rating (Bewertung)
Eine Bewertung (`Rating`) besteht aus `usefulness` und `usability` (jeweils Eine einzelne Bewertung zu einem Tool:
15) sowie optionalem Kommentar und Bewerternamen. Details unter
[Bewertungen](/docs/handbook/bewertungen).
### User / AuthUser - `usefulness` (Nützlichkeit, 15) und `usability` (Bedienbarkeit, 15)
- optional `comment` und ein Anzeigename (`reviewerName`)
- Zeitstempel
- **User** (Admin-Sicht): `id`, `username`, `email`, `role`, `tier`, Eingabe-Schema: [`RatingInput`](/docs/reference/schemas/ratinginput).
`authProvider`, `createdAt` — siehe [Administration](/docs/handbook/administration).
- **AuthUser** (Eigenansicht): `sub`, `email`, `name`, `preferredUsername`,
`role`, `tier`, `entitlements`, `isLocal`.
### VersionInfo ## User & Auth
`GET /version` liefert `version`, `commitSha`, `buildDate` und - [`User`](/docs/reference/schemas/user) — Benutzerkonto mit Rolle (User/Admin)
`trashRetentionDays` (siehe [Feld-Referenz](/docs/reference/schemas/versioninfo)). und Tarif (Free/Premium/Enterprise).
- [`AuthUser`](/docs/reference/schemas/authuser) — das angemeldete Profil
inklusive `entitlements` (verfügbare Features).
- [`UserPreferences`](/docs/reference/schemas/userpreferences) — Ansichts- und
Dichte-Präferenzen sowie die `watchlist` (Liste von Tool-IDs).
## Referenz selber durchsuchen ## Analytics
Nutze das **Suchfeld** in der Doku-Seitenleiste: Es durchsucht Handbuch, Die Statistik-Endpunkte liefern aggregierte Daten:
Endpunkt- und Feldbeschreibungen und springt direkt zum passenden Anker.
- [`AnalyticsSummary`](/docs/reference/schemas/analyticssummary) — globale
Kennzahlen (Anzahl Tools/Bewertungen, Kategorien, Durchschnitt).
- [`TopToolEntry`](/docs/reference/schemas/TopToolEntry) — ein Eintrag der
Top-Tools.- [`CategoryStats`](/docs/reference/schemas/categorystats) — Tool-Anzahl je
Kategorie.
- [`RatingDistribution`](/docs/reference/schemas/ratingdistribution) —
Punkteverteilung (Nützlichkeit & Bedienbarkeit).
- [`ScoreBucket`](/docs/reference/schemas/scorebucket) — ein Werte-Bucket.
## Weitere
- [`VersionInfo`](/docs/reference/schemas/versioninfo) — Version, Commit-SHA,
Build-Datum und Papierkorb-Aufbewahrung der laufenden Instanz.
- [`AuditLog`](/docs/reference/schemas/auditlog) — ein Protokolleintrag
(Aktion, Entität, Zeitstempel, Akteur, Änderungen).
+19 -16
View File
@@ -10,45 +10,48 @@ Besuch bis zum Anlegen und Bewerten eines Tools.
## 1. Anmelden ## 1. Anmelden
Die meisten Aktionen (Tool anlegen, bewerten, Watchlist) erfordern ein Die meisten Aktionen (Tool anlegen, bewerten, Watchlist, Vergleichen) erfordern
Konto. Klicke oben rechts auf **Anmelden**. Je nach Konfiguration der Instanz ein Konto. Klicke unten links auf **Anmelden**. Je nach Konfiguration der
hast du zwei Möglichkeiten: Instanz hast du zwei Möglichkeiten:
- **Lokale Konten:** Benutzername + Passwort. Der Zugang wird von einem Admin - **Lokale Konten:** Benutzername + Passwort. Der Zugang wird von einem Admin
angelegt (siehe [Administration](/docs/handbook/administration)). angelegt (siehe [Administration](/docs/handbook/administration)).
- **OIDC (SSO):** Anmelden mit dem konfigurierten Identitätsanbieter. - **OIDC (SSO):** Anmelden mit dem konfigurierten Identitätsanbieter (z. B.
Keycloak).
Welcher Modus aktiv ist, steht im [Endpunkt Welcher Modus aktiv ist, steht im Endpunkt
`GET /auth/mode`](/docs/reference/endpoints/auth#getauthmode). [`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode). Details findest
du im Abschnitt [Anmelden & Konto](/docs/handbook/konto).
## 2. Tools finden ## 2. Tools finden
Öffne den Bereich **Tools durchsuchen**: Öffne den Bereich **Tools durchsuchen**:
- **Suchen** — Volltextsuche über Name & Beschreibung. - **Suchen** — Volltextsuche über Name & Beschreibung (Tastenkürzel `/`).
- **Filtern** — nach Kategorie, Tags und Features; zusätzlich - **Filtern** — nach Kategorie, Tags, Features und Mindestbewertung
Mindestbewertung (`minRating`). (`minRating`).
- **Sortieren** — nach Aktualität, Top-Bewertung, meistbewertet, Name - **Sortieren** — nach Aktualität, Top-Bewertung, meistbewertet, Name
(auf-/absteigend) oder letztem Update. (auf-/absteigend) oder letztem Update.
Die Such-, Filter- und Sortierparameter entsprechen den Query-Parametern von Alle Optionen im Detail: [Tools finden & durchsuchen](/docs/handbook/tools-finden).
[`GET /tools`](/docs/reference/endpoints/tools#listtools).
## 3. Tool anlegen ## 3. Tool anlegen
Gehe auf **Tool hinzufügen** und fülle das Formular aus. Details zu jedem Feld Gehe auf **Tool hinzufügen** und fülle das Formular aus. Details zu jedem Feld
findest du im [Handbuch "Tool anlegen"](/docs/handbook/tool-anlegen) und in der findest du im Abschnitt [Tool anlegen](/docs/handbook/tool-anlegen) und in der
[Feld-Referenz](/docs/reference/schemas/toolinput). [Feld-Referenz](/docs/reference/schemas/toolinput).
## 4. Bewerten ## 4. Bewerten
Auf der Detailseite eines Tools kannst du **Nützlichkeit** und Auf der Detailseite eines Tools kannst du **Nützlichkeit** und **Bedienbarkeit**
**Bedienbarkeit** (jeweils 15) vergeben und optional einen Kommentar (jeweils 15) vergeben und optional einen Kommentar hinterlassen. Deine
hinterlassen. Deine Bewertung fließt sofort in die Statistiken ein. Bewertung fließt sofort in die Statistiken ein.
Siehe [Bewerten](/docs/handbook/bewerten).
## 5. Weiterführend ## 5. Weiterführend
- [Tools vergleichen](/docs/handbook/vergleichen) - [Tools vergleichen](/docs/handbook/vergleichen)
- [Watchlist](/docs/handbook/watchlist) - [Watchlist](/docs/handbook/watchlist)
- [Analytics](/docs/handbook/analytics) - [Analytics](/docs/handbook/analytics)
- [Administration & Papierkorb](/docs/handbook/administration) - [Pläne & Berechtigungen](/docs/handbook/plaene)
- [Administration](/docs/handbook/administration)
+28 -22
View File
@@ -16,35 +16,41 @@ die richtige Wahl zu treffen.
| --- | --- | --- | | --- | --- | --- |
| **Tools durchsuchen** | Katalog filtern, sortieren und durchsuchen | Alle | | **Tools durchsuchen** | Katalog filtern, sortieren und durchsuchen | Alle |
| **Tool anlegen** | Neues Tool mit Beschreibung, Kategorie, Features & Tags eintragen | Angemeldet | | **Tool anlegen** | Neues Tool mit Beschreibung, Kategorie, Features & Tags eintragen | Angemeldet |
| **Tool bearbeiten/löschen** | Eigene Tools pflegen (Ersteller:in oder Admin) | Angemeldet |
| **Bewerten** | Nützlichkeit & Bedienbarkeit (15) plus Kommentar vergeben | Angemeldet | | **Bewerten** | Nützlichkeit & Bedienbarkeit (15) plus Kommentar vergeben | Angemeldet |
| **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium |
| **Watchlist** | Tools als Favoriten speichern | Premium | | **Watchlist** | Tools als Favoriten speichern | Premium |
| **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium |
| **Kosten erfassen** | Lizenz- und Kostenmodelle je Tool eintragen | Premium |
| **Analytics** | Statistiken, Top-Tools, Verteilungen | Alle | | **Analytics** | Statistiken, Top-Tools, Verteilungen | Alle |
| **Admin** | Nutzerverwaltung, Audit-Log, Papierkorb | Admin | | **Papierkorb** | Soft-gelöschte Tools wiederherstellen oder endgültig löschen | Premium |
| **Trash** | Soft-gelöschte Tools wiederherstellen oder endgültig löschen | Admin | | **Admin** | Nutzerverwaltung, Audit-Log, Systeminformationen | Admin |
| **Redundanz** | Automatische Doppelungs-Erkennung | Admin |
## Funktionen & Felder im Detail ## Wie diese Doku aufgebaut ist
Die **Referenz** ist automatisch aus der OpenAPI-Spezifikation generiert und - **User Guide** (diese Seiten): Schritt-für-Schritt-Anleitungen für alle
deckt damit garantiert *alle* Endpunkte und Datenfelder der aktuellen Version Funktionen — von den [Ersten Schritten](/docs/handbook/getting-started) bis
ab: zur [Administration](/docs/handbook/administration).
- **API-Referenz**: automatisch aus der OpenAPI-Spezifikation generiert — alle
[Endpunkte](/docs/reference/endpoints/tools) und
[Datenfelder](/docs/reference/schemas/toolinput) der aktuellen Version.
- **Release-Notes**: Was ist in welcher [Version](/docs/releases/v0.8.1) neu.
- [Endpunkte](/docs/reference/endpoints/tools) — jede API-Operation mit ## Der Einstieg
Parametern und Antwort-Schemas.
- [Datenmodell & Felder](/docs/reference/schemas/tool) — jedes Feld mit Typ,
Pflichtstatus und Bedeutung.
> Die Referenz ist **versionsgebunden**: Wähle oben rechts eine ältere Version, Der schnellste Weg:
> um den API-Stand dieses Releases zu sehen.
## Erste Schritte 1. **Anmelden** — ohne Konto kannst du nur stöbern
(siehe [Erste Schritte](/docs/handbook/getting-started#1-anmelden)).
2. **Tools finden** — Suche, Filter und Sortierung im Bereich
[Tools durchsuchen](/docs/handbook/tools-finden).
3. **Tool anlegen** — über „Tool hinzufügen"
([Anleitung](/docs/handbook/tool-anlegen)).
4. **Bewerten** — auf der Detailseite eines Tools
([Anleitung](/docs/handbook/bewerten)).
- Neu hier? Starte mit dem [Erste-Schritte-Guide](/docs/handbook/getting-started). ## Kontakt & Quellcode
- Möchtest du ein Tool eintragen? Siehe [Tool anlegen](/docs/handbook/tool-anlegen).
- Formulare zeigen neben jedem Feld ein **Hilfe-Icon (?)**, das direkt zur
Erklärung des Felds in der Doku springt.
## Wo ist der Quellcode? Der Quellcode liegt unter
[git.kubebase.de/admin/tool-evaluator](https://git.kubebase.de/admin/tool-evaluator) —
Über das **Repository-Logo oben rechts** gelangst du direkt zum Quellcode auf über das Repository-Icon oben rechts erreichst du ihn jederzeit.
GitHub.
+57
View File
@@ -0,0 +1,57 @@
---
title: Anmelden & Konto
order: 3
---
# Anmelden & Konto
## Anmelden
Klicke unten links in der Seitenleiste auf **Anmelden**. Je nach Konfiguration
der Instanz:
- **Lokale Konten:** Benutzername und Passwort eingeben. Die Konten werden von
einem Admin angelegt (siehe [Administration](/docs/handbook/administration)).
- **OIDC (SSO):** Du wirst an den konfigurierten Identitätsanbieter
weitergeleitet und meldest dich dort an.
Der aktive Modus steht im Endpunkt
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode).
> Die Login-Seite erreichst du direkt unter `/login`. Nach erfolgreicher
> Anmeldung wirst du zur ursprünglich aufgerufenen Seite zurückgeleitet.
## Benutzerprofil
Dein Profil (Avatar, Name, E-Mail, Tarif) siehst du unten links im
Benutzermenü. Dort stehen dir folgende Aktionen zur Verfügung:
- **Watchlist** — deine gespeicherten Tools (nur mit dem entsprechenden Tarif).
- **Papierkorb** — wiederherstellbare, gelöschte Tools (Premium/Enterprise).
- **Passwort ändern** — für lokale Konten direkt in toolr; für OIDC-Konten wird
die Passwortverwaltung im Identitätsanbieter angeboten.
- **Abmelden** — beendet deine Sitzung.
## Passwort ändern (lokales Konto)
1. Öffne das Benutzermenü unten links.
2. Wähle **Passwort ändern**.
3. Gib das **aktuelle** sowie ein **neues** Passwort ein (mind. 6 Zeichen) und
bestätige es.
4. Speichern — das Passwort wird sofort übernommen.
API-Referenz: [`POST /auth/me/password`](/docs/reference/endpoints/auth#changeMyPassword).
## Anzeigeeinstellungen
Über die Schaltflächen oben rechts kannst du:
- **Sprache** wechseln (Deutsch / Englisch),
- **Theme** umschalten (Hell / Dunkel / System),
- die **Listenansicht** und **Dichte** im Bereich Tools durchsuchen anpassen
(siehe [Tools finden & durchsuchen](/docs/handbook/tools-finden)).
Deine Präferenzen (inkl. Watchlist) werden im Endpunkt
[`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences)
gespeichert und über [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences)
aktualisiert.
+39
View File
@@ -0,0 +1,39 @@
---
title: Kosten erfassen
order: 12
---
# Kosten erfassen
Auf der Detailseite eines Tools kannst du Kosten- und Lizenzmodelle eintragen,
damit die Gesamtkosten je Tool transparent werden.
> Kosten ist ein **Premium-Feature** (`costs`, Premium/Enterprise). Admins
> haben immer Zugriff.
## Kosten hinzufügen
Klicke auf **Kosten hinzufügen** im Kosten-Bereich der Detailseite und fülle
das Formular aus:
| Feld | Hinweise |
| --- | --- |
| **Lizenztyp** | Free / Subscription / One-Time / Usage-Based |
| **Abrechnungszeitraum** | Nur für „Subscription": Monatlich / Quartalsweise / Jährlich |
| **Kosten** | Betrag als Zahl |
| **Währung** | EUR / USD / GBP / CHF |
| **Notizen** | Optionaler Freitext |
Speichern legt den Eintrag an. Jeder Kosten-Eintrag wird als Karte mit
Lizenz-Badge, Abrechnungszeitraum, Betrag (`Betrag Währung` bzw. „Free") und
Notizen angezeigt.
## Kosten bearbeiten & löschen
Beim Überfahren einer Kosten-Karte erscheinen die Aktionen **Bearbeiten**
(Bleistift) und **Löschen** (Papierkorb).
## API
Die Kosten-Daten werden über die Tool-Endpunkte verwaltet
(siehe [API-Referenz](/docs/reference/endpoints/tools)).
+45
View File
@@ -0,0 +1,45 @@
---
title: Papierkorb
order: 15
---
# Papierkorb
Der **Papierkorb** (`/trash`) enthält soft gelöschte Tools. Mit Papierkorb-Zugang
können sie wiederhergestellt werden; endgültiges Löschen ist Admins vorbehalten.
> Der Papierkorb ist ein **Premium-Feature** (`trash`, Premium/Enterprise).
> Admins haben immer Zugriff.
## Zugang
Der Papierkorb ist über das Benutzermenü oder die Seitenleiste erreichbar.
Ohne `trash`-Berechtigung erscheint ein Hinweis auf den Tarifwechsel.
## Wiederherstellen
- Markiere ein oder mehrere Tools (Checkboxen).
- Klicke auf **Wiederherstellen (N)** — die Tools erscheinen wieder in allen
öffentlichen Ansichten.
> Wiederherstellen steht jeder Person mit Papierkorb-Zugang zur Verfügung.
## Endgültig löschen (nur Admin)
- **Löschen (N)** entfernt die ausgewählten Tools **endgültig** — inklusive
aller Bewertungen, Kosten und Verknüpfungen. Das kann nicht rückgängig
gemacht werden.
- **Papierkorb leeren** entfernt alle soft gelöschten Tools endgültig.
## Tabelle
Der Papierkorb listet: Name, Kategorie, **Gelöscht am** (`tt.MM.jjjj HH:mm`),
**Gelöscht von** sowie Aktionen (Wiederherstellen; Löschen nur Admin). Die Suche
filtert nach Namen.
## API
- [`GET /tools/trash`](/docs/reference/endpoints/tools#listTrashedTools) — Liste
- [`POST /tools/trash/restore`](/docs/reference/endpoints/tools#restoreTools) — Wiederherstellen
- [`DELETE /tools/trash`](/docs/reference/endpoints/tools#deleteTrashedTools) — Endgültig löschen (Admin)
- [`POST /tools/trash/empty`](/docs/reference/endpoints/tools#emptyTrash) — Papierkorb leeren (Admin)
+45
View File
@@ -0,0 +1,45 @@
---
title: Pläne & Berechtigungen
order: 11
---
# Pläne & Berechtigungen
toolr unterscheidet **Tarife** (Tier) und **Rollen**. Admins umgehen alle
Feature-Beschränkungen.
## Tarife
| Tarif | Beschreibung |
| --- | --- |
| **Free** | Grundfunktionen: suchen, filtern, ansehen, Analytics |
| **Premium** | Zusätzlich Watchlist, Vergleichen, Papierkorb, Kosten |
| **Enterprise** | Alle Premium-Features + erweiterter Support |
### Feature-Berechtigungen
Premium/Enterprise schalten folgende Features frei:
| Feature | Funktion | Mehr erfahren |
| --- | --- | --- |
| `compare` | Tools vergleichen | [Vergleichen](/docs/handbook/vergleichen) |
| `watchlist` | Favoritenliste | [Watchlist](/docs/handbook/watchlist) |
| `trash` | Papierkorb (soft gelöschte Tools) | [Papierkorb](/docs/handbook/papierkorb) |
| `costs` | Kosten-/Lizenzmodelle erfassen | [Kosten erfassen](/docs/handbook/kosten) |
Fehlt dir ein Feature, zeigt die App einen **Upgrade-Hinweis** mit Link zur
Tarifverwaltung.
## Rollen
| Rolle | Berechtigungen |
| --- | --- |
| **User** | Standard-Konto: Tools anlegen/bewerten, eigene Tools bearbeiten |
| **Admin** | Alle User-Rechte + Verwaltung, Audit-Log, Redundanz, Papierkorb leeren, Tool-Verknüpfungen |
Admins passieren **alle** Feature-Checks — auch ohne Premium-Tarif.
## Tarif-/Rollenverwaltung
Die Zuordnung von Rolle und Tarif wird durch Admins im Bereich
[Administration](/docs/handbook/administration) (Tab „Nutzer") verwaltet.
+42
View File
@@ -0,0 +1,42 @@
---
title: Redundanz-Dashboard
order: 14
---
# Redundanz-Dashboard
Das **Redundanz-Dashboard** (`/admin/redundancy`) ist ein Admin-Werkzeug zur
automatischen Erkennung doppelter oder stark überlappender Tools — jeweils
pro Kategorie — inklusive Kosten- und Bewertungsvergleich.
> Der Zugriff ist ausschließlich Admins vorbehalten (die API ist
> admin-geschützt).
## Aufbau
- **Pro Kategorie** wird eine Gruppe angezeigt: Name der Kategorie,
Anzahl Tools und Vergleiche sowie ggf. die **gesamten monatlichen Kosten**
(z. B. `€X.XX/mo gesamt`).
- Jedes Tool wird als Karte dargestellt: Name, monatliche Kosten, Anzahl der
Bewertungen, kombinierte Bewertung, Lizenz-Badges und Feature-Anzahl.
## Vergleiche & Empfehlungen
Für jedes Tool-Paar erscheint:
- Tool A vs. Tool B, jeweils mit Bewertung (`X.X ★`) und monatlichen Kosten.
- **Überlappung** in Prozent (Fortschrittsbalken in der Mitte).
- Eine **Empfehlung** mit Konfidenz-Farbe:
- **hoch** (grün), **mittel** (gelb), **niedrig** (grau)
- Das empfohlene, bessere Tool wird mit „Daumen hoch" markiert und begründet.
## Manuelle Bewertung
Du kannst ein Paar manuell bewerten: Klicke auf Tool A oder Tool B, um
festzuhalten, welches besser ist. Die Auswahl wird gespeichert und die
Darstellung aktualisiert.
## API
- [`GET /api/admin/redundancy`](#) — Daten laden (admin-geschützt)
- [`POST /api/admin/redundancy/evaluate`](#) — manuelle Bewertung speichern
+40
View File
@@ -0,0 +1,40 @@
---
title: Tastenkürzel & Kommandopalette
order: 16
---
# Tastenkürzel & Kommandopalette
## Kommandopalette
Die Kommandopalette ist die zentrale Schnellnavigation:
- Öffnen mit **`⌘K`** (macOS) bzw. **`Ctrl+K`** (Windows/Linux).
- Alternativ über die Suchleiste oben rechts („Tools suchen… ⌘K") oder das
Such-Icon auf Mobilgeräten.
### Leerer Zustand
Ohne Eingabe zeigt die Palette:
- **Zuletzt angesehen** — die letzten 5 Tools, die du besucht hast.
- **Navigation** — Tools durchsuchen, Tool hinzufügen, Analytics sowie
(abhängig von Berechtigungen) Watchlist, Papierkorb und Admin.
### Suche
Tippe, um live nach Tools zu suchen (max. 10 Ergebnisse, inkl. Bewertung
`X.X★`).
## Tastenkürzel im Überblick
| Kürzel | Aktion |
| --- | --- |
| `⌘K` / `Ctrl+K` | Kommandopalette öffnen |
| `/` | Suche im Bereich „Tools durchsuchen" fokussieren |
## Weitere Hinweise
- **Zuletzt angesehen** wird lokal im Browser gespeichert (max. 5 Einträge).
- Die Seitenleiste (linke Navigation) ist auf Desktop einklappbar; der
Breadcrumb oben zeigt deinen aktuellen Ort.
+34 -33
View File
@@ -1,49 +1,50 @@
--- ---
title: Tool anlegen & bearbeiten title: Tool anlegen
order: 3 order: 5
--- ---
# Tool anlegen & bearbeiten # Tool anlegen
## Neues Tool anlegen Um ein neues Tool zum Katalog hinzuzufügen, klicke auf **Tool hinzufügen**
(`/tools/new`). Das Anlegen erfordert ein Konto — ohne Anmeldung erscheint ein
Hinweis mit Login-Button.
Unter **Tool hinzufügen** legst du ein neues Tool an. Die Felder entsprechen ## Formularfelder
dem Eingabeschema [`ToolInput`](/docs/reference/schemas/toolinput):
| Feld | Pflicht | Bedeutung | | Feld | Pflicht | Hinweise |
| --- | --- | --- | | --- | --- | --- |
| **Name** | ja | Anzeigename des Tools (min. 2 Zeichen). | | **Name** | Ja | Mind. 2 Zeichen |
| **Beschreibung** | ja | Was tut das Tool, warum nutzen es Leute? (min. 10 Zeichen) | | **Kategorie** | Ja | Auswahlliste; neue Kategorien lassen sich direkt anlegen |
| **Kategorie** | ja | Zugeordnete Kategorie (aus bestehenden Kategorien wählbar). | | **Website URL** | Nein | Gültige URL (z. B. `https://...`) |
| **Website-URL** | nein | Offizielle Website (`https://…`). | | **Icon / Logo URL** | Nein | Gültige URL; Vorschau wird live angezeigt |
| **Icon-/Logo-URL** | nein | Direktlink zu einem Logo-Bild. | | **Beschreibung** | Ja | Mind. 10 Zeichen; beschreibe, was das Tool tut |
| **Features** | nein | Schlüsselfähigkeiten, z. B. „Echtzeit-Kollaboration“. Bereits bekannte Features sind auswählbar. | | **Features** | Nein | Dynamische Liste mit Autovervollständigung (max. 6) |
| **Tags** | nein | Schlagwörter zum Auffinden. Bereits bekannte Tags sind auswählbar. | | **Tags** | Nein | Dynamische Liste mit Autovervollständigung |
> Hinter jedem Label findest du ein **Hilfe-Icon (?)** — es verlinkt direkt Neben jedem Feld führt das **?Icon** direkt zur zugehörigen Feldbeschreibung
> zur Feldbeschreibung in dieser Doku. in der [Datenmodell-Referenz](/docs/reference/schemas/toolinput).
### Hinweise ### Kategorie
- **Features & Tags** sind Listen. Über **+ Feature / + Tag** fügst du weitere - Tippe, um nach bestehenden Kategorien zu suchen.
Einträge hinzu; über das ✕-Symbol entfernst du sie. - Wähle **+ Erstelle „..."**, um eine neue Kategorie anzulegen.
- URLs müssen absolut und gültig sein.
- Leere Einträge in Feature-/Tag-Listen werden beim Speichern verworfen.
## Tool bearbeiten ### Features & Tags
Auf der Detailseite eines Tools öffnet **Bearbeiten** das Formular mit den - **Feature hinzufügen** / **Tag hinzufügen** hängt eine neue Zeile an.
aktuellen Werten. Du kannst Name, Beschreibung, Kategorie, URLs, Features und - Die Eingabefelder schlagen bestehende Features/Tags vor
Tags ändern. Nur angemeldete Nutzer:innen können Tools bearbeiten. (Autovervollständigung, max. 6 Vorschläge).
- Mit dem **×**Button entfernst du einzelne Zeilen.
- Features und Tags helfen beim Filtern und Wiederfinden.
## Tool löschen ## Speichern
Über die Detailseite kannst du ein Tool **in den Papierkorb verschieben** Klicke auf **Tool hinzufügen**. Nach erfolgreicher Anlage wirst du auf die
(Soft-Delete). Es verschwindet aus dem Katalog, bleibt aber im Papierkorb Detailseite des neuen Tools weitergeleitet.
erhalten. Siehe [Administration & Papierkorb](/docs/handbook/administration).
## Zugehörige Endpunkte ## API
- [`POST /tools`](/docs/reference/endpoints/tools#createtool) — Tool anlegen - [`POST /tools`](/docs/reference/endpoints/tools#createTool) — Tool anlegen
- [`PATCH /tools/{id}`](/docs/reference/endpoints/tools#updatetool) — Tool bearbeiten - [`GET /categories`](/docs/reference/endpoints/tools#listCategories) — Kategorien
- [`DELETE /tools/{id}`](/docs/reference/endpoints/tools#deletetool) — Tool löschen - [`GET /features/all`](/docs/reference/endpoints/tools#listAllFeatures) — Features
- [`GET /tags/all`](/docs/reference/endpoints/tools#listAllTags) — Tags
+37
View File
@@ -0,0 +1,37 @@
---
title: Tool bearbeiten & löschen
order: 6
---
# Tool bearbeiten & löschen
## Bearbeiten
Auf der Detailseite eines Tools findest du die Schaltfläche **Bearbeiten**
(nur für die Person, die das Tool angelegt hat, sowie für Admins).
Die Bearbeitungsseite (`/tools/:id/edit`) enthält dieselben Felder wie beim
Anlegen (Name, Kategorie, Website/Icon-URL, Beschreibung, Features, Tags) —
bereits mit den aktuellen Werten befüllt.
- **Speichern** übernimmt die Änderungen.
- **Abbrechen** führt zurück zur Detailseite.
API-Referenz: [`PATCH /tools/{id}`](/docs/reference/endpoints/tools#updateTool).
## Löschen
Über **Löschen** auf der Detailseite wird das Tool entfernt. Das Verhalten
hängt von deinem Tarif ab:
- **Mit Papierkorb-Zugang** (Premium/Enterprise oder Admin): Das Tool wird
**soft gelöscht** — es verschwindet aus allen öffentlichen Ansichten, kann
aber im [Papierkorb](/docs/handbook/papierkorb) wiederhergestellt oder
endgültig gelöscht werden.
- **Ohne Papierkorb-Zugang:** Das Tool wird **endgültig** gelöscht und kann
nicht wiederhergestellt werden.
Die Löschung ist nur für die Person, die das Tool angelegt hat, sowie für
Admins möglich.
API-Referenz: [`DELETE /tools/{id}`](/docs/reference/endpoints/tools#deleteTool).
+71
View File
@@ -0,0 +1,71 @@
---
title: Tools finden & durchsuchen
order: 4
---
# Tools finden & durchsuchen
Der Bereich **Tools durchsuchen** (`/tools`) ist der Einstieg in den Katalog.
Hier kombinierst du Suche, Filter und Sortierung, um genau die Tools zu finden,
die dich interessieren.
## Suche
- Die **Suchleiste** durchsucht Name und Beschreibung (Volltext).
- Tastenkürzel: Drücke **`/`**, um die Suche zu fokussieren.
- Die Eingabe ist deaktiviert (Debounce), damit bei jedem Tastendruck sofort
nachgefiltert wird.
## Filtern
Über die Schaltfläche **Filter** (mit Badge für die Anzahl aktiver Filter)
öffnest du den Filter-Popover mit:
- **Tags** — Auswahl über Checkboxen (scrollbare Liste).
- **Features** — Auswahl über Checkboxen.
- **Mindestbewertung** — Schieberegler von 0 bis 5 (Schritte von 0,5); zeigt
z. B. „3.0+" an.
Aktive Filter erscheinen als **entfernbare Chips** über der Ergebnisliste.
Mit **Filter zurücksetzen** bzw. **Alle entfernen** räumst du sie wieder auf.
## Sortieren
Über das Dropdown **Sortieren** stehen folgende Optionen zur Verfügung:
| Sortierung | Beschreibung |
| --- | --- |
| Neueste | Neue Tools zuerst |
| Top bewertet | Nach kombinierter Bewertung |
| Meistbewertet | Nach Anzahl der Bewertungen |
| Name (AZ) | Alphabetisch aufsteigend |
| Name (ZA) | Alphabetisch absteigend |
| Zuletzt aktualisiert | Nach letztem Update |
## Ansicht & Dichte
- **Ansicht wechseln:** Raster / Tabelle / Zeilen.
- **Dichte:** gemütlich / kompakt (Schieberegler).
Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer:innen
zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und
Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen
kannst.
## Tabellenansicht
In der Tabellenansicht sind die Spalten **Tool**, **Bewertung** und **Anzahl
Bewertungen** sortierbar. Beim Überfahren einer Zeile erscheint eine Vorschau
mit Bewertungsdetails, Tags und Mini-Balken.
## Auswählen für Vergleich & Watchlist
- Auf jeder Karte/Zeile findest du ein **Vergleichs-Icon**, mit dem du Tools zur
[Vergleichsleiste](/docs/handbook/vergleichen) hinzufügst.
- Das **Lesezeichen-Icon** speichert Tools in deiner
[Watchlist](/docs/handbook/watchlist) (nur mit dem entsprechenden Tarif).
## API
Alle Such-, Filter- und Sortierparameter entsprechen den Query-Parametern von
[`GET /tools`](/docs/reference/endpoints/tools#listTools).
-46
View File
@@ -1,46 +0,0 @@
---
title: Vergleichen & Watchlist
order: 5
---
# Vergleichen & Watchlist
Diese Funktionen sind für **Premium-Nutzer:innen** verfügbar.
## Tools vergleichen
Mit **Vergleichen** stellst du mehrere Tools nebeneinander und siehst deren
Daten auf einen Blick — ideal für die Tool-Auswahl.
1. Füge Tools über die **Vergleichsleiste** (Vergleichs-Icon auf Karten) hinzu.
2. Öffne den Bereich **Vergleichen**. Die Tools erscheinen in der gewählten
Reihenfolge.
3. Die Vergleichsansicht zeigt pro Tool die wichtigsten Felder und
Durchschnittswerte.
Der zugrunde liegende Endpunkt ist
[`GET /compare`](/docs/reference/endpoints/tools#listcomparetools) mit dem
Parameter `ids` (kommagetrennt). Ohne Premium-Berechtigung liefert er `403`.
## Watchlist
Die **Watchlist** ist deine persönliche Favoritenliste:
- **Hinzufügen/Entfernen:** Nutze das Lesezeichen-Symbol auf der
Tool-Karte oder der Detailseite.
- Die gespeicherte Reihenfolge bleibt erhalten.
- Sie wird über [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getmewatchlist)
geladen; das Setzen erfolgt über
[`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updatemepreferences)
(Feld `watchlist`).
### Feld `watchlist`
Das Feld `watchlist` in [`UserPreferences`](/docs/reference/schemas/userpreferences)
ist ein Array von Tool-IDs in gespeicherter Reihenfolge:
| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `view` | string | Ansichtsmodus (`grid`, `table`, `rows`). |
| `density` | string | Dichte (`cozy`, `compact`). |
| `watchlist` | integer[] | Tool-IDs in Favoriten-Reihenfolge. |
+46
View File
@@ -0,0 +1,46 @@
---
title: Vergleichen
order: 9
---
# Vergleichen
Mit der Vergleichsfunktion stellst du mehrere Tools **nebeneinander** gegenüber —
ideal, um eine fundierte Entscheidung zu treffen.
> Vergleichen ist ein **Premium-Feature** (Premium/Enterprise) und steht Admins
> immer zur Verfügung.
## Tools auswählen
1. Im Bereich **Tools durchsuchen** klickst du auf jeder Karte/Zeile auf das
**Vergleichs-Icon** (Waage).
2. Unten erscheint die **Vergleichsleiste** mit den ausgewählten Tools als
Chips. Du kannst einzelne Tools entfernen (×) oder die Auswahl leeren.
3. Klicke auf **Vergleichen (N)**, um zur Vergleichsansicht zu gelangen.
> Ohne Premium-Tarif ist der Button gesperrt (Schloss-Icon). Über den
> Dialog gelangst du zum Tarifwechsel
> (siehe [Pläne & Berechtigungen](/docs/handbook/plaene)).
## Die Vergleichsansicht
Die Ansicht zeigt eine Tabelle mit einer Spalte pro Tool. Zeilen:
| Zeile | Inhalt |
| --- | --- |
| **Bewertung** | Sterne + Wert (z. B. `4.2/5`) |
| **Nützlichkeit** | Wert (X.X/5) |
| **Bedienbarkeit** | Wert (X.X/5) |
| **Anzahl Bewertungen** | Anzahl |
| **Beschreibung** | Text |
| **Features** | Badges |
| **Tags** | Badges |
| **Zuletzt aktualisiert** | Datum |
Der **beste Wert** pro Zeile wird hervorgehoben (mit Trophäen-Icon).
## API
Die Vergleichsansicht liest die Daten über
[`GET /compare`](/docs/reference/endpoints/tools#listCompareTools).
+38
View File
@@ -0,0 +1,38 @@
---
title: Watchlist
order: 8
---
# Watchlist
Die **Watchlist** ist eine persönliche Favoritenliste. Tools darin kannst du
jederzeit per Klick wieder aufrufen und vergleichen.
> Die Watchlist ist ein **Premium-Feature** (Premium/Enterprise) und steht
> Admins immer zur Verfügung.
## Voraussetzung
Du benötigst einen Tarif mit `watchlist`-Berechtigung. Fehlt diese, erscheint
beim Lesezeichen ein Hinweis auf den Tarifwechsel
(siehe [Pläne & Berechtigungen](/docs/handbook/plaene)).
## Tool speichern
- Auf jeder Karte/Zeile im Bereich **Tools durchsuchen** findest du das
**Lesezeichen-Icon**.
- Ein Klick speichert das Tool in deiner Watchlist — das Icon wird gefüllt.
- Ein erneuter Klick entfernt es wieder.
## Watchlist ansehen
Öffne die Watchlist über das Benutzermenü oder die Seitenleiste. Sie zeigt alle
gespeicherten Tools als Karten. Das gefüllte Lesezeichen auf einer Karte
entfernt das Tool aus der Liste.
## Wo wird die Watchlist gespeichert?
Die Watchlist ist eine Liste von Tool-IDs in deinen **Benutzerpräferenzen**.
Damit ist sie geräteübergreifend mit deinem Konto verbunden.
API-Referenz: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeWatchlist).
+47
View File
@@ -0,0 +1,47 @@
# v0.8.1 — Release Notes
**Datum:** 2026-08-03 · **Tag:** [`v0.8.1`](https://git.kubebase.de/admin/tool-evaluator/tags/v0.8.1)
## Neue Features
- **Standalone-Doku-Seite**: Die Dokumentation steht jetzt als eigene,
mkdocs-artige Seite unter `toolr.kubebase.de/docs` — ohne die App-Shell
(eigene Kopfzeile mit Repo-Link, Versions-Dropdown, Suche, Theme-Umschalter
und Link zurück zur App).
- **Navigation umbenannt**: Der Seitenleisten-Eintrag heißt jetzt **„Hilfe"**
und führt zur Standalone-Doku.
- **User Guide komplett überarbeitet**: 17 Handbuch-Seiten mit
Schritt-für-Schritt-Anleitungen für alle Funktionen (Tools finden, Tool
anlegen, Bewerten, Watchlist, Vergleichen, Kosten, Analytics, Pläne,
Administration, Redundanz, Papierkorb, Tastenkürzel, Datenmodell).
## Fixes & Verbesserungen
- Referenz-Links sind jetzt unabhängig von Groß-/Kleinschreibung
(Schema-/Endpoint-Slugs wie `toolinput` und `ToolInput` funktionieren beide).
- Handbuch-Links auf Endpunkt-Anker korrigiert (PascalCase-OperationIds).
- Veraltete, kaputte Handbuch-Links (`vergleichen`, `watchlist` …) ersetzt.
- Dokumentations-Tabellenkopfzeilen und Hinweistexte in der Doku-Seite über
i18n internationalisiert (de/en).
## API-Änderungen
- Keine Änderungen an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine. Die Doku-Seite ist unter `/docs` erreichbar wie
bisher; lediglich die Darstellung ist nun eigenständig.
## Bekannte Einschränkungen
- Handbuch & Referenz gelten für die aktuelle Version; ältere Versionen zeigen
ihre Release-Notes und einen Referenz-Snapshot, sofern beim Release erzeugt
(`node scripts/src/generate-docs.mjs --snapshot vX.Y.Z`).
## Links
- Commit: [`<short-sha>`](https://git.kubebase.de/admin/tool-evaluator/commit/<short-sha>)
- Tag: [`v0.8.1`](https://git.kubebase.de/admin/tool-evaluator/tags/v0.8.1)