FossilRepo

Source Blame History 1077 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/sync-bridge/">
2eca4eb… ragelink 16
2eca4eb… ragelink 17
2eca4eb… ragelink 18 <link rel="prev" href="../overview/">
2eca4eb… ragelink 19
2eca4eb… ragelink 20
2eca4eb… ragelink 21
2eca4eb… ragelink 22
2eca4eb… ragelink 23
2eca4eb… ragelink 24
2eca4eb… ragelink 25 <link rel="icon" href="../../assets/images/favicon.png">
2eca4eb… ragelink 26 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
2eca4eb… ragelink 27
2eca4eb… ragelink 28
2eca4eb… ragelink 29
2eca4eb… ragelink 30 <title>Sync Bridge - Fossilrepo</title>
2eca4eb… ragelink 31
2eca4eb… ragelink 32
2eca4eb… ragelink 33
2eca4eb… ragelink 34 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
2eca4eb… ragelink 35
2eca4eb… ragelink 36
2eca4eb… ragelink 37 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
2eca4eb… ragelink 38
2eca4eb… ragelink 39
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 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
2eca4eb… ragelink 51 <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 52 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
2eca4eb… ragelink 53
2eca4eb… ragelink 54
2eca4eb… ragelink 55
2eca4eb… ragelink 56 <link rel="stylesheet" href="../../assets/css/custom.css">
2eca4eb… ragelink 57
2eca4eb… ragelink 58 <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 59
2eca4eb… ragelink 60
2eca4eb… ragelink 61
2eca4eb… ragelink 62
2eca4eb… ragelink 63
2eca4eb… ragelink 64 </head>
2eca4eb… ragelink 65
2eca4eb… ragelink 66
2eca4eb… ragelink 67
2eca4eb… ragelink 68
2eca4eb… ragelink 69
2eca4eb… ragelink 70
2eca4eb… ragelink 71
2eca4eb… ragelink 72
2eca4eb… ragelink 73
2eca4eb… ragelink 74 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
2eca4eb… ragelink 75
2eca4eb… ragelink 76
2eca4eb… ragelink 77 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
2eca4eb… ragelink 78 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
2eca4eb… ragelink 79 <label class="md-overlay" for="__drawer"></label>
2eca4eb… ragelink 80 <div data-md-component="skip">
2eca4eb… ragelink 81
2eca4eb… ragelink 82
2eca4eb… ragelink 83 <a href="#sync-bridge" class="md-skip">
2eca4eb… ragelink 84 Skip to content
2eca4eb… ragelink 85 </a>
2eca4eb… ragelink 86
2eca4eb… ragelink 87 </div>
2eca4eb… ragelink 88 <div data-md-component="announce">
2eca4eb… ragelink 89
2eca4eb… ragelink 90 </div>
2eca4eb… ragelink 91
2eca4eb… ragelink 92
2eca4eb… ragelink 93
2eca4eb… ragelink 94
2eca4eb… ragelink 95 <header class="md-header" data-md-component="header">
2eca4eb… ragelink 96 <nav class="md-header__inner md-grid" aria-label="Header">
2eca4eb… ragelink 97 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
2eca4eb… ragelink 98 <div style="display: flex; align-items: center; gap: 0.6rem;">
2eca4eb… ragelink 99 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
2eca4eb… ragelink 100 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
2eca4eb… ragelink 101 </div>
2eca4eb… ragelink 102 </a>
2eca4eb… ragelink 103 <label class="md-header__button md-icon" for="__drawer">
2eca4eb… ragelink 104
2eca4eb… ragelink 105 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
2eca4eb… ragelink 106 </label>
2eca4eb… ragelink 107 <div class="md-header__title" data-md-component="header-title">
2eca4eb… ragelink 108 <div class="md-header__ellipsis">
2eca4eb… ragelink 109 <div class="md-header__topic">
2eca4eb… ragelink 110 <span class="md-ellipsis">
2eca4eb… ragelink 111 Fossilrepo
2eca4eb… ragelink 112 </span>
2eca4eb… ragelink 113 </div>
2eca4eb… ragelink 114 <div class="md-header__topic" data-md-component="header-topic">
2eca4eb… ragelink 115 <span class="md-ellipsis">
2eca4eb… ragelink 116
2eca4eb… ragelink 117 Sync Bridge
2eca4eb… ragelink 118
2eca4eb… ragelink 119 </span>
2eca4eb… ragelink 120 </div>
2eca4eb… ragelink 121 </div>
2eca4eb… ragelink 122 </div>
2eca4eb… ragelink 123
2eca4eb… ragelink 124
2eca4eb… ragelink 125 <form class="md-header__option" data-md-component="palette">
2eca4eb… ragelink 126
2eca4eb… ragelink 127
2eca4eb… ragelink 128
2eca4eb… ragelink 129
2eca4eb… ragelink 130 <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 131
2eca4eb… ragelink 132 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
2eca4eb… ragelink 133 <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 134 </label>
2eca4eb… ragelink 135
2eca4eb… ragelink 136
2eca4eb… ragelink 137
2eca4eb… ragelink 138
2eca4eb… ragelink 139
2eca4eb… ragelink 140 <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 141
2eca4eb… ragelink 142 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
2eca4eb… ragelink 143 <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 144 </label>
2eca4eb… ragelink 145
2eca4eb… ragelink 146
2eca4eb… ragelink 147 </form>
2eca4eb… ragelink 148
2eca4eb… ragelink 149
2eca4eb… ragelink 150
2eca4eb… ragelink 151 <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 152
2eca4eb… ragelink 153
2eca4eb… ragelink 154
2eca4eb… ragelink 155
2eca4eb… ragelink 156
2eca4eb… ragelink 157 <label class="md-header__button md-icon" for="__search">
2eca4eb… ragelink 158
2eca4eb… ragelink 159 <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 160 </label>
2eca4eb… ragelink 161 <div class="md-search" data-md-component="search" role="dialog">
2eca4eb… ragelink 162 <label class="md-search__overlay" for="__search"></label>
2eca4eb… ragelink 163 <div class="md-search__inner" role="search">
2eca4eb… ragelink 164 <form class="md-search__form" name="search">
2eca4eb… ragelink 165 <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 166 <label class="md-search__icon md-icon" for="__search">
2eca4eb… ragelink 167
2eca4eb… ragelink 168 <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 169
2eca4eb… ragelink 170 <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 171 </label>
2eca4eb… ragelink 172 <nav class="md-search__options" aria-label="Search">
2eca4eb… ragelink 173
2eca4eb… ragelink 174 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
2eca4eb… ragelink 175
2eca4eb… ragelink 176 <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 177 </button>
2eca4eb… ragelink 178 </nav>
2eca4eb… ragelink 179
2eca4eb… ragelink 180 <div class="md-search__suggest" data-md-component="search-suggest"></div>
2eca4eb… ragelink 181
2eca4eb… ragelink 182 </form>
2eca4eb… ragelink 183 <div class="md-search__output">
2eca4eb… ragelink 184 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
2eca4eb… ragelink 185 <div class="md-search-result" data-md-component="search-result">
2eca4eb… ragelink 186 <div class="md-search-result__meta">
2eca4eb… ragelink 187 Initializing search
2eca4eb… ragelink 188 </div>
2eca4eb… ragelink 189 <ol class="md-search-result__list" role="presentation"></ol>
2eca4eb… ragelink 190 </div>
2eca4eb… ragelink 191 </div>
2eca4eb… ragelink 192 </div>
2eca4eb… ragelink 193 </div>
2eca4eb… ragelink 194 </div>
2eca4eb… ragelink 195
2eca4eb… ragelink 196
2eca4eb… ragelink 197
2eca4eb… ragelink 198 <div class="md-header__source">
2eca4eb… ragelink 199 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
2eca4eb… ragelink 200 <div class="md-source__icon md-icon">
2eca4eb… ragelink 201
2eca4eb… ragelink 202 <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 203 </div>
2eca4eb… ragelink 204 <div class="md-source__repository">
2eca4eb… ragelink 205 ConflictHQ/fossilrepo
2eca4eb… ragelink 206 </div>
2eca4eb… ragelink 207 </a>
2eca4eb… ragelink 208 </div>
2eca4eb… ragelink 209
2eca4eb… ragelink 210 </nav>
2eca4eb… ragelink 211
2eca4eb… ragelink 212 </header>
2eca4eb… ragelink 213
2eca4eb… ragelink 214 <div class="md-container" data-md-component="container">
2eca4eb… ragelink 215
2eca4eb… ragelink 216
2eca4eb… ragelink 217
2eca4eb… ragelink 218
2eca4eb… ragelink 219
2eca4eb… ragelink 220 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
2eca4eb… ragelink 221 <div class="md-grid">
2eca4eb… ragelink 222 <ul class="md-tabs__list">
2eca4eb… ragelink 223
2eca4eb… ragelink 224
2eca4eb… ragelink 225
2eca4eb… ragelink 226
2eca4eb… ragelink 227
2eca4eb… ragelink 228
2eca4eb… ragelink 229 <li class="md-tabs__item">
2eca4eb… ragelink 230 <a href="../.." class="md-tabs__link">
2eca4eb… ragelink 231
2eca4eb… ragelink 232
2eca4eb… ragelink 233
2eca4eb… ragelink 234
2eca4eb… ragelink 235
2eca4eb… ragelink 236 Home
2eca4eb… ragelink 237
2eca4eb… ragelink 238 </a>
2eca4eb… ragelink 239 </li>
2eca4eb… ragelink 240
2eca4eb… ragelink 241
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 <li class="md-tabs__item">
2eca4eb… ragelink 251 <a href="../../getting-started/prerequisites/" class="md-tabs__link">
2eca4eb… ragelink 252
2eca4eb… ragelink 253
2eca4eb… ragelink 254
2eca4eb… ragelink 255 Getting Started
2eca4eb… ragelink 256
2eca4eb… ragelink 257 </a>
2eca4eb… ragelink 258 </li>
2eca4eb… ragelink 259
2eca4eb… ragelink 260
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 <li class="md-tabs__item md-tabs__item--active">
2eca4eb… ragelink 273 <a href="../overview/" class="md-tabs__link">
2eca4eb… ragelink 274
2eca4eb… ragelink 275
2eca4eb… ragelink 276
2eca4eb… ragelink 277 Architecture
2eca4eb… ragelink 278
2eca4eb… ragelink 279 </a>
2eca4eb… ragelink 280 </li>
2eca4eb… ragelink 281
2eca4eb… ragelink 282
2eca4eb… ragelink 283
2eca4eb… ragelink 284
2eca4eb… ragelink 285 </ul>
2eca4eb… ragelink 286 </div>
2eca4eb… ragelink 287 </nav>
2eca4eb… ragelink 288
2eca4eb… ragelink 289
2eca4eb… ragelink 290
2eca4eb… ragelink 291 <main class="md-main" data-md-component="main">
2eca4eb… ragelink 292 <div class="md-main__inner md-grid">
2eca4eb… ragelink 293
2eca4eb… ragelink 294
2eca4eb… ragelink 295
2eca4eb… ragelink 296 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
2eca4eb… ragelink 297 <div class="md-sidebar__scrollwrap">
2eca4eb… ragelink 298 <div class="md-sidebar__inner">
2eca4eb… ragelink 299
2eca4eb… ragelink 300
2eca4eb… ragelink 301
2eca4eb… ragelink 302
2eca4eb… ragelink 303
2eca4eb… ragelink 304
2eca4eb… ragelink 305 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
2eca4eb… ragelink 306 <label class="md-nav__title" for="__drawer">
2eca4eb… ragelink 307 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
2eca4eb… ragelink 308 <div style="display: flex; align-items: center; gap: 0.6rem;">
2eca4eb… ragelink 309 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
2eca4eb… ragelink 310 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
2eca4eb… ragelink 311 </div>
2eca4eb… ragelink 312 </a>
2eca4eb… ragelink 313 Fossilrepo
2eca4eb… ragelink 314 </label>
2eca4eb… ragelink 315
2eca4eb… ragelink 316 <div class="md-nav__source">
2eca4eb… ragelink 317 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
2eca4eb… ragelink 318 <div class="md-source__icon md-icon">
2eca4eb… ragelink 319
2eca4eb… ragelink 320 <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 321 </div>
2eca4eb… ragelink 322 <div class="md-source__repository">
2eca4eb… ragelink 323 ConflictHQ/fossilrepo
2eca4eb… ragelink 324 </div>
2eca4eb… ragelink 325 </a>
2eca4eb… ragelink 326 </div>
2eca4eb… ragelink 327
2eca4eb… ragelink 328 <ul class="md-nav__list" data-md-scrollfix>
2eca4eb… ragelink 329
2eca4eb… ragelink 330
2eca4eb… ragelink 331
2eca4eb… ragelink 332
2eca4eb… ragelink 333
2eca4eb… ragelink 334
2eca4eb… ragelink 335
2eca4eb… ragelink 336 <li class="md-nav__item">
2eca4eb… ragelink 337 <a href="../.." class="md-nav__link">
2eca4eb… ragelink 338
2eca4eb… ragelink 339
2eca4eb… ragelink 340
2eca4eb… ragelink 341 <span class="md-ellipsis">
2eca4eb… ragelink 342
2eca4eb… ragelink 343
2eca4eb… ragelink 344 Home
2eca4eb… ragelink 345
2eca4eb… ragelink 346
2eca4eb… ragelink 347
2eca4eb… ragelink 348 </span>
2eca4eb… ragelink 349
2eca4eb… ragelink 350
2eca4eb… ragelink 351
2eca4eb… ragelink 352 </a>
2eca4eb… ragelink 353 </li>
2eca4eb… ragelink 354
2eca4eb… ragelink 355
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 <li class="md-nav__item md-nav__item--nested">
2eca4eb… ragelink 374
2eca4eb… ragelink 375
2eca4eb… ragelink 376
2eca4eb… ragelink 377
2eca4eb… ragelink 378
2eca4eb… ragelink 379 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
2eca4eb… ragelink 380
2eca4eb… ragelink 381
2eca4eb… ragelink 382 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
2eca4eb… ragelink 383
2eca4eb… ragelink 384
2eca4eb… ragelink 385
2eca4eb… ragelink 386 <span class="md-ellipsis">
2eca4eb… ragelink 387
2eca4eb… ragelink 388
2eca4eb… ragelink 389 Getting Started
2eca4eb… ragelink 390
2eca4eb… ragelink 391
2eca4eb… ragelink 392
2eca4eb… ragelink 393 </span>
2eca4eb… ragelink 394
2eca4eb… ragelink 395
2eca4eb… ragelink 396
2eca4eb… ragelink 397 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 398 </label>
2eca4eb… ragelink 399
2eca4eb… ragelink 400 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
2eca4eb… ragelink 401 <label class="md-nav__title" for="__nav_2">
2eca4eb… ragelink 402 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 403
2eca4eb… ragelink 404
2eca4eb… ragelink 405 Getting Started
2eca4eb… ragelink 406
2eca4eb… ragelink 407
2eca4eb… ragelink 408 </label>
2eca4eb… ragelink 409 <ul class="md-nav__list" data-md-scrollfix>
2eca4eb… ragelink 410
2eca4eb… ragelink 411
2eca4eb… ragelink 412
2eca4eb… ragelink 413
2eca4eb… ragelink 414
2eca4eb… ragelink 415
2eca4eb… ragelink 416
2eca4eb… ragelink 417 <li class="md-nav__item">
2eca4eb… ragelink 418 <a href="../../getting-started/prerequisites/" class="md-nav__link">
2eca4eb… ragelink 419
2eca4eb… ragelink 420
2eca4eb… ragelink 421
2eca4eb… ragelink 422 <span class="md-ellipsis">
2eca4eb… ragelink 423
2eca4eb… ragelink 424
2eca4eb… ragelink 425 Prerequisites
2eca4eb… ragelink 426
2eca4eb… ragelink 427
2eca4eb… ragelink 428
2eca4eb… ragelink 429 </span>
2eca4eb… ragelink 430
2eca4eb… ragelink 431
2eca4eb… ragelink 432
2eca4eb… ragelink 433 </a>
2eca4eb… ragelink 434 </li>
2eca4eb… ragelink 435
2eca4eb… ragelink 436
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 <li class="md-nav__item">
2eca4eb… ragelink 446 <a href="../../getting-started/installation/" class="md-nav__link">
2eca4eb… ragelink 447
2eca4eb… ragelink 448
2eca4eb… ragelink 449
2eca4eb… ragelink 450 <span class="md-ellipsis">
2eca4eb… ragelink 451
2eca4eb… ragelink 452
2eca4eb… ragelink 453 Installation
2eca4eb… ragelink 454
2eca4eb… ragelink 455
2eca4eb… ragelink 456
2eca4eb… ragelink 457 </span>
2eca4eb… ragelink 458
2eca4eb… ragelink 459
2eca4eb… ragelink 460
2eca4eb… ragelink 461 </a>
2eca4eb… ragelink 462 </li>
2eca4eb… ragelink 463
2eca4eb… ragelink 464
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 <li class="md-nav__item">
2eca4eb… ragelink 474 <a href="../../getting-started/configuration/" class="md-nav__link">
2eca4eb… ragelink 475
2eca4eb… ragelink 476
2eca4eb… ragelink 477
2eca4eb… ragelink 478 <span class="md-ellipsis">
2eca4eb… ragelink 479
2eca4eb… ragelink 480
2eca4eb… ragelink 481 Configuration
2eca4eb… ragelink 482
2eca4eb… ragelink 483
2eca4eb… ragelink 484
2eca4eb… ragelink 485 </span>
2eca4eb… ragelink 486
2eca4eb… ragelink 487
2eca4eb… ragelink 488
2eca4eb… ragelink 489 </a>
2eca4eb… ragelink 490 </li>
2eca4eb… ragelink 491
2eca4eb… ragelink 492
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 <li class="md-nav__item">
2eca4eb… ragelink 502 <a href="../../getting-started/first-repo/" class="md-nav__link">
2eca4eb… ragelink 503
2eca4eb… ragelink 504
2eca4eb… ragelink 505
2eca4eb… ragelink 506 <span class="md-ellipsis">
2eca4eb… ragelink 507
2eca4eb… ragelink 508
2eca4eb… ragelink 509 First Repository
2eca4eb… ragelink 510
2eca4eb… ragelink 511
2eca4eb… ragelink 512
2eca4eb… ragelink 513 </span>
2eca4eb… ragelink 514
2eca4eb… ragelink 515
2eca4eb… ragelink 516
2eca4eb… ragelink 517 </a>
2eca4eb… ragelink 518 </li>
2eca4eb… ragelink 519
2eca4eb… ragelink 520
2eca4eb… ragelink 521
2eca4eb… ragelink 522
2eca4eb… ragelink 523 </ul>
2eca4eb… ragelink 524 </nav>
2eca4eb… ragelink 525
2eca4eb… ragelink 526 </li>
2eca4eb… ragelink 527
2eca4eb… ragelink 528
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 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
2eca4eb… ragelink 552
2eca4eb… ragelink 553
2eca4eb… ragelink 554
2eca4eb… ragelink 555 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
2eca4eb… ragelink 556
2eca4eb… ragelink 557
2eca4eb… ragelink 558 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
2eca4eb… ragelink 559
2eca4eb… ragelink 560
2eca4eb… ragelink 561
2eca4eb… ragelink 562 <span class="md-ellipsis">
2eca4eb… ragelink 563
2eca4eb… ragelink 564
2eca4eb… ragelink 565 Architecture
2eca4eb… ragelink 566
2eca4eb… ragelink 567
2eca4eb… ragelink 568
2eca4eb… ragelink 569 </span>
2eca4eb… ragelink 570
2eca4eb… ragelink 571
2eca4eb… ragelink 572
2eca4eb… ragelink 573 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 574 </label>
2eca4eb… ragelink 575
2eca4eb… ragelink 576 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
2eca4eb… ragelink 577 <label class="md-nav__title" for="__nav_3">
2eca4eb… ragelink 578 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 579
2eca4eb… ragelink 580
2eca4eb… ragelink 581 Architecture
2eca4eb… ragelink 582
2eca4eb… ragelink 583
2eca4eb… ragelink 584 </label>
2eca4eb… ragelink 585 <ul class="md-nav__list" data-md-scrollfix>
2eca4eb… ragelink 586
2eca4eb… ragelink 587
2eca4eb… ragelink 588
2eca4eb… ragelink 589
2eca4eb… ragelink 590
2eca4eb… ragelink 591
2eca4eb… ragelink 592
2eca4eb… ragelink 593 <li class="md-nav__item">
2eca4eb… ragelink 594 <a href="../overview/" class="md-nav__link">
2eca4eb… ragelink 595
2eca4eb… ragelink 596
2eca4eb… ragelink 597
2eca4eb… ragelink 598 <span class="md-ellipsis">
2eca4eb… ragelink 599
2eca4eb… ragelink 600
2eca4eb… ragelink 601 Overview
2eca4eb… ragelink 602
2eca4eb… ragelink 603
2eca4eb… ragelink 604
2eca4eb… ragelink 605 </span>
2eca4eb… ragelink 606
2eca4eb… ragelink 607
2eca4eb… ragelink 608
2eca4eb… ragelink 609 </a>
2eca4eb… ragelink 610 </li>
2eca4eb… ragelink 611
2eca4eb… ragelink 612
2eca4eb… ragelink 613
2eca4eb… ragelink 614
2eca4eb… ragelink 615
2eca4eb… ragelink 616
2eca4eb… ragelink 617
2eca4eb… ragelink 618
2eca4eb… ragelink 619
2eca4eb… ragelink 620
2eca4eb… ragelink 621
2eca4eb… ragelink 622
2eca4eb… ragelink 623 <li class="md-nav__item md-nav__item--active">
2eca4eb… ragelink 624
2eca4eb… ragelink 625 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
2eca4eb… ragelink 626
2eca4eb… ragelink 627
2eca4eb… ragelink 628
2eca4eb… ragelink 629
2eca4eb… ragelink 630
2eca4eb… ragelink 631 <label class="md-nav__link md-nav__link--active" for="__toc">
2eca4eb… ragelink 632
2eca4eb… ragelink 633
2eca4eb… ragelink 634
2eca4eb… ragelink 635 <span class="md-ellipsis">
2eca4eb… ragelink 636
2eca4eb… ragelink 637
2eca4eb… ragelink 638 Sync Bridge
2eca4eb… ragelink 639
2eca4eb… ragelink 640
2eca4eb… ragelink 641
2eca4eb… ragelink 642 </span>
2eca4eb… ragelink 643
2eca4eb… ragelink 644
2eca4eb… ragelink 645
2eca4eb… ragelink 646 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 647 </label>
2eca4eb… ragelink 648
2eca4eb… ragelink 649 <a href="./" class="md-nav__link md-nav__link--active">
2eca4eb… ragelink 650
2eca4eb… ragelink 651
2eca4eb… ragelink 652
2eca4eb… ragelink 653 <span class="md-ellipsis">
2eca4eb… ragelink 654
2eca4eb… ragelink 655
2eca4eb… ragelink 656 Sync Bridge
2eca4eb… ragelink 657
2eca4eb… ragelink 658
2eca4eb… ragelink 659
2eca4eb… ragelink 660 </span>
2eca4eb… ragelink 661
2eca4eb… ragelink 662
2eca4eb… ragelink 663
2eca4eb… ragelink 664 </a>
2eca4eb… ragelink 665
2eca4eb… ragelink 666
2eca4eb… ragelink 667
2eca4eb… ragelink 668 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2eca4eb… ragelink 669
2eca4eb… ragelink 670
2eca4eb… ragelink 671
2eca4eb… ragelink 672
2eca4eb… ragelink 673
2eca4eb… ragelink 674
2eca4eb… ragelink 675 <label class="md-nav__title" for="__toc">
2eca4eb… ragelink 676 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 677 Table of contents
2eca4eb… ragelink 678 </label>
2eca4eb… ragelink 679 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2eca4eb… ragelink 680
2eca4eb… ragelink 681 <li class="md-nav__item">
2eca4eb… ragelink 682 <a href="#how-it-works" class="md-nav__link">
2eca4eb… ragelink 683 <span class="md-ellipsis">
2eca4eb… ragelink 684
2eca4eb… ragelink 685 How It Works
2eca4eb… ragelink 686
2eca4eb… ragelink 687 </span>
2eca4eb… ragelink 688 </a>
2eca4eb… ragelink 689
2eca4eb… ragelink 690 </li>
2eca4eb… ragelink 691
2eca4eb… ragelink 692 <li class="md-nav__item">
2eca4eb… ragelink 693 <a href="#what-gets-synced" class="md-nav__link">
2eca4eb… ragelink 694 <span class="md-ellipsis">
2eca4eb… ragelink 695
2eca4eb… ragelink 696 What Gets Synced
2eca4eb… ragelink 697
2eca4eb… ragelink 698 </span>
2eca4eb… ragelink 699 </a>
2eca4eb… ragelink 700
2eca4eb… ragelink 701 </li>
2eca4eb… ragelink 702
2eca4eb… ragelink 703 <li class="md-nav__item">
2eca4eb… ragelink 704 <a href="#configuration" class="md-nav__link">
2eca4eb… ragelink 705 <span class="md-ellipsis">
2eca4eb… ragelink 706
2eca4eb… ragelink 707 Configuration
2eca4eb… ragelink 708
2eca4eb… ragelink 709 </span>
2eca4eb… ragelink 710 </a>
2eca4eb… ragelink 711
2eca4eb… ragelink 712 </li>
2eca4eb… ragelink 713
2eca4eb… ragelink 714 <li class="md-nav__item">
2eca4eb… ragelink 715 <a href="#sync-modes" class="md-nav__link">
2eca4eb… ragelink 716 <span class="md-ellipsis">
2eca4eb… ragelink 717
2eca4eb… ragelink 718 Sync Modes
2eca4eb… ragelink 719
2eca4eb… ragelink 720 </span>
2eca4eb… ragelink 721 </a>
2eca4eb… ragelink 722
2eca4eb… ragelink 723 <nav class="md-nav" aria-label="Sync Modes">
2eca4eb… ragelink 724 <ul class="md-nav__list">
2eca4eb… ragelink 725
2eca4eb… ragelink 726 <li class="md-nav__item">
2eca4eb… ragelink 727 <a href="#on-demand" class="md-nav__link">
2eca4eb… ragelink 728 <span class="md-ellipsis">
2eca4eb… ragelink 729
2eca4eb… ragelink 730 On-Demand
2eca4eb… ragelink 731
2eca4eb… ragelink 732 </span>
2eca4eb… ragelink 733 </a>
2eca4eb… ragelink 734
2eca4eb… ragelink 735 </li>
2eca4eb… ragelink 736
2eca4eb… ragelink 737 <li class="md-nav__item">
2eca4eb… ragelink 738 <a href="#scheduled" class="md-nav__link">
2eca4eb… ragelink 739 <span class="md-ellipsis">
2eca4eb… ragelink 740
2eca4eb… ragelink 741 Scheduled
2eca4eb… ragelink 742
2eca4eb… ragelink 743 </span>
2eca4eb… ragelink 744 </a>
2eca4eb… ragelink 745
2eca4eb… ragelink 746 </li>
2eca4eb… ragelink 747
2eca4eb… ragelink 748 <li class="md-nav__item">
2eca4eb… ragelink 749 <a href="#upstream-pull" class="md-nav__link">
2eca4eb… ragelink 750 <span class="md-ellipsis">
2eca4eb… ragelink 751
2eca4eb… ragelink 752 Upstream Pull
2eca4eb… ragelink 753
2eca4eb… ragelink 754 </span>
2eca4eb… ragelink 755 </a>
2eca4eb… ragelink 756
2eca4eb… ragelink 757 </li>
2eca4eb… ragelink 758
2eca4eb… ragelink 759 </ul>
2eca4eb… ragelink 760 </nav>
2eca4eb… ragelink 761
2eca4eb… ragelink 762 </li>
2eca4eb… ragelink 763
2eca4eb… ragelink 764 </ul>
2eca4eb… ragelink 765
2eca4eb… ragelink 766 </nav>
2eca4eb… ragelink 767
2eca4eb… ragelink 768 </li>
2eca4eb… ragelink 769
2eca4eb… ragelink 770
2eca4eb… ragelink 771
2eca4eb… ragelink 772
2eca4eb… ragelink 773 </ul>
2eca4eb… ragelink 774 </nav>
2eca4eb… ragelink 775
2eca4eb… ragelink 776 </li>
2eca4eb… ragelink 777
2eca4eb… ragelink 778
2eca4eb… ragelink 779
2eca4eb… ragelink 780 </ul>
2eca4eb… ragelink 781 </nav>
2eca4eb… ragelink 782 </div>
2eca4eb… ragelink 783 </div>
2eca4eb… ragelink 784 </div>
2eca4eb… ragelink 785
2eca4eb… ragelink 786
2eca4eb… ragelink 787
2eca4eb… ragelink 788 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2eca4eb… ragelink 789 <div class="md-sidebar__scrollwrap">
2eca4eb… ragelink 790 <div class="md-sidebar__inner">
2eca4eb… ragelink 791
2eca4eb… ragelink 792
2eca4eb… ragelink 793 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2eca4eb… ragelink 794
2eca4eb… ragelink 795
2eca4eb… ragelink 796
2eca4eb… ragelink 797
2eca4eb… ragelink 798
2eca4eb… ragelink 799
2eca4eb… ragelink 800 <label class="md-nav__title" for="__toc">
2eca4eb… ragelink 801 <span class="md-nav__icon md-icon"></span>
2eca4eb… ragelink 802 Table of contents
2eca4eb… ragelink 803 </label>
2eca4eb… ragelink 804 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2eca4eb… ragelink 805
2eca4eb… ragelink 806 <li class="md-nav__item">
2eca4eb… ragelink 807 <a href="#how-it-works" class="md-nav__link">
2eca4eb… ragelink 808 <span class="md-ellipsis">
2eca4eb… ragelink 809
2eca4eb… ragelink 810 How It Works
2eca4eb… ragelink 811
2eca4eb… ragelink 812 </span>
2eca4eb… ragelink 813 </a>
2eca4eb… ragelink 814
2eca4eb… ragelink 815 </li>
2eca4eb… ragelink 816
2eca4eb… ragelink 817 <li class="md-nav__item">
2eca4eb… ragelink 818 <a href="#what-gets-synced" class="md-nav__link">
2eca4eb… ragelink 819 <span class="md-ellipsis">
2eca4eb… ragelink 820
2eca4eb… ragelink 821 What Gets Synced
2eca4eb… ragelink 822
2eca4eb… ragelink 823 </span>
2eca4eb… ragelink 824 </a>
2eca4eb… ragelink 825
2eca4eb… ragelink 826 </li>
2eca4eb… ragelink 827
2eca4eb… ragelink 828 <li class="md-nav__item">
2eca4eb… ragelink 829 <a href="#configuration" class="md-nav__link">
2eca4eb… ragelink 830 <span class="md-ellipsis">
2eca4eb… ragelink 831
2eca4eb… ragelink 832 Configuration
2eca4eb… ragelink 833
2eca4eb… ragelink 834 </span>
2eca4eb… ragelink 835 </a>
2eca4eb… ragelink 836
2eca4eb… ragelink 837 </li>
2eca4eb… ragelink 838
2eca4eb… ragelink 839 <li class="md-nav__item">
2eca4eb… ragelink 840 <a href="#sync-modes" class="md-nav__link">
2eca4eb… ragelink 841 <span class="md-ellipsis">
2eca4eb… ragelink 842
2eca4eb… ragelink 843 Sync Modes
2eca4eb… ragelink 844
2eca4eb… ragelink 845 </span>
2eca4eb… ragelink 846 </a>
2eca4eb… ragelink 847
2eca4eb… ragelink 848 <nav class="md-nav" aria-label="Sync Modes">
2eca4eb… ragelink 849 <ul class="md-nav__list">
2eca4eb… ragelink 850
2eca4eb… ragelink 851 <li class="md-nav__item">
2eca4eb… ragelink 852 <a href="#on-demand" class="md-nav__link">
2eca4eb… ragelink 853 <span class="md-ellipsis">
2eca4eb… ragelink 854
2eca4eb… ragelink 855 On-Demand
2eca4eb… ragelink 856
2eca4eb… ragelink 857 </span>
2eca4eb… ragelink 858 </a>
2eca4eb… ragelink 859
2eca4eb… ragelink 860 </li>
2eca4eb… ragelink 861
2eca4eb… ragelink 862 <li class="md-nav__item">
2eca4eb… ragelink 863 <a href="#scheduled" class="md-nav__link">
2eca4eb… ragelink 864 <span class="md-ellipsis">
2eca4eb… ragelink 865
2eca4eb… ragelink 866 Scheduled
2eca4eb… ragelink 867
2eca4eb… ragelink 868 </span>
2eca4eb… ragelink 869 </a>
2eca4eb… ragelink 870
2eca4eb… ragelink 871 </li>
2eca4eb… ragelink 872
2eca4eb… ragelink 873 <li class="md-nav__item">
2eca4eb… ragelink 874 <a href="#upstream-pull" class="md-nav__link">
2eca4eb… ragelink 875 <span class="md-ellipsis">
2eca4eb… ragelink 876
2eca4eb… ragelink 877 Upstream Pull
2eca4eb… ragelink 878
2eca4eb… ragelink 879 </span>
2eca4eb… ragelink 880 </a>
2eca4eb… ragelink 881
2eca4eb… ragelink 882 </li>
2eca4eb… ragelink 883
2eca4eb… ragelink 884 </ul>
2eca4eb… ragelink 885 </nav>
2eca4eb… ragelink 886
2eca4eb… ragelink 887 </li>
2eca4eb… ragelink 888
2eca4eb… ragelink 889 </ul>
2eca4eb… ragelink 890
2eca4eb… ragelink 891 </nav>
2eca4eb… ragelink 892 </div>
2eca4eb… ragelink 893 </div>
2eca4eb… ragelink 894 </div>
2eca4eb… ragelink 895
2eca4eb… ragelink 896
2eca4eb… ragelink 897
2eca4eb… ragelink 898 <div class="md-content" data-md-component="content">
2eca4eb… ragelink 899
2eca4eb… ragelink 900 <article class="md-content__inner md-typeset">
2eca4eb… ragelink 901
2eca4eb… ragelink 902
2eca4eb… ragelink 903
2eca4eb… ragelink 904
2eca4eb… ragelink 905
2eca4eb… ragelink 906
2eca4eb… ragelink 907
2eca4eb… ragelink 908
2eca4eb… ragelink 909 <h1 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">&para;</a></h1>
2eca4eb… ragelink 910 <p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>
2eca4eb… ragelink 911 <h2 id="how-it-works">How It Works<a class="headerlink" href="#how-it-works" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 912 <pre class="mermaid"><code>flowchart LR
2eca4eb… ragelink 913 Fossil["Fossil Repo&lt;br/&gt;(source of truth)"] --&gt; Bridge["Sync Bridge&lt;br/&gt;(Celery task)"]
2eca4eb… ragelink 914 Bridge --&gt; Git["Git Export"]
2eca4eb… ragelink 915 Git --&gt; GitHub["GitHub Mirror"]
2eca4eb… ragelink 916 Git --&gt; GitLab["GitLab Mirror"]</code></pre>
2eca4eb… ragelink 917 <p>The bridge:</p>
2eca4eb… ragelink 918 <ol>
2eca4eb… ragelink 919 <li>Exports Fossil commits as Git commits</li>
2eca4eb… ragelink 920 <li>Pushes to configured Git remotes</li>
2eca4eb… ragelink 921 <li>Optionally syncs tickets to GitHub/GitLab Issues</li>
2eca4eb… ragelink 922 <li>Optionally syncs wiki pages to repo docs</li>
2eca4eb… ragelink 923 </ol>
2eca4eb… ragelink 924 <h2 id="what-gets-synced">What Gets Synced<a class="headerlink" href="#what-gets-synced" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 925 <table>
2eca4eb… ragelink 926 <thead>
2eca4eb… ragelink 927 <tr>
2eca4eb… ragelink 928 <th>Fossil Artifact</th>
2eca4eb… ragelink 929 <th>Git Target</th>
2eca4eb… ragelink 930 <th>Configurable</th>
2eca4eb… ragelink 931 </tr>
2eca4eb… ragelink 932 </thead>
2eca4eb… ragelink 933 <tbody>
2eca4eb… ragelink 934 <tr>
2eca4eb… ragelink 935 <td>Commits</td>
2eca4eb… ragelink 936 <td>Git commits</td>
2eca4eb… ragelink 937 <td>Always</td>
2eca4eb… ragelink 938 </tr>
2eca4eb… ragelink 939 <tr>
2eca4eb… ragelink 940 <td>Tags</td>
2eca4eb… ragelink 941 <td>Git tags</td>
2eca4eb… ragelink 942 <td>Always</td>
2eca4eb… ragelink 943 </tr>
2eca4eb… ragelink 944 <tr>
2eca4eb… ragelink 945 <td>Branches</td>
2eca4eb… ragelink 946 <td>Git branches</td>
2eca4eb… ragelink 947 <td>Always</td>
2eca4eb… ragelink 948 </tr>
2eca4eb… ragelink 949 <tr>
2eca4eb… ragelink 950 <td>Tickets</td>
2eca4eb… ragelink 951 <td>GitHub/GitLab Issues</td>
2eca4eb… ragelink 952 <td>Optional</td>
2eca4eb… ragelink 953 </tr>
2eca4eb… ragelink 954 <tr>
2eca4eb… ragelink 955 <td>Wiki</td>
2eca4eb… ragelink 956 <td>Repository docs</td>
2eca4eb… ragelink 957 <td>Optional</td>
2eca4eb… ragelink 958 </tr>
2eca4eb… ragelink 959 </tbody>
2eca4eb… ragelink 960 </table>
2eca4eb… ragelink 961 <h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 962 <p>Set up mirroring through the Django management UI or environment variables:</p>
2eca4eb… ragelink 963 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># GitHub mirror</span>
2eca4eb… ragelink 964 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nv">GITHUB_TOKEN</span><span class="o">=</span>ghp_xxxxxxxxxxxx
2eca4eb… ragelink 965 <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
2eca4eb… ragelink 966 <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># GitLab mirror</span>
2eca4eb… ragelink 967 <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="nv">GITLAB_TOKEN</span><span class="o">=</span>glpat-xxxxxxxxxxxx
2eca4eb… ragelink 968 </code></pre></div>
2eca4eb… ragelink 969 <p>Per-repository mirror configuration is managed in the dashboard under <strong>Repository Settings &gt; Sync</strong>.</p>
2eca4eb… ragelink 970 <h2 id="sync-modes">Sync Modes<a class="headerlink" href="#sync-modes" title="Permanent link">&para;</a></h2>
2eca4eb… ragelink 971 <h3 id="on-demand">On-Demand<a class="headerlink" href="#on-demand" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 972 <p>Trigger a sync manually from the dashboard or CLI:</p>
2eca4eb… ragelink 973 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_sync<span class="w"> </span>my-project
2eca4eb… ragelink 974 </code></pre></div>
2eca4eb… ragelink 975 <h3 id="scheduled">Scheduled<a class="headerlink" href="#scheduled" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 976 <p>Configure a Celery Beat schedule to sync at regular intervals:</p>
2eca4eb… ragelink 977 <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Runs every 15 minutes</span>
2eca4eb… ragelink 978 <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="n">CELERY_BEAT_SCHEDULE</span> <span class="o">=</span> <span class="p">{</span>
2eca4eb… ragelink 979 <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="s1">&#39;sync-all-repos&#39;</span><span class="p">:</span> <span class="p">{</span>
2eca4eb… ragelink 980 <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="s1">&#39;task&#39;</span><span class="p">:</span> <span class="s1">&#39;fossil.tasks.sync_all&#39;</span><span class="p">,</span>
2eca4eb… ragelink 981 <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="s1">&#39;schedule&#39;</span><span class="p">:</span> <span class="mf">900.0</span><span class="p">,</span>
2eca4eb… ragelink 982 <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="p">},</span>
2eca4eb… ragelink 983 <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="p">}</span>
2eca4eb… ragelink 984 </code></pre></div>
2eca4eb… ragelink 985 <h3 id="upstream-pull">Upstream Pull<a class="headerlink" href="#upstream-pull" title="Permanent link">&para;</a></h3>
2eca4eb… ragelink 986 <p>Pull updates from a remote Fossil server into your local instance:</p>
2eca4eb… ragelink 987 <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_pull<span class="w"> </span>my-project
2eca4eb… ragelink 988 </code></pre></div>
2eca4eb… ragelink 989 <div class="admonition warning">
2eca4eb… ragelink 990 <p class="admonition-title">Direction matters</p>
2eca4eb… ragelink 991 <p>The sync bridge is <strong>one-way</strong>: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p>
2eca4eb… ragelink 992 </div>
2eca4eb… ragelink 993
2eca4eb… ragelink 994
2eca4eb… ragelink 995
2eca4eb… ragelink 996
2eca4eb… ragelink 997
2eca4eb… ragelink 998
2eca4eb… ragelink 999
2eca4eb… ragelink 1000
2eca4eb… ragelink 1001
2eca4eb… ragelink 1002
2eca4eb… ragelink 1003
2eca4eb… ragelink 1004
2eca4eb… ragelink 1005
2eca4eb… ragelink 1006 </article>
2eca4eb… ragelink 1007 </div>
2eca4eb… ragelink 1008
2eca4eb… ragelink 1009
2eca4eb… ragelink 1010 <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 1011
2eca4eb… ragelink 1012 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
2eca4eb… ragelink 1013 </div>
2eca4eb… ragelink 1014
2eca4eb… ragelink 1015 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
2eca4eb… ragelink 1016
2eca4eb… ragelink 1017 <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 1018 Back to top
2eca4eb… ragelink 1019 </button>
2eca4eb… ragelink 1020
2eca4eb… ragelink 1021 </main>
2eca4eb… ragelink 1022
2eca4eb… ragelink 1023 <footer class="md-footer">
2eca4eb… ragelink 1024
2eca4eb… ragelink 1025 <div class="md-footer-meta md-typeset">
2eca4eb… ragelink 1026 <div class="md-footer-meta__inner md-grid">
2eca4eb… ragelink 1027 <div class="md-copyright">
2eca4eb… ragelink 1028
2eca4eb… ragelink 1029 <div class="md-copyright__highlight">
2eca4eb… ragelink 1030 Copyright &copy; 2026 CONFLICT LLC
2eca4eb… ragelink 1031 </div>
2eca4eb… ragelink 1032
2eca4eb… ragelink 1033
2eca4eb… ragelink 1034 Made with
2eca4eb… ragelink 1035 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2eca4eb… ragelink 1036 Material for MkDocs
2eca4eb… ragelink 1037 </a>
2eca4eb… ragelink 1038
2eca4eb… ragelink 1039 </div>
2eca4eb… ragelink 1040
2eca4eb… ragelink 1041
2eca4eb… ragelink 1042 <div class="md-social">
2eca4eb… ragelink 1043
2eca4eb… ragelink 1044
2eca4eb… ragelink 1045
2eca4eb… ragelink 1046
2eca4eb… ragelink 1047
2eca4eb… ragelink 1048
2eca4eb… ragelink 1049
2eca4eb… ragelink 1050
2eca4eb… ragelink 1051 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
2eca4eb… ragelink 1052 <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 1053 </a>
2eca4eb… ragelink 1054
2eca4eb… ragelink 1055 </div>
2eca4eb… ragelink 1056
2eca4eb… ragelink 1057 </div>
2eca4eb… ragelink 1058 </div>
2eca4eb… ragelink 1059 </footer>
2eca4eb… ragelink 1060
2eca4eb… ragelink 1061 </div>
2eca4eb… ragelink 1062 <div class="md-dialog" data-md-component="dialog">
2eca4eb… ragelink 1063 <div class="md-dialog__inner md-typeset"></div>
2eca4eb… ragelink 1064 </div>
2eca4eb… ragelink 1065
2eca4eb… ragelink 1066
2eca4eb… ragelink 1067
2eca4eb… ragelink 1068
2eca4eb… ragelink 1069
2eca4eb… ragelink 1070 <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 1071
2eca4eb… ragelink 1072
2eca4eb… ragelink 1073 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
2eca4eb… ragelink 1074
2eca4eb… ragelink 1075
2eca4eb… ragelink 1076 </body>
2eca4eb… ragelink 1077 </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