Docs·4ff474d·Updated Mar 14, 2026·43 ADRs
Back
ADR-009accepted

ADR-009: Ephemeral Data Design

ADR-009: Ephemeral Data Design

Date: 2025-12-29 Status: Accepted Deciders: Development Team Related: docs/MULTI_TENANT_GUIDE.md, services/cleanup-service

Context

Mutual aid data has a natural lifecycle. Old requests, expired offers, and ancient messages lose relevance over time. We needed to decide how to handle data retention.

Decision

Data fades like memory - Configurable TTL with automatic cleanup.

Implementation

Cleanup Service (Port 3008):

  • Runs daily at 2 AM
  • Deletes data past TTL
  • Configurable per-community

Default TTLs:

{
  request_ttl_days: 60,        // Help requests
  offer_ttl_days: 60,          // Help offers
  match_ttl_days: 90,          // Completed matches
  notification_ttl_days: 30,   // Notifications
  message_ttl_days: 90,        // Chat messages
  session_ttl_days: 30         // User sessions
}

Database Flags:

ALTER TABLE requests.help_requests ADD COLUMN expired BOOLEAN DEFAULT FALSE;
ALTER TABLE requests.help_requests ADD COLUMN expires_at TIMESTAMP;

Cleanup Logic

-- Mark as expired (reversible)
UPDATE requests.help_requests
SET expired = TRUE
WHERE created_at < NOW() - INTERVAL '60 days'
  AND expired = FALSE;

-- Hard delete after grace period
DELETE FROM requests.help_requests
WHERE expired = TRUE
  AND created_at < NOW() - INTERVAL '90 days';

Consequences

Positive

  • Storage Savings: Database doesn't grow unbounded
  • Privacy-Friendly: Old data automatically removed
  • Performance: Smaller tables = faster queries
  • Realistic: Matches how human memory works
  • Configurable: Communities control their own retention

Negative

  • Data Loss: No long-term history
  • Analytics Limited: Can't analyze old patterns
  • Accidental Deletion: No easy undo after hard delete
  • Export Required: Communities must export before deletion

Alternatives Considered

Alternative 1: Keep Everything Forever

  • Why rejected: Storage costs, privacy concerns, GDPR compliance

Alternative 2: Archive to S3

  • Why rejected: Adds complexity, most communities don't need archives

Alternative 3: Manual Deletion Only

  • Why rejected: Requires active community management, defaults to hoarding

References

  • Cleanup service: services/cleanup-service/
  • Multi-tenant guide: docs/MULTI_TENANT_GUIDE.md
  • Community settings: services/community-service/src/routes/settings.ts