FossilRepo

fossilrepo / site / architecture / overview / index.html
Source Blame History 1099 lines
2eca4eb… ragelink 1
2eca4eb… ragelink 2 <!doctype html>
2eca4eb… ragelink 3 <html lang="en" class="no-js">
2eca4eb… ragelink 4 <head>
2eca4eb… ragelink 5
2eca4eb… ragelink 6 <meta charset="utf-8">
2eca4eb… ragelink 7 <meta name="viewport" content="width=device-width,initial-scale=1">
2eca4eb… ragelink 8
2eca4eb… ragelink 9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
2eca4eb… ragelink 10
2eca4eb… ragelink 11
2eca4eb… ragelink 12 <meta name="author" content="CONFLICT LLC">
2eca4eb… ragelink 13
2eca4eb… ragelink 14
2eca4eb… ragelink 15 <link rel="canonical" href="https://fossilrepo.dev/architecture/overview/">
2eca4eb… ragelink 16
2eca4eb… ragelink 17
2eca4eb… ragelink 18 <link rel="prev" href="../../getting-started/first-repo/">
2eca4eb… ragelink 19
2eca4eb… ragelink 20
2eca4eb… ragelink 21 <link rel="next" href="../sync-bridge/">
2eca4eb… ragelink 22
2eca4eb… ragelink 23
2eca4eb… ragelink 24
2eca4eb… ragelink 25
2eca4eb… ragelink 26
2eca4eb… ragelink 27 <link rel="icon" href="../../assets/images/favicon.png">
2eca4eb… ragelink 28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
2eca4eb… ragelink 29
2eca4eb… ragelink 30
2eca4eb… ragelink 31
2eca4eb… ragelink 32 <title>Overview - Fossilrepo</title>
2eca4eb… ragelink 33
2eca4eb… ragelink 34
2eca4eb… ragelink 35
2eca4eb… ragelink 36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
2eca4eb… ragelink 37
2eca4eb… ragelink 38
2eca4eb… ragelink 39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
2eca4eb… ragelink 40
2eca4eb… ragelink 41
2eca4eb… ragelink 42
2eca4eb… ragelink 43
2eca4eb… ragelink 44
2eca4eb… ragelink 45
2eca4eb… ragelink 46
2eca4eb… ragelink 47
2eca4eb… ragelink 48
2eca4eb… ragelink 49
2eca4eb… ragelink 50
2eca4eb… ragelink 51
2eca4eb… ragelink 52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
2eca4eb… ragelink 53 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
2eca4eb… ragelink 54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
2eca4eb… ragelink 55
2eca4eb… ragelink 56
2eca4eb… ragelink 57
2eca4eb… ragelink 58 <link rel="stylesheet" href="../../assets/css/custom.css">
2eca4eb… ragelink 59
2eca4eb… ragelink 60 <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
2eca4eb… ragelink 61
2eca4eb… ragelink 62
2eca4eb… ragelink 63
2eca4eb… ragelink 64
2eca4eb… ragelink 65
2eca4eb… ragelink 66 </head>
2eca4eb… ragelink 67
2eca4eb… ragelink 68
2eca4eb… ragelink 69
2eca4eb… ragelink 70
2eca4eb… ragelink 71
2eca4eb… ragelink 72
2eca4eb… ragelink 73
2eca4eb… ragelink 74
2eca4eb… ragelink 75
2eca4eb… ragelink 76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
2eca4eb… ragelink 77
2eca4eb… ragelink 78
2eca4eb… ragelink 79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
2eca4eb… ragelink 80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
2eca4eb… ragelink 81 <label class="md-overlay" for="__drawer"></label>
2eca4eb… ragelink 82 <div data-md-component="skip">
2eca4eb… ragelink 83
2eca4eb… ragelink 84
2eca4eb… ragelink 85 <a href="#architecture-overview" class="md-skip">
2eca4eb… ragelink 86 Skip to content
2eca4eb… ragelink 87 </a>
2eca4eb… ragelink 88
2eca4eb… ragelink 89 </div>
2eca4eb… ragelink 90 <div data-md-component="announce">
2eca4eb… ragelink 91
2eca4eb… ragelink 92 </div>
2eca4eb… ragelink 93
2eca4eb… ragelink 94
2eca4eb… ragelink 95
2eca4eb… ragelink 96
2eca4eb… ragelink 97 <header class="md-header" data-md-component="header">
2eca4eb… ragelink 98 <nav class="md-header__inner md-grid" aria-label="Header">
2eca4eb… ragelink 99 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
2eca4eb… ragelink 100 <div style="display: flex; align-items: center; gap: 0.6rem;">
2eca4eb… ragelink 101 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
2eca4eb… ragelink 102 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
2eca4eb… ragelink 103 </div>
2eca4eb… ragelink 104 </a>
2eca4eb… ragelink 105 <label class="md-header__button md-icon" for="__drawer">
2eca4eb… ragelink 106
2eca4eb… ragelink 107 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
2eca4eb… ragelink 108 </label>
2eca4eb… ragelink 109 <div class="md-header__title" data-md-component="header-title">
2eca4eb… ragelink 110 <div class="md-header__ellipsis">
2eca4eb… ragelink 111 <div class="md-header__topic">
2eca4eb… ragelink 112 <span class="md-ellipsis">
2eca4eb… ragelink 113 Fossilrepo
2eca4eb… ragelink 114 </span>
2eca4eb… ragelink 115 </div>
2eca4eb… ragelink 116 <div class="md-header__topic" data-md-component="header-topic">
2eca4eb… ragelink 117 <span class="md-ellipsis">
2eca4eb… ragelink 118
2eca4eb… ragelink 119 Overview
2eca4eb… ragelink 120
2eca4eb… ragelink 121 </span>
2eca4eb… ragelink 122 </div>
2eca4eb… ragelink 123 </div>
2eca4eb… ragelink 124 </div>
2eca4eb… ragelink 125
2eca4eb… ragelink 126
2eca4eb… ragelink 127 <form class="md-header__option" data-md-component="palette">
2eca4eb… ragelink 128
2eca4eb… ragelink 129
2eca4eb… ragelink 130
2eca4eb… ragelink 131
2eca4eb… ragelink 132 <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
2eca4eb… ragelink 133
2eca4eb… ragelink 134 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
2eca4eb… ragelink 135 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
2eca4eb… ragelink 136 </label>
2eca4eb… ragelink 137
2eca4eb… ragelink 138
2eca4eb… ragelink 139
2eca4eb… ragelink 140
2eca4eb… ragelink 141
2eca4eb… ragelink 142 <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
2eca4eb… ragelink 143
2eca4eb… ragelink 144 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
2eca4eb… ragelink 145 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
2eca4eb… ragelink 146 </label>
2eca4eb… ragelink 147
2eca4eb… ragelink 148
2eca4eb… ragelink 149 </form>
2eca4eb… ragelink 150
2eca4eb… ragelink 151
2eca4eb… ragelink 152
2eca4eb… ragelink 153 <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
2eca4eb… ragelink 154
2eca4eb… ragelink 155
2eca4eb… ragelink 156
2eca4eb… ragelink 157
2eca4eb… ragelink 158
2eca4eb… ragelink 159 <label class="md-header__button md-icon" for="__search">
2eca4eb… ragelink 160
2eca4eb… ragelink 161 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
2eca4eb… ragelink 162 </label>
2eca4eb… ragelink 163 <div class="md-search" data-md-component="search" role="dialog">
2eca4eb… ragelink 164 <label class="md-search__overlay" for="__search"></label>
2eca4eb… ragelink 165 <div class="md-search__inner" role="search">
2eca4eb… ragelink 166 <form class="md-search__form" name="search">
2eca4eb… ragelink 167 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
2eca4eb… ragelink 168 <label class="md-search__icon md-icon" for="__search">
2eca4eb… ragelink 169
2eca4eb… ragelink 170 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
2eca4eb… ragelink 171
2eca4eb… ragelink 172 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
2eca4eb… ragelink 173 </label>
2eca4eb… ragelink 174 <nav class="md-search__options" aria-label="Search">
2eca4eb… ragelink 175
2eca4eb… ragelink 176 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
2eca4eb… ragelink 177
2eca4eb… ragelink 178 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
2eca4eb… ragelink 179 </button>
2eca4eb… ragelink 180 </nav>
2eca4eb… ragelink 181
2eca4eb… ragelink 182 <div class="md-search__suggest" data-md-component="search-suggest"></div>
2eca4eb… ragelink 183
2eca4eb… ragelink 184 </form>
2eca4eb… ragelink 185 <div class="md-search__output">
2eca4eb… ragelink 186 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
2eca4eb… ragelink 187 <div class="md-search-result" data-md-component="search-result">
2eca4eb… ragelink 188 <div class="md-search-result__meta">
2eca4eb… ragelink 189 Initializing search
2eca4eb… ragelink 190 </div>
2eca4eb… ragelink 191 <ol class="md-search-result__list" role="presentation"></ol>
2eca4eb… ragelink 192 </div>
2eca4eb… ragelink 193 </div>
2eca4eb… ragelink 194 </div>
2eca4eb… ragelink 195 </div>
2eca4eb… ragelink 196 </div>
2eca4eb… ragelink 197
2eca4eb… ragelink 198
2eca4eb… ragelink 199
2eca4eb… ragelink 200 <div class="md-header__source">
2eca4eb… ragelink 201 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
2eca4eb… ragelink 202 <div class="md-source__icon md-icon">
2eca4eb… ragelink 203
2eca4eb… ragelink 204 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
2eca4eb… ragelink 205 </div>
2eca4eb… ragelink 206 <div class="md-source__repository">
2eca4eb… ragelink 207 ConflictHQ/fossilrepo
2eca4eb… ragelink 208 </div>
2eca4eb… ragelink 209 </a>
2eca4eb… ragelink 210 </div>
2eca4eb… ragelink 211
2eca4eb… ragelink 212 </nav>
2eca4eb… ragelink 213
2eca4eb… ragelink 214 </header>
2eca4eb… ragelink 215
2eca4eb… ragelink 216 <div class="md-container" data-md-component="container">
2eca4eb… ragelink 217
2eca4eb… ragelink 218
2eca4eb… ragelink 219
2eca4eb… ragelink 220
2eca4eb… ragelink 221
2eca4eb… ragelink 222 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
2eca4eb… ragelink 223 <div class="md-grid">
2eca4eb… ragelink 224 <ul class="md-tabs__list">
2eca4eb… ragelink 225
2eca4eb… ragelink 226
2eca4eb… ragelink 227
2eca4eb… ragelink 228
2eca4eb… ragelink 229
2eca4eb… ragelink 230
2eca4eb… ragelink 231 <li class="md-tabs__item">
2eca4eb… ragelink 232 <a href="../.." class="md-tabs__link">
2eca4eb… ragelink 233
2eca4eb… ragelink 234
2eca4eb… ragelink 235
2eca4eb… ragelink 236
2eca4eb… ragelink 237
2eca4eb… ragelink 238 Home
2eca4eb… ragelink 239
2eca4eb… ragelink 240 </a>
2eca4eb… ragelink 241 </li>
2eca4eb… ragelink 242
2eca4eb… ragelink 243
2eca4eb… ragelink 244
2eca4eb… ragelink 245
2eca4eb… ragelink 246
2eca4eb… ragelink 247
2eca4eb… ragelink 248
2eca4eb… ragelink 249
2eca4eb… ragelink 250
2eca4eb… ragelink 251
2eca4eb… ragelink 252 <li class="md-tabs__item">
2eca4eb… ragelink 253 <a href="../../getting-started/prerequisites/" class="md-tabs__link">
2eca4eb… ragelink 254
2eca4eb… ragelink 255
2eca4eb… ragelink 256
2eca4eb… ragelink 257 Getting Started
2eca4eb… ragelink 258
2eca4eb… ragelink 259 </a>
2eca4eb… ragelink 260 </li>
2eca4eb… ragelink 261
2eca4eb… ragelink 262
2eca4eb… ragelink 263
2eca4eb… ragelink 264
2eca4eb… ragelink 265
2eca4eb… ragelink 266
2eca4eb… ragelink 267
2eca4eb… ragelink 268
2eca4eb… ragelink 269
2eca4eb… ragelink 270
2eca4eb… ragelink 271
2eca4eb… ragelink 272
2eca4eb… ragelink 273
2eca4eb… ragelink 274 <li class="md-tabs__item md-tabs__item--active">
2eca4eb… ragelink 275 <a href="./" class="md-tabs__link">
2eca4eb… ragelink 276
2eca4eb… ragelink 277
2eca4eb… ragelink 278
2eca4eb… ragelink 279 Architecture
2eca4eb… ragelink 280
2eca4eb… ragelink 281 </a>
2eca4eb… ragelink 282 </li>
2eca4eb… ragelink 283
2eca4eb… ragelink 284
2eca4eb… ragelink 285
2eca4eb… ragelink 286
2eca4eb… ragelink 287 </ul>
2eca4eb… ragelink 288 </div>
2eca4eb… ragelink 289 </nav>
2eca4eb… ragelink 290
2eca4eb… ragelink 291
2eca4eb… ragelink 292
2eca4eb… ragelink 293 <main class="md-main" data-md-component="main">
2eca4eb… ragelink 294 <div class="md-main__inner md-grid">
2eca4eb… ragelink 295
2eca4eb… ragelink 296
2eca4eb… ragelink 297
2eca4eb… ragelink 298 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
2eca4eb… ragelink 299 <div class="md-sidebar__scrollwrap">
2eca4eb… ragelink 300 <div class="md-sidebar__inner">
2eca4eb… ragelink 301
2eca4eb… ragelink 302
2eca4eb… ragelink 303
2eca4eb… ragelink 304
2eca4eb… ragelink 305
2eca4eb… ragelink 306
2eca4eb… ragelink 307 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
2eca4eb… ragelink 308 <label class="md-nav__title" for="__drawer">
2eca4eb… ragelink 309 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
2eca4eb… ragelink 310 <div style="display: flex; align-items: center; gap: 0.6rem;">
2eca4eb… ragelink 311 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
2eca4eb… ragelink 312 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
2eca4eb… ragelink 313 </div>
2eca4eb… ragelink 314 </a>
2eca4eb… ragelink 315 Fossilrepo
2eca4eb… ragelink 316 </label>
2eca4eb… ragelink 317
2eca4eb… ragelink 318 <div class="md-nav__source">
2eca4eb… ragelink 319 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
2eca4eb… ragelink 320 <div class="md-source__icon md-icon">
2eca4eb… ragelink 321
2eca4eb… ragelink 322 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
2eca4eb… ragelink 323 </div>
2eca4eb… ragelink 324 <div class="md-source__repository">
2eca4eb… ragelink 325 ConflictHQ/fossilrepo
2eca4eb… ragelink 326 </div>
2eca4eb… ragelink 327 </a>
2eca4eb… ragelink 328 </div>
2eca4eb… ragelink 329
2eca4eb… ragelink 330 <ul class="md-nav__list" data-md-scrollfix>
2eca4eb… ragelink 331
2eca4eb… ragelink 332
2eca4eb… ragelink 333
2eca4eb… ragelink 334
2eca4eb… ragelink 335
2eca4eb… ragelink 336
2eca4eb… ragelink 337
2eca4eb… ragelink 338 <li class="md-nav__item">
2eca4eb… ragelink 339 <a href="../.." class="md-nav__link">
2eca4eb… ragelink 340
2eca4eb… ragelink 341
2eca4eb… ragelink 342
2eca4eb… ragelink 343 <span class="md-ellipsis">
2eca4eb… ragelink 344
2eca4eb… ragelink 345
2eca4eb… ragelink 346 Home
2eca4eb… ragelink 347
2eca4eb… ragelink 348
2eca4eb… ragelink 349
2eca4eb… ragelink 350 </span>
2eca4eb… ragelink 351
2eca4eb… ragelink 352
2eca4eb… ragelink 353
2eca4eb… ragelink 354 </a>
2eca4eb… ragelink 355 </li>
2eca4eb… ragelink 356
2eca4eb… ragelink 357
2eca4eb… ragelink 358
2eca4eb… ragelink 359
2eca4eb… ragelink 360
2eca4eb… ragelink 361
2eca4eb… ragelink 362
2eca4eb… ragelink 363
2eca4eb… ragelink 364
2eca4eb… ragelink 365
2eca4eb… ragelink 366
2eca4eb… ragelink 367
2eca4eb… ragelink 368
2eca4eb… ragelink 369
2eca4eb… ragelink 370
2eca4eb… ragelink 371
2eca4eb… ragelink 372
2eca4eb… ragelink 373
2eca4eb… ragelink 374
2eca4eb… ragelink 375 <li class="md-nav__item md-nav__item--nested">
2eca4eb… ragelink 376
2eca4eb… ragelink 377
2eca4eb… ragelink 378
2eca4eb… ragelink 379
2eca4eb… ragelink 380
2eca4eb… ragelink 381 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
2eca4eb… ragelink 382
2eca4eb… ragelink 383
2eca4eb… ragelink 384 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
2eca4eb… ragelink 385
2eca4eb… ragelink 386
2eca4eb… ragelink 387
2eca4eb… ragelink 388 <span class="md-ellipsis">
2eca4eb… ragelink 389
2eca4eb… ragelink 390
2eca4eb… ragelink 391 Getting Started
2eca4eb… ragelink 392
2eca4eb… ragelink 393
2eca4eb… ragelink 394
2eca4eb… ragelink 395 </span>
2eca4eb… ragelink 396
2eca4eb… ragelink 397
2eca4eb… ragelink 398
2eca4eb… ragelink 399 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 400 </label>
2eca4eb… ragelink 401
2eca4eb… ragelink 402 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
2eca4eb… ragelink 403 <label class="md-nav__title" for="__nav_2">
2eca4eb… ragelink 404 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 405
2eca4eb… ragelink 406
2eca4eb… ragelink 407 Getting Started
2eca4eb… ragelink 408
2eca4eb… ragelink 409
2eca4eb… ragelink 410 </label>
2eca4eb… ragelink 411 <ul class="md-nav__list" data-md-scrollfix>
2eca4eb… ragelink 412
2eca4eb… ragelink 413
2eca4eb… ragelink 414
2eca4eb… ragelink 415
2eca4eb… ragelink 416
2eca4eb… ragelink 417
2eca4eb… ragelink 418
2eca4eb… ragelink 419 <li class="md-nav__item">
2eca4eb… ragelink 420 <a href="../../getting-started/prerequisites/" class="md-nav__link">
2eca4eb… ragelink 421
2eca4eb… ragelink 422
2eca4eb… ragelink 423
2eca4eb… ragelink 424 <span class="md-ellipsis">
2eca4eb… ragelink 425
2eca4eb… ragelink 426
2eca4eb… ragelink 427 Prerequisites
2eca4eb… ragelink 428
2eca4eb… ragelink 429
2eca4eb… ragelink 430
2eca4eb… ragelink 431 </span>
2eca4eb… ragelink 432
2eca4eb… ragelink 433
2eca4eb… ragelink 434
2eca4eb… ragelink 435 </a>
2eca4eb… ragelink 436 </li>
2eca4eb… ragelink 437
2eca4eb… ragelink 438
2eca4eb… ragelink 439
2eca4eb… ragelink 440
2eca4eb… ragelink 441
2eca4eb… ragelink 442
2eca4eb… ragelink 443
2eca4eb… ragelink 444
2eca4eb… ragelink 445
2eca4eb… ragelink 446
2eca4eb… ragelink 447 <li class="md-nav__item">
2eca4eb… ragelink 448 <a href="../../getting-started/installation/" class="md-nav__link">
2eca4eb… ragelink 449
2eca4eb… ragelink 450
2eca4eb… ragelink 451
2eca4eb… ragelink 452 <span class="md-ellipsis">
2eca4eb… ragelink 453
2eca4eb… ragelink 454
2eca4eb… ragelink 455 Installation
2eca4eb… ragelink 456
2eca4eb… ragelink 457
2eca4eb… ragelink 458
2eca4eb… ragelink 459 </span>
2eca4eb… ragelink 460
2eca4eb… ragelink 461
2eca4eb… ragelink 462
2eca4eb… ragelink 463 </a>
2eca4eb… ragelink 464 </li>
2eca4eb… ragelink 465
2eca4eb… ragelink 466
2eca4eb… ragelink 467
2eca4eb… ragelink 468
2eca4eb… ragelink 469
2eca4eb… ragelink 470
2eca4eb… ragelink 471
2eca4eb… ragelink 472
2eca4eb… ragelink 473
2eca4eb… ragelink 474
2eca4eb… ragelink 475 <li class="md-nav__item">
2eca4eb… ragelink 476 <a href="../../getting-started/configuration/" class="md-nav__link">
2eca4eb… ragelink 477
2eca4eb… ragelink 478
2eca4eb… ragelink 479
2eca4eb… ragelink 480 <span class="md-ellipsis">
2eca4eb… ragelink 481
2eca4eb… ragelink 482
2eca4eb… ragelink 483 Configuration
2eca4eb… ragelink 484
2eca4eb… ragelink 485
2eca4eb… ragelink 486
2eca4eb… ragelink 487 </span>
2eca4eb… ragelink 488
2eca4eb… ragelink 489
2eca4eb… ragelink 490
2eca4eb… ragelink 491 </a>
2eca4eb… ragelink 492 </li>
2eca4eb… ragelink 493
2eca4eb… ragelink 494
2eca4eb… ragelink 495
2eca4eb… ragelink 496
2eca4eb… ragelink 497
2eca4eb… ragelink 498
2eca4eb… ragelink 499
2eca4eb… ragelink 500
2eca4eb… ragelink 501
2eca4eb… ragelink 502
2eca4eb… ragelink 503 <li class="md-nav__item">
2eca4eb… ragelink 504 <a href="../../getting-started/first-repo/" class="md-nav__link">
2eca4eb… ragelink 505
2eca4eb… ragelink 506
2eca4eb… ragelink 507
2eca4eb… ragelink 508 <span class="md-ellipsis">
2eca4eb… ragelink 509
2eca4eb… ragelink 510
2eca4eb… ragelink 511 First Repository
2eca4eb… ragelink 512
2eca4eb… ragelink 513
2eca4eb… ragelink 514
2eca4eb… ragelink 515 </span>
2eca4eb… ragelink 516
2eca4eb… ragelink 517
2eca4eb… ragelink 518
2eca4eb… ragelink 519 </a>
2eca4eb… ragelink 520 </li>
2eca4eb… ragelink 521
2eca4eb… ragelink 522
2eca4eb… ragelink 523
2eca4eb… ragelink 524
2eca4eb… ragelink 525 </ul>
2eca4eb… ragelink 526 </nav>
2eca4eb… ragelink 527
2eca4eb… ragelink 528 </li>
2eca4eb… ragelink 529
2eca4eb… ragelink 530
2eca4eb… ragelink 531
2eca4eb… ragelink 532
2eca4eb… ragelink 533
2eca4eb… ragelink 534
2eca4eb… ragelink 535
2eca4eb… ragelink 536
2eca4eb… ragelink 537
2eca4eb… ragelink 538
2eca4eb… ragelink 539
2eca4eb… ragelink 540
2eca4eb… ragelink 541
2eca4eb… ragelink 542
2eca4eb… ragelink 543
2eca4eb… ragelink 544
2eca4eb… ragelink 545
2eca4eb… ragelink 546
2eca4eb… ragelink 547
2eca4eb… ragelink 548
2eca4eb… ragelink 549
2eca4eb… ragelink 550
2eca4eb… ragelink 551
2eca4eb… ragelink 552
2eca4eb… ragelink 553 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
2eca4eb… ragelink 554
2eca4eb… ragelink 555
2eca4eb… ragelink 556
2eca4eb… ragelink 557 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
2eca4eb… ragelink 558
2eca4eb… ragelink 559
2eca4eb… ragelink 560 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
2eca4eb… ragelink 561
2eca4eb… ragelink 562
2eca4eb… ragelink 563
2eca4eb… ragelink 564 <span class="md-ellipsis">
2eca4eb… ragelink 565
2eca4eb… ragelink 566
2eca4eb… ragelink 567 Architecture
2eca4eb… ragelink 568
2eca4eb… ragelink 569
2eca4eb… ragelink 570
2eca4eb… ragelink 571 </span>
2eca4eb… ragelink 572
2eca4eb… ragelink 573
2eca4eb… ragelink 574
2eca4eb… ragelink 575 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 576 </label>
2eca4eb… ragelink 577
2eca4eb… ragelink 578 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
2eca4eb… ragelink 579 <label class="md-nav__title" for="__nav_3">
2eca4eb… ragelink 580 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 581
2eca4eb… ragelink 582
2eca4eb… ragelink 583 Architecture
2eca4eb… ragelink 584
2eca4eb… ragelink 585
2eca4eb… ragelink 586 </label>
2eca4eb… ragelink 587 <ul class="md-nav__list" data-md-scrollfix>
2eca4eb… ragelink 588
2eca4eb… ragelink 589
2eca4eb… ragelink 590
2eca4eb… ragelink 591
2eca4eb… ragelink 592
2eca4eb… ragelink 593
2eca4eb… ragelink 594
2eca4eb… ragelink 595
2eca4eb… ragelink 596
2eca4eb… ragelink 597 <li class="md-nav__item md-nav__item--active">
2eca4eb… ragelink 598
2eca4eb… ragelink 599 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
2eca4eb… ragelink 600
2eca4eb… ragelink 601
2eca4eb… ragelink 602
2eca4eb… ragelink 603
2eca4eb… ragelink 604
2eca4eb… ragelink 605 <label class="md-nav__link md-nav__link--active" for="__toc">
2eca4eb… ragelink 606
2eca4eb… ragelink 607
2eca4eb… ragelink 608
2eca4eb… ragelink 609 <span class="md-ellipsis">
2eca4eb… ragelink 610
2eca4eb… ragelink 611
2eca4eb… ragelink 612 Overview
2eca4eb… ragelink 613
2eca4eb… ragelink 614
2eca4eb… ragelink 615
2eca4eb… ragelink 616 </span>
2eca4eb… ragelink 617
2eca4eb… ragelink 618
2eca4eb… ragelink 619
2eca4eb… ragelink 620 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 621 </label>
2eca4eb… ragelink 622
2eca4eb… ragelink 623 <a href="./" class="md-nav__link md-nav__link--active">
2eca4eb… ragelink 624
2eca4eb… ragelink 625
2eca4eb… ragelink 626
2eca4eb… ragelink 627 <span class="md-ellipsis">
2eca4eb… ragelink 628
2eca4eb… ragelink 629
2eca4eb… ragelink 630 Overview
2eca4eb… ragelink 631
2eca4eb… ragelink 632
2eca4eb… ragelink 633
2eca4eb… ragelink 634 </span>
2eca4eb… ragelink 635
2eca4eb… ragelink 636
2eca4eb… ragelink 637
2eca4eb… ragelink 638 </a>
2eca4eb… ragelink 639
2eca4eb… ragelink 640
2eca4eb… ragelink 641
2eca4eb… ragelink 642 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2eca4eb… ragelink 643
2eca4eb… ragelink 644
2eca4eb… ragelink 645
2eca4eb… ragelink 646
2eca4eb… ragelink 647
2eca4eb… ragelink 648
2eca4eb… ragelink 649 <label class="md-nav__title" for="__toc">
2eca4eb… ragelink 650 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 651 Table of contents
2eca4eb… ragelink 652 </label>
2eca4eb… ragelink 653 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2eca4eb… ragelink 654
2eca4eb… ragelink 655 <li class="md-nav__item">
2eca4eb… ragelink 656 <a href="#system-diagram" class="md-nav__link">
2eca4eb… ragelink 657 <span class="md-ellipsis">
2eca4eb… ragelink 658
2eca4eb… ragelink 659 System Diagram
2eca4eb… ragelink 660
2eca4eb… ragelink 661 </span>
2eca4eb… ragelink 662 </a>
2eca4eb… ragelink 663
2eca4eb… ragelink 664 </li>
2eca4eb… ragelink 665
2eca4eb… ragelink 666 <li class="md-nav__item">
2eca4eb… ragelink 667 <a href="#components" class="md-nav__link">
2eca4eb… ragelink 668 <span class="md-ellipsis">
2eca4eb… ragelink 669
2eca4eb… ragelink 670 Components
2eca4eb… ragelink 671
2eca4eb… ragelink 672 </span>
2eca4eb… ragelink 673 </a>
2eca4eb… ragelink 674
2eca4eb… ragelink 675 <nav class="md-nav" aria-label="Components">
2eca4eb… ragelink 676 <ul class="md-nav__list">
2eca4eb… ragelink 677
2eca4eb… ragelink 678 <li class="md-nav__item">
2eca4eb… ragelink 679 <a href="#fossil-server" class="md-nav__link">
2eca4eb… ragelink 680 <span class="md-ellipsis">
2eca4eb… ragelink 681
2eca4eb… ragelink 682 Fossil Server
2eca4eb… ragelink 683
2eca4eb… ragelink 684 </span>
2eca4eb… ragelink 685 </a>
2eca4eb… ragelink 686
2eca4eb… ragelink 687 </li>
2eca4eb… ragelink 688
2eca4eb… ragelink 689 <li class="md-nav__item">
2eca4eb… ragelink 690 <a href="#caddy" class="md-nav__link">
2eca4eb… ragelink 691 <span class="md-ellipsis">
2eca4eb… ragelink 692
2eca4eb… ragelink 693 Caddy
2eca4eb… ragelink 694
2eca4eb… ragelink 695 </span>
2eca4eb… ragelink 696 </a>
2eca4eb… ragelink 697
2eca4eb… ragelink 698 </li>
2eca4eb… ragelink 699
2eca4eb… ragelink 700 <li class="md-nav__item">
2eca4eb… ragelink 701 <a href="#django-management-layer" class="md-nav__link">
2eca4eb… ragelink 702 <span class="md-ellipsis">
2eca4eb… ragelink 703
2eca4eb… ragelink 704 Django Management Layer
2eca4eb… ragelink 705
2eca4eb… ragelink 706 </span>
2eca4eb… ragelink 707 </a>
2eca4eb… ragelink 708
2eca4eb… ragelink 709 </li>
2eca4eb… ragelink 710
2eca4eb… ragelink 711 <li class="md-nav__item">
2eca4eb… ragelink 712 <a href="#litestream" class="md-nav__link">
2eca4eb… ragelink 713 <span class="md-ellipsis">
2eca4eb… ragelink 714
2eca4eb… ragelink 715 Litestream
2eca4eb… ragelink 716
2eca4eb… ragelink 717 </span>
2eca4eb… ragelink 718 </a>
2eca4eb… ragelink 719
2eca4eb… ragelink 720 </li>
2eca4eb… ragelink 721
2eca4eb… ragelink 722 <li class="md-nav__item">
2eca4eb… ragelink 723 <a href="#celery-workers" class="md-nav__link">
2eca4eb… ragelink 724 <span class="md-ellipsis">
2eca4eb… ragelink 725
2eca4eb… ragelink 726 Celery Workers
2eca4eb… ragelink 727
2eca4eb… ragelink 728 </span>
2eca4eb… ragelink 729 </a>
2eca4eb… ragelink 730
2eca4eb… ragelink 731 </li>
2eca4eb… ragelink 732
2eca4eb… ragelink 733 </ul>
2eca4eb… ragelink 734 </nav>
2eca4eb… ragelink 735
2eca4eb… ragelink 736 </li>
2eca4eb… ragelink 737
2eca4eb… ragelink 738 <li class="md-nav__item">
2eca4eb… ragelink 739 <a href="#data-flow" class="md-nav__link">
2eca4eb… ragelink 740 <span class="md-ellipsis">
2eca4eb… ragelink 741
2eca4eb… ragelink 742 Data Flow
2eca4eb… ragelink 743
2eca4eb… ragelink 744 </span>
2eca4eb… ragelink 745 </a>
2eca4eb… ragelink 746
2eca4eb… ragelink 747 </li>
2eca4eb… ragelink 748
2eca4eb… ragelink 749 </ul>
2eca4eb… ragelink 750
2eca4eb… ragelink 751 </nav>
2eca4eb… ragelink 752
2eca4eb… ragelink 753 </li>
2eca4eb… ragelink 754
2eca4eb… ragelink 755
2eca4eb… ragelink 756
2eca4eb… ragelink 757
2eca4eb… ragelink 758
2eca4eb… ragelink 759
2eca4eb… ragelink 760
2eca4eb… ragelink 761
2eca4eb… ragelink 762
2eca4eb… ragelink 763
2eca4eb… ragelink 764 <li class="md-nav__item">
2eca4eb… ragelink 765 <a href="../sync-bridge/" class="md-nav__link">
2eca4eb… ragelink 766
2eca4eb… ragelink 767
2eca4eb… ragelink 768
2eca4eb… ragelink 769 <span class="md-ellipsis">
2eca4eb… ragelink 770
2eca4eb… ragelink 771
2eca4eb… ragelink 772 Sync Bridge
2eca4eb… ragelink 773
2eca4eb… ragelink 774
2eca4eb… ragelink 775
2eca4eb… ragelink 776 </span>
2eca4eb… ragelink 777
2eca4eb… ragelink 778
2eca4eb… ragelink 779
2eca4eb… ragelink 780 </a>
2eca4eb… ragelink 781 </li>
2eca4eb… ragelink 782
2eca4eb… ragelink 783
2eca4eb… ragelink 784
2eca4eb… ragelink 785
2eca4eb… ragelink 786 </ul>
2eca4eb… ragelink 787 </nav>
2eca4eb… ragelink 788
2eca4eb… ragelink 789 </li>
2eca4eb… ragelink 790
2eca4eb… ragelink 791
2eca4eb… ragelink 792
2eca4eb… ragelink 793 </ul>
2eca4eb… ragelink 794 </nav>
2eca4eb… ragelink 795 </div>
2eca4eb… ragelink 796 </div>
2eca4eb… ragelink 797 </div>
2eca4eb… ragelink 798
2eca4eb… ragelink 799
2eca4eb… ragelink 800
2eca4eb… ragelink 801 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2eca4eb… ragelink 802 <div class="md-sidebar__scrollwrap">
2eca4eb… ragelink 803 <div class="md-sidebar__inner">
2eca4eb… ragelink 804
2eca4eb… ragelink 805
2eca4eb… ragelink 806 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2eca4eb… ragelink 807
2eca4eb… ragelink 808
2eca4eb… ragelink 809
2eca4eb… ragelink 810
2eca4eb… ragelink 811
2eca4eb… ragelink 812
2eca4eb… ragelink 813 <label class="md-nav__title" for="__toc">
2eca4eb… ragelink 814 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 815 Table of contents
2eca4eb… ragelink 816 </label>
2eca4eb… ragelink 817 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2eca4eb… ragelink 818
2eca4eb… ragelink 819 <li class="md-nav__item">
2eca4eb… ragelink 820 <a href="#system-diagram" class="md-nav__link">
2eca4eb… ragelink 821 <span class="md-ellipsis">
2eca4eb… ragelink 822
2eca4eb… ragelink 823 System Diagram
2eca4eb… ragelink 824
2eca4eb… ragelink 825 </span>
2eca4eb… ragelink 826 </a>
2eca4eb… ragelink 827
2eca4eb… ragelink 828 </li>
2eca4eb… ragelink 829
2eca4eb… ragelink 830 <li class="md-nav__item">
2eca4eb… ragelink 831 <a href="#components" class="md-nav__link">
2eca4eb… ragelink 832 <span class="md-ellipsis">
2eca4eb… ragelink 833
2eca4eb… ragelink 834 Components
2eca4eb… ragelink 835
2eca4eb… ragelink 836 </span>
2eca4eb… ragelink 837 </a>
2eca4eb… ragelink 838
2eca4eb… ragelink 839 <nav class="md-nav" aria-label="Components">
2eca4eb… ragelink 840 <ul class="md-nav__list">
2eca4eb… ragelink 841
2eca4eb… ragelink 842 <li class="md-nav__item">
2eca4eb… ragelink 843 <a href="#fossil-server" class="md-nav__link">
2eca4eb… ragelink 844 <span class="md-ellipsis">
2eca4eb… ragelink 845
2eca4eb… ragelink 846 Fossil Server
2eca4eb… ragelink 847
2eca4eb… ragelink 848 </span>
2eca4eb… ragelink 849 </a>
2eca4eb… ragelink 850
2eca4eb… ragelink 851 </li>
2eca4eb… ragelink 852
2eca4eb… ragelink 853 <li class="md-nav__item">
2eca4eb… ragelink 854 <a href="#caddy" class="md-nav__link">
2eca4eb… ragelink 855 <span class="md-ellipsis">
2eca4eb… ragelink 856
2eca4eb… ragelink 857 Caddy
2eca4eb… ragelink 858
2eca4eb… ragelink 859 </span>
2eca4eb… ragelink 860 </a>
2eca4eb… ragelink 861
2eca4eb… ragelink 862 </li>
2eca4eb… ragelink 863
2eca4eb… ragelink 864 <li class="md-nav__item">
2eca4eb… ragelink 865 <a href="#django-management-layer" class="md-nav__link">
2eca4eb… ragelink 866 <span class="md-ellipsis">
2eca4eb… ragelink 867
2eca4eb… ragelink 868 Django Management Layer
2eca4eb… ragelink 869
2eca4eb… ragelink 870 </span>
2eca4eb… ragelink 871 </a>
2eca4eb… ragelink 872
2eca4eb… ragelink 873 </li>
2eca4eb… ragelink 874
2eca4eb… ragelink 875 <li class="md-nav__item">
2eca4eb… ragelink 876 <a href="#litestream" class="md-nav__link">
2eca4eb… ragelink 877 <span class="md-ellipsis">
2eca4eb… ragelink 878
2eca4eb… ragelink 879 Litestream
2eca4eb… ragelink 880
2eca4eb… ragelink 881 </span>
2eca4eb… ragelink 882 </a>
2eca4eb… ragelink 883
2eca4eb… ragelink 884 </li>
2eca4eb… ragelink 885
2eca4eb… ragelink 886 <li class="md-nav__item">
2eca4eb… ragelink 887 <a href="#celery-workers" class="md-nav__link">
2eca4eb… ragelink 888 <span class="md-ellipsis">
2eca4eb… ragelink 889
2eca4eb… ragelink 890 Celery Workers
2eca4eb… ragelink 891
2eca4eb… ragelink 892 </span>
2eca4eb… ragelink 893 </a>
2eca4eb… ragelink 894
2eca4eb… ragelink 895 </li>
2eca4eb… ragelink 896
2eca4eb… ragelink 897 </ul>
2eca4eb… ragelink 898 </nav>
2eca4eb… ragelink 899
2eca4eb… ragelink 900 </li>
2eca4eb… ragelink 901
2eca4eb… ragelink 902 <li class="md-nav__item">
2eca4eb… ragelink 903 <a href="#data-flow" class="md-nav__link">
2eca4eb… ragelink 904 <span class="md-ellipsis">
2eca4eb… ragelink 905
2eca4eb… ragelink 906 Data Flow
2eca4eb… ragelink 907
2eca4eb… ragelink 908 </span>
2eca4eb… ragelink 909 </a>
2eca4eb… ragelink 910
2eca4eb… ragelink 911 </li>
2eca4eb… ragelink 912
2eca4eb… ragelink 913 </ul>
2eca4eb… ragelink 914
2eca4eb… ragelink 915 </nav>
2eca4eb… ragelink 916 </div>
2eca4eb… ragelink 917 </div>
2eca4eb… ragelink 918 </div>
2eca4eb… ragelink 919
2eca4eb… ragelink 920
2eca4eb… ragelink 921
2eca4eb… ragelink 922 <div class="md-content" data-md-component="content">
2eca4eb… ragelink 923
2eca4eb… ragelink 924 <article class="md-content__inner md-typeset">
2eca4eb… ragelink 925
2eca4eb… ragelink 926
2eca4eb… ragelink 927
2eca4eb… ragelink 928
2eca4eb… ragelink 929
2eca4eb… ragelink 930
2eca4eb… ragelink 931
2eca4eb… ragelink 932
2eca4eb… ragelink 933 <h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">&para;</a></h1>
2eca4eb… ragelink 934 <p>Fossilrepo is a thin orchestration layer around Fossil SCM. Fossil does the heavy lifting -- fossilrepo handles provisioning, routing, backups, and the management UI.</p>
2eca4eb… ragelink 935 <h2 id="system-diagram">System Diagram<a class="headerlink" href="#system-diagram" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 936 <pre class="mermaid"><code>graph TB
2eca4eb… ragelink 937 subgraph Internet
2eca4eb… ragelink 938 User[User / Browser]
2eca4eb… ragelink 939 end
2eca4eb… ragelink 940
2eca4eb… ragelink 941 subgraph Fossilrepo Server
2eca4eb… ragelink 942 Caddy[Caddy&lt;br/&gt;SSL + Routing]
2eca4eb… ragelink 943 Django[Django&lt;br/&gt;Management UI]
2eca4eb… ragelink 944 Fossil[Fossil Server&lt;br/&gt;--repolist]
2eca4eb… ragelink 945 Celery[Celery Workers]
2eca4eb… ragelink 946 Redis[Redis]
2eca4eb… ragelink 947 Postgres[(PostgreSQL)]
2eca4eb… ragelink 948 Litestream[Litestream]
2eca4eb… ragelink 949 end
2eca4eb… ragelink 950
2eca4eb… ragelink 951 subgraph Storage
2eca4eb… ragelink 952 Repos["/data/repos/&lt;br/&gt;*.fossil files"]
2eca4eb… ragelink 953 S3[(S3 / MinIO)]
2eca4eb… ragelink 954 end
2eca4eb… ragelink 955
2eca4eb… ragelink 956 subgraph Mirrors
2eca4eb… ragelink 957 GitHub[GitHub]
2eca4eb… ragelink 958 GitLab[GitLab]
2eca4eb… ragelink 959 end
2eca4eb… ragelink 960
2eca4eb… ragelink 961 User --&gt; Caddy
2eca4eb… ragelink 962 Caddy --&gt;|"app.domain.com"| Django
2eca4eb… ragelink 963 Caddy --&gt;|"repo.domain.com"| Fossil
2eca4eb… ragelink 964 Django --&gt; Postgres
2eca4eb… ragelink 965 Django --&gt; Redis
2eca4eb… ragelink 966 Celery --&gt; Redis
2eca4eb… ragelink 967 Celery --&gt;|sync bridge| GitHub
2eca4eb… ragelink 968 Celery --&gt;|sync bridge| GitLab
2eca4eb… ragelink 969 Fossil --&gt; Repos
2eca4eb… ragelink 970 Litestream --&gt; Repos
2eca4eb… ragelink 971 Litestream --&gt; S3</code></pre>
2eca4eb… ragelink 972 <h2 id="components">Components<a class="headerlink" href="#components" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 973 <h3 id="fossil-server">Fossil Server<a class="headerlink" href="#fossil-server" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 974 <p>A single <code>fossil server --repolist /data/repos/</code> process serves all repositories. Each <code>.fossil</code> file is a self-contained SQLite database with VCS history, issues, wiki, and forum.</p>
2eca4eb… ragelink 975 <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>
2eca4eb… ragelink 976 <h3 id="caddy">Caddy<a class="headerlink" href="#caddy" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 977 <p>Handles SSL termination and subdomain routing:</p>
2eca4eb… ragelink 978 <ul>
2eca4eb… ragelink 979 <li><code>your-domain.com</code> routes to the Django management UI</li>
2eca4eb… ragelink 980 <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li>
2eca4eb… ragelink 981 </ul>
2eca4eb… ragelink 982 <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>
2eca4eb… ragelink 983 <h3 id="django-management-layer">Django Management Layer<a class="headerlink" href="#django-management-layer" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 984 <p>Provides the administrative interface:</p>
2eca4eb… ragelink 985 <ul>
2eca4eb… ragelink 986 <li>Repository lifecycle (create, configure, archive)</li>
2eca4eb… ragelink 987 <li>User and organization management</li>
2eca4eb… ragelink 988 <li>Dashboard and analytics</li>
2eca4eb… ragelink 989 <li>Sync bridge configuration</li>
2eca4eb… ragelink 990 </ul>
2eca4eb… ragelink 991 <p>Django uses HTMX for interactive UI without a JavaScript framework.</p>
2eca4eb… ragelink 992 <h3 id="litestream">Litestream<a class="headerlink" href="#litestream" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 993 <p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p>
2eca4eb… ragelink 994 <ul>
2eca4eb… ragelink 995 <li><strong>Continuous backup</strong> -- WAL frames replicated in near-real-time</li>
2eca4eb… ragelink 996 <li><strong>Point-in-time recovery</strong> -- restore to any moment, not just snapshots</li>
2eca4eb… ragelink 997 <li><strong>Zero-config per repo</strong> -- new <code>.fossil</code> files are picked up automatically</li>
2eca4eb… ragelink 998 </ul>
2eca4eb… ragelink 999 <h3 id="celery-workers">Celery Workers<a class="headerlink" href="#celery-workers" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 1000 <p>Handle background tasks:</p>
2eca4eb… ragelink 1001 <ul>
2eca4eb… ragelink 1002 <li>Sync bridge execution (Fossil to Git mirroring)</li>
2eca4eb… ragelink 1003 <li>Scheduled sync jobs</li>
2eca4eb… ragelink 1004 <li>Upstream pull operations</li>
2eca4eb… ragelink 1005 </ul>
2eca4eb… ragelink 1006 <h2 id="data-flow">Data Flow<a class="headerlink" href="#data-flow" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 1007 <ol>
2eca4eb… ragelink 1008 <li><strong>User pushes to Fossil</strong> -- standard <code>fossil push</code> or <code>fossil sync</code></li>
2eca4eb… ragelink 1009 <li><strong>Fossil writes to <code>.fossil</code> file</strong> -- SQLite transactions</li>
2eca4eb… ragelink 1010 <li><strong>Litestream replicates</strong> -- WAL frames streamed to S3</li>
2eca4eb… ragelink 1011 <li><strong>Sync bridge runs</strong> -- Celery task mirrors changes to Git remotes</li>
2eca4eb… ragelink 1012 <li><strong>Django reflects state</strong> -- reads from Fossil SQLite for dashboards</li>
2eca4eb… ragelink 1013 </ol>
2eca4eb… ragelink 1014 <p>Fossil is always the source of truth. Everything else is derived.</p>
2eca4eb… ragelink 1015
2eca4eb… ragelink 1016
2eca4eb… ragelink 1017
2eca4eb… ragelink 1018
2eca4eb… ragelink 1019
2eca4eb… ragelink 1020
2eca4eb… ragelink 1021
2eca4eb… ragelink 1022
2eca4eb… ragelink 1023
2eca4eb… ragelink 1024
2eca4eb… ragelink 1025
2eca4eb… ragelink 1026
2eca4eb… ragelink 1027
2eca4eb… ragelink 1028 </article>
2eca4eb… ragelink 1029 </div>
2eca4eb… ragelink 1030
2eca4eb… ragelink 1031
2eca4eb… ragelink 1032 <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
2eca4eb… ragelink 1033
2eca4eb… ragelink 1034 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
2eca4eb… ragelink 1035 </div>
2eca4eb… ragelink 1036
2eca4eb… ragelink 1037 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
2eca4eb… ragelink 1038
2eca4eb… ragelink 1039 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
2eca4eb… ragelink 1040 Back to top
2eca4eb… ragelink 1041 </button>
2eca4eb… ragelink 1042
2eca4eb… ragelink 1043 </main>
2eca4eb… ragelink 1044
2eca4eb… ragelink 1045 <footer class="md-footer">
2eca4eb… ragelink 1046
2eca4eb… ragelink 1047 <div class="md-footer-meta md-typeset">
2eca4eb… ragelink 1048 <div class="md-footer-meta__inner md-grid">
2eca4eb… ragelink 1049 <div class="md-copyright">
2eca4eb… ragelink 1050
2eca4eb… ragelink 1051 <div class="md-copyright__highlight">
2eca4eb… ragelink 1052 Copyright &copy; 2026 CONFLICT LLC
2eca4eb… ragelink 1053 </div>
2eca4eb… ragelink 1054
2eca4eb… ragelink 1055
2eca4eb… ragelink 1056 Made with
2eca4eb… ragelink 1057 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2eca4eb… ragelink 1058 Material for MkDocs
2eca4eb… ragelink 1059 </a>
2eca4eb… ragelink 1060
2eca4eb… ragelink 1061 </div>
2eca4eb… ragelink 1062
2eca4eb… ragelink 1063
2eca4eb… ragelink 1064 <div class="md-social">
2eca4eb… ragelink 1065
2eca4eb… ragelink 1066
2eca4eb… ragelink 1067
2eca4eb… ragelink 1068
2eca4eb… ragelink 1069
2eca4eb… ragelink 1070
2eca4eb… ragelink 1071
2eca4eb… ragelink 1072
2eca4eb… ragelink 1073 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
2eca4eb… ragelink 1074 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
2eca4eb… ragelink 1075 </a>
2eca4eb… ragelink 1076
2eca4eb… ragelink 1077 </div>
2eca4eb… ragelink 1078
2eca4eb… ragelink 1079 </div>
2eca4eb… ragelink 1080 </div>
2eca4eb… ragelink 1081 </footer>
2eca4eb… ragelink 1082
2eca4eb… ragelink 1083 </div>
2eca4eb… ragelink 1084 <div class="md-dialog" data-md-component="dialog">
2eca4eb… ragelink 1085 <div class="md-dialog__inner md-typeset"></div>
2eca4eb… ragelink 1086 </div>
2eca4eb… ragelink 1087
2eca4eb… ragelink 1088
2eca4eb… ragelink 1089
2eca4eb… ragelink 1090
2eca4eb… ragelink 1091
2eca4eb… ragelink 1092 <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
2eca4eb… ragelink 1093
2eca4eb… ragelink 1094
2eca4eb… ragelink 1095 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
2eca4eb… ragelink 1096
2eca4eb… ragelink 1097
2eca4eb… ragelink 1098 </body>
2eca4eb… ragelink 1099 </html>

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button