6.7 KiB · text 5af55d9
<Layouts.app flash={@flash} current_scope={@current_scope}>
<section class="space-y-3 pt-6 pb-10">
<p class="font-mono text-xs uppercase tracking-[0.18em] text-accent">
Self-hosted code forge
</p>
<h1 class="text-5xl sm:text-6xl font-bold tracking-tight">
git gud<span class="text-primary">.</span>
</h1>
<p class="text-lg opacity-80 max-w-2xl">
Repos, issues, pull requests, CI, wiki, federation. Phoenix on the front,
<span class="font-mono">gitoxide</span>
on the back, ForgeFed by default. Built so you can host the small
project that becomes a movement.
</p>
<div class="flex flex-wrap gap-2 pt-2">
<.link navigate={~p"/repositories"} class="btn btn-primary" id="cta-browse">
Browse repositories <.icon name="hero-arrow-right-micro" class="size-4" />
</.link>
<%= if @current_scope && @current_scope.user do %>
<.link
navigate={~p"/repositories/new"}
class="btn btn-ghost border border-base-300"
id="cta-new"
>
<.icon name="hero-plus-micro" class="size-4" /> New repository
</.link>
<% else %>
<.link
navigate={~p"/users/register"}
class="btn btn-ghost border border-base-300"
id="cta-register"
>
Get an account
</.link>
<% end %>
</div>
</section>
<section class="grid sm:grid-cols-2 lg:grid-cols-3 gap-4 pt-2">
<.feature
icon="hero-folder"
title="Repos, smart-HTTP + SSH"
body="Bare git on disk with a Postgres cache in front. Embedded SSH daemon — DB-backed key auth, no system git user. LFS too."
/>
<.feature
icon="hero-arrow-trending-up"
title="Forks, PRs, line-level diffs"
body="3-way merge, fork sync, compare any two refs. Diffs render hunk-by-hunk with syntax-highlighted lines; large diffs keep their hunks out of the DOM until you open the file."
/>
<.feature
icon="hero-bolt"
title="Forgejo Actions CI"
body="Talk protobuf to forgejo-runner. Per-task JWTs, encrypted secrets, artifacts + cache with hit matching, re-run + cancel from the UI."
/>
<.feature
icon="hero-globe-alt"
title="Federation that works"
body="ForgeFed over ActivityPub: federated PRs, federated reviews (Like/Dislike), federated comments. HTTP-signed; allowlist by default."
/>
<.feature
icon="hero-shield-check"
title="Moderation up front"
body="Per-repo interaction policy, quarantine queue, rate limits, peer-block suggestions, and a reversible 'replace with mod message' that keeps the original visible to admins + author."
/>
<.feature
icon="hero-finger-print"
title="MFA + WebAuthn"
body="TOTP authenticator apps, FIDO2 security keys (YubiKey, passkeys, Touch ID), recovery codes. Optional instance-wide enforcement with a grace window."
/>
<.feature
icon="hero-paint-brush"
title="Markdown that links itself"
body="GFM with cross-references — `#42` links to whichever issue or PR that number actually is, `#x2a` works too, `owner/repo#42` crosses repos. Quote-reply on every comment."
/>
<.feature
icon="hero-tag"
title="Org-level labels"
body="Define labels once at the org; every repo inherits unless it opts out. Color picker with a 16-swatch palette and a live preview badge."
/>
<.feature
icon="hero-book-open"
title="Wiki + container registry"
body="Sister .wiki.git you edit through the UI. Container packages mirrored from zot via webhook, browsable per-repo without leaving the forge."
/>
<.feature
icon="hero-user-circle"
title="Profiles + identicon avatars"
body="User + org profile pages at /u/:handle and /orgs/:handle. Bio, location, socials, pinned repos (drag-to-reorder, up to 7), and an auto-created alice/alice README repo that renders inline."
/>
<.feature
icon="hero-chart-bar"
title="Language + contributor stats"
body="0.3em GitHub-style bar above the file tree, click for /stats/languages or /stats/committers. Computed lazily by Oban from cached blob + commit metadata — no extra git walks on the request path."
/>
<.feature
icon="hero-ticket"
title="Invite-gated signups"
body="Three registration modes — open, invite-only (default), closed. Single-use invite links generated from /users/settings/invites, revocable anytime. Org members manageable from settings with a last-admin guard."
/>
</section>
<section class="mt-12 grid sm:grid-cols-2 gap-3 text-sm">
<.quick_link
:if={@current_scope && @current_scope.user}
icon="hero-user-circle"
label="Your profile"
navigate={~p"/u/#{@current_scope.user.handle}"}
/>
<.quick_link
:if={@current_scope && @current_scope.user}
icon="hero-building-office-2"
label="Your organizations"
navigate={~p"/orgs"}
/>
<.quick_link
icon="hero-list-bullet"
label="All visible repositories"
navigate={~p"/repositories"}
/>
<.quick_link
:if={@current_scope && @current_scope.user}
icon="hero-key"
label="SSH keys"
navigate={~p"/users/settings/ssh-keys"}
/>
<.quick_link
:if={@current_scope && @current_scope.user}
icon="hero-finger-print"
label="Two-factor auth"
navigate={~p"/users/settings/two-factor"}
/>
<.quick_link
:if={@current_scope && @current_scope.user}
icon="hero-ticket"
label="Invites"
navigate={~p"/users/settings/invites"}
/>
<.quick_link
:if={@current_scope && @current_scope.user}
icon="hero-cog-6-tooth"
label="Account settings"
navigate={~p"/users/settings"}
/>
<.quick_link
:if={@current_scope && @current_scope.user && @current_scope.user.is_admin}
icon="hero-wrench-screwdriver"
label="Federation admin"
navigate={~p"/admin/federation"}
/>
</section>
<footer class="py-10 sm:py-12 mt-8 border-t border-base-300 text-center">
<p class="font-mono text-xs uppercase tracking-[0.25em] text-base-content/70 flex items-center justify-center gap-2">
<span class="font-bold tracking-[0.16em]">GIT GUD</span>
<span class="opacity-50">·</span>
<span>a</span>
<%!--
Hardcoded oklch from the neiam-co accent (the value every
ported theme assigns to --color-accent). Inline so the
NEIAM mark stays yellow regardless of which theme the
viewer has picked.
--%>
<span class="font-bold tracking-[0.16em]" style="color: oklch(96% 0.058 96);">
<a href="https://neiam.org"> NEIAM </a>
</span>
<span>production</span>
</p>
</footer>
</Layouts.app>