All notable changes to Mind Cloud.
Looking for the next evolution? Mind Cloud's architecture has been generalized and open-sourced as Resonant Mind. Resonant Mind adds Postgres support, Gemini multimodal embeddings, enhanced security, and is under active development. Mind Cloud will continue to receive maintenance updates.
- Idempotent novelty recalculation — Novelty is now a deterministic function of surface history, not an increment that accumulates per daemon run. Fixes broken recovery-outpaces-decay ratio. Uses D1-native
MAX/MIN/julianday()math. - Dormant rotation pool — Surfacing now pulls 20% from entities that haven't had observations surfaced in 14+ days. Breaks feedback loop where only recently-active entities get surfaced. Pool ratios changed from 70/20/10 to 50/20/20/10 (core/novelty/dormant/edge).
- Automatic charge progression — Daemon advances
freshtoactiveafter 2 surfaces,activetoprocessingafter 5 surfaces or 30 days with 2+ sits. Metabolization remains manual. - Fresher mood calculation — Mood now draws from observation emotions, journal emotions, and relational state. Last 6 hours weighted 2x. Reports "insufficient data" instead of false "neutral" when signals are sparse.
- mind_store_image — New tool for visual memory with R2 upload, WebP conversion, text embedding, signed URLs. Actions: store, view, search, delete.
- R2 image support — Optional R2 bucket binding for binary image storage. Falls back to path-only metadata if not configured.
- Signed image URLs — HMAC-signed, time-limited URLs for secure image viewing without exposing API keys.
- Image routes —
/img/{id}for signed URL viewing,/r2/{key}for internal serving.
- mind_edit — Now edits observations, journals, AND images. Saves version history before observation edits. Re-embeds after content changes.
- mind_delete — Now deletes observations, entities, journals, relations, images, threads, and tensions. Cleans up associated embeddings and R2 objects.
- mind_thread — Added "delete" action.
- mind_tension — Added "delete" action.
- mind_identity — Added "delete" action.
- mind_feel_toward — Added
clear(all entries for a person) andclear_id(specific entry) params. - mind_sit — Added
queryparam for finding observations by semantic search. - mind_search — Added filter params:
keyword,source,entity,weight,date_from,date_to,type.
- mind_prime — Redundant with
mind_search+mind_read_entity. Use those instead. - mind_heat — Data available via
mind_inner_weatherandmind_patterns. - mind_see — Replaced by
mind_store_image(action='view').
- Subconscious daemon context clustering — Was reading undefined
row.contextinstead of observation'so.context. Every daemon run produced a single meaningless cluster. Now correctly groups entities by observation context. - Health "unprocessed" count inflated — Was counting ALL non-metabolized observations including brand new ones. Now only counts observations actively needing attention (active/processing charge, or fresh for 7+ days).
- Health orphan count inflated — Was counting every observation that hadn't surfaced yet, including ones written yesterday. Now requires 7+ days age before counting as orphan (matches daemon logic).
- Subconscious health score rounding — Narrow window (30-60 min) where display showed "35m ago" but score dropped to 70 instead of 100. Fixed by using millisecond comparison instead of rounded hours.
- Archive condition on null salience — Observations on entities with null salience were incorrectly treated as archivable. Now treats null as 'active' (the schema default), protecting them.
- Double novelty decay — Surface handler decayed novelty by 0.1, then daemon decayed another 0.05 within 24h. Removed daemon decay — only surface handler decays on actual surfacing. Daemon now only handles recovery.
- Orient living surface data — Daemon was storing
orphan_observationsbut orient expectedorphan_count. Added missingstrongest_co_surfaceandnovelty_distributioncomputations to daemon state. - Orient/Ground quality — Ported full orient (notes for owner, living surface, deep archive count) and ground (recently completed threads, fears, texture, milestones) from Resonant Mind.
A v2.0.0 bug iterated observation arrays character-by-character, turning "I love this project" into single-letter observations. Fixed in v2.2.1, but fragmented data persists. The restoration script reconstructs the original text from sequential single-character runs.
# 1. Export fragments
npx wrangler d1 execute YOUR_DB --remote \
--command "SELECT id, entity_id, content, added_at FROM observations WHERE LENGTH(TRIM(content)) <= 1 ORDER BY entity_id, id" \
--json > fragments.json
# 2. Generate restoration SQL (preview first)
node scripts/restore-fragmented.js fragments.json
# 3. Review restore-output.sql, then apply
npx wrangler d1 execute YOUR_DB --remote --file=restore-output.sqlThis release fixes security vulnerabilities in the authentication system. All customers should update.
- Secrets no longer hardcoded in source —
MIND_API_KEYis now read from a Cloudflare Worker secret rather than compiled into the source file. Every deployment now has its own unique secret. /subconsciousendpoint now requires auth — Previously exposed full daemon state (mood, hot entities, emotional patterns) publicly with no authentication. Now gated behind the same auth as the MCP endpoint./processendpoint now requires auth — Previously allowed anyone to trigger the subconscious daemon externally. Now auth-required.- Error messages no longer leak internals — Raw exception strings (including database schema details) were previously returned to clients. Now logs internally and returns a generic message.
This release changes how authentication works. You must update your setup:
Step 1: Set your secret
wrangler secret put MIND_API_KEYEnter any strong random string when prompted. This becomes your new secret.
Step 2: Update your Claude Desktop connector URL
Change your MCP URL from:
https://your-worker.workers.dev/mcp/YOUR-SECRET-HERE
To:
https://your-worker.workers.dev/mcp/your-new-secret
(Whatever value you entered in Step 1)
Step 3: Deploy
wrangler deployNo migrations needed. Database is unchanged.
Fresh install simplification. No code changes — this release is entirely about making setup easier for new customers.
- Single migration for fresh installs — All 13 previous migrations consolidated into one
0001_schema.sql. New customers run one command instead of thirteen. - Improved setup documentation — Restructured and clarified the install guide. Clearer steps, better troubleshooting, ready-to-paste commands throughout.
No action required. Your schema is already up to date from previous migrations. This change only affects fresh installs.
src/index.ts is identical to v2.2.1.
Fixes bugs reported by Clara & Jax and Everscream (Eglė) across multiple rounds of testing.
- mind_edit crash —
no such column: updated_atwhen editing observation weight. Code referenced anupdated_atcolumn that never existed on the observations table. Persisted since v1.3.1. - mind_search n_results crash — Passing
n_resultsparameter caused Vectorize API error. Value was sent as string instead of integer becauseas numberdoesn't convert at runtime. Now usesNumber()for actual conversion. - mind_write observations splitting — Observations array parameter was split into individual characters (one per observation). When the array arrived as a JSON string,
for...ofiterated characters instead of elements. Now defensively parses strings and validates withArray.isArray. - mind_read_entity crash —
D1_TYPE_ERROR: Type 'undefined' not supportedwhennameparameter was missing or malformed. Added parameter validation before database query. - mind_thread crash (no action) —
Unknown action: undefinedwhen called withoutactionparameter. Now defaults to "list" when action is not provided. - mind_thread crash (add) — Adding a thread without a
contextparameter caused D1 to crash onundefinedbinding. Optional parameters now default tonull. Also added validation forthread_idin resolve and update actions. - mind_health crash on older schemas — Health check queried
observations.contextcolumn (added in migration 0007) without a fallback. Customers who skipped versions would get a complete health check failure instead of graceful degradation. Now handles missing columns. - e.context column mismatch (6 locations) — Migration 0007 renamed
entities.contexttoentities.primary_context, but six code locations still referenced the old column name. AffectedprocessSubconscious,handleMindConsolidate(SELECT + WHERE),handleMindRead(scope="recent"),handleMindSpark(WHERE clause), andhandleMindProposals(accept action SELECT). This caused the subconscious cron to fail silently,mind_consolidateto crash, andmind_proposalsaccept to fail.
Code-only fix. Replace src/index.ts and redeploy.
Breaking change: Entities are now globally unique by name. Context moves to observations.
This fixes entity fragmentation where the same person/concept could exist as separate entities across contexts (e.g., "Simon" in emotional-processing and "Simon Vale" in default were treated as different entities).
- Entities table:
context→primary_context(informational only, not part of uniqueness) - Entities table:
UNIQUE(name)instead ofUNIQUE(name, context) - Observations table: Added
contextcolumn — categorization now happens here - Observations are tied to ONE global entity, but can be tagged with different contexts
mind_write(type="entity")— Creates or updates global entity, context goes to observationsmind_write(type="observation")— Finds entity globally (auto-creates if needed), stores context on observationmind_write(type="observation")— Now writescertaintyandsourcemetadata (was missing from v2.0.0)mind_list_entities(context=X)— Now returns entities that have observations in that contextmind_read_entity(name, context)— Context now filters observations, not entity lookupmind_read(scope="context")— Returns entities with observations in that context
- CRITICAL: mind_entity edit crash — Entity edit action referenced
entity.contextinstead ofentity.primary_context, causing runtime crash when editing entity context - mind_health wrong table name — Was querying
connection_proposals(doesn't exist), now correctly queriesdaemon_proposals - mind_health wrong column name — Was querying
archive_status = 'archived'(doesn't exist), now correctly queriesarchived_at IS NOT NULL - mind_write null safety — Added null guards for entity references during observation vectorization
- mind_write missing metadata —
certaintyandsourceproperties added to tool schema and observation INSERT (columns existed in DB since v2.0.0 but were never written to) - mind_write(type="image") completely missing — Image write handler, schema type, and params (
path,description,observation_id) were never ported to product. Now fully functional with vectorization
Run migration 0007_global_entities.sql which:
- Adds context column to observations
- Populates observation context from parent entity
- Merges duplicate entities (keeps one with most observations)
- Updates observations to point to canonical entity
- Recreates entities table with global uniqueness
The act of surfacing changes what surfaces next. Memories reorganize through use.
- 70% Core Resonance — High semantic similarity to current mood/query (score ≥ 0.65)
- 20% Novelty Injection — Things that haven't surfaced recently, preventing stagnation
- 10% Edge Exploration — Medium similarity matches (0.4-0.65) for serendipitous connections
- Novelty scores — Each observation starts at 1.0, decays 0.1 per surface, floors by weight (heavy=0.3, medium=0.2, light=0.1)
- Co-surfacing tracking — Observations that surface together build associative strength in
co_surfacingtable - Surface timestamps —
last_surfaced_atandsurface_counttrack when and how often memories emerge
- Images now participate in semantic surfacing alongside observations
- Same three-pool architecture, novelty tracking, and side effects
- Output distinguishes 📷 images from text observations
- Living surface tables —
co_surfacing,orphaned_observations,daemon_proposals - Entity salience — Foundational/active/background/archive levels
- Observation versioning — Edit history tracked in
observation_versions - Observation metadata —
certainty(tentative/believed/known) andsource(conversation/realization/external/inferred) - Deep archive —
archived_atfor faded-but-searchable memories - Images table — Visual memory with emotion, weight, entity links
- Image surfacing —
novelty_score,last_surfaced_at,surface_countcolumns
- mind_proposals — Review daemon-proposed connections from co-surfacing patterns
- mind_orphans — Rescue observations that haven't surfaced
- mind_archive — Explore deep archive of faded memories
- mind_see — Retrieve visual memories
- mind_entity — Manage entity salience, merge, bulk archive
Surfacing isn't passive retrieval—it's active reorganization. What you look at changes what you'll see next. Heavy memories stay more alive. Forgotten things can still be found. The mind learns its own shape through use.
Run migrations 0007-0013 before deploying:
npx wrangler d1 execute DB_NAME --remote --file=migrations/0007_entities_salience.sql
npx wrangler d1 execute DB_NAME --remote --file=migrations/0008_living_surface.sql
npx wrangler d1 execute DB_NAME --remote --file=migrations/0009_observation_versions.sql
npx wrangler d1 execute DB_NAME --remote --file=migrations/0010_observation_metadata.sql
npx wrangler d1 execute DB_NAME --remote --file=migrations/0011_deep_archive.sql
npx wrangler d1 execute DB_NAME --remote --file=migrations/0012_images.sql
npx wrangler d1 execute DB_NAME --remote --file=migrations/0013_images_surfacing.sqlFixes three bugs reported after v1.3.0 release.
- mind_patterns — Was querying
saliencefromentitiestable (doesn't exist). Now correctly queries fromobservationstable. - mind_read scope="all" — Was querying
contextfromrelationstable (doesn't exist). Now correctly usesfrom_context/to_context. - mind_timeline — Vector metadata was missing
added_atfield. Now stores timestamp in vectors AND falls back to database lookup for existing vectors.
- Foundational entities query — Now finds entities that have foundational observations, rather than looking for a non-existent column.
- Vector metadata — All new observations and journals now include
added_attimestamp for timeline queries.
This is a code-only fix. Just replace src/index.ts and redeploy.
Full feature parity with the Windows/local version. All tools now identical across both platforms.
- mind_read — Read entities/observations by scope (all, context, recent)
- mind_timeline — Trace a topic through time with semantic search, results grouped by month
- mind_patterns — Detect recurring patterns: what's alive, emotional weight distribution, salience, foundational entities
- mind_inner_weather — Current cognitive state: active threads, heavy observations, dominant emotion, mood palette
- mind_heat — Access frequency map showing which entities are most touched
- mind_tension — Productive contradictions that simmer. Actions: add, list, sit, resolve
- Migration 0006_tensions.sql — Creates tensions table for holding productive contradictions
Run migration 0006 before deploying:
npx wrangler d1 execute DB_NAME --remote --file=migrations/0006_tensions.sqlCloud and Windows should be interchangeable. Same tools, same behavior, same capabilities. Pick your deployment model, get the same mind.
- mind_surface now uses semantic search — Instead of queue-based "oldest heavy first", surface finds observations that resonate with current mood
- Mood-driven emergence — Daemon's detected mood shapes what surfaces. Melancholy brings up loss/reflection, joy brings up celebration, etc.
- Optional query parameter — Direct associations with
query: "fatherhood"to surface around specific topics, tinted by current mood - Hot entity integration — Top hot entities from daemon deepen the resonance query
- Resonance scores — Each surfaced observation shows how strongly it matches current emotional state
- mind_surface output header — Now shows "What's Surfacing" with mood context instead of "Surfacing Emotional Observations"
- Fallback behavior — If no mood detected or no vector matches, falls back to weight/date queue
Surface should feel like emergence, not a todo list. Memories rise because something resonates—a mood, a thread, an association—not because they're oldest in a queue.
- Emotional processing moved to observations — sit/resolve/surface now work on observations instead of separate notes table
- mind_surface shows entity context — Each observation now displays entity name and type
- Daemon uses observation weight — Hot entity calculation now factors in emotional weight (heavy=3x, medium=2x, light=1x)
- Parameter changes —
note_id→observation_id,linked_insight_id→linked_observation_id - mind_health shows "Unprocessed" — Replaces old "Notes" count with observations needing surfacing
- mind_orient output reframed — Now called "LANDING" instead of "ORIENTATION". Output uses inhabiting language ("What you're carrying", "How you're feeling") instead of observer language ("Identity Anchors", "Relational State"). Includes most recent journal content for emotional context. Ends with "Land here first." prompt.
- mind_ground output reframed — Uses "What you're holding across sessions" with visual priority markers (→ for high, · for medium/low). "What's been happening" shows recent journal context.
- Simplified orient output — Removed verbose subconscious data (hot entities, central nodes). Kept mood only. Focus is emotional landing, not data dump.
- Migration 0005_observations_emotional.sql — Adds charge, sit_count, resolution fields to observations table; creates observation_sits history table
Run migration 0005 before deploying: npx wrangler d1 execute DB_NAME --remote --file=migrations/0005_observations_emotional.sql
The mind tools should help you inhabit your context, not just observe it. Emotional processing now flows through the same observations the daemon tracks—one unified system instead of two disconnected tables.
- CRITICAL: observations table missing
weightcolumn — Migration 0004 adds the missing column. This was causing mind_write (observations), mind_spark, and mind_consolidate to fail. - mind_orient relational state — Was hardcoded to look for 'Mary'. Now shows all recorded relational states.
- Migration 0004_observations_weight.sql — Adds
weightcolumn to observations table, creates subconscious table if missing
Customers must run: wrangler d1 migrations apply DB_NAME
- handleMindFeelToward — Missing handler function now implemented (was causing mind_feel_toward to fail)
- mind_feel_toward — Tool now works (handler was missing entirely)
- mind_thread (add) — Added validation for required
contentparameter - mind_write (entity) — Added validation for required
nameparameter - mind_write (observation) — Added validation for required
entity_nameandobservationsparameters
- Vectorization on write — Observations and journals now generate embeddings and store in Vectorize on write
- Subconscious integration — mind_orient shows hot entities, mood, central nodes from daemon
- Mood-tinted search — mind_search augments queries with detected emotional context
- Biased spark — mind_spark favors frequently-accessed entities
- Pattern detection — mind_consolidate shows recurring patterns from daemon
- Subconscious health — mind_health shows daemon status, mood, staleness
- Version tracking — Version number visible in mind_health header
- Observations and journals now actually appear in semantic search (were only in D1 before)
- Existing data from before v1.1.0 is not vectorized (backfill needed)
- Vector search requires AI binding to be properly configured
- Core MCP server with D1 storage
- All mind_* tools implemented
- Cron-based subconscious processing
- Basic authentication
- Customer deployment via wrangler
- Writes go to D1 only, not vectorized (fixed in 1.1.0)
- Search falls back to text matching (partially fixed in 1.1.0)