1<!DOCTYPE html><html lang="en"><head><meta charSet="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><link rel="preload" as="image" href="/assets/quicksilver-icon-CpykCx5c.png"/><link rel="modulepreload" href="/assets/manifest-aeac50ca.js"/><link rel="modulepreload" href="/assets/entry.client-B7wf8w8V.js"/><link rel="modulepreload" href="/assets/jsx-runtime-u17CrQMm.js"/><link rel="modulepreload" href="/assets/vendor-router-CDcnGkqT.js"/><link rel="modulepreload" href="/assets/vendor-react-dom-Q1KUuwin.js"/><link rel="modulepreload" href="/assets/root-ByL5AEzP.js"/><link rel="modulepreload" href="/assets/useTheme-wnG-ps-c.js"/><link rel="modulepreload" href="/assets/i18n-CsfG60gm.js"/><link rel="modulepreload" href="/assets/i18next-mtv_Do9b.js"/><link rel="modulepreload" href="/assets/i18nInstance-C81hCH34.js"/><link rel="modulepreload" href="/assets/(_lang)-DwpDuSSB.js"/><link rel="modulepreload" href="/assets/button-db6VtZUt.js"/><link rel="modulepreload" href="/assets/IconBase.es-BuRJQq8N.js"/><link rel="modulepreload" href="/assets/X.es-DNyg1pI5.js"/><link rel="modulepreload" href="/assets/quicksilver-icon-CmAeTMgO.js"/><link rel="modulepreload" href="/assets/utils-Cp6r-zu7.js"/><link rel="modulepreload" href="/assets/vendor-tailwind-COJ8Fh6m.js"/><link rel="modulepreload" href="/assets/(_lang).plugins-DDpCIZsC.js"/><link rel="modulepreload" href="/assets/card-Cp08GKqR.js"/><link rel="modulepreload" href="/assets/input-BpL52GYs.js"/><link rel="modulepreload" href="/assets/dialog-dDZiTcgi.js"/>
1<script> 2 (function() { 3 var theme = localStorage.getItem('vite-ui-theme') || 'system'; 4 var root = document.documentElement; 5 6 root.classList.remove('light', 'dark'); 7 8 if (theme === 'system') { 9 var systemTheme = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; 10 root.classList.add(systemTheme); 11 } else { 12 root.classList.add(theme); 13 } 14 })(); 15</script>
15<link rel="stylesheet" href="/assets/root-BIB0bTDV.css"/></head><body><div class="relative min-h-screen flex flex-col overflow-x-hidden"><div class="absolute inset-0 -z-20 pointer-events-none"><div class="absolute inset-0 bg-gradient-to-b from-primary/5 via-transparent to-transparent"></div><div class="absolute top-0 left-1/2 -translate-x-1/2 w-[400px] h-[300px] sm:w-[600px] sm:h-[450px] lg:w-[800px] lg:h-[600px] bg-primary/10 rounded-full blur-3xl"></div></div><header class="fixed top-0 z-50 w-full transition-all duration-300 bg-transparent border-b border-transparent"><div class="px-4 md:px-8"><div class="mx-auto flex h-16 max-w-[1200px] items-center gap-3"><a class="flex items-center gap-2 flex-shrink-0" href="/" data-discover="true"><img src="/assets/quicksilver-icon-CpykCx5c.png" alt="Quicksilver" class="h-8 w-8"/><span class="text-lg font-semibold tracking-tight hidden sm:inline">Quicksilver</span></a><div class="flex-1"></div><nav class="hidden md:flex items-center gap-1"><a class="px-4 py-2 text-md rounded-md transition-colors hover:text-foreground text-muted-foreground hover:bg-background/50" href="/plugins" data-discover="true">Plugins</a><a class="px-4 py-2 text-md rounded-md transition-colors hover:text-foreground text-muted-foreground hover:bg-background/50" href="/donate" data-discover="true">Donate</a><a class="px-4 py-2 text-md rounded-md transition-colors hover:text-foreground text-muted-foreground hover:bg-background/50" href="/support" data-discover="true">Support</a></nav><button class="md:hidden p-2 rounded-lg hover:bg-background/50 transition-colors active:scale-95" aria-label="Toggle menu"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256"><path d="M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"></path></svg></button><a href="https://qs0.qsapp.com/plugins/download.php" data-slot="button" data-variant="default" data-size="sm" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 border border-transparent bg-clip-padding font-medium focus-visible:ring-[3px] aria-invalid:ring-[3px] [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none bg-primary text-primary-foreground hover:bg-primary/80 h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 text-md ml-2">Download</a><div class="hidden sm:block"><button data-slot="button" data-variant="ghost" data-size="icon" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-[3px] aria-invalid:ring-[3px] [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground size-9 h-9 w-9"><svg viewBox="0 0 24 24" fill="none" class="h-[1.2rem] w-[1.2rem]" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"></circle><path d="M12 2a10 10 0 0 0 0 20V2z" fill="currentColor"></path></svg><span class="sr-only">Toggle theme (<!-- -->system<!-- -->)</span></button></div><a href="https://github.com/quicksilver/Quicksilver" target="_blank" rel="noopener noreferrer" class="hidden sm:block ml-2 roun
15ded-lg bg-card hover:text-foreground hover:border-foreground/20 transition-colors hover-wobble"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 256 256"><path d="M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z"></path></svg></a></div></div></header><main class="flex-1 pt-16"><div class="mx-auto max-w-[1200px] px-4 md:px-8 py-12"><div class="flex flex-col gap-8"><div class="flex flex-col gap-4"><h1 class="text-3xl md:text-4xl font-bold tracking-tight">Plugins</h1><p class="text-muted-foreground max-w-2xl">Extend Quicksilver with plugins for your favorite apps and services.</p></div><div class="flex items-center justify-between gap-4"><div class="max-w-sm flex-1"><input data-slot="input" class="dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-9 rounded-md border bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] file:h-7 file:text-sm file:font-medium focus-visible:ring-[3px] aria-invalid:ring-[3px] md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50" placeholder="Search plugins..." value=""/></div><div class="flex items-center gap-4 text-sm"><span class="text-muted-foreground">search.resultCount</span><a href="https://developer.qsapp.com/plugin-development/intro/" target="_blank" rel="noopener noreferrer" class="text-primary hover:underline">Build your own!</a></div></div><div class="text-center py-12 text-muted-foreground">Loading plugins...</div></div></div></main><footer class="py-12 md:py-16 border-t border-border/50"><div class="mx-auto max-w-[1200px] px-4 md:px-8"><div class="grid grid-cols-2 md:grid-cols-4 gap-8 md:gap-12"><div class="flex flex-col gap-3"><h4 class="font-semibold text-sm">Documentation</h4><a href="https://qsapp.com/manual/" class="text-sm text-muted-foreground hover:text-foreground transition-colors">User Manual</a><a href="https://developer.qsapp.com/" class="text-sm text-muted-foreground hover:text-foreground transition-colors">Developer Docs</a><a href="https://github.com/quicksilver/Quicksilver/releases/" class="text-sm text-muted-foreground hover:text-foreground transition-colors">Changelog</a></div><div class="flex flex-col gap-3"><h4 class="font-semibold text-sm">Product</h4><a class="text-sm text-muted-foreground hover:text-foreground transition-colors" href="/plugins" data-discover="true">Plugins</a><a class="text-sm text-muted-foreground hover:text-foreground transition-colors" href="/faq" data-discover="true">FAQ</a><a class="text-sm text-muted-foreground hover:text-foreground transition-colors" href="/quicksilver-vs-alfred" data-discover="true">Quicksilver vs Alfred</a></div><div class="flex flex-col gap-3"><h4 class="font-semibold text-sm">Community</h4><a href="https://github.com/quicksilver/Quicksilver" class="text-sm text-muted-foreground hover:text-foreground transition-colors">GitHub</a><a href="https://github.com/quicksilver/Quicksilver/issues" class="text-sm text-muted-foreground hover:text-foreground transition-colors">Report an Issue</a><a href="https://explore.transifex.com/quicksilver/quicksilver/" class="text-sm text-muted-foreground hover:text-foreground transition-colors">Translate</a></div><div class="flex flex-col gap-3"><h4 class="font-semibold text-sm">Support</h4><a class="text-sm text-muted-foreground hover:text-foreground transition-colors" href="/donate" data-discover="true">Donate</a><a class="text-sm text-muted-foreground hover:text-foreground transition-colors" href="/support" data-discover="true">Get Help</a></div></div><div class="mt-12 pt-8 border-t border-border/50 flex flex-col md:flex-row items-center justify-between gap-4"><p class="text-sm text-muted-foreground">Quicksilver is free and open source software.<!-- --> ð</p><div class="flex items-center gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256" class="text-muted-foreground"><path d="M128,24h0A104,104,0,1,0,232,128,104.12,104.12,0,0,0,128,24Zm88,104a87.61,87.61,0,0,1-3.33,24H174.16a157.44,157.44,0,0,0,0-48h38.51A87.61,87.61,0,0,1,216,128ZM102,168H154a115.11,115.11,0,0,1-26,45A115.27,115.27,0,0,1,102,168Zm-3.9-16a140.84,140.84,0,0,1,0-48h59.88a140.84,140.84,0,0,1,0,48ZM40,128a87.61,87.61,0,0,1,3.33-24H81.84a157.44,157.44,0,0,0,0,48H43.33A87.61,87.61,0,0,1,40,128ZM154,88H102a115.11,115.11,0,0,1,26-45A115.27,115.27,0,0,1,154,88Zm52.33,0H170.71a135.28,135.28,0,0,0-22.3-45.6A88.29,88.29,0,0,1,206.37,88ZM107.59,42.4A135.28,135.28,0,0,0,85.29,88H49.63A88.29,88.29,0,0,1,10
157.59,42.4ZM49.63,168H85.29a135.28,135.28,0,0,0,22.3,45.6A88.29,88.29,0,0,1,49.63,168Zm98.78,45.6a135.28,135.28,0,0,0,22.3-45.6h35.66A88.29,88.29,0,0,1,148.41,213.6Z"></path></svg><select class="text-sm bg-transparent text-muted-foreground hover:text-foreground border border-border/50 rounded-md px-2 py-1 cursor-pointer transition-colors focus:outline-none focus:ring-1 focus:ring-primary"><option value="en" selected="">English</option><option value="zh-CN">ç®ä½ä¸æ</option><option value="cs">ÄeÅ¡tina</option></select></div></div></div></footer></div>
15<script>((storageKey2, restoreKey) => { 16 if (!window.history.state || !window.history.state.key) { 17 let key = Math.random().toString(32).slice(2); 18 window.history.replaceState({ key }, ""); 19 } 20 try { 21 let positions = JSON.parse(sessionStorage.getItem(storageKey2) || "{}"); 22 let storedY = positions[restoreKey || window.history.state.key]; 23 if (typeof storedY === "number") { 24 window.scrollTo(0, storedY); 25 } 26 } catch (error) { 27 console.error(error); 28 sessionStorage.removeItem(storageKey2); 29 } 30 })("react-router-scroll-positions", null)</script>
30<script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script>
30<script type="module" async="">import "/assets/manifest-aeac50ca.js"; 31import * as route0 from "/assets/root-ByL5AEzP.js"; 32import * as route1 from "/assets/(_lang)-DwpDuSSB.js"; 33import * as route2 from "/assets/(_lang).plugins-DDpCIZsC.js"; 34 35 window.__reactRouterRouteModules = {"root":route0,"routes/($lang)":route1,"routes/($lang).plugins":route2}; 36 37import("/assets/entry.client-B7wf8w8V.js");</script>
37<!--$?--><template id="B:0"></template><!--/$-->
37<script id="_R_">requestAnimationFrame(function(){$RT=performance.now()});</script>
37<div hidden id="S:0">
37<script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script>
37<!--$?--><template id="B:1"></template><!--/$--></div>
37<script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0}; 38$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script>
38<div hidden id="S:1">
38<script>window.__reactRouterContext.streamController.close();</script>
38</div>
38<script>$RC("B:1","S:1")</script>
38<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":"9bd0bd3c701d479fabab5214244c2810","r":1,"spa":2}' crossorigin="anonymous"></script>
38 39</body></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.