Initial commit
This commit is contained in:
2
.markdownlint-cli2.yaml
Normal file
2
.markdownlint-cli2.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
config:
|
||||||
|
line-length: false
|
||||||
44
CLAUDE.md
Normal file
44
CLAUDE.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Morpheus — Project Context
|
||||||
|
|
||||||
|
Privacy-centric social network for Russian-speaking users. Built on Nostr.
|
||||||
|
Private, not anonymous. NIP-44 E2E encryption for DMs. No ads, ever.
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- **Protocol:** Nostr (NIP-01, NIP-44, NIP-29, NIP-40, NIP-46, NIP-56, NIP-96)
|
||||||
|
- **Media:** Blossom / NIP-96
|
||||||
|
- **Platforms:** Flutter/Dart. Mobile-first (iOS + Android), Web PWA, Desktop
|
||||||
|
- **Key storage:** Secure Enclave / Keystore, Shamir social recovery, encrypted cloud backup
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
- NIP-44 E2E for all DMs — server never has plaintext
|
||||||
|
- Public posts are public (by design)
|
||||||
|
- Metadata visible to relay operators — see [threat model](docs/threat-model-and-workarounds.md)
|
||||||
|
- No tracking, no ad infra, no behavioral profiling
|
||||||
|
- Monetization: subscriptions, marketplace, creator tools — see [docs/monetization.md](docs/monetization.md)
|
||||||
|
- Web of trust relay gating (NIP-02 follow count) — see [docs/web-of-trust.md](docs/web-of-trust.md)
|
||||||
|
|
||||||
|
## Tooling
|
||||||
|
|
||||||
|
- **Linting:** `just lint-md` — runs markdownlint-cli2
|
||||||
|
- **Git hooks:** lefthook — see `lefthook.yml`
|
||||||
|
- **Docs:** EN + RU, keep in sync — see [README.md](README.md) for full table
|
||||||
|
|
||||||
|
## Design system
|
||||||
|
|
||||||
|
See [docs/design-system.md](docs/design-system.md). Key values:
|
||||||
|
|
||||||
|
- Primary: Morpheus Violet `#7C3AED`, dark mode first
|
||||||
|
- Fonts: Inter (UI), JetBrains Mono (code), Manrope/Unbounded (display)
|
||||||
|
- 4px spacing grid, `6/10/16/24px` radius scale
|
||||||
|
- Rounded-square avatars with pubkey-hash gradient fallback
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
- No ads logic, tracking pixels, analytics SDKs, or behavioral profiling — ever
|
||||||
|
- All DM code must use NIP-44 — no plaintext DM paths
|
||||||
|
- UI copy in both EN and RU
|
||||||
|
- Prefer simplicity over configurability
|
||||||
|
- Speed is a feature
|
||||||
|
- When in doubt, choose the more private option
|
||||||
63
README.md
Normal file
63
README.md
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# Morpheus
|
||||||
|
|
||||||
|
Privacy-centric social network for Russian-speaking users, built on the
|
||||||
|
[Nostr](https://nostr.com/) protocol.
|
||||||
|
|
||||||
|
> "Everyone knows your name. Nobody reads your messages."
|
||||||
|
|
||||||
|
## Sketches
|
||||||
|
|
||||||
|
| Feed | Groups | Chat |
|
||||||
|
| :---: | :---: | :---: |
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
| Tool | Purpose | Install |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| [just](https://github.com/casey/just) | Command runner | `brew install just` / `cargo install just` |
|
||||||
|
| [markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2) | Markdown linter | `npm install -g markdownlint-cli2` |
|
||||||
|
| [lefthook](https://github.com/evilmartians/lefthook) | Git hooks manager | `gem install lefthook` / `brew install lefthook` |
|
||||||
|
|
||||||
|
After cloning, install git hooks:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
lefthook install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Just commands
|
||||||
|
|
||||||
|
[just](https://github.com/casey/just) is a command runner (like `make`, but
|
||||||
|
simpler). Run `just --list` to see all available recipes.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
just lint-md # Lint all Markdown files
|
||||||
|
```
|
||||||
|
|
||||||
|
## Markdown linting
|
||||||
|
|
||||||
|
All `.md` files are linted with
|
||||||
|
[markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2) to keep
|
||||||
|
documentation consistent and well-formatted. Configuration lives in
|
||||||
|
`.markdownlint-cli2.yaml`.
|
||||||
|
|
||||||
|
The lint runs automatically on every commit via lefthook (see `lefthook.yml`).
|
||||||
|
To run it manually:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
just lint-md
|
||||||
|
# or directly:
|
||||||
|
markdownlint-cli2 "**/*.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
All docs are maintained in English and Russian (keep both in sync).
|
||||||
|
|
||||||
|
| Document | EN | RU |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Philosophy | [docs/philosophy.md](docs/philosophy.md) | [docs/ru/philosophy.md](docs/ru/philosophy.md) |
|
||||||
|
| Monetization | [docs/monetization.md](docs/monetization.md) | [docs/ru/monetization.md](docs/ru/monetization.md) |
|
||||||
|
| Design system | [docs/design-system.md](docs/design-system.md) | [docs/ru/design-system.md](docs/ru/design-system.md) |
|
||||||
|
| Threat model | [docs/threat-model-and-workarounds.md](docs/threat-model-and-workarounds.md) | [docs/ru/threat-model-and-workarounds.md](docs/ru/threat-model-and-workarounds.md) |
|
||||||
|
| Web of trust | [docs/web-of-trust.md](docs/web-of-trust.md) | [docs/ru/web-of-trust.md](docs/ru/web-of-trust.md) |
|
||||||
267
docs/design-system.md
Normal file
267
docs/design-system.md
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
# Morpheus — Design System
|
||||||
|
|
||||||
|
## Design Philosophy
|
||||||
|
|
||||||
|
### Feels alive, never heavy
|
||||||
|
|
||||||
|
Morpheus should feel like the fastest app on your phone. Inspired by the speed of Telegram,
|
||||||
|
the visual polish of iOS native apps, and the personality of Discord — but with its own
|
||||||
|
distinct identity. Not corporate. Not underground. Alive.
|
||||||
|
|
||||||
|
## Visual Identity
|
||||||
|
|
||||||
|
### Name & Symbol
|
||||||
|
|
||||||
|
- **Morpheus** — the awakener, the one who offers the choice
|
||||||
|
- Symbol: an abstracted eye or pill shape — recognition without explanation
|
||||||
|
- The symbol must work at 16x16 favicon size and on a billboard
|
||||||
|
|
||||||
|
### Color System
|
||||||
|
|
||||||
|
#### Primary Palette
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Morpheus Violet #7C3AED — Primary brand color, CTAs, active states
|
||||||
|
Electric Indigo #4F46E5 — Secondary, links, interactive elements
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Neutral Palette
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Void #09090B — Darkest background (dark mode)
|
||||||
|
Charcoal #18181B — Card backgrounds (dark mode)
|
||||||
|
Slate #27272A — Borders, dividers (dark mode)
|
||||||
|
Mist #A1A1AA — Secondary text
|
||||||
|
Cloud #F4F4F5 — Card backgrounds (light mode)
|
||||||
|
Snow #FAFAFA — Lightest background (light mode)
|
||||||
|
Pure #FFFFFF — Text on dark, cards on light
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Accent Palette (Semantic)
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Pulse Green #10B981 — Success, online, sent
|
||||||
|
Flame Orange #F59E0B — Warning, pending
|
||||||
|
Signal Red #EF4444 — Error, destructive actions
|
||||||
|
Ice Blue #06B6D4 — Info, links in context
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Gradient
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Morpheus Gradient: #7C3AED → #4F46E5 → #06B6D4
|
||||||
|
Usage: onboarding screens, premium badges, hero moments only
|
||||||
|
Never on body text. Never on backgrounds with text overlay.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dark Mode First
|
||||||
|
|
||||||
|
- Dark mode is the default. Light mode is fully supported but secondary.
|
||||||
|
- Rationale: target audience prefers dark. Dark mode is easier on OLED batteries.
|
||||||
|
- Dark backgrounds use the Void/Charcoal scale, never pure #000000 for cards.
|
||||||
|
|
||||||
|
## Typography
|
||||||
|
|
||||||
|
### Font Stack
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Primary: Inter (UI text, body)
|
||||||
|
Monospace: JetBrains Mono (keys, codes, technical info)
|
||||||
|
Display: Manrope or Unbounded (headings, marketing, hero text)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Type Scale
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Display XL: 36px / 40px line-height — Hero text only
|
||||||
|
Display: 30px / 36px — Page titles
|
||||||
|
Heading 1: 24px / 32px — Section headers
|
||||||
|
Heading 2: 20px / 28px — Card headers
|
||||||
|
Body: 16px / 24px — Default readable text
|
||||||
|
Body Small: 14px / 20px — Secondary info, timestamps
|
||||||
|
Caption: 12px / 16px — Labels, badges, metadata
|
||||||
|
```
|
||||||
|
|
||||||
|
### Weight Usage
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Regular (400): Body text, descriptions
|
||||||
|
Medium (500): UI labels, navigation, buttons
|
||||||
|
Semibold (600): Headings, emphasis
|
||||||
|
Bold (700): Display text, hero moments only
|
||||||
|
```
|
||||||
|
|
||||||
|
## Spacing & Layout
|
||||||
|
|
||||||
|
### Spacing Scale (4px base)
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
xs: 4px — Inline padding, icon gaps
|
||||||
|
sm: 8px — Tight grouping
|
||||||
|
md: 12px — Default inner padding
|
||||||
|
lg: 16px — Card padding, section gaps
|
||||||
|
xl: 24px — Between sections
|
||||||
|
2xl: 32px — Page-level spacing
|
||||||
|
3xl: 48px — Major section breaks
|
||||||
|
```
|
||||||
|
|
||||||
|
### Border Radius
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
sm: 6px — Buttons, inputs, small cards
|
||||||
|
md: 10px — Cards, dialogs
|
||||||
|
lg: 16px — Large cards, modals
|
||||||
|
xl: 24px — Avatars (rounded square), feature cards
|
||||||
|
full: 9999px — Pills, tags, circular avatars
|
||||||
|
```
|
||||||
|
|
||||||
|
### Grid
|
||||||
|
|
||||||
|
- Mobile-first. Single column default.
|
||||||
|
- Max content width: 640px for feeds (readability).
|
||||||
|
- Desktop: centered content column with contextual sidebars.
|
||||||
|
- No infinite horizontal scrolling. Vertical is native.
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
### Buttons
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Primary: Morpheus Violet bg, white text, 6px radius, medium weight
|
||||||
|
Hover: slightly lighter. Active: slightly darker.
|
||||||
|
Secondary: Transparent bg, violet text, 1px violet border
|
||||||
|
Hover: violet/10 bg fill
|
||||||
|
Ghost: Transparent bg, mist text, no border
|
||||||
|
Hover: slate bg fill
|
||||||
|
Destructive: Signal Red bg, white text (confirmation required)
|
||||||
|
|
||||||
|
Size: Default 40px height, compact 32px, large 48px
|
||||||
|
Min touch target: 44x44px always
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cards
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Dark mode: Charcoal bg, 1px Slate border, md radius
|
||||||
|
Light mode: Pure bg, 1px Cloud border, md radius
|
||||||
|
Elevation: Subtle shadow on hover only (never resting shadow)
|
||||||
|
Padding: lg (16px)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Inputs
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Height: 44px (touch-friendly)
|
||||||
|
Border: 1px Slate, focus → 2px Morpheus Violet
|
||||||
|
Background: Void (dark) / Snow (light)
|
||||||
|
Placeholder: Mist color
|
||||||
|
Error state: Signal Red border + helper text below
|
||||||
|
```
|
||||||
|
|
||||||
|
### Avatars
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Sizes: 24px (inline), 32px (list), 40px (default), 64px (profile), 96px (hero)
|
||||||
|
Shape: Rounded square (xl radius) — distinguishes from other platforms
|
||||||
|
Fallback: Generated gradient from public key hash (every user gets a unique one)
|
||||||
|
Online dot: Pulse Green, bottom-right, 25% of avatar size
|
||||||
|
```
|
||||||
|
|
||||||
|
### Navigation
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Mobile: Bottom tab bar, 5 items max. Haptic feedback on tap.
|
||||||
|
Active tab: Morpheus Violet icon + label
|
||||||
|
Inactive: Mist icon, no label
|
||||||
|
Desktop: Left sidebar, collapsible. Icons + labels.
|
||||||
|
Transitions: Horizontal slide between tabs, vertical within feeds
|
||||||
|
```
|
||||||
|
|
||||||
|
## Motion & Animation
|
||||||
|
|
||||||
|
### Principles
|
||||||
|
|
||||||
|
- **Purposeful**: every animation communicates something (state change, spatial relationship)
|
||||||
|
- **Fast**: default duration 150-200ms. Never exceed 300ms for UI transitions.
|
||||||
|
- **Interruptible**: user input cancels any running animation immediately
|
||||||
|
- **No decorative animation**: no floating particles, no pulsing logos, no ambient motion
|
||||||
|
|
||||||
|
### Standard Easings
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
ease-out: cubic-bezier(0.0, 0.0, 0.2, 1) — Elements entering
|
||||||
|
ease-in: cubic-bezier(0.4, 0.0, 1, 1) — Elements exiting
|
||||||
|
ease-in-out: cubic-bezier(0.4, 0.0, 0.2, 1) — Elements transforming
|
||||||
|
spring: spring(1, 80, 10) — Playful interactions (reactions, likes)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Key Animations
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Page transition: Horizontal slide, 200ms ease-out
|
||||||
|
Modal: Scale from 0.95 + fade, 150ms ease-out
|
||||||
|
Toast/snackbar: Slide up from bottom, 200ms ease-out, auto-dismiss 3s
|
||||||
|
Pull to refresh: Native feel, custom indicator with Morpheus symbol
|
||||||
|
Message send: Slide up + slight scale, spring easing
|
||||||
|
Reaction: Pop + particle burst, spring easing (one of few "fun" moments)
|
||||||
|
Skeleton loading: Shimmer gradient, 1.5s loop (only when truly loading)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Iconography
|
||||||
|
|
||||||
|
### Style
|
||||||
|
|
||||||
|
- Outlined style (not filled) for navigation and UI — 1.5px stroke
|
||||||
|
- Filled style for active/selected states
|
||||||
|
- 24x24 base size, optically adjusted per icon
|
||||||
|
- Consistent metaphors: no mixing material/feather/custom within a view
|
||||||
|
|
||||||
|
### Custom Icons Needed
|
||||||
|
|
||||||
|
- Relay status indicator
|
||||||
|
- Key/identity icon (not a literal key — too crypto-bro)
|
||||||
|
- Encryption indicator (subtle, not a padlock — normalization, not alarm)
|
||||||
|
- Morpheus-specific actions (e.g., "zap" for tips if using Lightning)
|
||||||
|
|
||||||
|
## Tone of Voice (UI Copy)
|
||||||
|
|
||||||
|
### Localization Principles
|
||||||
|
|
||||||
|
- **Casual but not childish** — "Hey" not "Greetings, dear user"
|
||||||
|
- **Direct** — "Send" not "Submit your message"
|
||||||
|
- **Confident** — "Your messages are encrypted" not "We try to protect..."
|
||||||
|
- **Bilingual-ready** — UI must work in Russian and English from day one
|
||||||
|
- **No corporate speak** — "Something went wrong" not "An unexpected error occurred"
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Empty state: "Nobody here yet. Be the first." (not "No content available")
|
||||||
|
Error: "Couldn't connect. Tap to retry." (not "Network error 503")
|
||||||
|
Onboarding: "This key is you. Save it somewhere safe." (not "Back up your keypair")
|
||||||
|
Destructive: "Delete this forever?" (not "Are you sure you want to delete?")
|
||||||
|
```
|
||||||
|
|
||||||
|
## Accessibility
|
||||||
|
|
||||||
|
- Minimum contrast ratio: 4.5:1 for body text, 3:1 for large text
|
||||||
|
- All interactive elements: 44x44px minimum touch target
|
||||||
|
- Screen reader labels for all icons and non-text elements
|
||||||
|
- Reduce Motion support: disable all non-essential animation
|
||||||
|
- Font scaling: support system font size preferences (up to 200%)
|
||||||
|
- No information conveyed by color alone (always pair with icon or text)
|
||||||
|
|
||||||
|
## Platform Targets
|
||||||
|
|
||||||
|
### Priority Order
|
||||||
|
|
||||||
|
1. **Mobile (iOS + Android)** — React Native or Flutter, native feel mandatory
|
||||||
|
2. **Web (PWA)** — Full feature parity, installable
|
||||||
|
3. **Desktop** — Electron or Tauri wrapper of web, or native if resources allow
|
||||||
|
|
||||||
|
### Platform Adaptation
|
||||||
|
|
||||||
|
- Follow platform conventions for navigation patterns (iOS back swipe, Android back button)
|
||||||
|
- Native share sheets, notifications, haptics
|
||||||
|
- Respect system dark/light mode by default, allow manual override
|
||||||
|
- Adaptive layouts: phone → tablet → desktop, not just scaled up
|
||||||
104
docs/monetization.md
Normal file
104
docs/monetization.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Morpheus — Monetization Strategy
|
||||||
|
|
||||||
|
## Constraint
|
||||||
|
|
||||||
|
The business model must satisfy all of the following:
|
||||||
|
|
||||||
|
1. **No ads** — ever. Not behavioral, not contextual, not "privacy-respecting." Zero ads.
|
||||||
|
2. **No data selling** — ever
|
||||||
|
3. **Accessible to teenagers** — most users won't have credit cards
|
||||||
|
4. **Sustainable** — must cover infrastructure (relay hosting, CDN, development)
|
||||||
|
5. **Aligned with privacy** — revenue and user interests must never conflict
|
||||||
|
6. **Compliant** — payment processing and business operations follow applicable law
|
||||||
|
|
||||||
|
## Revenue Streams
|
||||||
|
|
||||||
|
### Tier 1: Core Revenue (Day 1)
|
||||||
|
|
||||||
|
#### 1.1 Morpheus Pro (Subscription)
|
||||||
|
|
||||||
|
Monthly subscription unlocking premium features:
|
||||||
|
|
||||||
|
- Custom themes and advanced profile styling
|
||||||
|
- Higher media upload limits (video length, image quality)
|
||||||
|
- Priority relay access (faster message delivery)
|
||||||
|
- Exclusive sticker packs and reactions
|
||||||
|
- Profile badges and visual flair
|
||||||
|
- Early access to new features
|
||||||
|
|
||||||
|
**Pricing strategy:**
|
||||||
|
|
||||||
|
- Aggressive teen-friendly pricing (~149-299 RUB/month)
|
||||||
|
- Payment via Russian methods: SBP, Mir cards, mobile carrier billing
|
||||||
|
- Mobile carrier billing is critical — teens can pay via phone balance
|
||||||
|
- Gift codes purchasable at retail (similar to game cards)
|
||||||
|
- "Gift Pro to a friend" as social mechanic
|
||||||
|
|
||||||
|
**Why it works:** Teens already pay for Discord Nitro, Telegram Premium, game passes.
|
||||||
|
Status symbols and customization are proven monetization for this demographic.
|
||||||
|
|
||||||
|
#### 1.2 Sticker & Theme Marketplace
|
||||||
|
|
||||||
|
- Creators design and sell sticker packs, themes, and profile decorations
|
||||||
|
- Morpheus takes a 15-20% commission
|
||||||
|
- Creators earn real money, incentivizing high-quality content
|
||||||
|
- Free base packs ensure non-paying users aren't excluded
|
||||||
|
|
||||||
|
### Tier 2: Growth Revenue (Month 3-6)
|
||||||
|
|
||||||
|
#### 2.1 Creator Tools (Paid)
|
||||||
|
|
||||||
|
For users with audiences (bloggers, musicians, artists):
|
||||||
|
|
||||||
|
- Analytics dashboard (aggregate, non-identifying)
|
||||||
|
- Paid subscriptions to creator channels (Morpheus takes 10-15%)
|
||||||
|
- Tipping via integrated payment (Lightning Network or traditional)
|
||||||
|
- Exclusive content gates
|
||||||
|
|
||||||
|
#### 2.2 Business Profiles
|
||||||
|
|
||||||
|
- Verified business accounts with enhanced features
|
||||||
|
- Customer communication tools
|
||||||
|
- No ad targeting — businesses post to their followers organically
|
||||||
|
- Flat monthly fee, no per-impression charges
|
||||||
|
|
||||||
|
### Tier 3: Ecosystem Revenue (Month 6-12)
|
||||||
|
|
||||||
|
#### 3.1 Morpheus Relay Hosting
|
||||||
|
|
||||||
|
- Managed relay infrastructure for communities and organizations
|
||||||
|
- "Your community, your relay, our infrastructure"
|
||||||
|
- Tiered pricing based on storage and throughput
|
||||||
|
|
||||||
|
#### 3.2 API Access
|
||||||
|
|
||||||
|
- Rate-limited free tier for hobbyist developers
|
||||||
|
- Paid tiers for bots, integrations, and third-party apps
|
||||||
|
- Fosters ecosystem without subsidizing it indefinitely
|
||||||
|
|
||||||
|
## Anti-Patterns (What We Will NOT Do)
|
||||||
|
|
||||||
|
| Anti-pattern | Why not |
|
||||||
|
| --- | --- |
|
||||||
|
| Any form of advertising | Core principle — no ads, ever |
|
||||||
|
| Data licensing / selling | Violates privacy promise |
|
||||||
|
| Freemium with crippled free tier | Alienates core teen audience |
|
||||||
|
| Token / cryptocurrency speculation | Distracts from product, attracts wrong crowd |
|
||||||
|
| Venture-funded growth-at-all-costs | Misaligned incentives, leads to enshittification |
|
||||||
|
| Paywalled basic messaging | Communication is a right, not a premium feature |
|
||||||
|
|
||||||
|
## Financial Sustainability Model
|
||||||
|
|
||||||
|
**Phase 1 (0-6 months):** Seed funding or grants (open-source / digital rights foundations).
|
||||||
|
Lean team. Run community relays at cost.
|
||||||
|
|
||||||
|
**Phase 2 (6-18 months):** Pro subscriptions + marketplace commissions cover server costs.
|
||||||
|
Target: 3-5% conversion to Pro among active users.
|
||||||
|
|
||||||
|
**Phase 3 (18+ months):** Creator economy + business profiles generate margin.
|
||||||
|
Relay hosting becomes profit center. Sustainable without external funding.
|
||||||
|
|
||||||
|
## Key Metric
|
||||||
|
|
||||||
|
**Revenue per user must never require knowing who the user is.**
|
||||||
|
All monetization is opt-in, explicit, and identity-independent.
|
||||||
131
docs/philosophy.md
Normal file
131
docs/philosophy.md
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
# Morpheus — Philosophy
|
||||||
|
|
||||||
|
> "Everyone knows your name. Nobody reads your messages."
|
||||||
|
|
||||||
|
## The Core Distinction
|
||||||
|
|
||||||
|
**Morpheus is private, not anonymous.**
|
||||||
|
|
||||||
|
You have a real identity on Morpheus — a profile, a reputation, followers, a history.
|
||||||
|
People know you. That's the point of a social network.
|
||||||
|
|
||||||
|
But your direct messages are encrypted end-to-end with NIP-44. Not because we choose
|
||||||
|
not to read them — because we architecturally *cannot*. The encryption happens on your
|
||||||
|
device, between you and the recipient. We never hold the keys.
|
||||||
|
|
||||||
|
This is not a political statement. It's an engineering decision.
|
||||||
|
|
||||||
|
| What we CAN provide if legally required | What we CANNOT provide, ever |
|
||||||
|
| --- | --- |
|
||||||
|
| Public posts (they're public by design) | Content of encrypted DMs |
|
||||||
|
| Account metadata (creation date, public key) | Private encryption keys |
|
||||||
|
| Relay connection logs (IP, timestamp) | Decrypted message content |
|
||||||
|
| Public social graph (who follows whom publicly) | Messages that were never stored on our relays |
|
||||||
|
|
||||||
|
We comply with the law. We also build systems where the most sensitive data
|
||||||
|
simply does not exist in a form we can access. These two things are not in conflict.
|
||||||
|
|
||||||
|
## Why Morpheus Exists
|
||||||
|
|
||||||
|
Social networks in Russia are under pressure. Services get blocked, APIs get restricted,
|
||||||
|
content gets moderated by external mandate. Young people deserve a social space that is:
|
||||||
|
|
||||||
|
1. **Fast** — because they're used to the best apps in the world
|
||||||
|
2. **Beautiful** — because aesthetics matter to this generation
|
||||||
|
3. **Honest about privacy** — not "trust us" but "verify: here's the code"
|
||||||
|
4. **Resilient** — if something changes politically, your messages are still yours
|
||||||
|
|
||||||
|
## Design Principles
|
||||||
|
|
||||||
|
### 1. Speed is respect
|
||||||
|
|
||||||
|
Every millisecond of loading time says "we don't value your time."
|
||||||
|
Morpheus must feel instant — faster than Telegram, smoother than Instagram.
|
||||||
|
60fps or nothing. If the user can perceive a delay, it's a bug.
|
||||||
|
|
||||||
|
### 2. Privacy through architecture, not policy
|
||||||
|
|
||||||
|
Don't say "we won't read your messages." Say "we can't."
|
||||||
|
NIP-44 encryption means DM content is ciphertext on our relays.
|
||||||
|
We don't make a privacy promise — we make a mathematical guarantee.
|
||||||
|
Public posts are public. Private messages are private. No ambiguity.
|
||||||
|
|
||||||
|
### 3. Not anonymous, not surveilled — just private
|
||||||
|
|
||||||
|
Users have identities. They build reputations. They're accountable for public behavior.
|
||||||
|
But their private conversations are theirs. This is the same expectation people have
|
||||||
|
with postal mail, phone calls, and in-person conversations.
|
||||||
|
Morpheus simply extends this expectation to digital communication.
|
||||||
|
|
||||||
|
### 4. Simplicity is power
|
||||||
|
|
||||||
|
Every feature must justify its existence. If a teenager can't figure it out
|
||||||
|
in 3 seconds, it's too complex. No settings pages. No toggles.
|
||||||
|
The app should feel like it reads your mind, not like it needs a manual.
|
||||||
|
|
||||||
|
### 5. We are a business, not a movement
|
||||||
|
|
||||||
|
Morpheus is a company that makes a product. We charge for premium features.
|
||||||
|
We are not funded by ads, not funded by data sales, not funded by ideology.
|
||||||
|
Our incentive is simple: make a product so good that people pay for it.
|
||||||
|
When incentives are clear, trust follows.
|
||||||
|
|
||||||
|
### 6. Compliant and principled
|
||||||
|
|
||||||
|
We operate within the law. We register where required. We respond to lawful requests.
|
||||||
|
AND we build systems where encrypted content cannot be decrypted by us.
|
||||||
|
These are not contradictions — this is responsible engineering.
|
||||||
|
We will never install backdoors, key escrow, or ghost protocols.
|
||||||
|
If we cannot technically comply with a specific request, we say so transparently.
|
||||||
|
|
||||||
|
### 7. Open by default
|
||||||
|
|
||||||
|
The client is open source. The protocol (Nostr) is open.
|
||||||
|
Users can verify every privacy claim by reading the code.
|
||||||
|
If you don't trust us, don't take our word — audit us.
|
||||||
|
|
||||||
|
## What Morpheus Is
|
||||||
|
|
||||||
|
- A fast, beautiful social network for young Russian-speaking people
|
||||||
|
- Built on Nostr protocol for real encryption and portability
|
||||||
|
- A business that makes money from premium features, not from users' data
|
||||||
|
- Compliant with applicable law while protecting what encryption protects
|
||||||
|
- An app your friend tells you about because it's good, not because it's political
|
||||||
|
|
||||||
|
## What Morpheus Is NOT
|
||||||
|
|
||||||
|
- **Not anonymous** — you have a real, persistent identity
|
||||||
|
- **Not a protest tool** — it's for memes, group chats, dating, music, friends
|
||||||
|
- **Not a crypto/Web3 project** — Nostr uses keys, but there are no tokens or blockchain
|
||||||
|
- **Not anti-government** — we comply with law; we also use strong encryption
|
||||||
|
- **Not a dark web app** — the aesthetic is bright, modern, and mainstream
|
||||||
|
|
||||||
|
## The Privacy Spectrum
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Fully surveilled Morpheus position Fully anonymous
|
||||||
|
|__________________________|___________________________|
|
||||||
|
VK, OK "Private, not anonymous" Tor, I2P
|
||||||
|
- Real identities
|
||||||
|
- E2E encrypted DMs
|
||||||
|
- Public posts are public
|
||||||
|
- Compliant operations
|
||||||
|
- No backdoors
|
||||||
|
```
|
||||||
|
|
||||||
|
Morpheus occupies the practical middle ground: the same privacy you'd expect in real life,
|
||||||
|
applied to digital communication. Nothing more extreme. Nothing less.
|
||||||
|
|
||||||
|
## The Morpheus Promise
|
||||||
|
|
||||||
|
We will:
|
||||||
|
|
||||||
|
- Encrypt all DMs with NIP-44 — always, by default, no opt-in needed
|
||||||
|
- Publish our source code
|
||||||
|
- Comply with lawful requests using data we actually have
|
||||||
|
- Be transparent about what data exists and what doesn't
|
||||||
|
- Never add backdoors or weaken encryption
|
||||||
|
- Never sell user data or run behavioral advertising
|
||||||
|
- Build a sustainable business on premium features
|
||||||
|
|
||||||
|
We will be honest when we cannot do something, rather than pretend we can.
|
||||||
267
docs/ru/design-system.md
Normal file
267
docs/ru/design-system.md
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
# Morpheus — Дизайн-система
|
||||||
|
|
||||||
|
## Философия дизайна
|
||||||
|
|
||||||
|
### «Ощущается живым, никогда — тяжёлым.»
|
||||||
|
|
||||||
|
Morpheus должен ощущаться как самое быстрое приложение на телефоне. Вдохновлено скоростью Telegram,
|
||||||
|
визуальной отполированностью нативных приложений iOS и характером Discord — но с собственной
|
||||||
|
идентичностью. Не корпоративный. Не андеграунд. Живой.
|
||||||
|
|
||||||
|
## Визуальная идентичность
|
||||||
|
|
||||||
|
### Название и символ
|
||||||
|
|
||||||
|
- **Morpheus** — пробуждающий, тот кто предлагает выбор
|
||||||
|
- Символ: абстрактный глаз или форма пилюли — узнаваемость без объяснений
|
||||||
|
- Символ должен работать в размере 16x16 фавикон и на билборде
|
||||||
|
|
||||||
|
### Цветовая система
|
||||||
|
|
||||||
|
#### Основная палитра
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Morpheus Violet #7C3AED — Основной цвет бренда, CTA, активные состояния
|
||||||
|
Electric Indigo #4F46E5 — Вторичный, ссылки, интерактивные элементы
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Нейтральная палитра
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Void #09090B — Самый тёмный фон (тёмная тема)
|
||||||
|
Charcoal #18181B — Фон карточек (тёмная тема)
|
||||||
|
Slate #27272A — Границы, разделители (тёмная тема)
|
||||||
|
Mist #A1A1AA — Вторичный текст
|
||||||
|
Cloud #F4F4F5 — Фон карточек (светлая тема)
|
||||||
|
Snow #FAFAFA — Самый светлый фон (светлая тема)
|
||||||
|
Pure #FFFFFF — Текст на тёмном, карточки на светлом
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Акцентная палитра (семантическая)
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Pulse Green #10B981 — Успех, онлайн, отправлено
|
||||||
|
Flame Orange #F59E0B — Предупреждение, ожидание
|
||||||
|
Signal Red #EF4444 — Ошибка, деструктивные действия
|
||||||
|
Ice Blue #06B6D4 — Информация, ссылки в контексте
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Градиент
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Градиент Morpheus: #7C3AED → #4F46E5 → #06B6D4
|
||||||
|
Применение: экраны онбординга, премиум-бейджи, только «героические» моменты
|
||||||
|
Никогда на тексте body. Никогда на фонах с текстом поверх.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тёмная тема — по умолчанию
|
||||||
|
|
||||||
|
- Тёмная тема по умолчанию. Светлая полностью поддерживается, но вторична.
|
||||||
|
- Обоснование: целевая аудитория предпочитает тёмную. Тёмная тема экономит батарею OLED.
|
||||||
|
- Тёмные фоны используют шкалу Void/Charcoal, никогда чистый #000000 для карточек.
|
||||||
|
|
||||||
|
## Типографика
|
||||||
|
|
||||||
|
### Набор шрифтов
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Основной: Inter (текст интерфейса, body)
|
||||||
|
Моноширинный: JetBrains Mono (ключи, коды, техническая информация)
|
||||||
|
Дисплейный: Manrope или Unbounded (заголовки, маркетинг, hero-текст)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шкала типографики
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Display XL: 36px / 40px межстрочный — Только hero-текст
|
||||||
|
Display: 30px / 36px — Заголовки страниц
|
||||||
|
Heading 1: 24px / 32px — Заголовки секций
|
||||||
|
Heading 2: 20px / 28px — Заголовки карточек
|
||||||
|
Body: 16px / 24px — Стандартный читаемый текст
|
||||||
|
Body Small: 14px / 20px — Вторичная информация, время
|
||||||
|
Caption: 12px / 16px — Лейблы, бейджи, метаданные
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование жирности
|
||||||
|
|
||||||
|
```text
|
||||||
|
Regular (400): Текст body, описания
|
||||||
|
Medium (500): Лейблы UI, навигация, кнопки
|
||||||
|
Semibold (600): Заголовки, акценты
|
||||||
|
Bold (700): Дисплейный текст, только hero-моменты
|
||||||
|
```
|
||||||
|
|
||||||
|
## Отступы и сетка
|
||||||
|
|
||||||
|
### Шкала отступов (база 4px)
|
||||||
|
|
||||||
|
```text
|
||||||
|
xs: 4px — Внутренние отступы inline, зазоры иконок
|
||||||
|
sm: 8px — Тесная группировка
|
||||||
|
md: 12px — Стандартный внутренний отступ
|
||||||
|
lg: 16px — Отступ карточек, зазоры секций
|
||||||
|
xl: 24px — Между секциями
|
||||||
|
2xl: 32px — Отступы на уровне страницы
|
||||||
|
3xl: 48px — Крупные разрывы секций
|
||||||
|
```
|
||||||
|
|
||||||
|
### Радиусы скругления
|
||||||
|
|
||||||
|
```text
|
||||||
|
sm: 6px — Кнопки, инпуты, мелкие карточки
|
||||||
|
md: 10px — Карточки, диалоги
|
||||||
|
lg: 16px — Крупные карточки, модалы
|
||||||
|
xl: 24px — Аватары (скруглённый квадрат), карточки фич
|
||||||
|
full: 9999px — Пиллы, теги, круглые аватары
|
||||||
|
```
|
||||||
|
|
||||||
|
### Сетка
|
||||||
|
|
||||||
|
- Mobile-first. Одна колонка по умолчанию.
|
||||||
|
- Максимальная ширина контента: 640px для лент (читаемость).
|
||||||
|
- Десктоп: центрированная колонка контента с контекстными сайдбарами.
|
||||||
|
- Никакого бесконечного горизонтального скролла. Вертикальный — нативный.
|
||||||
|
|
||||||
|
## Компоненты
|
||||||
|
|
||||||
|
### Кнопки
|
||||||
|
|
||||||
|
```text
|
||||||
|
Primary: Morpheus Violet фон, белый текст, радиус 6px, medium вес
|
||||||
|
Hover: слегка светлее. Active: слегка темнее.
|
||||||
|
Secondary: Прозрачный фон, фиолетовый текст, граница 1px фиолетовая
|
||||||
|
Hover: заливка violet/10
|
||||||
|
Ghost: Прозрачный фон, mist текст, без границы
|
||||||
|
Hover: заливка slate
|
||||||
|
Destructive: Signal Red фон, белый текст (требуется подтверждение)
|
||||||
|
|
||||||
|
Размер: По умолчанию 40px высота, компактный 32px, большой 48px
|
||||||
|
Минимальная зона касания: всегда 44x44px
|
||||||
|
```
|
||||||
|
|
||||||
|
### Карточки
|
||||||
|
|
||||||
|
```text
|
||||||
|
Тёмная тема: Charcoal фон, граница 1px Slate, радиус md
|
||||||
|
Светлая тема: Pure фон, граница 1px Cloud, радиус md
|
||||||
|
Возвышение: Тень только при hover (никогда в покое)
|
||||||
|
Отступ: lg (16px)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Поля ввода
|
||||||
|
|
||||||
|
```text
|
||||||
|
Высота: 44px (удобно для касания)
|
||||||
|
Граница: 1px Slate, фокус → 2px Morpheus Violet
|
||||||
|
Фон: Void (тёмная) / Snow (светлая)
|
||||||
|
Placeholder: цвет Mist
|
||||||
|
Ошибка: граница Signal Red + текст подсказки ниже
|
||||||
|
```
|
||||||
|
|
||||||
|
### Аватары
|
||||||
|
|
||||||
|
```text
|
||||||
|
Размеры: 24px (inline), 32px (список), 40px (по умолчанию), 64px (профиль), 96px (hero)
|
||||||
|
Форма: Скруглённый квадрат (радиус xl) — отличает от других платформ
|
||||||
|
Фолбэк: Генерируемый градиент из хеша публичного ключа (каждый пользователь уникален)
|
||||||
|
Точка онлайн: Pulse Green, справа внизу, 25% от размера аватара
|
||||||
|
```
|
||||||
|
|
||||||
|
### Навигация
|
||||||
|
|
||||||
|
```text
|
||||||
|
Мобильная: Нижняя панель вкладок, максимум 5 элементов. Хаптик при касании.
|
||||||
|
Активная вкладка: иконка Morpheus Violet + лейбл
|
||||||
|
Неактивная: иконка Mist, без лейбла
|
||||||
|
Десктоп: Левый сайдбар, сворачиваемый. Иконки + лейблы.
|
||||||
|
Переходы: Горизонтальный слайд между вкладками, вертикальный внутри лент
|
||||||
|
```
|
||||||
|
|
||||||
|
## Анимация и движение
|
||||||
|
|
||||||
|
### Принципы
|
||||||
|
|
||||||
|
- **Целенаправленная**: каждая анимация что-то сообщает (смена состояния, пространственная связь)
|
||||||
|
- **Быстрая**: стандартная длительность 150-200мс. Никогда не превышать 300мс для переходов UI.
|
||||||
|
- **Прерываемая**: ввод пользователя немедленно отменяет любую текущую анимацию
|
||||||
|
- **Никакой декоративной анимации**: без плавающих частиц, пульсирующих логотипов, фоновых эффектов
|
||||||
|
|
||||||
|
### Стандартные кривые
|
||||||
|
|
||||||
|
```text
|
||||||
|
ease-out: cubic-bezier(0.0, 0.0, 0.2, 1) — Элементы входят
|
||||||
|
ease-in: cubic-bezier(0.4, 0.0, 1, 1) — Элементы выходят
|
||||||
|
ease-in-out: cubic-bezier(0.4, 0.0, 0.2, 1) — Элементы трансформируются
|
||||||
|
spring: spring(1, 80, 10) — Игривые взаимодействия (реакции, лайки)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ключевые анимации
|
||||||
|
|
||||||
|
```text
|
||||||
|
Переход страницы: Горизонтальный слайд, 200мс ease-out
|
||||||
|
Модал: Scale от 0.95 + fade, 150мс ease-out
|
||||||
|
Тост/снэкбар: Слайд снизу вверх, 200мс ease-out, автоисчезновение 3с
|
||||||
|
Pull to refresh: Нативное ощущение, кастомный индикатор с символом Morpheus
|
||||||
|
Отправка сообщения: Слайд вверх + лёгкий scale, spring easing
|
||||||
|
Реакция: Pop + взрыв частиц, spring easing (один из немногих «весёлых» моментов)
|
||||||
|
Скелетон загрузки: Шиммер-градиент, цикл 1.5с (только при реальной загрузке)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Иконографика
|
||||||
|
|
||||||
|
### Стиль
|
||||||
|
|
||||||
|
- Outlined стиль (не filled) для навигации и UI — обводка 1.5px
|
||||||
|
- Filled стиль для активных/выбранных состояний
|
||||||
|
- Базовый размер 24x24, оптически скорректирован для каждой иконки
|
||||||
|
- Единообразные метафоры: не смешивать material/feather/custom в одном виде
|
||||||
|
|
||||||
|
### Нужны кастомные иконки
|
||||||
|
|
||||||
|
- Индикатор статуса реле
|
||||||
|
- Иконка ключа/идентичности (не буквальный ключ — слишком крипто-бро)
|
||||||
|
- Индикатор шифрования (тонкий, не замок — нормализация, не тревога)
|
||||||
|
- Morpheus-специфичные действия (напр. «zap» для чаевых при использовании Lightning)
|
||||||
|
|
||||||
|
## Тон голоса (UI-тексты)
|
||||||
|
|
||||||
|
### Принципы тона
|
||||||
|
|
||||||
|
- **Разговорный, но не детский** — «Привет», не «Приветствуем вас, уважаемый пользователь»
|
||||||
|
- **Прямой** — «Отправить», не «Подтвердить отправку сообщения»
|
||||||
|
- **Уверенный** — «Ваши сообщения зашифрованы», не «Мы стараемся защитить...»
|
||||||
|
- **Двуязычный** — UI должен работать на русском и английском с первого дня
|
||||||
|
- **Без корпоративного языка** — «Что-то пошло не так», не «Произошла непредвиденная ошибка»
|
||||||
|
|
||||||
|
### Примеры
|
||||||
|
|
||||||
|
```text
|
||||||
|
Пустое состояние: «Тут пока никого. Будь первым.» (не «Контент отсутствует»)
|
||||||
|
Ошибка: «Не удалось подключиться. Нажми, чтобы повторить.» (не «Ошибка сети 503»)
|
||||||
|
Онбординг: «Этот ключ — это ты. Сохрани его в надёжном месте.» (не «Создайте резервную копию ключевой пары»)
|
||||||
|
Деструктивное: «Удалить навсегда?» (не «Вы уверены, что хотите удалить?»)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Доступность
|
||||||
|
|
||||||
|
- Минимальный коэффициент контрастности: 4.5:1 для текста body, 3:1 для крупного текста
|
||||||
|
- Все интерактивные элементы: минимальная зона касания 44x44px
|
||||||
|
- Метки screen reader для всех иконок и нетекстовых элементов
|
||||||
|
- Поддержка Reduce Motion: отключение всей необязательной анимации
|
||||||
|
- Масштабирование шрифта: поддержка системных настроек размера шрифта (до 200%)
|
||||||
|
- Информация не передаётся только цветом (всегда дублировать иконкой или текстом)
|
||||||
|
|
||||||
|
## Целевые платформы
|
||||||
|
|
||||||
|
### Приоритет
|
||||||
|
|
||||||
|
1. **Мобильные (iOS + Android)** — React Native или Flutter, нативное ощущение обязательно
|
||||||
|
2. **Веб (PWA)** — Полный паритет функций, устанавливаемый
|
||||||
|
3. **Десктоп** — Electron или Tauri обёртка веба, или нативный при наличии ресурсов
|
||||||
|
|
||||||
|
### Адаптация к платформам
|
||||||
|
|
||||||
|
- Следовать соглашениям платформы для паттернов навигации (iOS свайп назад, Android кнопка назад)
|
||||||
|
- Нативные share sheets, уведомления, хаптик
|
||||||
|
- Уважать системную тёмную/светлую тему по умолчанию, разрешить ручное переключение
|
||||||
|
- Адаптивные лейауты: телефон → планшет → десктоп, не просто масштабированные
|
||||||
104
docs/ru/monetization.md
Normal file
104
docs/ru/monetization.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Morpheus — Стратегия монетизации
|
||||||
|
|
||||||
|
## Ограничения
|
||||||
|
|
||||||
|
Бизнес-модель должна удовлетворять всем следующим условиям:
|
||||||
|
|
||||||
|
1. **Никакой рекламы** — никогда. Ни поведенческой, ни контекстной, ни «уважающей приватность». Ноль рекламы.
|
||||||
|
2. **Никакой продажи данных** — никогда
|
||||||
|
3. **Доступно для молодёжи** — у большинства пользователей нет банковских карт
|
||||||
|
4. **Устойчиво** — должно покрывать инфраструктуру (хостинг реле, CDN, разработка)
|
||||||
|
5. **Согласовано с приватностью** — доход и интересы пользователей никогда не должны конфликтовать
|
||||||
|
6. **Законопослушно** — обработка платежей и бизнес-операции соответствуют применимому праву
|
||||||
|
|
||||||
|
## Потоки дохода
|
||||||
|
|
||||||
|
### Уровень 1: Основной доход (с первого дня)
|
||||||
|
|
||||||
|
#### 1.1 Morpheus Pro (Подписка)
|
||||||
|
|
||||||
|
Ежемесячная подписка, открывающая премиум-функции:
|
||||||
|
|
||||||
|
- Кастомные темы и продвинутая стилизация профиля
|
||||||
|
- Увеличенные лимиты загрузки медиа (длина видео, качество изображений)
|
||||||
|
- Приоритетный доступ к реле (быстрая доставка сообщений)
|
||||||
|
- Эксклюзивные стикерпаки и реакции
|
||||||
|
- Бейджи профиля и визуальные украшения
|
||||||
|
- Ранний доступ к новым функциям
|
||||||
|
|
||||||
|
**Стратегия ценообразования:**
|
||||||
|
|
||||||
|
- Доступные цены (~149-299 руб/мес)
|
||||||
|
- Оплата российскими методами: СБП, карты Мир, оплата с баланса мобильного
|
||||||
|
- Оплата с мобильного критически важна — молодёжь может платить с баланса телефона
|
||||||
|
- Подарочные коды, покупаемые в рознице (как карты для игр)
|
||||||
|
- «Подарить Pro другу» как социальная механика
|
||||||
|
|
||||||
|
**Почему работает:** Молодёжь уже платит за Discord Nitro, Telegram Premium, игровые пропуски.
|
||||||
|
Статусные символы и кастомизация — проверенная монетизация для этой аудитории.
|
||||||
|
|
||||||
|
#### 1.2 Маркетплейс стикеров и тем
|
||||||
|
|
||||||
|
- Создатели дизайнят и продают стикерпаки, темы и декорации профилей
|
||||||
|
- Morpheus берёт комиссию 15-20%
|
||||||
|
- Создатели зарабатывают реальные деньги, что стимулирует качественный контент
|
||||||
|
- Бесплатные базовые паки гарантируют, что неплатящие пользователи не исключены
|
||||||
|
|
||||||
|
### Уровень 2: Доход роста (месяцы 3-6)
|
||||||
|
|
||||||
|
#### 2.1 Инструменты для создателей (платные)
|
||||||
|
|
||||||
|
Для пользователей с аудиторией (блогеры, музыканты, художники):
|
||||||
|
|
||||||
|
- Дашборд аналитики (агрегированная, неидентифицирующая)
|
||||||
|
- Платные подписки на каналы создателей (Morpheus берёт 10-15%)
|
||||||
|
- Чаевые через интегрированную оплату (Lightning Network или традиционная)
|
||||||
|
- Закрытый контент для подписчиков
|
||||||
|
|
||||||
|
#### 2.2 Бизнес-профили
|
||||||
|
|
||||||
|
- Верифицированные бизнес-аккаунты с расширенными возможностями
|
||||||
|
- Инструменты коммуникации с клиентами
|
||||||
|
- Никакого рекламного таргетинга — бизнесы постят для своих подписчиков органически
|
||||||
|
- Фиксированная месячная плата, никаких плат за показы
|
||||||
|
|
||||||
|
### Уровень 3: Доход экосистемы (месяцы 6-12)
|
||||||
|
|
||||||
|
#### 3.1 Хостинг реле Morpheus
|
||||||
|
|
||||||
|
- Управляемая инфраструктура реле для сообществ и организаций
|
||||||
|
- «Ваше сообщество, ваш реле, наша инфраструктура»
|
||||||
|
- Тарификация по хранилищу и пропускной способности
|
||||||
|
|
||||||
|
#### 3.2 Доступ к API
|
||||||
|
|
||||||
|
- Бесплатный уровень с ограничениями для разработчиков-любителей
|
||||||
|
- Платные уровни для ботов, интеграций и сторонних приложений
|
||||||
|
- Развивает экосистему, не субсидируя её бесконечно
|
||||||
|
|
||||||
|
## Антипаттерны (чего мы НЕ будем делать)
|
||||||
|
|
||||||
|
| Антипаттерн | Почему нет |
|
||||||
|
| --- | --- |
|
||||||
|
| Любая форма рекламы | Основной принцип — никакой рекламы, никогда |
|
||||||
|
| Лицензирование / продажа данных | Нарушает обещание приватности |
|
||||||
|
| Freemium с изуродованным бесплатным уровнем | Отталкивает основную аудиторию |
|
||||||
|
| Токены / криптовалютные спекуляции | Отвлекает от продукта, привлекает не тех |
|
||||||
|
| Рост любой ценой на венчурные деньги | Неверные стимулы, ведёт к деградации продукта |
|
||||||
|
| Платные базовые сообщения | Общение — право, а не премиум-функция |
|
||||||
|
|
||||||
|
## Модель финансовой устойчивости
|
||||||
|
|
||||||
|
**Фаза 1 (0-6 месяцев):** Начальное финансирование или гранты.
|
||||||
|
Компактная команда. Запуск реле по себестоимости.
|
||||||
|
|
||||||
|
**Фаза 2 (6-18 месяцев):** Pro-подписки + комиссии маркетплейса покрывают серверные расходы.
|
||||||
|
Цель: конверсия 3-5% в Pro среди активных пользователей.
|
||||||
|
|
||||||
|
**Фаза 3 (18+ месяцев):** Экономика создателей + бизнес-профили генерируют маржу.
|
||||||
|
Хостинг реле становится центром прибыли. Устойчивость без внешнего финансирования.
|
||||||
|
|
||||||
|
## Ключевая метрика
|
||||||
|
|
||||||
|
**Доход с пользователя никогда не должен требовать знания, кто этот пользователь.**
|
||||||
|
Вся монетизация добровольная, явная и не зависящая от личности.
|
||||||
131
docs/ru/philosophy.md
Normal file
131
docs/ru/philosophy.md
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
# Morpheus — Философия
|
||||||
|
|
||||||
|
> «Все знают твоё имя. Никто не читает твои сообщения.»
|
||||||
|
|
||||||
|
## Главное различие
|
||||||
|
|
||||||
|
**Morpheus — приватный, не анонимный.**
|
||||||
|
|
||||||
|
У тебя есть реальная личность в Morpheus — профиль, репутация, подписчики, история.
|
||||||
|
Люди тебя знают. В этом суть социальной сети.
|
||||||
|
|
||||||
|
Но твои личные сообщения зашифрованы сквозным шифрованием NIP-44. Не потому что мы
|
||||||
|
решили их не читать — а потому что мы архитектурно *не можем*. Шифрование происходит
|
||||||
|
на твоём устройстве, между тобой и получателем. У нас никогда нет ключей.
|
||||||
|
|
||||||
|
Это не политическое заявление. Это инженерное решение.
|
||||||
|
|
||||||
|
| Что мы МОЖЕМ предоставить по закону | Чего мы НЕ МОЖЕМ предоставить, никогда |
|
||||||
|
| --- | --- |
|
||||||
|
| Публичные посты (они публичные по замыслу) | Содержание зашифрованных ЛС |
|
||||||
|
| Метаданные аккаунта (дата создания, публичный ключ) | Приватные ключи шифрования |
|
||||||
|
| Логи подключений к реле (IP, время) | Расшифрованные сообщения |
|
||||||
|
| Публичный социальный граф (кто на кого подписан) | Сообщения, не хранившиеся на наших реле |
|
||||||
|
|
||||||
|
Мы соблюдаем закон. Мы также строим системы, в которых самые чувствительные данные
|
||||||
|
просто не существуют в доступной нам форме. Эти два утверждения не противоречат друг другу.
|
||||||
|
|
||||||
|
## Зачем Morpheus существует
|
||||||
|
|
||||||
|
Социальные сети в России под давлением. Сервисы блокируют, API ограничивают,
|
||||||
|
контент модерируют по внешнему указанию. Молодые люди заслуживают социальное пространство, которое:
|
||||||
|
|
||||||
|
1. **Быстрое** — потому что они привыкли к лучшим приложениям в мире
|
||||||
|
2. **Красивое** — потому что эстетика важна для этого поколения
|
||||||
|
3. **Честное насчёт приватности** — не «доверьтесь нам», а «проверьте: вот код»
|
||||||
|
4. **Устойчивое** — если что-то изменится политически, твои сообщения по-прежнему твои
|
||||||
|
|
||||||
|
## Принципы дизайна
|
||||||
|
|
||||||
|
### 1. Скорость — это уважение
|
||||||
|
|
||||||
|
Каждая миллисекунда загрузки говорит «мы не ценим твоё время».
|
||||||
|
Morpheus должен ощущаться мгновенным — быстрее Telegram, плавнее Instagram.
|
||||||
|
60fps или ничего. Если пользователь замечает задержку — это баг.
|
||||||
|
|
||||||
|
### 2. Приватность через архитектуру, а не через политику
|
||||||
|
|
||||||
|
Не говори «мы не будем читать ваши сообщения». Говори «мы не можем».
|
||||||
|
Шифрование NIP-44 означает, что содержимое ЛС — шифротекст на наших реле.
|
||||||
|
Мы не даём обещание приватности — мы даём математическую гарантию.
|
||||||
|
Публичные посты — публичные. Личные сообщения — личные. Никакой двусмысленности.
|
||||||
|
|
||||||
|
### 3. Не анонимный, не под наблюдением — просто приватный
|
||||||
|
|
||||||
|
У пользователей есть личности. Они строят репутацию. Они отвечают за публичное поведение.
|
||||||
|
Но их личные разговоры — их. Это то же ожидание, что люди имеют
|
||||||
|
от почтовых писем, телефонных звонков и личных бесед.
|
||||||
|
Morpheus просто распространяет это ожидание на цифровое общение.
|
||||||
|
|
||||||
|
### 4. Простота — это сила
|
||||||
|
|
||||||
|
Каждая функция должна оправдать своё существование. Если подросток не может
|
||||||
|
разобраться за 3 секунды — слишком сложно. Никаких страниц настроек. Никаких переключателей.
|
||||||
|
Приложение должно ощущаться как читающее мысли, а не как требующее инструкцию.
|
||||||
|
|
||||||
|
### 5. Мы бизнес, а не движение
|
||||||
|
|
||||||
|
Morpheus — это компания, которая делает продукт. Мы берём деньги за премиум-функции.
|
||||||
|
Мы не финансируемся рекламой, не продажей данных, не идеологией.
|
||||||
|
Наш стимул прост: сделать продукт настолько хорошим, чтобы за него платили.
|
||||||
|
Когда стимулы понятны — доверие следует.
|
||||||
|
|
||||||
|
### 6. Законопослушный и принципиальный
|
||||||
|
|
||||||
|
Мы работаем в рамках закона. Регистрируемся где требуется. Отвечаем на законные запросы.
|
||||||
|
И строим системы, где зашифрованный контент не может быть расшифрован нами.
|
||||||
|
Это не противоречия — это ответственная инженерия.
|
||||||
|
Мы никогда не установим бэкдоры, депонирование ключей или призрачные протоколы.
|
||||||
|
Если мы технически не можем выполнить конкретный запрос, мы об этом прозрачно сообщаем.
|
||||||
|
|
||||||
|
### 7. Открытый по умолчанию
|
||||||
|
|
||||||
|
Клиент с открытым исходным кодом. Протокол (Nostr) открытый.
|
||||||
|
Пользователи могут проверить каждое заявление о приватности, прочитав код.
|
||||||
|
Если не доверяете нам — не верьте на слово — проведите аудит.
|
||||||
|
|
||||||
|
## Что такое Morpheus
|
||||||
|
|
||||||
|
- Быстрая, красивая социальная сеть для молодых русскоязычных людей
|
||||||
|
- Построена на протоколе Nostr для настоящего шифрования и переносимости
|
||||||
|
- Бизнес, который зарабатывает на премиум-функциях, а не на данных пользователей
|
||||||
|
- Соблюдает применимое законодательство, защищая то, что защищает шифрование
|
||||||
|
- Приложение, о котором друг рассказывает потому что оно хорошее, а не потому что политическое
|
||||||
|
|
||||||
|
## Чем Morpheus НЕ является
|
||||||
|
|
||||||
|
- **Не анонимный** — у тебя реальная, постоянная личность
|
||||||
|
- **Не инструмент протеста** — это для мемов, групповых чатов, знакомств, музыки, друзей
|
||||||
|
- **Не крипто/Web3 проект** — Nostr использует ключи, но нет токенов и блокчейна
|
||||||
|
- **Не антиправительственный** — мы соблюдаем закон; мы также используем надёжное шифрование
|
||||||
|
- **Не даркнет-приложение** — эстетика яркая, современная и мейнстримная
|
||||||
|
|
||||||
|
## Спектр приватности
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Полная слежка Позиция Morpheus Полная анонимность
|
||||||
|
|__________________________|___________________________|
|
||||||
|
VK, OK «Приватный, не анонимный» Tor, I2P
|
||||||
|
- Реальные личности
|
||||||
|
- E2E-шифрованные ЛС
|
||||||
|
- Публичные посты публичны
|
||||||
|
- Законопослушная работа
|
||||||
|
- Без бэкдоров
|
||||||
|
```
|
||||||
|
|
||||||
|
Morpheus занимает практичную золотую середину: та же приватность, которую ты ожидаешь
|
||||||
|
в реальной жизни, применённая к цифровому общению. Не более экстремально. Не менее.
|
||||||
|
|
||||||
|
## Обещание Morpheus
|
||||||
|
|
||||||
|
Мы будем:
|
||||||
|
|
||||||
|
- Шифровать все ЛС с NIP-44 — всегда, по умолчанию, без необходимости включения
|
||||||
|
- Публиковать наш исходный код
|
||||||
|
- Отвечать на законные запросы данными, которыми мы реально располагаем
|
||||||
|
- Быть прозрачными о том, какие данные существуют, а какие нет
|
||||||
|
- Никогда не добавлять бэкдоры и не ослаблять шифрование
|
||||||
|
- Никогда не продавать данные пользователей и не запускать рекламу
|
||||||
|
- Строить устойчивый бизнес на премиум-функциях
|
||||||
|
|
||||||
|
Мы будем честны, когда не можем что-то сделать, а не притворяться, что можем.
|
||||||
242
docs/ru/threat-model-and-workarounds.md
Normal file
242
docs/ru/threat-model-and-workarounds.md
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
# Morpheus — Модель угроз и решения
|
||||||
|
|
||||||
|
## Юридическая позиция
|
||||||
|
|
||||||
|
Morpheus — **законопослушная, принципиальная** компания:
|
||||||
|
|
||||||
|
- Мы регистрируемся где требуется и работаем в рамках применимого права
|
||||||
|
- Мы отвечаем на законные запросы данными, которыми реально располагаем
|
||||||
|
- Мы используем сквозное шифрование NIP-44 для ЛС — содержимое ЛС не является данными, которые мы имеем в читаемой форме
|
||||||
|
- Мы никогда не добавим бэкдоры, депонирование ключей и не ослабим шифрование
|
||||||
|
- Мы прозрачны: если нас просят о данных, которые мы не можем предоставить, мы объясняем почему
|
||||||
|
|
||||||
|
Это модель Apple/WhatsApp, применённая к социальным сетям:
|
||||||
|
полное сотрудничество, но архитектура делает определённые запросы технически невозможными.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Основное различие: Приватный ≠ Анонимный
|
||||||
|
|
||||||
|
Morpheus — **приватный**, не **анонимный**.
|
||||||
|
|
||||||
|
| | Анонимный | Приватный (Morpheus) |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Идентичность | Скрытая, одноразовая | Реальная, постоянная, с репутацией |
|
||||||
|
| Публичный контент | Нельзя отследить автора | Автор известен — в этом суть |
|
||||||
|
| ЛС | Никто не может их прочитать | Никто не может их прочитать (NIP-44) |
|
||||||
|
| Метаданные | Скрытые (уровень Tor) | Доступны операторам реле |
|
||||||
|
| Юридическая позиция | Уклонение от идентификации | Законопослушность; шифрование защищает контент |
|
||||||
|
| Атмосфера | Даркнет, паранойя | Нормальная социальная жизнь с реальной защитой |
|
||||||
|
|
||||||
|
**Позиция Morpheus:** «Все знают твоё имя. Никто не читает твои сообщения.»
|
||||||
|
|
||||||
|
NIP-44 шифрует *содержание* личных сообщений. Метаданные (кто с кем общался, когда)
|
||||||
|
видны операторам реле. Это честная и защитимая позиция:
|
||||||
|
мы защищаем разговор, а не факт его существования.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 1: Несоответствие аудитории и ценностного предложения
|
||||||
|
|
||||||
|
**Проблема:** Молодёжь не покупает «приватность». Они покупают скорость, эстетику и статус.
|
||||||
|
|
||||||
|
**Решения:**
|
||||||
|
|
||||||
|
1. **Вести продуктом, а не протоколом.** Маркетинг никогда не упоминает Nostr, реле или шифрование напрямую. Он говорит: «самое быстрое социальное приложение» или «групповые чаты, которые реально работают».
|
||||||
|
|
||||||
|
2. **Приватность как текстура, а не фича.** Вместо страницы «настройки приватности» приватность проявляется как:
|
||||||
|
- Тонкая иконка замка на ЛС (всегда там, нельзя отключить — просто работает)
|
||||||
|
- «Сообщения зашифрованы» показано один раз при онбординге, потом никогда
|
||||||
|
- Нет «был в сети» или «прочитано» по умолчанию (приватность = социальный комфорт)
|
||||||
|
|
||||||
|
3. **Скорость — ЭТО фича.** Молодёжь сравнивает приложения по ощущению скорости. Инвестировать непропорционально в воспринимаемую производительность: оптимистичный UI, мгновенная отправка, предзагрузка лент, агрессивное кеширование.
|
||||||
|
|
||||||
|
4. **Социальное доказательство важнее фич.** Получить 5 популярных создателей на платформу до публичного запуска. Молодёжь идёт за людьми, а не за протоколами.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 2: Технические ограничения Nostr
|
||||||
|
|
||||||
|
**Проблема:** Nostr не имеет нативной поддержки функций, которые ожидает молодёжь.
|
||||||
|
|
||||||
|
### 2a. Групповые чаты
|
||||||
|
|
||||||
|
**Текущее состояние:** NIP-29 (группы на базе реле) базовый. Нет богатых функций.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
|
||||||
|
- Строить на NIP-29 для публичных групп (модерируемые реле, обнаруживаемые)
|
||||||
|
- Для приватных групп: NIP-44 шифрование с общим групповым ключом, ротация при смене участников
|
||||||
|
- Реализовать функции групп на уровне клиента: ответы, реакции, закрепы, упоминания, треды
|
||||||
|
- Это кастомная работа, но даёт конкурентное преимущество — «лучшие групповые чаты на Nostr»
|
||||||
|
|
||||||
|
### 2b. Хостинг медиа
|
||||||
|
|
||||||
|
**Текущее состояние:** Nostr-события текстовые. Медиа требует внешний хостинг.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
|
||||||
|
- Запуск управляемых серверов Blossom (BLOb Simple Storage) для загрузки медиа
|
||||||
|
- NIP-96 хранение файлов как стандарт — пользователи загружают через приложение, раздача через CDN
|
||||||
|
- Агрессивная клиентская компрессия (WebP/AVIF для изображений, H.265 для видео)
|
||||||
|
- Прогрессивная загрузка: превью → среднее → полное разрешение
|
||||||
|
- Квота хранения привязана к уровню аккаунта (бесплатный = разумный, Pro = щедрый)
|
||||||
|
- Контентно-адресуемое хранение (дедупликация по хешу) экономит расходы
|
||||||
|
|
||||||
|
### 2c. Поиск и обнаружение
|
||||||
|
|
||||||
|
**Текущее состояние:** Нет глобального поиска. Поиск по реле — специфичен для реле.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
|
||||||
|
- Клиентский полнотекстовый индекс контента подписок (SQLite/Realm на устройстве)
|
||||||
|
- «Обзор» на базе курируемой агрегации реле — Morpheus запускает индексирующий реле
|
||||||
|
- Трендовые темы вычисляются по объёму публичных событий через реле сообщества Morpheus
|
||||||
|
- Обнаружение по хештегам (NIP-12 запросы по общим тегам)
|
||||||
|
- «Люди, которых вы можете знать» на основе пересечения социальных графов (вычисляется на клиенте)
|
||||||
|
- Курируемые людьми рекомендуемые аккаунты и сообщества (редакционно, не алгоритмически)
|
||||||
|
|
||||||
|
### 2d. Управление ключами / Восстановление личности
|
||||||
|
|
||||||
|
**Текущее состояние:** Потерял nsec = потерял всё. Неприемлемо для молодёжи.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
|
||||||
|
- **Социальное восстановление ключа (основное):** Разделение секрета Шамира — ключ восстановления делится между N доверенными контактами, требуется K из N для восстановления. «Выбери 5 друзей. Любые 3 могут помочь восстановить аккаунт.»
|
||||||
|
- **Зашифрованный облачный бэкап (опционально):** Зашифровать nsec паролем пользователя, хранить зашифрованный блоб в iCloud/Google Drive.
|
||||||
|
- **Ключи привязанные к устройству:** Хранение nsec в Secure Enclave / Android Keystore. Биометрическая разблокировка.
|
||||||
|
- **NIP-46 (Nostr Connect):** Паттерн удалённого подписанта — для продвинутых пользователей.
|
||||||
|
- **Прогрессивное раскрытие:** Новые пользователи получают ключ на устройстве + предложение облачного бэкапа. Продвинутые пользователи могут экспортировать nsec.
|
||||||
|
|
||||||
|
### 2e. Истории / Эфемерный контент
|
||||||
|
|
||||||
|
**Текущее состояние:** Нет нативного примитива Nostr для исчезающего контента.
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
|
||||||
|
- NIP-40 (таймстамп истечения) на событиях — реле удаляют после TTL
|
||||||
|
- Клиент обеспечивает отображение истечения (даже если rogue-реле хранит событие)
|
||||||
|
- Истории как карусель событий kind:20 или kind:1063 с истечением через 24ч
|
||||||
|
- Не «исчезающие» в смысле Signal — но соответствует UX историй Instagram/Telegram
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 3: Блокировка государством
|
||||||
|
|
||||||
|
**Проблема:** Роскомнадзор может заблокировать домены и IP реле.
|
||||||
|
|
||||||
|
**Контекст:** Morpheus работает законопослушно, но блокировка может произойти несмотря на это (как с Telegram в 2018-2020). Цель — не уклонение от правоохранительных органов, а обеспечение доступности сервиса.
|
||||||
|
|
||||||
|
**Решения:**
|
||||||
|
|
||||||
|
### Слой 1: Стандартная устойчивость
|
||||||
|
|
||||||
|
- WebSocket через TLS (wss://) выглядит как обычный HTTPS-трафик для DPI
|
||||||
|
- Реле за Cloudflare или аналогичным CDN — блокировка CDN блокирует миллионы сайтов
|
||||||
|
- Несколько доменов реле в разных TLD — избыточность, не уклонение
|
||||||
|
- Приложение автоматически переключается на рабочие реле
|
||||||
|
|
||||||
|
### Слой 2: Устойчивость распространения
|
||||||
|
|
||||||
|
- Android: Google Play, RuStore, прямая загрузка APK, F-Droid
|
||||||
|
- iOS: App Store, PWA как запасной вариант при удалении из магазина
|
||||||
|
- Веб-приложение всегда доступно как базовая линия
|
||||||
|
- Ссылки на APK/PWA через существующие каналы (Telegram-боты, QR-коды)
|
||||||
|
|
||||||
|
### Слой 3: Проактивное взаимодействие
|
||||||
|
|
||||||
|
- Проактивно взаимодействовать с регуляторами — объяснять, какие данные у нас есть, и предоставлять их
|
||||||
|
- Демонстрировать готовность к сотрудничеству для снижения мотивации к блокировке
|
||||||
|
- Поддерживать диалог — блокировка часто переговоры, а не бинарное решение
|
||||||
|
|
||||||
|
**Примечание:** Если Morpheus заблокируют несмотря на сотрудничество, протокол Nostr гарантирует
|
||||||
|
доступ к данным через любой другой Nostr-клиент. Это ультимативная устойчивость.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 4: Юридическое соответствие (Закон Яровой / СОРМ)
|
||||||
|
|
||||||
|
**Проблема:** Российское законодательство требует хранения и предоставления доступа к коммуникациям.
|
||||||
|
|
||||||
|
**Подход: Полное сотрудничество, честное объяснение архитектуры.**
|
||||||
|
|
||||||
|
1. **Регистрация по требованию.** Юрлицо (юрисдикция TBD по совету юристов). Регистрация как организатор распространения информации при необходимости.
|
||||||
|
|
||||||
|
2. **Хранить то, что можем.** Публичные посты, метаданные, логи подключений — они существуют на наших реле и мы можем их предоставить.
|
||||||
|
|
||||||
|
3. **Объяснять то, что не можем хранить.** Содержимое ЛС зашифровано на стороне клиента NIP-44. У нас никогда нет ключей дешифрования. Это не уклонение — это задокументированная, проверяемая архитектура.
|
||||||
|
|
||||||
|
4. **Открытый исходный код подтверждает наши заявления.** Любой технический аудит кодовой базы подтвердит, что сервер никогда не имеет доступа к открытому тексту ЛС.
|
||||||
|
|
||||||
|
5. **Юридический прецедент.** WhatsApp, Signal и iMessage работают с E2E-шифрованием во многих юрисдикциях.
|
||||||
|
|
||||||
|
6. **Сбор данных регистрации не более необходимого.** Если для юридического соответствия требуется телефон/email, мы собираем. Но не больше.
|
||||||
|
|
||||||
|
**Ключевой принцип:** Мы никогда не отказываемся сотрудничать. Мы объясняем техническую реальность. Зашифрованное зашифровано — не потому что мы выбираем не расшифровывать, а потому что не можем.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 5: Монетизация без рекламы
|
||||||
|
|
||||||
|
**Проблема:** Никакой рекламы, никогда. Нужен альтернативный доход.
|
||||||
|
|
||||||
|
**Подход:** См. [monetization.md](./monetization.md). Резюме:
|
||||||
|
|
||||||
|
- Подписка Morpheus Pro (премиум-функции, кастомизация, увеличенные лимиты)
|
||||||
|
- Маркетплейс стикеров/тем (экономика создателей с комиссией)
|
||||||
|
- Инструменты для создателей (платная аналитика, контент только для подписчиков)
|
||||||
|
- Бизнес-профили (фиксированная месячная плата, только органический охват)
|
||||||
|
- Управляемый хостинг реле (инфраструктура-как-сервис для сообществ)
|
||||||
|
|
||||||
|
Все потоки дохода добровольные и не требуют профилирования пользователей.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 6: Модерация контента
|
||||||
|
|
||||||
|
**Проблема:** Молодёжь на платформе требует ответственной модерации без подрыва приватности.
|
||||||
|
|
||||||
|
**Подход:**
|
||||||
|
|
||||||
|
1. **Публичный контент модерируем.** Публичные посты... публичные. Мы можем и будем модерировать публичный контент на реле, которые мы оперируем. Стандартные правила сообщества.
|
||||||
|
|
||||||
|
2. **Зашифрованные ЛС не модерируемы нами — и это нормально.** Как почтовая служба не читает ваши письма. Клиентские функции безопасности (блок, жалоба, мут) дают пользователям контроль.
|
||||||
|
|
||||||
|
3. **Многоуровневая модерация публичного контента:**
|
||||||
|
- **Уровень реле:** Реле Morpheus применяют опубликованные правила сообщества.
|
||||||
|
- **Уровень сообщества:** Модераторы групп управляют своими пространствами. NIP-56 жалобы поступают к модераторам.
|
||||||
|
- **Уровень клиента:** Спам-фильтры, предупреждения о контенте, мут/блок инструменты.
|
||||||
|
|
||||||
|
4. **Соответствие CSAM:** Хеш-сопоставление (PhotoDNA или эквивалент) на медиа, загружаемые на серверы Morpheus. Обязательное юридическое и этическое обязательство. На серверной стороне медиа CDN.
|
||||||
|
|
||||||
|
5. **Отчёты прозрачности.** Ежеквартальные публикации: сколько модерационных действий, сколько юридических запросов, какие данные были предоставлены.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема 7: Холодный старт / Сетевые эффекты
|
||||||
|
|
||||||
|
**Проблема:** Социальная сеть без пользователей бесполезна.
|
||||||
|
|
||||||
|
**Решения:**
|
||||||
|
|
||||||
|
1. **Запуск как мессенджер, потом как соцсеть.** Групповым чатам не нужны сетевые эффекты — нужны 5-10 друзей. «Перенеси свою группу друзей в Morpheus» — выполнимое предложение.
|
||||||
|
|
||||||
|
2. **Мост в Telegram.** Бот для кросспостинга между группами Telegram и Morpheus. Снижает стоимость перехода.
|
||||||
|
|
||||||
|
3. **Таргетировать конкретные сообщества:**
|
||||||
|
- Студенческие группы университетов
|
||||||
|
- Игровые сообщества
|
||||||
|
- Музыка/арт сцены
|
||||||
|
- Технически продвинутые ранние пользователи
|
||||||
|
|
||||||
|
4. **Партнёрства с создателями.** Привлечь популярных русскоязычных создателей контента. Их аудитории последуют.
|
||||||
|
|
||||||
|
5. **Функция «Импорт группы».** Создать группу Morpheus из существующей группы Telegram/VK, авто-приглашение участников.
|
||||||
|
|
||||||
|
6. **Реферальные механики.** «Пригласи 3 друзей → разблокируй эксклюзивный стикерпак.»
|
||||||
|
|
||||||
|
7. **Запустить киллер-фичу, которой нет нигде:**
|
||||||
|
- Голосовые сообщения с автоматической транскрипцией (огромный спрос в русскоязычных сообществах)
|
||||||
|
- Встроенный редактор мемов
|
||||||
|
- Анонимные вопросы на профилях (как ASKfm — весело и вирально)
|
||||||
|
- Превосходные инструменты создания стикеров
|
||||||
85
docs/ru/web-of-trust.md
Normal file
85
docs/ru/web-of-trust.md
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
# Morpheus — Сеть доверия (Web of Trust)
|
||||||
|
|
||||||
|
## Основная идея
|
||||||
|
|
||||||
|
Реле Morpheus принимает события только от публичных ключей, на которые
|
||||||
|
подписаны как минимум **N** существующих участников реле. Используется
|
||||||
|
граф подписок, уже существующий в Nostr (NIP-02 списки контактов) —
|
||||||
|
никаких кастомных NIP, токенов-приглашений или специальных событий
|
||||||
|
поручительства.
|
||||||
|
|
||||||
|
## Как это работает
|
||||||
|
|
||||||
|
1. Пользователь A публикует список контактов NIP-02, включающий
|
||||||
|
публичный ключ пользователя B
|
||||||
|
2. Реле подсчитывает, сколько существующих участников подписаны на B
|
||||||
|
3. Если количество достигает порога (например, 3), реле начинает
|
||||||
|
принимать события от B
|
||||||
|
4. Если количество подписчиков B падает ниже порога (отписки), реле
|
||||||
|
перестаёт принимать новые события от него
|
||||||
|
|
||||||
|
```text
|
||||||
|
Реле получает событие от pubkey X
|
||||||
|
→ Подсчитать NIP-02 списки контактов на этом реле, включающие X
|
||||||
|
→ Если количество >= N: принять событие
|
||||||
|
→ Если количество < N: отклонить с auth-required или closed
|
||||||
|
```
|
||||||
|
|
||||||
|
## Почему это работает
|
||||||
|
|
||||||
|
- **Спам умирает естественно** — боты не могут набрать реальные подписки
|
||||||
|
от существующих участников и никогда не достигают порога
|
||||||
|
- **Нет затрат на модерацию** — граф подписок и есть слой модерации;
|
||||||
|
ни одному админу не нужно вручную одобрять или банить пользователей
|
||||||
|
- **Сообщество остаётся целостным** — начальное сообщество русскоязычное,
|
||||||
|
подписки распространяются через реальные социальные связи, поэтому
|
||||||
|
сеть остаётся культурно и лингвистически однородной без явных
|
||||||
|
языковых фильтров
|
||||||
|
- **Нерелевантный шум исчезает** — реле обслуживает только события от
|
||||||
|
множества участников, случайный глобальный трафик Nostr не попадает
|
||||||
|
в ленту
|
||||||
|
- **Нет кастомного протокола** — используются только NIP-01 (события)
|
||||||
|
и NIP-02 (списки контактов), которые поддерживает каждый клиент Nostr
|
||||||
|
- **Децентрализованное доверие** — нет единого привратника; доверие
|
||||||
|
распределено по графу подписок
|
||||||
|
|
||||||
|
## Настройка порога
|
||||||
|
|
||||||
|
| N | Эффект |
|
||||||
|
| --- | --- |
|
||||||
|
| 1 | Минимальный барьер — одна подписка от любого участника даёт доступ. Лёгкий рост, слабая защита от спама. |
|
||||||
|
| 3 | Баланс — требуется небольшой социальный кластер. Хорошо для фазы раннего роста. |
|
||||||
|
| 5+ | Тесное сообщество — труднее попасть, сильная защита от спама. Хорошо для зрелой сети. |
|
||||||
|
|
||||||
|
Порог может быть динамическим — ниже в период раннего роста, выше по
|
||||||
|
мере взросления сети. Также может различаться по типу событий
|
||||||
|
(например, публикация требует 3 подписок, а ЛС — только 1).
|
||||||
|
|
||||||
|
## Граничные случаи
|
||||||
|
|
||||||
|
- **Проблема курицы и яйца** — первые N пользователей добавляются
|
||||||
|
вручную (начальное множество). Это основатели сообщества.
|
||||||
|
- **Наблюдатели** — пользователи, которые читают, но не публикуют, тоже
|
||||||
|
нуждаются в подписках для взаимодействия. Доступ на чтение может быть
|
||||||
|
открытым.
|
||||||
|
- **Кросс-реле** — пользователи могут подключаться к публичным реле
|
||||||
|
параллельно с реле Morpheus. Барьер WoT применяется только к ленте
|
||||||
|
реле Morpheus.
|
||||||
|
- **Защита от сибилов** — создание фейковых аккаунтов для подписки на
|
||||||
|
себя возможно, но затратно в масштабе (каждому фейку самому нужно N
|
||||||
|
реальных подписчиков). Рекурсия делает сибил-атаки экспоненциально
|
||||||
|
сложнее.
|
||||||
|
- **Потеря подписчиков** — если кто-то отписывается и количество падает
|
||||||
|
ниже N, существующие события остаются на реле, но новые отклоняются
|
||||||
|
до восстановления числа подписчиков.
|
||||||
|
|
||||||
|
## Заметки по реализации
|
||||||
|
|
||||||
|
- Реле поддерживает материализованное представление графа подписок
|
||||||
|
(NIP-02, kind:3 события)
|
||||||
|
- При каждом входящем событии проверяется количество входящих подписок
|
||||||
|
автора относительно порога
|
||||||
|
- Подсчёт обновляется в реальном времени при публикации списков
|
||||||
|
контактов NIP-02
|
||||||
|
- Начальное множество (вручную разрешённые pubkey) настраивается при
|
||||||
|
запуске реле
|
||||||
243
docs/threat-model-and-workarounds.md
Normal file
243
docs/threat-model-and-workarounds.md
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
# Morpheus — Threat Model & Workarounds
|
||||||
|
|
||||||
|
## Legal Posture
|
||||||
|
|
||||||
|
Morpheus is a **compliant, principled** operation:
|
||||||
|
|
||||||
|
- We register where required and operate within applicable law
|
||||||
|
- We respond to lawful data requests with data we actually have
|
||||||
|
- We use NIP-44 end-to-end encryption for DMs — meaning DM content is not data we have in readable form
|
||||||
|
- We will never add backdoors, key escrow, or weaken encryption under any circumstances
|
||||||
|
- We are transparent: if asked for data we cannot provide, we explain why
|
||||||
|
|
||||||
|
This is the Apple/WhatsApp model applied to social networking:
|
||||||
|
cooperate fully, but the architecture makes certain requests technically impossible.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The Core Distinction: Private ≠ Anonymous
|
||||||
|
|
||||||
|
Morpheus is **private**, not **anonymous**.
|
||||||
|
|
||||||
|
| | Anonymous | Private (Morpheus) |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Identity | Hidden, disposable | Real, persistent, reputation-bearing |
|
||||||
|
| Public content | Untraceable to author | Author known — that's the point |
|
||||||
|
| DMs | Nobody can read them | Nobody can read them (NIP-44) |
|
||||||
|
| Metadata | Hidden (Tor-level) | Available to relay operators |
|
||||||
|
| Legal posture | Evades identification | Compliant; encryption protects content |
|
||||||
|
| Vibe | Dark web, paranoia | Normal social life with real protection |
|
||||||
|
|
||||||
|
**Morpheus position:** "Everyone knows your name. Nobody reads your messages."
|
||||||
|
|
||||||
|
NIP-44 encrypts the *content* of direct messages. Metadata (who talked to whom, when)
|
||||||
|
is visible to relay operators. This is an honest and defensible position:
|
||||||
|
we protect the conversation, not the fact that it happened.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 1: Target Audience vs. Value Proposition Mismatch
|
||||||
|
|
||||||
|
**Problem:** Teens don't buy "privacy." They buy speed, aesthetics, and social status.
|
||||||
|
|
||||||
|
**Workarounds:**
|
||||||
|
|
||||||
|
1. **Lead with product, not protocol.** Marketing never mentions Nostr, relays, or encryption upfront. It says: "the fastest social app" or "group chats that actually work."
|
||||||
|
|
||||||
|
2. **Privacy as texture, not feature.** Instead of a "privacy settings" page, privacy manifests as:
|
||||||
|
- A subtle lock icon on DMs (always there, never toggleable — it just works)
|
||||||
|
- "Messages are encrypted" shown once during onboarding, then never again
|
||||||
|
- No "last seen" or "read receipts" by default (privacy = social comfort for teens)
|
||||||
|
|
||||||
|
3. **Speed IS the feature.** Teens compare apps by how fast they feel. Invest disproportionately in perceived performance: optimistic UI, instant message sending, preloaded feeds, aggressive caching.
|
||||||
|
|
||||||
|
4. **Social proof matters more than features.** Get 5 popular creators on the platform before public launch. Teens follow people, not protocols.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 2: Nostr Technical Limitations
|
||||||
|
|
||||||
|
**Problem:** Nostr lacks native support for features teens expect.
|
||||||
|
|
||||||
|
### 2a. Group Chats
|
||||||
|
|
||||||
|
**Current state:** NIP-29 (relay-based groups) is basic. No rich features.
|
||||||
|
|
||||||
|
**Workaround:**
|
||||||
|
|
||||||
|
- Build on NIP-29 for public groups (relay-moderated, discoverable)
|
||||||
|
- For private groups: use NIP-44 encryption with a shared group key, rotated when members change
|
||||||
|
- Implement group features at the client level: replies, reactions, pins, mentions, threads
|
||||||
|
- This is custom work but gives competitive advantage — "best group chats on Nostr"
|
||||||
|
|
||||||
|
### 2b. Media Hosting
|
||||||
|
|
||||||
|
**Current state:** Nostr events are text. Media requires external hosting.
|
||||||
|
|
||||||
|
**Workaround:**
|
||||||
|
|
||||||
|
- Run managed Blossom (BLOb Simple Storage) servers for media uploads
|
||||||
|
- NIP-96 file storage as standard — users upload via the app, served via CDN
|
||||||
|
- Aggressive client-side compression (WebP/AVIF for images, H.265 for video)
|
||||||
|
- Progressive loading: thumbnail → medium → full resolution
|
||||||
|
- Storage quota tied to account tier (free = reasonable, Pro = generous)
|
||||||
|
- Content-addressed storage (deduplication by hash) saves costs
|
||||||
|
|
||||||
|
### 2c. Search & Discovery
|
||||||
|
|
||||||
|
**Current state:** No global search. Relay search is relay-specific.
|
||||||
|
|
||||||
|
**Workaround:**
|
||||||
|
|
||||||
|
- Client-side full-text index of followed users' content (SQLite/Realm on device)
|
||||||
|
- "Explore" powered by curated relay aggregation — Morpheus runs an indexing relay
|
||||||
|
- Trending topics computed from public event volume across Morpheus community relays
|
||||||
|
- Hashtag-based discovery (NIP-12 generic tag queries)
|
||||||
|
- "People you might know" based on social graph overlap (computed client-side, not server-side)
|
||||||
|
- Human-curated featured accounts and communities (editorial, not algorithmic)
|
||||||
|
|
||||||
|
### 2d. Key Management / Identity Recovery
|
||||||
|
|
||||||
|
**Current state:** Lose your nsec = lose everything. Unacceptable for teens.
|
||||||
|
|
||||||
|
**Workaround:**
|
||||||
|
|
||||||
|
- **Social key recovery (primary):** Shamir's Secret Sharing — split the recovery key among N trusted contacts, require K of N to reconstruct. "Choose 5 friends. Any 3 can help you recover your account."
|
||||||
|
- **Encrypted cloud backup (optional):** Encrypt nsec with a user-chosen passphrase, store encrypted blob in iCloud/Google Drive. User controls the encryption key.
|
||||||
|
- **Device-bound keys:** Store nsec in device Secure Enclave / Android Keystore. Biometric unlock. Key never leaves the device in plaintext.
|
||||||
|
- **NIP-46 (Nostr Connect):** Remote signer pattern — the key lives in a signer app, Morpheus never touches it directly. Advanced users can use this.
|
||||||
|
- **Progressive disclosure:** New users get device-bound key + cloud backup prompt. Power users can export nsec and manage it themselves.
|
||||||
|
|
||||||
|
### 2e. Stories / Ephemeral Content
|
||||||
|
|
||||||
|
**Current state:** No native Nostr primitive for disappearing content.
|
||||||
|
|
||||||
|
**Workaround:**
|
||||||
|
|
||||||
|
- Use NIP-40 (expiration timestamp) on events — relays delete after TTL
|
||||||
|
- Client enforces expiration display-side (even if a rogue relay keeps the event)
|
||||||
|
- Stories rendered as a carousel of kind:20 (short text notes) or kind:1063 (file metadata) events with 24h expiration
|
||||||
|
- Not truly "disappearing" in the Signal sense — but matches Instagram/Telegram stories UX
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 3: Government Blocking
|
||||||
|
|
||||||
|
**Problem:** Roskomnadzor can block relay domains and IPs.
|
||||||
|
|
||||||
|
**Context:** Morpheus operates compliantly, but blocking may happen regardless (as it did with Telegram in 2018-2020). The goal is not to evade law enforcement — it's to ensure service availability for users.
|
||||||
|
|
||||||
|
**Workarounds:**
|
||||||
|
|
||||||
|
### Layer 1: Standard resilience
|
||||||
|
|
||||||
|
- WebSocket over TLS (wss://) looks like normal HTTPS traffic to DPI
|
||||||
|
- Run relays behind Cloudflare or similar CDN — blocking the CDN blocks millions of sites
|
||||||
|
- Multiple relay domains in different TLDs — redundancy, not evasion
|
||||||
|
- App automatically falls back to working relays if some are unreachable
|
||||||
|
|
||||||
|
### Layer 2: Distribution resilience
|
||||||
|
|
||||||
|
- Android: available via Google Play, RuStore, direct APK download, F-Droid
|
||||||
|
- iOS: App Store, PWA as fallback if removed from store
|
||||||
|
- Web app always available as baseline
|
||||||
|
- APK/PWA links shared via existing channels (Telegram bots, QR codes)
|
||||||
|
|
||||||
|
### Layer 3: Proactive engagement
|
||||||
|
|
||||||
|
- Engage with regulators proactively — explain what data we have and provide it
|
||||||
|
- Demonstrate compliance willingness to reduce motivation for blocking
|
||||||
|
- Maintain dialogue — blocking is often a negotiation, not a binary
|
||||||
|
|
||||||
|
**Note:** If Morpheus is blocked despite compliance, the Nostr protocol ensures users
|
||||||
|
can access their data through any other Nostr client. Their social graph and messages
|
||||||
|
are not locked in our infrastructure. This is the ultimate resilience.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 4: Legal Compliance (Yarovaya Law / SORM)
|
||||||
|
|
||||||
|
**Problem:** Russian law requires storing and providing access to user communications.
|
||||||
|
|
||||||
|
**Approach: Cooperate fully, explain architecture honestly.**
|
||||||
|
|
||||||
|
1. **Register as required.** Operate a legal entity (jurisdiction TBD based on legal advice). Register as an information distribution organizer if required.
|
||||||
|
|
||||||
|
2. **Store what we can store.** Public posts, metadata, connection logs — these exist on our relays and we can provide them.
|
||||||
|
|
||||||
|
3. **Explain what we cannot store.** DM content is encrypted client-side with NIP-44. We never hold decryption keys. This is not evasion — it is the documented, auditable architecture. We cannot provide what we do not have.
|
||||||
|
|
||||||
|
4. **Open source supports our claims.** Any technical audit of the codebase will confirm that the server never has access to plaintext DMs. This is verifiable, not just claimed.
|
||||||
|
|
||||||
|
5. **Legal precedent.** WhatsApp, Signal, and iMessage operate E2E encryption in many jurisdictions. The legal landscape for E2E encryption is complex but there is significant precedent.
|
||||||
|
|
||||||
|
6. **No user registration data collection beyond what's needed.** If registration requires phone/email for legal compliance, we collect it. But we don't collect more than required.
|
||||||
|
|
||||||
|
**The key principle:** We never refuse to cooperate. We explain the technical reality. What is encrypted is encrypted — not because we choose not to decrypt it, but because we cannot.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 5: Monetization Without Ads
|
||||||
|
|
||||||
|
**Problem:** No ads, ever. Need alternative revenue.
|
||||||
|
|
||||||
|
**Approach:** See [monetization.md](./monetization.md). Summary:
|
||||||
|
|
||||||
|
- Morpheus Pro subscription (premium features, customization, higher limits)
|
||||||
|
- Sticker/theme marketplace (creator economy with commission)
|
||||||
|
- Creator tools (paid analytics, subscriber-only content)
|
||||||
|
- Business profiles (flat monthly fee, organic reach only)
|
||||||
|
- Managed relay hosting (infrastructure-as-a-service for communities)
|
||||||
|
|
||||||
|
All revenue streams are opt-in and require no user profiling.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 6: Content Moderation
|
||||||
|
|
||||||
|
**Problem:** Teens on the platform require responsible content moderation without undermining privacy.
|
||||||
|
|
||||||
|
**Approach:**
|
||||||
|
|
||||||
|
1. **Public content is moderatable.** Public posts are... public. We can and will moderate public content on relays we operate. Standard community guidelines apply. This does not conflict with privacy — public speech has never been "private."
|
||||||
|
|
||||||
|
2. **Encrypted DMs are not moderatable by us — and that's okay.** Just like the postal service doesn't read your letters. Client-side safety features (block, report, mute) give users control.
|
||||||
|
|
||||||
|
3. **Layered moderation for public content:**
|
||||||
|
- **Relay-level:** Morpheus-operated relays enforce published community guidelines (no CSAM, no doxxing, no harassment). Content that violates guidelines is removed from our relays.
|
||||||
|
- **Community-level:** Group moderators manage their own spaces. NIP-56 reporting flows to moderators.
|
||||||
|
- **Client-level:** Spam filters, content warnings, mute/block tools.
|
||||||
|
|
||||||
|
4. **CSAM compliance:** Hash-matching (PhotoDNA or equivalent) on media uploaded to Morpheus-operated media servers. This is a non-negotiable legal and ethical obligation. Happens server-side on the media CDN before content is distributed.
|
||||||
|
|
||||||
|
5. **Transparency reports.** Publish quarterly: how many moderation actions, how many legal requests, what data was provided. Build trust through accountability.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem 7: Cold Start / Network Effects
|
||||||
|
|
||||||
|
**Problem:** A social network with no users is useless.
|
||||||
|
|
||||||
|
**Workarounds:**
|
||||||
|
|
||||||
|
1. **Launch as a messenger first, social network second.** Group chats don't need network effects — they need 5-10 friends. "Move your friend group to Morpheus" is a tractable pitch.
|
||||||
|
|
||||||
|
2. **Telegram bridge.** Bot that cross-posts between Telegram groups and Morpheus groups. Reduces switching cost. Users can migrate gradually.
|
||||||
|
|
||||||
|
3. **Target specific communities, not "everyone":**
|
||||||
|
- University student groups
|
||||||
|
- Gaming communities
|
||||||
|
- Music/art scenes
|
||||||
|
- Tech-savvy early adopters
|
||||||
|
|
||||||
|
4. **Creator partnerships.** Get popular Russian content creators to use Morpheus. Their audiences follow.
|
||||||
|
|
||||||
|
5. **"Import your group" feature.** Create a Morpheus group from an existing Telegram/VK group, auto-invite members. Minimize friction.
|
||||||
|
|
||||||
|
6. **Referral mechanics.** "Invite 3 friends → unlock exclusive sticker pack." Simple, proven, no ads needed.
|
||||||
|
|
||||||
|
7. **Ship a killer feature that doesn't exist elsewhere:**
|
||||||
|
- Voice messages with automatic transcription (huge in Russian-speaking communities)
|
||||||
|
- Built-in meme editor
|
||||||
|
- Anonymous Q&A on profiles (like ASKfm — fun and viral)
|
||||||
|
- Superior sticker creation tools
|
||||||
78
docs/web-of-trust.md
Normal file
78
docs/web-of-trust.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Morpheus — Web of Trust
|
||||||
|
|
||||||
|
## Core Concept
|
||||||
|
|
||||||
|
The Morpheus relay only accepts events from pubkeys that are followed by
|
||||||
|
at least **N** existing members on the relay. This uses the follow graph
|
||||||
|
that already exists in Nostr (NIP-02 contact lists) — no custom NIPs,
|
||||||
|
no invite tokens, no special vouch events.
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
|
||||||
|
1. User A publishes a NIP-02 contact list that includes User B's pubkey
|
||||||
|
2. The relay counts how many existing members follow User B
|
||||||
|
3. If the count reaches the threshold (e.g., 3), the relay starts
|
||||||
|
accepting events from User B
|
||||||
|
4. If User B's follower count drops below the threshold (unfollows),
|
||||||
|
the relay stops accepting new events from them
|
||||||
|
|
||||||
|
```text
|
||||||
|
Relay receives event from pubkey X
|
||||||
|
→ Count NIP-02 contact lists on this relay that include X
|
||||||
|
→ If count >= N: accept event
|
||||||
|
→ If count < N: reject with auth-required or closed message
|
||||||
|
```
|
||||||
|
|
||||||
|
## Why This Works
|
||||||
|
|
||||||
|
- **Spam dies naturally** — bots cannot accumulate real follows from
|
||||||
|
established members, so they never reach the threshold
|
||||||
|
- **No moderation overhead** — the follow graph is the moderation layer;
|
||||||
|
no admin has to manually approve or ban users
|
||||||
|
- **Community stays coherent** — the seed community is Russian-speaking,
|
||||||
|
and follows propagate through real social ties, so the network stays
|
||||||
|
culturally and linguistically coherent without explicit language filters
|
||||||
|
- **Irrelevant noise disappears** — the relay only serves events from
|
||||||
|
the member set, so random global Nostr traffic never enters the feed
|
||||||
|
- **Zero custom protocol** — uses only NIP-01 (events) and NIP-02
|
||||||
|
(contact lists), which every Nostr client already supports
|
||||||
|
- **Decentralized trust** — no single gatekeeper; trust is distributed
|
||||||
|
across the follow graph
|
||||||
|
|
||||||
|
## Threshold Tuning
|
||||||
|
|
||||||
|
| N | Effect |
|
||||||
|
| --- | --- |
|
||||||
|
| 1 | Minimal gate — one follow from any member lets you in. Easy growth, weak spam protection. |
|
||||||
|
| 3 | Balanced — requires a small social cluster. Good for early growth phase. |
|
||||||
|
| 5+ | Tight community — harder to get in, strong spam resistance. Good for mature network. |
|
||||||
|
|
||||||
|
The threshold can be dynamic — lower during early growth, raised as the
|
||||||
|
network matures. It can also differ per event kind (e.g., posting
|
||||||
|
requires 3 follows, but DMs only require 1).
|
||||||
|
|
||||||
|
## Edge Cases
|
||||||
|
|
||||||
|
- **Bootstrap problem** — the first N users must be manually allowlisted
|
||||||
|
(seed set). This is the founding community.
|
||||||
|
- **Lurkers** — users who read but don't post still need follows to
|
||||||
|
interact. Read access can optionally be open.
|
||||||
|
- **Cross-relay** — users can still connect to public relays alongside
|
||||||
|
the Morpheus relay. The WoT gate only applies to the Morpheus relay
|
||||||
|
feed.
|
||||||
|
- **Sybil resistance** — creating fake accounts to follow yourself is
|
||||||
|
possible but costly at scale (each fake needs N real followers itself).
|
||||||
|
The recursion makes sybil attacks exponentially harder.
|
||||||
|
- **Follower loss** — if someone unfollows you and your count drops
|
||||||
|
below N, your existing events stay on the relay, but new events are
|
||||||
|
rejected until count recovers.
|
||||||
|
|
||||||
|
## Implementation Notes
|
||||||
|
|
||||||
|
- The relay maintains a materialized view of the follow graph (NIP-02
|
||||||
|
kind:3 events)
|
||||||
|
- On each incoming event, it checks the author's inbound follow count
|
||||||
|
against the threshold
|
||||||
|
- The count updates in real-time as NIP-02 contact lists are published
|
||||||
|
- The seed set (manually allowlisted pubkeys) is configured at relay
|
||||||
|
startup
|
||||||
3
justfile
Normal file
3
justfile
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Lint all Markdown files
|
||||||
|
lint-md:
|
||||||
|
markdownlint-cli2 "**/*.md"
|
||||||
5
lefthook.yml
Normal file
5
lefthook.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
pre-commit:
|
||||||
|
commands:
|
||||||
|
lint-markdown:
|
||||||
|
glob: "*.md"
|
||||||
|
run: markdownlint-cli2 {staged_files}
|
||||||
BIN
sketches/chat-mockup.png
Normal file
BIN
sketches/chat-mockup.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 149 KiB |
BIN
sketches/community-mockup.png
Normal file
BIN
sketches/community-mockup.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 167 KiB |
BIN
sketches/feed-mockup.png
Normal file
BIN
sketches/feed-mockup.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 122 KiB |
Reference in New Issue
Block a user