Compare commits

...

7 Commits

Author SHA1 Message Date
opencode d777ee9211 docs: fill v0.9.3 release notes commit hash
Build & Push Docker Image / build (push) Successful in 3m4s
2026-08-06 07:08:13 +02:00
opencode 01982964bb feat(design): neon/AI look with gradient loading states 2026-08-06 07:08:01 +02:00
opencode f3b4fa553b docs: fill v0.9.2 release notes commit hash
Build & Push Docker Image / build (push) Successful in 1m47s
2026-08-05 07:44:48 +02:00
opencode e164d51574 feat: compare limit 9, format-aware import placeholder, help links
- Raise compare limit from 8 to 9 (server + client, toast on overflow)
- Make import textarea placeholder match selected format (CSV/JSON/YAML/auto)
- Add GuideHelp links to admin create/edit user dialogs and tool import dialog
2026-08-05 07:40:47 +02:00
opencode e66a332270 fix(docs): release file without releases/ prefix to avoid double path
Build & Push Docker Image / build (push) Successful in 3m1s
index.json stored file='releases/vX.Y.Z.de.md' but ReleaseNoteView
prepends 'releases/' again, producing releases/releases/... (404).
Store the bare filename so the view resolves docs/releases/vX.Y.Z.de.md.
2026-08-05 00:32:56 +02:00
opencode 48d25b668d docs: fill release notes commit hash
Build & Push Docker Image / build (push) Failing after 57s
2026-08-05 00:15:00 +02:00
opencode 6eb3dfd8f9 docs: cut to v0.9.0 with unified .de/.en naming
- Remove all prior release notes and version snapshots (v0.6.0-v0.8.6)
- Rename handbook to *.de.md; keep *.en.md
- New release notes v0.9.0.de.md/.en.md with v0.9.0 snapshot
- generate-docs.mjs: .de/.en convention incl. search index and en-fallback
- docs.tsx: release fallback now uses version.de.md
- Wording: neutral tagline, anonymous user, no gender forms
- Add docs/examples/import-tools.yaml and link from administration docs
2026-08-05 00:13:41 +02:00
208 changed files with 4829 additions and 914 deletions
+2 -2
View File
@@ -268,8 +268,8 @@ router.get("/compare", requireFeature("compare"), async (req, res): Promise<void
res.status(400).json({ error: "Provide at least one ids value, e.g. ?ids=1,2,3" }); res.status(400).json({ error: "Provide at least one ids value, e.g. ?ids=1,2,3" });
return; return;
} }
if (ids.length > 8) { if (ids.length > 9) {
res.status(400).json({ error: "Maximum of 8 tools can be compared" }); res.status(400).json({ error: "Maximum of 9 tools can be compared" });
return; return;
} }
const tools = await db.select().from(toolsTable).where(and(isNull(toolsTable.deletedAt), inArray(toolsTable.id, ids))); const tools = await db.select().from(toolsTable).where(and(isNull(toolsTable.deletedAt), inArray(toolsTable.id, ids)));
@@ -23,7 +23,7 @@ export function CompareBar({
if (tools.length === 0) return null; if (tools.length === 0) return null;
return ( return (
<div className="fixed bottom-4 left-1/2 -translate-x-1/2 z-50 w-[min(96vw,42rem)]"> <div className="fixed bottom-4 left-1/2 -translate-x-1/2 z-50 w-[min(96vw,42rem)]">
<div className="rounded-xl border bg-popover/95 backdrop-blur shadow-lg p-3"> <div className="neon-glow rounded-xl border bg-popover/95 backdrop-blur shadow-lg p-3">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Scale className="w-4 h-4 text-muted-foreground shrink-0" /> <Scale className="w-4 h-4 text-muted-foreground shrink-0" />
<div className="flex items-center gap-1.5 flex-1 min-w-0 overflow-x-auto"> <div className="flex items-center gap-1.5 flex-1 min-w-0 overflow-x-auto">
@@ -16,7 +16,7 @@ export function ToolCard({
watchlist?: { watched: boolean; onToggle: () => void }; watchlist?: { watched: boolean; onToggle: () => void };
}) { }) {
return ( return (
<Card className="hover-elevate transition-all flex flex-col h-full cursor-pointer hover:border-primary/50"> <Card className="hover-elevate transition-all flex flex-col h-full cursor-pointer hover:border-primary/50 hover:neon-glow-primary">
<Link href={`/tools/${tool.id}`} className="flex flex-col h-full p-0 m-0"> <Link href={`/tools/${tool.id}`} className="flex flex-col h-full p-0 m-0">
<CardHeader className="pb-3"> <CardHeader className="pb-3">
<div className="flex items-start gap-3 mb-2"> <div className="flex items-start gap-3 mb-2">
@@ -7,6 +7,7 @@ import { Textarea } from "@/components/ui/textarea";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { GuideHelp } from "@/components/guide-help";
import { Upload, FileUp, CheckCircle2, AlertCircle } from "lucide-react"; import { Upload, FileUp, CheckCircle2, AlertCircle } from "lucide-react";
type Format = "auto" | "csv" | "json" | "yaml"; type Format = "auto" | "csv" | "json" | "yaml";
@@ -62,14 +63,24 @@ export function ToolImportDialog({
const canSubmit = data.trim().length > 0 && !importTools.isPending; const canSubmit = data.trim().length > 0 && !importTools.isPending;
const placeholder =
format === "csv"
? t("adminTools.importTextareaPlaceholderCsv")
: format === "json"
? t("adminTools.importTextareaPlaceholderJson")
: format === "yaml"
? t("adminTools.importTextareaPlaceholderYaml")
: t("adminTools.importTextareaPlaceholderAuto");
return ( return (
<Dialog open={open} onOpenChange={handleClose}> <Dialog open={open} onOpenChange={handleClose}>
<DialogContent className="sm:max-w-2xl"> <DialogContent className="sm:max-w-2xl">
<DialogHeader> <DialogHeader className="flex flex-row items-center justify-between gap-2">
<DialogTitle className="flex items-center gap-2"> <DialogTitle className="flex items-center gap-2">
<Upload className="w-4 h-4" /> <Upload className="w-4 h-4" />
{t("adminTools.importTitle")} {t("adminTools.importTitle")}
</DialogTitle> </DialogTitle>
<GuideHelp guide="administration" label={t("adminTools.importTitle")} />
</DialogHeader> </DialogHeader>
<div className="space-y-4 py-2"> <div className="space-y-4 py-2">
@@ -131,7 +142,7 @@ export function ToolImportDialog({
<Textarea <Textarea
value={data} value={data}
onChange={(e) => setData(e.target.value)} onChange={(e) => setData(e.target.value)}
placeholder={t("adminTools.importTextareaPlaceholder")} placeholder={placeholder}
className="min-h-[220px] font-mono text-sm" className="min-h-[220px] font-mono text-sm"
data-testid="input-tool-import-data" data-testid="input-tool-import-data"
/> />
@@ -12,14 +12,14 @@ const buttonVariants = cva(
variant: { variant: {
default: default:
// @replit: no hover, and add primary border // @replit: no hover, and add primary border
"bg-primary text-primary-foreground border border-primary-border", "bg-primary text-primary-foreground border border-primary-border hover:neon-glow-primary focus-visible:neon-glow-primary transition-shadow",
destructive: destructive:
"bg-destructive text-destructive-foreground shadow-sm border-destructive-border", "bg-destructive text-destructive-foreground shadow-sm border-destructive-border",
outline: outline:
// @replit Shows the background color of whatever card / sidebar / accent background it is inside of. // @replit Shows the background color of whatever card / sidebar / accent background it is inside of.
// Inherits the current text color. Uses shadow-xs. no shadow on active // Inherits the current text color. Uses shadow-xs. no shadow on active
// No hover state // No hover state
" border [border-color:var(--button-outline)] shadow-xs active:shadow-none ", " border [border-color:var(--button-outline)] shadow-xs active:shadow-none hover:neon-glow focus-visible:neon-glow transition-shadow",
secondary: secondary:
// @replit border, no hover, no shadow, secondary border. // @replit border, no hover, no shadow, secondary border.
"border bg-secondary text-secondary-foreground border border-secondary-border ", "border bg-secondary text-secondary-foreground border border-secondary-border ",
@@ -8,7 +8,7 @@ const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
<input <input
type={type} type={type}
className={cn( className={cn(
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:neon-glow disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
className className
)} )}
ref={ref} ref={ref}
@@ -12,13 +12,13 @@ const Progress = React.forwardRef<
<ProgressPrimitive.Root <ProgressPrimitive.Root
ref={ref} ref={ref}
className={cn( className={cn(
"relative h-2 w-full overflow-hidden rounded-full bg-primary/20", "relative h-2 w-full overflow-hidden rounded-full border border-border/60 bg-primary/10",
className className
)} )}
{...props} {...props}
> >
<ProgressPrimitive.Indicator <ProgressPrimitive.Indicator
className="h-full w-full flex-1 bg-primary transition-all" className="loading-gradient h-full w-full flex-1 transition-all"
style={{ transform: `translateX(-${100 - (value || 0)}%)` }} style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
/> />
</ProgressPrimitive.Root> </ProgressPrimitive.Root>
@@ -6,7 +6,7 @@ function Skeleton({
}: React.HTMLAttributes<HTMLDivElement>) { }: React.HTMLAttributes<HTMLDivElement>) {
return ( return (
<div <div
className={cn("animate-pulse rounded-md bg-primary/10", className)} className={cn("loading-gradient rounded-md border border-border/60", className)}
{...props} {...props}
/> />
) )
@@ -7,7 +7,10 @@ function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
<Loader2Icon <Loader2Icon
role="status" role="status"
aria-label="Loading" aria-label="Loading"
className={cn("size-4 animate-spin", className)} className={cn(
"size-4 animate-spin text-primary [filter:drop-shadow(0_0_6px_hsl(var(--glow-1)/0.55))]",
className
)}
{...props} {...props}
/> />
) )
@@ -9,7 +9,7 @@ const Textarea = React.forwardRef<
return ( return (
<textarea <textarea
className={cn( className={cn(
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:neon-glow disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
className className
)} )}
ref={ref} ref={ref}
+7 -2
View File
@@ -69,7 +69,7 @@
}, },
"home": { "home": {
"welcome": "Willkommen bei toolr", "welcome": "Willkommen bei toolr",
"tagline": "Die Community-Plattform, auf der Ingenieure die Tools, die sie täglich nutzen, ehrlich bewerten.", "tagline": "Bewerte dein Tool.",
"totalTools": "Tools gesamt", "totalTools": "Tools gesamt",
"totalRatings": "Bewertungen gesamt", "totalRatings": "Bewertungen gesamt",
"avgRating": "Ø Bewertung", "avgRating": "Ø Bewertung",
@@ -101,6 +101,7 @@
"compareCount": "Vergleichen ({{count}})", "compareCount": "Vergleichen ({{count}})",
"addToCompare": "Zum Vergleich hinzufügen", "addToCompare": "Zum Vergleich hinzufügen",
"removeFromCompare": "Aus dem Vergleich entfernen", "removeFromCompare": "Aus dem Vergleich entfernen",
"compareLimitReached": "Maximal 9 Tools können verglichen werden.",
"comparePremiumTitle": "Vergleichen ist ein Premium-Feature", "comparePremiumTitle": "Vergleichen ist ein Premium-Feature",
"comparePremiumSub": "Das Vergleichen von Tools nebeneinander ist für Premium- und Enterprise-Nutzer verfügbar. Erweitere deinen Plan, um es freizuschalten.", "comparePremiumSub": "Das Vergleichen von Tools nebeneinander ist für Premium- und Enterprise-Nutzer verfügbar. Erweitere deinen Plan, um es freizuschalten.",
"notNow": "Später", "notNow": "Später",
@@ -189,7 +190,7 @@
"nameOptional": "Name (optional)", "nameOptional": "Name (optional)",
"nameLabel": "Name", "nameLabel": "Name",
"anonymousPlaceholder": "Anonym", "anonymousPlaceholder": "Anonym",
"anonymousEngineer": "Anonymer Ingenieur", "anonymousEngineer": "Anonymer Benutzer",
"beFirstToReview": "Sei der Erste, der seine Gedanken zu diesem Tool teilt.", "beFirstToReview": "Sei der Erste, der seine Gedanken zu diesem Tool teilt.",
"shareExperience": "Teile deine Erfahrung mit {{name}}", "shareExperience": "Teile deine Erfahrung mit {{name}}",
"score": "Punktestand", "score": "Punktestand",
@@ -418,6 +419,10 @@
"importYamlSub": "YAML-Liste von Objekten (oder ein einzelnes Objekt) mit den Feldern name, description, category, websiteUrl, iconUrl, features, tags.", "importYamlSub": "YAML-Liste von Objekten (oder ein einzelnes Objekt) mit den Feldern name, description, category, websiteUrl, iconUrl, features, tags.",
"importFile": "Datei laden", "importFile": "Datei laden",
"importTextareaPlaceholder": "name;description;category;features;tags\nMein Tool;Eine tolle Beschreibung;Monitoring;Deployment|Open Source;devops", "importTextareaPlaceholder": "name;description;category;features;tags\nMein Tool;Eine tolle Beschreibung;Monitoring;Deployment|Open Source;devops",
"importTextareaPlaceholderCsv": "name;description;category;features;tags\nMein Tool;Eine tolle Beschreibung;Monitoring;Deployment|Open Source;devops",
"importTextareaPlaceholderJson": "[\n {\n \"name\": \"Mein Tool\",\n \"description\": \"Eine tolle Beschreibung\",\n \"category\": \"Monitoring\",\n \"features\": [\"Deployment\", \"Open Source\"],\n \"tags\": [\"devops\"]\n }\n]",
"importTextareaPlaceholderYaml": "- name: Mein Tool\n description: Eine tolle Beschreibung\n category: Monitoring\n features:\n - Deployment\n - Open Source\n tags:\n - devops",
"importTextareaPlaceholderAuto": "name;description;category\nMein Tool;Eine tolle Beschreibung;Monitoring",
"importing": "Wird importiert…", "importing": "Wird importiert…",
"importDone": "{{count}} von {{total}} Tools erfolgreich importiert.", "importDone": "{{count}} von {{total}} Tools erfolgreich importiert.",
"importErrors": "{{count}} Zeilen mit Fehlern:", "importErrors": "{{count}} Zeilen mit Fehlern:",
+7 -2
View File
@@ -69,7 +69,7 @@
}, },
"home": { "home": {
"welcome": "Welcome to toolr", "welcome": "Welcome to toolr",
"tagline": "The community hub where engineers honestly rate the tools they use daily.", "tagline": "Rate your Tool.",
"totalTools": "Total Tools", "totalTools": "Total Tools",
"totalRatings": "Total Ratings", "totalRatings": "Total Ratings",
"avgRating": "Avg Rating", "avgRating": "Avg Rating",
@@ -101,6 +101,7 @@
"compareCount": "Compare ({{count}})", "compareCount": "Compare ({{count}})",
"addToCompare": "Add to compare", "addToCompare": "Add to compare",
"removeFromCompare": "Remove from compare", "removeFromCompare": "Remove from compare",
"compareLimitReached": "A maximum of 9 tools can be compared.",
"comparePremiumTitle": "Compare is a Premium feature", "comparePremiumTitle": "Compare is a Premium feature",
"comparePremiumSub": "Comparing tools side-by-side is available to Premium and Enterprise users. Upgrade your plan to unlock it.", "comparePremiumSub": "Comparing tools side-by-side is available to Premium and Enterprise users. Upgrade your plan to unlock it.",
"notNow": "Not now", "notNow": "Not now",
@@ -189,7 +190,7 @@
"nameOptional": "Name (Optional)", "nameOptional": "Name (Optional)",
"nameLabel": "Name", "nameLabel": "Name",
"anonymousPlaceholder": "Anonymous", "anonymousPlaceholder": "Anonymous",
"anonymousEngineer": "Anonymous Engineer", "anonymousEngineer": "Anonymous User",
"beFirstToReview": "Be the first to share your thoughts on this tool.", "beFirstToReview": "Be the first to share your thoughts on this tool.",
"shareExperience": "Share your experience with {{name}}", "shareExperience": "Share your experience with {{name}}",
"score": "Score", "score": "Score",
@@ -418,6 +419,10 @@
"importYamlSub": "A YAML list of objects (or a single object) with the fields name, description, category, websiteUrl, iconUrl, features, tags.", "importYamlSub": "A YAML list of objects (or a single object) with the fields name, description, category, websiteUrl, iconUrl, features, tags.",
"importFile": "Upload file", "importFile": "Upload file",
"importTextareaPlaceholder": "name;description;category;features;tags\nMy Tool;A great description;Monitoring;Deployment|Open Source;devops", "importTextareaPlaceholder": "name;description;category;features;tags\nMy Tool;A great description;Monitoring;Deployment|Open Source;devops",
"importTextareaPlaceholderCsv": "name;description;category;features;tags\nMy Tool;A great description;Monitoring;Deployment|Open Source;devops",
"importTextareaPlaceholderJson": "[\n {\n \"name\": \"My Tool\",\n \"description\": \"A great description\",\n \"category\": \"Monitoring\",\n \"features\": [\"Deployment\", \"Open Source\"],\n \"tags\": [\"devops\"]\n }\n]",
"importTextareaPlaceholderYaml": "- name: My Tool\n description: A great description\n category: Monitoring\n features:\n - Deployment\n - Open Source\n tags:\n - devops",
"importTextareaPlaceholderAuto": "name;description;category\nMy Tool;A great description;Monitoring",
"importing": "Importing…", "importing": "Importing…",
"importDone": "{{count}} of {{total}} tools imported successfully.", "importDone": "{{count}} of {{total}} tools imported successfully.",
"importErrors": "{{count}} rows with errors:", "importErrors": "{{count}} rows with errors:",
+91
View File
@@ -123,6 +123,10 @@
--chart-4: 43 100% 50%; --chart-4: 43 100% 50%;
--chart-5: 280 80% 50%; --chart-5: 280 80% 50%;
--glow-1: 187 100% 50%; /* cyan */
--glow-2: 265 100% 68%; /* violet */
--glow-3: 14 100% 57%; /* orange (primary) */
--app-font-sans: 'Inter', sans-serif; --app-font-sans: 'Inter', sans-serif;
--app-font-serif: Georgia, serif; --app-font-serif: Georgia, serif;
--app-font-mono: 'JetBrains Mono', Menlo, monospace; --app-font-mono: 'JetBrains Mono', Menlo, monospace;
@@ -372,4 +376,91 @@
.border.hover-elevate:not(.no-hover-interaction-elevate)::after { .border.hover-elevate:not(.no-hover-interaction-elevate)::after {
inset: -1px; inset: -1px;
} }
/* ------------------------------------------------------------------ */
/* Neon / AI glow system
* Dezent: funktioniert in Light + Dark. Animationen respektieren
* prefers-reduced-motion.
* ------------------------------------------------------------------ */
.neon-glow {
box-shadow:
0 0 0 1px hsl(var(--glow-1) / 0.35),
0 0 18px -2px hsl(var(--glow-1) / 0.45),
0 0 42px -8px hsl(var(--glow-2) / 0.35);
}
.neon-glow-primary {
box-shadow:
0 0 0 1px hsl(var(--glow-3) / 0.4),
0 0 16px -2px hsl(var(--glow-3) / 0.38),
0 0 34px -8px hsl(var(--glow-3) / 0.3);
}
/* Animated gradient background for loading states (Google-AI style flow) */
.loading-gradient {
background-image: linear-gradient(
100deg,
hsl(var(--glow-3) / 0.14) 0%,
hsl(var(--glow-2) / 0.22) 25%,
hsl(var(--glow-1) / 0.24) 50%,
hsl(var(--glow-2) / 0.22) 75%,
hsl(var(--glow-3) / 0.14) 100%
);
background-size: 300% 100%;
animation: neon-loading-sweep 7s ease-in-out infinite;
}
.loading-gradient-text {
background-image: linear-gradient(
100deg,
hsl(var(--glow-3)) 0%,
hsl(var(--glow-1)) 45%,
hsl(var(--glow-2)) 75%,
hsl(var(--glow-3)) 100%
);
background-size: 250% 100%;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
animation: neon-loading-sweep 8s ease-in-out infinite;
}
.neon-pulse {
animation: neon-pulse 3.5s ease-in-out infinite;
}
.neon-spin {
animation: neon-rotate 1.4s linear infinite;
background: linear-gradient(
hsl(var(--glow-3)),
hsl(var(--glow-1)),
hsl(var(--glow-2)),
hsl(var(--glow-3))
);
animation: neon-rotate 1.4s linear infinite;
}
@keyframes neon-loading-sweep {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
@keyframes neon-pulse {
0%, 100% { opacity: 0.55; box-shadow: 0 0 6px -1px hsl(var(--glow-1) / 0.25); }
50% { opacity: 1; box-shadow: 0 0 16px 0 hsl(var(--glow-1) / 0.5); }
}
@keyframes neon-rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
.loading-gradient { animation: none; }
.loading-gradient-text { animation: none; }
.neon-pulse { animation: none; }
.neon-spin { animation: none; }
}
} }
+5 -2
View File
@@ -29,6 +29,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Users, ScrollText, ShieldAlert, Plus, Pencil, Trash2, Clock, AlertTriangle, Wrench, Server } from "lucide-react"; import { Users, ScrollText, ShieldAlert, Plus, Pencil, Trash2, Clock, AlertTriangle, Wrench, Server } from "lucide-react";
import { format } from "date-fns"; import { format } from "date-fns";
import { AdminToolsTab } from "@/components/admin-tools-tab"; import { AdminToolsTab } from "@/components/admin-tools-tab";
import { GuideHelp } from "@/components/guide-help";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
export default function Admin() { export default function Admin() {
@@ -359,8 +360,9 @@ export default function Admin() {
<Dialog open={createOpen} onOpenChange={setCreateOpen}> <Dialog open={createOpen} onOpenChange={setCreateOpen}>
<DialogContent className="sm:max-w-md"> <DialogContent className="sm:max-w-md">
<DialogHeader> <DialogHeader className="flex flex-row items-center justify-between gap-2">
<DialogTitle>{t("admin.createNewUser")}</DialogTitle> <DialogTitle>{t("admin.createNewUser")}</DialogTitle>
<GuideHelp guide="administration" label={t("admin.createNewUser")} />
</DialogHeader> </DialogHeader>
<div className="space-y-4 py-2"> <div className="space-y-4 py-2">
<div className="space-y-2"> <div className="space-y-2">
@@ -412,8 +414,9 @@ export default function Admin() {
<Dialog open={!!editUser} onOpenChange={(open) => { if (!open) { setEditUser(null); setEditPassword(""); } }}> <Dialog open={!!editUser} onOpenChange={(open) => { if (!open) { setEditUser(null); setEditPassword(""); } }}>
<DialogContent className="sm:max-w-sm"> <DialogContent className="sm:max-w-sm">
<DialogHeader> <DialogHeader className="flex flex-row items-center justify-between gap-2">
<DialogTitle>{t("admin.editUser", { username: editUser?.username })}</DialogTitle> <DialogTitle>{t("admin.editUser", { username: editUser?.username })}</DialogTitle>
<GuideHelp guide="administration" label={t("admin.editUser", { username: editUser?.username })} />
</DialogHeader> </DialogHeader>
<div className="space-y-4 py-2"> <div className="space-y-4 py-2">
<div className="space-y-2"> <div className="space-y-2">
+1 -1
View File
@@ -740,7 +740,7 @@ function ReleasesView({ versions }: { versions: ReleaseDoc[] }) {
function ReleaseNoteView({ version, doc }: { version: string; doc: ReleaseDoc | null }) { function ReleaseNoteView({ version, doc }: { version: string; doc: ReleaseDoc | null }) {
const locale = useDocsLocale(); const locale = useDocsLocale();
const file = doc ? `releases/${localizedFile(doc.file, doc.fileEn, locale)}` : `releases/${version}.md`; const file = doc ? `releases/${localizedFile(doc.file, doc.fileEn, locale)}` : `releases/${version}.de.md`;
return ( return (
<div className="flex flex-col lg:flex-row gap-8"> <div className="flex flex-col lg:flex-row gap-8">
<div className="flex-1 min-w-0 max-w-3xl"> <div className="flex-1 min-w-0 max-w-3xl">
+3 -3
View File
@@ -39,7 +39,7 @@ export default function Home() {
{/* Stats Banner */} {/* Stats Banner */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-4"> <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<Card className="bg-primary/5 border-primary/20"> <Card className="neon-glow-primary bg-primary/5 border-primary/20">
<CardContent className="p-6 flex items-center gap-4"> <CardContent className="p-6 flex items-center gap-4">
<div className="p-3 bg-primary/10 rounded-lg text-primary"> <div className="p-3 bg-primary/10 rounded-lg text-primary">
<Wrench className="w-6 h-6" /> <Wrench className="w-6 h-6" />
@@ -55,7 +55,7 @@ export default function Home() {
</CardContent> </CardContent>
</Card> </Card>
<Card className="bg-primary/5 border-primary/20"> <Card className="neon-glow-primary bg-primary/5 border-primary/20">
<CardContent className="p-6 flex items-center gap-4"> <CardContent className="p-6 flex items-center gap-4">
<div className="p-3 bg-primary/10 rounded-lg text-primary"> <div className="p-3 bg-primary/10 rounded-lg text-primary">
<MessageSquare className="w-6 h-6" /> <MessageSquare className="w-6 h-6" />
@@ -71,7 +71,7 @@ export default function Home() {
</CardContent> </CardContent>
</Card> </Card>
<Card className="bg-primary/5 border-primary/20"> <Card className="neon-glow-primary bg-primary/5 border-primary/20">
<CardContent className="p-6 flex items-center gap-4"> <CardContent className="p-6 flex items-center gap-4">
<div className="p-3 bg-primary/10 rounded-lg text-primary"> <div className="p-3 bg-primary/10 rounded-lg text-primary">
<Star className="w-6 h-6" /> <Star className="w-6 h-6" />
+1 -1
View File
@@ -58,7 +58,7 @@ export default function Login() {
<p className="text-muted-foreground text-sm">{t("auth.loginSubtitle")}</p> <p className="text-muted-foreground text-sm">{t("auth.loginSubtitle")}</p>
</div> </div>
<Card> <Card className="neon-glow">
<CardHeader className="pb-4"> <CardHeader className="pb-4">
<CardTitle className="text-lg">{t("auth.signIn")}</CardTitle> <CardTitle className="text-lg">{t("auth.signIn")}</CardTitle>
<CardDescription>{t("auth.loginDescription")}</CardDescription> <CardDescription>{t("auth.loginDescription")}</CardDescription>
+10 -1
View File
@@ -18,6 +18,7 @@ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
import { useBrowsePreferences, isViewMode, isDensity } from "@/hooks/use-browse-preferences"; import { useBrowsePreferences, isViewMode, isDensity } from "@/hooks/use-browse-preferences";
import { useAuth } from "@/hooks/use-auth"; import { useAuth } from "@/hooks/use-auth";
import { useWatchlist } from "@/hooks/use-watchlist"; import { useWatchlist } from "@/hooks/use-watchlist";
import { useToast } from "@/hooks/use-toast";
import { CompareBar } from "@/components/compare-bar"; import { CompareBar } from "@/components/compare-bar";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
@@ -91,12 +92,20 @@ export default function ToolsBrowse() {
const { serverView, serverDensity, localView, localDensity, persist } = useBrowsePreferences(); const { serverView, serverDensity, localView, localDensity, persist } = useBrowsePreferences();
const { hasFeature } = useAuth(); const { hasFeature } = useAuth();
const { isWatched, toggle: toggleWatchlist, canWatchlist } = useWatchlist(); const { isWatched, toggle: toggleWatchlist, canWatchlist } = useWatchlist();
const { toast } = useToast();
const [compareIds, setCompareIds] = useState<number[]>([]); const [compareIds, setCompareIds] = useState<number[]>([]);
const [compareUpsellOpen, setCompareUpsellOpen] = useState(false); const [compareUpsellOpen, setCompareUpsellOpen] = useState(false);
function toggleCompare(id: number) { function toggleCompare(id: number) {
setCompareIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id])); setCompareIds((prev) => {
if (prev.includes(id)) return prev.filter((x) => x !== id);
if (prev.length >= 9) {
toast({ title: t("browse.compareLimitReached"), variant: "destructive" });
return prev;
}
return [...prev, id];
});
} }
const [search, setSearch] = useState(initialSearch); const [search, setSearch] = useState(initialSearch);
+295
View File
@@ -0,0 +1,295 @@
# Beispiel-YAML zum Import in den Admin-Bereich (Tab „Tools" -> Importieren).
# Erwartetes Format pro Eintrag:
# name (Pflicht)
# description, category, websiteUrl, iconUrl (optional)
# features, tags (Listen oder | -getrennte Strings)
# Das Format wird automatisch erkannt; bei CSV den Trenner wählen.
# Fehlerhafte Zeilen werden übersprungen und mit Zeilennummer aufgelistet.
- name: Slack
description: Team-Kommunikation mit Channels, Direktnachrichten und App-Integrationen
category: Kommunikation
websiteUrl: https://slack.com
features:
- Channels
- Videoanrufe
- App-Integrationen
tags:
- communication
- teamwork
- name: Microsoft Teams
description: Chat, Besprechungen, Dateien und Zusammenarbeit in einer Plattform
category: Kommunikation
websiteUrl: https://www.microsoft.com/de-de/microsoft-365/microsoft-teams
features:
- Videokonferenzen
- Teamkanäle
- Office-Integration
tags:
- communication
- meetings
- name: Zoom
description: Videokonferenzen und Webinare für Teams und externe Partner
category: Kommunikation
websiteUrl: https://zoom.us
features:
- Videokonferenzen
- Webinare
- Bildschirmfreigabe
tags:
- video
- meetings
- name: Jira
description: Agile Projekt- und Issue-Verfolgung für Entwicklung und Betrieb
category: Projektmanagement
websiteUrl: https://www.atlassian.com/software/jira
features:
- Backlog
- Sprints
- Kanban-Boards
tags:
- agile
- project-management
- name: Confluence
description: Kollaborative Wissensdatenbank und Dokumentation für Teams
category: Projektmanagement
websiteUrl: https://www.atlassian.com/software/confluence
features:
- Wikis
- Seitenbausteine
- Berechtigungen
tags:
- documentation
- knowledge-base
- name: GitLab
description: DevOps-Plattform mit Git-Repositorys, CI/CD und Code-Review
category: Entwicklung
websiteUrl: https://about.gitlab.com
features:
- Git-Repositorys
- CI/CD
- Merge Requests
tags:
- devops
- git
- name: GitHub
description: Versionsverwaltung, Code-Review und Collaboration auf Git-Basis
category: Entwicklung
websiteUrl: https://github.com
features:
- Repositories
- Pull Requests
- Actions
tags:
- git
- collaboration
- name: Jenkins
description: Automatisierte Build- und Deploy-Pipelines für Softwareprojekte
category: CI/CD
websiteUrl: https://www.jenkins.io
features:
- Pipelines
- Plugins
- Job-Automatisierung
tags:
- ci
- cd
- name: Docker
description: Container-Plattform zum Paketieren und Ausführen von Anwendungen
category: Entwicklung
websiteUrl: https://www.docker.com
features:
- Container
- Images
- Compose
tags:
- containers
- virtualization
- name: Grafana
description: Observability- und Dashboard-Plattform für Metriken, Logs und Alerts
category: Monitoring
websiteUrl: https://grafana.com
features:
- Dashboards
- Alerts
- Datenquellen
tags:
- observability
- monitoring
- name: Prometheus
description: Open-Source-Systeme zur Zeitreihen-Metrikerfassung und -Auswertung
category: Monitoring
websiteUrl: https://prometheus.io
features:
- Metriken
- Alerting
- Time-Series-Datenbank
tags:
- monitoring
- metrics
- name: Datadog
description: Cloud-basierte Observability für Infrastruktur, APM und Logs
category: Monitoring
websiteUrl: https://www.datadoghq.com
features:
- Infrastruktur-Monitoring
- APM
- Log-Management
tags:
- observability
- saas
- name: PagerDuty
description: Incident-Management und On-Call-Benachrichtigungen für Teams
category: Betrieb
websiteUrl: https://www.pagerduty.com
features:
- Alerting
- On-Call-Pläne
- Incident-Response
tags:
- incident-management
- on-call
- name: Sentry
description: Fehlerüberwachung und Performance-Monitoring für Anwendungen
category: Monitoring
websiteUrl: https://sentry.io
features:
- Error-Tracking
- Releases
- Performance
tags:
- error-monitoring
- debugging
- name: Terraform
description: Infrastructure-as-Code zur deklarativen Bereitstellung von Ressourcen
category: Infrastruktur
websiteUrl: https://www.terraform.io
features:
- Modules
- State-Management
- Provider
tags:
- iac
- infrastructure
- name: Ansible
description: Agentenlose Automatisierung für Konfiguration, Deploy und Orchestrierung
category: Infrastruktur
websiteUrl: https://www.ansible.com
features:
- Playbooks
- Inventories
- Modules
tags:
- automation
- configuration
- name: Elasticsearch
description: Verteilter Such- und Analytics-Server für Logs, Metriken und Daten
category: Datenbank
websiteUrl: https://www.elastic.co
features:
- Volltextsuche
- Aggregationen
- Skalierung
tags:
- search
- analytics
- name: Kubernetes
description: Container-Orchestrierung für Deployment, Skalierung und Betrieb
category: Infrastruktur
websiteUrl: https://kubernetes.io
features:
- Pods
- Services
- Autoskalierung
tags:
- containers
- orchestration
- name: Sonarqube
description: Statische Code-Analyse und Qualitätsmessung für Softwareprojekte
category: Entwicklung
websiteUrl: https://www.sonarsource.com/products/sonarqube
features:
- Code-Qualität
- Security-Scans
- Quality Gates
tags:
- code-quality
- static-analysis
- name: Power BI
description: Business-Intelligence-Tool für Dashboards, Berichte und Datenanalyse
category: Analytics
websiteUrl: https://powerbi.microsoft.com
features:
- Dashboards
- Berichte
- Datenmodelle
tags:
- bi
- analytics
- name: Google Workspace
description: Produktivitäts-Suite mit E-Mail, Docs, Drive und Meet
category: Produktivität
websiteUrl: https://workspace.google.com
features:
- Gmail
- Google Docs
- Google Drive
tags:
- suite
- productivity
- name: Microsoft 365
description: Office-Anwendungen, E-Mail und Cloud-Dienste für Unternehmen
category: Produktivität
websiteUrl: https://www.microsoft.com/microsoft-365
features:
- Word
- Excel
- Outlook
tags:
- suite
- productivity
- name: Slack Enterprise Grid
description: Slack-Verwaltung für große Organisationen mit erweiterten Sicherheitsfunktionen
category: Kommunikation
websiteUrl: https://slack.com
features:
- Enterprise-Admin
- Compliance
- Multi-Workspace
tags:
- communication
- enterprise
- name: Atlassian Rovo
description: KI-Assistent für Suche und Zusammenarbeit über Atlassian-Produkte
category: Projektmanagement
websiteUrl: https://www.atlassian.com/software/rovo
features:
- KI-Suche
- Agenten
- Integrationen
tags:
- ai
- search
@@ -73,6 +73,9 @@ Zentraler Zugriff auf den Tool-Katalog.
category: Monitoring category: Monitoring
``` ```
Eine umfangreichere, fertig importierbare Beispieldatei liegt unter
`docs/examples/import-tools.yaml` (24 gängige Enterprise-Tools).
Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer
aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt
Audit-Log-Einträge. Audit-Log-Einträge.
+3
View File
@@ -73,6 +73,9 @@ Central access to the tool catalog.
category: Monitoring category: Monitoring
``` ```
A larger, ready-to-import example file is located at
`docs/examples/import-tools.yaml` (24 common enterprise tools).
During import, individual faulty rows are skipped and listed with their row During import, individual faulty rows are skipped and listed with their row
number; correct rows are still created. Every import produces audit-log number; correct rows are still created. Every import produces audit-log
entries. entries.
@@ -6,7 +6,7 @@ order: 1
# Willkommen bei toolr # Willkommen bei toolr
toolr ist eine Plattform zum **Entdecken, Bewerten und Vergleichen von toolr ist eine Plattform zum **Entdecken, Bewerten und Vergleichen von
Entwicklungstools**. Nutzer:innen pflegen einen gemeinsamen Katalog von Tools, Entwicklungstools**. Nutzer pflegen einen gemeinsamen Katalog von Tools,
vergeben Bewertungen (Nützlichkeit & Bedienbarkeit) und nutzen Statistiken, um vergeben Bewertungen (Nützlichkeit & Bedienbarkeit) und nutzen Statistiken, um
die richtige Wahl zu treffen. die richtige Wahl zu treffen.
@@ -16,7 +16,7 @@ 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 | | **Tool bearbeiten/löschen** | Eigene Tools pflegen (Ersteller oder Admin) | Angemeldet |
| **Bewerten** | Nützlichkeit & Bedienbarkeit (15) plus Kommentar vergeben | Angemeldet | | **Bewerten** | Nützlichkeit & Bedienbarkeit (15) plus Kommentar vergeben | Angemeldet |
| **Merkliste** | Tools als Favoriten speichern | Premium | | **Merkliste** | Tools als Favoriten speichern | Premium |
| **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium | | **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium |
@@ -47,7 +47,7 @@ Mit **Filter zurücksetzen** bzw. **Alle entfernen** räumst du sie wieder auf.
- **Ansicht wechseln:** Raster / Tabelle / Zeilen. - **Ansicht wechseln:** Raster / Tabelle / Zeilen.
- **Dichte:** gemütlich / kompakt (Schieberegler). - **Dichte:** gemütlich / kompakt (Schieberegler).
Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer:innen Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer
zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und
Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen
kannst. kannst.
-37
View File
@@ -1,37 +0,0 @@
# v0.6.0 — Release Notes
**Date:** 2026-08-03 · **Tag:** [`v0.6.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.6.0)
## New features
- Complete modernization of all dependencies to the current major versions
(TypeScript 7, Vite 8, React 19.2, openid-client 6, zod 4, recharts 3, react-day-picker 10).
## Fixes & improvements
- CI build fixed via `allowBuilds` configuration for pnpm 11
(build scripts for esbuild & Co. are no longer blocked).
- Image tagging simplified: only `latest` and `v*` tags, no more `nightly-*`/`sha-*` tags.
- All dependencies pinned exactly; automatic updates via Renovate prepared
(`renovate.json`, `docs/dependency-policy.md`).
## API changes
- No breaking changes to the API. openid-client internally migrated to v6
(auth flow behaves identically).
## Operations / upgrade
- **Env vars:** unchanged. Node image pinned to `node:24.18.1-alpine`.
- **Migration:** no database migration required.
- **Breaking changes:** none.
## Known limitations
- `typedoc` (indirect orval dependency) shows a peer-dependency warning
(expects TypeScript 5.x/6.x, 7.x is installed) — harmless for build and runtime.
## Links
- Commit: [`2f66fff`](https://git.kubebase.de/admin/tool-evaluator/commit/2f66fff)
- Tag: [`v0.6.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.6.0)
-37
View File
@@ -1,37 +0,0 @@
# v0.6.0 — Release Notes
**Datum:** 2026-08-03 · **Tag:** [`v0.6.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.6.0)
## Neue Features
- Vollständige Modernisierung aller Abhängigkeiten auf die aktuellen Hauptversionen
(TypeScript 7, Vite 8, React 19.2, openid-client 6, zod 4, recharts 3, react-day-picker 10).
## Fixes & Verbesserungen
- CI-Build durch `allowBuilds`-Konfiguration für pnpm 11 repariert
(Build-Scripts für esbuild & Co. werden nicht mehr blockiert).
- Image-Tagging vereinfacht: nur noch `latest` und `v*`-Tags, keine `nightly-*`/`sha-*`-Tags.
- Alle Dependencies exakt gepinnt; automatische Updates via Renovate vorbereitet
(`renovate.json`, `docs/dependency-policy.md`).
## API-Änderungen
- Keine Breaking Changes an der API. openid-client intern auf v6 migriert
(auth-Fluss verhält sich identisch).
## Betrieb / Upgrade
- **Env-Vars:** unverändert. Node-Image auf `node:24.18.1-alpine` gepinnt.
- **Migration:** keine Datenbank-Migration erforderlich.
- **Breaking Changes:** keine.
## Bekannte Einschränkungen
- `typedoc` (indirekte orval-Abhängigkeit) zeigt eine Peer-Dependency-Warnung
(erwartet TypeScript 5.x/6.x, installiert ist 7.x) — harmlos für Build & Laufzeit.
## Links
- Commit: [`2f66fff`](https://git.kubebase.de/admin/tool-evaluator/commit/2f66fff)
- Tag: [`v0.6.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.6.0)
-35
View File
@@ -1,35 +0,0 @@
# v0.7.0 — Release Notes
**Date:** 2026-08-03 · **Tag:** [`v0.7.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.7.0)
## New features
- Version-bound **release documentation** in the app under `/docs`
(index + detail page per version, Markdown from `docs/releases/`).
- Generated release template (`docs/releases/TEMPLATE.md`) and
sync step for the frontend build.
## Fixes & improvements
- `tsx` bumped to 4.23.4 — last outdated dependency in the workspace
(`pnpm outdated -r` is now empty).
## API changes
- No breaking changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none.
## Known limitations
- The documentation is currently limited to release notes; a complete
API/field reference will follow in v0.8.0.
## Links
- Commit: [`520f917`](https://git.kubebase.de/admin/tool-evaluator/commit/520f917)
- Tag: [`v0.7.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.7.0)
-35
View File
@@ -1,35 +0,0 @@
# v0.7.0 — Release Notes
**Datum:** 2026-08-03 · **Tag:** [`v0.7.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.7.0)
## Neue Features
- Version-gebundene **Release-Dokumentation** in der App unter `/docs`
(Index + Detailseite je Version, Markdown aus `docs/releases/`).
- Generiertes Release-Vorlage (`docs/releases/TEMPLATE.md`) und
Sync-Schritt für den Frontend-Build.
## Fixes & Verbesserungen
- `tsx` auf 4.23.4 angehoben — letzte veraltete Abhängigkeit im Workspace
(`pnpm outdated -r` ist jetzt leer).
## API-Änderungen
- Keine Breaking Changes an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine.
## Bekannte Einschränkungen
- Die Doku ist bisher auf Release-Notes beschränkt; eine vollständige
API-/Feld-Referenz folgt in v0.8.0.
## Links
- Commit: [`520f917`](https://git.kubebase.de/admin/tool-evaluator/commit/520f917)
- Tag: [`v0.7.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.7.0)
-46
View File
@@ -1,46 +0,0 @@
# v0.8.0 — Release Notes
**Date:** 2026-08-03 · **Tag:** [`v0.8.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.0)
## New features
- **Complete documentation site** in mkdocs look under `/docs`:
- **Manual** with understandable explanations of all features
(Getting started, creating a tool, evaluations, comparing, watchlist,
analytics, administration, data model).
- **Automatically generated reference** from `lib/api-spec/openapi.yaml`:
all endpoints and data fields (type, required status, constraints) —
this guarantees that *every* feature is documented.
- **Search** across the manual, endpoints, and fields.
- **Version dropdown**: older releases keep their full field/endpoint
reference as a snapshot.
- **Repo link** to the source in the top right.
- **Help buttons (?) in forms** (NetBox style): next to each field,
an icon jumps directly to the field description in the docs.
## Fixes & improvements
- Docs generator `scripts/src/generate-docs.mjs` replaces the previous
`sync-release-docs.mjs` (OpenAPI parsing, manual, search index, snapshots).
- Documentation for v0.7.0 backfilled.
## API changes
- No breaking changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none.
## Known limitations
- Manual & reference apply to the current version; older versions
show their release notes and a reference snapshot, if generated at
release time (`node scripts/src/generate-docs.mjs --snapshot vX.Y.Z`).
## Links
- Commit: [`6c92b63`](https://git.kubebase.de/admin/tool-evaluator/commit/6c92b63)
- Tag: [`v0.8.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.0)
-46
View File
@@ -1,46 +0,0 @@
# v0.8.0 — Release Notes
**Datum:** 2026-08-03 · **Tag:** [`v0.8.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.0)
## Neue Features
- **Vollständige Dokumentations-Site** in mkdocs-Optik unter `/docs`:
- **Handbuch** mit verständlichen Erklärungen zu allen Features
(Erste Schritte, Tool anlegen, Bewertungen, Vergleichen, Merkliste,
Analytics, Administration, Datenmodell).
- **Automatisch generierte Referenz** aus `lib/api-spec/openapi.yaml`:
alle Endpunkte und Datenfelder (Typ, Pflichtstatus, Constraints) —
damit ist garantiert, dass *jedes* Feature dokumentiert ist.
- **Suche** über Handbuch, Endpunkte und Felder.
- **Versions-Dropdown**: ältere Releases behalten ihre vollständige
Feld-/Endpunkt-Referenz als Snapshot.
- **Repo-Link** oben rechts zur Quelle.
- **Hilfe-Buttons (?) in Formularen** (NetBox-Stil): neben jedem Feld
springt ein Icon direkt zur Feldbeschreibung in der Doku.
## Fixes & Verbesserungen
- Doku-Generator `scripts/src/generate-docs.mjs` ersetzt den bisherigen
`sync-release-docs.mjs` (OpenAPI-Parsing, Handbuch, Suchindex, Snapshots).
- Dokumentation für v0.7.0 nachgezogen.
## API-Änderungen
- Keine Breaking Changes an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine.
## 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: [`6c92b63`](https://git.kubebase.de/admin/tool-evaluator/commit/6c92b63)
- Tag: [`v0.8.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.0)
-47
View File
@@ -1,47 +0,0 @@
# v0.8.1 — Release Notes
**Date:** 2026-08-03 · **Tag:** [`v0.8.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.1)
## New features
- **Standalone docs page**: The documentation is now available as its own,
mkdocs-like page at `toolr.kubebase.de/docs` — without the app shell
(own header with repo link, version dropdown, search, theme toggle
and link back to the app).
- **Navigation renamed**: The sidebar entry is now called **"Help"**
and leads to the standalone docs.
- **User guide completely revised**: 17 manual pages with
step-by-step instructions for all features (finding tools, creating a
tool, evaluating, watchlist, comparing, costs, analytics, plans,
administration, redundancy, trash, keyboard shortcuts, data model).
## Fixes & improvements
- Reference links are now case-insensitive
(schema/endpoint slugs such as `toolinput` and `ToolInput` both work).
- Manual links to endpoint anchors corrected (PascalCase operation IDs).
- Outdated, broken manual links (`vergleichen`, `watchlist` …) replaced.
- Documentation table headers and notice texts in the docs page
internationalized via i18n (de/en).
## API changes
- No changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none. The docs page is reachable under `/docs` as
before; only the presentation is now standalone.
## Known limitations
- Manual & reference apply to the current version; older versions show
their release notes and a reference snapshot, if generated at release time
(`node scripts/src/generate-docs.mjs --snapshot vX.Y.Z`).
## Links
- Commit: [`fdf2d74`](https://git.kubebase.de/admin/tool-evaluator/commit/fdf2d74)
- Tag: [`v0.8.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.1)
-47
View File
@@ -1,47 +0,0 @@
# v0.8.1 — Release Notes
**Datum:** 2026-08-03 · **Tag:** [`v0.8.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/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, Merkliste, 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: [`fdf2d74`](https://git.kubebase.de/admin/tool-evaluator/commit/fdf2d74)
- Tag: [`v0.8.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.1)
-35
View File
@@ -1,35 +0,0 @@
# v0.8.2 — Release Notes
**Date:** 2026-08-04 · **Tag:** [`v0.8.2`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.2)
## Fixes & improvements
- **Mobile navigation in the docs**: The left navigation bar (manual,
endpoints, schemas) was completely hidden below `lg` (1024px).
There is now a menu button in the header that opens a side
navigation drawer with the same content — on small screens
the docs remain fully navigable.
- **Version dropdown shows the selected version**: When switching to a
different release (`/docs/releases/vX.Y.Z`), the dropdown wrongly stayed on
"current". The displayed version is now also derived from the releases route.
## API changes
- No changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none.
## Known limitations
- Manual & reference apply to the current version; older versions show
their release notes and a reference snapshot, if generated at release time
(`node scripts/src/generate-docs.mjs --snapshot vX.Y.Z`).
## Links
- Commit: [`33cf261`](https://git.kubebase.de/admin/tool-evaluator/commit/33cf261)
- Tag: [`v0.8.2`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.2)
-36
View File
@@ -1,36 +0,0 @@
# v0.8.2 — Release Notes
**Datum:** 2026-08-04 · **Tag:** [`v0.8.2`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.2)
## Fixes & Verbesserungen
- **Mobile Navigation in der Doku**: Die linke Navigationsleiste (Handbuch,
Endpunkte, Schemas) wurde unterhalb von `lg` (1024px) komplett ausgeblendet.
Es gibt jetzt einen Menü-Button im Kopfbereich, der ein seitliches
Navigations-Drawer mit demselben Inhalt öffnet — auf kleinen Bildschirmen
bleibt die Doku voll navigierbar.
- **Versions-Dropdown zeigt die gewählte Version an**: Beim Wechsel zu einem
anderen Release (`/docs/releases/vX.Y.Z`) blieb das Dropdown fälschlich auf
„aktuell". Die angezeigte Version wird jetzt auch aus der releases-Route
abgeleitet.
## API-Änderungen
- Keine Änderungen an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine.
## 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: [`33cf261`](https://git.kubebase.de/admin/tool-evaluator/commit/33cf261)
- Tag: [`v0.8.2`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.2)
-49
View File
@@ -1,49 +0,0 @@
# v0.8.3 — Release Notes
**Date:** 2026-08-04 · **Tag:** [`v0.8.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.3)
## New features
- **Version-based documentation**: Each release now carries a
complete docs snapshot (manual + API reference). Via the
version dropdown you can reach the docs of the respective version
(`/docs/vX.Y.Z/…`) — including the manual and reference as they
applied at release time. The last 7 versions remain available.
- **Help buttons in forms (NetBox style)**: For evaluation, tool
create/edit, costs, comparing, watchlist and analytics there is now
a help icon that leads directly to the matching guide in the manual.
## Fixes & improvements
- **Gitea tag links fixed**: `…/tags/vX.Y.Z` was a 404 page; the
correct URL is `/releases/tag/vX.Y.Z` (in all release notes and the
docs page).
- Version switching now leads to the docs of the selected version instead of
just the release page; old `/docs/vX.Y.Z` redirects are removed.
- Docs generator: `--snapshot` creates manual + reference per version; on
build, the snapshots of the last 7 versions are included.
## API changes
- No changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none. New release notes must use the correct
tag link (see `docs/releases/TEMPLATE.md`). For versions before
this release, snapshots can be created retroactively:
`node scripts/src/generate-docs.mjs --snapshot vX.Y.Z`.
## Known limitations
- Older releases without a snapshot (e.g. v0.6.0) only show their release notes,
no manual/reference. Backfill with `--snapshot`.
- The docs version corresponds to the state of the docs at the time the
snapshot was created; manual changes apply from the respective next release.
## Links
- Commit: [`3bb4598`](https://git.kubebase.de/admin/tool-evaluator/commit/3bb4598)
- Tag: [`v0.8.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.3)
-49
View File
@@ -1,49 +0,0 @@
# v0.8.3 — Release Notes
**Datum:** 2026-08-04 · **Tag:** [`v0.8.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.3)
## Neue Features
- **Versionsbasierte Dokumentation**: Jedes Release trägt jetzt einen
vollständigen Doku-Snapshot (Handbuch + API-Referenz). Über das
Versions-Dropdown gelangst du zur Doku der jeweiligen Version
(`/docs/vX.Y.Z/…`) — inklusive Handbuch und Referenz, wie sie zum
Release-Zeitpunkt galten. Die letzten 7 Versionen bleiben verfügbar.
- **Hilfe-Buttons in Formularen (NetBox-Stil)**: Bei Bewertung, Tool
anlegen/bearbeiten, Kosten, Vergleichen, Merkliste und Analytics gibt es
jetzt ein Hilfe-Icon, das direkt zur passenden Anleitung im Handbuch führt.
## Fixes & Verbesserungen
- **Gitea-Tag-Links korrigiert**: `…/tags/vX.Y.Z` war eine 404-Seite; die
korrekte URL lautet `/releases/tag/vX.Y.Z` (in allen Release-Notes und der
Doku-Seite).
- Versions-Wechsel führt jetzt zur Doku der gewählten Version statt direkt
nur zur Release-Seite; alte `/docs/vX.Y.Z`-Redirects entfallen.
- Doku-Generator: `--snapshot` erzeugt Handbuch + Referenz pro Version; beim
Build werden die Snapshots der letzten 7 Versionen eingespielt.
## API-Änderungen
- Keine Änderungen an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine. Neue Release-Notes müssen den korrekten
Tag-Link verwenden (siehe `docs/releases/TEMPLATE.md`). Für Versionen vor
diesem Release können Snapshots nachträglich erzeugt werden:
`node scripts/src/generate-docs.mjs --snapshot vX.Y.Z`.
## Bekannte Einschränkungen
- Ältere Releases ohne Snapshot (z. B. v0.6.0) zeigen nur ihre Release-Notes,
kein Handbuch/keine Referenz. Mit `--snapshot` nachpflegen.
- Die Doku-Version entspricht dem Doku-Stand zum Zeitpunkt der Erstellung des
Snapshots; Änderungen am Handbuch gelten ab dem jeweils nächsten Release.
## Links
- Commit: [`3bb4598`](https://git.kubebase.de/admin/tool-evaluator/commit/3bb4598)
- Tag: [`v0.8.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.3)
-45
View File
@@ -1,45 +0,0 @@
# v0.8.4 — Release Notes
**Date:** 2026-08-04 · **Tag:** [`v0.8.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.4)
## New features
- **Full app localization (German/English)**: All pages and components are
now translated — tool detail page, admin area, trash, redundancy dashboard,
compare, watchlist, analytics, create and edit tool, admin tools tab,
category combobox and theme toggle. The language picker in the top right
switches the whole UI.
- **Bilingual documentation**: The manual (all 17 pages) and the release
notes are now available in German and English. The docs page has a
language switcher that switches content, navigation titles and search.
Versioned docs snapshots (v0.8.1, v0.8.2) also contain the English pages.
## Fixes & improvements
- All remaining hardcoded UI strings replaced with `t()` calls; the locales
are in sync (453 keys per language, 0 missing).
- API reference: table headers (Name/In), required badges and request body
labels in the docs are translated.
- Docs search respects the active language (separate index per language).
## API changes
- No changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none. The docs generator output now includes
additional English files (`*.en.md`) and `search.en.json`; these are
generated automatically during the build.
## Known limitations
- Versioned docs snapshots before v0.8.1 (e.g. v0.6.0) do not contain
English manual pages; the German version is used as fallback there.
## Links
- Commit: [`3de59cc`](https://git.kubebase.de/admin/tool-evaluator/commit/3de59cc)
- Tag: [`v0.8.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.4)
-48
View File
@@ -1,48 +0,0 @@
# v0.8.4 — Release Notes
**Datum:** 2026-08-04 · **Tag:** [`v0.8.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.4)
## Neue Features
- **Komplette Lokalisierung der App (Deutsch/Englisch)**: Alle Seiten und
Komponenten sind jetzt übersetzt — Tool-Detailseite, Verwaltung, Papierkorb,
Redundanz-Dashboard, Vergleichen, Merkliste, Analytics, Tool anlegen und
bearbeiten, Admin-Bereich inkl. Tools-Tab, Kategorie-Combobox und
Theme-Umschalter. Die Sprachauswahl oben rechts wechselt die gesamte
Oberfläche.
- **Dokumentation zweisprachig**: Handbuch (alle 17 Seiten) und Release-Notes
sind jetzt in Deutsch und Englisch verfügbar. In der Doku gibt es einen
Sprach-Umschalter, der Inhalte, Navigationstitel und Suche umschaltet.
Auch versionierte Doku-Snapshots (v0.8.1, v0.8.2) enthalten die englischen
Seiten.
## Fixes & Verbesserungen
- Alle verbliebenen hartkodierten UI-Strings durch `t()`-Aufrufe ersetzt;
die Locales sind synchron (453 Keys pro Sprache, 0 fehlend).
- API-Referenz: Tabellen-Header (Name/In), Pflicht-Badges und
Request-Body-Label der Doku übersetzt.
- Suche in der Doku berücksichtigt die aktive Sprache (eigener Index pro
Sprache).
## API-Änderungen
- Keine Änderungen an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine. Die Doku-Generator-Ausgabe umfasst jetzt
zusätzliche englische Dateien (`*.en.md`) und `search.en.json`; beim Build
werden diese automatisch erzeugt.
## Bekannte Einschränkungen
- Versionierte Doku-Snapshots vor v0.8.1 (z. B. v0.6.0) enthalten keine
englischen Handbuch-Seiten; dort greift die deutsche Fassung als Fallback.
## Links
- Commit: [`3de59cc`](https://git.kubebase.de/admin/tool-evaluator/commit/3de59cc)
- Tag: [`v0.8.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.4)
-45
View File
@@ -1,45 +0,0 @@
# v0.8.5 — Release Notes
**Date:** 2026-08-04 · **Tag:** [`v0.8.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.5)
## New features
- **Help buttons across the app**: The main pages (Home, Browse tools, Trash,
Redundancy dashboard, Admin tools) as well as the premium dialog and the
password dialog now show a book icon next to the title that links directly
to the matching manual page (following the existing buttons on the tool
detail, create, edit, compare, watchlist and analytics pages).
## Fixes & improvements
- **Translated submit button when creating a tool**: The "Submit Tool" /
"Adding Tool…" button was still hardcoded and appeared in English in the
German UI. It is now translated, e.g. "Tool einreichen" / "Füge Tool
hinzu…" in German.
- **More translated UI strings**: View mode (Grid/Table/Rows), list density
(Compact/Comfortable), minimum rating in the filter and the password hint
"min. 6 characters" are now translated correctly.
- **Consistent docs terminology**: The manual now consistently calls the
watchlist "Merkliste" in all German pages and release notes; the English
version stays "Watchlist". The `watchlist` permission name and the URLs
are unchanged.
- All locales are in sync (462 keys per language, 0 missing).
## API changes
- No changes to the API.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none.
## Known limitations
- None.
## Links
- Commit: [`70e72da`](https://git.kubebase.de/admin/tool-evaluator/commit/70e72da)
- Tag: [`v0.8.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.5)
-46
View File
@@ -1,46 +0,0 @@
# v0.8.5 — Release Notes
**Datum:** 2026-08-04 · **Tag:** [`v0.8.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.5)
## Neue Features
- **Hilfe-Buttons in der gesamten App**: Auf den Hauptseiten (Start, Tools
durchsuchen, Papierkorb, Redundanz-Dashboard, Admin-Tools) sowie in
Premium-Dialog und Passwort-Dialog gibt es jetzt ein Buch-Icon neben dem
Titel, das direkt zur passenden Anleitung im Handbuch verlinkt (analog zu
den bestehenden Buttons auf Tool-Detail-, Anlegen-, Bearbeiten-,
Vergleichen-, Merkliste- und Analytics-Seiten).
## Fixes & Verbesserungen
- **Submit-Button beim Tool-Anlegen übersetzt**: Der Button „Submit Tool" /
„Adding Tool…" war noch hartkodiert und erschien auf Deutsch auf Englisch.
Jetzt: „Tool einreichen" / „Füge Tool hinzu…" (bzw. die englischen
Entsprechungen).
- **Weitere übersetzte UI-Strings**: Ansichtsmodus (Raster/Tabelle/Zeilen),
Listendichte (Kompakt/Komfortabel), Mindestbewertung im Filter sowie der
Passwort-Hinweis „min. 6 Zeichen" werden jetzt korrekt übersetzt.
- **Doku-Terminologie konsistent**: Das Handbuch heißt die Merkliste jetzt
einheitlich „Merkliste" (statt „Watchlist") in allen deutschen Seiten und
Release-Notes; die englische Fassung bleibt „Watchlist". Die
Permissions-Bezeichnung `watchlist` und die URLs sind unverändert.
- Alle Locales synchron (462 Keys pro Sprache, 0 fehlend).
## API-Änderungen
- Keine Änderungen an der API.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine.
## Bekannte Einschränkungen
- Keine.
## Links
- Commit: [`70e72da`](https://git.kubebase.de/admin/tool-evaluator/commit/70e72da)
- Tag: [`v0.8.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.5)
-49
View File
@@ -1,49 +0,0 @@
# v0.8.6 — Release Notes
**Date:** 2026-08-04 · **Tag:** [`v0.8.6`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.6)
## New features
- **Bulk tool import in the admin area (premium)**: Admins can now create
multiple tools at once via the new **Import** button in the "Tools" tab.
The format is detected automatically (CSV, JSON or YAML); for CSV the
delimiter can be chosen (auto-detect, comma, semicolon or tab). Data can be
pasted directly or uploaded as a file. Faulty rows are skipped and listed
with their row number while correct rows are still created. Every import
produces audit-log entries. The feature is enabled via the `tool-import`
feature (premium/enterprise); admins always pass the check.
## Improvements
- **NetBox-style help buttons**: The previously attached book icon and the
`FieldHelp` question marks (which showed a German tooltip in the English
layout) have been removed. Forms (create tool, edit tool, rate, password
dialog) now show a "Hilfe"/"Help" outline button with a question-mark icon
at the top right that opens the corresponding handbook page — fully
localized.
- All locales are in sync (482 keys per language, 0 missing).
## API changes
- **New:** `POST /admin/tools/import` (admin + `tool-import` feature).
Request body: `format` (`auto|csv|json|yaml`, default `auto`), `delimiter`
(`auto|comma|semicolon|tab`, default `auto`), `data` (string). Response:
`{ imported, total, errors: [{ row, error }] }`.
## Operations / upgrade
- **Env vars:** unchanged.
- **Migration:** none.
- **Breaking changes:** none. The import endpoint is only available to
premium/enterprise admins; free/user accounts keep standard access.
## Known limitations
- CSV columns whose header does not map to a supported field are ignored;
only the defined fields (`name`, `description`, `category`, `websiteUrl`,
`iconUrl`, `features`, `tags`) are taken over.
## Links
- Commit: [`8f2fd89`](https://git.kubebase.de/admin/tool-evaluator/commit/8f2fd89)
- Tag: [`v0.8.6`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.6)
-50
View File
@@ -1,50 +0,0 @@
# v0.8.6 — Release Notes
**Datum:** 2026-08-04 · **Tag:** [`v0.8.6`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.6)
## Neue Features
- **Bulk-Tool-Import im Admin (Premium)**: Admins können über den neuen Button
**Importieren** im Tab „Tools" mehrere Tools gleichzeitig anlegen. Das Format
wird automatisch erkannt (CSV, JSON oder YAML); für CSV ist der Trenner
wählbar (automatisch, Komma, Semikolon oder Tabulator). Daten lassen sich
direkt einfügen oder als Datei hochladen. Fehlerhafte Zeilen werden übersprungen
und mit Zeilennummer aufgelistet, korrekte weiterhin angelegt. Jeder Import
erzeugt Audit-Log-Einträge. Das Feature ist über das `tool-import`-Feature
(Premium/Enterprise) freigeschaltet; Admins passieren den Check immer.
## Verbesserungen
- **Hilfe-Buttons im NetBox-Stil**: Das zuvor angebundene Buch-Icon und die
`FieldHelp`-Fragezeichen (die im englischen Layout deutschen Tooltip zeigten)
wurden entfernt. Formulare (Tool anlegen, Tool bearbeiten, Bewerten,
Passwort-Dialog) haben jetzt oben rechts einen „Hilfe"/„Help"-Outline-Button mit
Fragezeichen-Icon, der die zugehörige Handbuch-Seite öffnet — vollständig
übersetzt.
- Alle Locales synchron (482 Keys pro Sprache, 0 fehlend).
## API-Änderungen
- **Neu:** `POST /admin/tools/import` (Admin + `tool-import`-Feature).
Request-Body: `format` (`auto|csv|json|yaml`, Default `auto`), `delimiter`
(`auto|comma|semicolon|tab`, Default `auto`), `data` (String). Antwort:
`{ imported, total, errors: [{ row, error }] }`.
## Betrieb / Upgrade
- **Env-Vars:** unverändert.
- **Migration:** keine.
- **Breaking Changes:** keine. Der Import-Endpunkt ist ausschließlich für
Premium/Enterprise-Admins; Free-/User-Konten erhalten weiterhin den Standard-
Zugriff.
## Bekannte Einschränkungen
- CSV-Spalten, die in der Kopfzeile nicht als unterstützte Felder erkannt werden,
werden ignoriert; nur die definierten Felder (`name`, `description`,
`category`, `websiteUrl`, `iconUrl`, `features`, `tags`) werden übernommen.
## Links
- Commit: [`8f2fd89`](https://git.kubebase.de/admin/tool-evaluator/commit/8f2fd89)
- Tag: [`v0.8.6`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.8.6)
+46
View File
@@ -0,0 +1,46 @@
# v0.9.0 — Release Notes
**Datum:** 2026-08-05 · **Tag:** [`v0.9.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.0)
## Neue Features
- **Neuausrichtung der Versionierung:** Die Dokumentation startet mit dieser
Version neu bei `v0.9.0`. Ältere Release-Notizen und Versionen-Snapshots
(v0.6.0v0.8.6) wurden entfernt. Das Handbuch und die Referenz (API/Admin)
sind jetzt wieder für jede Version verfügbar — auch für neuere Versionen.
- **Sprachsuffixe:** Alle Dokumentationsdateien verwenden jetzt einheitlich die
Suffixe `.de.md` und `.en.md`. Damit lassen sich später weitere Sprachen
ergänzen; die App liefert automatisch die passende Sprachfassung.
- **Import — fertige Beispieldatei:** Unter `docs/examples/import-tools.yaml`
liegt eine sofort importierbare YAML-Beispieldatei mit 24 gängigen
Enterprise-Tools (Kategorien wie Kommunikation, Monitoring, CI/CD,
Infrastruktur). Die Datei ist in der Administration-Dokumentation verlinkt.
## Fixes & Verbesserungen
- Der Versionsumschalter zeigt die Dokumentation jetzt auch für neuere
Versionen korrekt an (vorher fehlende Versionen-Snapshots machten Handbuch und
Referenz nicht verfügbar).
- Wording bereinigt: Die Tagline und Platzhaltertexte ohne Berufsbezeichnung
(„Bewerte dein Tool." / „Rate your Tool.", „Anonymer Benutzer" /
„Anonymous User"). Es werden keine Gender-Sonderformen mehr verwendet
(`Nutzer:innen``Nutzer`, `Ersteller:in``Ersteller`).
## API-Änderungen
- Keine Änderungen gegenüber v0.8.6 (siehe `lib/api-spec/openapi.yaml`).
## Betrieb / Upgrade
- **Migration:** keine. Bereits vorhandene Tools-, Bewertungs- und Konto-Daten
bleiben unverändert.
- **Breaking Changes:** keine.
## Bekannte Einschränkungen
- Keine im Rahmen dieses Releases.
## Links
- Commit: [`6eb3dfd`](https://git.kubebase.de/admin/tool-evaluator/commit/6eb3dfd)
- Tag: [`v0.9.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.0)
+46
View File
@@ -0,0 +1,46 @@
# v0.9.0 — Release Notes
**Date:** 2026-08-05 · **Tag:** [`v0.9.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.0)
## New Features
- **Versioning reset:** Documentation starts fresh at `v0.9.0` with this
release. Older release notes and version snapshots (v0.6.0v0.8.6) have been
removed. The handbook and reference (API/admin) are now available again for
every version — including newer versions.
- **Language suffixes:** All documentation files now consistently use the
`.de.md` and `.en.md` suffixes. This makes it easy to add more languages
later; the app automatically serves the matching language variant.
- **Import — ready-to-use example file:** A ready-to-import YAML example file
with 24 common enterprise tools is provided at
`docs/examples/import-tools.yaml` (categories such as communication,
monitoring, CI/CD, infrastructure). The file is linked from the
administration documentation.
## Fixes & Polish
- The version switcher now displays documentation correctly for newer versions
as well (previously, missing version snapshots made the handbook and
reference unavailable).
- Wording cleanup: tagline and placeholder texts no longer reference a specific
job title ("Rate your Tool.", "Anonymous User"). No gender-specific forms are
used anymore.
## API Changes
- No changes compared to v0.8.6 (see `lib/api-spec/openapi.yaml`).
## Operations / Upgrade
- **Migration:** none. Existing tool, rating, and account data remain
unchanged.
- **Breaking Changes:** none.
## Known Limitations
- None within the scope of this release.
## Links
- Commit: [`6eb3dfd`](https://git.kubebase.de/admin/tool-evaluator/commit/6eb3dfd)
- Tag: [`v0.9.0`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.0)
@@ -32,6 +32,49 @@ Zentraler Zugriff auf den Tool-Katalog.
- **Massenaktion:** mehrere Tools auswählen und 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 (Bestätigungsdialog; soft gelöschte Tools sind aus allen öffentlichen Ansichten
entfernt und können wiederhergestellt oder endgültig gelöscht werden). entfernt und können wiederhergestellt oder endgültig gelöscht werden).
- **Importieren** (Premium): über die Schaltfläche **Importieren** oben rechts
können mehrere Tools gleichzeitig angelegt werden. Das Format wird automatisch
erkannt (CSV, JSON oder YAML); für CSV lässt sich der Trenner wählen
(automatisch, Komma, Semikolon oder Tabulator). Die Daten lassen sich direkt
ins Formular einfügen oder als Datei hochladen.
Unterstützte Felder: `name` (Pflicht), `description`, `category`, `websiteUrl`,
`iconUrl`, `features`, `tags` (`features`/`tags` sind mit `|` getrennte Listen).
**CSV-Beispiel:**
```csv
name;description;category;features;tags
Grafana;Observability- und Dashboard-Plattform;Monitoring;Dashboards|Alerts;devops
Prometheus;Zeitreihen-Datenbank;Monitoring;Metrics;devops
```
**JSON-Beispiel:**
```json
[
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
{ "name": "Prometheus", "category": "Monitoring" }
]
```
**YAML-Beispiel:**
```yaml
- name: Grafana
category: Monitoring
features:
- Dashboards
- name: Prometheus
category: Monitoring
```
Eine umfangreichere, fertig importierbare Beispieldatei liegt unter
`docs/examples/import-tools.yaml` (24 gängige Enterprise-Tools).
Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer
aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt
Audit-Log-Einträge.
## Tab „Audit-Log" ## Tab „Audit-Log"
@@ -32,6 +32,49 @@ Central access to the tool catalog.
- **Bulk action:** select multiple tools and move them to the trash - **Bulk action:** select multiple tools and move them to the trash
(confirmation dialog; soft-deleted tools are removed from all public views (confirmation dialog; soft-deleted tools are removed from all public views
and can be restored or permanently deleted). and can be restored or permanently deleted).
- **Import** (premium): via the **Import** button at the top right, multiple
tools can be created at once. The format is detected automatically (CSV,
JSON or YAML); for CSV the delimiter can be chosen (auto-detect, comma,
semicolon or tab). Data can be pasted directly into the form or uploaded
as a file.
Supported fields: `name` (required), `description`, `category`, `websiteUrl`,
`iconUrl`, `features`, `tags` (`features`/`tags` are `|`-separated lists).
**CSV example:**
```csv
name;description;category;features;tags
Grafana;Observability and dashboard platform;Monitoring;Dashboards|Alerts;devops
Prometheus;Time-series database;Monitoring;Metrics;devops
```
**JSON example:**
```json
[
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
{ "name": "Prometheus", "category": "Monitoring" }
]
```
**YAML example:**
```yaml
- name: Grafana
category: Monitoring
features:
- Dashboards
- name: Prometheus
category: Monitoring
```
A larger, ready-to-import example file is located at
`docs/examples/import-tools.yaml` (24 common enterprise tools).
During import, individual faulty rows are skipped and listed with their row
number; correct rows are still created. Every import produces audit-log
entries.
## "Audit log" tab ## "Audit log" tab
@@ -6,7 +6,7 @@ Besuch bis zum Anlegen und Bewerten eines Tools.
## 1. Anmelden ## 1. Anmelden
Die meisten Aktionen (Tool anlegen, bewerten, Watchlist, Vergleichen) erfordern Die meisten Aktionen (Tool anlegen, bewerten, Merkliste, Vergleichen) erfordern
ein Konto. Klicke unten links auf **Anmelden**. Je nach Konfiguration der ein Konto. Klicke unten links auf **Anmelden**. Je nach Konfiguration der
Instanz hast du zwei Möglichkeiten: Instanz hast du zwei Möglichkeiten:
@@ -47,7 +47,7 @@ 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) - [Merkliste](/docs/handbook/watchlist)
- [Analytics](/docs/handbook/analytics) - [Analytics](/docs/handbook/analytics)
- [Pläne & Berechtigungen](/docs/handbook/plaene) - [Pläne & Berechtigungen](/docs/handbook/plaene)
- [Administration](/docs/handbook/administration) - [Administration](/docs/handbook/administration)
@@ -2,7 +2,7 @@
# Willkommen bei toolr # Willkommen bei toolr
toolr ist eine Plattform zum **Entdecken, Bewerten und Vergleichen von toolr ist eine Plattform zum **Entdecken, Bewerten und Vergleichen von
Entwicklungstools**. Nutzer:innen pflegen einen gemeinsamen Katalog von Tools, Entwicklungstools**. Nutzer pflegen einen gemeinsamen Katalog von Tools,
vergeben Bewertungen (Nützlichkeit & Bedienbarkeit) und nutzen Statistiken, um vergeben Bewertungen (Nützlichkeit & Bedienbarkeit) und nutzen Statistiken, um
die richtige Wahl zu treffen. die richtige Wahl zu treffen.
@@ -12,13 +12,14 @@ 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 | | **Tool bearbeiten/löschen** | Eigene Tools pflegen (Ersteller oder Admin) | Angemeldet |
| **Bewerten** | Nützlichkeit & Bedienbarkeit (15) plus Kommentar vergeben | Angemeldet | | **Bewerten** | Nützlichkeit & Bedienbarkeit (15) plus Kommentar vergeben | Angemeldet |
| **Watchlist** | Tools als Favoriten speichern | Premium | | **Merkliste** | Tools als Favoriten speichern | Premium |
| **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium | | **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium |
| **Kosten erfassen** | Lizenz- und Kostenmodelle je Tool eintragen | Premium | | **Kosten erfassen** | Lizenz- und Kostenmodelle je Tool eintragen | Premium |
| **Analytics** | Statistiken, Top-Tools, Verteilungen | Alle | | **Analytics** | Statistiken, Top-Tools, Verteilungen | Alle |
| **Papierkorb** | Soft-gelöschte Tools wiederherstellen oder endgültig löschen | Premium | | **Papierkorb** | Soft-gelöschte Tools wiederherstellen oder endgültig löschen | Premium |
| **Import** | Mehrere Tools per CSV, JSON oder YAML anlegen | Admin (Premium) |
| **Admin** | Nutzerverwaltung, Audit-Log, Systeminformationen | Admin | | **Admin** | Nutzerverwaltung, Audit-Log, Systeminformationen | Admin |
| **Redundanz** | Automatische Doppelungs-Erkennung | Admin | | **Redundanz** | Automatische Doppelungs-Erkennung | Admin |
@@ -18,6 +18,7 @@ tools**. Users maintain a shared catalog of tools, submit ratings
| **Record costs** | Enter license and cost models per tool | Premium | | **Record costs** | Enter license and cost models per tool | Premium |
| **Analytics** | Statistics, top tools, distributions | Everyone | | **Analytics** | Statistics, top tools, distributions | Everyone |
| **Trash** | Restore soft-deleted tools or delete them permanently | Premium | | **Trash** | Restore soft-deleted tools or delete them permanently | Premium |
| **Import** | Create multiple tools via CSV, JSON or YAML | Admin (premium) |
| **Admin** | User management, audit log, system information | Admin | | **Admin** | User management, audit log, system information | Admin |
| **Redundancy detection** | Automatic duplicate detection | Admin | | **Redundancy detection** | Automatic duplicate detection | Admin |
@@ -1,7 +1,7 @@
[ [
{ {
"slug": "index", "slug": "index",
"file": "index.md", "file": "index.de.md",
"title": "Überblick", "title": "Überblick",
"order": 1, "order": 1,
"fileEn": "index.en.md", "fileEn": "index.en.md",
@@ -9,7 +9,7 @@
}, },
{ {
"slug": "getting-started", "slug": "getting-started",
"file": "getting-started.md", "file": "getting-started.de.md",
"title": "Erste Schritte", "title": "Erste Schritte",
"order": 2, "order": 2,
"fileEn": "getting-started.en.md", "fileEn": "getting-started.en.md",
@@ -17,7 +17,7 @@
}, },
{ {
"slug": "konto", "slug": "konto",
"file": "konto.md", "file": "konto.de.md",
"title": "Anmelden & Konto", "title": "Anmelden & Konto",
"order": 3, "order": 3,
"fileEn": "konto.en.md", "fileEn": "konto.en.md",
@@ -25,7 +25,7 @@
}, },
{ {
"slug": "tools-finden", "slug": "tools-finden",
"file": "tools-finden.md", "file": "tools-finden.de.md",
"title": "Tools finden & durchsuchen", "title": "Tools finden & durchsuchen",
"order": 4, "order": 4,
"fileEn": "tools-finden.en.md", "fileEn": "tools-finden.en.md",
@@ -33,7 +33,7 @@
}, },
{ {
"slug": "tool-anlegen", "slug": "tool-anlegen",
"file": "tool-anlegen.md", "file": "tool-anlegen.de.md",
"title": "Tool anlegen", "title": "Tool anlegen",
"order": 5, "order": 5,
"fileEn": "tool-anlegen.en.md", "fileEn": "tool-anlegen.en.md",
@@ -41,7 +41,7 @@
}, },
{ {
"slug": "tool-bearbeiten", "slug": "tool-bearbeiten",
"file": "tool-bearbeiten.md", "file": "tool-bearbeiten.de.md",
"title": "Tool bearbeiten & löschen", "title": "Tool bearbeiten & löschen",
"order": 6, "order": 6,
"fileEn": "tool-bearbeiten.en.md", "fileEn": "tool-bearbeiten.en.md",
@@ -49,7 +49,7 @@
}, },
{ {
"slug": "bewerten", "slug": "bewerten",
"file": "bewerten.md", "file": "bewerten.de.md",
"title": "Bewerten", "title": "Bewerten",
"order": 7, "order": 7,
"fileEn": "bewerten.en.md", "fileEn": "bewerten.en.md",
@@ -57,15 +57,15 @@
}, },
{ {
"slug": "watchlist", "slug": "watchlist",
"file": "watchlist.md", "file": "watchlist.de.md",
"title": "Watchlist", "title": "Merkliste",
"order": 8, "order": 8,
"fileEn": "watchlist.en.md", "fileEn": "watchlist.en.md",
"titleEn": "Watchlist" "titleEn": "Watchlist"
}, },
{ {
"slug": "vergleichen", "slug": "vergleichen",
"file": "vergleichen.md", "file": "vergleichen.de.md",
"title": "Vergleichen", "title": "Vergleichen",
"order": 9, "order": 9,
"fileEn": "vergleichen.en.md", "fileEn": "vergleichen.en.md",
@@ -73,7 +73,7 @@
}, },
{ {
"slug": "analytics", "slug": "analytics",
"file": "analytics.md", "file": "analytics.de.md",
"title": "Analytics", "title": "Analytics",
"order": 10, "order": 10,
"fileEn": "analytics.en.md", "fileEn": "analytics.en.md",
@@ -81,7 +81,7 @@
}, },
{ {
"slug": "plaene", "slug": "plaene",
"file": "plaene.md", "file": "plaene.de.md",
"title": "Pläne & Berechtigungen", "title": "Pläne & Berechtigungen",
"order": 11, "order": 11,
"fileEn": "plaene.en.md", "fileEn": "plaene.en.md",
@@ -89,7 +89,7 @@
}, },
{ {
"slug": "kosten", "slug": "kosten",
"file": "kosten.md", "file": "kosten.de.md",
"title": "Kosten erfassen", "title": "Kosten erfassen",
"order": 12, "order": 12,
"fileEn": "kosten.en.md", "fileEn": "kosten.en.md",
@@ -97,7 +97,7 @@
}, },
{ {
"slug": "administration", "slug": "administration",
"file": "administration.md", "file": "administration.de.md",
"title": "Administration", "title": "Administration",
"order": 13, "order": 13,
"fileEn": "administration.en.md", "fileEn": "administration.en.md",
@@ -105,7 +105,7 @@
}, },
{ {
"slug": "redundanz", "slug": "redundanz",
"file": "redundanz.md", "file": "redundanz.de.md",
"title": "Redundanz-Dashboard", "title": "Redundanz-Dashboard",
"order": 14, "order": 14,
"fileEn": "redundanz.en.md", "fileEn": "redundanz.en.md",
@@ -113,7 +113,7 @@
}, },
{ {
"slug": "papierkorb", "slug": "papierkorb",
"file": "papierkorb.md", "file": "papierkorb.de.md",
"title": "Papierkorb", "title": "Papierkorb",
"order": 15, "order": 15,
"fileEn": "papierkorb.en.md", "fileEn": "papierkorb.en.md",
@@ -121,7 +121,7 @@
}, },
{ {
"slug": "tastatur", "slug": "tastatur",
"file": "tastatur.md", "file": "tastatur.de.md",
"title": "Tastenkürzel & Kommandopalette", "title": "Tastenkürzel & Kommandopalette",
"order": 16, "order": 16,
"fileEn": "tastatur.en.md", "fileEn": "tastatur.en.md",
@@ -129,7 +129,7 @@
}, },
{ {
"slug": "datenmodell", "slug": "datenmodell",
"file": "datenmodell.md", "file": "datenmodell.de.md",
"title": "Datenmodell", "title": "Datenmodell",
"order": 17, "order": 17,
"fileEn": "datenmodell.en.md", "fileEn": "datenmodell.en.md",
@@ -22,7 +22,7 @@ Der aktive Modus steht im Endpunkt
Dein Profil (Avatar, Name, E-Mail, Tarif) siehst du unten links im Dein Profil (Avatar, Name, E-Mail, Tarif) siehst du unten links im
Benutzermenü. Dort stehen dir folgende Aktionen zur Verfügung: Benutzermenü. Dort stehen dir folgende Aktionen zur Verfügung:
- **Watchlist** — deine gespeicherten Tools (nur mit dem entsprechenden Tarif). - **Merkliste** — deine gespeicherten Tools (nur mit dem entsprechenden Tarif).
- **Papierkorb** — wiederherstellbare, gelöschte Tools (Premium/Enterprise). - **Papierkorb** — wiederherstellbare, gelöschte Tools (Premium/Enterprise).
- **Passwort ändern** — für lokale Konten direkt in toolr; für OIDC-Konten wird - **Passwort ändern** — für lokale Konten direkt in toolr; für OIDC-Konten wird
die Passwortverwaltung im Identitätsanbieter angeboten. die Passwortverwaltung im Identitätsanbieter angeboten.
@@ -47,7 +47,7 @@ API-Referenz: [`POST /auth/me/password`](/docs/reference/endpoints/auth#changeMy
- die **Listenansicht** und **Dichte** im Bereich Tools durchsuchen anpassen - die **Listenansicht** und **Dichte** im Bereich Tools durchsuchen anpassen
(siehe [Tools finden & durchsuchen](/docs/handbook/tools-finden)). (siehe [Tools finden & durchsuchen](/docs/handbook/tools-finden)).
Deine Präferenzen (inkl. Watchlist) werden im Endpunkt Deine Präferenzen (inkl. Merkliste) werden im Endpunkt
[`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences) [`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences)
gespeichert und über [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences) gespeichert und über [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences)
aktualisiert. aktualisiert.
@@ -9,7 +9,7 @@ Feature-Beschränkungen.
| Tarif | Beschreibung | | Tarif | Beschreibung |
| --- | --- | | --- | --- |
| **Free** | Grundfunktionen: suchen, filtern, ansehen, Analytics | | **Free** | Grundfunktionen: suchen, filtern, ansehen, Analytics |
| **Premium** | Zusätzlich Watchlist, Vergleichen, Papierkorb, Kosten | | **Premium** | Zusätzlich Merkliste, Vergleichen, Papierkorb, Kosten |
| **Enterprise** | Alle Premium-Features + erweiterter Support | | **Enterprise** | Alle Premium-Features + erweiterter Support |
### Feature-Berechtigungen ### Feature-Berechtigungen
@@ -19,9 +19,10 @@ Premium/Enterprise schalten folgende Features frei:
| Feature | Funktion | Mehr erfahren | | Feature | Funktion | Mehr erfahren |
| --- | --- | --- | | --- | --- | --- |
| `compare` | Tools vergleichen | [Vergleichen](/docs/handbook/vergleichen) | | `compare` | Tools vergleichen | [Vergleichen](/docs/handbook/vergleichen) |
| `watchlist` | Favoritenliste | [Watchlist](/docs/handbook/watchlist) | | `watchlist` | Favoritenliste | [Merkliste](/docs/handbook/watchlist) |
| `trash` | Papierkorb (soft gelöschte Tools) | [Papierkorb](/docs/handbook/papierkorb) | | `trash` | Papierkorb (soft gelöschte Tools) | [Papierkorb](/docs/handbook/papierkorb) |
| `costs` | Kosten-/Lizenzmodelle erfassen | [Kosten erfassen](/docs/handbook/kosten) | | `costs` | Kosten-/Lizenzmodelle erfassen | [Kosten erfassen](/docs/handbook/kosten) |
| `tool-import` | Tools per CSV/JSON/YAML importieren (Admin) | [Administration](/docs/handbook/administration) |
Fehlt dir ein Feature, zeigt die App einen **Upgrade-Hinweis** mit Link zur Fehlt dir ein Feature, zeigt die App einen **Upgrade-Hinweis** mit Link zur
Tarifverwaltung. Tarifverwaltung.
@@ -22,6 +22,7 @@ Premium/Enterprise unlock the following features:
| `watchlist` | Favorites list | [Watchlist](/docs/handbook/watchlist) | | `watchlist` | Favorites list | [Watchlist](/docs/handbook/watchlist) |
| `trash` | Trash (soft-deleted tools) | [Trash](/docs/handbook/papierkorb) | | `trash` | Trash (soft-deleted tools) | [Trash](/docs/handbook/papierkorb) |
| `costs` | Record cost/license models | [Recording costs](/docs/handbook/kosten) | | `costs` | Record cost/license models | [Recording costs](/docs/handbook/kosten) |
| `tool-import` | Import tools via CSV/JSON/YAML (admin) | [Administration](/docs/handbook/administration) |
If you are missing a feature, the app shows an **upgrade notice** with a link If you are missing a feature, the app shows an **upgrade notice** with a link
to the plan management. to the plan management.
@@ -15,7 +15,7 @@ Ohne Eingabe zeigt die Palette:
- **Zuletzt angesehen** — die letzten 5 Tools, die du besucht hast. - **Zuletzt angesehen** — die letzten 5 Tools, die du besucht hast.
- **Navigation** — Tools durchsuchen, Tool hinzufügen, Analytics sowie - **Navigation** — Tools durchsuchen, Tool hinzufügen, Analytics sowie
(abhängig von Berechtigungen) Watchlist, Papierkorb und Admin. (abhängig von Berechtigungen) Merkliste, Papierkorb und Admin.
### Suche ### Suche
@@ -43,7 +43,7 @@ Mit **Filter zurücksetzen** bzw. **Alle entfernen** räumst du sie wieder auf.
- **Ansicht wechseln:** Raster / Tabelle / Zeilen. - **Ansicht wechseln:** Raster / Tabelle / Zeilen.
- **Dichte:** gemütlich / kompakt (Schieberegler). - **Dichte:** gemütlich / kompakt (Schieberegler).
Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer:innen Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer
zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und
Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen
kannst. kannst.
@@ -54,12 +54,12 @@ In der Tabellenansicht sind die Spalten **Tool**, **Bewertung** und **Anzahl
Bewertungen** sortierbar. Beim Überfahren einer Zeile erscheint eine Vorschau Bewertungen** sortierbar. Beim Überfahren einer Zeile erscheint eine Vorschau
mit Bewertungsdetails, Tags und Mini-Balken. mit Bewertungsdetails, Tags und Mini-Balken.
## Auswählen für Vergleich & Watchlist ## Auswählen für Vergleich & Merkliste
- Auf jeder Karte/Zeile findest du ein **Vergleichs-Icon**, mit dem du Tools zur - Auf jeder Karte/Zeile findest du ein **Vergleichs-Icon**, mit dem du Tools zur
[Vergleichsleiste](/docs/handbook/vergleichen) hinzufügst. [Vergleichsleiste](/docs/handbook/vergleichen) hinzufügst.
- Das **Lesezeichen-Icon** speichert Tools in deiner - Das **Lesezeichen-Icon** speichert Tools in deiner
[Watchlist](/docs/handbook/watchlist) (nur mit dem entsprechenden Tarif). [Merkliste](/docs/handbook/watchlist) (nur mit dem entsprechenden Tarif).
## API ## API
@@ -1,10 +1,10 @@
# Watchlist # Merkliste
Die **Watchlist** ist eine persönliche Favoritenliste. Tools darin kannst du Die **Merkliste** ist eine persönliche Favoritenliste. Tools darin kannst du
jederzeit per Klick wieder aufrufen und vergleichen. jederzeit per Klick wieder aufrufen und vergleichen.
> Die Watchlist ist ein **Premium-Feature** (Premium/Enterprise) und steht > Die Merkliste ist ein **Premium-Feature** (Premium/Enterprise) und steht
> Admins immer zur Verfügung. > Admins immer zur Verfügung.
## Voraussetzung ## Voraussetzung
@@ -17,18 +17,18 @@ beim Lesezeichen ein Hinweis auf den Tarifwechsel
- Auf jeder Karte/Zeile im Bereich **Tools durchsuchen** findest du das - Auf jeder Karte/Zeile im Bereich **Tools durchsuchen** findest du das
**Lesezeichen-Icon**. **Lesezeichen-Icon**.
- Ein Klick speichert das Tool in deiner Watchlist — das Icon wird gefüllt. - Ein Klick speichert das Tool in deiner Merkliste — das Icon wird gefüllt.
- Ein erneuter Klick entfernt es wieder. - Ein erneuter Klick entfernt es wieder.
## Watchlist ansehen ## Merkliste ansehen
Öffne die Watchlist über das Benutzermenü oder die Seitenleiste. Sie zeigt alle Öffne die Merkliste über das Benutzermenü oder die Seitenleiste. Sie zeigt alle
gespeicherten Tools als Karten. Das gefüllte Lesezeichen auf einer Karte gespeicherten Tools als Karten. Das gefüllte Lesezeichen auf einer Karte
entfernt das Tool aus der Liste. entfernt das Tool aus der Liste.
## Wo wird die Watchlist gespeichert? ## Wo wird die Merkliste gespeichert?
Die Watchlist ist eine Liste von Tool-IDs in deinen **Benutzerpräferenzen**. Die Merkliste ist eine Liste von Tool-IDs in deinen **Benutzerpräferenzen**.
Damit ist sie geräteübergreifend mit deinem Konto verbunden. Damit ist sie geräteübergreifend mit deinem Konto verbunden.
API-Referenz: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeWatchlist). API-Referenz: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeMerkliste).
@@ -2206,6 +2206,78 @@
} }
] ]
}, },
{
"name": "ToolImportBody",
"description": "",
"fields": [
{
"name": "format",
"type": {
"kind": "type",
"value": "string"
},
"required": false,
"description": "",
"constraints": "auto, csv, json, yaml"
},
{
"name": "delimiter",
"type": {
"kind": "type",
"value": "string"
},
"required": false,
"description": "",
"constraints": "auto, comma, semicolon, tab"
},
{
"name": "data",
"type": {
"kind": "type",
"value": "string"
},
"required": true,
"description": "",
"constraints": ""
}
]
},
{
"name": "ToolImportResponse",
"description": "",
"fields": [
{
"name": "imported",
"type": {
"kind": "type",
"value": "integer"
},
"required": true,
"description": "",
"constraints": ""
},
{
"name": "total",
"type": {
"kind": "type",
"value": "integer"
},
"required": true,
"description": "",
"constraints": ""
},
{
"name": "errors",
"type": {
"kind": "array",
"value": "object"
},
"required": true,
"description": "",
"constraints": ""
}
]
},
{ {
"name": "ToolUpdate", "name": "ToolUpdate",
"description": "", "description": "",
+27
View File
@@ -0,0 +1,27 @@
# v0.9.1 — Release Notes
**Datum:** 2026-08-05 · **Tag:** [`v0.9.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.1)
## Fixes & Verbesserungen
- **Dokumentation:** Release-Notizen werden wieder korrekt auf der Hilfe-Seite
angezeigt. Ein doppelter `releases/`-Pfad in der versionierten
Dokumentation lieferte zuvor eine leere Seite (404).
## API-Änderungen
- Keine.
## Betrieb / Upgrade
- **Migration:** keine. **Breaking Changes:** keine.
## Bekannte Einschränkungen
- Das Vergleichen war serverseitig auf 8 Tools begrenzt; wird in v0.9.2 auf 9
erhöht und im Client konsistent abgesichert.
## Links
- Commit: [`e66a332`](https://git.kubebase.de/admin/tool-evaluator/commit/e66a332)
- Tag: [`v0.9.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.1)
+27
View File
@@ -0,0 +1,27 @@
# v0.9.1 — Release Notes
**Date:** 2026-08-05 · **Tag:** [`v0.9.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.1)
## Fixes & Polish
- **Documentation:** Release notes render correctly again on the help page. A
duplicated `releases/` path prefix in the versioned docs previously returned
an empty page (404).
## API Changes
- None.
## Operations / Upgrade
- **Migration:** none. **Breaking Changes:** none.
## Known Limitations
- Comparing was limited to 8 tools server-side; this is raised to 9 in v0.9.2
and consistently enforced in the client.
## Links
- Commit: [`e66a332`](https://git.kubebase.de/admin/tool-evaluator/commit/e66a332)
- Tag: [`v0.9.1`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.1)
@@ -32,6 +32,49 @@ Zentraler Zugriff auf den Tool-Katalog.
- **Massenaktion:** mehrere Tools auswählen und 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 (Bestätigungsdialog; soft gelöschte Tools sind aus allen öffentlichen Ansichten
entfernt und können wiederhergestellt oder endgültig gelöscht werden). entfernt und können wiederhergestellt oder endgültig gelöscht werden).
- **Importieren** (Premium): über die Schaltfläche **Importieren** oben rechts
können mehrere Tools gleichzeitig angelegt werden. Das Format wird automatisch
erkannt (CSV, JSON oder YAML); für CSV lässt sich der Trenner wählen
(automatisch, Komma, Semikolon oder Tabulator). Die Daten lassen sich direkt
ins Formular einfügen oder als Datei hochladen.
Unterstützte Felder: `name` (Pflicht), `description`, `category`, `websiteUrl`,
`iconUrl`, `features`, `tags` (`features`/`tags` sind mit `|` getrennte Listen).
**CSV-Beispiel:**
```csv
name;description;category;features;tags
Grafana;Observability- und Dashboard-Plattform;Monitoring;Dashboards|Alerts;devops
Prometheus;Zeitreihen-Datenbank;Monitoring;Metrics;devops
```
**JSON-Beispiel:**
```json
[
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
{ "name": "Prometheus", "category": "Monitoring" }
]
```
**YAML-Beispiel:**
```yaml
- name: Grafana
category: Monitoring
features:
- Dashboards
- name: Prometheus
category: Monitoring
```
Eine umfangreichere, fertig importierbare Beispieldatei liegt unter
`docs/examples/import-tools.yaml` (24 gängige Enterprise-Tools).
Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer
aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt
Audit-Log-Einträge.
## Tab „Audit-Log" ## Tab „Audit-Log"
@@ -32,6 +32,49 @@ Central access to the tool catalog.
- **Bulk action:** select multiple tools and move them to the trash - **Bulk action:** select multiple tools and move them to the trash
(confirmation dialog; soft-deleted tools are removed from all public views (confirmation dialog; soft-deleted tools are removed from all public views
and can be restored or permanently deleted). and can be restored or permanently deleted).
- **Import** (premium): via the **Import** button at the top right, multiple
tools can be created at once. The format is detected automatically (CSV,
JSON or YAML); for CSV the delimiter can be chosen (auto-detect, comma,
semicolon or tab). Data can be pasted directly into the form or uploaded
as a file.
Supported fields: `name` (required), `description`, `category`, `websiteUrl`,
`iconUrl`, `features`, `tags` (`features`/`tags` are `|`-separated lists).
**CSV example:**
```csv
name;description;category;features;tags
Grafana;Observability and dashboard platform;Monitoring;Dashboards|Alerts;devops
Prometheus;Time-series database;Monitoring;Metrics;devops
```
**JSON example:**
```json
[
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
{ "name": "Prometheus", "category": "Monitoring" }
]
```
**YAML example:**
```yaml
- name: Grafana
category: Monitoring
features:
- Dashboards
- name: Prometheus
category: Monitoring
```
A larger, ready-to-import example file is located at
`docs/examples/import-tools.yaml` (24 common enterprise tools).
During import, individual faulty rows are skipped and listed with their row
number; correct rows are still created. Every import produces audit-log
entries.
## "Audit log" tab ## "Audit log" tab

Some files were not shown because too many files have changed in this diff Show More