# Startup Configuration Design Analysis

## Review of startup_config_design.md

### Key Design Principles Identified

1. **Zero Command Line Arguments**: Complete elimination of CLI arguments for true "quick start"
2. **Event-Based Configuration**: Configuration stored as Nostr event (kind 33334) in events table
3. **Self-Contained Database**: Database named after relay pubkey (`<pubkey>.nrdb`)
4. **First-Time Setup**: Automatic key generation and initial configuration creation
5. **Configuration Consistency**: Always read from event, never from hardcoded defaults

### Implementation Gaps and Specifications Needed

#### 1. Key Generation Process
**Specification:**
```
First Startup Key Generation:
1. Generate all keys on first startup (admin private/public, relay private/public)
2. Use nostr_core_lib for key generation entropy
3. Keys are encoded in hex format
4. Print admin private key to stdout for user to save (never stored)
5. Store admin public key, relay private key, and relay public key in configuration event
6. Admin can later change the 33334 event to alter stored keys
```

#### 2. Database Naming and Location
**Specification:**
```
Database Naming:
1. Database is named using relay pubkey: ./<relay_pubkey>.nrdb
2. Database path structure: ./<relay_pubkey>.nrdb
3. If database creation fails, program quits (can't run without database)
4. c_nostr_relay.db should never exist in new system
```

#### 3. Configuration Event Structure (Kind 33334)
**Specification:**
```
Event Structure:
- Kind: 33334 (parameterized replaceable event)
- Event validation: Use nostr_core_lib to validate event
- Event content field: "C Nostr Relay Configuration" (descriptive text)
- Configuration update mechanism: TBD
- Complete tag structure provided in configuration section below
```



#### 4. Configuration Change Monitoring
**Configuration Monitoring System:**
```
Every event that is received is checked to see if it is a kind 33334 event from the admin pubkey.
If so, it is processed as a configuration update.
```

#### 5. Error Handling and Recovery
**Specification:**
```
Error Recovery Priority:
1. Try to load latest valid config event
2. Generate new default configuration event if none exists
3. Exit with error if all recovery attempts fail

Note: There is only ever one configuration event (parameterized replaceable event),
so no fallback to previous versions.
```

### Design Clarifications

**Key Management:**
- Admin private key is never stored, only printed once at first startup
- Single admin system (no multi-admin support)
- No key rotation support

**Configuration Management:**
- No configuration versioning/timestamping
- No automatic backup of configuration events
- Configuration events are not broadcastable to other relays
- Future: Auth system to restrict admin access to configuration events

---

## Complete Current Configuration Structure

Based on analysis of [`src/config.c`](src/config.c:753-795), here is the complete current configuration structure that will be converted to event tags:

### Complete Event Structure Example
```json
{
  "kind": 33334,
  "created_at": 1725661483,
  "tags": [
    ["d", "<relay_pubkey>"],
    ["auth_enabled", "false"],
    ["relay_port", "8888"],
    ["max_connections", "100"],

    ["relay_description", "High-performance C Nostr relay with SQLite storage"],
    ["relay_contact", ""],
    ["relay_pubkey", "<relay_public_key>"],
    ["relay_privkey", "<relay_private_key>"],
    ["relay_software", "https://git.laantungir.net/laantungir/c-relay.git"],
    ["relay_version", "v1.0.0"],
  
    ["pow_min_difficulty", "0"],
    ["pow_mode", "basic"],
    ["nip40_expiration_enabled", "true"],
    ["nip40_expiration_strict", "true"],
    ["nip40_expiration_filter", "true"],
    ["nip40_expiration_grace_period", "300"],
    ["max_subscriptions_per_client", "25"],
    ["max_total_subscriptions", "5000"],
    ["max_filters_per_subscription", "10"],
    ["max_event_tags", "100"],
    ["max_content_length", "8196"],
    ["max_message_length", "16384"],
    ["default_limit", "500"],
    ["max_limit", "5000"]
  ],
  "content": "C Nostr Relay Configuration",
  "pubkey": "<admin_public_key>",
  "id": "<computed_event_id>",
  "sig": "<event_signature>"
}
```

**Note:** The `admin_pubkey` tag is omitted as it's redundant with the event's `pubkey` field.
