Memory.Wiki v8 Plan

Founder goal: 지속 가능한 craftsman SaaS. 5년에 ARR $2-5M. NPS 70+. 1k-10k paid 사용자가 정말로 사랑하는 product. 폭발 욕심 버림. 안정 + 자유 + 자기 product 의 장인.

Internal thesis (사용자에게 보이지 않음): The graph is the product. Cross-AI is the structural wedge giants cannot build. External thesis (사용자가 보는 것): Stop re-explaining your context to every AI.

Last revised: 2026-05-23 Supersedes: v7-revised (memory.wiki/nvF3Li2x)


1. The H1

Stop re-explaining your context to every AI. Put your knowledge in one URL they can all read.

Sub-head:

Yours, your team's, or your community's — one URL every AI fetches.

Tertiary (3-stage diagram label):

Capture anything. AI organizes. Use everywhere.

2. Strategic Framework

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ CAPTURE │ → │ ORGANIZE │ → │ USE │ │ │ │ │ │ │ │ 사용자 + │ │ AI 가 자동 │ │ Cross-AI │ │ AI 자동 │ │ + 사용자 │ │ consumption│ │ │ │ edit │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ ↑ ↓ └─── Indispensability loop ──────────┘

Indispensability metric (north star): 사용자 재설명 횟수 감소. 측정: Weekly Recapture Rate (목표 12주 후 100명 active 중 30명이 20+ captures/week).


3. URL Architecture — 3 레벨

L1: memory.wiki/<id> ← Document (12자 nanoid) L2: memory.wiki/b/<id> ← Bundle (collection) L3: memory.wiki/@<username> ← User (identity, Mastodon/Bluesky 패턴)

Dual-response per URL (same URL, different body):

Consumer URL 응답
브라우저 memory.wiki/@raymind HTML (timeline + Galaxy tab + Bundles tab)
AI (ChatGPT/Claude/Cursor) 같은 URL markdown digest (token-budgeted, 8-16KB)
.md 접미사 memory.wiki/@raymind.md text/markdown 명시적

서버가 UA + Accept + sec-fetch-dest 헤더 기반 자동 분기. 사용자는 single URL 만 알면 됨.

기존 호환:

  • /hub/<slug>/@<username> 301 redirect
  • profiles.hub_slug DB column 그대로 (internal name 변경 X)

4. Dual-layer Storage (원본 + AI metadata)

ORIGINAL (immutable) AI LAYER (replaceable) 사용자가 capture 한 그대로 AI 가 만든 metadata - markdown body - tags, cluster_id - source URL, timestamp - summary, related_ids - attribution (누가 만들었나) - agent_id, generated_at 영구히 변하지 않음 언제든 재생성 가능

UI: 모든 entry 에 view toggle: 📄 Original✨ Organized. AI 가 만든 metadata 는 별도 element, 원본 위에 안 덮어씀.

Lock toggle: 사용자가 "이 entry 는 AI 가 못 건드림" 명시 가능.


5. Auto-organize Policy

Type 1: Metadata (no approval, no new entity)

무엇 언제
Tags (5-10 per doc) capture 즉시
Cluster 할당 capture 즉시
1-2 문장 summary capture 즉시
Related docs capture + 매일 재계산
Entity extraction (이름/장소) capture 즉시

Type 2: Bundle (My + AI 두 namespace)

memory.wiki/@raymind │ ├── 📁 My Bundles (사용자가 명시 생성) └── ✨ AI Bundles (AI 자동 생성)

Permission matrix:

AI 동작 My Bundles AI Bundles
새 bundle 생성 ✓ 자동
기존 bundle 에 doc 추가 confirm 필요 ✓ 자동
Bundle 이름/설명 변경 ✓ 자동
Bundle 삭제 ✓ 자동 (cluster 사라지면)

Conversion: AI Bundle → My Bundle 1-tap, 그러면 AI 가 자동 update 멈춤. 양방향 가능.

Type 3: Synthesis docs (AI 가 새 doc 생성) — DROPPED 2026-05-28

원래 plan: Bundle summary doc / Weekly digest / Synthesis across docs / About draft 를 AI 가 미리 생성.

Drop 결정 (founder, 2026-05-28): W8 paste-anywhere 가 이미 USE surface 를 담당. 사용자가 /@<me> 를 ChatGPT/Claude/Cursor 에 붙이고 "summarize this / draft an About / weekly digest" 라고 직접 시키면 끝. 미리 만들어 저장하면:

  • LLM 비용 발생
  • Stale 문제 (원본은 바뀌고 synthesis 는 멈춤)
  • USE surface 중복 (paste-anywhere 와 같은 일)

대신 paste-anywhere 가 USE 의 single source 가 됨. Type 3 가 정말 필요하면 (예: 사용자가 weekly digest 가 자동으로 도착하길 원함) post-launch 에 재검토.

6. Attribution Model

매 entry/bundle/doc 에 generation history:

json
{ "creator_type": "user" | "ai", "agent": "memory-wiki-background" | "claude-sonnet-4.6" | "gpt-4o" | "custom-gpt" | "cursor-mcp", "triggered_by": "user-capture" | "weekly-digest" | "user-on-demand" | "auto-cluster", "generated_at": "2026-05-23T10:00:00Z", "user_edits": 0 }

UI:

  • User-written: 사용자 아바타 + dot
  • AI-generated: ✨ + agent 이름 (Claude / GPT / background)
  • Edited-by-you (was AI): 펜 아이콘 + "originated from AI"

7. Collaboration Model

3 tier:

Tier A — Sharing primitives (v8 launch)

항목 변경
Doc visibility public/private/restricted (기존 유지)
Bundle visibility 신규: public/unlisted/private/restricted
Bundle collaborators 신규: 여러 명 edit 가능 (max 5)
@username public profile 신규: 사용자가 어떤 doc 노출할지 선택
Presence indicators avatars + 실시간 cursor (Yjs 위)
Comments doc 별 thread

Tier B — AI 협업 (v8 launch)

  • Shared bundle 의 AI auto-organize 가 collaborative (모든 member capture 통합 cluster)
  • @user/bundle URL paste → 모든 사람의 context 합쳐 AI 가 받음
  • Attribution 으로 "@raymind 가 추가" 명시

Tier C — Team workspace (v9+, 미룸)

항목 미루는 이유
Multi-tenant workspace DB schema 큰 변화
Role-based access (Admin/Editor/Viewer) UX 복잡, B2B onboarding
Per-seat 청구 Stripe flow 분기
SSO / SAML Enterprise 영역
Audit log compliance 영역

Tier C 는 PMF 후 6-12 개월에.


8. Mobile Strategy

Native iOS + Android (Tier 1 surface, 신규 build).

v8 Native scope

Capability iOS Android
Share Extension (모든 앱 → memory.wiki)
카메라 → 즉시 capture (OCR 포함)
스크린샷 자동 처리 (한국 culture)
Spotlight / Search 통합
Widget (홈 + 잠금 화면)
Background sync (offline first)
Push notification
Main UI: timeline + quick capture

제외: Voice memo (한국 cultural fit 약함), Action Extension, Live Activities, 키보드 확장 → v8.1 / v9.


9. Best UX — 8 criteria

각 feature ship 전 8 기준 통과 필수:

기준 기준선
Capture latency < 1 초 (tap → 완료 알림)
Open latency < 500ms (URL → LCP)
Action requirement 모든 action 1 tap 또는 1 keystroke
Surprise factor 0 (AI 가 사용자 데이터 변경 안 함)
Cross-surface consistency 모바일 / 데스크탑 / Chrome ext / Cursor → 같은 mental model
Beauty Linear / Granola / Things 수준 polish
Animation feel calm + responsive + 60fps
Type & spacing 모든 화면에서 일관 grid + 타이포

→ 통과 못한 feature 는 ship 안 함. 개수 < 마무리.


10. Surface Plan — 9 surfaces, 3 Tier

Tier 1 — Heavy work

Surface 작업
apps/web 전면 재작업 (3-stage, dual-namespace, /@user, dual response, attribution, collab, branding)
apps/ios-native 신규 build (Share Ext, 카메라, Widget, Spotlight, sync)
apps/android-native 신규 build (동일)

Tier 2 — Medium

Surface 작업
apps/chrome-extension AI 별 capture 최적화 + Inject button + AI Bundle 인지
packages/mcp Organize ops + digest endpoints + attribution metadata

Tier 3 — Light (branding + API compat)

Surface 작업
apps/vscode-extension branding + new API + Copy-as-context command
apps/desktop branding + new schema 호환
apps/cli 명령어 점검 + branding
apps/quicklook branding 만

→ 모든 9 surface v8 launch 동시 release (sync principle).


11. Timeline — 20 주 (parallel-optimized)

W1-2 Brand Phase 1 + Schema migration + foundation [done 2026-05-27] W3 Attribution + AI bundle separation + Bundle visibility [done 2026-05-27] W4-6 Web: Auto-organize (real-time + background + synthesis) [Type 1+2 done; Type 3 pending] W7 Web: Dual response (HTML + markdown) + Public profile [done 2026-05-28, fully cleaned up 7f4ba61c] W8 Web: Use surface (paste-anywhere) + Comments [paste-anywhere done 55c54e24; Comments scoped out by founder 70dfd82e] W9-12 iOS native (Swift) — Share Ext + 카메라 + Widget + sync W11-13 Android native (Kotlin) — 병렬 W13-15 Channel updates: Chrome / VSCode / Desktop / CLI / MCP / QuickLook W14 Bundle collaborators + presence (live edit 폴리시) W16 UI Polish + accessibility + perf audit W17 Brand Phase 2 + landing + onboarding 그림 + 데모 영상 W18 Pricing + Stripe + docs 전체 업데이트 W19 Launch dry-run + bug bash W20 Launch wave (9 채널 동시 release)

매주 30-50 시간 work. 솔로 + AI pair 풀타임 기준 가능. 5 개월 launch.

Progress log

  • 2026-05-27 — Brand Phase 1, W3 schema + namespace split (055cac2d), W4 Type 1 organize-doc pipeline (5b8098a3 / 37d241c5 / 9741a0ea / 20bdfb3e), W4 Type 2 option B demote (8e405cb7), Coming-soon 신호 5종 (8bbbea16, 77ee415a, d46212ae).
  • 2026-05-27 — Sidebar Private/Shared/Synced filter root-cause fix (4d278e3a). W3 visibility picker UI (d4543023).
  • 2026-05-28 — Editor view-mode: Live → MD (1ace7945). W7 /@ profile URL (c9fd141e). W7 /hub → /@ 301 redirect (85588124). W8 doc comments MVP (746334f0, later pulled). Settings polish + key-color double-click fix (96a26fbe). DocComments build fix (26447143). /settings render fix (2628fb0c). E2E fix after Live → MD (e91cc0f9). W8 paste-anywhere "For AI" button (55c54e24). Default scheme accent map fix (9c2f5abb).
  • 2026-05-28Comments removed + ReferencedBy redesign + hub-tooltip copy fix (70dfd82e). Migration 059 dropped doc_comments table. ReferencedBy now matches RelatedInHubPanel's card style.
  • 2026-05-28Avatar picker: brighter Shapes default + hide stock-photo tile (981519ba). DiceBear identicon → shapes (existing rows silently mapped); Google's letter-default avatar URLs detected + suppressed.
  • 2026-05-28W7 final cleanup (7f4ba61c). Manifest links + search form action under /@. New rewrites for /@:slug/{index.md,SCHEMA.md,llms.txt,llms-full.txt,search}. sec-fetch-dest hardening intentionally skipped (Googlebot SEO).
  • 다음 후보: Type 3 synthesis docs (Bundle summary doc, About draft, Weekly digest); W13-15 channel updates (Chrome / VSCode / Desktop / CLI / MCP awareness of /@ + paste-anywhere); W14 Bundle collaborators + presence.

12. Pricing

Tier 가격 포함
Free $0 3 docs/월, public 만, 1 bundle
Pro $15/mo unlimited docs, private docs, custom domain, AI auto-organize, native apps, MCP, Custom GPT
Team (v9+) per-seat, shared workspaces, role-based access

Beta 사용자 (기존 mdfy graph): launch day 50% 영구 할인 코드.


13. ICP — 누가 사랑하나

1순위 (launch 시 80%): AI-fluent indie hacker / solo dev / dev relations

  • ChatGPT + Claude + Cursor 셋 다 일상적 사용
  • HN / Twitter / Reddit r/cursor 등에서 도달 쉬움
  • 너 자신이 그 segment (dogfooding)

2순위 (launch 시 15%): tech writer / 연구자

  • publishing 도구에 친화
  • 인용 가능한 URL 가치 큼

3순위 (5%): power knowledge worker (lawyer, consultant)

  • pain 있지만 enterprise sales motion 필요 → 후순위

제외: casual ChatGPT user — re-explaining pain 인식 안 함


14. GTM — 분산 wave

Pre-launch (Week 17-19)

기존 mdfy 사용자 graph mining:

  1. mdfy.app DB 에서 active user export
  2. Segment: anonymous publisher / signed-in / Chrome ext / VS Code ext / Desktop
  3. Personalized email per segment
  4. Hook: "Your AI memory URL is ready" (NOT "upgrade to Pro")
  5. 50% lifetime discount code

목표: pre-launch 50-100 commit

Launch day (Week 20)

순차 wave:

  • Tuesday morning: 기존 사용자 email
  • Tuesday noon: HN Show HN ("Memory.Wiki — stop re-explaining yourself to every AI")
  • Wednesday: Twitter thread + dev community
  • Thursday: ProductHunt
  • Friday: Manifesto post

목표 KPI 12주 후 launch:

  • Signup 5,000
  • Free active 500
  • Paid 80-150 ($1.2k-2.3k MRR)
  • NPS > 60
  • Weekly Recapture Rate: 30% of active 20+ captures/week

Deep partnership (Week 24+)

1 개 deep integration target: Cursor

  • Cursor team cold email
  • Memory.Wiki integration for cursor rules
  • 발표 가능한 integration (PR + blog)
  • Custom GPT 등 generic 채널보다 강함

15. 무엇을 안 하나 (sacred cows kill list)

항목 이유
Embedded chat ChatGPT/Claude 와 직접 경쟁, 우리 thesis 와 충돌
Voice memo / 음성 input 한국 cultural fit 약함, scope 늘림
Public hub / social feed Wikipedia/social product 운동 — PMF 전 안 됨
Bundle Spec RFC / open standard community 운영, post-launch
AI conversation auto-suggest UI ChatGPT UI 분기마다 깨짐, maintenance 부담
Custom GPT 외 cross-AI 통합 깊이 launch 후 Cursor partnership 1 개로 충분
Team workspace + per-seat 청구 v9+ (Tier C)
시각 graph 가 product 의 main Galaxy 는 fun side feature, default view 아님
Founder narrative 의 "솔로 6개월" "거인이 못 만드는 cross-AI" 가 더 강함
Memory layer category 경쟁 "context portability + capture layer" 로 reframe

16. Risk Register

Risk 1: 거인 vendor 진입 (40%)

Mitigation: cross-AI thesis 가 narrative 의 정수. vendor 가 못 만드는 영역 강조. Cursor partnership 으로 differentiation 강화.

Risk 2: 20 주 schedule slip (50%)

Mitigation: Week 8, 12, 16 reality check. 50% 안 되면 cut feature, 미루지 않음. Tier C 는 처음부터 v9 로 격리.

Risk 3: Mobile native app App Store 거부 (15%)

Mitigation: launch 6 주 전 (Week 14) TestFlight + Play Store internal track submission. 거부되면 시간 확보.

Risk 4: First-100 paid acquisition 안 됨 (35%)

Mitigation: 기존 mdfy graph mining 우선. Week 17 부터 segmented email 캠페인. "Your AI memory URL is ready" hook.

Risk 5: AI cost spiral (auto-organize 의 LLM 비용) (25%)

Mitigation:

  • Free tier rate limit (3 docs/월, 1 bundle)
  • Pro $15 에 cost 반영
  • 3-provider failover (Anthropic / OpenAI / Gemini)
  • Background organize 는 batch + caching

Risk 6: 솔로 burnout (40%)

Mitigation: Week 6, 10, 14, 18 reality check + 1 일 OFF 룰. 주당 50 시간 cap. AI pair 의 효율 신뢰.

Risk 7: Best-UX 기준이 launch 늦춤 (30%)

Mitigation: ship 안 함 결정은 일찍. Week 16 audit 에서 fail 한 feature 는 v8.1 로 이관. 통과한 것만 launch.


17. Internal vs External Thesis 분리

Internal (founder 전용):

  • The graph is the product
  • Cross-AI is structurally impossible for giants
  • AI-native memory infrastructure
  • Knowledge as URL = API for any AI

External (사용자가 보는 것):

  • "Stop re-explaining your context to every AI."
  • "Capture anything. AI organizes. Use everywhere."
  • "Yours, your team's, or your community's — one URL every AI reads."

→ Internal 단어 (graph, layer, infrastructure, memory) 는 manifesto / about / founder note 에만. 사용자 surface 에는 절대 노출 안 함.


18. Locked Decisions (23)

# 결정
1 Framework Capture → Organize → Use
2 URL doc memory.wiki/<id> (그대로)
3 URL bundle memory.wiki/b/<id> (그대로)
4 URL user memory.wiki/@<username> (신규, Mastodon/Bluesky 패턴)
5 Bundle namespace My + AI 분리
6 Dual-layer original immutable + AI metadata
7 Dual-response same URL, content negotiation
8 Attribution per-entry, AI agent identity 포함
9 Mobile iOS + Android native (Tier 1)
10 Voice memo drop
11 Galaxy visible tab, default 아님
12 Embedded chat drop
13 Best UX 8 criteria
14 Pricing $15/mo Pro, free 3 docs/월
15 H1 "Stop re-explaining your context to every AI."
16 Branding Phase 1 (시작) + Phase 2 (마지막)
17 Timeline 20 주
18 9 surfaces 동시 launch sync release
19 Surface tiers T1 web/iOS/Android, T2 Chrome/MCP, T3 VSCode/Desktop/CLI/QuickLook
20 Parallel work T1 main (80%) + T2/T3 (later phases)
21 Auto-organize metadata auto + bundle 제안 (My approval, AI 자동) + synthesis (user-trigger or weekly)
22 Docs update 각 surface 별, Week 18
23 Collaboration Tier A+B (sharing + presence + comments) v8, Tier C (team workspace) v9+

19. Mantra

하나의 URL. 모든 AI.

Capture 는 친구. Organize 는 AI. Use 는 너의 권한.

사람이 쓴 것은 sacred. AI 가 만든 것은 attributed.

거인이 못 만드는 cross-AI 가 우리 wedge. 사용자에게는 안 말함.

개수 0개 ship 보다 마무리 1개 ship.


20. 한 줄 정리

Memory.Wiki v8 — the cross-AI capture layer. Capture anything from anywhere. AI organizes in the background. Paste one URL into any AI — it knows you. Solo, with friends, or with your community. 20 weeks. 9 surfaces. 23 locked decisions. Ship.


문서 작성: 2026-05-23Brand: Memory.Wiki (final, 두-톤 wordmark)Launch: 2026-10 중순 (Week 20)Built by: Hyunsang at Raymind.AISupersedes: v7-revised — same craftsman path, sharper framing, +collaboration, +native mobile, +best UX bar

Progress log (continued)

  • 2026-05-28 → 2026-05-29 (iOS W9 round 24-29) — single git commit c1719384 + subsequent uncommitted work. Capture surface overhaul + iOS 26 UX sweep:

    • Capture flow: body tap focus race-fix (Coordinator tracks SwiftUI focus across renders so a stale-false render after UIKit becomeFirstResponder doesn't kill it). FillingTextView UITextView subclass reports noIntrinsicMetric so SwiftUI stretches it (empty editor was a one-line tap strip). @State bodyFocused mirrors @FocusState for the body field (UIViewRepresentable can't bind to FocusState, so Save/Cancel never appeared on body focus). Pill toolbar edge fades. ProcessingBanner sticky chip across photo / URL / file flows so every long step is visible. OCR preview chip with Insert / Discard. URL sheet rewritten with honest copy + clipboard auto-fill + inline parse hint. Dictation permission denial promoted to alert with Open Settings deeplink. Banner kind system with distinct icon/tint per surface; errors look like errors (microRed border + red-tinted fill). Settings micro-coloured glyphs + accent dots on hub stat tiles.

    • WebP-everywhere: iOS uploads 1280pt @ WebP 0.5 first try with ladder down to 640pt; soft target 500 KB, hard ceiling 3.5 MB (Vercel function payload cap headroom). Server /api/upload + lib/import-images now re-encode every raster to WebP including animated GIF (sharp({animated:true})); SVG stays vector.

    • URL import: new APIClient.importURL streams the /api/import/url SSE pipeline into a live sticky banner. Server fetcher sends a real Chrome User-Agent + standard browser Accept / Sec-Fetch headers so anti-bot gates (NYT, Cloudflare-fronted blogs) stop 403'ing on first request. Friendlier upstream-error messages (403 / 401 / 429 / 451) point the user at the Share extension as a fallback.

    • iOS 26 UI sweep: floating capsule tab bar (.ultraThinMaterial + 12pt insets + shadow). Settings tab glyph swapped for the user's avatar (22pt circle, ink ring when active). All sheets routed through new .iOS26Sheet(detents) modifier — drag indicator + glass background + 28pt corner. Dark gradient strip behind floating tab bar so content fades into Brand.background instead of clashing with the chrome.

    • Tab reload root-fix: RootView switch was rebuilding the active view on every tab tap, destroying its @StateObject and its 30s cache. Replaced with a ZStack that keeps all five tab views mounted + opacity-gates the active one + allowsHitTesting(false) on the hidden tabs. Tab switches now reuse cached lists; RefreshingPip shows in the header when a background revalidate is running over already-painted data.

    • Skeleton + shimmer: new Skeleton.swift with SkeletonRow, SkeletonList(count:), SkeletonStatStrip, ShimmerModifier, RefreshingPip. Timeline / Bundles / Start use these instead of a centred spinner so first-paint reads as "loading the list that's about to appear" rather than a frozen screen.

    • Dictation interim transcript: DictationController gained an optional onInterim callback. SFSpeechRecognizer emits the engine's running best-guess on every refinement; DictationBanner shows it as a 3-line italic preview under the LISTENING row, cleared when a chunk is finalised and committed to the body draft.

    • Display Name editable: added to UserSession (loaded from profiles.display_name during hydrate). Settings → ACCOUNT now has a tappable Display Name row that opens a glass sheet with a text field. Save writes directly via Supabase (RLS allows self-update), then AuthManager.refresh() repaints. Start hero greeting tone-down: 3 calm variants per time slot, rotated by day-of-year; no quirky filler, displayName only (no email/slug fallback).

    • Splash tagline: "Knowledge hub for the age of AI" added under the wordmark on the boot splash with 0.28s stagger delay.

    • Doc detail prefetch: new DocCache (NSCache-backed, bounded to 80 entries, cleared on .mwUserChanged). Timeline rows call DocCache.shared.prefetch(doc.id) on appear; DocumentDetailView.load checks the cache first and paints instantly, kicking a background revalidate so any server-side edit since the prefetch lands without making the user wait.

    • Widget: .contentMarginsDisabled() on the WidgetConfiguration + tighter inner 10-12pt padding so the canvas fills nearly edge-to-edge instead of being ringed by a fat dead band.

  • Next candidates: Verify URL import on Vercel-deployed Chrome-UA fetcher against more sites. Add doc detail revalidate badge (similar to RefreshingPip). Push current uncommitted iOS round 25-29 work.

  • 2026-05-29 (iOS W9 round 30) — commit 0181ee76. Hub stats was failing silently because the iOS HubResponse decoder expected profile / stats (legacy v6 names) but the route returns hub / counts — every Settings → Your Hub load died with "data couldn't be read because it is missing." Struct rewritten to mirror the server shape with computed back-compat shims so existing Settings + Start call sites stayed untouched. ProfileView now surfaces the real fetch error + a Retry button so the next decoder mismatch isn't silent. Tab bar liquid-glass tuning: BottomFadeStrip switched to .thickMaterial masked by a gradient with only a faint dark tint on top — the previous ~98 % overlay had made the strip effectively solid, defeating the see-content-blurred-behind-chrome point of iOS 26. Added a 50pt bottom safe-area inset on the keep-mounted tab container so child ScrollViews / Lists can lift their last row above the floating tab bar. Widget: padding back to 14/16pt (10/12 was too tight after .contentMarginsDisabled()) and Capture button cornerRadius 9 → 14 so it follows the ~22pt iOS widget canvas curve concentrically.

  • 2026-05-29 (iOS W9 round 31-33) — commit 91c0b28b. App Store readiness sweep + demo account + voice fixes + scope polish. App-Store side: 1024px marketing icon (mwlogoset v2, alpha-flattened on zinc-950), PrivacyInfo.xcprivacy on main app + Widget + ShareExtension (NSPrivacyTracking=false, five data categories declared, four Required Reason APIs), ITSAppUsesNonExemptEncryption=false, portrait-only orientation, iPad dropped (TARGETED_DEVICE_FAMILY 1), DEVELOPMENT_TEAM wired through xcconfig, README app group mismatch fixed. Demo: scripts/seed-demo-account.mjs provisions demo@memory.wiki with hub_slug memorywiki-demo, 5 doc folders + 2 bundle folders, 50 rich-content docs (h1/h2/h3, lists, tables, multi-language code, KaTeX, mermaid, images, footnotes, quotes), 10 bundles with 3-8 member docs each, timestamps spread 90 days, visibility mix 40/30/30. scripts/analyze-demo-account.mjs 4-pass post-seed produced 444 chunks + 20 bundle embeddings + 34 concept_index entries. Email-only sign-in: /api/auth/demo-signin allowlist extended with demo@memory.wiki; iOS EmailAuthSheet hides password field for allowlisted emails + new AuthManager.signInDemo POSTs to that endpoint and setSessions the returned tokens. Voice: stop()-side flush of the latest interim tail so the user's last sentence stops vanishing; benign error codes (203/209/216/301/1110) suppressed + onError sink dropped before task cancel; Settings → Voice → Dictation language picker over every SFSpeechRecognizer.supportedLocales() with @AppStorage wiring back to startDictation. Heat fix: AmbientBlob (WKWebView spinning an SVG loop) gated on selectedTab == .capture so the keep-mounted Capture tab stops burning GPU when the user is on another tab. Misc polish — Start skeleton top-anchored to match the loaded layout, Hub stats decoder aligned to server's { hub, counts } shape with computed shims + Retry button, BottomFadeStrip rebuilt with ultraThinMaterial + black gradient (was Brand.background-gray), 50pt safeAreaInset per tab + Start +40pt bottom padding so the floating tab bar doesn't cover the last row, tab re-tap pops to root with selection haptic / tap-at-root fires warning haptic + 3-cycle horizontal shake, Korean H1 weight via .weight(.semibold) layered on Cal Sans (CJK fallback at semibold), greeting copy reorganised to 4 calm-with-personality variants per time slot rotated by day-of-year, Capture banners lift to 80pt bottom padding when keyboard is down, MDs header label "Timeline" → "Markdowns".

  • 2026-05-29 (iOS W9 round 34-45, marathon session) — commits 33d4ce4877a8475e. Big arc covering in-app chat (hub + bundle + doc, Claude Haiku 4.5, raw text streaming, max_tokens 64k), tappable [doc:id] citation chips that resolve real doc titles via DocCache, full block-level markdown in chat + GFM tables + task lists in MarkdownBody, NavigationStack typed-path root-cause fix for bundle members, iOS 26 dark glass refinement (BottomFadeStrip + black gradient + ultraThinMaterial), widget large-footer quick actions (Ask / Search / Paste) with deep-link routes, memorywiki://capture-paste that drops the live clipboard into the body draft, Korean H1 weight via Cal Sans + .weight(.semibold) fallback, dictation Stop-flush + multi-language picker, EmailAuthSheet demo passwordless allowlist, demo seed deterministic ids + wipe script + analyze pass (444 chunks / 20 bundle embeddings / 34 concept_index entries), heat fix (AmbientBlob gated on selectedTab == .capture), tab keep-mounted, skeleton + shimmer, RefreshingPip stale-while-revalidate indicator, Splash tagline, Display Name edit, App Store readiness sweep (PrivacyInfo on three targets, 1024 icon from mwlogoset v2 alpha-flattened, ITS encryption + portrait-only + iPhone-only + DEVELOPMENT_TEAM wired), and the publish kickoff: MARKETING_VERSION 0.1.0 / CURRENT_PROJECT_VERSION 2, ExportOptions.plist for App Store distribution, memorywiki://demo-signin deeplink for screenshot automation, ARCHIVE + EXPORT SUCCEEDED (IPA at apps/ios-native/build/ipa/MemoryWiki.ipa), ten 1320×2868 screenshots captured via xcrun simctl io after auto-signin (auth / email sheet / start / markdowns / bundles / capture / settings / doc detail / bundle detail / chat hub). Also drafted two memory.wiki canonical docs: iOS overview & roadmap (Tf7Y8XZb) + Android implementation guide (vfj8dNg_). Next steps are all founder-side: ASC app record + Privacy Policy URL + listing copy + Transporter upload + submit-for-review.

  • 2026-05-30 → 2026-05-31 (Android W11 marathon) — many commits, latest 018e78ca. Android-native build pushed from rough first cut to iOS-parity feature set + polish pass. Major arcs:

    • Visual + brand parity: launcher icon foreground rewritten as a 108dp VectorDrawable scaled by 66/128 = 0.515625 and translated by 21 to the inner safe zone so circular launcher masks no longer clip the satellite dots (verified on a physical Nothing Phone). Splash + auth + tab-bar centerpiece all wired to BrandBlob — same SMIL-animated SVG the web + iOS use, hosted in a transparent WebView since no native Android SVG renderer plays SMIL. Tab bar polished: opaque pill background, 10dp inner padding, 20dp lift above the gesture bar, duplicate fontSize stripped on labels. Full-screen CircularProgressIndicator on Document detail and Bundle detail swapped for BrandBlob at 96dp; inline 11dp search status stays as a Material spinner since BrandBlob can't render legibly that small. iOS-style push transitions wired on every detail screen (markdowns/doc, bundles/{id}, bundles/doc, about, help, chat) — 280ms tween slide + 180ms fade for enter, reverse for pop; top-level tab swaps stay on the NavHost default since they're peers, not parent/child.

    • Lists: MDs and Bundles both have a STARRED section above the main list (only on Filter.All + no query, mirrors iOS BundlesView and TimelineView). PinnedStore hydrates from the server, optimistic local toggle, server reconciliation with rollback on failure. Star / Unstar in the long-press menu fires HapticFeedbackType.TextHandleMove (was silent). Bundles empty state grew a CTA ("Open memory.wiki") matching the Markdowns pattern instead of just describing what bundles are. 300ms-debounced semantic search wired on Markdowns with a separate "BY MEANING" section under literal title hits.

    • Document workflow: edit / visibility toggle / delete on the doc detail kebab; AddToBundle sheet that lets users assign the current doc to one of their existing bundles; TOC sheet over headings with smooth scroll-to.

    • Capture: 6 modes (Write / URL / Photo / OCR / Voice / Files), publish surfaces the new doc id via RouterEvent.PushDocDetail; Publish button got a TextHandleMove on tap + LongPress on success so the user feels the publish land before the screen swaps to the new doc. VoiceMode already had EXTRA_PARTIAL_RESULTS=true + onPartialResults wired to a live interim card — the parity audit flagged it as missing, verified the audit was wrong before changing anything (code before assumption).

    • Share intent: ShareReceiverActivity routes incoming SEND / SEND_MULTIPLE intents into Capture (not a silent POST) so the user sees the pre-filled draft and can title / edit before publishing. Handles text/plain + image/* + multi-image.

    • System-level Android surfaces:

      • App Shortcuts (shortcuts.xml + manifest meta-data) — long-press the launcher icon to jump straight to Capture / Ask / Search / Paste. 4 vector drawables + 8 strings + <meta-data> wired into MainActivity. targetPackage omitted so debug + release variants both resolve at runtime.
      • Google Assistant App Actions — top-level <capability> tags on actions.intent.CREATE_NOTEmemorywiki://capture and actions.intent.GET_THINGmemorywiki://search. "Hey Google, take a note in memory.wiki" lands in the Capture screen. iOS Siri Shortcuts parity without writing a new intent surface.
      • Quick Settings tile (CaptureTileService) — pull-down notification shade tile labelled "Capture" that fires memorywiki://capture via PendingIntent on Android 14+ and the deprecated Intent overload on 13. Registered with BIND_QUICK_SETTINGS_TILE so SystemUI can bind. Active tile, no state to sync.
      • Home + lock-screen widget — Glance-backed responsive widget with three breakpoints (small / medium / large), opaque pill background. widgetCategory="home_screen|keyguard" so it works on the lock screen on Android 12+. Plus a second 1×1 capture-only mini widget (inverted bone-on-ink) as a separate provider in the picker so users pick the shape that fits their home screen.
      • App Links + deep linksmemorywiki:// scheme + auto-verified https intent filter for memory.wiki/* once /.well-known/assetlinks.json is in place. Tapping any memory.wiki/<id> URL in Chrome opens the doc reader inside the app.
    • Settings: hub URL card with Copy for AI / Copy URL / Open hub pills, hub stats (memories + bundles tiles), account (email / username / display name editor sheet), key-color accent picker, language → opens system per-app locale picker (API 33+), LEARN → About / Help & Shortcuts / Replay welcome tour, FEEDBACK → mailto with pre-filled version + device + OS + locale body (feedbackBodyTemplate() mirrors iOS FeedbackComposer.bodyTemplate()), terms + privacy, sign out. About + Help screens are in-app (no web bounce). Onboarding 3-card pager on first signed-in launch, replay via Settings.

    • Tap target a11y sweep: search bar clear X, list-row Share Upload icon, and Chat close X all wrapped in a 36dp clickable circle while keeping the small 12-13dp glyph visual weight. Hits the Material a11y minimum without losing the dense feel.

    • Build hygiene: collapsed individual Lucide icon imports to wildcard import com.composables.icons.lucide.* so adding a new icon doesn't add an import line. Foreground refresh wiring (LifecycleEventObserver.ON_RESUMERouterEvent.ForegroundRefresh) so lists re-pull on return to foreground without the user having to pull-to-refresh.

  • Deferred (Phase 2 candidates): AppSearch indexer (Pixel Launcher integration is not automatic — real Spotlight-equivalent UX requires launcher partnership); WorkManager periodic worker (widget has no dynamic content, list cache already warms on ON_RESUME, periodic job would be dead work).

  • Next: founder-side Play Store listing + Privacy Policy URL + screenshots + internal track submission. APK builds clean and installs on physical Nothing Phone + Pixel_8_Pro emulator.

  • 2026-05-31 (Android Play Store prep) — commits 127336e397711a43. Pipeline + assets ready, blocked on Google ID verification (Play Console dropdown does not list South Korea because payments profile country was set to US; user contacted Google support to enable Korean Individual flow).

    • Release signing: app/build.gradle.kts reads upload keystore + passwords from gitignored release-keystore.properties. Falls back to debug signing if missing. Upload keystore (RSA 2048, valid through 2053) generated locally at app/upload-keystore.jks. Cert SHA-1 + SHA-256 captured for Google OAuth wiring.
    • First signed AAB: 32 MB at app/build/outputs/bundle/release/app-release.aab. R8 minify + lint pass after adding -dontwarn pl.droidsonroids.gif.** (Markwon's optional GIF decoder).
    • 8 phone screenshots captured from Pixel_8_Pro emulator (1344×2992 @ 480dpi) signed in as demo@memory.wiki: Start with STARRED hydrated, Markdowns + STARRED, Doc detail (markdown rendered), Bundles + STARRED + ALL, Bundle detail (Deploy URL card), Capture (6-mode pill), Settings (hub card + accent picker), Help (6 expandable sections). Sitting in apps/android-native/screenshots/v010/.
    • Brand voice cleanup: HelpScreen + OnboardingScreen had em-dash + right-arrow in user-visible body strings; replaced with commas / sentence breaks before screenshots were finalised. iOS-style headline + sub captions written for all 8 (EN + KR) — see submission pack section 15.
    • Submission pack doc: https://memory.wiki/rLdM5lDB consolidates every Play Console form field with paste-ready copy (account creation answer, store listing EN + KR, Data Safety matrix, content rating answers, demo credentials for App Access, asset checklist with Figma template, Korean translations for KR locale).
    • In-repo mirror: apps/android-native/RELEASE.md carries the same checklist in the codebase so it ships with future contributors.
  • Blocker: Google Play Console signup landed on US-only ID verification dropdown because the linked payments profile (Hyunsang Cho — United States, profile 5592-0770-7291) defaulted to US. The Hyunsang Cho — South Korea profile (7720-5294-9652) exists in payments center but the existing Play Console dev account on hi@raymind.ai is already linked to a different profile. Support ticket open. Path forward once Google responds: either (a) switch the linked payments profile to the Korea one for Individual verification (phone + utility bill, no government ID upload), or (b) Organisation route with RayMind.AI Korea profile (0819-9966-8142) + 사업자등록증 if available.

  • Next while waiting: founder-side asset production (512×512 app icon, 1024×500 feature graphic, 8 captioned screenshots in Figma), Privacy Policy + Terms verification at memory.wiki/privacy and memory.wiki/terms. Claude-side: open. Candidates include (1) iOS App Store final upload (archive already exported per round 34-45), (2) W13-15 channel updates (Chrome / VSCode / Desktop / CLI / MCP /@<slug> awareness), (3) Bundle collaborators + presence (W14). Awaiting founder direction.