diff --git a/data/cv-en.json b/data/cv-en.json
index abcf007..7663231 100644
--- a/data/cv-en.json
+++ b/data/cv-en.json
@@ -542,6 +542,7 @@
"projects": [
{
"title": "Immich Photo Manager - AI-Powered Photo Library MCP Server",
+ "category": "cli",
"projectName": "Immich Photo Manager",
"projectDesc": "AI-Powered Photo Library MCP Server",
"url": "https://drolosoft.com/immich-photo-manager.html?lang=en",
@@ -570,6 +571,7 @@
},
{
"title": "Cmux Resurrect - Terminal Session Persistence Tool",
+ "category": "cli",
"projectName": "Cmux Resurrect",
"projectDesc": "Terminal Session Persistence Tool",
"url": "https://drolosoft.com/cmux-resurrect.html?lang=en",
@@ -598,6 +600,7 @@
},
{
"title": "Gotify Commander - Bidirectional Server Control Plugin",
+ "category": "plugin",
"projectName": "Gotify Commander",
"projectDesc": "Bidirectional Server Control Plugin",
"url": "https://github.com/drolosoft/gotify-commander",
@@ -627,6 +630,7 @@
},
{
"title": "SoundInbox - Native macOS Email Sound Alerts",
+ "category": "app",
"projectName": "SoundInbox",
"projectDesc": "Native macOS Email Sound Alerts",
"url": "https://drolosoft.com/soundinbox.html?lang=en",
@@ -654,6 +658,7 @@
},
{
"title": "Somos Una Ola - Beach Cleaning Initiative",
+ "category": "web",
"projectName": "Somos Una Ola",
"projectDesc": "Beach Cleaning Initiative",
"url": "https://somosunaola.org",
@@ -677,6 +682,7 @@
},
{
"title": "Herrumbre Vivo Arte - Artist Portfolio Website",
+ "category": "web",
"projectName": "Herrumbre Vivo Arte",
"projectDesc": "Artist Portfolio Website",
"url": "https://herrumbrevivoarte.com",
@@ -699,6 +705,7 @@
},
{
"title": "La Porra.club - Football Prediction Platform",
+ "category": "webapp",
"projectName": "La Porra.club",
"projectDesc": "Football Prediction Platform",
"url": "https://laporra.club",
@@ -725,6 +732,7 @@
},
{
"title": "CDC Starter Kit - SAP Customer Data Cloud Demo",
+ "category": "sdk",
"projectName": "CDC Starter Kit",
"projectDesc": "SAP Customer Data Cloud Demo",
"url": "https://gigyademo.com/cdc-starter-kit/",
@@ -754,6 +762,7 @@
},
{
"title": "Third Party Contributions",
+ "category": "contrib",
"url": "",
"projectLogo": "",
"location": "Various",
diff --git a/data/cv-es.json b/data/cv-es.json
index 656ddc2..b2f0049 100644
--- a/data/cv-es.json
+++ b/data/cv-es.json
@@ -542,6 +542,7 @@
"projects": [
{
"title": "Immich Photo Manager - Servidor MCP para Gestión de Fotos con IA",
+ "category": "cli",
"projectName": "Immich Photo Manager",
"projectDesc": "Servidor MCP para Gestión de Fotos con IA",
"url": "https://drolosoft.com/immich-photo-manager.html?lang=es",
@@ -570,6 +571,7 @@
},
{
"title": "Cmux Resurrect - Herramienta de Persistencia de Sesiones de Terminal",
+ "category": "cli",
"projectName": "Cmux Resurrect",
"projectDesc": "Herramienta de Persistencia de Sesiones de Terminal",
"url": "https://drolosoft.com/cmux-resurrect.html?lang=es",
@@ -598,6 +600,7 @@
},
{
"title": "Gotify Commander - Plugin Bidireccional de Control de Servidores",
+ "category": "plugin",
"projectName": "Gotify Commander",
"projectDesc": "Plugin Bidireccional de Control de Servidores",
"url": "https://github.com/drolosoft/gotify-commander",
@@ -627,6 +630,7 @@
},
{
"title": "SoundInbox - Alertas Sonoras de Email para macOS",
+ "category": "app",
"projectName": "SoundInbox",
"projectDesc": "Alertas Sonoras de Email para macOS",
"url": "https://drolosoft.com/soundinbox.html?lang=es",
@@ -654,6 +658,7 @@
},
{
"title": "Somos Una Ola - Iniciativa de Limpieza de Playas",
+ "category": "web",
"projectName": "Somos Una Ola",
"projectDesc": "Iniciativa de Limpieza de Playas",
"url": "https://somosunaola.org",
@@ -677,6 +682,7 @@
},
{
"title": "Herrumbre Vivo Arte - Sitio Web Portfolio de Artista",
+ "category": "web",
"projectName": "Herrumbre Vivo Arte",
"projectDesc": "Sitio Web Portfolio de Artista",
"url": "https://herrumbrevivoarte.com",
@@ -699,6 +705,7 @@
},
{
"title": "La Porra.club - Plataforma de Predicción de Fútbol",
+ "category": "webapp",
"projectName": "La Porra.club",
"projectDesc": "Plataforma de Predicción de Fútbol",
"url": "https://laporra.club",
@@ -725,6 +732,7 @@
},
{
"title": "CDC Starter Kit - Demo de SAP Customer Data Cloud",
+ "category": "sdk",
"projectName": "CDC Starter Kit",
"projectDesc": "Demo de SAP Customer Data Cloud",
"url": "https://gigyademo.com/cdc-starter-kit/",
@@ -754,6 +762,7 @@
},
{
"title": "Contribuciones a Proyectos de Terceros",
+ "category": "contrib",
"url": "",
"projectLogo": "",
"location": "Varios",
diff --git a/internal/models/cv.go b/internal/models/cv.go
index 94b9cc8..8b0f498 100644
--- a/internal/models/cv.go
+++ b/internal/models/cv.go
@@ -93,6 +93,7 @@ type Language struct {
type Project struct {
Title string `json:"title"`
+ Category string `json:"category,omitempty"` // Project type: cli, app, web, webapp, plugin, sdk, contrib
ProjectName string `json:"projectName,omitempty"` // Optional: linkable part of title
ProjectDesc string `json:"projectDesc,omitempty"` // Optional: non-linkable description part
ProjectID string `json:"projectID,omitempty"` // Unique ID for scrolling/navigation
diff --git a/internal/models/cv/cv.go b/internal/models/cv/cv.go
index 69fd25a..87edfba 100644
--- a/internal/models/cv/cv.go
+++ b/internal/models/cv/cv.go
@@ -98,6 +98,7 @@ type Language struct {
type Project struct {
Title string `json:"title"`
+ Category string `json:"category,omitempty"` // Project type: cli, app, web, webapp, plugin, sdk, contrib
ProjectName string `json:"projectName,omitempty"` // Optional: linkable part of title
ProjectDesc string `json:"projectDesc,omitempty"` // Optional: non-linkable description part
ProjectID string `json:"projectID,omitempty"` // Unique ID for scrolling/navigation
diff --git a/static/css/03-components/_cv-section.css b/static/css/03-components/_cv-section.css
index d458d5a..8d27d08 100644
--- a/static/css/03-components/_cv-section.css
+++ b/static/css/03-components/_cv-section.css
@@ -194,6 +194,27 @@
font-size: 1.2em;
}
+/* Category icon badges */
+.category-badge {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ color: white;
+ font-size: 0.7em;
+ padding: 0.2em 0.4em;
+ border-radius: 3px;
+ margin-left: 0.5em;
+ vertical-align: middle;
+}
+
+.category-cli { background: #5b21b6; } /* Purple — terminal */
+.category-app { background: #1d4ed8; } /* Blue — native app */
+.category-web { background: #0891b2; } /* Cyan — website */
+.category-webapp { background: #059669; } /* Teal — web app */
+.category-plugin { background: #d97706; } /* Amber — plugin */
+.category-sdk { background: #7c3aed; } /* Violet — SDK */
+.category-contrib { background: #6b7280; } /* Gray — contributions */
+
.stars-badge {
display: inline-flex;
align-items: center;
diff --git a/static/css/print.css b/static/css/print.css
index d4a5a45..614640e 100644
--- a/static/css/print.css
+++ b/static/css/print.css
@@ -105,7 +105,8 @@
text-decoration: none !important;
}
- .stars-badge {
+ .stars-badge,
+ .category-badge {
display: none !important;
}
diff --git a/templates/partials/sections/projects.html b/templates/partials/sections/projects.html
index d7b8022..a2390f7 100644
--- a/templates/partials/sections/projects.html
+++ b/templates/partials/sections/projects.html
@@ -30,6 +30,14 @@
{{if .URL}}{{.Title}}{{else}}{{.Title}}{{end}}
{{end}}
+ {{if eq .Category "cli"}}
+ {{else if eq .Category "app"}}
+ {{else if eq .Category "web"}}
+ {{else if eq .Category "webapp"}}
+ {{else if eq .Category "plugin"}}
+ {{else if eq .Category "sdk"}}
+ {{else if eq .Category "contrib"}}
+ {{end}}
{{if .Current}}LIVE{{end}}
{{if .GitRepoUrl}}GitHub{{end}}
{{if .GitRepoUrl}}{{if .Stars}}{{.Stars}} {{end}}stars{{end}}