PageSourceSearch

https://djangopackages.org/grids/

html djangopackages.org collected 2026-10-02 04:15:37 UTC 65,056 bytes, 1,197 lines download raw bytes

1
2
3<!doctype html>
4<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="en-us" lang="en-us" ng-app>
5    <head>
6        <meta charset="UTF-8" />
7        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
8        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9        <meta name="theme-color" content="#f8f8f8" />
10        
11    
12    <!-- HTML Meta Tags -->
13<title>Django Packages : Grids</title>
14<meta name="description" content="Django Packages stores information on fetched packages and provides easy comparison tools for them. Public APIs include PyPI, GitHub, and Bitbucket." />
15<meta name="keywords" content="Django, Django Apps, Packages, Tools, Django Sites, Django Resources" />
16
17<meta property="og:description" content="Django Packages stores information on fetched packages and provides easy comparison tools for them. Public APIs include PyPI, GitHub, and Bitbucket." />
18<meta property="og:image" content="https://djangopackages.org/static/img/open_graph.png" />
19<meta property="og:image:alt" content="Django Packages logo" />
20<meta property="og:image:height" content="630" />
21<meta property="og:image:type" content="image/png" />
22<meta property="og:image:width" content="1200" />
23<meta property="og:site_name" content="Django Packages" />
24<meta property="og:title" content="Django Packages : Grids" />
25<meta property="og:type" content="website" />
26<meta property="og:url" content="https://djangopackages.org/grids/" />
27
28<!-- Twitter Meta Tags -->
29<meta property="twitter:domain" content="djangopackages.org">
30<meta property="twitter:url" content="https://djangopackages.org/grids/" />
31<meta name="twitter:card" content="summary_large_image">
32<meta name="twitter:description" content="Django Packages stores information on fetched packages and provides easy comparison tools for them. Public APIs include PyPI, GitHub, and Bitbucket." />
33<meta name="twitter:image" content="https://djangopackages.org/static/img/open_graph.png" />
34<meta name="twitter:title" content="Django Packages : Grids" />
35
36
37        <link rel="search" type="application/opensearchdescription+xml" href="/search/opensearch/description/" title="Django Packages">
38
39        
40        
41        
41<script>
42            document.documentElement.classList.toggle(
43                "dark",
44                localStorage.theme === "dark" ||
45                (!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches),
46            );
47        </script>
47
48        
49
50
51<link rel="preload" href="/static/css/tailwind.css" as="style">
52<link rel="stylesheet" href="/static/css/tailwind.css">
53
54
55
56        <link rel="stylesheet" href="/static/css/phosphor-icons/bold.min.css" type="text/css" />
57        <link rel="shortcut icon" href="/static/img/favicon.png" />
58        
59
60        
61            
62<script async src="https://media.ethicalads.io/media/client/ethicalads.min.js"></script>
62
63
64<script>
65    (function () {
66        function shouldReveal(adDiv) {
67            if (!adDiv) return false;
68			// EthicalAds injects markup into the placement div when an ad loads.
69            return adDiv.childNodes && adDiv.childNodes.length > 0 && adDiv.innerText && adDiv.innerText.trim().length > 0;
70        }
71
72        function reveal(slotEl) {
73            if (!slotEl) return;
74            slotEl.removeAttribute("hidden");
75        }
76
77        function initSlot(slotEl) {
78            var adDiv = slotEl.querySelector("[data-ea-publisher]");
79            if (shouldReveal(adDiv)) {
80                reveal(slotEl);
81                return;
82            }
83
84			// If the EthicalAds script is blocked, this observer will simply never fire,
85			// and the slot stays hidden (no extra whitespace).
86            var obs = new MutationObserver(function () {
87                if (shouldReveal(adDiv)) {
88                    reveal(slotEl);
89                    obs.disconnect();
90                }
91            });
92
93            obs.observe(adDiv, { childList: true, subtree: true, characterData: true });
94
95			// Don’t keep observers around forever on pages where no ad is returned.
96            window.setTimeout(function () {
97                try { obs.disconnect(); } catch (e) {}
98            }, 8000);
99        }
100
101        function initAll() {
102            document.querySelectorAll("[data-ethicalads-slot]").forEach(initSlot);
103        }
104
105        if (document.readyState === "loading") {
106            document.addEventListener("DOMContentLoaded", initAll);
107        } else {
108            initAll();
109        }
110    })();
111</script>
111
112
113        
114    </head>
115    <body class="bg-background flex min-h-screen flex-col">
116        
117
118        
119<!-- Header -->
120<header class="sticky top-0 z-40 px-3 pt-3 sm:px-4">
121    <div class="bg-brand dark:bg-brand/75 container rounded-md border border-white/15 px-4 shadow-lg inset-shadow-[0_1px_0_0_oklch(1_0_0/0.10)] shadow-black/10 backdrop-blur-xl backdrop-saturate-150 sm:px-6 dark:shadow-black/40">
122        <div class="flex h-14 items-center justify-between">
123            <div class="flex items-center gap-6">
124                <a href="/" class="flex items-center gap-2">
125                    <img src="/static/img/logo_squares.png" class="h-6 w-auto sm:h-7" alt="Django Packages" />
126                    <span class="text-brand-foreground text-base font-bold whitespace-nowrap sm:text-lg">Django Packages</span>
127                </a>
128                <nav class="hidden items-center gap-4 lg:flex">
129                    <a
130                        href="/packages/"
131                        class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/5 rounded-md px-3 py-2 text-sm font-medium transition-colors"
132                    >
133                        Packages
134                    </a>
135                    <a
136                        href="/grids/"
137                        class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/5 rounded-md px-3 py-2 text-sm font-medium transition-colors"
138                    >
139                        Grids
140                    </a>
141                </nav>
142            </div>
143
144            <div class="flex items-center gap-1 sm:gap-4">
145                
146                    
147                    <!-- Search Trigger (Modal Style) - Only shown on non-home pages -->
148                        <button
149                            type="button"
150                            data-open-search-modal
151                            class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/10 focus:ring-brand-foreground/30 lg:border-brand-foreground/20 lg:bg-brand-foreground/10 lg:hover:bg-brand-foreground/15 inline-flex h-9 w-9 items-center justify-center rounded-md transition-colors focus:ring-2 focus:outline-none lg:w-auto lg:gap-2 lg:border-2 lg:px-3"
152                            aria-haspopup="dialog"
153                            aria-controls="search-modal"
154                        >
155                            <i class="ph-bold ph-magnifying-glass text-base"></i>
156                            <span class="hidden lg:inline">Search</span>
157                            <span
158                                class="text-brand-foreground/80 border-brand-foreground/20 hidden items-center space-x-1 rounded border bg-black/20 px-1.5 py-0.5 text-xs transition-colors xl:flex"
159                            >
160                                <span>&#8984; /</span>
161                            </span>
162                        </button>
163                    
164                
165
166            <!-- Theme toggle: cycles light → dark → system; app.js keeps the icon in sync -->
167                <button
168                    type="button"
169                    data-theme-toggle
170                    class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/10 focus:ring-brand-foreground/30 inline-flex h-9 w-9 items-center justify-center rounded-md transition-colors focus:ring-2 focus:outline-none"
171                    aria-label="Change theme"
172                >
173                    <i class="ph-bold ph-circle-half text-xl" aria-hidden="true"></i>
174                </button>
175
176                
177                    <form method="post" action="/auth/login/github/" class="hidden lg:block">
178                        <input type="hidden" name="csrfmiddlewaretoken" value="jQXzLk797Dmvfv9l011FvACLAqffs63O2yUuU4xM4DZV15IcgnQdRyNohl4XadqD">
179                        <button
180                            type="submit"
181                            class="text-brand-foreground/90 bg-brand-foreground/10 border-brand-foreground/20 hover:text-brand-foreground hover:bg-brand-foreground/15 hover:border-brand-foreground
181/30 focus:ring-brand-foreground/30 inline-flex h-9 items-center justify-center rounded-md border px-3 text-sm font-semibold transition-colors focus:ring-2 focus:outline-none"
182                        >
183                            Log In
184                        </button>
185                    </form>
186                
187
188            <!-- Mobile menu button -->
189                <button
190                    id="mobile-menu-btn"
191                    class="text-brand-foreground hover:bg-brand-foreground/10 rounded-md p-2 transition-colors lg:hidden"
192                >
193                    <i class="ph-bold ph-list text-xl" id="menu-icon"></i>
194                </button>
195            </div>
196        </div>
197
198    <!-- Mobile menu -->
199        <div
200            id="mobile-menu"
201            class="hidden border-t border-white/10 lg:hidden"
202        >
203            <nav class="space-y-3 py-4">
204                
205                    
206                        <button
207                            type="button"
208                            data-open-search-modal
209                            class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/10 hidden w-full items-center gap-2 rounded-md px-3 py-2 text-left transition-colors"
210                            aria-haspopup="dialog"
211                            aria-controls="search-modal"
212                        >
213                            <i class="ph-bold ph-magnifying-glass text-base"></i>
214                            <span>Search</span>
215                        </button>
216                    
217                
218
219                <a href="/packages/" class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/5 block rounded-md px-3 py-2 text-base font-medium transition-colors">Packages</a>
220                <a href="/grids/" class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/5 block rounded-md px-3 py-2 text-base font-medium transition-colors">Grids</a>
221                
222                    <form method="post" action="/auth/login/github/">
223                        <input type="hidden" name="csrfmiddlewaretoken" value="jQXzLk797Dmvfv9l011FvACLAqffs63O2yUuU4xM4DZV15IcgnQdRyNohl4XadqD">
224                        <button type="submit" class="text-brand-foreground/80 hover:text-brand-foreground hover:bg-brand-foreground/5 block w-full rounded-md px-3 py-2 text-left text-base font-medium transition-colors">Log In</button>
225                    </form>
226                
227            </nav>
228        </div>
229    </div>
230</header>
231
232
233    
234        <!-- Search Modal (Command Palette Style) -->
235        <div
236            id="search-modal"
237            class="pointer-events-auto fixed inset-0 z-50 hidden"
238            aria-hidden="true"
239        >
240            <div
241                data-search-modal-backdrop
242                class="pointer-events-auto absolute inset-0 bg-black/40 opacity-0 backdrop-blur-sm transition-opacity duration-150 ease-out"
243            ></div>
244            <div class="pointer-events-none relative flex items-start justify-center px-4 pt-8 pb-6 sm:pt-12">
245                <div
246                    id="search-modal-panel"
247                    role="dialog"
248                    aria-modal="true"
249                    aria-labelledby="search-modal-title"
250                    class="border-border/50 bg-background pointer-events-auto w-full max-w-2xl scale-95 rounded-2xl border opacity-0 shadow-2xl transition duration-150 ease-out"
251                >
252                    <h2 id="search-modal-title" class="sr-only">Search</h2>
253                    <div class="p-3 sm:p-4">
254                        <!-- Search Bar -->
255                        <div class="group">
256                            <div class="relative">
257                                <i
258                                    class="ph-bold ph-magnifying-glass text-muted-foreground pointer-events-none absolute top-1/2 left-4 -translate-y-1/2 transform text-xl"
259                                ></i>
260                                <input
261                                    id="modal-search-input"
262                                    type="text"
263                                    name="q"
264                                    placeholder="Search Django packages..."
265                                    class="border-input bg-background text-foreground placeholder:text-muted-foreground focus:border-primary h-14 w-full rounded-xl border-2 py-4 pr-20 pl-12 text-lg transition-colors focus:outline-none"
266                                    autocomplete="off"
267                                    hx-get="/search/suggestions/"
268                                    hx-trigger="input changed delay:300ms, focus"
269                                    hx-target="#modal-suggestions-dropdown"
270                                    hx-vals='{"dropdown_id": "modal-suggestions-dropdown"}'
271                                    hx-indicator="#modal-search-spinner"
272                                />
273                                <div
274                                    class="pointer-events-none absolute top-1/2 right-4 flex -translate-y-1/2 transform items-center space-x-2"
275                                >
276                                    <div id="modal-search-spinner" class="htmx-indicator">
277                                        <i class="ph-bold ph-circle-notch text-muted-foreground animate-spin"></i>
278                                    </div>
279                                    <kbd class="text-muted-foreground bg-muted/50 border-border hidden items-center rounded border px-2 py-1 text-xs sm:inline-flex">
280                                        Esc
281                                    </kbd>
282                                </div>
283                            </div>
284
285                            <!-- Suggestions Panel -->
286                            <div
287                                id="modal-suggestions-dropdown"
288                                class="border-border/60 bg-background dark:bg-popover dark:border-border mt-3 hidden overflow-hidden rounded-xl border shadow-xl empty:hidden data-[open=true]:block dark:inset-shadow-[0_1px_0_0_oklch(1_0_0/0.08)] dark:shadow-black/60"
289                            ></div>
290                        </div>
291                    </div>
292                </div>
293            </div>
294        </div>
295    
296
297
298        
299
300        <main class="flex-1">
301            
302    <!-- Breadcrumb Section -->
303    <section class="bg-primary/10 py-4">
304        <div class="container mx-auto px-4">
305            <div class="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
306                <div class="text-muted-foreground flex items-center text-sm">
307                    <a href="/" class="hover:underline">Home</a>
308                    <span class="mx-2">»</span>
309                    <span class="text-foreground truncate font-medium">Grids</span>
310                </div>
311                <div class="flex w-full flex-wrap items-center gap-2 lg:w-auto">
312                    
313                </div>
314            </div>
315        </div>
316    </section>
317
318    <div class="container mx-auto px-4 py-8">
319        <div class="mb-8">
320            <h1 class="text-foreground text-3xl font-bold">Grids</h1>
321            <p class="text-muted-foreground pt-2">Browse and search grids</p>
322        </div>
323
324        
325
326
327    <div class="ethicalads-slot my-4" data-ethicalads-slot hidden>
328        <div class="flex justify-center">
329            <div
330                class="flat"
331                data-ea-publisher="djangopackagesorg"
332                id="grids-list-inline"
333                data-ea-type="text"
334            ></div>
335        </div>
336    </div>
337
338
339
340        <div class="card">
341            <div class="card-content p-6">
342                <!-- Search Input -->
343                <div class="relative">
344                    <i class="ph-bold ph-magnifying-glass text-muted-foreground absolute top-1/2 left-3.5 -translate-y-1/2 text-lg"></i>
345                    <input type="text"
346                           name="q"
347                           class="bg-background text-foreground focus:ring-primary h-12 w-full rounded-lg border pr-4 pl-11 shadow-sm transition-shadow focus:ring-2 focus:outline-none"
348                           placeholder="Search grids..."
349                           value=""
350                           hx-get="/grids/"
351                           hx-trigger="input changed delay:300ms"
352                           hx-target="#grid-list-container"
353                           hx-indicator="#grid-list-spinner"
354                           hx-include="#grid-list-state input"
355                           hx-push-url="true">
356                </div>
357            </div>
358        </div>
359
360        <div class="card relative mt-6">
361            <div id="grid-list-spinner" class="htmx-indicator bg-background/50 pointer-events-none absolute inset-0 z-10 flex items-center justify-center rounded-xl backdrop-blur-[1px]">
362                <i class="ph-bold ph-circle-notch text-primary animate-spin text-4xl"></i>
363            </div>
364            <div class="card-content p-6">
365                <div id="grid-list-container">
366                    
367
368<div id="grid-list-state" class="hidden">
369    <input type="hidden" name="sort" value="-modified">
370</div>
371
372<!-- Table -->
373<div class="w-full overflow-x-auto">
374    <table class="w-full text-left text-sm">
375        <thead>
376            <tr class="border-b text-left">
377                <th class="text-muted-foreground pr-6 pb-3 font-medium">
378                    <button class="hover:text-foreground flex items-center gap-1"
379                            hx-get="/grids/?sort=title&q="
380                            hx-target="#grid-list-container"
381                            hx-push-url="true" hx-indicator="#grid-list-spinner">
382                        <i class="ph-bold ph-squares-four text-lg"></i>
383                        Title
384                        
385                            <i class="ph-bold ph-caret-up-down opacity-50"></i>
386                        
387                    </button>
388                </th>
389                <th class="text-muted-foreground hidden pb-3 font-medium md:table-cell">
390                    <button class="hover:text-foreground flex items-center gap-1"
391                            hx-get="/grids/?sort=-gridpackage_count&q="
392                            hx-target="#grid-list-container"
393                            hx-push-url="true" hx-indicator="#grid-list-spinner">
394                        <i class="ph-bold ph-package text-lg"></i>
395                        Total Packages
396                        
397                            <i class="ph-bold ph-caret-up-down opacity-50"></i>
398                        
399                    </button>
400                </th>
401                <th class="text-muted-foreground hidden pb-3 font-medium lg:table-cell">
402                    <button class="hover:text-foreground flex items-center gap-1"
403                            hx-get="/grids/?sort=-active_gridpackage_count&q="
404                            hx-target="#grid-list-container"
405                            hx-push-url="true" hx-indicator="#grid-list-spinner">
406                        <i class="ph-bold ph-package text-lg"></i>
407                        Active Packages
408                        
409                            <i class="ph-bold ph-caret-up-down opacity-50"></i>
410                        
411                    </button>
412                </th>
413                <th class="text-muted-foreground hidden pb-3 font-medium lg:table-cell">
414                    <div class="flex items-center gap-1">
415                        <i class="ph-bold ph-list-checks text-lg"></i>
416                        Features
417                    </div>
418                </th>
419                <th class="text-muted-foreground pb-3 font-medium">
420                    <button class="hover:text-foreground flex items-center gap-1"
421                            hx-get="/grids/?sort=modified&q="
422                            hx-target="#grid-list-container"
423                            hx-push-url="true" hx-indicator="#grid-list-spinner">
424                        <i class="ph-bold ph-clock text-lg"></i>
425                        Updated
426                        
427                            <i class="ph-bold ph-caret-down"></i>
428                        
429                    </button>
430                </th>
431            </tr>
432        </thead>
433        <tbody>
434            
435                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
436                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
437                        <div class="flex flex-col">
438                            <a href="/grids/g/javascript-tooling/" class="text-primary block truncate text-base font-semibold hover:underline" title="JavaScript Tooling">JavaScript Tooling</a>
439                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Packages that connect the JavaScript ecosystem to your Django project.">Packages that connect the JavaScript ecosystem to your Django project.</p>
440
441                            <!-- Mobile Badges -->
442                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
443                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
444                                    <i class="ph-bold ph-package mr-1"></i> 7
445                                </span>
446                            </div>
447                        </div>
448                    </td>
449                    <td class="hidden py-3 font-mono text-sm md:table-cell">
450                        7
451                    </td>
452                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
453                        7
454                    </td>
455                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
456                        5
457                    </td>
458                    <td class="text-muted-foreground py-3 text-sm">
459                        Jul 02, 2026
460                    </td>
461                </tr>
462            
463                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
464                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
465                        <div class="flex flex-col">
466                            <a href="/grids/g/solana/" class="text-primary block truncate text-base font-semibold hover:underline" title="Solana">Solana</a>
467                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Comparison of packages for the Solana blockchain.">Comparison of packages for the Solana blockchain.</p>
468
469                            <!-- Mobile Badges -->
470                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
471                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
472                                    <i class="ph-bold ph-package mr-1"></i> 1
473                                </span>
474                            </div>
475                        </div>
476                    </td>
477                    <td class="hidden py-3 font-mono text-sm md:table-cell">
478                        1
479                    </td>
480                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
481                        1
482                    </td>
483                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
484                        0
485                    </td>
486                    <td class="text-muted-foreground py-3 text-sm">
487                        Feb 15, 2026
488                    </td>
489                </tr>
490            
491                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
492                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
493                        <div class="flex flex-col">
494                            <a href="/grids/g/task-framework/" class="text-primary block truncate text-base font-semibold hover:underline" title="Task Framework">Task Framework</a>
495                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Projects implementing Django&#x27;
495s Tasks Framework
496
497https://docs.djangoproject.com/en/6.0/topics/tasks/">Projects implementing Django&#x27;s Tasks Framework
498
499https://docs.djangoproject.com/en/6.0/topics/tasks/</p>
500
501                            <!-- Mobile Badges -->
502                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
503                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
504                                    <i class="ph-bold ph-package mr-1"></i> 13
505                                </span>
506                            </div>
507                        </div>
508                    </td>
509                    <td class="hidden py-3 font-mono text-sm md:table-cell">
510                        13
511                    </td>
512                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
513                        13
514                    </td>
515                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
516                        0
517                    </td>
518                    <td class="text-muted-foreground py-3 text-sm">
519                        Dec 13, 2025
520                    </td>
521                </tr>
522            
523                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
524                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
525                        <div class="flex flex-col">
526                            <a href="/grids/g/blog/" class="text-primary block truncate text-base font-semibold hover:underline" title="Blog">Blog</a>
527                            <p class="text-muted-foreground mt-1 truncate text-xs" title="A blog app is designed to facilitate the creation, publishing, and management of blog content, typically featuring articles, posts, and categories.">A blog app is designed to facilitate the creation, publishing, and management of blog content, typically featuring articles, posts, and categories.</p>
528
529                            <!-- Mobile Badges -->
530                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
531                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
532                                    <i class="ph-bold ph-package mr-1"></i> 18
533                                </span>
534                            </div>
535                        </div>
536                    </td>
537                    <td class="hidden py-3 font-mono text-sm md:table-cell">
538                        57
539                    </td>
540                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
541                        18
542                    </td>
543                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
544                        29
545                    </td>
546                    <td class="text-muted-foreground py-3 text-sm">
547                        Nov 14, 2025
548                    </td>
549                </tr>
550            
551                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
552                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
553                        <div class="flex flex-col">
554                            <a href="/grids/g/mcp/" class="text-primary block truncate text-base font-semibold hover:underline" title="Model Context Protocol (MCP)">Model Context Protocol (MCP)</a>
555                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Packages and tools that implement or support the Model Context Protocol, a standard for connecting language models to external data and actions. These projects help Django developers exp
555ose structured context, tools, and resources to LLMs in a consistent way.">Packages and tools that implement or support the Model Context Protocol, a standard for connecting language models to external data and actions. These projects help Django developers expose structured context, tools, and resources to LLMs in a consistent way.</p>
556
557                            <!-- Mobile Badges -->
558                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
559                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
560                                    <i class="ph-bold ph-package mr-1"></i> 8
561                                </span>
562                            </div>
563                        </div>
564                    </td>
565                    <td class="hidden py-3 font-mono text-sm md:table-cell">
566                        8
567                    </td>
568                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
569                        8
570                    </td>
571                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
572                        0
573                    </td>
574                    <td class="text-muted-foreground py-3 text-sm">
575                        Nov 13, 2025
576                    </td>
577                </tr>
578            
579                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
580                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
581                        <div class="flex flex-col">
582                            <a href="/grids/g/async/" class="text-primary block truncate text-base font-semibold hover:underline" title="async">async</a>
583                            <p class="text-muted-foreground mt-1 truncate text-xs" title="packages adding async support to various django related subjects">packages adding async support to various django related subjects</p>
584
585                            <!-- Mobile Badges -->
586                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
587                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
588                                    <i class="ph-bold ph-package mr-1"></i> 1
589                                </span>
590                            </div>
591                        </div>
592                    </td>
593                    <td class="hidden py-3 font-mono text-sm md:table-cell">
594                        1
595                    </td>
596                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
597                        1
598                    </td>
599                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
600                        0
601                    </td>
602                    <td class="text-muted-foreground py-3 text-sm">
603                        Sep 06, 2025
604                    </td>
605                </tr>
606            
607                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
608                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
609                        <div class="flex flex-col">
610                            <a href="/grids/g/rate-limiting/" class="text-primary block truncate text-base font-semibold hover:underline" title="rate-limiting">rate-limiting</a>
611                            <p class="text-muted-foreground mt-1 truncate text-xs" title="rate-limiting">rate-limiting</p>
612
613                            <!-- Mobile Badges -->
614                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
615                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
616                                    <i class="ph-bold ph-package mr-1"></i> 2
617                                </span>
618                            </div>
619                        </div>
620                    </td>
621                    <td class="hidden py-3 font-mono text-sm md:table-cell">
622                        2
623                    </td>
624                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
625                        2
626                    </td>
627                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
628                        0
629                    </td>
630                    <td class="text-muted-foreground py-3 text-sm">
631                        Jul 12, 2025
632                    </td>
633                </tr>
634            
635                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
636                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
637                        <div class="flex flex-col">
638                            <a href="/grids/g/throttling/" class="text-primary block truncate text-base font-semibold hover:underline" title="throttling">throttling</a>
639                            <p class="text-muted-foreground mt-1 truncate text-xs" title="throttling">throttling</p>
640
641                            <!-- Mobile Badges -->
642                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
643                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
644                                    <i class="ph-bold ph-package mr-1"></i> 2
645                                </span>
646                            </div>
647                        </div>
648                    </td>
649                    <td class="hidden py-3 font-mono text-sm md:table-cell">
650                        2
651                    </td>
652                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
653                        2
654                    </td>
655                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
656                        0
657                    </td>
658                    <td class="text-muted-foreground py-3 text-sm">
659                        Jul 12, 2025
660                    </td>
661                </tr>
662            
663                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
664                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
665                        <div class="flex flex-col">
666                            <a href="/grids/g/ai/" class="text-primary block truncate text-base font-semibold hover:underline" title="AI">AI</a>
667                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Django apps to facilitate integration of Artificial Intelligence features.">Django apps to facilitate integration of Artificial Intelligence features.</p>
668
669                            <!-- Mobile Badges -->
670                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
671                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
672                                    <i class="ph-bold ph-package mr-1"></i> 9
673                                </span>
674                            </div>
675                        </div>
676                    </td>
677                    <td class="hidden py-3 font-mono text-sm md:table-cell">
678                        9
679                    </td>
680                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
681                        9
682                    </td>
683                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
684                        0
685                    </td>
686                    <td class="text-muted-foreground py-3 text-sm">
687                        Jul 09, 2025
688                    </td>
689                </tr>
690            
691                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
692                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
693                        <div class="flex flex-col">
694                            <a href="/grids/g/ticketing/" class="text-primary block truncate text-base font-semibold hover:underline" title="Ticketing">Ticketing</a>
695                            <p class="text-muted-foreground mt-1 truncate text-xs" title="To-do systems and ticket managers.">To-do systems and ticket managers.</p>
696
697                            <!-- Mobile Badges -->
698                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
699                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
700                                    <i class="ph-bold ph-package mr-1"></i> 3
701                                </span>
702                            </div>
703                        </div>
704                    </td>
705                    <td class="hidden py-3 font-mono text-sm md:table-cell">
706                        10
707                    </td>
708                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
709                        3
710                    </td>
711                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
712                        22
713                    </td>
714                    <td class="text-muted-foreground py-3 text-sm">
715                        Jul 09, 2025
716                    </td>
717                </tr>
718            
719                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
720                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
721                        <div class="flex flex-col">
722                            <a href="/grids/g/admin-interface/" class="text-primary block truncate text-base font-semibold hover:underline" title="Admin interface">Admin interface</a>
723                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Ap
723ps related to the django admin interface.">Apps related to the django admin interface.</p>
724
725                            <!-- Mobile Badges -->
726                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
727                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
728                                    <i class="ph-bold ph-package mr-1"></i> 67
729                                </span>
730                            </div>
731                        </div>
732                    </td>
733                    <td class="hidden py-3 font-mono text-sm md:table-cell">
734                        148
735                    </td>
736                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
737                        67
738                    </td>
739                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
740                        15
741                    </td>
742                    <td class="text-muted-foreground py-3 text-sm">
743                        Mar 13, 2025
744                    </td>
745                </tr>
746            
747                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
748                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
749                        <div class="flex flex-col">
750                            <a href="/grids/g/admin-styling/" class="text-primary block truncate text-base font-semibold hover:underline" title="Admin Styling">Admin Styling</a>
751                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Grid for packages that make django admin look different">Grid for packages that make django admin look different</p>
752
753                            <!-- Mobile Badges -->
754                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
755                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
756                                    <i class="ph-bold ph-package mr-1"></i> 25
757                                </span>
758                            </div>
759                        </div>
760                    </td>
761                    <td class="hidden py-3 font-mono text-sm md:table-cell">
762                        41
763                    </td>
764                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
765                        25
766                    </td>
767                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
768                        11
769                    </td>
770                    <td class="text-muted-foreground py-3 text-sm">
771                        Mar 06, 2025
772                    </td>
773                </tr>
774            
775                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
776                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
777                        <div class="flex flex-col">
778                            <a href="/grids/g/label_printing/" class="text-primary block truncate text-base font-semibold hover:underline" title="Label Printing">Label Printing</a>
779                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Label printing">Label printing</p>
780
781                            <!-- Mobile Badges -->
782                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
783                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
784                                    <i class="ph-bold ph-package mr-1"></i> 2
785                                </span>
786                            </div>
787                        </div>
788                    </td>
789                    <td class="hidden py-3 font-mono text-sm md:table-cell">
790                        2
791                    </td>
792                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
793                        2
794                    </td>
795                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
796                        0
797                    </td>
798                    <td class="text-muted-foreground py-3 text-sm">
799                        Jan 22, 2025
800                    </td>
801                </tr>
802            
803                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
804                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
805                        <div class="flex flex-col">
806                            <a href="/grids/g/clinical_trials/" class="text-primary block truncate text-base font-semibold hover:underline" title="Clinical Trials">Clinical Trials</a>
807                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Clinical trials data management">Clinical trials data management</p>
808
809                            <!-- Mobile Badges -->
810                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
811                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
812                                    <i class="ph-bold ph-package mr-1"></i> 1
813                                </span>
814                            </div>
815                        </div>
816                    </td>
817                    <td class="hidden py-3 font-mono text-sm md:table-cell">
818                        1
819                    </td>
820                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
821                        1
822                    </td>
823                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
824                        0
825                    </td>
826                    <td class="text-muted-foreground py-3 text-sm">
827                        Jan 22, 2025
828                    </td>
829                </tr>
830            
831                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
832                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
833                        <div class="flex flex-col">
834                            <a href="/grids/g/django-ninja/" class="text-primary block truncate text-base font-semibold hover:underline" title="Django Ninja">Django Ninja</a>
835                            <p class="text-muted-foreground mt-1 truncate text-xs" title="A grid of third-party packages for the Django Ninja REST Framework.">A grid of third-party packages for the Django Ninja REST Framework.</p>
836
837                            <!-- Mobile Badges -->
838                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
839                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
840                                    <i class="ph-bold ph-package mr-1"></i> 10
841                                </span>
842                            </div>
843                        </div>
844                    </td>
845                    <td class="hidden py-3 font-mono text-sm md:table-cell">
846                        11
847                    </td>
848                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
849                        10
850                    </td>
851                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
852                        0
853                    </td>
854                    <td class="text-muted-foreground py-3 text-sm">
855                        Aug 07, 2024
856                    </td>
857                </tr>
858            
859                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
860                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
861                        <div class="flex flex-col">
862                            <a href="/grids/g/threadlocal-user-middleware/" class="text-primary block truncate text-base font-semibold hover:underline" title="Threadlocal User Middleware">Threadlocal User Middleware</a>
863                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Threadlocal User Middleware provides a way to access the current user deep within contexts where it might not be possible to pass the user down into the stack, e.g. filtering or logging.">Threadlocal User Middleware provides a way to access the current user deep within contexts where it might not be possible to pass the user down into the stack, e.g. filtering or logging.</p>
864
865                            <!-- Mobile Badges -->
866                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
867                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
868                                    <i class="ph-bold ph-package mr-1"></i> 1
869                                </span>
870                            </div>
871                        </div>
872                    </td>
873                    <td class="hidden py-3 font-mono text-sm md:table-cell">
874                        4
875                    </td>
876                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
877                        1
878                    </td>
879                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
880                        1
881                    </td>
882                    <td class="text-muted-foreground py-3 text-sm">
883                        Jul 09, 2024
884                    </td>
885                </tr>
886            
887                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
888                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
889                        <div class="flex flex-col">
890                            <a href="/grids/g/anti-spam/" class="text-primary block truncate text-base font-semibold hover:underline" title="Anti spam">Anti spam</a>
891                            <p class="text-muted-foreground mt-1 truncate text-xs" title="This grid contains apps which reduce spam.">This grid contains apps which reduce spam.</p>
892
893                            <!-- Mobile Badges -->
894                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
895                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
896                                    <i class="ph-bold ph-package mr-1"></i> 4
897                                </span>
898                            </div>
899                        </div>
900                    </td>
901                    <td class="hidden py-3 font-mono text-sm md:table-cell">
902                        13
903                    </td>
904                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
905                        4
906                    </td>
907                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
908                        6
909                    </td>
910                    <td class="text-muted-foreground py-3 text-sm">
911                        May 07, 2024
912                    </td>
913                </tr>
914            
915                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
916                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
917                        <div class="flex flex-col">
918                            <a href="/grids/g/nosql/" class="text-primary block truncate text-base font-semibold hover:underline" title="NoSQL">NoSQL</a>
919                            <p class="text-muted-foreground mt-1 truncate text-xs" title="This is a grid of non-relational database backends.">This is a grid of non-relational database backends.</p>
920
921                            <!-- Mobile Badges -->
922                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
923                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
924                                    <i class="ph-bold ph-package mr-1"></i> 3
925                                </span>
926                            </div>
927                        </div>
928                    </td>
929                    <td class="hidden py-3 font-mono text-sm md:table-cell">
930                        13
931                    </td>
932                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
933                        3
934                    </td>
935                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
936                        65
937                    </td>
938                    <td class="text-muted-foreground py-3 text-sm">
939                        May 07, 2024
940                    </td>
941                </tr>
942            
943                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
944                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
945                        <div class="flex flex-col">
946                            <a href="/grids/g/feature-flip/" class="text-primary block truncate text-base font-semibold hover:underline" title="Feature Flipping">Feature Flipping</a>
947                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Evaluate apps and libraries that enable us to flip features for users">Evaluate apps and libraries that enable us to flip features for users</p>
948
949                            <!-- Mobile Badges -->
950                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
951                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
952                                    <i class="ph-bold ph-package mr-1"></i> 4
953                                </span>
954                            </div>
955                        </div>
956                    </td>
957                    <td class="hidden py-3 font-mono text-sm md:table-cell">
958                        16
959                    </td>
960                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
961                        4
962                    </td>
963                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
964                        15
965                    </td>
966                    <td class="text-muted-foreground py-3 text-sm">
967                        May 07, 2024
968                    </td>
969                </tr>
970            
971                <tr class="hover:bg-muted/30 border-b transition-colors last:border-0">
972                    <td class="max-w-[10rem] py-3 pr-6 sm:max-w-[15rem] md:max-w-[20rem]">
973                        <div class="flex flex-col">
974                            <a href="/grids/g/mongodb/" class="text-primary block truncate text-base font-semibold hover:underline" title="MongoDB">MongoDB</a>
975                            <p class="text-muted-foreground mt-1 truncate text-xs" title="Packages that help you tie MongoDB into Django.">Packages that help you tie MongoDB into Django.</p>
976
977                            <!-- Mobile Badges -->
978                            <div class="mt-2 flex flex-wrap gap-2 md:hidden">
979                                <span class="bg-muted text-muted-foreground inline-flex items-center rounded px-2 py-0.5 text-xs font-medium" title="Packages">
980                                    <i class="ph-bold ph-package mr-1"></i> 4
981                                </span>
982                            </div>
983                        </div>
984                    </td>
985                    <td class="hidden py-3 font-mono text-sm md:table-cell">
986                        21
987                    </td>
988                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
989                        4
990                    </td>
991                    <td class="hidden py-3 font-mono text-sm lg:table-cell">
992                        3
993                    </td>
994                    <td class="text-muted-foreground py-3 text-sm">
995                        May 03, 2024
996                    </td>
997                </tr>
998            
999        </tbody>
1000    </table>
1001</div>
1002
1003<!-- Pagination -->
1004
1005    <div class="mt-8 flex justify-center">
1006        <div class="inline-flex flex-wrap items-center gap-1">
1007            <button
1008                
1009                    disabled
1010                
1011                class="border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex h-9 items-center justify-center rounded-md border px-2 text-sm font-medium whitespace-nowrap transition-colors disabled:pointer-events-none disabled:opacity-50 sm:px-3">
1012                <i class="ph-bold ph-caret-left mr-1"></i>
1013                <span class="hidden sm:inline">Previous</span>
1014            </button>
1015
1016            <div class="inline-flex items-center gap-1">
1017                
1018                    
1019                        <button
1020                            class="bg-primary text-primary-foreground inline-flex h-9 w-9 items-center justify-center rounded-md text-sm font-medium whitespace-nowrap transition-colors">
1021                            1
1022                        </button>
1023                    
1024                
1025                    
1026                        <button
1027                            hx-get="/grids/?page=2&sort=-modified&q="
1028                            hx-target="#grid-list-container"
1029                            hx-push-url="true" hx-indicator="#grid-list-spinner"
1030                            class="border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex h-9 w-9 items-center justify-center rounded-md border text-sm font-medium whitespace-nowrap transition-colors">
1031                            2
1032                        </button>
1033                    
1034                
1035                    
1036                        <button
1037                            hx-get="/grids/?page=3&sort=-modified&q="
1038                            hx-target="#grid-list-container"
1039                            hx-push-url="true" hx-indicator="#grid-list-spinner"
1040                            class="border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex h-9 w-9 items-center justify-center rounded-md border text-sm font-medium whitespace-nowrap transition-colors">
1041                            3
1042                        </button>
1043                    
1044                
1045                    
1046                
1047                    
1048                
1049                    
1050                
1051                    
1052                
1053                    
1054                
1055                    
1056                
1057                    
1058                
1059                    
1060                
1061                    
1062                
1063                    
1064                
1065                    
1066                
1067                    
1068                
1069                    
1070                
1071                    
1072                
1073                    
1074                
1075                    
1076                
1077            </div>
1078
1079            <button
1080                
1081                    hx-get="/grids/?page=2&sort=-modified&q="
1082                    hx-target="#grid-list-container"
1083                    hx-push-url="true" hx-indicator="#grid-list-spinner"
1084                
1085                class="border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex h-9 items-center justify-center rounded-md border px-2 text-sm font-medium whitespace-nowrap transition-colors disabled:pointer-events-none disabled:opacity-50 sm:px-3">
1086                <span class="hidden sm:inline">Next</span>
1087                <i class="ph-bold ph-caret-right ml-1"></i>
1088            </button>
1089        </div>
1090    </div>
1091
1092
1093                </div>
1094            </div>
1095        </div>
1096    </div>
1097
1098        </main>
1099        
1100<!-- Footer -->
1101<footer class="text-brand-foreground">
1102    <div class="pt-8 pb-4" style="background-color: oklch(39.3% 0.095 152.535)">
1103        <div class="container mx-auto px-4 text-center">
1104            <p class="text-sm">
1105                Projects listed on Django Packages are third-party packages. They are not vetted nor endorsed by the Django Software Foundation. Use them at your own risk.
1106            </p>
1107        </div>
1108    </div>
1109    <div class="bg-brand pt-4 pb-8">
1110        <div class="container mx-auto px-4">
1111            <div class="flex flex-wrap justify-center gap-6 text-sm">
1112                <a
1113                    href="https://github.com/djangopackages/djangopackages"
1114                    class="flex items-center gap-2 opacity-90 hover:opacity-100"
1115                >
1116                    <i class="ph-bold ph-github-logo"></i>
1117                    Repo
1118                </a>
1119                <a href="/faq/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1120                    <i class="ph-bold ph-question"></i>
1121                    FAQ
1122                </a>
1123                <a href="/terms/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1124                    <i class="ph-bold ph-file-text"></i>
1125                    Terms
1126                </a>
1127                <a href="/acceptable-use/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1128                    <i class="ph-bold ph-shield-check"></i>
1129                    Acceptable Use
1130                </a>
1131                <a
1132                    href="https://docs.djangopackages.org/en/latest/contributing/"
1133                    class="flex items-center gap-2 opacity-90 hover:opacity-100"
1134                >
1135                    <i class="ph-bold ph-git-pull-request"></i>
1136                    Contribute
1137                </a>
1138                <a href="/api/v4/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1139                    <i class="ph-bold ph-plugs"></i>
1140                    API
1141                </a>
1142                <a href="/syndication/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1143                    <i class="ph-bold ph-rss"></i>
1144                    RSS / Atom
1145                </a>
1146                <a href="/changelog/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1147                    <i class="ph-bold ph-list-dashes"></i>
1148                    Changelog
1149                </a>
1150                <a href="/funding/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1151                    <i class="ph-bold ph-heart"></i>
1152                    Funding
1153                </a>
1154                <a href="/readiness/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1155                    <i class="ph-bold ph-file-py"></i>
1156                    Readiness
1157                </a>
1158                <a href="https://djangojobboard.com" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1159                    <i class="ph-bold ph-briefcase"></i>
1160                    Django Job Board
1161                </a>
1162                <a href="https://django-news.com/" class="flex items-center gap-2 opacity-90 hover:opacity-100">
1163                    <i class="ph-bold ph-newspaper"></i>
1164                    Django News Newsletter
1165                </a>
1166            </div>
1167
1168            <div class="text-center text-sm opacity-90">
1169                <p>
1170                    &copy; 2010-2026 <a href="https://github.com/djangopackages/djangopackages/graphs/contributors" class="hover:underline">Contributors</a>,
1171                    
1172                    2010-2021 funded by <a href="https://www.feldroy.com/tech" class="hover:underline">Two Scoops Press</a>, an imprint of <a href="https://www.feldroy.com/" class="hover:underline">Feldroy</a>.<br>
1173                    Originally developed by <a href="http://daniel.feldroy.com" class="hover:underline">Daniel Roy Greenfeld</a> &amp; <a href="https://audrey.feldroy.com/" class="hover:underline">Audrey Roy Greenfeld</a>.
1174                    
1175                </p>
1176                <p class="mt-2">
1177                    Thank you to our <a href="https://github.com/djangopackages/djangopackages/graphs/contributors" class="hover:underline">maintainers and contributors</a> and to <a href="https://www.revsys.com/" class="hover:underline">REVSYS</a> for sponsoring development.
1178                </p>
1179                <p class="mt-2">
1180                    Special thanks to <a href="https://djangonaut.space" class="hover:underline">Djangonaut Space</a>.
1181                </p>
1182                <p class="mt-2">
1183                    Hosted on Hetzner.
1184                    <a href="https://hetzner.cloud/?ref=R4fnKzKtBqFn" class="hover:underline">Please use our referral link to receive a free $20 credit to get you started.</a>
1185                </p>
1186            </div>
1187        </div>
1188    </div>
1189</footer>
1190
1191
1192        
1192<script src="/static/js/app.js"></script>
1192
1193        
1193<script src="/static/js/htmx.min.js" defer></script>
1193
1194        
1195    
1195<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"509b980cf1254774ad4e5608e6c5e65a","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 1195
1195
1196<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a440e3107faea2a1',t:'MTc5MDkxNDUzNw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
1196</body>
1197</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.