diff --git a/src/components/AIQueryInterface.astro b/src/components/AIQueryInterface.astro
index a82da2e..d2e8f8f 100644
--- a/src/components/AIQueryInterface.astro
+++ b/src/components/AIQueryInterface.astro
@@ -458,7 +458,7 @@ document.addEventListener('DOMContentLoaded', () => {
};
return `
-
@@ -706,10 +708,10 @@ document.addEventListener('DOMContentLoaded', () => {
` : ''}
${toolRec.alternatives ? `
diff --git a/src/components/ToolCard.astro b/src/components/ToolCard.astro
index 6f2b846..f8fc161 100644
--- a/src/components/ToolCard.astro
+++ b/src/components/ToolCard.astro
@@ -44,7 +44,7 @@ const cardClass = isMethod ? 'card card-method tool-card' :
{tool.name}
{isMethod && Methode}
- {!isMethod && hasValidProjectUrl && Self-Hosted}
+ {!isMethod && hasValidProjectUrl && CC24-Server}
{!isMethod && tool.license !== 'Proprietary' && OSS}
{hasKnowledgebase && 📖}
diff --git a/src/components/ToolMatrix.astro b/src/components/ToolMatrix.astro
index d1d3bd0..6a43c65 100644
--- a/src/components/ToolMatrix.astro
+++ b/src/components/ToolMatrix.astro
@@ -246,6 +246,8 @@ domains.forEach((domain: any) => {
const tool = toolsData.find(t => t.name === toolName);
if (!tool) return;
+ const isMethod = tool.type === 'method';
+
// Update modal content
document.getElementById('tool-name').textContent = tool.name;
document.getElementById('tool-description').textContent = tool.description;
@@ -258,11 +260,15 @@ domains.forEach((domain: any) => {
tool.projectUrl.trim() !== "";
badgesContainer.innerHTML = '';
- if (hasValidProjectUrl) {
- badgesContainer.innerHTML += 'CC24-Server';
- }
- if (tool.license !== 'Proprietary') {
- badgesContainer.innerHTML += 'Open Source';
+ if (isMethod) {
+ badgesContainer.innerHTML += 'Methode';
+ } else {
+ if (hasValidProjectUrl) {
+ badgesContainer.innerHTML += 'CC24-Server';
+ }
+ if (tool.license !== 'Proprietary') {
+ badgesContainer.innerHTML += 'Open Source';
+ }
}
if (tool.knowledgebase === true) {
badgesContainer.innerHTML += 'Infos 📖';
@@ -296,10 +302,17 @@ domains.forEach((domain: any) => {
// Links
const linksContainer = document.getElementById('tool-links');
-
+
let linksHTML = '';
-
- if (hasValidProjectUrl) {
+
+ if (isMethod) {
+ // For methods, show link to the method description/documentation
+ linksHTML += `
+
+ Zur Methode
+
+ `;
+ } else if (hasValidProjectUrl) {
linksHTML += `
diff --git a/src/data/tools.yaml b/src/data/tools.yaml
index 3bfba51..8205ee8 100644
--- a/src/data/tools.yaml
+++ b/src/data/tools.yaml
@@ -905,7 +905,7 @@ tools:
integrierter Hash-Verifizierung für die Beweiskette. Die kostenlose
Version reicht für die meisten Aufgaben, unterstützt alle gängigen
Image-Formate. Etwas angestaubt in der Oberfläche, aber bewährt in
- tausenden Gerichtsverfahren.
+ tausenden Gerichtsverfahren. Freeware, aber nicht open source.
domains:
- law-enforcement
- incident-response
@@ -918,7 +918,7 @@ tools:
accessType: download
url: https://www.exterro.com/digital-forensics-software/ftk-imager
projectUrl: ''
- license: Freeware
+ license: Proprietary
knowledgebase: false
tags:
- gui
@@ -1276,7 +1276,7 @@ tools:
Analyse. Unterstützt alle gängigen Formate von RAW über E01 bis zu
VM-Images. Der schreibgeschützte Modus garantiert forensische Integrität
der Beweise. Besonders praktisch für schnelle Triage ohne vollständige
- Forensik-Suite.
+ Forensik-Suite. Freeware, aber nicht open source.
domains:
- incident-response
- law-enforcement
@@ -1289,7 +1289,7 @@ tools:
accessType: download
url: https://www.osforensics.com/tools/mount-disk-images.html
projectUrl: ''
- license: Freeware
+ license: Proprietary
knowledgebase: false
tags:
- gui
@@ -1298,6 +1298,7 @@ tools:
- read-only
- virtual-drive
- format-support
+ - freeware
- name: Thumbcache Viewer
type: software
description: >-
diff --git a/src/pages/index.astro b/src/pages/index.astro
index f9148fa..256a688 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -358,7 +358,7 @@ function createToolCard(tool) {
${tool.name}
${isMethod ? 'Methode' : ''}
- ${!isMethod && hasValidProjectUrl ? 'Self-Hosted' : ''}
+ ${!isMethod && hasValidProjectUrl ? 'CC24-Server' : ''}
${!isMethod && tool.license !== 'Proprietary' ? 'OSS' : ''}
${hasKnowledgebase ? '📖' : ''}
diff --git a/src/styles/global.css b/src/styles/global.css
index e5cfd1e..dd8fb17 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -1034,6 +1034,21 @@ Collaboration Section Collapse */
border-color: var(--color-oss);
}
+.tool-recommendation.method {
+ background-color: var(--color-method-bg);
+ border-color: var(--color-method);
+}
+
+.tool-detailed-recommendation.card-method {
+ background-color: var(--color-method-bg);
+ border-color: var(--color-method);
+}
+
+.tool-detailed-recommendation.card-method:hover {
+ border-color: var(--color-method);
+ box-shadow: 0 0 0 1px var(--color-method), var(--shadow-lg);
+}
+
.tool-rec-header {
display: flex;
justify-content: space-between;
diff --git a/src/utils/dataService.ts b/src/utils/dataService.ts
index 1c44eb1..e5ad538 100644
--- a/src/utils/dataService.ts
+++ b/src/utils/dataService.ts
@@ -5,6 +5,7 @@ import { z } from 'zod';
const ToolSchema = z.object({
name: z.string(),
+ icon: z.string().optional(),
type: z.string(),
description: z.string(),
domains: z.array(z.string()).optional().nullable().default([]),