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
<!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 rewrite keeps dependencies thin: everything you need to run the stack, nothing you do not.
Aside from git-daemon, the usual suspects are PyGit2 for fast repo work, FastAPI and Uvicorn for the ASGI surface,
Jinja2 for templates, orjson for JSON, pydantic-settings for configuration, and python-ripgrep for search.
</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 a 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>We believe all project metadata should live in-situ... discovering new merge requests and tasks should be a git fetch.</p>
</blockquote>
<div class="section__prose reveal">
<p>
Settings, merge requests, comments, Kanban tasks: it all lives 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 - 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>