[{"data":1,"prerenderedAt":1055},["ShallowReactive",2],{"navigation":3,"/changelog/v2-0-0":190,"/changelog/v2-0-0-surround":1050},[4,34,66,87,106,127,137,166],{"title":5,"path":6,"stem":7,"children":8,"icon":32,"defaultOpen":33},"Getting Started","/getting-started","1.getting-started/1.index",[9,12,17,22,27],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-info",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quickstart (Local)","/getting-started/quickstart-local","1.getting-started/3.quickstart-local","i-lucide-zap",{"title":23,"path":24,"stem":25,"icon":26},"Quickstart (Redis)","/getting-started/quickstart-redis","1.getting-started/4.quickstart-redis","i-lucide-database",{"title":28,"path":29,"stem":30,"icon":31},"Quickstart (Hybrid)","/getting-started/quickstart-hybrid","1.getting-started/5.quickstart-hybrid","i-lucide-arrow-left-right","i-lucide-rocket",true,{"title":35,"icon":36,"defaultOpen":33,"path":37,"stem":38,"children":39,"page":65},"Concepts","i-lucide-lightbulb","/concepts","2.concepts",[40,45,50,55,60],{"title":41,"path":42,"stem":43,"icon":44},"Keys","/concepts/keys","2.concepts/1.keys","i-lucide-key-round",{"title":46,"path":47,"stem":48,"icon":49},"Rate Limits","/concepts/rate-limits","2.concepts/2.rate-limits","i-lucide-badge-percent",{"title":51,"path":52,"stem":53,"icon":54},"Sliding Windows","/concepts/sliding-windows","2.concepts/3.sliding-windows","i-lucide-timer-reset",{"title":56,"path":57,"stem":58,"icon":59},"Decisions","/concepts/decisions","2.concepts/4.decisions","i-lucide-check-check",{"title":61,"path":62,"stem":63,"icon":64},"Configuration Types","/concepts/configuration-types","2.concepts/5.configuration-types","i-lucide-box",false,{"title":67,"icon":68,"defaultOpen":33,"path":69,"stem":70,"children":71,"page":65},"Strategies","i-lucide-git-branch","/strategies","3.strategies",[72,77,82],{"title":73,"path":74,"stem":75,"icon":76},"Absolute","/strategies/absolute","3.strategies/1.absolute","i-lucide-shield",{"title":78,"path":79,"stem":80,"icon":81},"Suppressed","/strategies/suppressed","3.strategies/2.suppressed","i-lucide-activity",{"title":83,"path":84,"stem":85,"icon":86},"How Suppression Works","/strategies/how-suppression-works","3.strategies/3.how-suppression-works","i-lucide-function-square",{"title":88,"icon":89,"defaultOpen":33,"path":90,"stem":91,"children":92,"page":65},"Providers","i-lucide-layers","/providers","4.providers",[93,98,102],{"title":94,"path":95,"stem":96,"icon":97},"Local","/providers/local","4.providers/1.local","i-lucide-cpu",{"title":99,"path":100,"stem":101,"icon":26},"Redis","/providers/redis","4.providers/2.redis",{"title":103,"path":104,"stem":105,"icon":31},"Hybrid","/providers/hybrid","4.providers/3.hybrid",{"title":107,"icon":108,"defaultOpen":65,"path":109,"stem":110,"children":111,"page":65},"Guides","i-lucide-map","/guides","5.guides",[112,117,122],{"title":113,"path":114,"stem":115,"icon":116},"Configuration","/guides/configuration","5.guides/1.configuration","i-lucide-sliders-horizontal",{"title":118,"path":119,"stem":120,"icon":121},"Cleanup","/guides/cleanup","5.guides/2.cleanup","i-lucide-trash-2",{"title":123,"path":124,"stem":125,"icon":126},"Troubleshooting","/guides/troubleshooting","5.guides/4.troubleshooting","i-lucide-wrench",{"title":128,"icon":129,"defaultOpen":65,"path":130,"stem":131,"children":132,"page":65},"Reference","i-lucide-file-text","/reference","6.reference",[133],{"title":134,"path":135,"stem":136,"icon":129},"API Reference Guide","/reference/api","6.reference/1.api",{"title":138,"icon":139,"defaultOpen":65,"path":140,"stem":141,"children":142,"page":65},"Benchmarks","i-lucide-gauge","/benchmarks","7.benchmarks",[143,148,152],{"title":144,"path":145,"stem":146,"icon":147},"Benchmark Concepts","/benchmarks/benchmark-concepts","7.benchmarks/0.benchmark-concepts","i-lucide-book-open",{"title":149,"path":150,"stem":151,"icon":139},"Benchmarking & Load Testing","/benchmarks/benchmarking-load-testing","7.benchmarks/1.benchmarking-load-testing",{"title":153,"path":154,"stem":155,"children":156,"icon":165},"Benchmark Results","/benchmarks/benchmark-results","7.benchmarks/2.benchmark-results",[157,161],{"title":158,"path":159,"stem":160,"icon":97},"Local Benchmark Comparison","/benchmarks/benchmark-results/local-benchmark-comparison","7.benchmarks/2.benchmark-results/1.local-benchmark-comparison",{"title":162,"path":163,"stem":164,"icon":26},"Redis + Hybrid Benchmark Comparison","/benchmarks/benchmark-results/redis-benchmark-comparison","7.benchmarks/2.benchmark-results/2.redis-benchmark-comparison","i-lucide-chart-no-axes-combined",{"title":167,"path":168,"stem":169,"children":170,"icon":172,"defaultOpen":65},"Changelog","/changelog","8.changelog/0.index",[171,173,178,182,186],{"title":167,"path":168,"stem":169,"icon":172},"i-lucide-scroll",{"title":174,"path":175,"stem":176,"icon":177},"v2.0.0","/changelog/v2-0-0","8.changelog/1.v2-0-0","i-lucide-tag",{"title":179,"path":180,"stem":181,"icon":177},"v1.1.0","/changelog/v1-1-0","8.changelog/2.v1-1-0",{"title":183,"path":184,"stem":185,"icon":177},"v1.0.1","/changelog/v1-0-1","8.changelog/3.v1-0-1",{"title":187,"path":188,"stem":189,"icon":177},"v1.0.0","/changelog/v1-0-0","8.changelog/4.v1-0-0",{"id":191,"title":174,"authors":192,"badge":174,"body":201,"date":1043,"description":1044,"extension":1045,"links":1043,"meta":1046,"navigation":1047,"path":175,"seo":1048,"stem":176,"__hash__":1049},"docs/8.changelog/1.v2-0-0.md",[193],{"name":194,"description":195,"avatar":196,"to":199,"target":200},"David Oyinbo","@dev-davexoyinbo",{"src":197,"alt":194,"loading":198},"https://github.com/dev-davexoyinbo.png","lazy","https://github.com/dev-davexoyinbo","_blank",{"type":202,"value":203,"toc":1034},"minimark",[204,212,241,244,247,251,256,447,451,564,568,607,611,640,644,661,665,697,701,1007,1023,1030],[205,206,207,211],"p",{},[208,209,210],"strong",{},"Status:"," Released · July 22, 2026",[205,213,214,217,218,225,226,225,231,225,236],{},[208,215,216],{},"Links:"," ",[219,220,224],"a",{"href":221,"rel":222},"https://github.com/dev-davexoyinbo/trypema/releases/tag/v2.0.0",[223],"nofollow","Official release"," · ",[219,227,230],{"href":228,"rel":229},"https://crates.io/crates/trypema",[223],"Crate",[219,232,235],{"href":233,"rel":234},"https://docs.rs/trypema",[223],"API documentation",[219,237,240],{"href":238,"rel":239},"https://github.com/dev-davexoyinbo/trypema",[223],"Repository",[242,243],"hr",{},[205,245,246],{},"Version 2.0.0 redesigns Trypema around independently constructed local, Redis, and hybrid\nproviders. It also standardizes time and rate configuration, completes the public sliding-window\nAPI across all strategies and providers, and strengthens concurrent state handling.",[248,249],"topic-figure",{"topic":250},"migration",[252,253,255],"h2",{"id":254},"breaking-changes","Breaking changes",[257,258,259,284,299,338,365,395,408,421,428,444],"ul",{},[260,261,262,263,267,268,271,272,275,276,279,280,283],"li",{},"Replaced the monolithic ",[264,265,266],"code",{},"RateLimiter"," and ",[264,269,270],{},"RateLimiterOptions"," API with independent\n",[264,273,274],{},"LocalRateLimiterProvider",", ",[264,277,278],{},"RedisRateLimiterProvider",", and ",[264,281,282],{},"HybridRateLimiterProvider"," types.",[260,285,286,287,290,291,294,295,298],{},"Replaced the old concrete top-level builder with the shared ",[264,288,289],{},"RateLimiterBuilder"," trait and\nprovider-specific builders. ",[264,292,293],{},"build()"," now returns an ",[264,296,297],{},"Arc"," of the selected provider and starts\nstale-state cleanup by default.",[260,300,301,302],{},"Replaced raw, unit-suffixed configuration types and setters with validated semantic types:\n",[257,303,304,314,322,330],{},[260,305,306,309,310,313],{},[264,307,308],{},"WindowSizeSeconds"," is now ",[264,311,312],{},"WindowSize",".",[260,315,316,309,319,313],{},[264,317,318],{},"RateGroupSizeMs",[264,320,321],{},"BucketSize",[260,323,324,309,327,313],{},[264,325,326],{},"SuppressionFactorCacheMs",[264,328,329],{},"SuppressionFactorCachePeriod",[260,331,332,309,335,313],{},[264,333,334],{},"SyncIntervalMs",[264,336,337],{},"hybrid::SyncInterval",[260,339,340,341,275,344,347,348,351,352,275,355,347,358,361,362,313],{},"Replaced raw numeric builder setters such as ",[264,342,343],{},"window_size_seconds",[264,345,346],{},"rate_group_size_ms",", and\n",[264,349,350],{},"sync_interval_ms"," with typed setters such as ",[264,353,354],{},"window_size",[264,356,357],{},"bucket_size",[264,359,360],{},"sync_interval",". Cleanup timing now uses ",[264,363,364],{},"Duration",[260,366,367,368,371,372,275,375,275,378,275,381,275,384,279,387,390,391,394],{},"Replaced ambiguous ",[264,369,370],{},"RateLimit::new"," construction with unit-explicit constructors including\n",[264,373,374],{},"per_second",[264,376,377],{},"per_minute",[264,379,380],{},"per_hour",[264,382,383],{},"per_day",[264,385,386],{},"per_week",[264,388,389],{},"per_month",". Each has an\n",[264,392,393],{},"_or_panic"," counterpart.",[260,396,397,398,401,402,267,405,313],{},"Changed ",[264,399,400],{},"RateLimitDecision::Rejected"," metadata from raw millisecond/second values to\n",[264,403,404],{},"window_size: WindowSize",[264,406,407],{},"retry_after: Duration",[260,409,410,411,267,414,416,417,420],{},"Marked the ",[264,412,413],{},"Rejected",[264,415,78],{}," decision variants as non-exhaustive. Match these variants\nwith ",[264,418,419],{},"{ .. }"," for forward compatibility.",[260,422,423,424,427],{},"Removed Redis key sanitization helpers. Redis and hybrid operations now require validated\n",[264,425,426],{},"RedisKey"," values and never silently rewrite keys.",[260,429,430,431,434,435,275,438,347,441,313],{},"Made ",[264,432,433],{},"TrypemaError"," non-exhaustive and renamed configuration errors to match the new public\ntypes, including ",[264,436,437],{},"InvalidWindowSize",[264,439,440],{},"InvalidBucketSize",[264,442,443],{},"InvalidSuppressionFactorCachePeriod",[260,445,446],{},"Narrowed module re-exports to the intentional public API and removed the public option structs\nused by the old facade.",[252,448,450],{"id":449},"added","Added",[257,452,453,470,477,497,504,514,521,543,549,558,561],{},[260,454,455,456,275,459,461,462,275,464,279,466,469],{},"Added unit-aware constructors and read-only conversion getters for ",[264,457,458],{},"RateLimit",[264,460,312],{},",\n",[264,463,321],{},[264,465,329],{},[264,467,468],{},"SyncInterval",". One month is defined as 30\ndays.",[260,471,472,473,476],{},"Added builder validation that requires ",[264,474,475],{},"bucket_size \u003C= window_size",", independent of setter\norder.",[260,478,479,480,275,483,279,486,489,490,267,493,496],{},"Added ",[264,481,482],{},"enable_cleanup",[264,484,485],{},"disable_cleanup",[264,487,488],{},"cleanup_enabled"," builder controls, plus\nidempotent ",[264,491,492],{},"start_cleanup_loop",[264,494,495],{},"stop_cleanup_loop"," provider methods.",[260,498,499,500,503],{},"Added absolute ",[264,501,502],{},"get"," operations for local, Redis, and hybrid providers. Unknown keys return zero\nwithout creating state.",[260,505,506,507,509,510,513],{},"Added suppressed ",[264,508,502],{}," operations returning ",[264,511,512],{},"SuppressedRateLimitSnapshot",", including live\nobserved usage, declined usage, and suppression factor.",[260,515,516,517,520],{},"Added hybrid ",[264,518,519],{},"get_estimate"," operations for local-state estimates that can avoid Redis I/O.",[260,522,479,523,267,526,529,530,533,534,275,537,279,540,313],{},[264,524,525],{},"set_if",[264,527,528],{},"set_if_preserve_history"," to all six provider/strategy combinations. They\nreturn ",[264,531,532],{},"ConditionalSetOutcome"," with ",[264,535,536],{},"matched",[264,538,539],{},"previous_total",[264,541,542],{},"current_total",[260,544,479,545,548],{},[264,546,547],{},"RateLimitComparator"," guard modes for equality, less-than, greater-than, inequality, and\nunconditional updates.",[260,550,479,551,267,554,557],{},[264,552,553],{},"HistoryPreservation::PreserveNewest",[264,555,556],{},"PreserveOldest"," for directional conditional\nhistory updates.",[260,559,560],{},"Added complete Redis Lua implementations for atomic increments, reads, admission checks,\nconditional updates, history preservation, expiration, and cleanup.",[260,562,563],{},"Added dedicated Criterion suites for both hybrid strategies and expanded all benchmark suites\nto cover reads and conditional-update paths.",[252,565,567],{"id":566},"changed","Changed",[257,569,570,577,580,583,586,589,592,595,598,601,604],{},[260,571,572,573,576],{},"Per-key state now stores computed window capacity. The first ",[264,574,575],{},"inc"," establishes a sticky\ncapacity; a matched conditional update replaces it with capacity computed from the supplied\nrate.",[260,578,579],{},"Matched conditional updates now prune expired history and delete all entity state when the\ntarget is zero. The history-preserving form retains the requested side of live history.",[260,581,582],{},"Conditional comparator misses leave usage, limits, TTLs, active-entity metadata, and suppression\ncaches unchanged.",[260,584,585],{},"Reads now report live state and may lazily evict expired buckets. Unknown reads do not insert\nstate.",[260,587,588],{},"Suppressed snapshots consistently track total observed and total declined usage, with declined\nusage never exceeding observed usage.",[260,590,591],{},"Redis operations now use shared Lua helpers and Redis server time for atomic, runtime-neutral\nbehavior under both Tokio and Smol.",[260,593,594],{},"Hybrid providers now coordinate pending local state, Redis commits, refreshes, resets, and\nconditional updates per key. Successful conditional updates preserve increments that race\nafter the pending-state snapshot.",[260,596,597],{},"Hybrid reads include this instance's pending local increments and declines over committed Redis\nstate.",[260,599,600],{},"Absolute rejection metadata now reports the remaining wait until the oldest live bucket expires\nand the capacity released at that point.",[260,602,603],{},"Clarified that absolute admission is best-effort under concurrency and may temporarily overshoot\nwhen callers race.",[260,605,606],{},"Standardized provider construction, public naming, documentation, tests, benchmarks, and stress\ntooling across local, Redis, and hybrid implementations.",[252,608,610],{"id":609},"fixed","Fixed",[257,612,613,616,619,622,625,628,631,634,637],{},[260,614,615],{},"Fixed fractional rate-limit capacity conversion to use the documented truncating behavior.",[260,617,618],{},"Fixed window and bucket boundary handling, including suppressed-limit behavior at equal soft and\nhard limits.",[260,620,621],{},"Fixed rejected increments so they do not consume absolute capacity.",[260,623,624],{},"Fixed zero-target conditional updates leaving empty state behind.",[260,626,627],{},"Fixed retry metadata to use remaining bucket lifetime and oldest-bucket capacity.",[260,629,630],{},"Fixed hybrid rejection defaults when Redis cannot provide oldest-bucket TTL metadata.",[260,632,633],{},"Fixed hybrid cleanup so suppression-cache and rejection TTLs participate in staleness decisions.",[260,635,636],{},"Fixed cleanup and insertion races that could cause redundant lookups or invalid assumptions\nabout a key remaining present.",[260,638,639],{},"Fixed suppressed history reductions so retained declined counts remain proportional and never\nexceed retained totals.",[252,641,643],{"id":642},"performance-and-concurrency","Performance and concurrency",[257,645,646,649,652,655,658],{},[260,647,648],{},"Reworked local and hybrid hot paths to inspect DashMap state through shared guards before\nacquiring exclusive access.",[260,650,651],{},"Added direct downgrade of newly inserted DashMap entries to avoid a second lookup and removal\nrace.",[260,653,654],{},"Kept atomic bucket coalescing on shared-access paths and reserved exclusive access for structural\nhistory changes.",[260,656,657],{},"Reduced unnecessary mutable access, allocations, boxed references, and repeated calculations in\nadmission, read, cleanup, and conditional-update paths.",[260,659,660],{},"Refactored hybrid absolute and suppressed fast paths, background commits, refreshes, and cleanup\ncoordination.",[252,662,664],{"id":663},"testing-benchmarks-and-tooling","Testing, benchmarks, and tooling",[257,666,667,670,673,676,685,688,691,694],{},[260,668,669],{},"Expanded behavioral, concurrency, timing, cleanup, and volume coverage across all six limiter\nvariants and both Redis runtimes.",[260,671,672],{},"Added raw Redis-state assertions for histories, ordering sets, exact totals, limits, TTLs, caches,\nand active-entity membership.",[260,674,675],{},"Added hot-key read contention benchmarks with 1, 2, 8, and 16 readers for both local strategies.",[260,677,678,679,347,682,684],{},"Added conditional-set benchmarks for guard misses, replacement, ",[264,680,681],{},"PreserveNewest",[264,683,556],{}," across all applicable suites.",[260,686,687],{},"Added Tokio and Smol hybrid benchmark targets and integrated them into Makefile sanity and\nbenchmark matrices.",[260,689,690],{},"Reworked the stress harness with aggregate QPS pacing, synchronized worker starts, strict\noutcome accounting, run-isolated Redis prefixes, bounded latency sampling, and stronger\nconfiguration validation.",[260,692,693],{},"Updated crate documentation, examples, contributor guidance, benchmark documentation, and CI\nworkflow concurrency.",[260,695,696],{},"Updated Redis, Tokio, DashMap, futures, async-trait, rand, and thiserror dependencies and removed\nthe unused regex dependency.",[252,698,700],{"id":699},"migration-summary","Migration summary",[702,703,708],"pre",{"className":704,"code":705,"language":706,"meta":707,"style":707},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark monokai","use std::time::Duration;\nuse trypema::{\n    BucketSize, RateLimit, RateLimiterBuilder, WindowSize,\n    local::LocalRateLimiterProvider,\n};\n\nlet provider = LocalRateLimiterProvider::builder()\n    .window_size(WindowSize::minutes_or_panic(1))\n    .bucket_size(BucketSize::milliseconds_or_panic(10))\n    .cleanup_interval(Duration::from_secs(30))\n    .build()\n    .unwrap();\n\nlet rate = RateLimit::per_second_or_panic(10.0);\nlet decision = provider.absolute().inc(\"user-123\", &rate, 1);\n","rust","",[264,709,710,738,751,775,787,793,799,825,852,875,899,909,920,925,955],{"__ignoreMap":707},[711,712,715,719,723,727,730,732,734],"span",{"class":713,"line":714},"line",1,[711,716,718],{"class":717},"shWJe","use",[711,720,722],{"class":721},"sKvfc"," std",[711,724,726],{"class":725},"sGXK2","::",[711,728,729],{"class":721},"time",[711,731,726],{"class":725},[711,733,364],{"class":721},[711,735,737],{"class":736},"swvn1",";\n",[711,739,741,743,746,748],{"class":713,"line":740},2,[711,742,718],{"class":717},[711,744,745],{"class":721}," trypema",[711,747,726],{"class":725},[711,749,750],{"class":736},"{\n",[711,752,754,757,760,763,765,768,770,773],{"class":713,"line":753},3,[711,755,756],{"class":721},"    BucketSize",[711,758,759],{"class":736},",",[711,761,762],{"class":721}," RateLimit",[711,764,759],{"class":736},[711,766,767],{"class":721}," RateLimiterBuilder",[711,769,759],{"class":736},[711,771,772],{"class":721}," WindowSize",[711,774,461],{"class":736},[711,776,778,781,783,785],{"class":713,"line":777},4,[711,779,780],{"class":721},"    local",[711,782,726],{"class":725},[711,784,274],{"class":721},[711,786,461],{"class":736},[711,788,790],{"class":713,"line":789},5,[711,791,792],{"class":736},"};\n",[711,794,796],{"class":713,"line":795},6,[711,797,798],{"emptyLinePlaceholder":33},"\n",[711,800,802,806,810,813,816,818,822],{"class":713,"line":801},7,[711,803,805],{"class":804},"srJo8","let",[711,807,809],{"class":808},"ss--_"," provider ",[711,811,812],{"class":725},"=",[711,814,815],{"class":721}," LocalRateLimiterProvider",[711,817,726],{"class":725},[711,819,821],{"class":820},"sD0ED","builder",[711,823,824],{"class":736},"()\n",[711,826,828,831,833,836,838,840,843,845,849],{"class":713,"line":827},8,[711,829,830],{"class":725},"    .",[711,832,354],{"class":820},[711,834,835],{"class":736},"(",[711,837,312],{"class":721},[711,839,726],{"class":725},[711,841,842],{"class":820},"minutes_or_panic",[711,844,835],{"class":736},[711,846,848],{"class":847},"sYThS","1",[711,850,851],{"class":736},"))\n",[711,853,855,857,859,861,863,865,868,870,873],{"class":713,"line":854},9,[711,856,830],{"class":725},[711,858,357],{"class":820},[711,860,835],{"class":736},[711,862,321],{"class":721},[711,864,726],{"class":725},[711,866,867],{"class":820},"milliseconds_or_panic",[711,869,835],{"class":736},[711,871,872],{"class":847},"10",[711,874,851],{"class":736},[711,876,878,880,883,885,887,889,892,894,897],{"class":713,"line":877},10,[711,879,830],{"class":725},[711,881,882],{"class":820},"cleanup_interval",[711,884,835],{"class":736},[711,886,364],{"class":721},[711,888,726],{"class":725},[711,890,891],{"class":820},"from_secs",[711,893,835],{"class":736},[711,895,896],{"class":847},"30",[711,898,851],{"class":736},[711,900,902,904,907],{"class":713,"line":901},11,[711,903,830],{"class":725},[711,905,906],{"class":820},"build",[711,908,824],{"class":736},[711,910,912,914,917],{"class":713,"line":911},12,[711,913,830],{"class":725},[711,915,916],{"class":820},"unwrap",[711,918,919],{"class":736},"();\n",[711,921,923],{"class":713,"line":922},13,[711,924,798],{"emptyLinePlaceholder":33},[711,926,928,930,933,935,937,939,942,944,946,949,952],{"class":713,"line":927},14,[711,929,805],{"class":804},[711,931,932],{"class":808}," rate ",[711,934,812],{"class":725},[711,936,762],{"class":721},[711,938,726],{"class":725},[711,940,941],{"class":820},"per_second_or_panic",[711,943,835],{"class":736},[711,945,872],{"class":847},[711,947,313],{"class":948},"sMTiH",[711,950,951],{"class":847},"0",[711,953,954],{"class":736},");\n",[711,956,958,960,963,965,968,970,973,976,978,980,982,986,990,992,994,997,1000,1002,1005],{"class":713,"line":957},15,[711,959,805],{"class":804},[711,961,962],{"class":808}," decision ",[711,964,812],{"class":725},[711,966,967],{"class":808}," provider",[711,969,313],{"class":725},[711,971,972],{"class":820},"absolute",[711,974,975],{"class":736},"()",[711,977,313],{"class":725},[711,979,575],{"class":820},[711,981,835],{"class":736},[711,983,985],{"class":984},"siCPE","\"",[711,987,989],{"class":988},"sLACW","user-123",[711,991,985],{"class":984},[711,993,759],{"class":736},[711,995,996],{"class":725}," &",[711,998,999],{"class":808},"rate",[711,1001,759],{"class":736},[711,1003,1004],{"class":847}," 1",[711,1006,954],{"class":736},[205,1008,1009,1010,1012,1013,1015,1016,267,1019,1022],{},"Redis and hybrid users should construct ",[264,1011,278],{}," or\n",[264,1014,282],{}," with a connection manager, then enable exactly one of the\n",[264,1017,1018],{},"redis-tokio",[264,1020,1021],{},"redis-smol"," features. Redis-backed providers require Redis 7.2 or newer.",[205,1024,1025],{},[219,1026,1029],{"href":1027,"rel":1028},"https://github.com/dev-davexoyinbo/trypema/compare/v1.1.0...v2.0.0",[223],"Compare v1.1.0...v2.0.0",[1031,1032,1033],"style",{},"html pre.shiki code .shWJe, html code.shiki .shWJe{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sMTiH, html code.shiki .sMTiH{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}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 .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":707,"searchDepth":714,"depth":740,"links":1035},[1036,1037,1038,1039,1040,1041,1042],{"id":254,"depth":740,"text":255},{"id":449,"depth":740,"text":450},{"id":566,"depth":740,"text":567},{"id":609,"depth":740,"text":610},{"id":642,"depth":740,"text":643},{"id":663,"depth":740,"text":664},{"id":699,"depth":740,"text":700},null,"Breaking provider redesign, semantic configuration types, live reads, and conditional history updates.","md",{},{"icon":177},{"title":174,"description":1044},"LfcUdBzKeMDAIWI_ogAvrPjkuc6NA-x3yNNBSpumVpw",[1051,1053],{"title":167,"path":168,"stem":169,"description":1052,"icon":172,"children":-1},"Release notes for Trypema, ordered newest first.",{"title":179,"path":180,"stem":181,"description":1054,"icon":177,"children":-1},"Builder-driven setup, clearer public docs, and more stable Redis and hybrid doctests.",1784684768120]