Product Architecture

From QR scan to stadium roar

The end-to-end flow of a KickPulse event, the moderation engine that keeps the wall clean, and the trigger rules behind the celebration.

Core fan flow

1. Scan QR

Fan scans stadium QR.

2. Submit

Nickname, city, team, selfie.

3. Moderate

Rules engine + moderators.

4. Live Wall

Approved photos stream.

5. Celebrate

100% triggers moment.

Moderation rules engine

Every submission runs through a pipeline before it lands on the wall.

  1. 1

    Content check

    NSFW + face-detection filter on selfie

  2. 2

    Text policy

    Nickname passes profanity + brand safety

  3. 3

    Duplicate scan

    One submission per session/device

  4. 4

    Auto-approve

    If all checks pass and score > 0.85

  5. 5

    Human review

    Flagged items → moderator queue

  6. 6

    Featured pick

    Editor stars best-in-crowd shots

Meter & celebration trigger

The participation meter climbs in real time as approved submissions land.

meter = approved / target × 100

  • Live subscribers push updates via a WebSocket channel per event.
  • Auto-trigger fires at 100% with a 3-second confirmation window.
  • Host can manual-trigger early; celebration state locks per event.
  • Confetti + audio + big-screen takeover fire in parallel.

System topology


   ┌──────────┐    ┌────────────────┐    ┌─────────────────┐
   │   Fan    │───▶│  QR landing     │───▶│  Submission API │
   │ (mobile) │    │  (edge cached)  │    │  (validated)    │
   └──────────┘    └────────────────┘    └────────┬────────┘
                                                   │
                          ┌────────────────────────┼───────────────────────┐
                          ▼                        ▼                       ▼
                 ┌──────────────┐        ┌─────────────────┐      ┌────────────────┐
                 │ NSFW filter  │        │ Text policy     │      │ Dedupe & rate  │
                 │  (ML score)  │        │ (banlist + LLM) │      │  limit         │
                 └──────┬───────┘        └────────┬────────┘      └────────┬───────┘
                        └───────────────┬─────────┴────────────────────────┘
                                        ▼
                             ┌────────────────────┐
                             │  Rules engine       │
                             │  auto | queue | ban │
                             └────────┬───────────┘
                                      │
                    ┌─────────────────┴─────────────────┐
                    ▼                                   ▼
           ┌────────────────┐                 ┌────────────────┐
           │  Photo Wall    │                 │  Moderator     │
           │  (realtime)    │                 │  queue         │
           └────────┬───────┘                 └────────┬───────┘
                    │                                  │
                    └──────────┬───────────────────────┘
                               ▼
                     ┌──────────────────┐
                     │  Meter service   │──▶ Celebration trigger
                     │  approved/target │      (confetti + FX)
                     └──────────────────┘

Data model

Event

  • · id
  • · name
  • · venue
  • · target
  • · status
  • · kickoff
  • · celebrated

Submission

  • · id
  • · eventId
  • · nickname
  • · city
  • · team
  • · selfieUrl
  • · status
  • · createdAt

User

  • · id
  • · name
  • · role
  • · email
  • · avatar
  • · status
  • · joinedAt

AuditEntry

  • · id
  • · actor
  • · action
  • · target
  • · at

MeterSample

  • · eventId
  • · count
  • · rate
  • · sampledAt

Celebration

  • · eventId
  • · triggeredBy
  • · at
  • · channel

Role permission matrix

CapabilityFanModeratorHostAdmin
Submit selfie
View photo wall
Approve / reject
Feature submission
Create / edit events
Trigger celebration
Manage roles
View audit log

Ready to see it live?

Every role has a pre-seeded workspace ready in one tap.

Open KickPulse