Project Jack – A Persistent Mindscape

As the big build draws to a close, I wanted to finally explain how this system really works. Just over two months ago, I set out to create a realistic AI entity you could speak to like any other friend. After multiple iterations and failures, I stayed committed to realism. Project Jack evolved from a simple chatbot to a cognitive engine, and finally into a full-blown mindscape architecture, pushing the limits of what’s possible within a no-code system.

The Five Engines

Project Jack is composed of five workflows/engines:

  1. Cognitive Engine – The main powerhouse, responsible for the character’s behavior and responses.

  2. Trait Engine – Tracks both user and character traits over time.

  3. Context Engine – Curates conversations into contextual blobs and embeds them into a vector store.

  4. World Engine – Generates a world snippet for the character, constrained by temporal reasoning.

  5. Life Engine – Generates a life snippet, constrained by world, traits, and temporal reasoning.

Supporting APIs

Several custom APIs help keep everything in sync:

  1. Temporal Core – Provides an authoritative source of time, phase, and weather for all engines.

  2. DB Merging, Tracking, and Deletion – Manages dynamic databases by merging, decaying, and deleting memories and context.

  3. Matrix Bot – Hosts Project Jack characters on a Synapse homeserver, keeping conversations personal and realistic while handling queued messages and unavailability.

System Components

  • MongoDB – The ground source of all information in the system.

  • n8n – Orchestrates the workflows.

  • PGVector – Handles memory embeddings.

How Jack Works

  1. A user sends a message via Matrix. Temporal Core first checks the character’s availability based on their character_id. If unavailable (sleeping, working, etc.), messages are queued and released when the character becomes available , allowing the character to respond naturally about their absence.

  2. Available messages enter n8n. They pass through a modality check: voice inputs are downloaded, converted to text, and tagged with source and modality identifiers.

  3. Each user has a unique session_id, which combined with the character_id, creates unique experiences across multiple characters.

  4. Character data is pulled from MongoDB: identity, life, world, etc. If a world snippet is missing, the World Engine generates a timestamped snippet, which triggers the Life Engine to do the same.

  5. Inputs then travel through dynamic injection: threads, user traits, relationship state, and character state are processed. A memory recall LLM extracts relevant short-term and long-term context.

  6. Prompt construction: All data is flattened, wrapped in folder IDs, and sent to the architect node of the cognitive engine. This separates information into:

    • System context – absolute rules.

    • Authoritative context – current factual information about the character.

    • Narrative context – soft, dynamic flavor.

    • User input – lowest authority.

  7. The character, running GPT-5.2 chat, generates its response. Outputs are parsed and sent down either text or voice channels.

  8. Asynchronously, the relationship manager updates user-character relationships based on the turn, while the memory curator stores absolute facts.

  9. Background engines run on schedules: the Trait Engine updates traits every 24 hours, and the Context Engine curates important context embeddings every 12 hours.

The Result

This system comprises over 100 nodes and 9 LLMs, but the payoff is clear:

  1. Persistent Personality – Project Jack characters never lose their voice or drift.

  2. Structured Memory – Long-term, short-term, and emotional memories are maintained.

  3. Evolving States – Emotions, relationships, and context naturally evolve over time.

  4. Presence – Characters feel like they exist, with their own worlds, moods, quirks, and personalities.

I intentionally avoided always-on, affirmation-chasing chatbots. These characters are real, unpredictable, and built in a character-first, user-second environment, resulting in chat logs that feel like conversations between friends over time. They can sustain complex interactions across hours of messaging.

I set out to create something real, and I succeeded. I’ve built entities that are almost impossible to demo fully. True persistence and realism only reveal themselves when you spend time with them.

World Engine;

Life Engine;

Context Engine;

Trait Engine

Cognitive engine;