download.html

199 lines
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
{{template "main.html" .}}

{{define "title"}}Download — Congo{{end}}
{{define "description"}}Download Congo for macOS, Linux, or Windows. Single binary, no dependencies.{{end}}

{{define "content"}}
<div class="max-w-3xl mx-auto px-6 py-16">
    <h1 class="text-3xl md:text-4xl font-bold tracking-tight mb-3">Get Congo</h1>
    <p class="text-body text-base mb-12">
        Download a prebuilt binary or build from source. No package manager needed.
    </p>

    <div class="space-y-0">

        <!-- Download Binaries -->
        <section class="pb-16">
            <h2 class="text-xl font-bold tracking-tight mb-6">Download Binary</h2>
            <div class="grid grid-cols-1 sm:grid-cols-2 gap-3" id="download-grid">
                {{range downloads.Platforms}}
                <a href="/download/{{.Filename}}" id="dl-{{.OS}}-{{.Arch}}" data-os="{{.OS}}"
                   class="glow-card p-4 flex items-center gap-4 no-underline">
                    <div class="flex-1">
                        <div class="text-bright text-sm font-semibold">{{.Label}}</div>
                        <div class="text-muted text-xs font-mono mt-1">{{.Filename}}</div>
                    </div>
                    <svg class="w-5 h-5 text-muted shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
                        <path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/>
                    </svg>
                </a>
                {{end}}
            </div>
            <p class="text-muted text-xs mt-5">Requires <a href="https://go.dev/dl/" class="text-accent hover:text-bright transition-colors" target="_blank" rel="noopener">Go 1.25+</a> to build projects. The binary itself has no dependencies.</p>
            <div class="code-block mt-4">
                <pre><code class="language-bash"># macOS / Linux
tar -xzf congo-*.tar.gz
mv congo /usr/local/bin/
congo version</code></pre>
            </div>
        </section>

        <!-- Create a Project -->
        <section class="section-divide py-16">
            <h2 class="text-xl font-bold tracking-tight mb-4">Create a Project</h2>
            <div class="code-block mb-5">
                <pre><code class="language-bash">congo init myapp
cd myapp
congo dev</code></pre>
            </div>
            <p class="text-body leading-relaxed">
                This vendors the entire framework into your project as <code class="text-accent">internal/</code>.
                Your app depends on Go's standard library, a SQLite driver, and a handful of small libraries.
                See the <a href="/guide" class="text-accent hover:text-bright transition-colors" hx-boost="true">guide</a> for a full walkthrough.
            </p>
        </section>

        <!-- Extract from Binary -->
        <section class="section-divide py-16">
            <h2 class="text-xl font-bold tracking-tight mb-4">Extract from an Existing Binary</h2>
            <p class="text-body leading-relaxed mb-5">
                If you already have Congo (or someone sent you the binary), it can reproduce itself:
            </p>
            <div class="code-block mb-5">
                <pre><code class="language-bash">congo source ./congo-src
cd congo-src
go build -o congo .
./congo version</code></pre>
            </div>
            <p class="text-body leading-relaxed">
                <code class="text-accent">congo source</code> extracts the complete source tree from
                inside the binary — the CLI, the framework packages, the scaffold templates, everything.
                You can rebuild Congo from Congo.
            </p>
        </section>

        <!-- Build from Source -->
        <section class="section-divide py-16">
            <h2 class="text-xl font-bold tracking-tight mb-4">Build from Source</h2>
            <p class="text-body leading-relaxed mb-5">
                Every file that makes up Congo is available at <a href="/source" class="text-accent hover:text-bright transition-colors" hx-boost="true">/source</a>.
                Browse, read, and copy the source directly from this website.
            </p>
            <p class="text-muted text-sm">Requires Go 1.25+ and nothing else.</p>
        </section>

        <!-- CLI Commands -->
        <section class="section-divide py-16">
            <h2 class="text-xl font-bold tracking-tight mb-5">CLI Commands</h2>
            <div class="space-y-0">
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo init &lt;name&gt;</span>
                    <span class="text-body text-sm">Create a new project with vendored framework</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo new &lt;name&gt;</span>
                    <span class="text-body text-sm">Add an app to an existing project</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo dev</span>
                    <span class="text-body text-sm">Run development server</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo build</span>
                    <span class="text-body text-sm">Build for production</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo launch</span>
                    <span class="text-body text-sm">Deploy infrastructure from infra.json</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo connect</span>
                    <span class="text-body text-sm">SSH into a deployed server</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo claude</span>
                    <span class="text-body text-sm">Launch Claude Code with framework context</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-accent text-sm w-40 sm:w-48 shrink-0">congo source</span>
                    <span class="text-body text-sm">Extract Congo source code from the binary</span>
                </div>
            </div>
        </section>

        <!-- Flags -->
        <section class="section-divide py-16">
            <h2 class="text-xl font-bold tracking-tight mb-3">Flags for <code class="text-accent">congo init</code></h2>
            <p class="text-body text-sm leading-relaxed mb-5">
                Each flag excludes a <a href="/guide#packages" class="text-accent hover:text-bright transition-colors" hx-boost="true">framework package</a>. Use them to keep your project minimal.
            </p>
            <div class="space-y-0">
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--module &lt;path&gt;</span>
                    <span class="text-body text-sm">Go module path (default: project name)</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--dir &lt;name&gt;</span>
                    <span class="text-body text-sm">App directory name (default: web)</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--no-frontend</span>
                    <span class="text-body text-sm">Exclude React islands (<a href="/source/pkg/frontend" class="text-accent hover:text-bright transition-colors" hx-boost="true">frontend</a>)</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--no-assistant</span>
                    <span class="text-body text-sm">Exclude AI package (<a href="/source/pkg/assistant" class="text-accent hover:text-bright transition-colors" hx-boost="true">assistant</a>)</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--no-platform</span>
                    <span class="text-body text-sm">Exclude cloud deployment (<a href="/source/pkg/platform" class="text-accent hover:text-bright transition-colors" hx-boost="true">platform</a>)</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--no-database</span>
                    <span class="text-body text-sm">Exclude ORM (<a href="/source/pkg/database" class="text-accent hover:text-bright transition-colors" hx-boost="true">database</a>)</span>
                </div>
                <div class="table-row flex items-center gap-6 py-3 px-2">
                    <span class="font-mono text-muted text-sm w-40 sm:w-48 shrink-0">--application-only</span>
                    <span class="text-body text-sm">Only include <a href="/source/pkg/application" class="text-accent hover:text-bright transition-colors" hx-boost="true">application</a></span>
                </div>
            </div>
        </section>

    </div>

    <div class="mt-8 max-w-md mx-auto">
        {{template "mailing-list.html" .}}
    </div>
</div>
<script nonce="{{nonce}}">
(function() {
    var ua = navigator.userAgent.toLowerCase();
    var os = '';
    if (ua.indexOf('mac') !== -1) os = 'darwin';
    else if (ua.indexOf('win') !== -1) os = 'windows';
    else if (ua.indexOf('linux') !== -1) os = 'linux';

    var arch = 'amd64';
    if (navigator.userAgentData && navigator.userAgentData.getHighEntropyValues) {
        navigator.userAgentData.getHighEntropyValues(['architecture']).then(function(v) {
            if (v.architecture === 'arm') arch = 'arm64';
            highlight(os, arch);
        });
    } else {
        highlight(os, arch);
    }

    function highlight(os, arch) {
        if (!os) return;
        var el = document.getElementById('dl-' + os + '-' + arch);
        if (!el) return;
        el.style.borderColor = 'rgba(120,119,198,0.4)';
        el.style.background = 'rgba(120,119,198,0.08)';
        var badge = document.createElement('span');
        badge.className = 'text-accent text-xs font-mono';
        badge.textContent = 'detected';
        el.querySelector('div').appendChild(badge);
    }
})();
</script>
{{end}}