<!DOCTYPE html>
<html lang="en" class="landing-root">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>PyGitWeb</title>
	<meta name="description" content="Hassle-free git repo management. A Python re-imagining of GitWeb with FastAPI, thin dependencies, and metadata stored in your repo.">
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;1,9..144,400&family=Figtree:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap" rel="stylesheet">
	<link rel="stylesheet" href="main.css">
	<link rel="stylesheet" href="landing.css">
	<link rel="icon" href="logo.svg" type="image/svg+xml">
</head>
<body class="landing">
	<a class="skip-link" href="#main">Skip to content</a>

	<header class="hero" aria-labelledby="site-title">
		<div class="hero__mesh" aria-hidden="true"></div>
		<div class="hero__inner">
			<div class="hero__mark reveal" style="--reveal-delay: 0ms">
				<img src="logo.svg" alt="" width="120" height="120" class="hero__logo">
			</div>
			<p class="hero__eyebrow reveal" style="--reveal-delay: 80ms">Project hosting, re-imagined</p>
			<h1 id="site-title" class="hero__title reveal" style="--reveal-delay: 120ms">PyGitWeb</h1>
			<p class="hero__tagline reveal" style="--reveal-delay: 180ms">Hassle-free git repo management platform</p>
			<p class="hero__lede reveal" style="--reveal-delay: 240ms">
				A ground-up rewrite of <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-GitWeb">GitWeb</a> in Python with FastAPI:
				Mostly API compatible with GitWeb with tons of additional features for modern workflows.
				<a href="https://app.pygitweb.com">See it in action!</a>
			</p>
		</div>
		<div class="hero__scroll-hint" aria-hidden="true">
			<span class="hero__scroll-line"></span>
		</div>
	</header>

	<main id="main" class="main">
		<section id="what" class="section section--split reveal-section" aria-labelledby="what-heading">
			<div class="section__container">
				<h2 id="what-heading" class="section__heading reveal">What is PyGitWeb?</h2>
				<div class="section__prose reveal">
					<p>
						The goal of PyGitWeb is to provide everything you need to self host a code forge for small or medium-sized teams.
						PyGitWeb implements OAuth2 flows, but if running locally or inside a LAN, it can be run without authentication.
					</p>
					<p>
						PyGit2 is the only dependency required by the internal tooling package, so you can script workflows without
						bringing up the web server. There is also an ABC-based plugin model if you want to extend the stack with your own tools.
					</p>
				</div>
			</div>
		</section>

		<section class="section section--deps" aria-labelledby="deps-heading">
			<div class="section__container">
				<h2 id="deps-heading" class="section__heading reveal">Core dependencies</h2>
				<ul class="dep-grid" role="list">
					<li class="dep-card reveal">
						<h3 class="dep-card__name">PyGit2</h3>
						<p class="dep-card__desc">LibGit2 wrapper for fast manipulation and queries. Shared with standalone tooling.</p>
					</li>
					<li class="dep-card reveal">
						<h3 class="dep-card__name">FastAPI + Uvicorn</h3>
						<p class="dep-card__desc">ASGI server for rendered pages and internal workflow requests.</p>
					</li>
					<li class="dep-card reveal">
						<h3 class="dep-card__name">Jinja2</h3>
						<p class="dep-card__desc">Fast, safe templating.</p>
					</li>
					<li class="dep-card reveal">
						<h3 class="dep-card__name">orjson</h3>
						<p class="dep-card__desc">High-performance JSON serialization.</p>
					</li>
					<li class="dep-card reveal">
						<h3 class="dep-card__name">pydantic-settings</h3>
						<p class="dep-card__desc">Straightforward settings model.</p>
					</li>
					<li class="dep-card reveal">
						<h3 class="dep-card__name">python-ripgrep</h3>
						<p class="dep-card__desc">Fast file search across the tree.</p>
					</li>
				</ul>
			</div>
		</section>

		<section id="apart" class="section section--philosophy reveal-section" aria-labelledby="apart-heading">
			<div class="section__container">
				<h2 id="apart-heading" class="section__heading reveal">What sets it apart?</h2>
				<blockquote class="pullquote reveal">
					<p>All project metadata is stored in-situ; discovering new merge requests and tasks is just a git fetch.</p>
				</blockquote>
				<div class="section__prose reveal">
					<p>
						Settings, merge requests, comments, and tasks all live in your repository object database.
						No separate database service to provision. If you have a repo, you have what PyGitWeb needs.
					</p>
					<p class="section__cta">Setup is easy - give it a try.</p>
				</div>
			</div>
		</section>

		<section id="enterprise" class="section section--note reveal-section" aria-labelledby="enterprise-heading">
			<div class="section__container">
				<h2 id="enterprise-heading" class="section__heading reveal">Enterprise scale?</h2>
				<div class="section__prose reveal">
					<p>
						Not yet. PyGitWeb is currently only tested with light workflows, and is only recommended for evaluation by individuals and small teams. Stay tuned for updates!
					</p>
				</div>
			</div>
		</section>
	</main>

	<footer class="site-footer">
		<div class="site-footer__inner">
			<p class="site-footer__text">PyGitWeb</p>
			<p class="site-footer__meta text-muted"><code class="footer-code">(c) 2026 Will Bowers</code>.</p>
		</div>
	</footer>
</body>
</html>