Signed-off-by: phernandez <paul@basicmachines.co> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
6.6 KiB
SPEC-LOCAL-PLUS-PUBLISH: Local+ Published Notes and Privacy Tiers
Status: Draft
Date: 2026-02-14
Owner: Basic Memory
Summary
Add a paid Local+ feature that lets users publish selected notes to shareable URLs while keeping the main knowledge base local-first. Use this as a product wedge for users who do not want full cloud hosting but do want collaboration and distribution features.
This spec also captures a practical position on "zero knowledge" for Local+.
Context
Basic Memory already has strong local-first primitives and optional cloud routing/sync. A recurring request is:
- keep knowledge local by default,
- pay for selective value-add,
- share specific outputs externally.
Published Notes fits this model: explicit per-note opt-in, reversible, and easy to understand.
Goals
- Provide an Obsidian Publish-style sharing experience for selected notes.
- Keep local markdown files as source of truth.
- Make sharing compatible with current cloud/auth/billing primitives.
- Define clear Local+ packaging that does not degrade OSS local workflows.
- Document zero-knowledge constraints so product decisions are explicit.
Non-Goals
- Full hosted editing for all notes (Cloud Full remains separate).
- Public website builder/CMS features.
- Strict cryptographic zero-knowledge server processing for MCP/search in v1.
Local+ Feature Catalog (Sellable)
Core Local+ candidates:
- Published Notes (share URL, revoke, expiry, password).
- Snapshot Time Machine (point-in-time restore for local projects).
- Recovery Drill Reports (automated restore verification).
- Device/API Key Governance (per-device keys, revocation, audit trail).
- BYO Storage Orchestration (managed setup for user-owned object storage).
- Semantic Boost Add-on (higher quality retrieval options while files remain source-of-truth).
Team-oriented add-ons:
- Team-owned shared links and domain branding.
- Role-based publish permissions.
- Shared workspace policies for what can be published.
Proposed MVP: Published Notes
User Experience
Per note actions:
- Publish.
- Unpublish.
- Copy URL.
- Regenerate URL.
- Set visibility and controls.
Controls:
- Visibility:
unlisted(default) orpublic. - Optional password gate.
- Optional expiration datetime.
- Optional "disable indexing" flag for public mode.
Behavior:
- Source note remains local markdown.
- Publish is explicit opt-in per note.
- Unpublish removes public access immediately.
- Republish creates a new URL token unless user chooses to keep current URL.
URL Model
- Unlisted share URL: high-entropy token path.
- Public URL: slug path (optional, later phase).
- Team plans can support custom domain mapping in later phase.
Content Model
v1 published page includes:
- Rendered markdown body.
- Optional metadata (title, updated_at).
v1 excludes:
- Full graph traversal expansion.
- Related note auto-discovery on public pages.
Sync Model
- Local file remains canonical.
- Publish stores a rendered snapshot plus metadata in cloud.
- Update path:
- manual "update published version", or
- optional auto-update on note change (plan-gated).
Architecture (v1)
High-Level Flow
- Client selects a note to publish.
- Client sends publish request with note identifier and policy.
- Service resolves note content (local sync artifact or explicit upload payload).
- Service stores published artifact and returns share URL.
Data Model
published_notes
id(uuid)tenant_idorworkspace_idproject_identity_permalink(or stable external_id)share_token(hashed in DB)visibility(unlisted|public)password_hash(nullable)expires_at(nullable)is_activepublished_content(rendered snapshot or reference)published_atupdated_at
API Shape (Draft)
POST /api/published-notesGET /api/published-notesGET /api/published-notes/{id}PATCH /api/published-notes/{id}DELETE /api/published-notes/{id}(unpublish)POST /api/published-notes/{id}/regenerate-urlGET /p/{token}(public resolver)
CLI Shape (Draft)
bm cloud publish <identifier>bm cloud publish listbm cloud publish update <id>bm cloud publish unpublish <id>bm cloud publish rotate-url <id>
Security
- Default to unlisted URLs.
- Store only hashed share tokens.
- Passwords hashed server-side.
- Enforce expiration at request time.
- Log publish/unpublish/rotate events for auditability.
Packaging and Pricing Direction
Suggested split:
- OSS Local: no publish URLs.
- Local+ Solo: publish URLs + snapshots + recovery.
- Local+ Team: solo features + team governance and branding.
- Cloud Full: hosted app + full cloud workflows.
Key message: "Keep everything local. Publish only what you choose."
Rollout Plan
- Phase 1: Unlisted publish URLs + unpublish + regenerate URL.
- Phase 2: Password/expiry controls.
- Phase 3: Auto-update on note change and basic analytics.
- Phase 4: Team branding/domains/policies.
Zero-Knowledge Position
Strict Zero-Knowledge Definition
Strict zero-knowledge means the server cannot decrypt note content at all.
Why This Conflicts with MCP and Search
If server cannot decrypt:
- MCP tool execution against cloud content cannot read/write semantic content.
- Full-text search cannot index plaintext content.
- Semantic/vector search cannot generate or query embeddings on plaintext.
- Server-side relation resolution and context building become severely limited.
This matches earlier findings: strict zero-knowledge materially handicaps MCP-driven behavior and search quality.
Viable Alternatives (Not Strict Zero-Knowledge)
-
Encryption at rest/in transit with server-side decrypt in trusted runtime.
- Preserves MCP/search quality.
- Not zero-knowledge cryptographically.
-
Client-side retrieval mode.
- Keep MCP/search local; cloud is sync/share/backup relay.
- Best for privacy-first users.
- Requires local agent availability for advanced retrieval.
-
Limited encrypted indexing.
- Blind indexes for exact keywords only.
- No high-quality semantic search.
- Usually poor UX for natural-language memory recall.
Recommendation
For Local+:
- Do not promise strict zero-knowledge for cloud MCP/search paths.
- Offer a privacy-first local mode where advanced retrieval stays local.
- Clearly label tradeoffs:
- "Local private mode" (best privacy, best local retrieval).
- "Cloud-assisted mode" (best cross-device/MCP consistency, trusted-runtime decrypt).
This keeps messaging honest and avoids repeating the known incompatibility.