|
3 | 3 | <head> |
4 | 4 | <meta charset="utf-8"> |
5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
6 | | - <title>YokedCache — Async multi-backend cache for Python</title> |
7 | | - <meta name="description" content="Async Python cache with the same API across memory, Redis, Memcached, disk, and SQLite. Tag invalidation, optional Starlette HTTP caching, metrics, and FastAPI-friendly helpers. MIT licensed."> |
| 6 | + <title>YokedCache — Multi-backend Python cache (async-first)</title> |
| 7 | + <meta name="description" content="Async-first Python cache across memory, Redis, Memcached, disk, and SQLite. Sync helpers for scripts and plain functions. Tag invalidation, optional HTTP caching, metrics. MIT licensed."> |
8 | 8 | <meta name="keywords" content="python, async cache, redis, memcached, sqlalchemy, caching, cache invalidation, starlette, fastapi, prometheus, yokedcache, Joshua Kac, Project Yoked"> |
9 | 9 | <meta name="author" content="Joshua Kac"> |
10 | 10 | <meta name="robots" content="index,follow"> |
|
15 | 15 | <meta property="og:type" content="website"> |
16 | 16 | <meta property="og:locale" content="en_US"> |
17 | 17 | <meta property="og:url" content="{{ home_canonical }}"> |
18 | | - <meta property="og:title" content="YokedCache — Async multi-backend cache for Python"> |
19 | | - <meta property="og:description" content="Async Python cache with the same API across memory, Redis, Memcached, disk, and SQLite. Tag invalidation, optional HTTP middleware, metrics. MIT licensed."> |
| 18 | + <meta property="og:title" content="YokedCache — Multi-backend Python cache (async-first)"> |
| 19 | + <meta property="og:description" content="Async-first cache across memory, Redis, Memcached, disk, SQLite. Sync helpers when you need them. Invalidation, optional HTTP middleware, metrics. MIT licensed."> |
20 | 20 | <meta property="og:image" content="{{ og_image_url }}"> |
21 | 21 | <meta property="og:image:width" content="1200"> |
22 | 22 | <meta property="og:image:height" content="630"> |
23 | 23 | <meta property="og:site_name" content="YokedCache"> |
24 | 24 | <meta name="twitter:card" content="summary_large_image"> |
25 | | - <meta name="twitter:title" content="YokedCache — Async multi-backend cache for Python"> |
26 | | - <meta name="twitter:description" content="Same async API for memory, Redis, Memcached, disk, and SQLite. Invalidation, optional HTTP caching, observability. MIT licensed."> |
| 25 | + <meta name="twitter:title" content="YokedCache — Multi-backend Python cache (async-first)"> |
| 26 | + <meta name="twitter:description" content="Async-first; sync helpers for scripts. Same API across memory, Redis, Memcached, disk, SQLite. Invalidation, HTTP caching, observability. MIT licensed."> |
27 | 27 | <meta name="twitter:image" content="{{ og_image_url }}"> |
28 | 28 | <link rel="preconnect" href="https://fonts.googleapis.com"> |
29 | 29 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
|
41 | 41 | "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" }, |
42 | 42 | "url": "{{ site_url }}", |
43 | 43 | "downloadUrl": "https://pypi.org/project/yokedcache/", |
44 | | - "description": "Async multi-backend Python cache: memory, Redis, Memcached, disk, SQLite; tag invalidation; optional Starlette HTTP caching.", |
| 44 | + "description": "Async-first multi-backend Python cache (memory, Redis, Memcached, disk, SQLite) with sync helpers; tag invalidation; optional Starlette HTTP caching.", |
45 | 45 | "codeRepository": "{{ github_repo }}", |
46 | 46 | "license": "https://opensource.org/licenses/MIT", |
47 | 47 | "author": { |
|
94 | 94 |
|
95 | 95 | <div class="landing"> |
96 | 96 | <section class="hero"> |
97 | | - <div class="hero-eyebrow">Open source · MIT License</div> |
98 | | - <h1>One async cache API,<br>your choice of backend</h1> |
| 97 | + <div class="hero-meta"> |
| 98 | + <div class="hero-eyebrow">Open source · MIT License</div> |
| 99 | + <a class="header-badge hero-version" href="https://pypi.org/project/yokedcache/{{ version }}/" target="_blank" rel="noopener" title="Latest release on PyPI" aria-label="Latest release on PyPI, version {{ version }}">v{{ version }}</a> |
| 100 | + </div> |
| 101 | + <h1>One cache API,<br>your choice of backend</h1> |
99 | 102 | <p class="hero-sub"> |
100 | | - Memory, Redis, Memcached, disk, or SQLite — same invalidation and patterns. |
101 | | - Optional Starlette HTTP caching, FastAPI-ready decorators, metrics, and a small CLI. |
| 103 | + Async-first across memory, Redis, Memcached, disk, and SQLite — same invalidation and patterns. |
| 104 | + Sync helpers when you are not in an async app. Optional HTTP caching, FastAPI decorators, metrics, CLI. |
102 | 105 | </p> |
103 | 106 | <div class="install-pill"> |
104 | 107 | <span class="prompt">$</span> |
|
134 | 137 | </div> |
135 | 138 | <div class="feature-card"> |
136 | 139 | <div class="feature-icon">◇</div> |
137 | | - <h3>Async everywhere</h3> |
138 | | - <p>Use from FastAPI, Starlette, Django async views, workers, or plain <code>asyncio</code>. Optional dependency helpers for FastAPI.</p> |
| 140 | + <h3>Fits async and sync</h3> |
| 141 | + <p>Use <code>await</code> in FastAPI, Starlette, Django async, and workers. For blocking code, <code>get_sync</code> / <code>set_sync</code> or <code>@cached</code> on a normal function.</p> |
139 | 142 | </div> |
140 | 143 | <div class="feature-card"> |
141 | 144 | <div class="feature-icon">◇</div> |
|
0 commit comments