641 lines
21 KiB
Markdown
Executable File
641 lines
21 KiB
Markdown
Executable File
# Dewemoji Product Direction & Strategy Brief
|
|
|
|
**Version:** 2.0
|
|
**Date:** February 8, 2026
|
|
**Author:** Dwindi (Project Owner)
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
Dewemoji pivots from a public community-driven emoji dictionary to a **personal emoji library platform** where users build, sync, and own their keyword vocabularies across devices. This eliminates moderation overhead, AI costs, and public abuse risks while monetizing the core unique value: **private, multilingual keyword customization + seamless sync**.
|
|
|
|
**New Tagline:** *"Your words → your emojis, anywhere"*
|
|
|
|
---
|
|
|
|
## 1. Vision & Mission
|
|
|
|
### Vision
|
|
Enable everyone to find and use emojis using *their* language, slang, and personal vocabulary—without language barriers or platform limitations.
|
|
|
|
### Mission
|
|
Provide a semantic emoji discovery platform that:
|
|
- Offers unlimited free public search (EN/ID + semantic matching)
|
|
- Lets users create private, personal keyword libraries (any language, any script)
|
|
- Syncs personal libraries across web, extensions, and future apps
|
|
- Removes friction from emoji usage in daily communication
|
|
|
|
### Core Problem Being Solved
|
|
"I spent too much time finding an emoji because I think in my language/slang ('bekicot' for 🐌), and most tools only understand English keywords."
|
|
|
|
---
|
|
|
|
## 2. Strategic Pivot: Why Private-Only Keywords
|
|
|
|
### Previous Model (Abandoned)
|
|
- Public community keyword submissions
|
|
- Voting/moderation for global searchability
|
|
- AI moderation for toxicity
|
|
- SEO feeding from user keywords
|
|
|
|
### Problems with Previous Model
|
|
1. **AI moderation costs** haunting scalability
|
|
2. **Moral responsibility** for public bad words feeding internet
|
|
3. **Unclear monetization** (who pays for emoji stuff?)
|
|
4. **Complexity** managing voting, thresholds, public curation
|
|
|
|
### New Model (Adopted)
|
|
- **Fully private user keyword libraries**
|
|
- No public submissions, no voting, no AI moderation
|
|
- Users own and control their keywords (stored per account)
|
|
- Public search stays free and unlimited (referrer-whitelisted)
|
|
|
|
### Benefits
|
|
✅ **Zero moderation burden** (private = user's responsibility)
|
|
✅ **No AI costs** (no content filtering needed)
|
|
✅ **Clear monetization** (pay for personal sync, not public features)
|
|
✅ **Moral simplicity** (no liability for user's private words)
|
|
✅ **Technical simplicity** (CRUD keywords per user_id)
|
|
|
|
---
|
|
|
|
## 3. Monetization Model
|
|
|
|
### Core Principle
|
|
**"Free discovery → Paid personalization"**
|
|
|
|
Users get unlimited free public search to discover and love the product, then upgrade to sync their personal vocabulary.
|
|
|
|
### Tiers
|
|
|
|
| Feature | Free | Personal ($4.99/mo) |
|
|
|---------|------|---------------------|
|
|
| **Public emoji search** | ✅ Unlimited (EN/ID keywords) | ✅ Unlimited |
|
|
| **Search result limit** | ✅ No limits | ✅ No limits |
|
|
| **Skintone variations** | ✅ Free | ✅ Free |
|
|
| **Copy to clipboard** | ✅ Free | ✅ Free |
|
|
| **Auto-Insert to page** | ✅ Free (viral hook!) | ✅ Free |
|
|
| **Automatic mode** | ✅ Free | ✅ Free |
|
|
| **Private keywords** | ❌ Not available | ✅ Unlimited CRUD |
|
|
| **Keyword sync** | ❌ Not available | ✅ Cross-device/app |
|
|
| **API keys** | ❌ Not available | ✅ Generate/revoke |
|
|
| **Dashboard access** | ❌ Not available | ✅ Full management |
|
|
|
|
### Tier Naming
|
|
- **Free** → stays "Free"
|
|
- **Pro** → renamed to **"Personal"** (reflects private/personal keywords, not business/pro tools)
|
|
|
|
### Pricing Options
|
|
- **Monthly:** $4.99/month (Stripe subscription)
|
|
- **Annual:** $49/year (~$4.08/month, 17% savings)
|
|
- **Lifetime:** $99 (one-time, early adopter offer)
|
|
|
|
### Payment Flexibility
|
|
Self-generated API keys mean **any payment provider works**:
|
|
- Stripe (primary, global)
|
|
- Paddle (backup)
|
|
- Midtrans/Xendit (Indonesia localization)
|
|
- No dependency on Gumroad license keys
|
|
|
|
---
|
|
|
|
## 4. Channel Roles & User Flows
|
|
|
|
### 4.1 Website (dewemoji.com)
|
|
|
|
#### Non-Logged Users
|
|
**Purpose:** Free discovery & viral entry point
|
|
|
|
**Features:**
|
|
- Search emojis by public keywords (EN/ID)
|
|
- Browse by category/subcategory
|
|
- Copy emojis to clipboard
|
|
- View emoji details (unified, codepoints, shortcodes)
|
|
- No account required
|
|
|
|
**CTA:** "Want your own keywords like 'bekicot'? → Sign Up Free"
|
|
|
|
#### Logged Users (Free Account)
|
|
**Purpose:** Dashboard teaser
|
|
|
|
**Features:**
|
|
- View personal keywords section (muted/disabled with upgrade prompt)
|
|
- View API keys section (muted/disabled)
|
|
- Access to upgrade flow
|
|
- Search still unlimited (public keywords)
|
|
|
|
**State:** "You have 0 personal keywords. Upgrade to Personal to create unlimited."
|
|
|
|
#### Logged Users (Personal Tier)
|
|
**Purpose:** Full keyword management hub
|
|
|
|
**Features:**
|
|
- **Keyword Management:**
|
|
- Table view: emoji | your keywords | language | actions (edit/delete)
|
|
- Add new keyword: select emoji → enter keyword(s) → set language → save
|
|
- Bulk import/export (JSON)
|
|
- **API Key Management:**
|
|
- Generate new keys (dew_abc123...)
|
|
- Revoke keys
|
|
- Copy to clipboard (for extension login)
|
|
- View usage stats per key (future)
|
|
- **Billing Dashboard:**
|
|
- Current plan status
|
|
- Payment history table (date, amount, status, invoice)
|
|
- Upgrade/downgrade/cancel buttons
|
|
- Next billing date
|
|
|
|
**Navigation:**
|
|
```
|
|
Dashboard
|
|
├─ Search (always visible)
|
|
├─ My Keywords
|
|
├─ API Keys
|
|
└─ Billing
|
|
```
|
|
|
|
---
|
|
|
|
### 4.2 Chrome Extension
|
|
|
|
**Purpose:** Viral growth engine + seamless Personal upsell
|
|
|
|
#### Free Features (Unlimited, No Limits)
|
|
- Search public emoji keywords (EN/ID + semantic)
|
|
- Skintone variations
|
|
- Copy to clipboard
|
|
- **Auto-Insert** (click emoji → inserts at cursor position)
|
|
- **Automatic mode** (detect input → insert; else copy)
|
|
- No daily/hourly limits
|
|
- No login required for public search
|
|
|
|
#### Personal Features (Requires Login)
|
|
- Search blends **private + public** keywords
|
|
- Personal keywords auto-sync from dashboard
|
|
- API key authentication (stored securely in chrome.storage)
|
|
|
|
#### Auth Flow
|
|
1. User clicks "Link Account" in extension settings
|
|
2. Login popup (email/password) → POST /v1/user/login
|
|
3. Extension receives + stores API key
|
|
4. All searches now include Authorization: Bearer header
|
|
5. Results blend user's private keywords + public semantic data
|
|
|
|
#### Upgrade Prompt
|
|
- Trigger: User searches term matching no public results
|
|
- Message: "Not found in public keywords. Create 'bekicot → 🐌' in your Personal library?"
|
|
- CTA: Opens dewemoji.com/upgrade in new tab
|
|
|
|
---
|
|
|
|
### 4.3 API (Backend)
|
|
|
|
**Purpose:** Single source of truth for all channels
|
|
|
|
#### Public Endpoints (Free, Referrer-Whitelisted)
|
|
```
|
|
GET /v1/emojis # Search/browse public keywords
|
|
GET /v1/emoji/:slug # Emoji detail
|
|
GET /v1/categories # Category list
|
|
GET /v1/health # Health check
|
|
```
|
|
|
|
**Whitelist Rules:**
|
|
- `Origin: https://dewemoji.com`
|
|
- `User-Agent: ...chrome-extension://elcikbedkbpkmdhkcmfnkdaacmnpdmha...`
|
|
- `Origin: localhost | 127.0.0.1` (dev)
|
|
|
|
**Rate Limit:** Soft throttle at 5000 requests/hour/IP (invisible to real users, stops bombers)
|
|
|
|
#### User Endpoints (Authentication Required)
|
|
```
|
|
POST /v1/user/register # Create account
|
|
POST /v1/user/login # Login → returns api_keys
|
|
POST /v1/user/logout # Invalidate session
|
|
```
|
|
|
|
#### Personal Tier Endpoints (API Key Required)
|
|
```
|
|
# Keyword CRUD
|
|
GET /v1/keywords # List user's private keywords
|
|
POST /v1/keywords # Create/update keyword
|
|
DELETE /v1/keywords/:id # Delete keyword
|
|
GET /v1/search?private=true # Search (private + public blend)
|
|
|
|
# API Key Management
|
|
GET /v1/user/apikeys # List user's keys
|
|
POST /v1/user/apikeys # Generate new key
|
|
DELETE /v1/user/apikeys/:key # Revoke key
|
|
```
|
|
|
|
**Authentication:**
|
|
- Header: `Authorization: Bearer dew_abc123...`
|
|
- Validation: Lookup in `user_api_keys` table → verify user_id has active Personal subscription
|
|
|
|
---
|
|
|
|
## 5. Technical Implementation
|
|
|
|
### 5.1 Database Schema Changes
|
|
|
|
#### New Tables
|
|
|
|
```sql
|
|
-- Users table
|
|
users (
|
|
id UUID PRIMARY KEY,
|
|
email VARCHAR UNIQUE NOT NULL,
|
|
password_hash VARCHAR NOT NULL,
|
|
tier ENUM('free', 'personal') DEFAULT 'free',
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
)
|
|
|
|
-- API keys table
|
|
user_api_keys (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID REFERENCES users(id),
|
|
key VARCHAR(64) UNIQUE NOT NULL, -- e.g., dew_abc123...
|
|
name VARCHAR(100), -- optional label
|
|
created_at TIMESTAMP,
|
|
last_used_at TIMESTAMP,
|
|
revoked_at TIMESTAMP NULL
|
|
)
|
|
|
|
-- Private keywords table
|
|
user_keywords (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID REFERENCES users(id),
|
|
emoji_slug VARCHAR NOT NULL, -- references existing emoji dataset
|
|
keyword VARCHAR(200) NOT NULL,
|
|
lang VARCHAR(10) NOT NULL, -- ISO code or 'slang'
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP,
|
|
UNIQUE(user_id, emoji_slug, keyword)
|
|
)
|
|
|
|
-- Subscriptions table (for billing)
|
|
subscriptions (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID REFERENCES users(id),
|
|
plan VARCHAR(20), -- 'monthly', 'annual', 'lifetime'
|
|
status ENUM('active', 'canceled', 'expired'),
|
|
started_at TIMESTAMP,
|
|
expires_at TIMESTAMP NULL,
|
|
stripe_subscription_id VARCHAR NULL
|
|
)
|
|
```
|
|
|
|
### 5.2 API Validation Flow
|
|
|
|
**For Public Endpoints:**
|
|
```
|
|
1. Check Origin/Referer/User-Agent
|
|
2. If whitelisted → allow unlimited
|
|
3. Else → require valid API key (Personal tier)
|
|
4. Apply soft IP throttle (5000/hour)
|
|
```
|
|
|
|
**For Personal Endpoints:**
|
|
```
|
|
1. Extract Authorization: Bearer <key>
|
|
2. Lookup key in user_api_keys (not revoked)
|
|
3. Lookup user_id → verify subscriptions.status = 'active'
|
|
4. If valid → proceed
|
|
5. Else → 401 Unauthorized
|
|
```
|
|
|
|
### 5.3 Search Logic (Private + Public Blend)
|
|
|
|
**Endpoint:** `GET /v1/search?q=bekicot&private=true`
|
|
|
|
**Algorithm:**
|
|
```
|
|
1. If private=true and valid API key:
|
|
a. Query user_keywords WHERE user_id=X AND keyword LIKE '%bekicot%'
|
|
b. Query public emojis.json WHERE keywords LIKE '%bekicot%'
|
|
c. Merge results (private first, then public)
|
|
d. Deduplicate by emoji_slug
|
|
|
|
2. If private=false or no API key:
|
|
a. Query public emojis.json only
|
|
|
|
3. Return unified response
|
|
```
|
|
|
|
### 5.4 API Key Generation
|
|
|
|
**Format:** `dew_{random_32_chars}`
|
|
|
|
**Example:** `dew_k7j3m9q2n8p4r6s1t5v8w0x2y4z7a9c1`
|
|
|
|
**Generation:**
|
|
```php
|
|
function generateApiKey() {
|
|
return 'dew_' . bin2hex(random_bytes(16));
|
|
}
|
|
```
|
|
|
|
**Storage:** Hashed (bcrypt) or plain (with secure storage + HTTPS)
|
|
|
|
---
|
|
|
|
## 6. Migration Strategy
|
|
|
|
### Phase 1: Foundation (Week 1-2)
|
|
**Backend:**
|
|
- [ ] Create database tables (users, user_api_keys, user_keywords, subscriptions)
|
|
- [ ] Build auth endpoints (register, login, logout)
|
|
- [ ] Build API key CRUD endpoints
|
|
- [ ] Build private keyword CRUD endpoints
|
|
- [ ] Implement referrer whitelisting logic
|
|
- [ ] Update search endpoint to blend private + public
|
|
|
|
**Frontend (Website):**
|
|
- [ ] Build registration/login UI
|
|
- [ ] Build dashboard with tabs (Keywords, API Keys, Billing)
|
|
- [ ] Build keyword management table (CRUD interface)
|
|
- [ ] Build API key management UI
|
|
- [ ] Add upgrade CTAs for free users
|
|
|
|
**Testing:**
|
|
- [ ] Test auth flow
|
|
- [ ] Test keyword CRUD
|
|
- [ ] Test search blending (private + public)
|
|
- [ ] Test referrer whitelisting
|
|
|
|
### Phase 2: Extension Integration (Week 3)
|
|
**Extension Update:**
|
|
- [ ] Add "Link Account" button in settings
|
|
- [ ] Build login popup (OAuth-style or simple form)
|
|
- [ ] Store API key in chrome.storage.sync
|
|
- [ ] Update search to send Authorization header when logged in
|
|
- [ ] Update UI to show "Signed in as {email}"
|
|
- [ ] Add logout button
|
|
- [ ] Add upgrade prompt on private keyword miss
|
|
|
|
**Testing:**
|
|
- [ ] Test login flow from extension
|
|
- [ ] Test private keyword search from extension
|
|
- [ ] Test auto-insert with private keywords
|
|
- [ ] Test logout/revoke flow
|
|
|
|
### Phase 3: Payment Integration (Week 4)
|
|
**Stripe Setup:**
|
|
- [ ] Create Stripe products (Monthly, Annual, Lifetime)
|
|
- [ ] Build checkout flow (dewemoji.com/upgrade)
|
|
- [ ] Build webhook handler (subscription created/updated/canceled)
|
|
- [ ] Update subscriptions table on payment events
|
|
- [ ] Build billing dashboard (payment history, cancel)
|
|
|
|
**Testing:**
|
|
- [ ] Test full upgrade flow (free → Personal)
|
|
- [ ] Test subscription renewal
|
|
- [ ] Test cancellation
|
|
- [ ] Test lifetime purchase
|
|
|
|
### Phase 4: Deprecation of Gumroad (Optional)
|
|
- [ ] Add migration tool for existing Gumroad license holders
|
|
- [ ] Offer 1-click conversion: paste license key → create account → auto-upgrade to Personal
|
|
- [ ] Send email to existing users with migration instructions
|
|
- [ ] Set sunset date for Gumroad validation (e.g., 90 days)
|
|
|
|
---
|
|
|
|
## 7. Changes Required to Current Site
|
|
|
|
### Homepage (dewemoji.com)
|
|
**Current:** General emoji search + copy
|
|
**Required Changes:**
|
|
- [ ] Add hero section: "Find emojis in *your* language. Add personal keywords like 'bekicot' → 🐌"
|
|
- [ ] Add CTA: "Search Free" + "Create Personal Library"
|
|
- [ ] Add feature comparison table (Free vs Personal)
|
|
- [ ] Update footer: Add "Pricing", "Dashboard", "API Docs"
|
|
|
|
### Search Page
|
|
**Current:** Public search only
|
|
**Required Changes:**
|
|
- [ ] No changes for non-logged users
|
|
- [ ] For logged Personal users: blend private keywords in results
|
|
- [ ] Add badge on results: "Your keyword" vs "Public keyword"
|
|
- [ ] Add "Edit keyword" quick action on personal results
|
|
|
|
### Emoji Detail Page
|
|
**Current:** Shows public keywords, metadata
|
|
**Required Changes:**
|
|
- [ ] Add "Add to my keywords" button (Personal users only)
|
|
- [ ] Quick add modal: "What do you call this? → [input] → Save"
|
|
- [ ] Show user's private keywords for this emoji (if any)
|
|
- [ ] Remove voting/public submission UI (deprecated)
|
|
|
|
### New Pages to Build
|
|
|
|
#### `/register`
|
|
- Email + password form
|
|
- "Continue with Google" (optional, future)
|
|
- Terms acceptance
|
|
- Auto-login after registration
|
|
|
|
#### `/login`
|
|
- Email + password
|
|
- "Forgot password" link
|
|
- Redirect to dashboard after login
|
|
|
|
#### `/dashboard`
|
|
**Tabs:**
|
|
1. **My Keywords** (default)
|
|
- Table: Emoji | Keywords | Language | Actions
|
|
- Add button → modal (search emoji → add keyword)
|
|
- Bulk import/export buttons
|
|
|
|
2. **API Keys**
|
|
- List of keys with names + last used
|
|
- Generate button → creates new key
|
|
- Copy button + revoke button per key
|
|
|
|
3. **Billing**
|
|
- Current plan badge
|
|
- Next billing date
|
|
- Payment history table
|
|
- Upgrade/downgrade/cancel buttons
|
|
|
|
#### `/upgrade` or `/pricing`
|
|
- Feature comparison table (Free vs Personal)
|
|
- Pricing cards (Monthly $4.99 | Annual $49 | Lifetime $99)
|
|
- Stripe checkout integration
|
|
- FAQ section
|
|
|
|
---
|
|
|
|
## 8. Marketing & Positioning
|
|
|
|
### Target Audiences
|
|
|
|
**Primary:**
|
|
1. **Multilingual communicators** (Indonesian, Korean, Japanese, etc.)
|
|
- Problem: "Emoji pickers don't understand my language"
|
|
- Hook: "Search in bahasa Indonesia: 'bekicot' → 🐌"
|
|
|
|
2. **Heavy messengers** (WhatsApp, Discord, Twitter power users)
|
|
- Problem: "I use emojis 50+ times/day, default pickers suck"
|
|
- Hook: "Auto-insert emojis anywhere, instantly"
|
|
|
|
3. **Content creators & social media managers**
|
|
- Problem: "Need specific emojis fast, can't waste time scrolling"
|
|
- Hook: "Your custom emoji library, synced everywhere"
|
|
|
|
**Secondary:**
|
|
1. Developers needing semantic emoji API
|
|
2. Writers using emojis in documentation
|
|
3. Non-Latin language communities (Korean, Japanese, Russian)
|
|
|
|
### Positioning Statements
|
|
|
|
**For Indonesian users:**
|
|
*"Dewemoji adalah library emoji pribadi yang ngerti bahasa lo—dari 'bekicot' sampe slang gaul, semua bisa jadi shortcut emoji lo."*
|
|
|
|
**For global users:**
|
|
*"Your personal emoji dictionary that speaks your language—sync your custom keywords across all your devices."*
|
|
|
|
**For Chrome Web Store:**
|
|
*"Emoji search that understands you. Add personal keywords like 'snail' or 'bekicot'—works anywhere, syncs everywhere."*
|
|
|
|
### Growth Channels
|
|
|
|
1. **Chrome Web Store**
|
|
- Current: Already live (https://chromewebstore.google.com/detail/dewemoji...)
|
|
- Action: Update description with Personal tier benefits
|
|
- Strategy: Drive reviews via in-extension prompt ("Enjoying Dewemoji? Rate us!")
|
|
|
|
2. **Indonesian tech communities**
|
|
- Reddit: r/indonesia, r/indonesian
|
|
- Kaskus, Discord servers (DevID, IndieHackers Indonesia)
|
|
- Messaging: "Finally, emoji search yang ngerti bahasa kita"
|
|
|
|
3. **Product Hunt launch**
|
|
- Position: "Personal emoji library with multilingual keyword search"
|
|
- Hook: "Stop scrolling through emoji pickers—search in your language"
|
|
|
|
4. **Twitter/X shares**
|
|
- User screenshots: "Look, I can search 'bekicot' now!"
|
|
- Developer shares: "Semantic emoji API that understands Indonesian slang"
|
|
|
|
5. **SEO (organic)**
|
|
- Target: "emoji search [language]", "emoji picker indonesia", "find emoji by keyword"
|
|
- Content: Blog posts on emoji localization, multilingual search
|
|
|
|
---
|
|
|
|
## 9. Success Metrics
|
|
|
|
### Growth Metrics
|
|
- **Extension installs/month:** Target 1,000 → 10,000 in 6 months
|
|
- **Website MAU:** Target 5,000 → 50,000 in 6 months
|
|
- **Free → Personal conversion:** Target 2-5% (industry standard)
|
|
|
|
### Revenue Metrics
|
|
- **MRR (Monthly Recurring Revenue):** Target $500 → $5,000 in 6 months
|
|
- **Annual plan adoption:** Target 30% of paid users
|
|
- **Lifetime purchases:** Target 10% of paid users
|
|
|
|
### Usage Metrics
|
|
- **Avg searches/user/day:** Track engagement depth
|
|
- **Private keywords created/user:** Measure feature adoption
|
|
- **API key active usage:** Track cross-device sync adoption
|
|
|
|
### Quality Metrics
|
|
- **Extension rating:** Maintain >4.5 stars
|
|
- **User retention (30-day):** Target >40%
|
|
- **Churn rate:** Target <10%/month for Personal tier
|
|
|
|
---
|
|
|
|
## 10. Risks & Mitigation
|
|
|
|
### Risk 1: Low conversion (free → Personal)
|
|
**Mitigation:**
|
|
- Make free tier extremely generous (unlimited searches, all features except private)
|
|
- Add in-context upgrade prompts ("Not found. Create this keyword in Personal?")
|
|
- Offer 7-day free trial on Personal tier
|
|
|
|
### Risk 2: API abuse (free tier bombing)
|
|
**Mitigation:**
|
|
- Referrer whitelisting (already planned)
|
|
- Soft IP throttle (5000/hour)
|
|
- Monitor usage patterns; tighten if needed
|
|
|
|
### Risk 3: Low awareness ("Who needs emoji search?")
|
|
**Mitigation:**
|
|
- Target pain-aware users (multilingual, heavy messengers)
|
|
- Leverage Chrome Web Store (existing 237M Chrome users search "emoji")
|
|
- Create viral hooks (screenshot-worthy Indonesian keyword searches)
|
|
|
|
### Risk 4: Payment processor issues (Indonesia)
|
|
**Mitigation:**
|
|
- Start with Stripe (global, easiest)
|
|
- Add Midtrans/Xendit for local payment methods (bank transfer, e-wallet)
|
|
- Offer annual/lifetime for users without recurring billing access
|
|
|
|
---
|
|
|
|
## 11. Next Steps (Immediate Actions)
|
|
|
|
### Week 1: Backend Foundation
|
|
1. Design & implement database schema
|
|
2. Build auth system (register, login, JWT/session)
|
|
3. Build API key generation/validation
|
|
4. Build private keyword CRUD endpoints
|
|
5. Update search endpoint to blend private + public
|
|
|
|
### Week 2: Frontend Dashboard
|
|
1. Build registration/login pages
|
|
2. Build dashboard layout (tabs: Keywords, API Keys, Billing)
|
|
3. Build keyword management table + CRUD UI
|
|
4. Build API key management UI
|
|
5. Add upgrade CTAs throughout free tier
|
|
|
|
### Week 3: Extension Integration
|
|
1. Add "Link Account" in extension settings
|
|
2. Build login popup for extension
|
|
3. Store API key securely (chrome.storage)
|
|
4. Update search to send auth header when logged in
|
|
5. Add upgrade prompt on private keyword miss
|
|
|
|
### Week 4: Payment & Launch
|
|
1. Set up Stripe products (Monthly, Annual, Lifetime)
|
|
2. Build checkout flow + webhook handler
|
|
3. Build billing dashboard
|
|
4. Test full user journey (register → add keywords → login in extension → search)
|
|
5. Soft launch to existing users + Indonesian tech communities
|
|
|
|
---
|
|
|
|
## 12. Appendix: Key Decisions Made
|
|
|
|
| Decision | Rationale |
|
|
|----------|-----------|
|
|
| **Private-only keywords (no public)** | Eliminates moderation costs, AI costs, legal risks, complexity |
|
|
| **Free unlimited public search** | Drives viral growth; users fall in love before paywall |
|
|
| **Auto-Insert free (not paid)** | Core viral hook; competitors lack this, users share screenshots |
|
|
| **Tier renamed: Pro → Personal** | "Personal" clarifies it's private keywords, not business tools |
|
|
| **Self-generated API keys** | Flexibility with any payment provider (Stripe, Paddle, local) |
|
|
| **Referrer whitelisting for free** | Protects API from abuse without limiting real users |
|
|
| **No search count limits** | Emoji tools die with limits; unlimited = frictionless growth |
|
|
| **Payment: $4.99/mo or $49/yr** | Coffee price for individuals; low friction, high volume model |
|
|
|
|
---
|
|
|
|
## 13. Questions for Future Consideration
|
|
|
|
1. **Team libraries:** Should Personal tier allow shared keyword libraries (e.g., family/team)?
|
|
2. **Mobile apps:** Native iOS/Android apps or continue web + extension focus?
|
|
3. **API marketplace:** Offer public API access for developers (separate paid tier)?
|
|
4. **Localization:** Add more default language packs (Korean, Japanese, Spanish)?
|
|
5. **AI assistance:** "Suggest keywords for this emoji based on my usage patterns"?
|
|
|
|
---
|
|
|
|
**End of Brief**
|
|
|
|
This document serves as the north star for Dewemoji's development through 2026. All implementation decisions should align with the principle: **"Free discovery → Paid personalization"** and the vision of enabling personal, multilingual emoji expression for everyone. |