diff --git a/apps/manacore/apps/landing/src/content/config.ts b/apps/manacore/apps/landing/src/content/config.ts index 17fa6c5fa..a5a760985 100644 --- a/apps/manacore/apps/landing/src/content/config.ts +++ b/apps/manacore/apps/landing/src/content/config.ts @@ -154,6 +154,30 @@ const devlogCollection = defineCollection({ featured: z.boolean().default(false), commits: z.number().optional(), readTime: z.number().optional(), + // Extended stats for activity grid + stats: z + .object({ + filesChanged: z.number(), + linesAdded: z.number(), + linesRemoved: z.number(), + }) + .optional(), + contributors: z + .array( + z.object({ + name: z.string(), + handle: z.string().optional(), + commits: z.number().optional(), + }) + ) + .optional(), + // Working hours (11:00 to 11:00 next day convention) + workingHours: z + .object({ + start: z.string(), // e.g., "2026-01-30T11:00" + end: z.string(), // e.g., "2026-01-31T11:00" + }) + .optional(), }), }); diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-01-23-production-launch.md b/apps/manacore/apps/landing/src/content/devlog/2026-01-23-production-launch.md index 9c56c3be2..385284c9d 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-01-23-production-launch.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-01-23-production-launch.md @@ -18,6 +18,17 @@ tags: featured: true commits: 43 readTime: 12 +stats: + filesChanged: 222 + linesAdded: 19273 + linesRemoved: 985 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 43 +workingHours: + start: '2026-01-23T11:00' + end: '2026-01-24T11:00' --- Heute war ein sehr produktiver Tag mit Fokus auf die **Produktivstellung der ManaCore Apps auf dem Mac Mini Server**. Die wichtigsten Errungenschaften: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-01-26-monitoring-auth-ai.md b/apps/manacore/apps/landing/src/content/devlog/2026-01-26-monitoring-auth-ai.md index b2c4d392a..deced6f13 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-01-26-monitoring-auth-ai.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-01-26-monitoring-auth-ai.md @@ -20,6 +20,17 @@ tags: featured: true commits: 54 readTime: 10 +stats: + filesChanged: 155 + linesAdded: 11566 + linesRemoved: 2290 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 54 +workingHours: + start: '2026-01-26T11:00' + end: '2026-01-27T11:00' --- Produktiver Tag mit Fokus auf **Monitoring-Infrastruktur**, **Email-Authentifizierung** und **lokale AI-Services**. Die wichtigsten Errungenschaften: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-01-28-massive-feature-sprint.md b/apps/manacore/apps/landing/src/content/devlog/2026-01-28-massive-feature-sprint.md index 06acee49c..646e66c52 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-01-28-massive-feature-sprint.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-01-28-massive-feature-sprint.md @@ -21,6 +21,17 @@ tags: featured: true commits: 74 readTime: 20 +stats: + filesChanged: 747 + linesAdded: 56325 + linesRemoved: 11567 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 74 +workingHours: + start: '2026-01-28T11:00' + end: '2026-01-29T11:00' --- Außergewöhnlich produktiver Tag (und Nacht!) mit **74 Commits** und mehreren großen neuen Features. Die wichtigsten Errungenschaften: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-01-29-microservices-matrix-consolidation.md b/apps/manacore/apps/landing/src/content/devlog/2026-01-29-microservices-matrix-consolidation.md index 1237c742b..04148f9fc 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-01-29-microservices-matrix-consolidation.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-01-29-microservices-matrix-consolidation.md @@ -24,6 +24,17 @@ tags: featured: true commits: 55 readTime: 25 +stats: + filesChanged: 1082 + linesAdded: 51520 + linesRemoved: 12296 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 55 +workingHours: + start: '2026-01-29T11:00' + end: '2026-01-30T11:00' --- Außergewöhnlich produktiver Tag mit **55 Commits** - aufgeteilt in drei große Bereiche: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-01-30-matrix-bots-llm-playground.md b/apps/manacore/apps/landing/src/content/devlog/2026-01-30-matrix-bots-llm-playground.md index 3ed8f0a01..ab949609f 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-01-30-matrix-bots-llm-playground.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-01-30-matrix-bots-llm-playground.md @@ -18,6 +18,17 @@ tags: featured: false commits: 41 readTime: 12 +stats: + filesChanged: 289 + linesAdded: 17857 + linesRemoved: 2113 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 41 +workingHours: + start: '2026-01-30T11:00' + end: '2026-01-31T11:00' --- Produktiver Tag mit **41 Commits** und Fokus auf Matrix Bot Expansion und Developer Experience: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-01-31-matrix-consolidation-voice-support.md b/apps/manacore/apps/landing/src/content/devlog/2026-01-31-matrix-consolidation-voice-support.md index 71d94a772..5754142e4 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-01-31-matrix-consolidation-voice-support.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-01-31-matrix-consolidation-voice-support.md @@ -20,6 +20,17 @@ tags: featured: true commits: 52 readTime: 18 +stats: + filesChanged: 570 + linesAdded: 24147 + linesRemoved: 19564 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 52 +workingHours: + start: '2026-01-31T11:00' + end: '2026-02-01T11:00' --- Intensiver Tag (und Nacht!) mit **52 Commits** - der Fokus lag auf der Konsolidierung der Matrix Bot Infrastruktur: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-02-01-ssd-migration-i18n-cicd.md b/apps/manacore/apps/landing/src/content/devlog/2026-02-01-ssd-migration-i18n-cicd.md index 281bc242c..b859da2ce 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-02-01-ssd-migration-i18n-cicd.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-02-01-ssd-migration-i18n-cicd.md @@ -20,6 +20,17 @@ tags: featured: false commits: 42 readTime: 14 +stats: + filesChanged: 289 + linesAdded: 14561 + linesRemoved: 3780 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 42 +workingHours: + start: '2026-02-01T11:00' + end: '2026-02-02T11:00' --- Produktiver Tag mit **42 Commits** und Fokus auf Infrastructure und Production Readiness: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-02-02-cross-domain-sso-mana-media.md b/apps/manacore/apps/landing/src/content/devlog/2026-02-02-cross-domain-sso-mana-media.md index 42db8a88e..a3422ec70 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-02-02-cross-domain-sso-mana-media.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-02-02-cross-domain-sso-mana-media.md @@ -20,6 +20,17 @@ tags: featured: true commits: 40 readTime: 15 +stats: + filesChanged: 207 + linesAdded: 9495 + linesRemoved: 6405 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 40 +workingHours: + start: '2026-02-02T11:00' + end: '2026-02-03T11:00' --- Produktiver Tag mit **40 Commits** und Fokus auf nahtlose Authentifizierung über alle Apps: diff --git a/apps/manacore/apps/landing/src/content/devlog/2026-02-11-photos-app-stt-tts-admin.md b/apps/manacore/apps/landing/src/content/devlog/2026-02-11-photos-app-stt-tts-admin.md index c7a6599dd..c990b3d59 100644 --- a/apps/manacore/apps/landing/src/content/devlog/2026-02-11-photos-app-stt-tts-admin.md +++ b/apps/manacore/apps/landing/src/content/devlog/2026-02-11-photos-app-stt-tts-admin.md @@ -21,6 +21,17 @@ tags: featured: true commits: 28 readTime: 14 +stats: + filesChanged: 241 + linesAdded: 14772 + linesRemoved: 1668 +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 28 +workingHours: + start: '2026-02-11T11:00' + end: '2026-02-12T11:00' --- Nach einer Woche Pause: **28 Commits** mit Fokus auf neue Apps und API-Infrastruktur: diff --git a/apps/manacore/apps/landing/src/pages/devlog/activity.astro b/apps/manacore/apps/landing/src/pages/devlog/activity.astro new file mode 100644 index 000000000..383c0edee --- /dev/null +++ b/apps/manacore/apps/landing/src/pages/devlog/activity.astro @@ -0,0 +1,322 @@ +--- +import Layout from '../../layouts/Layout.astro'; +import Navbar from '../../components/navigation/Navbar.astro'; +import Footer from '../../components/navigation/Footer.astro'; +import Section from '../../components/content/Section.astro'; +import Container from '../../components/layout/Container.astro'; +import Heading from '../../components/typography/Heading.astro'; +import Text from '../../components/typography/Text.astro'; +import HeroSection from '../../components/content/HeroSection.astro'; +import { getCollection } from 'astro:content'; +import { Icon } from 'astro-icon/components'; + +const posts = await getCollection('devlog'); +const sortedPosts = posts.sort((a, b) => a.data.date.getTime() - b.data.date.getTime()); + +// Generate activity data for the grid (last 365 days) +const today = new Date(); +const startDate = new Date(today); +startDate.setDate(startDate.getDate() - 364); + +// Create a map of date -> activity level +const activityMap = new Map(); + +for (const post of sortedPosts) { + const dateKey = post.data.date.toISOString().split('T')[0]; + const existing = activityMap.get(dateKey) || { commits: 0, linesAdded: 0, linesRemoved: 0, posts: [] }; + activityMap.set(dateKey, { + commits: existing.commits + (post.data.commits || 0), + linesAdded: existing.linesAdded + (post.data.stats?.linesAdded || 0), + linesRemoved: existing.linesRemoved + (post.data.stats?.linesRemoved || 0), + posts: [...existing.posts, post.data.title], + }); +} + +// Generate weeks for the grid +const weeks: { date: Date; dateKey: string; activity: number; commits: number; posts: string[] }[][] = []; +let currentWeek: { date: Date; dateKey: string; activity: number; commits: number; posts: string[] }[] = []; +const currentDate = new Date(startDate); + +// Pad the first week to start on Sunday +const firstDayOfWeek = currentDate.getDay(); +for (let i = 0; i < firstDayOfWeek; i++) { + currentWeek.push({ date: new Date(0), dateKey: '', activity: -1, commits: 0, posts: [] }); +} + +while (currentDate <= today) { + const dateKey = currentDate.toISOString().split('T')[0]; + const data = activityMap.get(dateKey); + const commits = data?.commits || 0; + + // Activity level: 0 = none, 1 = low, 2 = medium, 3 = high, 4 = very high + let activity = 0; + if (commits > 0) activity = 1; + if (commits >= 20) activity = 2; + if (commits >= 40) activity = 3; + if (commits >= 60) activity = 4; + + currentWeek.push({ + date: new Date(currentDate), + dateKey, + activity, + commits, + posts: data?.posts || [], + }); + + if (currentWeek.length === 7) { + weeks.push(currentWeek); + currentWeek = []; + } + + currentDate.setDate(currentDate.getDate() + 1); +} + +// Push remaining days +if (currentWeek.length > 0) { + weeks.push(currentWeek); +} + +// Calculate totals +const totalCommits = sortedPosts.reduce((sum, post) => sum + (post.data.commits || 0), 0); +const totalLinesAdded = sortedPosts.reduce((sum, post) => sum + (post.data.stats?.linesAdded || 0), 0); +const totalLinesRemoved = sortedPosts.reduce((sum, post) => sum + (post.data.stats?.linesRemoved || 0), 0); +const totalFilesChanged = sortedPosts.reduce((sum, post) => sum + (post.data.stats?.filesChanged || 0), 0); +const totalDays = sortedPosts.length; + +// Get all contributors +const contributorMap = new Map(); +for (const post of sortedPosts) { + for (const contributor of post.data.contributors || []) { + const existing = contributorMap.get(contributor.name) || { name: contributor.name, handle: contributor.handle, commits: 0 }; + contributorMap.set(contributor.name, { + ...existing, + commits: existing.commits + (contributor.commits || 0), + }); + } +} +const contributors = Array.from(contributorMap.values()).sort((a, b) => b.commits - a.commits); + +const activityColors = [ + 'bg-gray-100 dark:bg-gray-800', // 0 - none + 'bg-green-200 dark:bg-green-900', // 1 - low + 'bg-green-400 dark:bg-green-700', // 2 - medium + 'bg-green-500 dark:bg-green-600', // 3 - high + 'bg-green-600 dark:bg-green-500', // 4 - very high +]; + +const monthLabels = ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']; +const dayLabels = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']; + +const formatNumber = (num: number) => { + if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M'; + if (num >= 1000) return (num / 1000).toFixed(1) + 'K'; + return num.toString(); +}; + +const formatDate = (date: Date) => { + return new Intl.DateTimeFormat('de-DE', { + day: '2-digit', + month: 'long', + year: 'numeric', + }).format(date); +}; +--- + + +
+ + + +
+
+
+
+
+
+ + +
+ + +
+ +
+
+
+
+ +
+ Commits +
+ {totalCommits} +
+ +
+
+
+ +
+ Dateien +
+ {formatNumber(totalFilesChanged)} +
+ +
+
+
+ +
+ Zeilen + +
+ +{formatNumber(totalLinesAdded)} +
+ +
+
+
+ +
+ Zeilen - +
+ -{formatNumber(totalLinesRemoved)} +
+
+ + +
+
+ {totalDays} aktive Entwicklungstage + + Alle Devlogs + + +
+ + +
+
+ +
+ {dayLabels.map((day, i) => ( +
+ {day} +
+ ))} +
+ + + {weeks.map((week, weekIndex) => ( +
+ {week.map((day) => ( +
0 ? 'cursor-pointer hover:ring-2 hover:ring-offset-1 hover:ring-green-500' : ''}`} + title={day.activity === -1 ? '' : `${formatDate(day.date)}: ${day.commits} Commits${day.posts.length > 0 ? '\n' + day.posts.join(', ') : ''}`} + /> + ))} +
+ ))} +
+
+ + +
+ Weniger + {activityColors.map((color) => ( +
+ ))} + Mehr +
+
+ + +
+ Contributors + +
+ {contributors.map((contributor, index) => ( +
+
+ {contributor.name.charAt(0)} +
+
+
+ {contributor.name} + {contributor.handle && ( + @{contributor.handle} + )} +
+
+ + + {contributor.commits} Commits + +
+
+
+
+
+
+ ))} +
+
+ +
+ + +
+ + Letzte Aktivität + + + +
+ +
+
+
diff --git a/apps/manacore/apps/landing/src/pages/devlog/index.astro b/apps/manacore/apps/landing/src/pages/devlog/index.astro index 20a95d219..8e40967a8 100644 --- a/apps/manacore/apps/landing/src/pages/devlog/index.astro +++ b/apps/manacore/apps/landing/src/pages/devlog/index.astro @@ -106,6 +106,25 @@ const formatDate = (date: Date) => { + + +
{ sortedPosts.map((post) => { diff --git a/docs/DEVLOG_GUIDELINES.md b/docs/DEVLOG_GUIDELINES.md index 398ff1c42..ece0d1105 100644 --- a/docs/DEVLOG_GUIDELINES.md +++ b/docs/DEVLOG_GUIDELINES.md @@ -35,6 +35,23 @@ tags: featured: true # oder false commits: 42 # Anzahl der Commits an diesem Tag readTime: 15 # Geschätzte Lesezeit in Minuten + +# Extended Stats für Aktivitätsgrid +stats: + filesChanged: 289 + linesAdded: 17857 + linesRemoved: 2113 + +# Contributors (wer hat an diesem Tag gearbeitet) +contributors: + - name: 'Till Schneider' + handle: 'Till-JS' + commits: 42 + +# Working Hours (für Aktivitätsgrid) +workingHours: + start: '2026-01-30T11:00' + end: '2026-01-31T11:00' --- ``` @@ -56,13 +73,26 @@ readTime: 15 # Geschätzte Lesezeit in Minuten 4. **Zusammenfassung** - Tabelle mit Bereichen, Commit-Anzahl und Highlights 5. **Nächste Schritte** - Was als nächstes geplant ist -## Commit-Zählung +## Git-Stats abrufen ```bash # Commits für einen Arbeitstag zählen (11:00 - 11:00 des Folgetages) -git log --since="YYYY-MM-DD 11:00" --until="YYYY-MM-DD+1 10:59" --oneline | wc -l +git log --since="YYYY-MM-DD 11:00" --until="YYYY-MM-DD+1 11:00" --oneline | wc -l + +# Detaillierte Stats (files, insertions, deletions) +git log --since="YYYY-MM-DD 11:00" --until="YYYY-MM-DD+1 11:00" --shortstat --format="" | \ + awk '{files+=$1; ins+=$4; del+=$6} END {print "files:", files, "insertions:", ins, "deletions:", del}' ``` +## Aktivitätsgrid + +Die Aktivitätsgrid-Seite ist unter `/devlog/activity` erreichbar und zeigt: + +- **GitHub-Style Contribution Grid** - Aktivität der letzten 365 Tage +- **Gesamt-Statistiken** - Commits, Dateien, Lines Added/Removed +- **Contributors** - Wer hat wie viel beigetragen +- **Letzte Aktivität** - Die 5 neuesten Devlogs + ## Best Practices - Technische Details mit Code-Beispielen und Architektur-Diagrammen illustrieren