# Dewemoji Community Plan (Private‑First → Public Consensus)

This plan matches the core purpose: **help people find emojis with their own words, in any language**, and let the community optionally promote keywords into global search.

## Core principles

- **Private first:** users can store any keyword for their own use.
- **Public by choice:** users can propose a keyword to the public pool.
- **Consensus‑based:** public keywords only become searchable after votes.
- **Language‑friendly:** keywords can be in any language/script (not only Latin).
- **Safety‑aware:** moderation applies only to public proposals (not private).

## Current language reality

- Today the dataset only includes **EN + ID** keywords for all emojis.
- Community should be designed to add **other languages** over time.

## Two‑layer keyword model

### 1) Private keywords (personal)
- Stored per user (or device if not logged in).
- Any term is allowed, even if not “correct.”
- Used only for that user’s search + recall.
- No moderation needed.
- Created and managed in the **user dashboard** (not on emoji detail pages).
- Must be **used locally first** before being eligible for public proposal.

### 2) Public keywords (community)
- Users can propose **one of their own private keywords** to be public **from the dashboard**.
- Emoji detail pages only **display and vote** on public proposals; no direct proposal UI there.
- Once the proposal passes the threshold, it becomes globally searchable.

## Public keyword lifecycle

```
private → public_pending → public
```

Suggested rules:
- **public_pending** shown publicly with vote controls.
- **public** if it reaches **≥ 5 upvotes** (your rule).
- Optional future: auto‑reject with heavy downvotes or time decay.

## Voting model

- 1 vote per user per keyword.
- Score = upvotes − downvotes.
- Promotion rule: **>= 5 upvotes** (simple and clear).
- Optional future: trust‑weighted votes.

## Moderation model

- Moderation applies only to **public proposals**.
- Private keywords are always allowed.
- Blocking rules:
  - disallowed words
  - mismatched emoji meaning
  - language mismatch (optional)

## UX flow (simple)

1) User adds private keyword.
2) User uses it locally (personal search/recall).
3) User clicks “Make Public” from the dashboard.
4) Keyword appears on emoji detail page as pending.
4) Community votes.
5) Reaches 5 upvotes → becomes public search term.

## API endpoints (clean, minimal set)

Auth:
- `POST /v1/contrib/auth/request`
- `POST /v1/contrib/auth/verify`

Keyword actions:
- `POST /v1/contrib/suggest`
- `POST /v1/contrib/make-public`
- `POST /v1/contrib/vote`
- `GET /v1/contrib/list?emoji=...`
- `GET /v1/contrib/search?q=...`

Moderation:
- `GET /v1/keywords/pending` (admin/moderation)

## Data model (minimum)

- `emoji_keywords` (keyword, lang, status, visibility, owner_user_id)
- `keyword_votes` (keyword_id, user_id, vote)
- `moderation_events`
- `users` / `magic_links`

## Optional recommendations (future‑safe)

### A) Multilingual expansion
- Encourage new languages by highlighting “empty language slots.”
- Allow region variants (e.g., `en-US` vs `en-GB`).

### B) Personal dictionary export
- Export private keywords per user.

### C) Trust tiers
- Contributors with good history can fast‑track proposals.

### D) Admin review console
- Moderators can approve/reject quickly.

### E) Abuse prevention
- Rate limit public proposals + voting.
- Use Turnstile only for public actions.

### F) Search blending
- Private keywords weighted highest for the owner.
- Public keywords weighted lower but global.

### G) “My Words” UI
- Show user’s private keywords in the **dashboard**.
- One‑tap “Make Public” in the dashboard (not on detail page).

## Recommended rollout

1) Private keywords (local only).
2) Public proposals + votes (no AI).
3) Basic moderation + rate limits.
4) AI guard + trust tiers.
