managarten/apps-archived/memoro/apps/landing/docs/Internal-Collections.md
Till-JS 61d181fbc2 chore: archive inactive projects to apps-archived/
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>
2025-11-29 07:03:59 +01:00

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 .gitignore fü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:

  1. Nutze das _ Prefix konsequent
  2. Erstelle keine öffentlichen Routes
  3. Implementiere Zugriffskontrolle in Admin-Seiten
  4. Nutze visibility und status Felder

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:

  1. Nutze .gitignore für hochsensitive Inhalte
  2. Verwende Umgebungsvariablen für Secrets
  3. 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: