Move inactive projects out of active workspace: - bauntown (community website) - maerchenzauber (AI story generation) - memoro (voice memo app) - news (news aggregation) - nutriphi (nutrition tracking) - reader (reading app) - uload (URL shortener) - wisekeep (AI wisdom extraction) Update CLAUDE.md documentation: - Add presi to active projects - Document archived projects section - Update workspace configuration Archived apps can be re-activated by moving back to apps/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.1 KiB
Internal Collections Documentation
Übersicht
Dieses Projekt unterstützt private/interne Content Collections, die nicht öffentlich zugänglich sind. Diese Collections werden für interne Zwecke wie Marketing-Strategien, Produktentwicklung und Team-Dokumentation verwendet.
Konventionen
Naming Convention
- Prefix
_(Underscore): Alle internen Collections beginnen mit einem Underscore - Beispiele:
_personas,_internal-docs,_drafts
Verzeichnisstruktur
src/content/
├── _personas/ # Intern: Marketing Personas
│ ├── de/
│ └── en/
├── blog/ # Öffentlich: Blog-Artikel
├── features/ # Öffentlich: Features
└── ...
Implementierte Interne Collections
1. Personas (_personas)
Zweck: Detaillierte Zielgruppen-Profile für Marketing und Produktentwicklung
Schema-Highlights:
- Demographics (Alter, Ort, Bildung, Einkommen)
- Professional Profile (Job, Branche, Verantwortlichkeiten)
- Psychographics (Persönlichkeit, Werte, Motivationen, Frustrationen)
- Behavior (Tech-Affinität, Arbeitsweise, Tools)
- Memoro-Context (Use Cases, Benefits, Concerns, Features)
- Marketing-Relevanz (Segment, Channels, Messaging)
Zugriff: /admin/personas (nur im Dev-Modus)
Technische Implementierung
1. Collection Definition
In src/content/config.ts:
// Private Collection mit _ Prefix
const _personasCollection = defineCollection({
type: 'content',
schema: z.object({
// Schema definition
visibility: z.enum(['internal', 'team', 'stakeholders']).default('internal'),
status: z.enum(['draft', 'active', 'archived']).default('draft'),
// ... weitere Felder
})
});
export const collections = {
// Öffentliche Collections
'blog': blogCollection,
'features': featuresCollection,
// Private Collections (mit _ Prefix)
'_personas': _personasCollection,
};
2. Zugriffskontrolle
Admin-Seiten implementieren Zugriffskontrolle:
---
// Nur im Development-Modus oder mit speziellem Query-Parameter
const isDev = import.meta.env.DEV;
const hasAccess = isDev || Astro.url.searchParams.has('access');
if (!hasAccess) {
return Astro.redirect('/404');
}
---
3. Keine öffentlichen Routes
Wichtig: Für interne Collections werden KEINE öffentlichen Routes erstellt:
// ❌ NICHT erstellen:
src/pages/[lang]/personas/[...slug].astro
// ✅ NUR Admin-Routes:
src/pages/admin/personas.astro
Best Practices
1. Sicherheit
- Niemals öffentliche Routes für interne Collections erstellen
- Admin-Seiten immer mit Zugriffskontrolle schützen
- Sensitive Daten nicht in Git committen (nutze
.gitignorefür sehr vertrauliche Inhalte)
2. Organisation
---
# Metadaten für interne Dokumente
status: "draft" | "active" | "archived"
visibility: "internal" | "team" | "stakeholders"
owner: "Marketing Team"
contributors: ["Product", "Sales"]
validatedAt: 2024-01-10T10:00:00Z
---
3. Verwendung in Code
// Interne Collections laden
import { getCollection } from 'astro:content';
// Mit Error Handling
let personas = [];
try {
personas = await getCollection('_personas');
// Filtern nach Status
const activePersonas = personas.filter(p => p.data.status === 'active');
} catch (error) {
console.log('Internal collection not available');
}
Neue interne Collection hinzufügen
Schritt 1: Schema definieren
In src/content/config.ts:
const _myInternalCollection = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
visibility: z.enum(['internal', 'team', 'public']).default('internal'),
// ... weitere Felder
})
});
Schritt 2: Zur Collections-Export hinzufügen
export const collections = {
// ... andere collections
'_myInternal': _myInternalCollection,
};
Schritt 3: Content-Verzeichnis erstellen
mkdir -p src/content/_myInternal/de
mkdir -p src/content/_myInternal/en
Schritt 4: Admin-Interface erstellen (optional)
// src/pages/admin/my-internal.astro
---
// Zugriffskontrolle
const isDev = import.meta.env.DEV;
if (!isDev) return Astro.redirect('/404');
const items = await getCollection('_myInternal');
---
<!-- Admin UI -->
Wartung und Governance
Verantwortlichkeiten
| Collection | Owner | Review-Zyklus | Letzte Validierung |
|---|---|---|---|
_personas |
Marketing Team | Quartalsweise | Januar 2024 |
_internal-docs |
Product Team | Monatlich | - |
Archivierung
Veraltete Inhalte sollten nicht gelöscht, sondern archiviert werden:
status: "archived"
archivedAt: 2024-01-15T10:00:00Z
archiveReason: "Outdated after product pivot"
FAQ
Q: Können interne Collections in Produktion verwendet werden? A: Ja, aber nur über geschützte Admin-Interfaces oder interne Tools, niemals über öffentliche URLs.
Q: Wie verhindere ich versehentliches Veröffentlichen? A:
- Nutze das
_Prefix konsequent - Erstelle keine öffentlichen Routes
- Implementiere Zugriffskontrolle in Admin-Seiten
- Nutze
visibilityundstatusFelder
Q: Können interne Collections in der Sitemap erscheinen? A: Nein, da keine öffentlichen Routes erstellt werden, erscheinen sie automatisch nicht in der Sitemap.
Q: Wie sichere ich sehr sensitive Daten? A:
- Nutze
.gitignorefür hochsensitive Inhalte - Verwende Umgebungsvariablen für Secrets
- Implementiere robuste Authentifizierung für Admin-Bereiche
Beispiel: Personas Collection
Die _personas Collection demonstriert Best Practices:
---
name: "Sabine Schmidt"
title: "Die gestresste Projektmanagerin"
# Strukturierte Daten
demographics:
age: 38
location: "München"
# Status-Management
status: "active"
visibility: "internal"
# Tracking
createdAt: 2024-01-15T10:00:00Z
lastUpdated: 2024-01-15T10:00:00Z
validatedAt: 2024-01-10T10:00:00Z
# Verantwortlichkeiten
owner: "Marketing Team"
contributors: ["Product", "Sales"]
---
Kontakt
Bei Fragen zu internen Collections:
- Marketing-Personas: marketing@memoro.ai
- Technische Umsetzung: dev@memoro.ai