{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"From Reddit to Papr: Feature Mapping","siteUrl":"https://platform.papr.ai","description":"Papr Memory is an AI-native memory layer that lets developers add production-ready memory to their AI agents and apps with just a few lines of code."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"from-reddit-to-papr-feature-mapping"},"children":["From Reddit to Papr: Feature Mapping"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide maps the \"memory stack\" that Reddit builders converge toward to Papr's built-in capabilities."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-reddit-serious-stack-architecture"},"children":["The Reddit \"Serious Stack\" Architecture"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Based on threads like ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://www.reddit.com/r/micro_saas/comments/1r2eew5/hippocampai_v050_is_live_ai_memory_just_got_a/"},"children":["HippocampAI"]}," and ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://www.reddit.com/r/LocalLLaMA/comments/1r3911p/i_studied_how_human_memory_works_for_2_years/"},"children":["LocalLLaMA"]},", the community consensus for production-grade memory is:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"1. Event Log (SQLite/Postgres) - Transparent, debuggable storage\n2. Vector Search (Pinecone/Weaviate) - Semantic similarity\n3. Keyword Search (BM25/FTS5) - Exact token matching\n4. Knowledge Graph (Neo4j/custom) - Real relationships\n5. Fusion Layer (RRF) - Combine results from 1-4\n6. Scoring Layer - Recency, importance, feedback signals\n7. Consolidation Jobs (Airflow/cron) - Episodes → Facts\n8. ACL System - Multi-tenant isolation\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Problem"]},": Managing 8 systems + orchestration logic"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr"]},": All of the above in one API"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"component-by-component-mapping"},"children":["Component-by-Component Mapping"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1.-event-log-transparent-storage"},"children":["1. Event Log (Transparent Storage)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Store everything in SQLite for debugging\ndb.execute(\"\"\"\n    CREATE TABLE events (\n        id INTEGER PRIMARY KEY,\n        content TEXT,\n        user_id TEXT,\n        timestamp DATETIME,\n        metadata JSON\n    )\n\"\"\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Direct Memory API - explicit storage with full control\nclient.memory.add(\n    content=\"User prefers email notifications\",\n    metadata={\n        \"external_user_id\": \"user_123\",\n        \"timestamp\": \"2024-03-21T10:00:00Z\",\n        \"source\": \"preferences\"\n    }\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Same transparency, plus automatic indexing and retrieval optimization"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2.-vector-search-semantic-similarity"},"children":["2. Vector Search (Semantic Similarity)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Add Pinecone/Weaviate for semantic search\nembedding = model.encode(query)\nresults = pinecone.query(embedding, top_k=10)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Built-in semantic search\nresults = client.memory.search(\n    query=\"notification preferences\",  # Automatically embedded\n    max_memories=10\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": No separate vector DB to manage, embeddings handled automatically"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3.-keyword-search-bm25/fts5"},"children":["3. Keyword Search (BM25/FTS5)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Add FTS5 for keyword matching\ndb.execute(\"\"\"\n    CREATE VIRTUAL TABLE events_fts \n    USING fts5(content, user_id)\n\"\"\")\nkeyword_results = db.execute(\n    \"SELECT * FROM events_fts WHERE content MATCH ?\",\n    query\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Hybrid retrieval includes keyword matching\nresults = client.memory.search(\n    query=\"email notification\",  # Matches exact tokens + semantics\n    enable_agentic_graph=True\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Keyword + semantic + graph in one query (no manual fusion)"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4.-knowledge-graph-real-relationships"},"children":["4. Knowledge Graph (Real Relationships)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Add Neo4j for relationships\nneo4j.execute(\"\"\"\n    CREATE (u:User {id: 'user_123'})\n    CREATE (p:Preference {type: 'notification', value: 'email'})\n    CREATE (u)-[:HAS_PREFERENCE]->(p)\n\"\"\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Automatic entity extraction and linking\nclient.memory.add(\n    content=\"User prefers email notifications\",\n    memory_policy={\"mode\": \"auto\"}  # Auto-extracts: User -[HAS_PREFERENCE]-> Notification\n)\n\n# Query with GraphQL\ninsights = client.graphql.query(\"\"\"\n    query {\n        user(id: \"user_123\") {\n            preferences { type, value }\n        }\n    }\n\"\"\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Automatic extraction, no manual graph construction"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5.-fusion-layer-reciprocal-rank-fusion"},"children":["5. Fusion Layer (Reciprocal Rank Fusion)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Manually combine results from vector + keyword + graph\ndef reciprocal_rank_fusion(results_lists, k=60):\n    scores = {}\n    for results in results_lists:\n        for rank, item in enumerate(results, 1):\n            scores[item] = scores.get(item, 0) + 1 / (k + rank)\n    return sorted(scores.items(), key=lambda x: x[1], reverse=True)\n\n# Combine 3 result sets\nkeyword_results = bm25_search(query)\nvector_results = pinecone_search(query)\ngraph_results = neo4j_traverse(entities)\nfinal = reciprocal_rank_fusion([keyword_results, vector_results, graph_results])\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Automatic fusion of all retrieval methods\nresults = client.memory.search(\n    query=\"notification preferences\",\n    enable_agentic_graph=True  # Fuses keyword + vector + graph automatically\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Intelligent ranking without manual fusion logic"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"6.-scoring-layer-recency-importance-feedback"},"children":["6. Scoring Layer (Recency, Importance, Feedback)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Add custom scoring\ndef score_results(results):\n    for r in results:\n        # Recency decay\n        days_old = (now - r.timestamp).days\n        r.score *= 0.95 ** days_old\n        \n        # Importance boost\n        if r.feedback_type == \"thumbs_up\":\n            r.score *= 1.5\n        \n        # Hotness (access frequency)\n        r.score *= math.log(1 + r.access_count)\n    \n    return sorted(results, key=lambda x: x.score, reverse=True)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Built-in predictive scoring\nresults = client.memory.search(\n    query=\"notification preferences\",\n    enable_agentic_graph=True\n)\n# Scoring formula (automatic):\n# predicted_importance = 0.6 × vector_similarity \n#                      + 0.3 × transition_probability \n#                      + 0.2 × normalized_hotness\n\n# Provide feedback to improve scoring\nclient.feedback.submit(\n    search_id=results.search_id,\n    feedback_data={\"feedback_type\": \"thumbs_up\"}\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Research-backed scoring that improves with usage"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"7.-consolidation-jobs-episodes--facts"},"children":["7. Consolidation Jobs (Episodes → Facts)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Cron job: Consolidate repeated patterns\n@cron.schedule(\"0 2 * * *\")  # 2am daily\ndef consolidate_memories():\n    # Find repeated interactions\n    for user in users:\n        events = db.get_events(user, last_7_days)\n        \n        # Custom summarization logic\n        if \"notification\" in events.frequent_topics():\n            summary = summarize_preferences(events)\n            db.store_consolidated_fact(user, summary)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Automatic analysis (background)\nclient.messages.store(\n    content=\"I prefer email notifications\",\n    role=\"user\",\n    session_id=\"session_123\",\n    process_messages=True  # Triggers background analysis\n)\n\n# Later retrieval returns consolidated facts, not raw events\nresults = client.memory.search(\n    query=\"What are the user's notification preferences?\",\n    enable_agentic_graph=True\n)\n# Returns: Consolidated preference, not individual messages\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Automatic consolidation without cron jobs"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"8.-acl-system-multi-tenant-isolation"},"children":["8. ACL System (Multi-Tenant Isolation)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reddit approach"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Manual tenant filtering (error-prone)\ndef get_memories(query, user_id, org_id):\n    results = db.execute(\"\"\"\n        SELECT * FROM memories \n        WHERE org_id = ? AND user_id = ?  # Easy to forget!\n        AND content MATCH ?\n    \"\"\", org_id, user_id, query)\n    return results\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr equivalent"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Built-in namespace isolation\nclient.memory.search(\n    query=\"preferences\",\n    organization_id=\"org_123\",\n    namespace_id=\"customer_456\"\n    # Can't query across namespaces - enforced at API level\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you get"]},": Guaranteed isolation, no manual filtering"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"full-stack-comparison"},"children":["Full Stack Comparison"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"reddit-serious-stack-diy"},"children":["Reddit \"Serious Stack\" (DIY)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# 1. Store in SQLite\ndb.execute(\"INSERT INTO events ...\")\n\n# 2. Generate embedding\nembedding = model.encode(content)\n\n# 3. Index in Pinecone\npinecone.upsert(embedding)\n\n# 4. Update FTS5 index\ndb.execute(\"INSERT INTO events_fts ...\")\n\n# 5. Extract entities\nentities = ner_model(content)\n\n# 6. Create graph relationships\nfor entity in entities:\n    neo4j.create(entity)\n\n# 7. At query time: Retrieve from 3 sources\nkeyword = db.execute(\"SELECT * FROM events_fts WHERE content MATCH ?\")\nvector = pinecone.query(query_embedding)\ngraph = neo4j.traverse(entities)\n\n# 8. Manually fuse results\nfinal = reciprocal_rank_fusion([keyword, vector, graph])\n\n# 9. Apply custom scoring\nscored = apply_scoring(final, recency_weight, importance_weight)\n\n# 10. Filter by tenant\nfiltered = [r for r in scored if r.org_id == org_id]\n\nreturn filtered\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Systems to manage"]},": SQLite, Pinecone, Neo4j, Embedding model, Fusion logic, Scoring logic, ACL middleware"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Lines of code"]},": ~500-1000+ for a production system"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"papr-equivalent"},"children":["Papr Equivalent"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Store (automatic indexing, entity extraction, graph creation)\nclient.messages.store(\n    content=\"I prefer email notifications\",\n    session_id=\"session_123\",\n    external_user_id=\"user_123\",\n    process_messages=True\n)\n\n# Retrieve (automatic fusion, scoring, filtering)\nresults = client.memory.search(\n    query=\"notification preferences\",\n    external_user_id=\"user_123\",\n    enable_agentic_graph=True,\n    organization_id=\"org_123\"\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Systems to manage"]},": 1 (Papr API)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Lines of code"]},": ~10-20 for equivalent functionality"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"advanced-features-comparison"},"children":["Advanced Features Comparison"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Feature"},"children":["Feature"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Reddit DIY Approach"},"children":["Reddit DIY Approach"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Papr Built-In"},"children":["Papr Built-In"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Predictive Caching"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom ML model + Redis"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Built-in (<150ms when cached)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Multi-hop Graph Traversal"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Manual Cypher queries"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Automatic with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enable_agentic_graph=true"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Token Optimization"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom compression logic"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["response_format=toon"]}," (30-60% reduction)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Memory Drift Detection"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom monitoring + alerts"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Graph provenance + GraphQL conflict resolution"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cross-session Coherence"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Manual session linking"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Automatic entity linking across sessions"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Procedural Memory"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom tagging + retrieval"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["role=\"assistant\""]}," + automatic categorization"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Feedback Loop"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom analytics pipeline"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Built-in feedback API + learning"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Schema Validation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom validators"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["memory_policy"]}," + custom schemas"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"real-world-example-customer-support-agent"},"children":["Real-World Example: Customer Support Agent"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"reddit-diy-stack"},"children":["Reddit DIY Stack"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Store interaction\ndb.execute(\"INSERT INTO interactions (user_id, content, timestamp) VALUES (?, ?, ?)\")\nembedding = model.encode(content)\npinecone.upsert(embedding)\nentities = ner.extract(content)\nfor e in entities:\n    neo4j.create(e)\n\n# Retrieve for next interaction (3 weeks later)\nquery_embedding = model.encode(\"What did we discuss about billing?\")\nvector_results = pinecone.query(query_embedding, top_k=10)\nkeyword_results = db.execute(\"SELECT * FROM interactions_fts WHERE content MATCH 'billing'\")\ngraph_results = neo4j.query(\"\"\"\n    MATCH (u:User {id: 'user_123'})-[*1..2]-(n)\n    WHERE n.content CONTAINS 'billing'\n    RETURN n\n\"\"\")\n\n# Fuse and rank\ncombined = reciprocal_rank_fusion([vector_results, keyword_results, graph_results])\nscored = apply_recency_boost(combined)\ntop_10 = scored[:10]\n\n# Consolidate (manual job)\nif len(user_interactions) > 100:\n    summary = llm.summarize(user_interactions)\n    db.execute(\"INSERT INTO consolidated_facts ...\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"papr"},"children":["Papr"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Store interaction\nclient.messages.store(\n    content=\"I want to update my billing information\",\n    session_id=\"support_123\",\n    external_user_id=\"user_123\",\n    process_messages=True  # Auto-extracts: Billing, Update Request\n)\n\n# Retrieve for next interaction (3 weeks later)\nresults = client.memory.search(\n    query=\"What did we discuss about billing?\",\n    external_user_id=\"user_123\",\n    enable_agentic_graph=True  # Auto-fuses keyword + vector + graph\n)\n# Returns: Consolidated context including:\n# - Original billing discussion\n# - Related account information\n# - Previous billing changes\n# - Connected support tickets\n# All ranked by predicted relevance\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"migration-path-from-diy-to-papr"},"children":["Migration Path from DIY to Papr"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you've already built a DIY stack:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-parallel-run"},"children":["Step 1: Parallel Run"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Keep existing system running\nexisting_store(content)\n\n# Start populating Papr\nclient.memory.add(content, metadata=existing_metadata)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-2-compare-results"},"children":["Step 2: Compare Results"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Compare retrieval quality\nexisting_results = your_retrieval_pipeline(query)\npapr_results = client.memory.search(query, enable_agentic_graph=True)\n\n# Measure accuracy, latency, relevance\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-3-gradual-migration"},"children":["Step 3: Gradual Migration"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Route queries based on confidence\nif query_type == \"simple\":\n    results = existing_system(query)\nelse:\n    results = papr_search(query)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-4-full-cutover"},"children":["Step 4: Full Cutover"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Replace DIY stack with Papr\nresults = client.memory.search(query, enable_agentic_graph=True)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"cost-comparison"},"children":["Cost Comparison"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"diy-stack-monthly-costs-10000-users-1m-memories"},"children":["DIY Stack Monthly Costs (10,000 users, 1M memories)"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Service"},"children":["Service"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Monthly Cost"},"children":["Monthly Cost"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Pinecone (vector storage)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$70-140"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Neo4j (graph database)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$200-500"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["AWS RDS (SQLite/Postgres)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$50-100"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Compute (API servers)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$200-400"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Monitoring"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$50-100"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Engineering time"]}," (maintenance)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["$10,000-20,000"]}," (0.5-1 FTE)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["$10,570-21,240/month"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"papr-cloud"},"children":["Papr Cloud"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Plan"},"children":["Plan"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Monthly Cost"},"children":["Monthly Cost"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Free (10K memories)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$0"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Pro (1M memories)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["$99"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Engineering time"]}," (maintenance)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["$0"]}," (managed service)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["$99/month"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Savings"]},": $10,471-21,141/month (99% cost reduction)"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps"},"children":["Next Steps"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ready to switch from DIY?"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/quickstart"},"children":["Quick Start"]}," - Get running in 15 minutes"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"#"},"children":["Migration Guide"]}," - Step-by-step transition plan"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/concepts/architecture"},"children":["Architecture Deep Dive"]}," - Understand how Papr implements the stack"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Still evaluating?"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/overview/why-papr"},"children":["Why Papr"]}," - Detailed comparison"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"#"},"children":["When Do You Need Papr"]}," - Decision tree"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://calendly.com/amirkabbara/30min"},"children":["Talk to Us"]}," - Discuss your use case"]}]}]},"headings":[{"value":"From Reddit to Papr: Feature Mapping","id":"from-reddit-to-papr-feature-mapping","depth":1},{"value":"The Reddit \"Serious Stack\" Architecture","id":"the-reddit-serious-stack-architecture","depth":2},{"value":"Component-by-Component Mapping","id":"component-by-component-mapping","depth":2},{"value":"1. Event Log (Transparent Storage)","id":"1.-event-log-transparent-storage","depth":3},{"value":"2. Vector Search (Semantic Similarity)","id":"2.-vector-search-semantic-similarity","depth":3},{"value":"3. Keyword Search (BM25/FTS5)","id":"3.-keyword-search-bm25/fts5","depth":3},{"value":"4. Knowledge Graph (Real Relationships)","id":"4.-knowledge-graph-real-relationships","depth":3},{"value":"5. Fusion Layer (Reciprocal Rank Fusion)","id":"5.-fusion-layer-reciprocal-rank-fusion","depth":3},{"value":"6. Scoring Layer (Recency, Importance, Feedback)","id":"6.-scoring-layer-recency-importance-feedback","depth":3},{"value":"7. Consolidation Jobs (Episodes → Facts)","id":"7.-consolidation-jobs-episodes--facts","depth":3},{"value":"8. ACL System (Multi-Tenant Isolation)","id":"8.-acl-system-multi-tenant-isolation","depth":3},{"value":"Full Stack Comparison","id":"full-stack-comparison","depth":2},{"value":"Reddit \"Serious Stack\" (DIY)","id":"reddit-serious-stack-diy","depth":3},{"value":"Papr Equivalent","id":"papr-equivalent","depth":3},{"value":"Advanced Features Comparison","id":"advanced-features-comparison","depth":2},{"value":"Real-World Example: Customer Support Agent","id":"real-world-example-customer-support-agent","depth":2},{"value":"Reddit DIY Stack","id":"reddit-diy-stack","depth":3},{"value":"Papr","id":"papr","depth":3},{"value":"Migration Path from DIY to Papr","id":"migration-path-from-diy-to-papr","depth":2},{"value":"Step 1: Parallel Run","id":"step-1-parallel-run","depth":3},{"value":"Step 2: Compare Results","id":"step-2-compare-results","depth":3},{"value":"Step 3: Gradual Migration","id":"step-3-gradual-migration","depth":3},{"value":"Step 4: Full Cutover","id":"step-4-full-cutover","depth":3},{"value":"Cost Comparison","id":"cost-comparison","depth":2},{"value":"DIY Stack Monthly Costs (10,000 users, 1M memories)","id":"diy-stack-monthly-costs-10000-users-1m-memories","depth":3},{"value":"Papr Cloud","id":"papr-cloud","depth":3},{"value":"Next Steps","id":"next-steps","depth":2}],"frontmatter":{"title":"From Reddit to Papr - Feature Mapping","seo":{"title":"From Reddit to Papr: Feature Mapping"}},"lastModified":"2026-04-22T01:40:48.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/overview/reddit-to-papr","userData":{"isAuthenticated":false,"teams":["anonymous"]}}