| 1 | <!doctype html> |
| 2 | <html lang="en"> |
| 3 | <head> |
| 4 | <meta charset="utf-8"> |
| 5 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| 6 | <title>Get started β Carloku</title> |
| 7 | <meta name="description" content="π€ Install the carlos CLI, sign in with a passkey, and ship your first app to Carloku."> |
| 8 | <meta property="og:title" content="Get started β Carloku"> |
| 9 | <meta property="og:description" content="Install the carlos CLI, sign in with a passkey, and ship your first app."> |
| 10 | <meta property="og:type" content="website"> |
| 11 | <meta property="og:url" content="https://carloku.com/get-started/"> |
| 12 | <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"> |
| 13 | <meta name="theme-color" content="#0e0c13" media="(prefers-color-scheme: dark)"> |
| 14 | <link rel="icon" href="/favicon.svg" type="image/svg+xml"> |
| 15 | <link rel="preload" href="/fonts/Geist-Variable.woff2" as="font" type="font/woff2" crossorigin> |
| 16 | <link rel="preload" href="/fonts/GeistMono-Variable.woff2" as="font" type="font/woff2" crossorigin> |
| 17 | <link rel="stylesheet" href="/site.css"> |
| 18 | </head> |
| 19 | <body> |
| 20 | <a class="skip" href="#main">Skip to content</a> |
| 21 | <header class="site-head"> |
| 22 | <div class="wrap"> |
| 23 | <a class="brand" href="/"><svg class="mark" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="14" fill="#5b3e96"/><path fill="#b9a1ea" d="M11.65 37.15H50.65A2.5 2.5 0 0 1 52.42 37.88L54.19 39.65A2.5 2.5 0 0 1 54.92 41.42V48.42A2.5 2.5 0 0 1 52.42 50.92H13.42A2.5 2.5 0 0 1 11.65 50.19L9.88 48.42A2.5 2.5 0 0 1 9.15 46.65V39.65A2.5 2.5 0 0 1 11.65 37.15ZM10.65 26.15H28.15A1.5 1.5 0 0 1 29.21 26.59L30.63 28.01A1.5 1.5 0 0 1 31.07 29.07V33.07A1.5 1.5 0 0 1 29.57 34.57H12.07A1.5 1.5 0 0 1 11.01 34.13L9.59 32.71A1.5 1.5 0 0 1 9.15 31.65V27.65A1.5 1.5 0 0 1 10.65 26.15ZM34.15 26.15H51.65A1.5 1.5 0 0 1 52.71 26.59L54.13 28.01A1.5 1.5 0 0 1 54.57 29.07V33.07A1.5 1.5 0 0 1 53.07 34.57H35.57A1.5 1.5 0 0 1 34.51 34.13L33.09 32.71A1.5 1.5 0 0 1 32.65 31.65V27.65A1.5 1.5 0 0 1 34.15 26.15ZM10.65 15.15H16.4A1.5 1.5 0 0 1 17.46 15.59L18.88 17.01A1.5 1.5 0 0 1 19.32 18.07V22.07A1.5 1.5 0 0 1 17.82 23.57H12.07A1.5 1.5 0 0 1 11.01 23.13L9.59 21.71A1.5 1.5 0 0 1 9.15 20.65V16.65A1.5 1.5 0 0 1 10.65 15.15ZM22.4 15.15H28.15A1.5 1.5 0 0 1 29.21 15.59L30.63 17.01A1.5 1.5 0 0 1 31.07 18.07V22.07A1.5 1.5 0 0 1 29.57 23.57H23.82A1.5 1.5 0 0 1 22.76 23.13L21.34 21.71A1.5 1.5 0 0 1 20.9 20.65V16.65A1.5 1.5 0 0 1 22.4 15.15ZM34.15 15.15H39.9A1.5 1.5 0 0 1 40.96 15.59L42.38 17.01A1.5 1.5 0 0 1 42.82 18.07V22.07A1.5 1.5 0 0 1 41.32 23.57H35.57A1.5 1.5 0 0 1 34.51 23.13L33.09 21.71A1.5 1.5 0 0 1 32.65 20.65V16.65A1.5 1.5 0 0 1 34.15 15.15Z"/><path fill="#9a7bd6" d="M45.9 15.15H51.65A1.5 1.5 0 0 1 52.71 15.59L54.13 17.01A1.5 1.5 0 0 1 54.57 18.07V22.07A1.5 1.5 0 0 1 53.07 23.57H47.32A1.5 1.5 0 0 1 46.26 23.13L44.84 21.71A1.5 1.5 0 0 1 44.4 20.65V16.65A1.5 1.5 0 0 1 45.9 15.15Z"/><g fill="#ffffff"><rect x="9.15" y="37.15" width="44" height="12" rx="2.5"/><rect x="9.15" y="26.15" width="20.5" height="7" rx="1.5"/><rect x="32.65" y="26.15" width="20.5" height="7" rx="1.5"/><rect x="9.15" y="15.15" width="8.75" height="7" rx="1.5"/><rect x="20.9" y="15.15" width="8.75" height="7" rx="1.5"/><rect x="32.65" y="15.15" width="8.75" height="7" rx="1.5"/><rect x="44.4" y="15.15" width="8.75" height="7" rx="1.5" fill="#c9b2f7"/></g><g fill="#5b3e96"><circle cx="13.15" cy="43.15" r="1.6"/><circle cx="49.15" cy="43.15" r="1.6"/></g><circle cx="43.15" cy="43.15" r="1.6" fill="#c9b2f7"/></svg>Carloku</a> |
| 24 | <nav aria-label="Site"> |
| 25 | <a href="/#workflow">How it works</a> |
| 26 | <a href="/#open">Open source</a> |
| 27 | <a href="/get-started/">Get started</a> |
| 28 | </nav> |
| 29 | <a class="head-cta" href="https://console.carloku.com">Dashboard</a> |
| 30 | </div> |
| 31 | </header> |
| 32 | <main id="main"> |
| 33 | <div class="page-hero"> |
| 34 | <div class="wrap narrow"> |
| 35 | <h1>Get started<span class="dot">.</span></h1> |
| 36 | <p class="lede">This is the head half; the heart half is that you'll be live |
| 37 | before it feels like work. Four steps, one small tool.</p> |
| 38 | </div> |
| 39 | </div> |
| 40 | <div class="wrap narrow"> |
| 41 | <article class="guide"> |
| 42 | <section> |
| 43 | <h2>1 Β· Install the CLI</h2> |
| 44 | <pre><code>brew install carlosframework/tap/carlos</code></pre> |
| 45 | <p>Not on Homebrew? Prebuilt binaries live at |
| 46 | <a href="https://github.com/carlosframework/releases">github.com/carlosframework/releases</a>. |
| 47 | It's one static binary: put it on your PATH and you're done.</p> |
| 48 | </section> |
| 49 | <section> |
| 50 | <h2>2 Β· Sign in</h2> |
| 51 | <p>Create your account at <a href="https://console.carloku.com">console.carloku.com</a> β |
| 52 | you sign in with a passkey through Keymail, so there's no password to invent. |
| 53 | Then connect your terminal:</p> |
| 54 | <pre><code>carlos auth login -console https://console.carloku.com</code></pre> |
| 55 | <p>The CLI prints a short code; you approve it in the browser you're already |
| 56 | signed in to. That's the whole ceremony. (Forget this step and nothing |
| 57 | breaks: the first command that needs a login offers to run it for you, |
| 58 | right there in the terminal.)</p> |
| 59 | </section> |
| 60 | <section> |
| 61 | <h2>3 Β· Create and deploy</h2> |
| 62 | <pre><code>carlos apps create -app hello |
| 63 | carlos deploy ./hello-linux-arm64 |
| 64 | </code></pre> |
| 65 | <p>Every app starts with one channel, <code>edge</code>, and <code>carlos |
| 66 | deploy</code> ships straight to it β no promotion step in between. It waits |
| 67 | until your URL is provably serving the new build; when it prints |
| 68 | <code>live</code>, it is. Version strings are yours to choose; a git short |
| 69 | SHA is the house convention. Notice there's no <code>-app</code> on the |
| 70 | deploy: with one app in your account, the CLI knows which one you mean β |
| 71 | flags are for the day you have several.</p> |
| 72 | <p>Shipping a static site instead? Same shape:</p> |
| 73 | <pre><code>carlos deploy -kind static ./public</code></pre> |
| 74 | <p>Run it from your project once and it offers to remember the artifact in |
| 75 | <code>.carlos/config</code>; say yes, and from then on the whole release is |
| 76 | just <code>carlos deploy</code>, no arguments at all. The session on the |
| 77 | <a href="/">homepage</a> is a real capture of exactly that, and the app it |
| 78 | deployed is <a href="https://hello.bdf.oncarlos.com">really running</a>.</p> |
| 79 | </section> |
| 80 | <section> |
| 81 | <h2>4 Β· Add a pipeline, if you want one</h2> |
| 82 | <p>One channel is enough for most apps: deploy, and it's live. When a team |
| 83 | wants a staged rollout instead β a bake window before a wider audience sees |
| 84 | it, a passkey on the way up, sign-off from teammates β opt into a |
| 85 | pipeline:</p> |
| 86 | <pre><code>carlos pipeline init -template edge-production</code></pre> |
| 87 | <p>That adds a <code>production</code> channel behind <code>edge</code>, |
| 88 | with a 24-hour bake, a passkey requirement, and an approval on any change |
| 89 | to that protection, so nobody can quietly strip it later either. |
| 90 | <code>carlos promote <version> production</code> moves the exact same |
| 91 | bytes forward once the bake has run. There's also a |
| 92 | <code>full-ladder</code> template matching the classic edge β beta β |
| 93 | stable shape, and custom channels if neither fits.</p> |
| 94 | <p class="note">Carloku is young and moving quickly. If anything on this page |
| 95 | surprises you, the <a href="https://console.carloku.com">console</a> is the |
| 96 | source of truth, and the platform underneath is open source.</p> |
| 97 | </section> |
| 98 | <section> |
| 99 | <h2>Under the hood</h2> |
| 100 | <p>For the technically curious, this is the part we keep off the front page:</p> |
| 101 | <ul> |
| 102 | <li>A release is an immutable, content-addressed artifact. Promotion moves a |
| 103 | signed pointer; nothing is ever rebuilt between preview and production, and |
| 104 | every box verifies the signature before running a release.</li> |
| 105 | <li>Canary channels always let you try a build on a live URL without |
| 106 | touching what's deployed. Opt into a pipeline and its later channels |
| 107 | carry releases through a bake stage too, so a wider channel only |
| 108 | adopts what already served traffic upstream.</li> |
| 109 | <li>Idle apps hibernate: the process stops, the route stays, and the first |
| 110 | request wakes it.</li> |
| 111 | <li>Custom domains get per-host certificates minted and renewed |
| 112 | automatically.</li> |
| 113 | </ul> |
| 114 | <p>The whole design is public β read it at |
| 115 | <a href="https://carlosframework.com">carlosframework.com</a>.</p> |
| 116 | </section> |
| 117 | </article> |
| 118 | </div> |
| 119 | </main> |
| 120 | <footer> |
| 121 | <div class="wrap"> |
| 122 | <p>π€ Written by an LLM (Claude), on the ideas, instruction, and editing of humans. |
| 123 | AI-written text here is always marked and always disclosed; see |
| 124 | <a href="https://11factor.org/#x">factor X</a>.</p> |
| 125 | <p>To report abuse on an app Carloku hosts (anything at oncarlos.com), email <a href="mailto:abuse@carloku.com">abuse@carloku.com</a>.</p> |
| 126 | <p><a href="/">β carloku.com</a> Β· <a href="https://github.com/carlosframework/carloku">Source on GitHub</a>.</p> |
| 127 | </div> |
| 128 | </footer> |
| 129 | <script src="/site.js" defer></script> |
| 130 | </body> |
| 131 | </html> |
| 132 | |