[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-tanstack-tanstack-ai-memory-redis":3,"mdc-8s9ede-key":53,"related-org-tanstack-tanstack-ai-memory-redis":1164,"related-repo-tanstack-tanstack-ai-memory-redis":1308},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":48,"sourceUrl":51,"mdContent":52},"tanstack-ai-memory-redis","wire TanStack AI Redis memory adapter","Use when wiring redis() from @tanstack\u002Fai-memory\u002Fredis in production — covers client setup (ioredis or node-redis via fromNodeRedis), the storage model, client-side ranking limits, and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"tanstack","TanStack","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftanstack.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Memory","memory","tag",{"name":17,"slug":18,"type":15},"Agents","agents",{"name":20,"slug":21,"type":15},"Redis","redis",{"name":9,"slug":8,"type":15},2884,"https:\u002F\u002Fgithub.com\u002FTanStack\u002Fai","2026-07-26T06:08:46.026494",null,269,[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,8,44,45,46,47],"ai","ai-agents","ai-sdk","anthropic","chatbot","function-calling","gemini","generative-ai","llm","multimodal","openai","react","solidjs","streaming","svelte","tool-calling","typescript","typescript-sdk","vue",{"repoUrl":24,"stars":23,"forks":27,"topics":49,"description":50},[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,8,44,45,46,47],"🤖 Type-safe, provider-agnostic TypeScript AI SDK for streaming chat, tool calling, agents, and multimodal apps across OpenAI, Anthropic, Gemini, React, Vue, Svelte, and Solid.","https:\u002F\u002Fgithub.com\u002FTanStack\u002Fai\u002Ftree\u002FHEAD\u002Fpackages\u002Fai-memory\u002Fskills\u002Ftanstack-ai-memory-redis","---\nname: tanstack-ai-memory-redis\ndescription: Use when wiring redis() from @tanstack\u002Fai-memory\u002Fredis in production — covers client setup (ioredis or node-redis via fromNodeRedis), the storage model, client-side ranking limits, and troubleshooting.\n---\n\n# Redis Memory Adapter\n\nProduction-grade `recall`\u002F`save` adapter backed by plain Redis (no vector index\nrequired). Ranks client-side (lexical + optional cosine + recency + importance).\n\n## Setup\n\nBring your own Redis client. `ioredis` wires in directly; `redis` (node-redis v4+) needs\na small wrapper.\n\n### Option A: `ioredis`\n\n```ts\nimport Redis from 'ioredis'\nimport { memoryMiddleware } from '@tanstack\u002Fai-memory'\nimport { redis } from '@tanstack\u002Fai-memory\u002Fredis'\n\nconst client = new Redis(process.env.REDIS_URL)\nconst memory = redis({ redis: client, prefix: 'myapp:memory' })\n\nmemoryMiddleware({ adapter: memory, scope })\n```\n\n### Option B: `redis` (node-redis v4+)\n\n```ts\nimport { createClient } from 'redis'\nimport { memoryMiddleware } from '@tanstack\u002Fai-memory'\nimport { redis, fromNodeRedis } from '@tanstack\u002Fai-memory\u002Fredis'\n\nconst client = createClient({ url: process.env.REDIS_URL })\nawait client.connect()\n\nconst memory = redis({\n  redis: fromNodeRedis(client),\n  prefix: 'myapp:memory',\n})\n\nmemoryMiddleware({ adapter: memory, scope })\n```\n\nnode-redis exposes a camelCase API (`sAdd`, `mGet`); `fromNodeRedis` translates it\nto the lowercase `RedisLike` shape. Passing a raw node-redis client without the wrapper\nthrows `client.sadd is not a function`.\n\n`redis()` accepts the same `topK` \u002F `minScore` \u002F `kinds` \u002F `embedder` \u002F `extract` options\nas `inMemory()`.\n\n## Storage model\n\n```text\n{prefix}:record:{id}                                          -> JSON record\n{prefix}:index:{tenantId or _}:{userId or _}:{threadId}       -> Set\u003Cid>\n```\n\n`save` writes the record and adds it to the scope's index set; `recall` loads the set,\nscores, and renders. Scope values are escaped (`:`, `\\`, and `_`) so a delimiter or the\nunset placeholder inside a dim can't collide two scopes.\n\n**Hard cut:** there is no dual-read of older index layouts. If you previously wrote under\na different shape (e.g. without `tenantId`), reindex or wipe — old keys are orphaned.\n\nAlways pass the same `tenantId`\u002F`userId`\u002F`threadId` on write and read: missing optional\ndims become `_`, so omit ≠ \"match any\".\n\n## Ranking limits\n\nRanking is client-side: `recall` loads every record for the scope into Node and scores\nit. Fine up to ~10k records per scope. Beyond that, write a vector-index-aware adapter\nagainst the same `recall`\u002F`save` contract.\n\n## Troubleshooting\n\n- **Records not visible across processes:** ensure every process uses the same\n  `REDIS_URL` and `prefix`.\n- **Malformed JSON rows:** a row whose JSON won't parse is skipped on read and **left in\n  place** (never deleted) — the signal is a one-time `console.warn` per bad id. Fix or\n  delete the offending `{prefix}:record:{id}` key to remediate.\n",{"data":54,"body":55},{"name":4,"description":6},{"type":56,"children":57},"root",[58,67,90,97,117,129,463,476,852,896,951,957,967,1006,1025,1058,1064,1089,1095,1158],{"type":59,"tag":60,"props":61,"children":63},"element","h1",{"id":62},"redis-memory-adapter",[64],{"type":65,"value":66},"text","Redis Memory Adapter",{"type":59,"tag":68,"props":69,"children":70},"p",{},[71,73,80,82,88],{"type":65,"value":72},"Production-grade ",{"type":59,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":65,"value":79},"recall",{"type":65,"value":81},"\u002F",{"type":59,"tag":74,"props":83,"children":85},{"className":84},[],[86],{"type":65,"value":87},"save",{"type":65,"value":89}," adapter backed by plain Redis (no vector index\nrequired). Ranks client-side (lexical + optional cosine + recency + importance).",{"type":59,"tag":91,"props":92,"children":94},"h2",{"id":93},"setup",[95],{"type":65,"value":96},"Setup",{"type":59,"tag":68,"props":98,"children":99},{},[100,102,108,110,115],{"type":65,"value":101},"Bring your own Redis client. ",{"type":59,"tag":74,"props":103,"children":105},{"className":104},[],[106],{"type":65,"value":107},"ioredis",{"type":65,"value":109}," wires in directly; ",{"type":59,"tag":74,"props":111,"children":113},{"className":112},[],[114],{"type":65,"value":21},{"type":65,"value":116}," (node-redis v4+) needs\na small wrapper.",{"type":59,"tag":118,"props":119,"children":121},"h3",{"id":120},"option-a-ioredis",[122,124],{"type":65,"value":123},"Option A: ",{"type":59,"tag":74,"props":125,"children":127},{"className":126},[],[128],{"type":65,"value":107},{"type":59,"tag":130,"props":131,"children":136},"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import Redis from 'ioredis'\nimport { memoryMiddleware } from '@tanstack\u002Fai-memory'\nimport { redis } from '@tanstack\u002Fai-memory\u002Fredis'\n\nconst client = new Redis(process.env.REDIS_URL)\nconst memory = redis({ redis: client, prefix: 'myapp:memory' })\n\nmemoryMiddleware({ adapter: memory, scope })\n","ts","",[137],{"type":59,"tag":74,"props":138,"children":139},{"__ignoreMap":135},[140,179,220,258,268,323,406,414],{"type":59,"tag":141,"props":142,"children":145},"span",{"class":143,"line":144},"line",1,[146,152,158,163,169,174],{"type":59,"tag":141,"props":147,"children":149},{"style":148},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[150],{"type":65,"value":151},"import",{"type":59,"tag":141,"props":153,"children":155},{"style":154},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[156],{"type":65,"value":157}," Redis ",{"type":59,"tag":141,"props":159,"children":160},{"style":148},[161],{"type":65,"value":162},"from",{"type":59,"tag":141,"props":164,"children":166},{"style":165},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[167],{"type":65,"value":168}," '",{"type":59,"tag":141,"props":170,"children":172},{"style":171},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[173],{"type":65,"value":107},{"type":59,"tag":141,"props":175,"children":176},{"style":165},[177],{"type":65,"value":178},"'\n",{"type":59,"tag":141,"props":180,"children":182},{"class":143,"line":181},2,[183,187,192,197,202,207,211,216],{"type":59,"tag":141,"props":184,"children":185},{"style":148},[186],{"type":65,"value":151},{"type":59,"tag":141,"props":188,"children":189},{"style":165},[190],{"type":65,"value":191}," {",{"type":59,"tag":141,"props":193,"children":194},{"style":154},[195],{"type":65,"value":196}," memoryMiddleware",{"type":59,"tag":141,"props":198,"children":199},{"style":165},[200],{"type":65,"value":201}," }",{"type":59,"tag":141,"props":203,"children":204},{"style":148},[205],{"type":65,"value":206}," from",{"type":59,"tag":141,"props":208,"children":209},{"style":165},[210],{"type":65,"value":168},{"type":59,"tag":141,"props":212,"children":213},{"style":171},[214],{"type":65,"value":215},"@tanstack\u002Fai-memory",{"type":59,"tag":141,"props":217,"children":218},{"style":165},[219],{"type":65,"value":178},{"type":59,"tag":141,"props":221,"children":223},{"class":143,"line":222},3,[224,228,232,237,241,245,249,254],{"type":59,"tag":141,"props":225,"children":226},{"style":148},[227],{"type":65,"value":151},{"type":59,"tag":141,"props":229,"children":230},{"style":165},[231],{"type":65,"value":191},{"type":59,"tag":141,"props":233,"children":234},{"style":154},[235],{"type":65,"value":236}," redis",{"type":59,"tag":141,"props":238,"children":239},{"style":165},[240],{"type":65,"value":201},{"type":59,"tag":141,"props":242,"children":243},{"style":148},[244],{"type":65,"value":206},{"type":59,"tag":141,"props":246,"children":247},{"style":165},[248],{"type":65,"value":168},{"type":59,"tag":141,"props":250,"children":251},{"style":171},[252],{"type":65,"value":253},"@tanstack\u002Fai-memory\u002Fredis",{"type":59,"tag":141,"props":255,"children":256},{"style":165},[257],{"type":65,"value":178},{"type":59,"tag":141,"props":259,"children":261},{"class":143,"line":260},4,[262],{"type":59,"tag":141,"props":263,"children":265},{"emptyLinePlaceholder":264},true,[266],{"type":65,"value":267},"\n",{"type":59,"tag":141,"props":269,"children":271},{"class":143,"line":270},5,[272,278,283,288,293,299,304,309,314,318],{"type":59,"tag":141,"props":273,"children":275},{"style":274},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[276],{"type":65,"value":277},"const",{"type":59,"tag":141,"props":279,"children":280},{"style":154},[281],{"type":65,"value":282}," client ",{"type":59,"tag":141,"props":284,"children":285},{"style":165},[286],{"type":65,"value":287},"=",{"type":59,"tag":141,"props":289,"children":290},{"style":165},[291],{"type":65,"value":292}," new",{"type":59,"tag":141,"props":294,"children":296},{"style":295},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[297],{"type":65,"value":298}," Redis",{"type":59,"tag":141,"props":300,"children":301},{"style":154},[302],{"type":65,"value":303},"(process",{"type":59,"tag":141,"props":305,"children":306},{"style":165},[307],{"type":65,"value":308},".",{"type":59,"tag":141,"props":310,"children":311},{"style":154},[312],{"type":65,"value":313},"env",{"type":59,"tag":141,"props":315,"children":316},{"style":165},[317],{"type":65,"value":308},{"type":59,"tag":141,"props":319,"children":320},{"style":154},[321],{"type":65,"value":322},"REDIS_URL)\n",{"type":59,"tag":141,"props":324,"children":326},{"class":143,"line":325},6,[327,331,336,340,344,349,354,359,364,369,374,379,383,387,392,397,401],{"type":59,"tag":141,"props":328,"children":329},{"style":274},[330],{"type":65,"value":277},{"type":59,"tag":141,"props":332,"children":333},{"style":154},[334],{"type":65,"value":335}," memory ",{"type":59,"tag":141,"props":337,"children":338},{"style":165},[339],{"type":65,"value":287},{"type":59,"tag":141,"props":341,"children":342},{"style":295},[343],{"type":65,"value":236},{"type":59,"tag":141,"props":345,"children":346},{"style":154},[347],{"type":65,"value":348},"(",{"type":59,"tag":141,"props":350,"children":351},{"style":165},[352],{"type":65,"value":353},"{",{"type":59,"tag":141,"props":355,"children":357},{"style":356},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[358],{"type":65,"value":236},{"type":59,"tag":141,"props":360,"children":361},{"style":165},[362],{"type":65,"value":363},":",{"type":59,"tag":141,"props":365,"children":366},{"style":154},[367],{"type":65,"value":368}," client",{"type":59,"tag":141,"props":370,"children":371},{"style":165},[372],{"type":65,"value":373},",",{"type":59,"tag":141,"props":375,"children":376},{"style":356},[377],{"type":65,"value":378}," prefix",{"type":59,"tag":141,"props":380,"children":381},{"style":165},[382],{"type":65,"value":363},{"type":59,"tag":141,"props":384,"children":385},{"style":165},[386],{"type":65,"value":168},{"type":59,"tag":141,"props":388,"children":389},{"style":171},[390],{"type":65,"value":391},"myapp:memory",{"type":59,"tag":141,"props":393,"children":394},{"style":165},[395],{"type":65,"value":396},"'",{"type":59,"tag":141,"props":398,"children":399},{"style":165},[400],{"type":65,"value":201},{"type":59,"tag":141,"props":402,"children":403},{"style":154},[404],{"type":65,"value":405},")\n",{"type":59,"tag":141,"props":407,"children":409},{"class":143,"line":408},7,[410],{"type":59,"tag":141,"props":411,"children":412},{"emptyLinePlaceholder":264},[413],{"type":65,"value":267},{"type":59,"tag":141,"props":415,"children":417},{"class":143,"line":416},8,[418,423,427,431,436,440,445,449,454,459],{"type":59,"tag":141,"props":419,"children":420},{"style":295},[421],{"type":65,"value":422},"memoryMiddleware",{"type":59,"tag":141,"props":424,"children":425},{"style":154},[426],{"type":65,"value":348},{"type":59,"tag":141,"props":428,"children":429},{"style":165},[430],{"type":65,"value":353},{"type":59,"tag":141,"props":432,"children":433},{"style":356},[434],{"type":65,"value":435}," adapter",{"type":59,"tag":141,"props":437,"children":438},{"style":165},[439],{"type":65,"value":363},{"type":59,"tag":141,"props":441,"children":442},{"style":154},[443],{"type":65,"value":444}," memory",{"type":59,"tag":141,"props":446,"children":447},{"style":165},[448],{"type":65,"value":373},{"type":59,"tag":141,"props":450,"children":451},{"style":154},[452],{"type":65,"value":453}," scope ",{"type":59,"tag":141,"props":455,"children":456},{"style":165},[457],{"type":65,"value":458},"}",{"type":59,"tag":141,"props":460,"children":461},{"style":154},[462],{"type":65,"value":405},{"type":59,"tag":118,"props":464,"children":466},{"id":465},"option-b-redis-node-redis-v4",[467,469,474],{"type":65,"value":468},"Option B: ",{"type":59,"tag":74,"props":470,"children":472},{"className":471},[],[473],{"type":65,"value":21},{"type":65,"value":475}," (node-redis v4+)",{"type":59,"tag":130,"props":477,"children":479},{"className":132,"code":478,"language":134,"meta":135,"style":135},"import { createClient } from 'redis'\nimport { memoryMiddleware } from '@tanstack\u002Fai-memory'\nimport { redis, fromNodeRedis } from '@tanstack\u002Fai-memory\u002Fredis'\n\nconst client = createClient({ url: process.env.REDIS_URL })\nawait client.connect()\n\nconst memory = redis({\n  redis: fromNodeRedis(client),\n  prefix: 'myapp:memory',\n})\n\nmemoryMiddleware({ adapter: memory, scope })\n",[480],{"type":59,"tag":74,"props":481,"children":482},{"__ignoreMap":135},[483,519,554,598,605,671,697,704,732,759,788,800,808],{"type":59,"tag":141,"props":484,"children":485},{"class":143,"line":144},[486,490,494,499,503,507,511,515],{"type":59,"tag":141,"props":487,"children":488},{"style":148},[489],{"type":65,"value":151},{"type":59,"tag":141,"props":491,"children":492},{"style":165},[493],{"type":65,"value":191},{"type":59,"tag":141,"props":495,"children":496},{"style":154},[497],{"type":65,"value":498}," createClient",{"type":59,"tag":141,"props":500,"children":501},{"style":165},[502],{"type":65,"value":201},{"type":59,"tag":141,"props":504,"children":505},{"style":148},[506],{"type":65,"value":206},{"type":59,"tag":141,"props":508,"children":509},{"style":165},[510],{"type":65,"value":168},{"type":59,"tag":141,"props":512,"children":513},{"style":171},[514],{"type":65,"value":21},{"type":59,"tag":141,"props":516,"children":517},{"style":165},[518],{"type":65,"value":178},{"type":59,"tag":141,"props":520,"children":521},{"class":143,"line":181},[522,526,530,534,538,542,546,550],{"type":59,"tag":141,"props":523,"children":524},{"style":148},[525],{"type":65,"value":151},{"type":59,"tag":141,"props":527,"children":528},{"style":165},[529],{"type":65,"value":191},{"type":59,"tag":141,"props":531,"children":532},{"style":154},[533],{"type":65,"value":196},{"type":59,"tag":141,"props":535,"children":536},{"style":165},[537],{"type":65,"value":201},{"type":59,"tag":141,"props":539,"children":540},{"style":148},[541],{"type":65,"value":206},{"type":59,"tag":141,"props":543,"children":544},{"style":165},[545],{"type":65,"value":168},{"type":59,"tag":141,"props":547,"children":548},{"style":171},[549],{"type":65,"value":215},{"type":59,"tag":141,"props":551,"children":552},{"style":165},[553],{"type":65,"value":178},{"type":59,"tag":141,"props":555,"children":556},{"class":143,"line":222},[557,561,565,569,573,578,582,586,590,594],{"type":59,"tag":141,"props":558,"children":559},{"style":148},[560],{"type":65,"value":151},{"type":59,"tag":141,"props":562,"children":563},{"style":165},[564],{"type":65,"value":191},{"type":59,"tag":141,"props":566,"children":567},{"style":154},[568],{"type":65,"value":236},{"type":59,"tag":141,"props":570,"children":571},{"style":165},[572],{"type":65,"value":373},{"type":59,"tag":141,"props":574,"children":575},{"style":154},[576],{"type":65,"value":577}," fromNodeRedis",{"type":59,"tag":141,"props":579,"children":580},{"style":165},[581],{"type":65,"value":201},{"type":59,"tag":141,"props":583,"children":584},{"style":148},[585],{"type":65,"value":206},{"type":59,"tag":141,"props":587,"children":588},{"style":165},[589],{"type":65,"value":168},{"type":59,"tag":141,"props":591,"children":592},{"style":171},[593],{"type":65,"value":253},{"type":59,"tag":141,"props":595,"children":596},{"style":165},[597],{"type":65,"value":178},{"type":59,"tag":141,"props":599,"children":600},{"class":143,"line":260},[601],{"type":59,"tag":141,"props":602,"children":603},{"emptyLinePlaceholder":264},[604],{"type":65,"value":267},{"type":59,"tag":141,"props":606,"children":607},{"class":143,"line":270},[608,612,616,620,624,628,632,637,641,646,650,654,658,663,667],{"type":59,"tag":141,"props":609,"children":610},{"style":274},[611],{"type":65,"value":277},{"type":59,"tag":141,"props":613,"children":614},{"style":154},[615],{"type":65,"value":282},{"type":59,"tag":141,"props":617,"children":618},{"style":165},[619],{"type":65,"value":287},{"type":59,"tag":141,"props":621,"children":622},{"style":295},[623],{"type":65,"value":498},{"type":59,"tag":141,"props":625,"children":626},{"style":154},[627],{"type":65,"value":348},{"type":59,"tag":141,"props":629,"children":630},{"style":165},[631],{"type":65,"value":353},{"type":59,"tag":141,"props":633,"children":634},{"style":356},[635],{"type":65,"value":636}," url",{"type":59,"tag":141,"props":638,"children":639},{"style":165},[640],{"type":65,"value":363},{"type":59,"tag":141,"props":642,"children":643},{"style":154},[644],{"type":65,"value":645}," process",{"type":59,"tag":141,"props":647,"children":648},{"style":165},[649],{"type":65,"value":308},{"type":59,"tag":141,"props":651,"children":652},{"style":154},[653],{"type":65,"value":313},{"type":59,"tag":141,"props":655,"children":656},{"style":165},[657],{"type":65,"value":308},{"type":59,"tag":141,"props":659,"children":660},{"style":154},[661],{"type":65,"value":662},"REDIS_URL ",{"type":59,"tag":141,"props":664,"children":665},{"style":165},[666],{"type":65,"value":458},{"type":59,"tag":141,"props":668,"children":669},{"style":154},[670],{"type":65,"value":405},{"type":59,"tag":141,"props":672,"children":673},{"class":143,"line":325},[674,679,683,687,692],{"type":59,"tag":141,"props":675,"children":676},{"style":148},[677],{"type":65,"value":678},"await",{"type":59,"tag":141,"props":680,"children":681},{"style":154},[682],{"type":65,"value":368},{"type":59,"tag":141,"props":684,"children":685},{"style":165},[686],{"type":65,"value":308},{"type":59,"tag":141,"props":688,"children":689},{"style":295},[690],{"type":65,"value":691},"connect",{"type":59,"tag":141,"props":693,"children":694},{"style":154},[695],{"type":65,"value":696},"()\n",{"type":59,"tag":141,"props":698,"children":699},{"class":143,"line":408},[700],{"type":59,"tag":141,"props":701,"children":702},{"emptyLinePlaceholder":264},[703],{"type":65,"value":267},{"type":59,"tag":141,"props":705,"children":706},{"class":143,"line":416},[707,711,715,719,723,727],{"type":59,"tag":141,"props":708,"children":709},{"style":274},[710],{"type":65,"value":277},{"type":59,"tag":141,"props":712,"children":713},{"style":154},[714],{"type":65,"value":335},{"type":59,"tag":141,"props":716,"children":717},{"style":165},[718],{"type":65,"value":287},{"type":59,"tag":141,"props":720,"children":721},{"style":295},[722],{"type":65,"value":236},{"type":59,"tag":141,"props":724,"children":725},{"style":154},[726],{"type":65,"value":348},{"type":59,"tag":141,"props":728,"children":729},{"style":165},[730],{"type":65,"value":731},"{\n",{"type":59,"tag":141,"props":733,"children":735},{"class":143,"line":734},9,[736,741,745,749,754],{"type":59,"tag":141,"props":737,"children":738},{"style":356},[739],{"type":65,"value":740},"  redis",{"type":59,"tag":141,"props":742,"children":743},{"style":165},[744],{"type":65,"value":363},{"type":59,"tag":141,"props":746,"children":747},{"style":295},[748],{"type":65,"value":577},{"type":59,"tag":141,"props":750,"children":751},{"style":154},[752],{"type":65,"value":753},"(client)",{"type":59,"tag":141,"props":755,"children":756},{"style":165},[757],{"type":65,"value":758},",\n",{"type":59,"tag":141,"props":760,"children":762},{"class":143,"line":761},10,[763,768,772,776,780,784],{"type":59,"tag":141,"props":764,"children":765},{"style":356},[766],{"type":65,"value":767},"  prefix",{"type":59,"tag":141,"props":769,"children":770},{"style":165},[771],{"type":65,"value":363},{"type":59,"tag":141,"props":773,"children":774},{"style":165},[775],{"type":65,"value":168},{"type":59,"tag":141,"props":777,"children":778},{"style":171},[779],{"type":65,"value":391},{"type":59,"tag":141,"props":781,"children":782},{"style":165},[783],{"type":65,"value":396},{"type":59,"tag":141,"props":785,"children":786},{"style":165},[787],{"type":65,"value":758},{"type":59,"tag":141,"props":789,"children":791},{"class":143,"line":790},11,[792,796],{"type":59,"tag":141,"props":793,"children":794},{"style":165},[795],{"type":65,"value":458},{"type":59,"tag":141,"props":797,"children":798},{"style":154},[799],{"type":65,"value":405},{"type":59,"tag":141,"props":801,"children":803},{"class":143,"line":802},12,[804],{"type":59,"tag":141,"props":805,"children":806},{"emptyLinePlaceholder":264},[807],{"type":65,"value":267},{"type":59,"tag":141,"props":809,"children":811},{"class":143,"line":810},13,[812,816,820,824,828,832,836,840,844,848],{"type":59,"tag":141,"props":813,"children":814},{"style":295},[815],{"type":65,"value":422},{"type":59,"tag":141,"props":817,"children":818},{"style":154},[819],{"type":65,"value":348},{"type":59,"tag":141,"props":821,"children":822},{"style":165},[823],{"type":65,"value":353},{"type":59,"tag":141,"props":825,"children":826},{"style":356},[827],{"type":65,"value":435},{"type":59,"tag":141,"props":829,"children":830},{"style":165},[831],{"type":65,"value":363},{"type":59,"tag":141,"props":833,"children":834},{"style":154},[835],{"type":65,"value":444},{"type":59,"tag":141,"props":837,"children":838},{"style":165},[839],{"type":65,"value":373},{"type":59,"tag":141,"props":841,"children":842},{"style":154},[843],{"type":65,"value":453},{"type":59,"tag":141,"props":845,"children":846},{"style":165},[847],{"type":65,"value":458},{"type":59,"tag":141,"props":849,"children":850},{"style":154},[851],{"type":65,"value":405},{"type":59,"tag":68,"props":853,"children":854},{},[855,857,863,865,871,873,879,881,887,889,895],{"type":65,"value":856},"node-redis exposes a camelCase API (",{"type":59,"tag":74,"props":858,"children":860},{"className":859},[],[861],{"type":65,"value":862},"sAdd",{"type":65,"value":864},", ",{"type":59,"tag":74,"props":866,"children":868},{"className":867},[],[869],{"type":65,"value":870},"mGet",{"type":65,"value":872},"); ",{"type":59,"tag":74,"props":874,"children":876},{"className":875},[],[877],{"type":65,"value":878},"fromNodeRedis",{"type":65,"value":880}," translates it\nto the lowercase ",{"type":59,"tag":74,"props":882,"children":884},{"className":883},[],[885],{"type":65,"value":886},"RedisLike",{"type":65,"value":888}," shape. Passing a raw node-redis client without the wrapper\nthrows ",{"type":59,"tag":74,"props":890,"children":892},{"className":891},[],[893],{"type":65,"value":894},"client.sadd is not a function",{"type":65,"value":308},{"type":59,"tag":68,"props":897,"children":898},{},[899,905,907,913,915,921,922,928,929,935,936,942,944,950],{"type":59,"tag":74,"props":900,"children":902},{"className":901},[],[903],{"type":65,"value":904},"redis()",{"type":65,"value":906}," accepts the same ",{"type":59,"tag":74,"props":908,"children":910},{"className":909},[],[911],{"type":65,"value":912},"topK",{"type":65,"value":914}," \u002F ",{"type":59,"tag":74,"props":916,"children":918},{"className":917},[],[919],{"type":65,"value":920},"minScore",{"type":65,"value":914},{"type":59,"tag":74,"props":923,"children":925},{"className":924},[],[926],{"type":65,"value":927},"kinds",{"type":65,"value":914},{"type":59,"tag":74,"props":930,"children":932},{"className":931},[],[933],{"type":65,"value":934},"embedder",{"type":65,"value":914},{"type":59,"tag":74,"props":937,"children":939},{"className":938},[],[940],{"type":65,"value":941},"extract",{"type":65,"value":943}," options\nas ",{"type":59,"tag":74,"props":945,"children":947},{"className":946},[],[948],{"type":65,"value":949},"inMemory()",{"type":65,"value":308},{"type":59,"tag":91,"props":952,"children":954},{"id":953},"storage-model",[955],{"type":65,"value":956},"Storage model",{"type":59,"tag":130,"props":958,"children":962},{"className":959,"code":961,"language":65,"meta":135},[960],"language-text","{prefix}:record:{id}                                          -> JSON record\n{prefix}:index:{tenantId or _}:{userId or _}:{threadId}       -> Set\u003Cid>\n",[963],{"type":59,"tag":74,"props":964,"children":965},{"__ignoreMap":135},[966],{"type":65,"value":961},{"type":59,"tag":68,"props":968,"children":969},{},[970,975,977,982,984,989,990,996,998,1004],{"type":59,"tag":74,"props":971,"children":973},{"className":972},[],[974],{"type":65,"value":87},{"type":65,"value":976}," writes the record and adds it to the scope's index set; ",{"type":59,"tag":74,"props":978,"children":980},{"className":979},[],[981],{"type":65,"value":79},{"type":65,"value":983}," loads the set,\nscores, and renders. Scope values are escaped (",{"type":59,"tag":74,"props":985,"children":987},{"className":986},[],[988],{"type":65,"value":363},{"type":65,"value":864},{"type":59,"tag":74,"props":991,"children":993},{"className":992},[],[994],{"type":65,"value":995},"\\",{"type":65,"value":997},", and ",{"type":59,"tag":74,"props":999,"children":1001},{"className":1000},[],[1002],{"type":65,"value":1003},"_",{"type":65,"value":1005},") so a delimiter or the\nunset placeholder inside a dim can't collide two scopes.",{"type":59,"tag":68,"props":1007,"children":1008},{},[1009,1015,1017,1023],{"type":59,"tag":1010,"props":1011,"children":1012},"strong",{},[1013],{"type":65,"value":1014},"Hard cut:",{"type":65,"value":1016}," there is no dual-read of older index layouts. If you previously wrote under\na different shape (e.g. without ",{"type":59,"tag":74,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":65,"value":1022},"tenantId",{"type":65,"value":1024},"), reindex or wipe — old keys are orphaned.",{"type":59,"tag":68,"props":1026,"children":1027},{},[1028,1030,1035,1036,1042,1043,1049,1051,1056],{"type":65,"value":1029},"Always pass the same ",{"type":59,"tag":74,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":65,"value":1022},{"type":65,"value":81},{"type":59,"tag":74,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":65,"value":1041},"userId",{"type":65,"value":81},{"type":59,"tag":74,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":65,"value":1048},"threadId",{"type":65,"value":1050}," on write and read: missing optional\ndims become ",{"type":59,"tag":74,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":65,"value":1003},{"type":65,"value":1057},", so omit ≠ \"match any\".",{"type":59,"tag":91,"props":1059,"children":1061},{"id":1060},"ranking-limits",[1062],{"type":65,"value":1063},"Ranking limits",{"type":59,"tag":68,"props":1065,"children":1066},{},[1067,1069,1074,1076,1081,1082,1087],{"type":65,"value":1068},"Ranking is client-side: ",{"type":59,"tag":74,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":65,"value":79},{"type":65,"value":1075}," loads every record for the scope into Node and scores\nit. Fine up to ~10k records per scope. Beyond that, write a vector-index-aware adapter\nagainst the same ",{"type":59,"tag":74,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":65,"value":79},{"type":65,"value":81},{"type":59,"tag":74,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":65,"value":87},{"type":65,"value":1088}," contract.",{"type":59,"tag":91,"props":1090,"children":1092},{"id":1091},"troubleshooting",[1093],{"type":65,"value":1094},"Troubleshooting",{"type":59,"tag":1096,"props":1097,"children":1098},"ul",{},[1099,1125],{"type":59,"tag":1100,"props":1101,"children":1102},"li",{},[1103,1108,1110,1116,1118,1124],{"type":59,"tag":1010,"props":1104,"children":1105},{},[1106],{"type":65,"value":1107},"Records not visible across processes:",{"type":65,"value":1109}," ensure every process uses the same\n",{"type":59,"tag":74,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":65,"value":1115},"REDIS_URL",{"type":65,"value":1117}," and ",{"type":59,"tag":74,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":65,"value":1123},"prefix",{"type":65,"value":308},{"type":59,"tag":1100,"props":1126,"children":1127},{},[1128,1133,1135,1140,1142,1148,1150,1156],{"type":59,"tag":1010,"props":1129,"children":1130},{},[1131],{"type":65,"value":1132},"Malformed JSON rows:",{"type":65,"value":1134}," a row whose JSON won't parse is skipped on read and ",{"type":59,"tag":1010,"props":1136,"children":1137},{},[1138],{"type":65,"value":1139},"left in\nplace",{"type":65,"value":1141}," (never deleted) — the signal is a one-time ",{"type":59,"tag":74,"props":1143,"children":1145},{"className":1144},[],[1146],{"type":65,"value":1147},"console.warn",{"type":65,"value":1149}," per bad id. Fix or\ndelete the offending ",{"type":59,"tag":74,"props":1151,"children":1153},{"className":1152},[],[1154],{"type":65,"value":1155},"{prefix}:record:{id}",{"type":65,"value":1157}," key to remediate.",{"type":59,"tag":1159,"props":1160,"children":1161},"style",{},[1162],{"type":65,"value":1163},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1165,"total":1307},[1166,1182,1194,1206,1221,1233,1243,1253,1266,1276,1287,1297],{"slug":1167,"name":1167,"fn":1168,"description":1169,"org":1170,"tags":1171,"stars":1179,"repoUrl":1180,"updatedAt":1181},"aggregation","perform data aggregation in TanStack Table","Aggregate TanStack Table columns independently of grouping, including grand totals, caller-selected row totals, multiple keyed aggregations, custom context-based definitions, grouped merges, manual values, and worker constraints.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1172,1175,1178],{"name":1173,"slug":1174,"type":15},"Data Analysis","data-analysis",{"name":1176,"slug":1177,"type":15},"Frontend","frontend",{"name":9,"slug":8,"type":15},28175,"https:\u002F\u002Fgithub.com\u002FTanStack\u002Ftable","2026-07-30T05:25:59.429787",{"slug":1183,"name":1183,"fn":1184,"description":1185,"org":1186,"tags":1187,"stars":1179,"repoUrl":1180,"updatedAt":1193},"api-not-found","diagnose TanStack Table API errors","Diagnose missing TanStack Table v9 exports, options, state slices, and instance methods. Load before inventing an API when code sees a type error, undefined feature method, absent object key, adapter mismatch, or v8-shaped example.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1188,1191,1192],{"name":1189,"slug":1190,"type":15},"Debugging","debugging",{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:26:05.418735",{"slug":1195,"name":1195,"fn":1196,"description":1197,"org":1198,"tags":1199,"stars":1179,"repoUrl":1180,"updatedAt":1205},"cell-selection","select rectangular cell ranges in tables","Select rectangular cell ranges with cellSelectionFeature: two-corner range state keyed by row and column id, mousedown\u002Fmouseenter handlers, selection edges, render-order resolution under pinning, and autoResetCellSelection. Load when ranges widen unexpectedly after sorting or column reordering, when a drag re-renders the whole table, or when building copy-to-clipboard from a selection.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1200,1201,1202],{"name":1173,"slug":1174,"type":15},{"name":9,"slug":8,"type":15},{"name":1203,"slug":1204,"type":15},"UI Components","ui-components","2026-07-30T05:25:38.403427",{"slug":1207,"name":1207,"fn":1208,"description":1209,"org":1210,"tags":1211,"stars":1179,"repoUrl":1180,"updatedAt":1220},"client-vs-server","manage TanStack Table data pipelines","Choose client or server ownership for filtering, grouping, sorting, expanding, and pagination in TanStack Table v9. Load for manual* flags, mixed pipelines, server counts, or deciding which dataset each row-model stage receives.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1212,1215,1216,1219],{"name":1213,"slug":1214,"type":15},"Data Pipeline","data-pipeline",{"name":1176,"slug":1177,"type":15},{"name":1217,"slug":1218,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-07-30T05:25:45.400104",{"slug":1222,"name":1222,"fn":1223,"description":1224,"org":1225,"tags":1226,"stars":1179,"repoUrl":1180,"updatedAt":1232},"column-faceting","build faceted filter UIs","Build faceted filter UIs with columnFacetingFeature, facetedRowModel, facetedUniqueValues, and facetedMinMaxValues. Load for facet counts, numeric ranges, own-filter exclusion, or server-page facet completeness.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1227,1230,1231],{"name":1228,"slug":1229,"type":15},"Data Visualization","data-visualization",{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:25:41.397257",{"slug":1234,"name":1234,"fn":1235,"description":1236,"org":1237,"tags":1238,"stars":1179,"repoUrl":1180,"updatedAt":1242},"column-filtering","implement column filtering in TanStack Table","Filter columns with columnFilteringFeature, filteredRowModel, filterFns, filterMeta, nested-row direction, and manualFiltering. Load for accessor compatibility, controlled filter updaters, fuzzy metadata, or client\u002Fserver ownership.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1239,1240,1241],{"name":1173,"slug":1174,"type":15},{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:25:53.391632",{"slug":1244,"name":1244,"fn":1245,"description":1246,"org":1247,"tags":1248,"stars":1179,"repoUrl":1180,"updatedAt":1252},"column-ordering","manage TanStack Table column ordering","Control TanStack Table v9 leaf columnOrder with stable IDs while accounting for pinning regions, visibility, and groupedColumnMode precedence. Load for drag-and-drop columns or rendered order that differs from state.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1249,1250,1251],{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},{"name":1203,"slug":1204,"type":15},"2026-07-30T05:26:03.37801",{"slug":1254,"name":1254,"fn":1255,"description":1256,"org":1257,"tags":1258,"stars":1179,"repoUrl":1180,"updatedAt":1265},"column-pinning","configure column pinning in TanStack Table","Pin columns into logical start, center, and end regions with columnPinningFeature and renderer-owned sticky CSS. Load for RTL offsets, z-index, backgrounds, overflow, widths, gaps, or overlaps.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1259,1262,1263,1264],{"name":1260,"slug":1261,"type":15},"CSS","css",{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},{"name":1203,"slug":1204,"type":15},"2026-07-30T05:25:55.377366",{"slug":1267,"name":1267,"fn":1268,"description":1269,"org":1270,"tags":1271,"stars":1179,"repoUrl":1180,"updatedAt":1275},"column-resizing","implement column resizing in TanStack Table","Wire columnResizingFeature, header.getResizeHandler, resize mode and direction, pointer or touch events, and performant CSS-variable updates. Load when resize state changes but widths do not, or large tables resize slowly.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1272,1273,1274],{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},{"name":1203,"slug":1204,"type":15},"2026-07-30T05:25:51.400011",{"slug":1277,"name":1277,"fn":1278,"description":1279,"org":1280,"tags":1281,"stars":1179,"repoUrl":1180,"updatedAt":1286},"column-sizing","configure column sizing in TanStack Table","Use columnSizingFeature numeric size, minSize, maxSize, getSize, getStart, getAfter, and total-size APIs in table, grid, or flex CSS. Load for auto or percentage misconceptions and sizing\u002Fpinning layout mismatch.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1282,1283,1284,1285],{"name":1260,"slug":1261,"type":15},{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},{"name":1203,"slug":1204,"type":15},"2026-07-30T05:25:48.703799",{"slug":1288,"name":1288,"fn":1289,"description":1290,"org":1291,"tags":1292,"stars":1179,"repoUrl":1180,"updatedAt":1296},"column-visibility","manage column visibility in TanStack Table","Hide columns with columnVisibilityFeature while rendering visibility-aware header, column, and cell collections. Load when hidden columns remain in the DOM, false-versus-absent state is confused, or enableHiding is misunderstood.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1293,1294,1295],{"name":1176,"slug":1177,"type":15},{"name":9,"slug":8,"type":15},{"name":1203,"slug":1204,"type":15},"2026-07-30T05:25:47.367943",{"slug":1298,"name":1298,"fn":1299,"description":1300,"org":1301,"tags":1302,"stars":1179,"repoUrl":1180,"updatedAt":1306},"core","build data grids with TanStack Table","Use TanStack Table v9 as a headless data-grid state and row-processing engine. Load for first-table architecture, stable data and columns, row numbering with getDisplayIndex, semantic rendering, framework adapter choice, or deciding what Table owns versus the renderer.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1303,1304,1305],{"name":1173,"slug":1174,"type":15},{"name":1176,"slug":1177,"type":15},{"name":1203,"slug":1204,"type":15},"2026-07-30T05:25:52.366295",125,{"items":1309,"total":1409},[1310,1328,1341,1356,1369,1381,1395],{"slug":1311,"name":1311,"fn":1312,"description":1313,"org":1314,"tags":1315,"stars":23,"repoUrl":24,"updatedAt":1327},"ai-code-mode","execute sandboxed TypeScript code with LLMs","LLM-generated TypeScript execution in sandboxed environments: createCodeModeTool() with isolate drivers (createNodeIsolateDriver, createQuickJSIsolateDriver, createCloudflareIsolateDriver), codeModeWithSkills() for persistent skill libraries, trust strategies, skill storage (FileSystem, LocalStorage, InMemory, Mongo), client-side execution progress via code_mode:* custom events in useChat.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1316,1318,1321,1324,1325],{"name":1317,"slug":31,"type":15},"AI SDK",{"name":1319,"slug":1320,"type":15},"Code Execution","code-execution",{"name":1322,"slug":1323,"type":15},"Sandboxing","sandboxing",{"name":9,"slug":8,"type":15},{"name":1326,"slug":45,"type":15},"TypeScript","2026-07-16T06:04:13.597905",{"slug":1329,"name":1329,"fn":1330,"description":1331,"org":1332,"tags":1333,"stars":23,"repoUrl":24,"updatedAt":1340},"ai-core","configure TanStack AI agent features","Entry point for TanStack AI skills. Routes to chat-experience, tool-calling, media-generation, structured-outputs, adapter-configuration, ag-ui-protocol, middleware, locks, custom-backend-integration, and debug-logging, plus the skills shipped by companion packages (@tanstack\u002Fai-persistence, @tanstack\u002Fai-code-mode). Use chat() not streamText(), openaiText() not createOpenAI(), toServerSentEventsResponse() not manual SSE, middleware hooks not onEnd callbacks.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1334,1335,1337],{"name":17,"slug":18,"type":15},{"name":1336,"slug":29,"type":15},"AI",{"name":1338,"slug":1339,"type":15},"Middleware","middleware","2026-07-30T05:26:10.404565",{"slug":1342,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":23,"repoUrl":24,"updatedAt":1355},"ai-coreadapter-configuration","ai-core\u002Fadapter-configuration","configure AI provider adapters","Provider adapter selection and configuration: openaiText, anthropicText, geminiText, ollamaText, grokText, groqText, openRouterText, bedrockText, openaiCompatible. Per-model type safety with modelOptions, reasoning\u002Fthinking configuration, runtime adapter switching, extendAdapter() for custom models, createModel(). Generic OpenAI-compatible providers (DeepSeek, Together, Fireworks, etc.) via openaiCompatible({ baseURL, apiKey, models }) from @tanstack\u002Fai-openai\u002Fcompatible. API key env vars: OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY\u002FGEMINI_API_KEY, XAI_API_KEY, GROQ_API_KEY, OPENROUTER_API_KEY, OLLAMA_HOST, BEDROCK_API_KEY (or AWS_BEARER_TOKEN_BEDROCK).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1348,1349,1352,1354],{"name":1317,"slug":31,"type":15},{"name":1350,"slug":1351,"type":15},"Configuration","configuration",{"name":1353,"slug":37,"type":15},"LLM",{"name":9,"slug":8,"type":15},"2026-07-16T06:04:17.82075",{"slug":1357,"name":1358,"fn":1359,"description":1360,"org":1361,"tags":1362,"stars":23,"repoUrl":24,"updatedAt":1368},"ai-coreag-ui-protocol","ai-core\u002Fag-ui-protocol","implement TanStack AI streaming protocol","Server-side AG-UI streaming protocol implementation: StreamChunk event types (RUN_STARTED, TEXT_MESSAGE_START\u002FCONTENT\u002FEND, TOOL_CALL_START\u002FARGS\u002FEND, RUN_FINISHED, RUN_ERROR, STEP_STARTED\u002FSTEP_FINISHED, STATE_SNAPSHOT\u002FDELTA, CUSTOM), toServerSentEventsStream() for SSE format, toHttpStream() for NDJSON format. For backends serving AG-UI events without client packages.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1363,1366,1367],{"name":1364,"slug":1365,"type":15},"API Development","api-development",{"name":1353,"slug":37,"type":15},{"name":9,"slug":8,"type":15},"2026-07-16T06:04:10.093367",{"slug":1370,"name":1371,"fn":1372,"description":1373,"org":1374,"tags":1375,"stars":23,"repoUrl":24,"updatedAt":1380},"ai-corechat-experience","ai-core\u002Fchat-experience","implement chat experiences with TanStack AI","End-to-end chat implementation: server endpoint with chat() and toServerSentEventsResponse(), client-side useChat hook with fetchServerSentEvents(), message rendering with UIMessage parts, multimodal content, thinking\u002Freasoning display. Covers streaming states, connection adapters, and message format conversions. NOT Vercel AI SDK — uses chat() not streamText().\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1376,1377,1378,1379],{"name":1364,"slug":1365,"type":15},{"name":1176,"slug":1177,"type":15},{"name":1353,"slug":37,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:26:11.505241",{"slug":1382,"name":1383,"fn":1384,"description":1385,"org":1386,"tags":1387,"stars":23,"repoUrl":24,"updatedAt":1394},"ai-coreclient-persistence","ai-core\u002Fclient-persistence","implement browser chat persistence for TanStack AI","Browser chat persistence on useChat \u002F ChatClient: localStoragePersistence, sessionStoragePersistence, indexedDBPersistence. Client-authoritative (adapter, full transcript) vs server-authoritative (persistence: true, no client cache). Reload restore, pending interrupts, mid-stream rejoin with delivery durability. Use for SPA reload durability — NOT server history alone. No extra package: the adapters ship in the framework packages.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1388,1389,1390,1393],{"name":1336,"slug":29,"type":15},{"name":1176,"slug":1177,"type":15},{"name":1391,"slug":1392,"type":15},"Persistence","persistence",{"name":9,"slug":8,"type":15},"2026-07-30T05:53:35.503176",{"slug":1396,"name":1397,"fn":1398,"description":1399,"org":1400,"tags":1401,"stars":23,"repoUrl":24,"updatedAt":1408},"ai-corecustom-backend-integration","ai-core\u002Fcustom-backend-integration","integrate custom backends with TanStack AI","Connect useChat to a non-TanStack-AI backend through custom connection adapters. ConnectConnectionAdapter (single async iterable) vs SubscribeConnectionAdapter (separate subscribe\u002Fsend). Customize fetchServerSentEvents() and fetchHttpStream() with auth headers, custom URLs, and request options. Import from framework package, not @tanstack\u002Fai-client.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1402,1403,1404,1407],{"name":1336,"slug":29,"type":15},{"name":1364,"slug":1365,"type":15},{"name":1405,"slug":1406,"type":15},"Backend","backend",{"name":9,"slug":8,"type":15},"2026-07-17T06:06:39.855351",27]