PageSourceSearch

https://packio.us/

html packio.us collected 2026-10-09 23:27:51 UTC 45,755 bytes, 365 lines download raw bytes

1<!DOCTYPE html>
2<html
3    lang="en"
4    data-theme-mode="system"
5    data-theme-storage-key="packio-theme"
6    data-theme-light-bg="&#x23;f3f4f7"
7    data-theme-dark-bg="&#x23;1a1f2a"
8    data-theme-booting
9    >
10<head>
11    <meta charset="utf-8">
12    <meta name="viewport" content="width=device-width, initial-scale=1">
13    <meta name="color-scheme" content="light dark">
14            <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f3f4f7">
15        <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1a1f2a">
16        <link rel="preload" href="/fonts/plus-jakarta-sans-latin.woff2" as="font" type="font/woff2" crossorigin>
17    <link rel="preload" href="/fonts/jetbrains-mono-latin.woff2" as="font" type="font/woff2" crossorigin>
18    <style>
19        @font-face {
20    font-family: "Plus Jakarta Sans";
21    font-style: normal;
22    font-weight: 400 800;
23    font-display: swap;
24    src: url("/fonts/plus-jakarta-sans-cyrillic-ext.woff2") format("woff2");
25    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
26}
27
28@font-face {
29    font-family: "Plus Jakarta Sans";
30    font-style: normal;
31    font-weight: 400 800;
32    font-display: swap;
33    src: url("/fonts/plus-jakarta-sans-latin-ext.woff2") format("woff2");
34    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
35}
36
37@font-face {
38    font-family: "Plus Jakarta Sans";
39    font-style: normal;
40    font-weight: 400 800;
41    font-display: swap;
42    src: url("/fonts/plus-jakarta-sans-latin.woff2") format("woff2");
43    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
44}
45
46@font-face {
47    font-family: "JetBrains Mono";
48    font-style: normal;
49    font-weight: 400 600;
50    font-display: swap;
51    src: url("/fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
52    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
53}
54
55@font-face {
56    font-family: "JetBrains Mono";
57    font-style: normal;
58    font-weight: 400 600;
59    font-display: swap;
60    src: url("/fonts/jetbrains-mono-latin-ext.woff2") format("woff2");
61    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
62}
63
64@font-face {
65    font-family: "JetBrains Mono";
66    font-style: normal;
67    font-weight: 400 600;
68    font-display: swap;
69    src: url("/fonts/jetbrains-mono-latin.woff2") format("woff2");
70    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
71}
72
73        :root {
74            --font-body: "Plus Jakarta Sans", "Segoe UI", sans-serif;
75            --font-display: "Plus Jakarta Sans", Georgia, serif;
76            --font-mono: "JetBrains Mono", "SFMono-Regular", monospace;
77            --page-bg: #f3f4f7;
78            --page-ink: rgba(37, 43, 54, 0.95);
79            --page-muted: #6d7d9c;
80            --surface: #ffffff;
81            --surface-muted: #f3f4f7;
82            --surface-strong: #ffffff;
83            --panel: rgba(255, 255, 255, 0.84);
84            --panel-strong: rgba(255, 255, 255, 0.92);
85            --panel-border: rgba(8, 10, 12, 0.09);
86            --header-bg: rgba(255, 255, 255, 0.9);
87            --footer-bg: rgba(255, 255, 255, 0.92);
88            --accent: #5856d6;
89            --accent-soft: rgba(88, 86, 214, 0.14);
90            --accent-ink: #3d3bb4;
91            --button-primary-bg: #5856d6;
92            --button-primary-hover: #4946c6;
93            --button-primary-text: #ffffff;
94            --button-secondary-bg: #e7ebf6;
95            --button-secondary-border: #cfd7ee;
96            --button-secondary-hover: #dbe3fb;
97            --button-secondary-text: #2f3f74;
98            --button-danger-bg: #d64545;
99            --button-danger-hover: #bf3838;
100            --button-danger-text: #ffffff;
101            --button-danger-soft-bg: rgba(214, 69, 69, 0.12);
102            --button-danger-soft-border: rgba(214, 69, 69, 0.28);
103            --button-danger-soft-text: #a52626;
104            --gold: #f59e0b;
105            --gold-soft: rgba(245, 158, 11, 0.14);
106            --danger-soft: rgba(229, 83, 83, 0.12);
107            --shadow-card: 0 20px 55px rgba(50, 58, 73, 0.08);
108            --flash-success-bg: #ecfdf3;
109            --flash-success-border: #b7ebcb;
110            --flash-success-text: #166534;
111            --flash-error-bg: #fef2f2;
112            --flash-error-border: #fecaca;
113            --flash-error-text: #b91c1c;
114            background-color: var(--page-bg);
115            color-scheme: light;
116        }
117
118        @media (prefers-color-scheme: dark) {
119            :root:not([data-theme="light"]) {
120                --page-bg: #1a1f2a;
121                --page-ink: rgba(255, 255, 255, 0.9);
122                --page-muted: #9ca9c5;
123                --surface: #242b38;
124                --surface-muted: #1f2530;
125                --surface-strong: #2c3442;
126                --panel: rgba(36, 43, 56, 0.86);
127                --panel-strong: rgba(44, 52, 66, 0.92);
128                --panel-border: rgba(255, 255, 255, 0.1);
129                --header-bg: rgba(33, 39, 52, 0.9);
130                --footer-bg: rgba(33, 39, 52, 0.92);
131                --accent: #7d7bf2;
132                --accent-soft: rgba(125, 123, 242, 0.22);
133                --accent-ink: #c6c5ff;
134                --button-primary-bg: #7d7bf2;
135                --button-primary-hover: #6d6be0;
136                --button-primary-text: #ffffff;
137                --button-secondary-bg: #313a4e;
138                --button-secondary-border: #4a5673;
139                --button-secondary-hover: #39455d;
140                --button-secondary-text: #e6ebff;
141                --button-danger-bg: #dc5a6a;
142                --button-danger-hover: #c94d5c;
143                --button-danger-text: #ffffff;
144                --button-danger-soft-bg: rgba(220, 90, 106, 0.18);
145                --button-danger-soft-border: rgba(220, 90, 106, 0.34);
146                --button-danger-soft-text: #ffb8c0;
147                --gold: #facc15;
148                --gold-soft: rgba(250, 204, 21, 0.18);
149                --danger-soft: rgba(251, 113, 133, 0.18);
150                --shadow-card: 0 20px 55px rgba(0, 0, 0, 0.28);
151                --flash-success-bg: rgba(22, 101, 52, 0.18);
152                --flash-success-border: rgba(74, 222, 128, 0.32);
153                --flash-success-text: #86efac;
154                --flash-error-bg: rgba(127, 29, 29, 0.22);
155                --flash-error-border: rgba(251, 113, 133, 0.32);
156                --flash-error-text: #fda4af;
157                --pre-inset-shadow: rgba(255, 255, 255, 0.06);
158                background-color: var(--page-bg);
159                color-scheme: dark;
160            }
161        }
162
163        :root[data-theme="light"] {
164            --page-bg: #f3f4f7;
165            --page-ink: rgba(37, 43, 54, 0.95);
166            --page-muted: #6d7d9c;
167            --surface: #ffffff;
168            --surface-muted: #f3f4f7;
169            --surface-strong: #ffffff;
170            --panel: rgba(255, 255, 255, 0.84);
171            --panel-strong: rgba(255, 255, 255, 0.92);
172            --panel-border: rgba(8, 10, 12, 0.09);
173            --header-bg: rgba(255, 255, 255, 0.9);
174            --footer-bg: rgba(255, 255, 255, 0.92);
175            --accent: #5856d6;
176            --accent-soft: rgba(88, 86, 214, 0.14);
177            --accent-ink: #3d3bb4;
178            --button-primary-bg: #5856d6;
179            --button-primary-hover: #4946c6;
180            --button-primary-text: #ffffff;
181            --button-secondary-bg: #e7ebf6;
182            --button-secondary-border: #cfd7ee;
183            --button-secondary-hover: #dbe3fb;
184            --button-secondary-text: #2f3f74;
185            --button-danger-bg: #d64545;
186            --button-danger-hover: #bf3838;
187            --button-danger-text: #ffffff;
188            --button-danger-soft-bg: rgba(214, 69, 69, 0.12);
189            --button-danger-soft-border: rgba(214, 69, 69, 0.28);
190            --button-danger-soft-text: #a52626;
191            --gold: #f59e0b;
192            --gold-soft: rgba(245, 158, 11, 0.14);
193            --danger-soft: rgba(229, 83, 83, 0.12);
194            --shadow-card: 0 20px 55px rgba(50, 58, 73, 0.08);
195            --flash-success-bg: #ecfdf3;
196            --flash-success-border: #b7ebcb;
197            --flash-success-text: #166534;
198            --flash-error-bg: #fef2f2;
199            --flash-error-border: #fecaca;
200            --flash-error-text: #b91c1c;
201            background-color: var(--page-bg);
202            color-scheme: light;
203        }
204
205        :root[data-theme="dark"] {
206            --page-bg: #1a1f2a;
207            --page-ink: rgba(255, 255, 255, 0.9);
208            --page-muted: #9ca9c5;
209            --surface: #242b38;
210            --surface-muted: #1f2530;
211            --surface-strong: #2c3442;
212            --panel: rgba(36, 43, 56, 0.86);
213            --panel-strong: rgba(44, 52, 66, 0.92);
214            --panel-border: rgba(255, 255, 255, 0.1);
215            --header-bg: rgba(33, 39, 52, 0.9);
216            --footer-bg: rgba(33, 39, 52, 0.92);
217            --accent: #7d7bf2;
218            --accent-soft: rgba(125, 123, 242, 0.22);
219            --accent-ink: #c6c5ff;
220            --button-primary-bg: #7d7bf2;
221            --button-primary-hover: #6d6be0;
222            --button-primary-text: #ffffff;
223            --button-secondary-bg: #313a4e;
224            --button-secondary-border: #4a5673;
225            --button-secondary-hover: #39455d;
226            --button-secondary-text: #e6ebff;
227            --button-danger-bg: #dc5a6a;
228            --button-danger-hover: #c94d5c;
229            --button-danger-text: #ffffff;
230            --button-danger-soft-bg: rgba(220, 90, 106, 0.18);
231            --button-danger-soft-border: rgba(220, 90, 106, 0.34);
232            --button-danger-soft-text: #ffb8c0;
233            --gold: #facc15;
234            --gold-soft: rgba(250, 204, 21, 0.18);
235            --danger-soft: rgba(251, 113, 133, 0.18);
236            --shadow-card: 0 20px 55px rgba(0, 0, 0, 0.28);
237            --flash-success-bg: rgba(22, 101, 52, 0.18);
238            --flash-success-border: rgba(74, 222, 128, 0.32);
239            --flash-success-text: #86efac;
240            --flash-error-bg: rgba(127, 29, 29, 0.22);
241            --flash-error-border: rgba(251, 113, 133, 0.32);
242            --flash-error-text: #fda4af;
243            --pre-inset-shadow: rgba(255, 255, 255, 0.06);
244            background-color: var(--page-bg);
245            color-scheme: dark;
246        }
247
248        html {
249            background-color: var(--page-bg);
250        }
251
252        body {
253            min-height: 100vh;
254            margin: 0;
255            background:
256                radial-gradient(circle at top left, var(--accent-soft), transparent 34%),
257                radial-gradient(circle at right 12%, var(--gold-soft), transparent 30%),
258                linear-gradient(
259                    180deg,
260                    color-mix(in srgb, var(--surface) 80%, var(--page-bg)) 0%,
261                    var(--page-bg) 100%
262                );
263            color: var(--page-ink);
264            font-family: var(--font-body);
265        }
266
267        :root[data-theme-booting] *,
268        :root[data-theme-booting] body {
269            transition: none !important;
270        }
271    </style>
272    
272<script data-cfasync="false">
273        (function () {
274            const root = document.documentElement;
275            const storageKey = root.dataset.themeStorageKey || 'packio\u002Dtheme';
276            const cookieMode = root.dataset.themeMode || 'system';
277            const lightPageBg = root.dataset.themeLightBg || '\u0023f3f4f7';
278            const darkPageBg = root.dataset.themeDarkBg || '\u00231a1f2a';
279            let saved = null;
280
281            try {
282                saved = window.localStorage.getItem(storageKey);
283            } catch (error) {
284                saved = null;
285            }
286
287            const mode = cookieMode === 'light' || cookieMode === 'dark'
288                ? cookieMode
289                : (saved === 'light' || saved === 'dark' ? saved : 'system');
290            const theme = mode === 'light' || mode === 'dark'
291                ? mode
292                : (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
293                    ? 'dark'
294                    : 'light');
295            const pageBg = theme === 'dark' ? darkPageBg : lightPageBg;
296
297            root.dataset.theme = theme;
298            root.dataset.themeMode = mode;
299            root.style.colorScheme = theme;
300            root.style.backgroundColor = pageBg;
301            document
302                .querySelectorAll('meta[name="theme-color"]')
303                .forEach((meta) => meta.setAttribute('content', pageBg));
304        })();
305    </script>
305
306    <meta name="mobile-web-app-capable" content="yes">
307    <meta name="apple-mobile-web-app-capable" content="yes">
308    <meta name="apple-mobile-web-app-title" content="Packio">
309    <title>Packio</title>
310    <meta name="description" content="a lightweight private package registry for Composer">
311    <meta property="og:title" content="Packio">
312    <meta property="og:description" content="a lightweight private package registry for Composer">
313    <meta property="og:image" content="https://packio.us/og-image.png">
314    <meta property="og:url" content="https://packio.us/">
315    <meta property="og:type" content="website">
316    <meta property="og:site_name" content="Packio">
317    <meta name="twitter:card" content="summary_large_image">
318    <meta name="twitter:title" content="Packio">
319    <meta name="twitter:description" content="a lightweight private package registry for Composer">
320    <meta name="twitter:image" content="https://packio.us/og-image.png">
321    <link rel="canonical" href="https://packio.us/">
322    
322<script type="application/ld+json">
323    {
324      "@context": "https://schema.org",
325      "@type": "WebApplication",
326      "name": "Packio",
327      "description": "a\u0020lightweight\u0020private\u0020package\u0020registry\u0020for\u0020Composer",
328      "url": "https\u003A\/\/packio.us",
329      "applicationCategory": "DeveloperApplication"
330    }
331    </script>
331
332    <link rel="manifest" href="/manifest.json">
333    <link rel="icon" href="/favicon.svg" type="image/svg+xml">
334    <link rel="icon" type="image/x-icon" href="/favicon.ico">
335    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
336    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
337    <link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
338    <link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png">
339    <link rel="icon" type="image/png" sizes="512x512" href="/android-chrome-512x512.png">
340                        <!--y8hs2e--><!----><title>Packio - Lightweight private package registry for Composer</title>
341                <link rel="stylesheet" href="/build/assets/app-C6NAqDuF.css">
342</head>
343<body>
344            
344<script data-page="app" type="application/json">{"component":"Landing","props":{"errors":[],"auth":{"user":null,"check":false},"app":{"name":"Packio","tagline":"a lightweight private package registry for Composer","domain":"packio.us","shortName":"packio","composerRepositoryAlias":"packio","registryTokenPrefix":"packio_rt_","registryAuthRealm":"Packio","httpUserAgent":"Packio\/0.1","appBaseUrl":"https:\/\/packio.us","themeStorageKey":"packio-theme","debug":false,"version":{"version":"1.16.3","number":"1.16.3","channel":"stable","sha":"6518a0e","branch":"master","built_at":"2026-10-07T18:37:30Z","distance":0,"dirty":false,"tag":"v1.16.3","display":"1.16.3 (6518a0e)"}},"branding":{"name":"Packio","tagline":"a lightweight private package registry for Composer","domain":"packio.us","shortName":"packio","composerRepositoryAlias":"packio","registryTokenPrefix":"packio_rt_","registryAuthRealm":"Packio","httpUserAgent":"Packio\/0.1","appBaseUrl":"https:\/\/packio.us","themeStorageKey":"packio-theme"},"organization":null,"organizations":[],"current_membership":null,"old":[],"csrf":{"token":"9c0355fcc65c72cd04a966f38f2e8384bae4622852d601d6ec5ee1750680ab74"},"initial_theme":{"mode":"system","resolved":null,"pageBg":"#f3f4f7","lightPageBg":"#f3f4f7","darkPageBg":"#1a1f2a"},"initial_list_view_mode":"grid","current_url":"https:\/\/packio.us\/","og_title":"Packio","og_description":"a lightweight private package registry for Composer","product_name":"Packio","tagline":"Lightweight private package registry for Composer","oauth_providers":[{"provider":"github","label":"GitHub","enabled":true},{"provider":"gitlab","label":"GitLab","enabled":true},{"provider":"bitbucket","label":"Bitbucket","enabled":true},{"provider":"codeberg","label":"Codeberg","enabled":true}]},"url":"\/","version":"6518a0e","sharedProps":["auth","app","branding","organization","organizations","current_membership","errors","old","csrf","initial_theme","initial_list_view_mode","current_url","og_title","og_description"]}</script>
344<div data-server-rendered="true" id="app"><!--[--><!--[0--><!----><!--[-1--><!--[--><div class="flex min-h-screen flex-col bg-(--page-bg) text-(--page-ink)"><header class="sticky top-0 z-50 border-b theme-border" style="background-color: var(--header-bg);"><div class="flex w-full flex-col gap-4 px-6 py-5 lg:flex-row lg:items-center lg:justify-between xl:px-8"><div class="flex items-center justify-between gap-3"><!----><a draggable="false" class="flex min-w-0 items-center gap-3 no-underline lg:flex-none" href="/auth/login"><div class="size-10 rounded-xl" style="box-shadow: 0 12px 32px color-mix(in srgb, var(--accent) 38%, transparent);"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Packio logo" class="size-10"><defs><linearGradient id="bg-app" x1="12" y1="8" x2="52" y2="56" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="var(--accent)"></stop><stop offset="0.55" stop-color="var(--accent-ink)"></stop><stop offset="1" stop-color="#2f3f74"></stop></linearGradient><linearGradient id="glow-app" x1="20" y1="18" x2="46" y2="44" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffffff" stop-opacity="0.98"></stop><stop offset="1" stop-color="var(--accent-soft)" stop-opacity="0.92"></stop></linearGradient></defs><rect x="4" y="4" width="56" height="56" rx="16" fill="url(#bg-app)"></rect><path d="M17 20.5 32 14l15 6.5-15 7.25L17 20.5Z" fill="url(#glow-app)" opacity="0.96"></path><path d="M17 20.5v19L32 50V27.75L17 20.5Zm30 0v19L32 50V27.75l15-7.25Z" fill="#ffffff" opacity="0.22"></path><path d="M17 20.5 32 14l15 6.5-15 7.25L17 20.5Z" fill="none" stroke="#ffffff" stroke-linejoin="round" stroke-width="3"></path><path d="M17 20.5v19L32 50l15-10.5v-19" fill="none" stroke="#ffffff" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"></path><path d="M32 27.75V50" fill="none" stroke="#ffffff" stroke-linecap="round" stroke-width="3"></path><path d="M26 17.2 40.5 23.5" fill="none" stroke="var(--accent-ink)" stroke-linecap="round" stroke-width="2.5"></path><circle cx="47.5" cy="17.5" r="4.5" fill="#facc15" stroke="#ffffff" stroke-width="2"></circle></svg></div> <div><p class="text-xs uppercase tracking-[0.32em]" style="color: var(--page-muted);">packio.us</p> <h1 class="mt-1 text-lg font-semibold">Packio</h1></div><!----><!----><!----></a><!----><!----> <div class="flex items-center gap-2 lg:hidden"><button type="button" class="inline-flex h-10 w-10 cursor-pointer items-center justify-center rounded-xl border transition hover:scale-[1.02] svelte-1cthble" data-variant="icon" aria-label="Switch to dark theme"><!--[-1--><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide-icon lucide lucide-moon h-5 w-5"><!--[--><!----><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"><!----></path><!----><!--]--><!----></svg><!--]--><!----></button><!----> <button type="button" class="inline-flex h-10 w-10 cursor-pointer items-center justify-center rounded-xl border transition hover:scale-[1.02] svelte-1cthble" data-variant="icon" aria-label="Open menu"><!--[-1--><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide-icon lucide lucide-menu h-5 w-5"><!--[--><!----><path d="M4 5h16"><!----></path><!----><!----><path d="M4 12h16"><!----></path><!----><!----><path d="M4 19h16"><!----></path><!----><!--]--><!----></svg><!--]--><!----></button><!----></div></div> <!--[-1--><!--]--> <div class="hidden w-full min-w-0 flex-wrap items-center justify-start gap-2 text-sm lg:flex lg:w-auto lg:flex-1 lg:justify-end"><!--[-1--><!--]--> <nav class="flex min-w-0 flex-wrap items-center justify-start gap-2 text-sm lg:justify-end"><!--[-1--><!--]--> <!--[-1--><!----><a draggable="false" class="inline-flex h-10 items-center justify-center rounded-lg px-5 text-sm font-semibold no-underline transition" style="background-color: var(--button-primary-bg); color: var(--button-primary-text);" href="/auth/login"><!---->Login<!----><!----><!----></a><!----><!--]--></nav> <!--[-1--><!--]--> <button type="button" class="inline-flex h-10 w-10 cursor-pointer items-center justify-center rounded-xl border transition hover:scale-[1.02] svelte-1cthble" data-variant="icon" aria-label="Switch to dark theme"><!--[-1--><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide-icon lucide lucide-moon h-5 w-5"><!--[--><!----><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"><!----></path><!----><!--]--><!----></svg><!--]--><!----></button><!----></div></div></header> <main class="mx-auto flex w-full max-w-7xl flex-1 flex-col gap-6 px-6 py-8"><!--[-1--><!--]--> <main class="mx-auto w-full max-w-6xl flex-1 px-5 py-10 md:px-6 md:py-14"><div class="grid gap-10"><section class="grid min-h-[calc(100vh-13rem)] content-center gap-8"><div class="grid gap-8 lg:grid-cols-[minmax(0,1fr)_26rem] lg:items-center"><div class="grid max-w-3xl gap-6"><div class="flex flex-wrap items-center gap-3"><span class="ui-badge-accent rounded-full px-3 py-1 text-xs font-semibold">Self-hosted Composer registry</span> <span class="text-sm ui-muted">Git sources, REST API, private packages, team tokens</span></div> <div class="grid gap-4"><h1 class="max-w-3xl text-5xl font-bold leading-tight md:text-6xl">Packio</h1> <p class="max-w-2xl text-xl leading-8 ui-muted">Lightweight private package registry for Composer
345                Connect repositories, publish packages from tags, and install them
346                securely with Composer. Automate the same registry workflows through
347                the REST API.</p></div> <div class="flex flex-wrap gap-3"><!----><a draggable="false" class="inline-flex h-11 items-center justify-center rounded-lg px-5 text-sm font-semibold transition" style="background-color: var(--button-primary-bg); color: var(--button-primary-text);" href="/auth/register"><!---->Create account<!----><!----><!----></a><!----><!----> <!----><a draggable="false" class="inline-flex h-11 items-center justify-center rounded-lg border px-5 text-sm font-semibold transition" style="border-color: var(--button-secondary-border); background-color: var(--button-secondary-bg); color: var(--button-secondary-text);" href="#setup"><!---->Composer setup<!----><!----><!----></a><!----><!----></div> <!--[0--><div class="grid gap-3"><p class="text-sm ui-muted">Or continue with</p> <div class="oauth-provider-grid svelte-y8hs2e"><!--[--><button type="button" class="oauth-btn svelte-y8hs2e" title="Sign in with GitHub"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]-->
347<path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg><!--]--><!----></button><button type="button" class="oauth-btn svelte-y8hs2e" title="Sign in with GitLab"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><path fill="currentColor" d="m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z"></path></svg><!--]--><!----></button><button type="button" class="oauth-btn svelte-y8hs2e" title="Sign in with Bitbucket"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><path fill="currentColor" d="M.778 1.213a.768.768 0 00-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 00.77-.646l3.27-20.03a.768.768 0 00-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z"></path></svg><!--]--><!----></button><button type="button" class="oauth-btn svelte-y8hs2e" title="Sign in with Codeberg"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><path fill="currentColor" d="M11.999.747A11.974 11.974 0 0 0 0 12.75c0 2.254.635 4.465 1.833 6.376L11.837 6.19c.072-.092.251-.092.323 0l4.178 5.402h-2.992l.065.239h3.113l.882 1.138h-3.674l.103.374h3.86l.777 1.003h-4.358l.135.483h4.593l.695.894h-5.038l.165.589h5.326l.609.785h-5.717l.182.65h6.038l.562.727h-6.397l.183.65h6.717A12.003 12.003 0 0 0 24 12.75 11.977 11.977 0 0 0 11.999.747zm3.654 19.104.182.65h5.326c.173-.204.353-.433.513-.65zm.385 1.377.18.65h3.563c.233-.198.485-.428.712-.65zm.383 1.377.182.648h1.203c.356-.204.685-.412 1.042-.648zz"></path></svg><!--]--><!----></button><!--]--></div></div><!--]--></div> <div class="registry-preview svelte-y8hs2e"><div class="flex items-center justify-between gap-4 border-b border-(--panel-border) px-5 py-4"><div><p class="text-sm font-semibold ui-title">Registry setup</p> <p class="mt-1 text-xs ui-muted">acme.packio.local</p></div> <span class="ui-badge-accent rounded-full px-3 py-1 text-xs">composer repository</span></div> <div class="grid gap-3 p-5"><div class="rounded-xl border border-(--panel-border) px-4 py-3"><p class="text-xs uppercase tracking-[0.2em] ui-muted">Organization</p> <p class="mt-2 text-sm font-semibold ui-title">acme</p></div> <div class="rounded-xl border border-(--panel-border) px-4 py-3"><p class="text-xs uppercase tracking-[0.2em] ui-muted">Repository URL</p> <p class="mt-2 break-all text-sm font-medium ui-title">https://acme.packio.local/packages.json</p></div> <div class="grid gap-3 md:grid-cols-2"><div class="rounded-xl border border-(--panel-border) px-4 py-3"><p class="text-xs uppercase tracking-[0.2em] ui-muted">Packages</p> <p class="mt-2 text-2xl font-semibold ui-title">12</p> <p class="mt-1 text-xs ui-muted">available in the registry</p></div> <div class="rounded-xl border border-(--panel-border) px-4 py-3"><p class="text-xs uppercase tracking-[0.2em] ui-muted">Visibility</p> <p class="mt-2 text-sm font-semibold ui-title">8 public / 4
348                    private</p> <p class="mt-1 text-xs ui-muted">token required for private packages</p></div></div> <div class="rounded-xl border border-(--panel-border) px-4 py-3"><p class="text-xs uppercase tracking-[0.2em] ui-muted">Global auth</p> <p class="mt-2 break-all text-sm font-medium ui-title">composer config --global --auth http-basic.acme.packio.local token &lt;registry-token></p></div></div></div></div></section> <section class="grid gap-4 md:grid-cols-2 lg:grid-cols-3"><!--[--><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex min-h-24 items-center justify-center p-5 text-center"><p class="text-sm font-semibold leading-6 ui-title">Organization-scoped registries</p><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex min-h-24 items-center justify-center p-5 text-center"><p class="text-sm font-semibold leading-6 ui-title">Private package access tokens</p><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex min-h-24 items-center justify-center p-5 text-center"><p class="text-sm font-semibold leading-6 ui-title">Full REST API for automation</p><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex min-h-24 items-center justify-center p-5 text-center"><p class="text-sm font-semibold leading-6 ui-title">Repository webhooks and automated source sync</p><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex min-h-24 items-center justify-center p-5 text-center"><p class="text-sm font-semibold leading-6 ui-title">Hosted, self-hosted, and generic Git sources</p><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex min-h-24 items-center justify-center p-5 text-center"><p class="text-sm font-semibold leading-6 ui-title">OAuth and token-based source access</p><!----><!----></section><!----><!--]--></section> <section id="how-it-works" class="grid gap-5"><div><p class="text-sm font-semibold ui-accent">Workflow</p> <h2 class="mt-2 text-2xl font-bold ui-title">From repository to installable package</h2></div> <div class="grid gap-4 lg:grid-cols-3"><!--[--><!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-5"><div class="flex items-start gap-4"><span class="step-number svelte-y8hs2e">1</span> <div><h3 class="font-semibold ui-title">Connect sources</h3> <p class="mt-2 text-sm leading-6 ui-muted">Attach GitHub, GitLab, Bitbucket, Codeberg, self-hosted GitLab, or a generic Git repository.</p></div></div><!----><!----></section><!----><!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-5"><div class="flex items-start gap-4"><span class="step-number svelte-y8hs2e">2</span> <div><h3 class="font-semibold ui-title">Publish from tags</h3> <p class="mt-2 text-sm leading-6 ui-muted">Packio reads composer.json, releases, dist archives, and package metadata.</p></div></div><!----><!----></section><!----><!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-5"><div class="flex items-start gap-4"><span class="step-number svelte-y8hs2e">3</span> <div><h3 class="font-semibold ui-title">Install privately</h3> <p class="mt-2 text-sm leading-6 ui-muted">Use Composer tokens for CI, developers, and protected packages.</p></div></div><!----><!----></section><!----><!--]--></div></section> <section class="grid gap-5 lg:grid-cols-[0.95fr_1.05fr]"><!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-6"><div class="grid gap-4"><div><p class="text-sm font-semibold ui-accent">REST API</p> <h2 class="mt-2 text-2xl font-bold ui-title">Automate registry operations</h2></div> <p class="text-sm leading-6 ui-muted">Create scoped API tokens from your profile and drive Packio from
349              scripts, internal tooling, CI jobs, or deployment pipelines.</p> <div class="grid gap-2"><!--[--><div class="rounded-xl border border-(--panel-border) px-4 py-3 text-sm font-medium ui-title">Organizations, members, and invitations</div><div class="rounded-xl border border-(--panel-border) px-4 py-3 text-sm font-medium ui-title">Sources, webhooks, packages, and releases</div><div class="rounded-xl border border-(--panel-border) px-4 py-3 text-sm font-medium ui-title">Registry tokens, provider authorizations, and admin operations</div><!--]--></div></div><!----><!----></section><!----><!----> <!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-6"><div class="grid gap-4"><div><p class="text-sm font-semibold ui-accent">Source providers</p> <h2 class="mt-2 text-2xl font-bold ui-title">Connect more than GitHub and GitLab</h2></div> <p class="text-sm leading-6 ui-muted">Mix hosted providers, self-hosted GitLab instances, and manual Git
350              URLs in the same organization registry.</p> <div class="grid gap-3 sm:grid-cols-2"><!--[--><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex items-start gap-3 p-4"><span class="mt-0.5 text-(--accent)"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]-->
350<path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg><!--]--><!----></span> <span class="grid gap-1"><span class="text-sm font-semibold ui-title">GitHub</span> <span class="text-xs leading-5 ui-muted">OAuth discovery, private repositories, and webhook sync.</span></span><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex items-start gap-3 p-4"><span class="mt-0.5 text-(--accent)"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><path fill="currentColor" d="m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z"></path></svg><!--]--><!----></span> <span class="grid gap-1"><span class="text-sm font-semibold ui-title">GitLab</span> <span class="text-xs leading-5 ui-muted">GitLab.com and organization-managed self-hosted instances.</span></span><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex items-start gap-3 p-4"><span class="mt-0.5 text-(--accent)"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><path fill="currentColor" d="M.778 1.213a.768.768 0 00-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 00.77-.646l3.27-20.03a.768.768 0 00-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z"></path></svg><!--]--><!----></span> <span class="grid gap-1"><span class="text-sm font-semibold ui-title">Bitbucket</span> <span class="text-xs leading-5 ui-muted">Workspace repositories with OAuth-backed source access.</span></span><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex items-start gap-3 p-4"><span class="mt-0.5 text-(--accent)"><!--[0--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><path fill="currentColor" d="M11.999.747A11.974 11.974 0 0 0 0 12.75c0 2.254.635 4.465 1.833 6.376L11.837 6.19c.072-.092.251-.092.323 0l4.178 5.402h-2.992l.065.239h3.113l.882 1.138h-3.674l.103.374h3.86l.777 1.003h-4.358l.135.483h4.593l.695.894h-5.038l.165.589h5.326l.609.785h-5.717l.182.65h6.038l.562.727h-6.397l.183.65h6.717A12.003 12.003 0 0 0 24 12.75 11.977 11.977 0 0 0 11.999.747zm3.654 19.104.182.65h5.326c.173-.204.353-.433.513-.65zm.385 1.377.18.65h3.563c.233-.198.485-.428.712-.65zm.383 1.377.182.648h1.203c.356-.204.685-.412 1.042-.648zz"></path></svg><!--]--><!----></span> <span class="grid gap-1"><span class="text-sm font-semibold ui-title">Codeberg</span> <span class="text-xs leading-5 ui-muted">Codeberg repositories, tags, archives, and webhook updates.</span></span><!----><!----></section><!----><!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 flex items-start gap-3 p-4"><span class="mt-0.5 text-(--accent)"><!--[-1--><svg viewBox="0 0 24 24" class="size-5" aria-hidden="true"><!--[-1--><!--]--><circle cx="12" cy="12" r="9" fill="none" stroke="currentColor" stroke-width="1.75"></circle><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.75" d="M8 12h8M12 8v8"></path></svg><!--]--><!----></span> <span class="grid gap-1"><span class="text-sm font-semibold ui-title">Generic Git</span> <span class="text-xs leading-5 ui-muted">Manual HTTPS or SSH repository URLs for custom Git hosting.</span></span><!----><!----></section><!----><!--]--></div></div><!----><!----></section><!----><!----></section> <section id="setup" class="grid gap-5 lg:grid-cols-2"><!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-6"><div class="grid gap-3"><h2 class="text-xl font-bold ui-title">Composer repository</h2> <p class="text-sm leading-6 ui-muted">Add your organization registry once, then require packages by
351              name.</p> <!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 min-w-0 p-4"><div class="flex items-start justify-between gap-3"><!--[0--><p class="font-medium ui-title">composer.json</p><!--]--> <button type="button" class="inline-flex cursor-pointer shrink-0 items-center justify-center rounded-lg border text-lg w-9 h-9 transition hover:border-[var(--accent)] hover:text-[var(--accent)] disabled:cursor-not-allowed disabled:opacity-60 shrink-0 svelte-1cthble" data-variant="iconSmall" aria-label="Copy composer.json" title="Copy composer.json"><!--[-1--><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide-icon lucide lucide-copy h-4 w-4"><!--[--><!----><rect width="14" height="14" x="8" y="8" rx="2" ry="2"><!----></rect><!----><!----><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"><!----></path><!----><!--]--><!----></svg><!--]--><!----></button><!----></div> <!--[0--><pre class="ui-code mt-3 min-w-0 overflow-x-auto rounded-xl p-3 text-xs"><!--[-1-->{
352  "repositories": [
353    { "type": "composer", "url": "https://default.packio.local/packages.json" }
354  ]
355}<!--]--></pre><!--]--><!----><!----></section><!----><!----> <code class="code-line svelte-y8hs2e">composer require vendor/package</code></div><!----><!----></section><!----><!----> <!----><section class="min-w-0 theme-card-shadow rounded-[var(--radius-xl)] border theme-border theme-surface  p-6"><div class="grid gap-3"><h2 class="text-xl font-bold ui-title">Token authentication</h2> <p class="text-sm leading-6 ui-muted">Use registry tokens locally or in CI without exposing provider
356              credentials.</p> <!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 min-w-0 p-4"><div class="flex items-start justify-between gap-3"><!--[0--><p class="font-medium ui-title">Global auth</p><!--]--> <button type="button" class="inline-flex cursor-pointer shrink-0 items-center justify-center rounded-lg border text-lg w-9 h-9 transition hover:border-[var(--accent)] hover:text-[var(--accent)] disabled:cursor-not-allowed disabled:opacity-60 shrink-0 svelte-1cthble" data-variant="iconSmall" aria-label="Copy Global auth" title="Copy Global auth"><!--[-1--><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide-icon lucide lucide-copy h-4 w-4"><!--[--><!----><rect width="14" height="14" x="8" y="8" rx="2" ry="2"><!----></rect><!----><!----><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"><!----></path><!----><!--]--><!----></svg><!--]--><!----></button><!----></div> <!--[0--><pre class="ui-code mt-3 min-w-0 overflow-x-auto rounded-xl p-3 text-xs"><!--[-1-->composer config --global --auth http-basic.default.packio.local token &lt;registry-token><!--]--></pre><!--]--><!----><!----></section><!----><!----> <!----><section class="min-w-0 theme-surface-muted rounded-xl border theme-border p-4 min-w-0 p-4"><div class="flex items-start justify-between gap-3"><!--[0--><p class="font-medium ui-title">COMPOSER_AUTH</p><!--]--> <button type="button" class="inline-flex cursor-pointer shrink-0 items-center justify-center rounded-lg border text-lg w-9 h-9 transition hover:border-[var(--accent)] hover:text-[var(--accent)] disabled:cursor-not-allowed disabled:opacity-60 shrink-0 svelte-1cthble" data-variant="iconSmall" aria-label="Copy COMPOSER_AUTH" title="Copy COMPOSER_AUTH"><!--[-1--><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide-icon lucide lucide-copy h-4 w-4"><!--[--><!----><rect width="14" height="14" x="8" y="8" rx="2" ry="2"><!----></rect><!----><!----><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"><!----></path><!----><!--]--><!----></svg><!--]--><!----></button><!----></div> <!--[0--><pre class="ui-code mt-3 min-w-0 overflow-x-auto rounded-xl p-3 text-xs"><!--[-1-->COMPOSER_AUTH={"http-basic":{"default.packio.local":{"username":"token","password":"&lt;registry-token>"}}}<!--]--></pre><!--]--><!----><!----></section><!----><!----></div><!----><!----></section><!----><!----></section> <section class="cta-band svelte-y8hs2e"><div><h2 class="text-2xl font-bold ui-title">Start with one repository</h2> <p class="mt-2 text-sm leading-6 ui-muted">Create an organization, connect a source, and Packio will keep the
357            registry ready for Composer installs.</p></div> <div class="flex flex-wrap gap-3"><!----><a draggable="false" class="inline-flex h-11 items-center justify-center rounded-lg px-5 text-sm font-semibold transition" style="background-color: var(--button-primary-bg); color: var(--button-primary-text);" href="/auth/register"><!---->Create account<!----><!----><!----></a><!----><!----> <!----><a draggable="false" class="inline-flex h-11 items-center justify-center rounded-lg border px-5 text-sm font-semibold transition" style="border-color: var(--button-secondary-border); background-color: var(--button-secondary-bg); color: var(--button-secondary-text);" href="/auth/login"><!---->Sign in<!----><!----><!----></a><!----><!----></div></section></div></main><!----></main> <footer class="border-t theme-border" style="background-color: var(--footer-bg);"><div class="flex w-full flex-col gap-2 px-6 py-4 text-sm sm:flex-row sm:items-center sm:justify-between xl:px-8" style="color: var(--page-muted);"><div class="flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-6"><span>
357Packio, a lightweight private package registry for Composer</span></div> <div class="flex items-center gap-2 sm:flex-col sm:items-end sm:gap-0.5"><span class="text-xs">packio.us</span> <!--[0--><span class="text-[10px] tracking-[0.14em] opacity-75">v1.16.3 (6518a0e)</span><!--]--></div></div></footer> <!--[--><!--[-1--><!--]--><!--[-1--><!--]--><!--[-1--><!--]--><!--[-1--><!--]--><!--]--><!----> <!--[-1--><!--]--><!----></div><!--]--><!--]--><!----><!--]--><!--]--></div>
358        
358<script data-cfasync="false" type="module" src="/build/assets/app-FcM9sxtC.js"></script>
358
359<link rel="modulepreload" href="/build/assets/dist-D2Sd8LfA.js">
360<link rel="modulepreload" href="/build/assets/client-C1uQcr27.js">
361<link rel="modulepreload" href="/build/assets/theme-Du0VTkBV.js">
362<link rel="modulepreload" href="/build/assets/api-DQ1WamXT.js">
363<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"ca1839c85a524014903919cebcd2abc9","r":1,"spa":2}' crossorigin="anonymous"></script>
363
364</body>
365</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.