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="#f3f4f7" 7 data-theme-dark-bg="#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 <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 <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":"<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.