[{"data":1,"prerenderedAt":714},["ShallowReactive",2],{"navigation_docs_en":3,"-en-getting-started-ai-assistants":342,"-en-getting-started-ai-assistants-surround":709},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":40,"body":344,"description":703,"extension":505,"links":704,"meta":705,"navigation":706,"path":41,"seo":707,"stem":42,"__hash__":708},"docs_en/en/01.getting-started/8.ai-assistants.md",{"type":345,"value":346,"toc":698},"minimark",[347,370,375,387,390,419,422,498,501,551,554,558,561,620,623,627,683,694],[348,349,350,351,355,356,359,360,355,363,359,366,369],"p",{},"Coding assistants know TanStack Query far better than Qora. Left alone, they write TanStack code with Dart syntax: ",[352,353,354],"code",{},"queryFn"," instead of ",[352,357,358],{},"fetcher",", ",[352,361,362],{},"cacheTime",[352,364,365],{},"gcTime",[352,367,368],{},"state.when(...)",", which does not exist. Two files fix most of it: a short rules file the assistant loads in every session, and the documentation in a format it can read.",[371,372,374],"h2",{"id":373},"_1-add-the-qora-rules-to-your-project","1. Add the Qora rules to your project",[348,376,377,386],{},[378,379,383],"a",{"href":380,"rel":381},"https://qora.meragix.dev/qora-rules.md",[382],"nofollow",[352,384,385],{},"qora-rules.md"," is a one-page summary written for assistants. It contains the setup, how to render states, the offline behaviour, mutations and invalidation, and a table of the mistakes assistants make most often, each with the correct Qora form.",[348,388,389],{},"Download it to the root of your project:",[391,392,398],"pre",{"className":393,"code":394,"filename":395,"language":396,"meta":397,"style":397},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -o qora-rules.md https://qora.meragix.dev/qora-rules.md\n","Terminal","bash","",[352,399,400],{"__ignoreMap":397},[401,402,405,409,413,416],"span",{"class":403,"line":404},"line",1,[401,406,408],{"class":407},"sBMFI","curl",[401,410,412],{"class":411},"sfazB"," -o",[401,414,415],{"class":411}," qora-rules.md",[401,417,418],{"class":411}," https://qora.meragix.dev/qora-rules.md\n",[348,420,421],{},"Then reference it from the instruction file your assistant reads:",[423,424,425,438],"table",{},[426,427,428],"thead",{},[429,430,431,435],"tr",{},[432,433,434],"th",{},"Assistant",[432,436,437],{},"Where",[439,440,441,457,469,480],"tbody",{},[429,442,443,447],{},[444,445,446],"td",{},"Claude Code",[444,448,449,450,453,454],{},"Add the line ",[352,451,452],{},"@qora-rules.md"," to ",[352,455,456],{},"CLAUDE.md",[429,458,459,462],{},[444,460,461],{},"Cursor",[444,463,464,465,468],{},"Save it as ",[352,466,467],{},".cursor/rules/qora.mdc"," with the front matter below",[429,470,471,474],{},[444,472,473],{},"GitHub Copilot",[444,475,476,477],{},"Append its content to ",[352,478,479],{},".github/copilot-instructions.md",[429,481,482,488],{},[444,483,484,485],{},"Codex and other tools reading ",[352,486,487],{},"AGENTS.md",[444,489,476,490,492,493,495,496],{},[352,491,487],{},", or tell ",[352,494,487],{}," to read ",[352,497,385],{},[348,499,500],{},"For Cursor, the file starts with:",[391,502,506],{"className":503,"code":504,"filename":467,"language":505,"meta":397,"style":397},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\ndescription: Qora server-state library rules\nglobs: \"**/*.dart\"\nalwaysApply: false\n---\n","md",[352,507,508,514,520,539,545],{"__ignoreMap":397},[401,509,510],{"class":403,"line":404},[401,511,513],{"class":512},"sTEyZ","---\n",[401,515,517],{"class":403,"line":516},2,[401,518,519],{"class":512},"description: Qora server-state library rules\n",[401,521,523,526,530,534,536],{"class":403,"line":522},3,[401,524,525],{"class":512},"globs: \"*",[401,527,529],{"class":528},"s7zQu","*",[401,531,533],{"class":532},"s5tWE","/",[401,535,529],{"class":528},[401,537,538],{"class":512},".dart\"\n",[401,540,542],{"class":403,"line":541},4,[401,543,544],{"class":512},"alwaysApply: false\n",[401,546,548],{"class":403,"line":547},5,[401,549,513],{"class":550},"sMK4o",[348,552,553],{},"Re-download the file when you upgrade Qora: it states the version it describes.",[371,555,557],{"id":556},"_2-point-the-assistant-at-the-documentation","2. Point the assistant at the documentation",[348,559,560],{},"The documentation is published in formats meant for language models:",[423,562,563,573],{},[426,564,565],{},[429,566,567,570],{},[432,568,569],{},"URL",[432,571,572],{},"Contents",[439,574,575,589,603],{},[429,576,577,586],{},[444,578,579],{},[378,580,583],{"href":581,"rel":582},"https://qora.meragix.dev/llms.txt",[382],[352,584,585],{},"/llms.txt",[444,587,588],{},"Index of every page, with a one-line description",[429,590,591,600],{},[444,592,593],{},[378,594,597],{"href":595,"rel":596},"https://qora.meragix.dev/llms-full.txt",[382],[352,598,599],{},"/llms-full.txt",[444,601,602],{},"The whole English documentation in one file",[429,604,605,610],{},[444,606,607],{},[352,608,609],{},"/raw/en/\u003Csection>/\u003Cpage>.md",[444,611,612,613],{},"Any single page as Markdown, for example ",[378,614,617],{"href":615,"rel":616},"https://qora.meragix.dev/raw/en/getting-started/quick-start.md",[382],[352,618,619],{},"/raw/en/getting-started/quick-start.md",[348,621,622],{},"For a focused task, pass the one or two relevant pages rather than the full file: the assistant follows a short, precise context better than a long one.",[371,624,626],{"id":625},"_3-check-what-it-wrote","3. Check what it wrote",[628,629,630,642,662],"ul",{},[631,632,633,641],"li",{},[634,635,636,637,640],"strong",{},"Run ",[352,638,639],{},"dart analyze","."," An invented method or parameter is a compile error, which is the quickest way to catch a TanStack habit.",[631,643,644,653,654,657,658,661],{},[634,645,646,647,650,651,640],{},"Look for a ",[352,648,649],{},"switch"," on ",[352,652,211],{}," Code that checks ",[352,655,656],{},"state.isLoading"," before reading data usually drops the ",[352,659,660],{},"previousData"," kept during refetches and errors.",[631,663,664,667,668,671,672,675,676,679,680,640],{},[634,665,666],{},"Test offline."," Code generated from other libraries tends to expect a ",[352,669,670],{},"Failure"," or ",[352,673,674],{},"Initial"," when the network is off. Qora pauses instead: ",[352,677,678],{},"Loading"," with ",[352,681,682],{},"FetchStatus.paused",[348,684,685,686,689,690,693],{},"When in doubt, compare with the ",[378,687,21],{"href":688},"./quick-start",", which runs as is, or ask the assistant to read ",[378,691,30],{"href":692},"./coming-from-tanstack-query",", which maps every option.",[695,696,697],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s5tWE, html code.shiki .s5tWE{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#F07178;--shiki-default-font-style:italic;--shiki-dark:#F07178;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":397,"searchDepth":516,"depth":516,"links":699},[700,701,702],{"id":373,"depth":516,"text":374},{"id":556,"depth":516,"text":557},{"id":625,"depth":516,"text":626},"Give Claude, Cursor, Copilot or any coding assistant the context it needs to write correct Qora code.",null,{},{"icon":43},{"title":40,"description":703},"Nqzs5yGBvmeUIQ7_3ONwqJaDC5i5jRcPo_kYOFJ2GL0",[710,712],{"title":35,"path":36,"stem":37,"description":711,"icon":38,"children":-1},"Map flutter_query and cached_query concepts to Qora and migrate one screen at a time.",{"title":52,"path":53,"stem":54,"description":713,"icon":55,"children":-1},"Queries are the foundation of Qora. A query is an async request bound to a key, with automatic caching, deduplication, retries, and reactive state.",1794040396703]