History

Position cloud as primary CTA on marketing site (#525)

* Position cloud as primary CTA on marketing site Reorganizes the landing page to lead with hosted Executor as the recommended path for teams, with local/open source as the secondary option. Both are framed as a side-by-side choice rather than the local install being the only path. - Nav and hero CTA now point at /cloud (Try Cloud) - New 'Pick your path' section with cloud and local cards side by side - Hero copy: 'integration layer' replaces 'execution layer' - Roadmap: Team management & SaaS in Now; Soon updated to Skills, Generative UI, Workflows, Workspaces * Remove MIT-licensed dashboard caption from local card

Rhys Sullivan committed 6 months ago

Commit 9cdd1db1 parent bba27031 file · +130 −63Browse files

Unified · Split

apps/marketing/src/pages/index.astro+130−63
@@ -6,14 +6,13 @@ import Layout from '../layouts/Layout.astro' · 5 unmodified lines
6<Layout>6<Layout>
7 <!-- ─── NAV ─── -->7 <!-- ─── NAV ─── -->
8 <nav class="fixed top-0 w-full z-50 bg-surface/80 backdrop-blur-lg">8 <nav class="fixed top-0 w-full z-50 bg-surface/80 backdrop-blur-lg">
9 <div class="max-w-[1200px] mx-auto px-6 sm:px-10 h-14 flex items-center justify-between border-b border-rule">9 <div class="max-w-[1200px] mx-auto px-6 sm:px-10 h-14 flex items-center justify-between">
10 <a href="/" class="font-display text-xl italic text-ink tracking-tight hover:text-teal transition-colors">executor</a>10 <a href="/" class="font-display text-xl italic text-ink tracking-tight hover:text-teal transition-colors">executor</a>
11 <div class="flex items-center gap-8">11 <div class="flex items-center gap-6 sm:gap-8">
12 <a href="#roadmap" class="hidden sm:block text-[13px] text-ink-muted hover:text-ink transition-colors">Roadmap</a>12 <a href="#roadmap" class="hidden sm:block text-[13px] text-ink-muted hover:text-ink transition-colors">Roadmap</a>
13 <!-- <a href="/setup" class="hidden sm:block text-[13px] text-ink-muted hover:text-ink transition-colors">Setup</a> -->
14 <a href="https://github.com/RhysSullivan/executor" class="hidden sm:block text-[13px] text-ink-muted hover:text-ink transition-colors">GitHub</a>13 <a href="https://github.com/RhysSullivan/executor" class="hidden sm:block text-[13px] text-ink-muted hover:text-ink transition-colors">GitHub</a>
15 <a href="#install" class="text-[13px] font-medium text-surface bg-teal hover:bg-teal-dim px-4 py-1.5 rounded-md transition-colors">14 <a href="/cloud" class="text-[13px] font-medium text-surface bg-teal hover:bg-teal-dim px-4 py-1.5 rounded-md transition-colors">
16 Get started15 Try Cloud
17 </a>16 </a>
18 </div>17 </div>
19 </div>18 </div>
@@ -27,7 +26,7 @@ import Layout from '../layouts/Layout.astro' · 7 unmodified lines
27 <!-- Text centered -->26 <!-- Text centered -->
28 <div class="text-center max-w-2xl mx-auto mt-10 mb-16">27 <div class="text-center max-w-2xl mx-auto mt-10 mb-16">
29 <h1 class="rise-d1 font-display text-[clamp(3rem,7vw,5.5rem)] leading-[0.95] tracking-tight mb-8">28 <h1 class="rise-d1 font-display text-[clamp(3rem,7vw,5.5rem)] leading-[0.95] tracking-tight mb-8">
30 <span class="text-ink">Your missing<br /></span><span class="italic text-teal">execution&nbsp;layer</span>29 <span class="text-ink">Your missing<br /></span><span class="italic text-teal">integration&nbsp;layer</span>
31 </h1>30 </h1>
32 31
33 <p class="rise-d2 text-[17px] leading-[1.7] text-ink-muted mb-10">32 <p class="rise-d2 text-[17px] leading-[1.7] text-ink-muted mb-10">
@@ -35,10 +34,13 @@ import Layout from '../layouts/Layout.astro' · 1 unmodified line
35 Cursor, Claude Code, OpenCode&mdash;or your own.34 Cursor, Claude Code, OpenCode&mdash;or your own.
36 </p>35 </p>
37 36
38 <div class="rise-d3 flex flex-wrap items-center justify-center gap-4">37 <div class="rise-d3 flex flex-wrap items-center justify-center gap-3">
39 <a href="#install" class="inline-flex items-center gap-2 text-[14px] font-medium text-surface bg-teal hover:bg-teal-dim px-5 py-2.5 rounded-md transition-colors">38 <a href="/cloud" class="inline-flex items-center gap-2 text-[14px] font-medium text-surface bg-teal hover:bg-teal-dim pl-5 pr-3 py-2.5 rounded-md transition-colors">
40 Get started39 Try Cloud
41 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 14l-7 7m0 0l-7-7m7 7V3"/></svg>40 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3"/></svg>
41 </a>
42 <a href="#get-started" class="inline-flex items-center gap-2 text-[14px] font-medium text-ink-muted hover:text-ink border border-rule hover:border-ink-faint px-5 py-2.5 rounded-md transition-colors">
43 Run it locally
42 </a>44 </a>
43 </div>45 </div>
44 </div>46 </div>
@@ -722,6 +724,10 @@ import Layout from '../layouts/Layout.astro' · 677 unmodified lines
722 <svg class="w-4 h-4 text-teal mt-0.5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></svg>724 <svg class="w-4 h-4 text-teal mt-0.5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></svg>
723 <span class="text-ink-muted">Desktop app</span>725 <span class="text-ink-muted">Desktop app</span>
724 </li>726 </li>
727 <li class="flex items-start gap-2.5">
728 <svg class="w-4 h-4 text-teal mt-0.5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></svg>
729 <span class="text-ink-muted">Team management &amp; SaaS</span>
730 </li>
725 </ul>731 </ul>
726 </div>732 </div>
727 </div>733 </div>
@@ -733,9 +739,10 @@ import Layout from '../layouts/Layout.astro' · 5 unmodified lines
733 <span class="font-mono text-[11px] text-ink-muted uppercase tracking-[0.15em]">Soon</span>739 <span class="font-mono text-[11px] text-ink-muted uppercase tracking-[0.15em]">Soon</span>
734 </div>740 </div>
735 <ul class="space-y-3 text-[14px]">741 <ul class="space-y-3 text-[14px]">
736 <li class="text-ink-muted">Team management &amp; SaaS</li>742 <li class="text-ink-muted">Skills</li>
737 <li class="text-ink-muted">Advanced approval workflows</li>743 <li class="text-ink-muted">Generative UI</li>
738 <li class="text-ink-muted">Org-wide source catalog</li>744 <li class="text-ink-muted">Workflows</li>
745 <li class="text-ink-muted">Workspaces</li>
739 </ul>746 </ul>
740 </div>747 </div>
741 748
@@ -756,68 +763,128 @@ import Layout from '../layouts/Layout.astro' · 14 unmodified lines
756 </div>763 </div>
757 </section>764 </section>
758 765
759 <!-- ─── CTA ─── -->766 <!-- ─── GET STARTED: dual path ─── -->
760 <section id="install" class="py-32 sm:py-40 relative">767 <section id="get-started" class="py-32 sm:py-40 relative">
761 <div class="absolute inset-0 border-t border-rule"></div>768 <div class="absolute inset-0 border-t border-rule"></div>
762 769
763 <div class="relative max-w-[1200px] mx-auto px-6 sm:px-10">770 <div class="relative max-w-[1200px] mx-auto px-6 sm:px-10">
764 <div class="reveal max-w-2xl mx-auto text-center">771 <div class="reveal max-w-2xl mx-auto text-center mb-16">
765 <h2 class="font-display text-[clamp(2rem,5vw,4rem)] leading-[1.05] tracking-tight mb-8">772 <span class="text-[11px] font-mono uppercase tracking-[0.2em] text-ink-faint mb-4 block">Get started</span>
766 Try the future of <span class="italic text-teal">tool calling.</span>773 <h2 class="font-display text-[clamp(2rem,5vw,4rem)] leading-[1.05] tracking-tight mb-5">
774 Pick your <span class="italic text-teal">path</span>
767 </h2>775 </h2>
776 <p class="text-[15px] leading-[1.6] text-ink-muted">
777 Hosted Executor for teams, or open source on your own machine.
778 </p>
779 </div>
768 780
769 <div class="flex items-center justify-center mb-10">781 <!-- Dual-path cards -->
770 <a href="https://github.com/RhysSullivan/executor" class="inline-flex items-center gap-2 text-[14px] text-ink-muted hover:text-ink border border-rule hover:border-ink-faint px-6 py-3 rounded-md transition-colors">782 <div class="reveal grid md:grid-cols-2 gap-6 items-stretch" id="install">
771 View on GitHub
772 </a>
773 </div>
774 783
775 <!-- MCP installation steps -->784 <!-- Cloud (recommended) -->
776 <div class="mt-10 text-left max-w-lg mx-auto space-y-5" id="install-steps">785 <div class="relative rounded-xl border border-teal/25 bg-surface-raised p-6 sm:p-8 flex flex-col justify-between overflow-hidden">
777 <div>786 <div class="absolute inset-0 bg-gradient-to-b from-teal/[0.04] to-transparent pointer-events-none"></div>
778 <p class="text-[12px] font-medium text-ink-muted uppercase tracking-wider mb-2">1. Install</p>787 <div class="relative">
779 <!-- Package manager tabs -->788 <div class="flex items-center justify-between mb-5">
780 <div class="flex gap-0 border border-rule rounded-lg overflow-hidden">789 <span class="font-mono text-[11px] text-teal uppercase tracking-[0.15em]">Cloud</span>
781 <div class="flex border-b border-rule w-full bg-surface-raised">790 <span class="text-[10px] font-mono text-teal border border-teal/25 rounded px-2 py-0.5 uppercase tracking-[0.1em]">Recommended for teams</span>
782 <button data-pm="npm" class="pm-tab pm-tab-active flex-1 text-[12px] font-medium py-2 border-b-2 transition-colors">npm</button>
783 <button data-pm="bun" class="pm-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">bun</button>
784 <button data-pm="pnpm" class="pm-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">pnpm</button>
785 </div>
786 </div>
787 <div class="install-cmd relative bg-surface-raised border border-t-0 border-rule rounded-b-lg px-5 py-3 font-mono text-[14px]">
788 <span class="text-ink-faint select-none">$ </span><span class="cmd-text text-ink">npm install -g executor</span>
789 <button class="copy-btn absolute right-3 top-1/2 -translate-y-1/2 text-ink-faint hover:text-ink transition-colors p-1" aria-label="Copy">
790 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" /></svg>
791 </button>
792 </div>791 </div>
792
793 <h3 class="font-display text-[clamp(1.5rem,2.6vw,2rem)] leading-[1.1] tracking-tight text-ink mb-3">
794 Run it with <span class="italic text-teal">your team</span>
795 </h3>
796 <p class="text-[14px] leading-[1.6] text-ink-muted mb-6">
797 A managed Executor for your whole org. Shared sources, shared auth, shared policies &mdash; onboard a teammate in seconds.
798 </p>
799
800 <ul role="list" class="space-y-2.5 text-[13px] mb-8">
801 <li class="flex items-start gap-2.5">
802 <svg class="w-4 h-4 text-teal mt-0.5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></svg>
803 <span class="text-ink-muted">Free for up to 3 members</span>
804 </li>
805 <li class="flex items-start gap-2.5">
806 <svg class="w-4 h-4 text-teal mt-0.5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></svg>
807 <span class="text-ink-muted">Org-wide catalog &amp; policy engine</span>
808 </li>
809 <li class="flex items-start gap-2.5">
810 <svg class="w-4 h-4 text-teal mt-0.5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></svg>
811 <span class="text-ink-muted">Zero infra &mdash; sign in and go</span>
812 </li>
813 </ul>
814 </div>
815
816 <div class="relative">
817 <a href="/cloud" class="inline-flex w-full items-center justify-center gap-2 text-[14px] font-medium text-surface bg-teal hover:bg-teal-dim pl-5 pr-3 py-3 rounded-md transition-colors">
818 Try Cloud
819 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3"/></svg>
820 </a>
793 </div>821 </div>
822 </div>
823
824 <!-- Local (open source) -->
825 <div class="rounded-xl border border-rule bg-surface-raised p-6 sm:p-8 flex flex-col justify-between">
794 <div>826 <div>
795 <p class="text-[12px] font-medium text-ink-muted uppercase tracking-wider mb-2">2. Add to your agent</p>827 <div class="flex items-center justify-between mb-5">
796 <!-- Runner tabs -->828 <span class="font-mono text-[11px] text-ink-faint uppercase tracking-[0.15em]">Local</span>
797 <div class="flex gap-0 border border-rule rounded-lg overflow-hidden">829 <span class="text-[10px] font-mono text-ink-faint border border-rule rounded px-2 py-0.5 uppercase tracking-[0.1em]">Open source</span>
798 <div class="flex border-b border-rule w-full bg-surface-raised">
799 <button data-runner="npx" class="runner-tab runner-tab-active flex-1 text-[12px] font-medium py-2 border-b-2 transition-colors">npx</button>
800 <button data-runner="bunx" class="runner-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">bunx</button>
801 <button data-runner="pnpx" class="runner-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">pnpx</button>
802 </div>
803 </div>830 </div>
804 <div class="relative bg-surface-raised border border-t-0 border-rule rounded-b-lg px-5 py-3 font-mono text-[14px]">831
805 <span class="text-ink-faint select-none">$ </span><span class="runner-cmd-text text-ink">npx add-mcp "executor mcp" --name "executor"</span>832 <h3 class="font-display text-[clamp(1.5rem,2.6vw,2rem)] leading-[1.1] tracking-tight text-ink mb-3">
806 <button class="copy-btn absolute right-3 top-1/2 -translate-y-1/2 text-ink-faint hover:text-ink transition-colors p-1" aria-label="Copy">833 Run it on <span class="italic text-ink-muted">your laptop</span>
807 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" /></svg>834 </h3>
808 </button>835 <p class="text-[14px] leading-[1.6] text-ink-muted mb-6">
836 The same Executor, MIT-licensed, running entirely on your machine. Secrets stay in your keychain. Nothing leaves your laptop.
837 </p>
838
839 <!-- MCP installation steps -->
840 <div class="space-y-4">
841 <div>
842 <p class="text-[11px] font-medium text-ink-muted uppercase tracking-wider mb-2">1. Install</p>
843 <div class="flex border border-rule border-b-0 rounded-t-lg overflow-hidden bg-surface">
844 <button data-pm="npm" class="pm-tab pm-tab-active flex-1 text-[12px] font-medium py-2 border-b-2 transition-colors">npm</button>
845 <button data-pm="bun" class="pm-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">bun</button>
846 <button data-pm="pnpm" class="pm-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">pnpm</button>
847 </div>
848 <div class="install-cmd relative bg-surface border border-rule rounded-b-lg px-4 py-2.5 font-mono text-[13px]">
849 <span class="text-ink-faint select-none">$ </span><span class="cmd-text text-ink">npm install -g executor</span>
850 <button class="copy-btn absolute right-2.5 top-1/2 -translate-y-1/2 text-ink-faint hover:text-ink transition-colors p-1" aria-label="Copy">
851 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" /></svg>
852 </button>
853 </div>
854 </div>
855
856 <div>
857 <p class="text-[11px] font-medium text-ink-muted uppercase tracking-wider mb-2">2. Add to your agent</p>
858 <div class="flex border border-rule border-b-0 rounded-t-lg overflow-hidden bg-surface">
859 <button data-runner="npx" class="runner-tab runner-tab-active flex-1 text-[12px] font-medium py-2 border-b-2 transition-colors">npx</button>
860 <button data-runner="bunx" class="runner-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">bunx</button>
861 <button data-runner="pnpx" class="runner-tab flex-1 text-[12px] font-medium py-2 border-b-2 border-transparent text-ink-faint hover:text-ink transition-colors">pnpx</button>
862 </div>
863 <div class="relative bg-surface border border-rule rounded-b-lg px-4 py-2.5 font-mono text-[13px]">
864 <span class="text-ink-faint select-none">$ </span><span class="runner-cmd-text text-ink">npx add-mcp "executor mcp" --name "executor"</span>
865 <button class="copy-btn absolute right-2.5 top-1/2 -translate-y-1/2 text-ink-faint hover:text-ink transition-colors p-1" aria-label="Copy">
866 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" /></svg>
867 </button>
868 </div>
869 </div>
870
871 <div>
872 <p class="text-[11px] font-medium text-ink-muted uppercase tracking-wider mb-2">3. Open the dashboard</p>
873 <div class="relative bg-surface border border-rule rounded-lg px-4 py-2.5 font-mono text-[13px]">
874 <span class="text-ink-faint select-none">$ </span><span class="text-ink">executor web</span>
875 <button class="copy-btn absolute right-2.5 top-1/2 -translate-y-1/2 text-ink-faint hover:text-ink transition-colors p-1" aria-label="Copy">
876 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" /></svg>
877 </button>
878 </div>
879 </div>
809 </div>880 </div>
810 <p class="text-[12px] text-ink-faint mt-1.5">You can also tell your agent to use the <code class="text-ink/70 bg-surface-raised px-1 py-0.5 rounded text-[11px]">executor</code> CLI directly if they don't support MCP.</p>
811 </div>881 </div>
812 <div>882
813 <p class="text-[12px] font-medium text-ink-muted uppercase tracking-wider mb-2">3. Add a source and go</p>883 <div class="mt-8">
814 <div class="relative bg-surface-raised border border-rule rounded-lg px-5 py-3 font-mono text-[14px]">884 <a href="https://github.com/RhysSullivan/executor" class="inline-flex w-full items-center justify-center gap-2 text-[14px] font-medium text-ink-muted hover:text-ink border border-rule hover:border-ink-faint px-5 py-3 rounded-md transition-colors">
815 <span class="text-ink-faint select-none">$ </span><span class="text-ink">executor web</span>885 <svg class="w-4 h-4" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
816 <button class="copy-btn absolute right-3 top-1/2 -translate-y-1/2 text-ink-faint hover:text-ink transition-colors p-1" aria-label="Copy">886 View on GitHub
817 <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184" /></svg>887 </a>
818 </button>
819 </div>
820 <p class="text-[12px] text-ink-faint mt-1.5">Opens the dashboard at localhost:4788 — add sources, set policies, manage auth.</p>
821 </div>888 </div>
822 </div>889 </div>
823 </div>890 </div>