FossilRepo

Sync: sidebar split, wiki ordering, non-destructive sync script

ragelink 2026-04-07 19:58 trunk
Commit 8f52aba83e8e2e433d610a9e78ae76b2668f493dbb30b030a49a065e03be56f7
+2
--- .gitignore
+++ .gitignore
@@ -28,5 +28,7 @@
2828
/assets/
2929
fossilrepo.fossil
3030
.fslckout
3131
site/
3232
repos/
33
+.env.deploy
34
+deploy.sh
3335
3436
ADDED deploy.sh
3537
ADDED scripts/sync_to_fossil.sh
3638
ADDED site/404.html
3739
ADDED site/CNAME
3840
ADDED site/architecture/overview/index.html
3941
ADDED site/architecture/sync-bridge/index.html
4042
ADDED site/getting-started/configuration/index.html
4143
ADDED site/getting-started/first-repo/index.html
4244
ADDED site/getting-started/installation/index.html
4345
ADDED site/getting-started/prerequisites/index.html
4446
ADDED site/index.html
4547
ADDED site/overrides/partials/logo.html
4648
ADDED site/search/search_index.json
4749
ADDED site/sitemap.xml
4850
ADDED site/sitemap.xml.gz
--- .gitignore
+++ .gitignore
@@ -28,5 +28,7 @@
28 /assets/
29 fossilrepo.fossil
30 .fslckout
31 site/
32 repos/
 
 
33
34 DDED deploy.sh
35 DDED scripts/sync_to_fossil.sh
36 DDED site/404.html
37 DDED site/CNAME
38 DDED site/architecture/overview/index.html
39 DDED site/architecture/sync-bridge/index.html
40 DDED site/getting-started/configuration/index.html
41 DDED site/getting-started/first-repo/index.html
42 DDED site/getting-started/installation/index.html
43 DDED site/getting-started/prerequisites/index.html
44 DDED site/index.html
45 DDED site/overrides/partials/logo.html
46 DDED site/search/search_index.json
47 DDED site/sitemap.xml
48 DDED site/sitemap.xml.gz
--- .gitignore
+++ .gitignore
@@ -28,5 +28,7 @@
28 /assets/
29 fossilrepo.fossil
30 .fslckout
31 site/
32 repos/
33 .env.deploy
34 deploy.sh
35
36 DDED deploy.sh
37 DDED scripts/sync_to_fossil.sh
38 DDED site/404.html
39 DDED site/CNAME
40 DDED site/architecture/overview/index.html
41 DDED site/architecture/sync-bridge/index.html
42 DDED site/getting-started/configuration/index.html
43 DDED site/getting-started/first-repo/index.html
44 DDED site/getting-started/installation/index.html
45 DDED site/getting-started/prerequisites/index.html
46 DDED site/index.html
47 DDED site/overrides/partials/logo.html
48 DDED site/search/search_index.json
49 DDED site/sitemap.xml
50 DDED site/sitemap.xml.gz
+53
--- a/deploy.sh
+++ b/deploy.sh
@@ -0,0 +1,53 @@
1
+#!/bin/bash
2
+statey.sh — push local chUsage: ./deploy.sh [message] + collectstatic + restart)
3
+#
4
+:
5
+# FOSSIL_REMOTE_URL=https://admin:[email protected]/projects/fossilrepo/fossil/xfer
6
+# EC2_INSTANCE_ID=i-xxxx
7
+# S3_BUCKET=dev-fossilrepo-storaOTE_URL and EC2_INSTANCE_ID
8
+
9
+set -euo pipefail
10
+
11
+if [[ ! -f .env.deploy ]]; then
12
+ echo "Missing .env.deploy -- copy .env.deploy.example and fill in your values"
13
+ exit 1
14
+fi
15
+
16
+source .env.deploy
17
+
18
+MSG="${1:-Deploy $(date +%Y-%m-%d-%H%M)}"
19
+
20
+echo "=== Fossil commit ==="
21
+fossil addremove 2>/dev/null || true
22
+fossil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit"
23
+
24
+echo "=== Fossil push ==="
25
+fossil push "$FOSSIL_REMOTE_URL"
26
+
27
+echo "=== Deploy to server ==="
28
+AWS_PROFILE=fossiladmin aws ssm send-command \
29
+ --instance-ids "$EC2_INSTANCE_ID" \
30
+ --document-name "AWS-RunShellScript" \
31
+ --timeout-seconds 120 \
32
+ --parameters '{"commands":["export HOME=/root && fossilrepo-deploy 2>&1"]}' \
33
+ --region "${AWS_REGION:-us-west-2}" \
34
+ --query "Command.CommandId" \
35
+ --output text
36
+
37
+echo "=== Deployed ==="
38
+ssil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit"
39
+
40
+echo "=== Fossil Sync repos to S3
41
+echo "=== Deploy to server ==="
42
+AW3 sync repos/ "s3://${S3_BUCKET}/sync/repos/" --region "$AWS_REGION" --exclude "*.fossil-shm" --exclude "*.fossil-wal" 2>&1 | tail -3
43
+
44
+echo "=== Sync DB to S3 ==="
45
+docker compose exec -T postgres pg_dump -U dbadmin --data-only --inserts --no-owner --no-privileges fossilrepo > /tmp/fossilrepo-data.sql
46
+AWS_PROFILE=fossiladmin aws s3 cp /tmp/fossilrepo-data.sql "s3://${S3_BUCKET}/sync/data.sql" --region "$AWS_REGION" 2>&1 | tail -1
47
+
48
+echo "=== Push code to git ==="
49
+git add -A && git commit -m "$MSG" 2>/dev/null || true
50
+git push origin main 2>&1 || echo "Git push failed (non-critical)"
51
+
52
+echo "=== Deploy to EC2
53
+echo "===
--- a/deploy.sh
+++ b/deploy.sh
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/deploy.sh
+++ b/deploy.sh
@@ -0,0 +1,53 @@
1 #!/bin/bash
2 statey.sh — push local chUsage: ./deploy.sh [message] + collectstatic + restart)
3 #
4 :
5 # FOSSIL_REMOTE_URL=https://admin:[email protected]/projects/fossilrepo/fossil/xfer
6 # EC2_INSTANCE_ID=i-xxxx
7 # S3_BUCKET=dev-fossilrepo-storaOTE_URL and EC2_INSTANCE_ID
8
9 set -euo pipefail
10
11 if [[ ! -f .env.deploy ]]; then
12 echo "Missing .env.deploy -- copy .env.deploy.example and fill in your values"
13 exit 1
14 fi
15
16 source .env.deploy
17
18 MSG="${1:-Deploy $(date +%Y-%m-%d-%H%M)}"
19
20 echo "=== Fossil commit ==="
21 fossil addremove 2>/dev/null || true
22 fossil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit"
23
24 echo "=== Fossil push ==="
25 fossil push "$FOSSIL_REMOTE_URL"
26
27 echo "=== Deploy to server ==="
28 AWS_PROFILE=fossiladmin aws ssm send-command \
29 --instance-ids "$EC2_INSTANCE_ID" \
30 --document-name "AWS-RunShellScript" \
31 --timeout-seconds 120 \
32 --parameters '{"commands":["export HOME=/root && fossilrepo-deploy 2>&1"]}' \
33 --region "${AWS_REGION:-us-west-2}" \
34 --query "Command.CommandId" \
35 --output text
36
37 echo "=== Deployed ==="
38 ssil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit"
39
40 echo "=== Fossil Sync repos to S3
41 echo "=== Deploy to server ==="
42 AW3 sync repos/ "s3://${S3_BUCKET}/sync/repos/" --region "$AWS_REGION" --exclude "*.fossil-shm" --exclude "*.fossil-wal" 2>&1 | tail -3
43
44 echo "=== Sync DB to S3 ==="
45 docker compose exec -T postgres pg_dump -U dbadmin --data-only --inserts --no-owner --no-privileges fossilrepo > /tmp/fossilrepo-data.sql
46 AWS_PROFILE=fossiladmin aws s3 cp /tmp/fossilrepo-data.sql "s3://${S3_BUCKET}/sync/data.sql" --region "$AWS_REGION" 2>&1 | tail -1
47
48 echo "=== Push code to git ==="
49 git add -A && git commit -m "$MSG" 2>/dev/null || true
50 git push origin main 2>&1 || echo "Git push failed (non-critical)"
51
52 echo "=== Deploy to EC2
53 echo "===
--- a/scripts/sync_to_fossil.sh
+++ b/scripts/sync_to_fossil.sh
@@ -0,0 +1,73 @@
1
+#!/bin/bash
2
+# sync_to_fossil.sh — Commit current code into the existing .fossil repo.
3
+#
4
+# Opens a temporary checkout, rsyncs the working tree in, commits changes.
5
+# NEVER replaces or reimports the .fossil file — preserves all tickets,
6
+# wiki, forum, and other Fossil-native artifacts.
7
+#
8
+# Usage: ./scripts/sync_to_fossil.sh ["commit message"]
9
+# Run from inside the container or via:
10
+# docker compose exec backend bash scripts/sync_to_fossil.sh "message"
11
+
12
+set -euo pipefail
13
+
14
+REPO="/data/repos/fossilrepo.fossil"
15
+WORKDIR="/tmp/fossil-checkout-$$"
16
+MESSAGE="${1:-Sync from working tree}"
17
+
18
+export USER="${USER:-ragelink}"
19
+
20
+if [ ! -f "$REPO" ]; then
21
+ echo "Error: $REPO not found" >&2
22
+ exit 1
23
+fi
24
+
25
+echo "=== Committing to Fossil ==="
26
+
27
+# Create temp checkout
28
+rm -rf "$WORKDIR"
29
+mkdir -p "$WORKDIR"
30
+cd "$WORKDIR"
31
+
32
+fossil open "$REPO" --workdir "$WORKDIR" 2>/dev/null
33
+fossil update trunk 2>/dev/null || true
34
+
35
+# Sync code from /app — use tar to copy with exclusions (rsync not available)
36
+cd /app
37
+tar cf - \
38
+ --exclude='.git' \
39
+ --exclude='__pycache__' \
40
+ --exclude='*.pyc' \
41
+ --exclude='.ruff_cache' \
42
+ --exclude='node_modules' \
43
+ --exclude='assets' \
44
+ --exclude='.env' \
45
+ --exclude='repos' \
46
+ --exclude='.fslckout' \
47
+ --exclude='_FOSSIL_' \
48
+ --exclude='*.fossil' \
49
+ --exclude='.claude' \
50
+ . | (cd "$WORKDIR" && tar xf -)
51
+cd "$WORKDIR"
52
+
53
+# Register new/deleted files
54
+fossil addremove 2>/dev/null || true
55
+
56
+# Commit if there are changes
57
+CHANGES=$(fossil changes 2>/dev/null | wc -l | tr -d ' ')
58
+if [ "$CHANGES" -gt 0 ]; then
59
+ fossil commit -m "$MESSAGE" --no-warnings 2>&1 | tail -3
60
+ echo "Committed $CHANGES changed files."
61
+else
62
+ echo "No changes to commit."
63
+fi
64
+
65
+# Cleanup
66
+fossil close --force 2>/dev/null || true
67
+cd /
68
+rm -rf "$WORKDIR"
69
+
70
+echo "=== Status ==="
71
+echo "Checkins: $(fossil sql -R "$REPO" "SELECT count(*) FROM event WHERE type='ci';" | tr -d "' ")"
72
+echo "Wiki: $(fossil wiki list -R "$REPO" | wc -l) pages"
73
+echo "Tickets: $(fossil sql -R "$REPO" "SELECT count(*) FROM ticket;" | tr -d "' ")"
--- a/scripts/sync_to_fossil.sh
+++ b/scripts/sync_to_fossil.sh
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/scripts/sync_to_fossil.sh
+++ b/scripts/sync_to_fossil.sh
@@ -0,0 +1,73 @@
1 #!/bin/bash
2 # sync_to_fossil.sh — Commit current code into the existing .fossil repo.
3 #
4 # Opens a temporary checkout, rsyncs the working tree in, commits changes.
5 # NEVER replaces or reimports the .fossil file — preserves all tickets,
6 # wiki, forum, and other Fossil-native artifacts.
7 #
8 # Usage: ./scripts/sync_to_fossil.sh ["commit message"]
9 # Run from inside the container or via:
10 # docker compose exec backend bash scripts/sync_to_fossil.sh "message"
11
12 set -euo pipefail
13
14 REPO="/data/repos/fossilrepo.fossil"
15 WORKDIR="/tmp/fossil-checkout-$$"
16 MESSAGE="${1:-Sync from working tree}"
17
18 export USER="${USER:-ragelink}"
19
20 if [ ! -f "$REPO" ]; then
21 echo "Error: $REPO not found" >&2
22 exit 1
23 fi
24
25 echo "=== Committing to Fossil ==="
26
27 # Create temp checkout
28 rm -rf "$WORKDIR"
29 mkdir -p "$WORKDIR"
30 cd "$WORKDIR"
31
32 fossil open "$REPO" --workdir "$WORKDIR" 2>/dev/null
33 fossil update trunk 2>/dev/null || true
34
35 # Sync code from /app — use tar to copy with exclusions (rsync not available)
36 cd /app
37 tar cf - \
38 --exclude='.git' \
39 --exclude='__pycache__' \
40 --exclude='*.pyc' \
41 --exclude='.ruff_cache' \
42 --exclude='node_modules' \
43 --exclude='assets' \
44 --exclude='.env' \
45 --exclude='repos' \
46 --exclude='.fslckout' \
47 --exclude='_FOSSIL_' \
48 --exclude='*.fossil' \
49 --exclude='.claude' \
50 . | (cd "$WORKDIR" && tar xf -)
51 cd "$WORKDIR"
52
53 # Register new/deleted files
54 fossil addremove 2>/dev/null || true
55
56 # Commit if there are changes
57 CHANGES=$(fossil changes 2>/dev/null | wc -l | tr -d ' ')
58 if [ "$CHANGES" -gt 0 ]; then
59 fossil commit -m "$MESSAGE" --no-warnings 2>&1 | tail -3
60 echo "Committed $CHANGES changed files."
61 else
62 echo "No changes to commit."
63 fi
64
65 # Cleanup
66 fossil close --force 2>/dev/null || true
67 cd /
68 rm -rf "$WORKDIR"
69
70 echo "=== Status ==="
71 echo "Checkins: $(fossil sql -R "$REPO" "SELECT count(*) FROM event WHERE type='ci';" | tr -d "' ")"
72 echo "Wiki: $(fossil wiki list -R "$REPO" | wc -l) pages"
73 echo "Tickets: $(fossil sql -R "$REPO" "SELECT count(*) FROM ticket;" | tr -d "' ")"
+738
--- a/site/404.html
+++ b/site/404.html
@@ -0,0 +1,738 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+ <link rel="icon" href="/assets/images/favicon.png">
22
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
23
+
24
+
25
+
26
+ <title>Fossilrepo</title>
27
+
28
+
29
+
30
+ <link rel="stylesheet" href="/assets/stylesheets/main.484c7ddc.min.css">
31
+
32
+
33
+ <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css">
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
47
+ <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">
48
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
49
+
50
+
51
+
52
+ <link rel="stylesheet" href="/assets/css/custom.css">
53
+
54
+ <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>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
71
+
72
+
73
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
74
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
75
+ <label class="md-overlay" for="__drawer"></label>
76
+ <div data-md-component="skip">
77
+
78
+ </div>
79
+ <div data-md-component="announce">
80
+
81
+ </div>
82
+
83
+
84
+
85
+
86
+<header class="md-header" data-md-component="header">
87
+ <nav class="md-header__inner md-grid" aria-label="Header">
88
+ <a href="/." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
89
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
90
+ <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
91
+ <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
92
+</div>
93
+ </a>
94
+ <label class="md-header__button md-icon" for="__drawer">
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
97
+ </label>
98
+ <div class="md-header__title" data-md-component="header-title">
99
+ <div class="md-header__ellipsis">
100
+ <div class="md-header__topic">
101
+ <span class="md-ellipsis">
102
+ Fossilrepo
103
+ </span>
104
+ </div>
105
+ <div class="md-header__topic" data-md-component="header-topic">
106
+ <span class="md-ellipsis">
107
+
108
+
109
+
110
+ </span>
111
+ </div>
112
+ </div>
113
+ </div>
114
+
115
+
116
+ <form class="md-header__option" data-md-component="palette">
117
+
118
+
119
+
120
+
121
+ <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">
122
+
123
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
124
+ <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>
125
+ </label>
126
+
127
+
128
+
129
+
130
+
131
+ <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">
132
+
133
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
134
+ <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>
135
+ </label>
136
+
137
+
138
+</form>
139
+
140
+
141
+
142
+ <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>
143
+
144
+
145
+
146
+
147
+
148
+ <label class="md-header__button md-icon" for="__search">
149
+
150
+ <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>
151
+ </label>
152
+ <div class="md-search" data-md-component="search" role="dialog">
153
+ <label class="md-search__overlay" for="__search"></label>
154
+ <div class="md-search__inner" role="search">
155
+ <form class="md-search__form" name="search">
156
+ <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>
157
+ <label class="md-search__icon md-icon" for="__search">
158
+
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>
160
+
161
+ <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>
162
+ </label>
163
+ <nav class="md-search__options" aria-label="Search">
164
+
165
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
166
+
167
+ <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>
168
+ </button>
169
+ </nav>
170
+
171
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
172
+
173
+ </form>
174
+ <div class="md-search__output">
175
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
176
+ <div class="md-search-result" data-md-component="search-result">
177
+ <div class="md-search-result__meta">
178
+ Initializing search
179
+ </div>
180
+ <ol class="md-search-result__list" role="presentation"></ol>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </div>
185
+</div>
186
+
187
+
188
+
189
+ <div class="md-header__source">
190
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
191
+ <div class="md-source__icon md-icon">
192
+
193
+ <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>
194
+ </div>
195
+ <div class="md-source__repository">
196
+ ConflictHQ/fossilrepo
197
+ </div>
198
+</a>
199
+ </div>
200
+
201
+ </nav>
202
+
203
+</header>
204
+
205
+ <div class="md-container" data-md-component="container">
206
+
207
+
208
+
209
+
210
+
211
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
212
+ <div class="md-grid">
213
+ <ul class="md-tabs__list">
214
+
215
+
216
+
217
+
218
+
219
+
220
+ <li class="md-tabs__item">
221
+ <a href="/." class="md-tabs__link">
222
+
223
+
224
+
225
+
226
+
227
+ Home
228
+
229
+ </a>
230
+ </li>
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+ <li class="md-tabs__item">
242
+ <a href="/getting-started/prerequisites/" class="md-tabs__link">
243
+
244
+
245
+
246
+ Getting Started
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ <li class="md-tabs__item">
262
+ <a href="/architecture/overview/" class="md-tabs__link">
263
+
264
+
265
+
266
+ Architecture
267
+
268
+ </a>
269
+ </li>
270
+
271
+
272
+
273
+
274
+ </ul>
275
+ </div>
276
+</nav>
277
+
278
+
279
+
280
+ <main class="md-main" data-md-component="main">
281
+ <div class="md-main__inner md-grid">
282
+
283
+
284
+
285
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
286
+ <div class="md-sidebar__scrollwrap">
287
+ <div class="md-sidebar__inner">
288
+
289
+
290
+
291
+
292
+
293
+
294
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
295
+ <label class="md-nav__title" for="__drawer">
296
+ <a href="/." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
297
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
298
+ <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
299
+ <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
300
+</div>
301
+ </a>
302
+ Fossilrepo
303
+ </label>
304
+
305
+ <div class="md-nav__source">
306
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
307
+ <div class="md-source__icon md-icon">
308
+
309
+ <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>
310
+ </div>
311
+ <div class="md-source__repository">
312
+ ConflictHQ/fossilrepo
313
+ </div>
314
+</a>
315
+ </div>
316
+
317
+ <ul class="md-nav__list" data-md-scrollfix>
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ <li class="md-nav__item">
326
+ <a href="/." class="md-nav__link">
327
+
328
+
329
+
330
+ <span class="md-ellipsis">
331
+
332
+
333
+ Home
334
+
335
+
336
+
337
+ </span>
338
+
339
+
340
+
341
+ </a>
342
+ </li>
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+ <li class="md-nav__item md-nav__item--nested">
363
+
364
+
365
+
366
+
367
+
368
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
369
+
370
+
371
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
372
+
373
+
374
+
375
+ <span class="md-ellipsis">
376
+
377
+
378
+ Getting Started
379
+
380
+
381
+
382
+ </span>
383
+
384
+
385
+
386
+ <span class="md-nav__icon md-icon"></span>
387
+ </label>
388
+
389
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
390
+ <label class="md-nav__title" for="__nav_2">
391
+ <span class="md-nav__icon md-icon"></span>
392
+
393
+
394
+ Getting Started
395
+
396
+
397
+ </label>
398
+ <ul class="md-nav__list" data-md-scrollfix>
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+ <li class="md-nav__item">
407
+ <a href="/getting-started/prerequisites/" class="md-nav__link">
408
+
409
+
410
+
411
+ <span class="md-ellipsis">
412
+
413
+
414
+ Prerequisites
415
+
416
+
417
+
418
+ </span>
419
+
420
+
421
+
422
+ </a>
423
+ </li>
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+ <li class="md-nav__item">
435
+ <a href="/getting-started/installation/" class="md-nav__link">
436
+
437
+
438
+
439
+ <span class="md-ellipsis">
440
+
441
+
442
+ Installation
443
+
444
+
445
+
446
+ </span>
447
+
448
+
449
+
450
+ </a>
451
+ </li>
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+ <li class="md-nav__item">
463
+ <a href="/getting-started/configuration/" class="md-nav__link">
464
+
465
+
466
+
467
+ <span class="md-ellipsis">
468
+
469
+
470
+ Configuration
471
+
472
+
473
+
474
+ </span>
475
+
476
+
477
+
478
+ </a>
479
+ </li>
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+ <li class="md-nav__item">
491
+ <a href="/getting-started/first-repo/" class="md-nav__link">
492
+
493
+
494
+
495
+ <span class="md-ellipsis">
496
+
497
+
498
+ First Repository
499
+
500
+
501
+
502
+ </span>
503
+
504
+
505
+
506
+ </a>
507
+ </li>
508
+
509
+
510
+
511
+
512
+ </ul>
513
+ </nav>
514
+
515
+ </li>
516
+
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+ <li class="md-nav__item md-nav__item--nested">
536
+
537
+
538
+
539
+
540
+
541
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
542
+
543
+
544
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
545
+
546
+
547
+
548
+ <span class="md-ellipsis">
549
+
550
+
551
+ Architecture
552
+
553
+
554
+
555
+ </span>
556
+
557
+
558
+
559
+ <span class="md-nav__icon md-icon"></span>
560
+ </label>
561
+
562
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
563
+ <label class="md-nav__title" for="__nav_3">
564
+ <span class="md-nav__icon md-icon"></span>
565
+
566
+
567
+ Architecture
568
+
569
+
570
+ </label>
571
+ <ul class="md-nav__list" data-md-scrollfix>
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+ <li class="md-nav__item">
580
+ <a href="/architecture/overview/" class="md-nav__link">
581
+
582
+
583
+
584
+ <span class="md-ellipsis">
585
+
586
+
587
+ Overview
588
+
589
+
590
+
591
+ </span>
592
+
593
+
594
+
595
+ </a>
596
+ </li>
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+ <li class="md-nav__item">
608
+ <a href="/architecture/sync-bridge/" class="md-nav__link">
609
+
610
+
611
+
612
+ <span class="md-ellipsis">
613
+
614
+
615
+ Sync Bridge
616
+
617
+
618
+
619
+ </span>
620
+
621
+
622
+
623
+ </a>
624
+ </li>
625
+
626
+
627
+
628
+
629
+ </ul>
630
+ </nav>
631
+
632
+ </li>
633
+
634
+
635
+
636
+ </ul>
637
+</nav>
638
+ </div>
639
+ </div>
640
+ </div>
641
+
642
+
643
+
644
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
645
+ <div class="md-sidebar__scrollwrap">
646
+ <div class="md-sidebar__inner">
647
+
648
+
649
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
650
+
651
+
652
+
653
+
654
+</nav>
655
+ </div>
656
+ </div>
657
+ </div>
658
+
659
+
660
+
661
+ <div class="md-content" data-md-component="content">
662
+
663
+ <article class="md-content__inner md-typeset">
664
+
665
+ <h1>404 - Not found</h1>
666
+
667
+ </article>
668
+ </div>
669
+
670
+
671
+ <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>
672
+
673
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
674
+ </div>
675
+
676
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
677
+
678
+ <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>
679
+ Back to top
680
+</button>
681
+
682
+ </main>
683
+
684
+ <footer class="md-footer">
685
+
686
+ <div class="md-footer-meta md-typeset">
687
+ <div class="md-footer-meta__inner md-grid">
688
+ <div class="md-copyright">
689
+
690
+ <div class="md-copyright__highlight">
691
+ Copyright &copy; 2026 CONFLICT LLC
692
+ </div>
693
+
694
+
695
+ Made with
696
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
697
+ Material for MkDocs
698
+ </a>
699
+
700
+</div>
701
+
702
+
703
+<div class="md-social">
704
+
705
+
706
+
707
+
708
+
709
+
710
+
711
+
712
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
713
+ <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>
714
+ </a>
715
+
716
+</div>
717
+
718
+ </div>
719
+ </div>
720
+</footer>
721
+
722
+ </div>
723
+ <div class="md-dialog" data-md-component="dialog">
724
+ <div class="md-dialog__inner md-typeset"></div>
725
+ </div>
726
+
727
+
728
+
729
+
730
+
731
+ <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>
732
+
733
+
734
+ <script src="/assets/javascripts/bundle.79ae519e.min.js"></script>
735
+
736
+
737
+ </body>
738
+</html>
--- a/site/404.html
+++ b/site/404.html
@@ -0,0 +1,738 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/404.html
+++ b/site/404.html
@@ -0,0 +1,738 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15
16
17
18
19
20
21 <link rel="icon" href="/assets/images/favicon.png">
22 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
23
24
25
26 <title>Fossilrepo</title>
27
28
29
30 <link rel="stylesheet" href="/assets/stylesheets/main.484c7ddc.min.css">
31
32
33 <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css">
34
35
36
37
38
39
40
41
42
43
44
45
46 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
47 <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">
48 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
49
50
51
52 <link rel="stylesheet" href="/assets/css/custom.css">
53
54 <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>
55
56
57
58
59
60 </head>
61
62
63
64
65
66
67
68
69
70 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
71
72
73 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
74 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
75 <label class="md-overlay" for="__drawer"></label>
76 <div data-md-component="skip">
77
78 </div>
79 <div data-md-component="announce">
80
81 </div>
82
83
84
85
86 <header class="md-header" data-md-component="header">
87 <nav class="md-header__inner md-grid" aria-label="Header">
88 <a href="/." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
89 <div style="display: flex; align-items: center; gap: 0.6rem;">
90 <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
91 <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
92 </div>
93 </a>
94 <label class="md-header__button md-icon" for="__drawer">
95
96 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
97 </label>
98 <div class="md-header__title" data-md-component="header-title">
99 <div class="md-header__ellipsis">
100 <div class="md-header__topic">
101 <span class="md-ellipsis">
102 Fossilrepo
103 </span>
104 </div>
105 <div class="md-header__topic" data-md-component="header-topic">
106 <span class="md-ellipsis">
107
108
109
110 </span>
111 </div>
112 </div>
113 </div>
114
115
116 <form class="md-header__option" data-md-component="palette">
117
118
119
120
121 <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">
122
123 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
124 <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>
125 </label>
126
127
128
129
130
131 <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">
132
133 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
134 <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>
135 </label>
136
137
138 </form>
139
140
141
142 <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>
143
144
145
146
147
148 <label class="md-header__button md-icon" for="__search">
149
150 <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>
151 </label>
152 <div class="md-search" data-md-component="search" role="dialog">
153 <label class="md-search__overlay" for="__search"></label>
154 <div class="md-search__inner" role="search">
155 <form class="md-search__form" name="search">
156 <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>
157 <label class="md-search__icon md-icon" for="__search">
158
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>
160
161 <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>
162 </label>
163 <nav class="md-search__options" aria-label="Search">
164
165 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
166
167 <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>
168 </button>
169 </nav>
170
171 <div class="md-search__suggest" data-md-component="search-suggest"></div>
172
173 </form>
174 <div class="md-search__output">
175 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
176 <div class="md-search-result" data-md-component="search-result">
177 <div class="md-search-result__meta">
178 Initializing search
179 </div>
180 <ol class="md-search-result__list" role="presentation"></ol>
181 </div>
182 </div>
183 </div>
184 </div>
185 </div>
186
187
188
189 <div class="md-header__source">
190 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
191 <div class="md-source__icon md-icon">
192
193 <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>
194 </div>
195 <div class="md-source__repository">
196 ConflictHQ/fossilrepo
197 </div>
198 </a>
199 </div>
200
201 </nav>
202
203 </header>
204
205 <div class="md-container" data-md-component="container">
206
207
208
209
210
211 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
212 <div class="md-grid">
213 <ul class="md-tabs__list">
214
215
216
217
218
219
220 <li class="md-tabs__item">
221 <a href="/." class="md-tabs__link">
222
223
224
225
226
227 Home
228
229 </a>
230 </li>
231
232
233
234
235
236
237
238
239
240
241 <li class="md-tabs__item">
242 <a href="/getting-started/prerequisites/" class="md-tabs__link">
243
244
245
246 Getting Started
247
248 </a>
249 </li>
250
251
252
253
254
255
256
257
258
259
260
261 <li class="md-tabs__item">
262 <a href="/architecture/overview/" class="md-tabs__link">
263
264
265
266 Architecture
267
268 </a>
269 </li>
270
271
272
273
274 </ul>
275 </div>
276 </nav>
277
278
279
280 <main class="md-main" data-md-component="main">
281 <div class="md-main__inner md-grid">
282
283
284
285 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
286 <div class="md-sidebar__scrollwrap">
287 <div class="md-sidebar__inner">
288
289
290
291
292
293
294 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
295 <label class="md-nav__title" for="__drawer">
296 <a href="/." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
297 <div style="display: flex; align-items: center; gap: 0.6rem;">
298 <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
299 <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
300 </div>
301 </a>
302 Fossilrepo
303 </label>
304
305 <div class="md-nav__source">
306 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
307 <div class="md-source__icon md-icon">
308
309 <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>
310 </div>
311 <div class="md-source__repository">
312 ConflictHQ/fossilrepo
313 </div>
314 </a>
315 </div>
316
317 <ul class="md-nav__list" data-md-scrollfix>
318
319
320
321
322
323
324
325 <li class="md-nav__item">
326 <a href="/." class="md-nav__link">
327
328
329
330 <span class="md-ellipsis">
331
332
333 Home
334
335
336
337 </span>
338
339
340
341 </a>
342 </li>
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362 <li class="md-nav__item md-nav__item--nested">
363
364
365
366
367
368 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
369
370
371 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
372
373
374
375 <span class="md-ellipsis">
376
377
378 Getting Started
379
380
381
382 </span>
383
384
385
386 <span class="md-nav__icon md-icon"></span>
387 </label>
388
389 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
390 <label class="md-nav__title" for="__nav_2">
391 <span class="md-nav__icon md-icon"></span>
392
393
394 Getting Started
395
396
397 </label>
398 <ul class="md-nav__list" data-md-scrollfix>
399
400
401
402
403
404
405
406 <li class="md-nav__item">
407 <a href="/getting-started/prerequisites/" class="md-nav__link">
408
409
410
411 <span class="md-ellipsis">
412
413
414 Prerequisites
415
416
417
418 </span>
419
420
421
422 </a>
423 </li>
424
425
426
427
428
429
430
431
432
433
434 <li class="md-nav__item">
435 <a href="/getting-started/installation/" class="md-nav__link">
436
437
438
439 <span class="md-ellipsis">
440
441
442 Installation
443
444
445
446 </span>
447
448
449
450 </a>
451 </li>
452
453
454
455
456
457
458
459
460
461
462 <li class="md-nav__item">
463 <a href="/getting-started/configuration/" class="md-nav__link">
464
465
466
467 <span class="md-ellipsis">
468
469
470 Configuration
471
472
473
474 </span>
475
476
477
478 </a>
479 </li>
480
481
482
483
484
485
486
487
488
489
490 <li class="md-nav__item">
491 <a href="/getting-started/first-repo/" class="md-nav__link">
492
493
494
495 <span class="md-ellipsis">
496
497
498 First Repository
499
500
501
502 </span>
503
504
505
506 </a>
507 </li>
508
509
510
511
512 </ul>
513 </nav>
514
515 </li>
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535 <li class="md-nav__item md-nav__item--nested">
536
537
538
539
540
541 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
542
543
544 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
545
546
547
548 <span class="md-ellipsis">
549
550
551 Architecture
552
553
554
555 </span>
556
557
558
559 <span class="md-nav__icon md-icon"></span>
560 </label>
561
562 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
563 <label class="md-nav__title" for="__nav_3">
564 <span class="md-nav__icon md-icon"></span>
565
566
567 Architecture
568
569
570 </label>
571 <ul class="md-nav__list" data-md-scrollfix>
572
573
574
575
576
577
578
579 <li class="md-nav__item">
580 <a href="/architecture/overview/" class="md-nav__link">
581
582
583
584 <span class="md-ellipsis">
585
586
587 Overview
588
589
590
591 </span>
592
593
594
595 </a>
596 </li>
597
598
599
600
601
602
603
604
605
606
607 <li class="md-nav__item">
608 <a href="/architecture/sync-bridge/" class="md-nav__link">
609
610
611
612 <span class="md-ellipsis">
613
614
615 Sync Bridge
616
617
618
619 </span>
620
621
622
623 </a>
624 </li>
625
626
627
628
629 </ul>
630 </nav>
631
632 </li>
633
634
635
636 </ul>
637 </nav>
638 </div>
639 </div>
640 </div>
641
642
643
644 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
645 <div class="md-sidebar__scrollwrap">
646 <div class="md-sidebar__inner">
647
648
649 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
650
651
652
653
654 </nav>
655 </div>
656 </div>
657 </div>
658
659
660
661 <div class="md-content" data-md-component="content">
662
663 <article class="md-content__inner md-typeset">
664
665 <h1>404 - Not found</h1>
666
667 </article>
668 </div>
669
670
671 <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>
672
673 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
674 </div>
675
676 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
677
678 <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>
679 Back to top
680 </button>
681
682 </main>
683
684 <footer class="md-footer">
685
686 <div class="md-footer-meta md-typeset">
687 <div class="md-footer-meta__inner md-grid">
688 <div class="md-copyright">
689
690 <div class="md-copyright__highlight">
691 Copyright &copy; 2026 CONFLICT LLC
692 </div>
693
694
695 Made with
696 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
697 Material for MkDocs
698 </a>
699
700 </div>
701
702
703 <div class="md-social">
704
705
706
707
708
709
710
711
712 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
713 <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>
714 </a>
715
716 </div>
717
718 </div>
719 </div>
720 </footer>
721
722 </div>
723 <div class="md-dialog" data-md-component="dialog">
724 <div class="md-dialog__inner md-typeset"></div>
725 </div>
726
727
728
729
730
731 <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>
732
733
734 <script src="/assets/javascripts/bundle.79ae519e.min.js"></script>
735
736
737 </body>
738 </html>
+1
--- a/site/CNAME
+++ b/site/CNAME
@@ -0,0 +1 @@
1
+fossilrepo.dev
--- a/site/CNAME
+++ b/site/CNAME
@@ -0,0 +1 @@
 
--- a/site/CNAME
+++ b/site/CNAME
@@ -0,0 +1 @@
1 fossilrepo.dev
--- a/site/architecture/overview/index.html
+++ b/site/architecture/overview/index.html
@@ -0,0 +1,1099 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/architecture/overview/">
16
+
17
+
18
+ <link rel="prev" href="../../getting-started/first-repo/">
19
+
20
+
21
+ <link rel="next" href="../sync-bridge/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>Overview - Fossilrepo</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
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>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#architecture-overview" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
101
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103
+</div>
104
+ </a>
105
+ <label class="md-header__button md-icon" for="__drawer">
106
+
107
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108
+ </label>
109
+ <div class="md-header__title" data-md-component="header-title">
110
+ <div class="md-header__ellipsis">
111
+ <div class="md-header__topic">
112
+ <span class="md-ellipsis">
113
+ Fossilrepo
114
+ </span>
115
+ </div>
116
+ <div class="md-header__topic" data-md-component="header-topic">
117
+ <span class="md-ellipsis">
118
+
119
+ Overview
120
+
121
+ </span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+
127
+ <form class="md-header__option" data-md-component="palette">
128
+
129
+
130
+
131
+
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">
133
+
134
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136
+ </label>
137
+
138
+
139
+
140
+
141
+
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">
143
+
144
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146
+ </label>
147
+
148
+
149
+</form>
150
+
151
+
152
+
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>
154
+
155
+
156
+
157
+
158
+
159
+ <label class="md-header__button md-icon" for="__search">
160
+
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>
162
+ </label>
163
+ <div class="md-search" data-md-component="search" role="dialog">
164
+ <label class="md-search__overlay" for="__search"></label>
165
+ <div class="md-search__inner" role="search">
166
+ <form class="md-search__form" name="search">
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>
168
+ <label class="md-search__icon md-icon" for="__search">
169
+
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>
171
+
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>
173
+ </label>
174
+ <nav class="md-search__options" aria-label="Search">
175
+
176
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
+
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>
179
+ </button>
180
+ </nav>
181
+
182
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
+
184
+ </form>
185
+ <div class="md-search__output">
186
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187
+ <div class="md-search-result" data-md-component="search-result">
188
+ <div class="md-search-result__meta">
189
+ Initializing search
190
+ </div>
191
+ <ol class="md-search-result__list" role="presentation"></ol>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+</div>
197
+
198
+
199
+
200
+ <div class="md-header__source">
201
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202
+ <div class="md-source__icon md-icon">
203
+
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>
205
+ </div>
206
+ <div class="md-source__repository">
207
+ ConflictHQ/fossilrepo
208
+ </div>
209
+</a>
210
+ </div>
211
+
212
+ </nav>
213
+
214
+</header>
215
+
216
+ <div class="md-container" data-md-component="container">
217
+
218
+
219
+
220
+
221
+
222
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223
+ <div class="md-grid">
224
+ <ul class="md-tabs__list">
225
+
226
+
227
+
228
+
229
+
230
+
231
+ <li class="md-tabs__item">
232
+ <a href="../.." class="md-tabs__link">
233
+
234
+
235
+
236
+
237
+
238
+ Home
239
+
240
+ </a>
241
+ </li>
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+ <li class="md-tabs__item">
253
+ <a href="../../getting-started/prerequisites/" class="md-tabs__link">
254
+
255
+
256
+
257
+ Getting Started
258
+
259
+ </a>
260
+ </li>
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item md-tabs__item--active">
275
+ <a href="./" class="md-tabs__link">
276
+
277
+
278
+
279
+ Architecture
280
+
281
+ </a>
282
+ </li>
283
+
284
+
285
+
286
+
287
+ </ul>
288
+ </div>
289
+</nav>
290
+
291
+
292
+
293
+ <main class="md-main" data-md-component="main">
294
+ <div class="md-main__inner md-grid">
295
+
296
+
297
+
298
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299
+ <div class="md-sidebar__scrollwrap">
300
+ <div class="md-sidebar__inner">
301
+
302
+
303
+
304
+
305
+
306
+
307
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308
+ <label class="md-nav__title" for="__drawer">
309
+ <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
311
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313
+</div>
314
+ </a>
315
+ Fossilrepo
316
+ </label>
317
+
318
+ <div class="md-nav__source">
319
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320
+ <div class="md-source__icon md-icon">
321
+
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>
323
+ </div>
324
+ <div class="md-source__repository">
325
+ ConflictHQ/fossilrepo
326
+ </div>
327
+</a>
328
+ </div>
329
+
330
+ <ul class="md-nav__list" data-md-scrollfix>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item">
339
+ <a href="../.." class="md-nav__link">
340
+
341
+
342
+
343
+ <span class="md-ellipsis">
344
+
345
+
346
+ Home
347
+
348
+
349
+
350
+ </span>
351
+
352
+
353
+
354
+ </a>
355
+ </li>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+ <li class="md-nav__item md-nav__item--nested">
376
+
377
+
378
+
379
+
380
+
381
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
382
+
383
+
384
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
385
+
386
+
387
+
388
+ <span class="md-ellipsis">
389
+
390
+
391
+ Getting Started
392
+
393
+
394
+
395
+ </span>
396
+
397
+
398
+
399
+ <span class="md-nav__icon md-icon"></span>
400
+ </label>
401
+
402
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
403
+ <label class="md-nav__title" for="__nav_2">
404
+ <span class="md-nav__icon md-icon"></span>
405
+
406
+
407
+ Getting Started
408
+
409
+
410
+ </label>
411
+ <ul class="md-nav__list" data-md-scrollfix>
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+ <li class="md-nav__item">
420
+ <a href="../../getting-started/prerequisites/" class="md-nav__link">
421
+
422
+
423
+
424
+ <span class="md-ellipsis">
425
+
426
+
427
+ Prerequisites
428
+
429
+
430
+
431
+ </span>
432
+
433
+
434
+
435
+ </a>
436
+ </li>
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+ <li class="md-nav__item">
448
+ <a href="../../getting-started/installation/" class="md-nav__link">
449
+
450
+
451
+
452
+ <span class="md-ellipsis">
453
+
454
+
455
+ Installation
456
+
457
+
458
+
459
+ </span>
460
+
461
+
462
+
463
+ </a>
464
+ </li>
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+ <li class="md-nav__item">
476
+ <a href="../../getting-started/configuration/" class="md-nav__link">
477
+
478
+
479
+
480
+ <span class="md-ellipsis">
481
+
482
+
483
+ Configuration
484
+
485
+
486
+
487
+ </span>
488
+
489
+
490
+
491
+ </a>
492
+ </li>
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+ <li class="md-nav__item">
504
+ <a href="../../getting-started/first-repo/" class="md-nav__link">
505
+
506
+
507
+
508
+ <span class="md-ellipsis">
509
+
510
+
511
+ First Repository
512
+
513
+
514
+
515
+ </span>
516
+
517
+
518
+
519
+ </a>
520
+ </li>
521
+
522
+
523
+
524
+
525
+ </ul>
526
+ </nav>
527
+
528
+ </li>
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
554
+
555
+
556
+
557
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
558
+
559
+
560
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
561
+
562
+
563
+
564
+ <span class="md-ellipsis">
565
+
566
+
567
+ Architecture
568
+
569
+
570
+
571
+ </span>
572
+
573
+
574
+
575
+ <span class="md-nav__icon md-icon"></span>
576
+ </label>
577
+
578
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
579
+ <label class="md-nav__title" for="__nav_3">
580
+ <span class="md-nav__icon md-icon"></span>
581
+
582
+
583
+ Architecture
584
+
585
+
586
+ </label>
587
+ <ul class="md-nav__list" data-md-scrollfix>
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+ <li class="md-nav__item md-nav__item--active">
598
+
599
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
600
+
601
+
602
+
603
+
604
+
605
+ <label class="md-nav__link md-nav__link--active" for="__toc">
606
+
607
+
608
+
609
+ <span class="md-ellipsis">
610
+
611
+
612
+ Overview
613
+
614
+
615
+
616
+ </span>
617
+
618
+
619
+
620
+ <span class="md-nav__icon md-icon"></span>
621
+ </label>
622
+
623
+ <a href="./" class="md-nav__link md-nav__link--active">
624
+
625
+
626
+
627
+ <span class="md-ellipsis">
628
+
629
+
630
+ Overview
631
+
632
+
633
+
634
+ </span>
635
+
636
+
637
+
638
+ </a>
639
+
640
+
641
+
642
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
643
+
644
+
645
+
646
+
647
+
648
+
649
+ <label class="md-nav__title" for="__toc">
650
+ <span class="md-nav__icon md-icon"></span>
651
+ Table of contents
652
+ </label>
653
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
654
+
655
+ <li class="md-nav__item">
656
+ <a href="#system-diagram" class="md-nav__link">
657
+ <span class="md-ellipsis">
658
+
659
+ System Diagram
660
+
661
+ </span>
662
+ </a>
663
+
664
+</li>
665
+
666
+ <li class="md-nav__item">
667
+ <a href="#components" class="md-nav__link">
668
+ <span class="md-ellipsis">
669
+
670
+ Components
671
+
672
+ </span>
673
+ </a>
674
+
675
+ <nav class="md-nav" aria-label="Components">
676
+ <ul class="md-nav__list">
677
+
678
+ <li class="md-nav__item">
679
+ <a href="#fossil-server" class="md-nav__link">
680
+ <span class="md-ellipsis">
681
+
682
+ Fossil Server
683
+
684
+ </span>
685
+ </a>
686
+
687
+</li>
688
+
689
+ <li class="md-nav__item">
690
+ <a href="#caddy" class="md-nav__link">
691
+ <span class="md-ellipsis">
692
+
693
+ Caddy
694
+
695
+ </span>
696
+ </a>
697
+
698
+</li>
699
+
700
+ <li class="md-nav__item">
701
+ <a href="#django-management-layer" class="md-nav__link">
702
+ <span class="md-ellipsis">
703
+
704
+ Django Management Layer
705
+
706
+ </span>
707
+ </a>
708
+
709
+</li>
710
+
711
+ <li class="md-nav__item">
712
+ <a href="#litestream" class="md-nav__link">
713
+ <span class="md-ellipsis">
714
+
715
+ Litestream
716
+
717
+ </span>
718
+ </a>
719
+
720
+</li>
721
+
722
+ <li class="md-nav__item">
723
+ <a href="#celery-workers" class="md-nav__link">
724
+ <span class="md-ellipsis">
725
+
726
+ Celery Workers
727
+
728
+ </span>
729
+ </a>
730
+
731
+</li>
732
+
733
+ </ul>
734
+ </nav>
735
+
736
+</li>
737
+
738
+ <li class="md-nav__item">
739
+ <a href="#data-flow" class="md-nav__link">
740
+ <span class="md-ellipsis">
741
+
742
+ Data Flow
743
+
744
+ </span>
745
+ </a>
746
+
747
+</li>
748
+
749
+ </ul>
750
+
751
+</nav>
752
+
753
+ </li>
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+
762
+
763
+
764
+ <li class="md-nav__item">
765
+ <a href="../sync-bridge/" class="md-nav__link">
766
+
767
+
768
+
769
+ <span class="md-ellipsis">
770
+
771
+
772
+ Sync Bridge
773
+
774
+
775
+
776
+ </span>
777
+
778
+
779
+
780
+ </a>
781
+ </li>
782
+
783
+
784
+
785
+
786
+ </ul>
787
+ </nav>
788
+
789
+ </li>
790
+
791
+
792
+
793
+ </ul>
794
+</nav>
795
+ </div>
796
+ </div>
797
+ </div>
798
+
799
+
800
+
801
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
802
+ <div class="md-sidebar__scrollwrap">
803
+ <div class="md-sidebar__inner">
804
+
805
+
806
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
807
+
808
+
809
+
810
+
811
+
812
+
813
+ <label class="md-nav__title" for="__toc">
814
+ <span class="md-nav__icon md-icon"></span>
815
+ Table of contents
816
+ </label>
817
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
818
+
819
+ <li class="md-nav__item">
820
+ <a href="#system-diagram" class="md-nav__link">
821
+ <span class="md-ellipsis">
822
+
823
+ System Diagram
824
+
825
+ </span>
826
+ </a>
827
+
828
+</li>
829
+
830
+ <li class="md-nav__item">
831
+ <a href="#components" class="md-nav__link">
832
+ <span class="md-ellipsis">
833
+
834
+ Components
835
+
836
+ </span>
837
+ </a>
838
+
839
+ <nav class="md-nav" aria-label="Components">
840
+ <ul class="md-nav__list">
841
+
842
+ <li class="md-nav__item">
843
+ <a href="#fossil-server" class="md-nav__link">
844
+ <span class="md-ellipsis">
845
+
846
+ Fossil Server
847
+
848
+ </span>
849
+ </a>
850
+
851
+</li>
852
+
853
+ <li class="md-nav__item">
854
+ <a href="#caddy" class="md-nav__link">
855
+ <span class="md-ellipsis">
856
+
857
+ Caddy
858
+
859
+ </span>
860
+ </a>
861
+
862
+</li>
863
+
864
+ <li class="md-nav__item">
865
+ <a href="#django-management-layer" class="md-nav__link">
866
+ <span class="md-ellipsis">
867
+
868
+ Django Management Layer
869
+
870
+ </span>
871
+ </a>
872
+
873
+</li>
874
+
875
+ <li class="md-nav__item">
876
+ <a href="#litestream" class="md-nav__link">
877
+ <span class="md-ellipsis">
878
+
879
+ Litestream
880
+
881
+ </span>
882
+ </a>
883
+
884
+</li>
885
+
886
+ <li class="md-nav__item">
887
+ <a href="#celery-workers" class="md-nav__link">
888
+ <span class="md-ellipsis">
889
+
890
+ Celery Workers
891
+
892
+ </span>
893
+ </a>
894
+
895
+</li>
896
+
897
+ </ul>
898
+ </nav>
899
+
900
+</li>
901
+
902
+ <li class="md-nav__item">
903
+ <a href="#data-flow" class="md-nav__link">
904
+ <span class="md-ellipsis">
905
+
906
+ Data Flow
907
+
908
+ </span>
909
+ </a>
910
+
911
+</li>
912
+
913
+ </ul>
914
+
915
+</nav>
916
+ </div>
917
+ </div>
918
+ </div>
919
+
920
+
921
+
922
+ <div class="md-content" data-md-component="content">
923
+
924
+ <article class="md-content__inner md-typeset">
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+<h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">&para;</a></h1>
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>
935
+<h2 id="system-diagram">System Diagram<a class="headerlink" href="#system-diagram" title="Permanent link">&para;</a></h2>
936
+<pre class="mermaid"><code>graph TB
937
+ subgraph Internet
938
+ User[User / Browser]
939
+ end
940
+
941
+ subgraph Fossilrepo Server
942
+ Caddy[Caddy&lt;br/&gt;SSL + Routing]
943
+ Django[Django&lt;br/&gt;Management UI]
944
+ Fossil[Fossil Server&lt;br/&gt;--repolist]
945
+ Celery[Celery Workers]
946
+ Redis[Redis]
947
+ Postgres[(PostgreSQL)]
948
+ Litestream[Litestream]
949
+ end
950
+
951
+ subgraph Storage
952
+ Repos["/data/repos/&lt;br/&gt;*.fossil files"]
953
+ S3[(S3 / MinIO)]
954
+ end
955
+
956
+ subgraph Mirrors
957
+ GitHub[GitHub]
958
+ GitLab[GitLab]
959
+ end
960
+
961
+ User --&gt; Caddy
962
+ Caddy --&gt;|"app.domain.com"| Django
963
+ Caddy --&gt;|"repo.domain.com"| Fossil
964
+ Django --&gt; Postgres
965
+ Django --&gt; Redis
966
+ Celery --&gt; Redis
967
+ Celery --&gt;|sync bridge| GitHub
968
+ Celery --&gt;|sync bridge| GitLab
969
+ Fossil --&gt; Repos
970
+ Litestream --&gt; Repos
971
+ Litestream --&gt; S3</code></pre>
972
+<h2 id="components">Components<a class="headerlink" href="#components" title="Permanent link">&para;</a></h2>
973
+<h3 id="fossil-server">Fossil Server<a class="headerlink" href="#fossil-server" title="Permanent link">&para;</a></h3>
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>
975
+<p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>
976
+<h3 id="caddy">Caddy<a class="headerlink" href="#caddy" title="Permanent link">&para;</a></h3>
977
+<p>Handles SSL termination and subdomain routing:</p>
978
+<ul>
979
+<li><code>your-domain.com</code> routes to the Django management UI</li>
980
+<li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li>
981
+</ul>
982
+<p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>
983
+<h3 id="django-management-layer">Django Management Layer<a class="headerlink" href="#django-management-layer" title="Permanent link">&para;</a></h3>
984
+<p>Provides the administrative interface:</p>
985
+<ul>
986
+<li>Repository lifecycle (create, configure, archive)</li>
987
+<li>User and organization management</li>
988
+<li>Dashboard and analytics</li>
989
+<li>Sync bridge configuration</li>
990
+</ul>
991
+<p>Django uses HTMX for interactive UI without a JavaScript framework.</p>
992
+<h3 id="litestream">Litestream<a class="headerlink" href="#litestream" title="Permanent link">&para;</a></h3>
993
+<p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p>
994
+<ul>
995
+<li><strong>Continuous backup</strong> -- WAL frames replicated in near-real-time</li>
996
+<li><strong>Point-in-time recovery</strong> -- restore to any moment, not just snapshots</li>
997
+<li><strong>Zero-config per repo</strong> -- new <code>.fossil</code> files are picked up automatically</li>
998
+</ul>
999
+<h3 id="celery-workers">Celery Workers<a class="headerlink" href="#celery-workers" title="Permanent link">&para;</a></h3>
1000
+<p>Handle background tasks:</p>
1001
+<ul>
1002
+<li>Sync bridge execution (Fossil to Git mirroring)</li>
1003
+<li>Scheduled sync jobs</li>
1004
+<li>Upstream pull operations</li>
1005
+</ul>
1006
+<h2 id="data-flow">Data Flow<a class="headerlink" href="#data-flow" title="Permanent link">&para;</a></h2>
1007
+<ol>
1008
+<li><strong>User pushes to Fossil</strong> -- standard <code>fossil push</code> or <code>fossil sync</code></li>
1009
+<li><strong>Fossil writes to <code>.fossil</code> file</strong> -- SQLite transactions</li>
1010
+<li><strong>Litestream replicates</strong> -- WAL frames streamed to S3</li>
1011
+<li><strong>Sync bridge runs</strong> -- Celery task mirrors changes to Git remotes</li>
1012
+<li><strong>Django reflects state</strong> -- reads from Fossil SQLite for dashboards</li>
1013
+</ol>
1014
+<p>Fossil is always the source of truth. Everything else is derived.</p>
1015
+
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+
1026
+
1027
+
1028
+ </article>
1029
+ </div>
1030
+
1031
+
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>
1033
+
1034
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1035
+ </div>
1036
+
1037
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1038
+
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>
1040
+ Back to top
1041
+</button>
1042
+
1043
+ </main>
1044
+
1045
+ <footer class="md-footer">
1046
+
1047
+ <div class="md-footer-meta md-typeset">
1048
+ <div class="md-footer-meta__inner md-grid">
1049
+ <div class="md-copyright">
1050
+
1051
+ <div class="md-copyright__highlight">
1052
+ Copyright &copy; 2026 CONFLICT LLC
1053
+ </div>
1054
+
1055
+
1056
+ Made with
1057
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1058
+ Material for MkDocs
1059
+ </a>
1060
+
1061
+</div>
1062
+
1063
+
1064
+<div class="md-social">
1065
+
1066
+
1067
+
1068
+
1069
+
1070
+
1071
+
1072
+
1073
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
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>
1075
+ </a>
1076
+
1077
+</div>
1078
+
1079
+ </div>
1080
+ </div>
1081
+</footer>
1082
+
1083
+ </div>
1084
+ <div class="md-dialog" data-md-component="dialog">
1085
+ <div class="md-dialog__inner md-typeset"></div>
1086
+ </div>
1087
+
1088
+
1089
+
1090
+
1091
+
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>
1093
+
1094
+
1095
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1096
+
1097
+
1098
+ </body>
1099
+</html>
--- a/site/architecture/overview/index.html
+++ b/site/architecture/overview/index.html
@@ -0,0 +1,1099 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/architecture/overview/index.html
+++ b/site/architecture/overview/index.html
@@ -0,0 +1,1099 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/architecture/overview/">
16
17
18 <link rel="prev" href="../../getting-started/first-repo/">
19
20
21 <link rel="next" href="../sync-bridge/">
22
23
24
25
26
27 <link rel="icon" href="../../assets/images/favicon.png">
28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
30
31
32 <title>Overview - Fossilrepo</title>
33
34
35
36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
38
39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
41
42
43
44
45
46
47
48
49
50
51
52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
56
57
58 <link rel="stylesheet" href="../../assets/css/custom.css">
59
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>
61
62
63
64
65
66 </head>
67
68
69
70
71
72
73
74
75
76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
78
79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81 <label class="md-overlay" for="__drawer"></label>
82 <div data-md-component="skip">
83
84
85 <a href="#architecture-overview" class="md-skip">
86 Skip to content
87 </a>
88
89 </div>
90 <div data-md-component="announce">
91
92 </div>
93
94
95
96
97 <header class="md-header" data-md-component="header">
98 <nav class="md-header__inner md-grid" aria-label="Header">
99 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100 <div style="display: flex; align-items: center; gap: 0.6rem;">
101 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103 </div>
104 </a>
105 <label class="md-header__button md-icon" for="__drawer">
106
107 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108 </label>
109 <div class="md-header__title" data-md-component="header-title">
110 <div class="md-header__ellipsis">
111 <div class="md-header__topic">
112 <span class="md-ellipsis">
113 Fossilrepo
114 </span>
115 </div>
116 <div class="md-header__topic" data-md-component="header-topic">
117 <span class="md-ellipsis">
118
119 Overview
120
121 </span>
122 </div>
123 </div>
124 </div>
125
126
127 <form class="md-header__option" data-md-component="palette">
128
129
130
131
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">
133
134 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136 </label>
137
138
139
140
141
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">
143
144 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146 </label>
147
148
149 </form>
150
151
152
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>
154
155
156
157
158
159 <label class="md-header__button md-icon" for="__search">
160
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>
162 </label>
163 <div class="md-search" data-md-component="search" role="dialog">
164 <label class="md-search__overlay" for="__search"></label>
165 <div class="md-search__inner" role="search">
166 <form class="md-search__form" name="search">
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>
168 <label class="md-search__icon md-icon" for="__search">
169
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>
171
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>
173 </label>
174 <nav class="md-search__options" aria-label="Search">
175
176 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
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>
179 </button>
180 </nav>
181
182 <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
184 </form>
185 <div class="md-search__output">
186 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187 <div class="md-search-result" data-md-component="search-result">
188 <div class="md-search-result__meta">
189 Initializing search
190 </div>
191 <ol class="md-search-result__list" role="presentation"></ol>
192 </div>
193 </div>
194 </div>
195 </div>
196 </div>
197
198
199
200 <div class="md-header__source">
201 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
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>
205 </div>
206 <div class="md-source__repository">
207 ConflictHQ/fossilrepo
208 </div>
209 </a>
210 </div>
211
212 </nav>
213
214 </header>
215
216 <div class="md-container" data-md-component="container">
217
218
219
220
221
222 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223 <div class="md-grid">
224 <ul class="md-tabs__list">
225
226
227
228
229
230
231 <li class="md-tabs__item">
232 <a href="../.." class="md-tabs__link">
233
234
235
236
237
238 Home
239
240 </a>
241 </li>
242
243
244
245
246
247
248
249
250
251
252 <li class="md-tabs__item">
253 <a href="../../getting-started/prerequisites/" class="md-tabs__link">
254
255
256
257 Getting Started
258
259 </a>
260 </li>
261
262
263
264
265
266
267
268
269
270
271
272
273
274 <li class="md-tabs__item md-tabs__item--active">
275 <a href="./" class="md-tabs__link">
276
277
278
279 Architecture
280
281 </a>
282 </li>
283
284
285
286
287 </ul>
288 </div>
289 </nav>
290
291
292
293 <main class="md-main" data-md-component="main">
294 <div class="md-main__inner md-grid">
295
296
297
298 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299 <div class="md-sidebar__scrollwrap">
300 <div class="md-sidebar__inner">
301
302
303
304
305
306
307 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308 <label class="md-nav__title" for="__drawer">
309 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310 <div style="display: flex; align-items: center; gap: 0.6rem;">
311 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313 </div>
314 </a>
315 Fossilrepo
316 </label>
317
318 <div class="md-nav__source">
319 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320 <div class="md-source__icon md-icon">
321
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>
323 </div>
324 <div class="md-source__repository">
325 ConflictHQ/fossilrepo
326 </div>
327 </a>
328 </div>
329
330 <ul class="md-nav__list" data-md-scrollfix>
331
332
333
334
335
336
337
338 <li class="md-nav__item">
339 <a href="../.." class="md-nav__link">
340
341
342
343 <span class="md-ellipsis">
344
345
346 Home
347
348
349
350 </span>
351
352
353
354 </a>
355 </li>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375 <li class="md-nav__item md-nav__item--nested">
376
377
378
379
380
381 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
382
383
384 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
385
386
387
388 <span class="md-ellipsis">
389
390
391 Getting Started
392
393
394
395 </span>
396
397
398
399 <span class="md-nav__icon md-icon"></span>
400 </label>
401
402 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
403 <label class="md-nav__title" for="__nav_2">
404 <span class="md-nav__icon md-icon"></span>
405
406
407 Getting Started
408
409
410 </label>
411 <ul class="md-nav__list" data-md-scrollfix>
412
413
414
415
416
417
418
419 <li class="md-nav__item">
420 <a href="../../getting-started/prerequisites/" class="md-nav__link">
421
422
423
424 <span class="md-ellipsis">
425
426
427 Prerequisites
428
429
430
431 </span>
432
433
434
435 </a>
436 </li>
437
438
439
440
441
442
443
444
445
446
447 <li class="md-nav__item">
448 <a href="../../getting-started/installation/" class="md-nav__link">
449
450
451
452 <span class="md-ellipsis">
453
454
455 Installation
456
457
458
459 </span>
460
461
462
463 </a>
464 </li>
465
466
467
468
469
470
471
472
473
474
475 <li class="md-nav__item">
476 <a href="../../getting-started/configuration/" class="md-nav__link">
477
478
479
480 <span class="md-ellipsis">
481
482
483 Configuration
484
485
486
487 </span>
488
489
490
491 </a>
492 </li>
493
494
495
496
497
498
499
500
501
502
503 <li class="md-nav__item">
504 <a href="../../getting-started/first-repo/" class="md-nav__link">
505
506
507
508 <span class="md-ellipsis">
509
510
511 First Repository
512
513
514
515 </span>
516
517
518
519 </a>
520 </li>
521
522
523
524
525 </ul>
526 </nav>
527
528 </li>
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
554
555
556
557 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
558
559
560 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
561
562
563
564 <span class="md-ellipsis">
565
566
567 Architecture
568
569
570
571 </span>
572
573
574
575 <span class="md-nav__icon md-icon"></span>
576 </label>
577
578 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
579 <label class="md-nav__title" for="__nav_3">
580 <span class="md-nav__icon md-icon"></span>
581
582
583 Architecture
584
585
586 </label>
587 <ul class="md-nav__list" data-md-scrollfix>
588
589
590
591
592
593
594
595
596
597 <li class="md-nav__item md-nav__item--active">
598
599 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
600
601
602
603
604
605 <label class="md-nav__link md-nav__link--active" for="__toc">
606
607
608
609 <span class="md-ellipsis">
610
611
612 Overview
613
614
615
616 </span>
617
618
619
620 <span class="md-nav__icon md-icon"></span>
621 </label>
622
623 <a href="./" class="md-nav__link md-nav__link--active">
624
625
626
627 <span class="md-ellipsis">
628
629
630 Overview
631
632
633
634 </span>
635
636
637
638 </a>
639
640
641
642 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
643
644
645
646
647
648
649 <label class="md-nav__title" for="__toc">
650 <span class="md-nav__icon md-icon"></span>
651 Table of contents
652 </label>
653 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
654
655 <li class="md-nav__item">
656 <a href="#system-diagram" class="md-nav__link">
657 <span class="md-ellipsis">
658
659 System Diagram
660
661 </span>
662 </a>
663
664 </li>
665
666 <li class="md-nav__item">
667 <a href="#components" class="md-nav__link">
668 <span class="md-ellipsis">
669
670 Components
671
672 </span>
673 </a>
674
675 <nav class="md-nav" aria-label="Components">
676 <ul class="md-nav__list">
677
678 <li class="md-nav__item">
679 <a href="#fossil-server" class="md-nav__link">
680 <span class="md-ellipsis">
681
682 Fossil Server
683
684 </span>
685 </a>
686
687 </li>
688
689 <li class="md-nav__item">
690 <a href="#caddy" class="md-nav__link">
691 <span class="md-ellipsis">
692
693 Caddy
694
695 </span>
696 </a>
697
698 </li>
699
700 <li class="md-nav__item">
701 <a href="#django-management-layer" class="md-nav__link">
702 <span class="md-ellipsis">
703
704 Django Management Layer
705
706 </span>
707 </a>
708
709 </li>
710
711 <li class="md-nav__item">
712 <a href="#litestream" class="md-nav__link">
713 <span class="md-ellipsis">
714
715 Litestream
716
717 </span>
718 </a>
719
720 </li>
721
722 <li class="md-nav__item">
723 <a href="#celery-workers" class="md-nav__link">
724 <span class="md-ellipsis">
725
726 Celery Workers
727
728 </span>
729 </a>
730
731 </li>
732
733 </ul>
734 </nav>
735
736 </li>
737
738 <li class="md-nav__item">
739 <a href="#data-flow" class="md-nav__link">
740 <span class="md-ellipsis">
741
742 Data Flow
743
744 </span>
745 </a>
746
747 </li>
748
749 </ul>
750
751 </nav>
752
753 </li>
754
755
756
757
758
759
760
761
762
763
764 <li class="md-nav__item">
765 <a href="../sync-bridge/" class="md-nav__link">
766
767
768
769 <span class="md-ellipsis">
770
771
772 Sync Bridge
773
774
775
776 </span>
777
778
779
780 </a>
781 </li>
782
783
784
785
786 </ul>
787 </nav>
788
789 </li>
790
791
792
793 </ul>
794 </nav>
795 </div>
796 </div>
797 </div>
798
799
800
801 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
802 <div class="md-sidebar__scrollwrap">
803 <div class="md-sidebar__inner">
804
805
806 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
807
808
809
810
811
812
813 <label class="md-nav__title" for="__toc">
814 <span class="md-nav__icon md-icon"></span>
815 Table of contents
816 </label>
817 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
818
819 <li class="md-nav__item">
820 <a href="#system-diagram" class="md-nav__link">
821 <span class="md-ellipsis">
822
823 System Diagram
824
825 </span>
826 </a>
827
828 </li>
829
830 <li class="md-nav__item">
831 <a href="#components" class="md-nav__link">
832 <span class="md-ellipsis">
833
834 Components
835
836 </span>
837 </a>
838
839 <nav class="md-nav" aria-label="Components">
840 <ul class="md-nav__list">
841
842 <li class="md-nav__item">
843 <a href="#fossil-server" class="md-nav__link">
844 <span class="md-ellipsis">
845
846 Fossil Server
847
848 </span>
849 </a>
850
851 </li>
852
853 <li class="md-nav__item">
854 <a href="#caddy" class="md-nav__link">
855 <span class="md-ellipsis">
856
857 Caddy
858
859 </span>
860 </a>
861
862 </li>
863
864 <li class="md-nav__item">
865 <a href="#django-management-layer" class="md-nav__link">
866 <span class="md-ellipsis">
867
868 Django Management Layer
869
870 </span>
871 </a>
872
873 </li>
874
875 <li class="md-nav__item">
876 <a href="#litestream" class="md-nav__link">
877 <span class="md-ellipsis">
878
879 Litestream
880
881 </span>
882 </a>
883
884 </li>
885
886 <li class="md-nav__item">
887 <a href="#celery-workers" class="md-nav__link">
888 <span class="md-ellipsis">
889
890 Celery Workers
891
892 </span>
893 </a>
894
895 </li>
896
897 </ul>
898 </nav>
899
900 </li>
901
902 <li class="md-nav__item">
903 <a href="#data-flow" class="md-nav__link">
904 <span class="md-ellipsis">
905
906 Data Flow
907
908 </span>
909 </a>
910
911 </li>
912
913 </ul>
914
915 </nav>
916 </div>
917 </div>
918 </div>
919
920
921
922 <div class="md-content" data-md-component="content">
923
924 <article class="md-content__inner md-typeset">
925
926
927
928
929
930
931
932
933 <h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">&para;</a></h1>
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>
935 <h2 id="system-diagram">System Diagram<a class="headerlink" href="#system-diagram" title="Permanent link">&para;</a></h2>
936 <pre class="mermaid"><code>graph TB
937 subgraph Internet
938 User[User / Browser]
939 end
940
941 subgraph Fossilrepo Server
942 Caddy[Caddy&lt;br/&gt;SSL + Routing]
943 Django[Django&lt;br/&gt;Management UI]
944 Fossil[Fossil Server&lt;br/&gt;--repolist]
945 Celery[Celery Workers]
946 Redis[Redis]
947 Postgres[(PostgreSQL)]
948 Litestream[Litestream]
949 end
950
951 subgraph Storage
952 Repos["/data/repos/&lt;br/&gt;*.fossil files"]
953 S3[(S3 / MinIO)]
954 end
955
956 subgraph Mirrors
957 GitHub[GitHub]
958 GitLab[GitLab]
959 end
960
961 User --&gt; Caddy
962 Caddy --&gt;|"app.domain.com"| Django
963 Caddy --&gt;|"repo.domain.com"| Fossil
964 Django --&gt; Postgres
965 Django --&gt; Redis
966 Celery --&gt; Redis
967 Celery --&gt;|sync bridge| GitHub
968 Celery --&gt;|sync bridge| GitLab
969 Fossil --&gt; Repos
970 Litestream --&gt; Repos
971 Litestream --&gt; S3</code></pre>
972 <h2 id="components">Components<a class="headerlink" href="#components" title="Permanent link">&para;</a></h2>
973 <h3 id="fossil-server">Fossil Server<a class="headerlink" href="#fossil-server" title="Permanent link">&para;</a></h3>
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>
975 <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>
976 <h3 id="caddy">Caddy<a class="headerlink" href="#caddy" title="Permanent link">&para;</a></h3>
977 <p>Handles SSL termination and subdomain routing:</p>
978 <ul>
979 <li><code>your-domain.com</code> routes to the Django management UI</li>
980 <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li>
981 </ul>
982 <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>
983 <h3 id="django-management-layer">Django Management Layer<a class="headerlink" href="#django-management-layer" title="Permanent link">&para;</a></h3>
984 <p>Provides the administrative interface:</p>
985 <ul>
986 <li>Repository lifecycle (create, configure, archive)</li>
987 <li>User and organization management</li>
988 <li>Dashboard and analytics</li>
989 <li>Sync bridge configuration</li>
990 </ul>
991 <p>Django uses HTMX for interactive UI without a JavaScript framework.</p>
992 <h3 id="litestream">Litestream<a class="headerlink" href="#litestream" title="Permanent link">&para;</a></h3>
993 <p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p>
994 <ul>
995 <li><strong>Continuous backup</strong> -- WAL frames replicated in near-real-time</li>
996 <li><strong>Point-in-time recovery</strong> -- restore to any moment, not just snapshots</li>
997 <li><strong>Zero-config per repo</strong> -- new <code>.fossil</code> files are picked up automatically</li>
998 </ul>
999 <h3 id="celery-workers">Celery Workers<a class="headerlink" href="#celery-workers" title="Permanent link">&para;</a></h3>
1000 <p>Handle background tasks:</p>
1001 <ul>
1002 <li>Sync bridge execution (Fossil to Git mirroring)</li>
1003 <li>Scheduled sync jobs</li>
1004 <li>Upstream pull operations</li>
1005 </ul>
1006 <h2 id="data-flow">Data Flow<a class="headerlink" href="#data-flow" title="Permanent link">&para;</a></h2>
1007 <ol>
1008 <li><strong>User pushes to Fossil</strong> -- standard <code>fossil push</code> or <code>fossil sync</code></li>
1009 <li><strong>Fossil writes to <code>.fossil</code> file</strong> -- SQLite transactions</li>
1010 <li><strong>Litestream replicates</strong> -- WAL frames streamed to S3</li>
1011 <li><strong>Sync bridge runs</strong> -- Celery task mirrors changes to Git remotes</li>
1012 <li><strong>Django reflects state</strong> -- reads from Fossil SQLite for dashboards</li>
1013 </ol>
1014 <p>Fossil is always the source of truth. Everything else is derived.</p>
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028 </article>
1029 </div>
1030
1031
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>
1033
1034 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1035 </div>
1036
1037 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1038
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>
1040 Back to top
1041 </button>
1042
1043 </main>
1044
1045 <footer class="md-footer">
1046
1047 <div class="md-footer-meta md-typeset">
1048 <div class="md-footer-meta__inner md-grid">
1049 <div class="md-copyright">
1050
1051 <div class="md-copyright__highlight">
1052 Copyright &copy; 2026 CONFLICT LLC
1053 </div>
1054
1055
1056 Made with
1057 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1058 Material for MkDocs
1059 </a>
1060
1061 </div>
1062
1063
1064 <div class="md-social">
1065
1066
1067
1068
1069
1070
1071
1072
1073 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
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>
1075 </a>
1076
1077 </div>
1078
1079 </div>
1080 </div>
1081 </footer>
1082
1083 </div>
1084 <div class="md-dialog" data-md-component="dialog">
1085 <div class="md-dialog__inner md-typeset"></div>
1086 </div>
1087
1088
1089
1090
1091
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>
1093
1094
1095 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1096
1097
1098 </body>
1099 </html>
--- a/site/architecture/sync-bridge/index.html
+++ b/site/architecture/sync-bridge/index.html
@@ -0,0 +1,1077 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/architecture/sync-bridge/">
16
+
17
+
18
+ <link rel="prev" href="../overview/">
19
+
20
+
21
+
22
+
23
+
24
+
25
+ <link rel="icon" href="../../assets/images/favicon.png">
26
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
27
+
28
+
29
+
30
+ <title>Sync Bridge - Fossilrepo</title>
31
+
32
+
33
+
34
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
35
+
36
+
37
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
52
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
53
+
54
+
55
+
56
+ <link rel="stylesheet" href="../../assets/css/custom.css">
57
+
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>
59
+
60
+
61
+
62
+
63
+
64
+ </head>
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
+
76
+
77
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
78
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
79
+ <label class="md-overlay" for="__drawer"></label>
80
+ <div data-md-component="skip">
81
+
82
+
83
+ <a href="#sync-bridge" class="md-skip">
84
+ Skip to content
85
+ </a>
86
+
87
+ </div>
88
+ <div data-md-component="announce">
89
+
90
+ </div>
91
+
92
+
93
+
94
+
95
+<header class="md-header" data-md-component="header">
96
+ <nav class="md-header__inner md-grid" aria-label="Header">
97
+ <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
98
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
99
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
100
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
101
+</div>
102
+ </a>
103
+ <label class="md-header__button md-icon" for="__drawer">
104
+
105
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
106
+ </label>
107
+ <div class="md-header__title" data-md-component="header-title">
108
+ <div class="md-header__ellipsis">
109
+ <div class="md-header__topic">
110
+ <span class="md-ellipsis">
111
+ Fossilrepo
112
+ </span>
113
+ </div>
114
+ <div class="md-header__topic" data-md-component="header-topic">
115
+ <span class="md-ellipsis">
116
+
117
+ Sync Bridge
118
+
119
+ </span>
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+
125
+ <form class="md-header__option" data-md-component="palette">
126
+
127
+
128
+
129
+
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">
131
+
132
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
134
+ </label>
135
+
136
+
137
+
138
+
139
+
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">
141
+
142
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
144
+ </label>
145
+
146
+
147
+</form>
148
+
149
+
150
+
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>
152
+
153
+
154
+
155
+
156
+
157
+ <label class="md-header__button md-icon" for="__search">
158
+
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>
160
+ </label>
161
+ <div class="md-search" data-md-component="search" role="dialog">
162
+ <label class="md-search__overlay" for="__search"></label>
163
+ <div class="md-search__inner" role="search">
164
+ <form class="md-search__form" name="search">
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>
166
+ <label class="md-search__icon md-icon" for="__search">
167
+
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>
169
+
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>
171
+ </label>
172
+ <nav class="md-search__options" aria-label="Search">
173
+
174
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
175
+
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>
177
+ </button>
178
+ </nav>
179
+
180
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
181
+
182
+ </form>
183
+ <div class="md-search__output">
184
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
185
+ <div class="md-search-result" data-md-component="search-result">
186
+ <div class="md-search-result__meta">
187
+ Initializing search
188
+ </div>
189
+ <ol class="md-search-result__list" role="presentation"></ol>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </div>
194
+</div>
195
+
196
+
197
+
198
+ <div class="md-header__source">
199
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
200
+ <div class="md-source__icon md-icon">
201
+
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>
203
+ </div>
204
+ <div class="md-source__repository">
205
+ ConflictHQ/fossilrepo
206
+ </div>
207
+</a>
208
+ </div>
209
+
210
+ </nav>
211
+
212
+</header>
213
+
214
+ <div class="md-container" data-md-component="container">
215
+
216
+
217
+
218
+
219
+
220
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
221
+ <div class="md-grid">
222
+ <ul class="md-tabs__list">
223
+
224
+
225
+
226
+
227
+
228
+
229
+ <li class="md-tabs__item">
230
+ <a href="../.." class="md-tabs__link">
231
+
232
+
233
+
234
+
235
+
236
+ Home
237
+
238
+ </a>
239
+ </li>
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+ <li class="md-tabs__item">
251
+ <a href="../../getting-started/prerequisites/" class="md-tabs__link">
252
+
253
+
254
+
255
+ Getting Started
256
+
257
+ </a>
258
+ </li>
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+ <li class="md-tabs__item md-tabs__item--active">
273
+ <a href="../overview/" class="md-tabs__link">
274
+
275
+
276
+
277
+ Architecture
278
+
279
+ </a>
280
+ </li>
281
+
282
+
283
+
284
+
285
+ </ul>
286
+ </div>
287
+</nav>
288
+
289
+
290
+
291
+ <main class="md-main" data-md-component="main">
292
+ <div class="md-main__inner md-grid">
293
+
294
+
295
+
296
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
297
+ <div class="md-sidebar__scrollwrap">
298
+ <div class="md-sidebar__inner">
299
+
300
+
301
+
302
+
303
+
304
+
305
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
306
+ <label class="md-nav__title" for="__drawer">
307
+ <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
308
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
309
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
310
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
311
+</div>
312
+ </a>
313
+ Fossilrepo
314
+ </label>
315
+
316
+ <div class="md-nav__source">
317
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
318
+ <div class="md-source__icon md-icon">
319
+
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>
321
+ </div>
322
+ <div class="md-source__repository">
323
+ ConflictHQ/fossilrepo
324
+ </div>
325
+</a>
326
+ </div>
327
+
328
+ <ul class="md-nav__list" data-md-scrollfix>
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+ <li class="md-nav__item">
337
+ <a href="../.." class="md-nav__link">
338
+
339
+
340
+
341
+ <span class="md-ellipsis">
342
+
343
+
344
+ Home
345
+
346
+
347
+
348
+ </span>
349
+
350
+
351
+
352
+ </a>
353
+ </li>
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+ <li class="md-nav__item md-nav__item--nested">
374
+
375
+
376
+
377
+
378
+
379
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
380
+
381
+
382
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
383
+
384
+
385
+
386
+ <span class="md-ellipsis">
387
+
388
+
389
+ Getting Started
390
+
391
+
392
+
393
+ </span>
394
+
395
+
396
+
397
+ <span class="md-nav__icon md-icon"></span>
398
+ </label>
399
+
400
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
401
+ <label class="md-nav__title" for="__nav_2">
402
+ <span class="md-nav__icon md-icon"></span>
403
+
404
+
405
+ Getting Started
406
+
407
+
408
+ </label>
409
+ <ul class="md-nav__list" data-md-scrollfix>
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+ <li class="md-nav__item">
418
+ <a href="../../getting-started/prerequisites/" class="md-nav__link">
419
+
420
+
421
+
422
+ <span class="md-ellipsis">
423
+
424
+
425
+ Prerequisites
426
+
427
+
428
+
429
+ </span>
430
+
431
+
432
+
433
+ </a>
434
+ </li>
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+ <li class="md-nav__item">
446
+ <a href="../../getting-started/installation/" class="md-nav__link">
447
+
448
+
449
+
450
+ <span class="md-ellipsis">
451
+
452
+
453
+ Installation
454
+
455
+
456
+
457
+ </span>
458
+
459
+
460
+
461
+ </a>
462
+ </li>
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+ <li class="md-nav__item">
474
+ <a href="../../getting-started/configuration/" class="md-nav__link">
475
+
476
+
477
+
478
+ <span class="md-ellipsis">
479
+
480
+
481
+ Configuration
482
+
483
+
484
+
485
+ </span>
486
+
487
+
488
+
489
+ </a>
490
+ </li>
491
+
492
+
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+ <li class="md-nav__item">
502
+ <a href="../../getting-started/first-repo/" class="md-nav__link">
503
+
504
+
505
+
506
+ <span class="md-ellipsis">
507
+
508
+
509
+ First Repository
510
+
511
+
512
+
513
+ </span>
514
+
515
+
516
+
517
+ </a>
518
+ </li>
519
+
520
+
521
+
522
+
523
+ </ul>
524
+ </nav>
525
+
526
+ </li>
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
552
+
553
+
554
+
555
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
556
+
557
+
558
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
559
+
560
+
561
+
562
+ <span class="md-ellipsis">
563
+
564
+
565
+ Architecture
566
+
567
+
568
+
569
+ </span>
570
+
571
+
572
+
573
+ <span class="md-nav__icon md-icon"></span>
574
+ </label>
575
+
576
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
577
+ <label class="md-nav__title" for="__nav_3">
578
+ <span class="md-nav__icon md-icon"></span>
579
+
580
+
581
+ Architecture
582
+
583
+
584
+ </label>
585
+ <ul class="md-nav__list" data-md-scrollfix>
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+ <li class="md-nav__item">
594
+ <a href="../overview/" class="md-nav__link">
595
+
596
+
597
+
598
+ <span class="md-ellipsis">
599
+
600
+
601
+ Overview
602
+
603
+
604
+
605
+ </span>
606
+
607
+
608
+
609
+ </a>
610
+ </li>
611
+
612
+
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+
622
+
623
+ <li class="md-nav__item md-nav__item--active">
624
+
625
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
626
+
627
+
628
+
629
+
630
+
631
+ <label class="md-nav__link md-nav__link--active" for="__toc">
632
+
633
+
634
+
635
+ <span class="md-ellipsis">
636
+
637
+
638
+ Sync Bridge
639
+
640
+
641
+
642
+ </span>
643
+
644
+
645
+
646
+ <span class="md-nav__icon md-icon"></span>
647
+ </label>
648
+
649
+ <a href="./" class="md-nav__link md-nav__link--active">
650
+
651
+
652
+
653
+ <span class="md-ellipsis">
654
+
655
+
656
+ Sync Bridge
657
+
658
+
659
+
660
+ </span>
661
+
662
+
663
+
664
+ </a>
665
+
666
+
667
+
668
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
669
+
670
+
671
+
672
+
673
+
674
+
675
+ <label class="md-nav__title" for="__toc">
676
+ <span class="md-nav__icon md-icon"></span>
677
+ Table of contents
678
+ </label>
679
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
680
+
681
+ <li class="md-nav__item">
682
+ <a href="#how-it-works" class="md-nav__link">
683
+ <span class="md-ellipsis">
684
+
685
+ How It Works
686
+
687
+ </span>
688
+ </a>
689
+
690
+</li>
691
+
692
+ <li class="md-nav__item">
693
+ <a href="#what-gets-synced" class="md-nav__link">
694
+ <span class="md-ellipsis">
695
+
696
+ What Gets Synced
697
+
698
+ </span>
699
+ </a>
700
+
701
+</li>
702
+
703
+ <li class="md-nav__item">
704
+ <a href="#configuration" class="md-nav__link">
705
+ <span class="md-ellipsis">
706
+
707
+ Configuration
708
+
709
+ </span>
710
+ </a>
711
+
712
+</li>
713
+
714
+ <li class="md-nav__item">
715
+ <a href="#sync-modes" class="md-nav__link">
716
+ <span class="md-ellipsis">
717
+
718
+ Sync Modes
719
+
720
+ </span>
721
+ </a>
722
+
723
+ <nav class="md-nav" aria-label="Sync Modes">
724
+ <ul class="md-nav__list">
725
+
726
+ <li class="md-nav__item">
727
+ <a href="#on-demand" class="md-nav__link">
728
+ <span class="md-ellipsis">
729
+
730
+ On-Demand
731
+
732
+ </span>
733
+ </a>
734
+
735
+</li>
736
+
737
+ <li class="md-nav__item">
738
+ <a href="#scheduled" class="md-nav__link">
739
+ <span class="md-ellipsis">
740
+
741
+ Scheduled
742
+
743
+ </span>
744
+ </a>
745
+
746
+</li>
747
+
748
+ <li class="md-nav__item">
749
+ <a href="#upstream-pull" class="md-nav__link">
750
+ <span class="md-ellipsis">
751
+
752
+ Upstream Pull
753
+
754
+ </span>
755
+ </a>
756
+
757
+</li>
758
+
759
+ </ul>
760
+ </nav>
761
+
762
+</li>
763
+
764
+ </ul>
765
+
766
+</nav>
767
+
768
+ </li>
769
+
770
+
771
+
772
+
773
+ </ul>
774
+ </nav>
775
+
776
+ </li>
777
+
778
+
779
+
780
+ </ul>
781
+</nav>
782
+ </div>
783
+ </div>
784
+ </div>
785
+
786
+
787
+
788
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
789
+ <div class="md-sidebar__scrollwrap">
790
+ <div class="md-sidebar__inner">
791
+
792
+
793
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
794
+
795
+
796
+
797
+
798
+
799
+
800
+ <label class="md-nav__title" for="__toc">
801
+ <span class="md-nav__icon md-icon"></span>
802
+ Table of contents
803
+ </label>
804
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
805
+
806
+ <li class="md-nav__item">
807
+ <a href="#how-it-works" class="md-nav__link">
808
+ <span class="md-ellipsis">
809
+
810
+ How It Works
811
+
812
+ </span>
813
+ </a>
814
+
815
+</li>
816
+
817
+ <li class="md-nav__item">
818
+ <a href="#what-gets-synced" class="md-nav__link">
819
+ <span class="md-ellipsis">
820
+
821
+ What Gets Synced
822
+
823
+ </span>
824
+ </a>
825
+
826
+</li>
827
+
828
+ <li class="md-nav__item">
829
+ <a href="#configuration" class="md-nav__link">
830
+ <span class="md-ellipsis">
831
+
832
+ Configuration
833
+
834
+ </span>
835
+ </a>
836
+
837
+</li>
838
+
839
+ <li class="md-nav__item">
840
+ <a href="#sync-modes" class="md-nav__link">
841
+ <span class="md-ellipsis">
842
+
843
+ Sync Modes
844
+
845
+ </span>
846
+ </a>
847
+
848
+ <nav class="md-nav" aria-label="Sync Modes">
849
+ <ul class="md-nav__list">
850
+
851
+ <li class="md-nav__item">
852
+ <a href="#on-demand" class="md-nav__link">
853
+ <span class="md-ellipsis">
854
+
855
+ On-Demand
856
+
857
+ </span>
858
+ </a>
859
+
860
+</li>
861
+
862
+ <li class="md-nav__item">
863
+ <a href="#scheduled" class="md-nav__link">
864
+ <span class="md-ellipsis">
865
+
866
+ Scheduled
867
+
868
+ </span>
869
+ </a>
870
+
871
+</li>
872
+
873
+ <li class="md-nav__item">
874
+ <a href="#upstream-pull" class="md-nav__link">
875
+ <span class="md-ellipsis">
876
+
877
+ Upstream Pull
878
+
879
+ </span>
880
+ </a>
881
+
882
+</li>
883
+
884
+ </ul>
885
+ </nav>
886
+
887
+</li>
888
+
889
+ </ul>
890
+
891
+</nav>
892
+ </div>
893
+ </div>
894
+ </div>
895
+
896
+
897
+
898
+ <div class="md-content" data-md-component="content">
899
+
900
+ <article class="md-content__inner md-typeset">
901
+
902
+
903
+
904
+
905
+
906
+
907
+
908
+
909
+<h1 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">&para;</a></h1>
910
+<p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>
911
+<h2 id="how-it-works">How It Works<a class="headerlink" href="#how-it-works" title="Permanent link">&para;</a></h2>
912
+<pre class="mermaid"><code>flowchart LR
913
+ Fossil["Fossil Repo&lt;br/&gt;(source of truth)"] --&gt; Bridge["Sync Bridge&lt;br/&gt;(Celery task)"]
914
+ Bridge --&gt; Git["Git Export"]
915
+ Git --&gt; GitHub["GitHub Mirror"]
916
+ Git --&gt; GitLab["GitLab Mirror"]</code></pre>
917
+<p>The bridge:</p>
918
+<ol>
919
+<li>Exports Fossil commits as Git commits</li>
920
+<li>Pushes to configured Git remotes</li>
921
+<li>Optionally syncs tickets to GitHub/GitLab Issues</li>
922
+<li>Optionally syncs wiki pages to repo docs</li>
923
+</ol>
924
+<h2 id="what-gets-synced">What Gets Synced<a class="headerlink" href="#what-gets-synced" title="Permanent link">&para;</a></h2>
925
+<table>
926
+<thead>
927
+<tr>
928
+<th>Fossil Artifact</th>
929
+<th>Git Target</th>
930
+<th>Configurable</th>
931
+</tr>
932
+</thead>
933
+<tbody>
934
+<tr>
935
+<td>Commits</td>
936
+<td>Git commits</td>
937
+<td>Always</td>
938
+</tr>
939
+<tr>
940
+<td>Tags</td>
941
+<td>Git tags</td>
942
+<td>Always</td>
943
+</tr>
944
+<tr>
945
+<td>Branches</td>
946
+<td>Git branches</td>
947
+<td>Always</td>
948
+</tr>
949
+<tr>
950
+<td>Tickets</td>
951
+<td>GitHub/GitLab Issues</td>
952
+<td>Optional</td>
953
+</tr>
954
+<tr>
955
+<td>Wiki</td>
956
+<td>Repository docs</td>
957
+<td>Optional</td>
958
+</tr>
959
+</tbody>
960
+</table>
961
+<h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h2>
962
+<p>Set up mirroring through the Django management UI or environment variables:</p>
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>
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
965
+<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
966
+<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># GitLab mirror</span>
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
968
+</code></pre></div>
969
+<p>Per-repository mirror configuration is managed in the dashboard under <strong>Repository Settings &gt; Sync</strong>.</p>
970
+<h2 id="sync-modes">Sync Modes<a class="headerlink" href="#sync-modes" title="Permanent link">&para;</a></h2>
971
+<h3 id="on-demand">On-Demand<a class="headerlink" href="#on-demand" title="Permanent link">&para;</a></h3>
972
+<p>Trigger a sync manually from the dashboard or CLI:</p>
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
974
+</code></pre></div>
975
+<h3 id="scheduled">Scheduled<a class="headerlink" href="#scheduled" title="Permanent link">&para;</a></h3>
976
+<p>Configure a Celery Beat schedule to sync at regular intervals:</p>
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>
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>
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>
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>
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>
982
+<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="p">},</span>
983
+<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="p">}</span>
984
+</code></pre></div>
985
+<h3 id="upstream-pull">Upstream Pull<a class="headerlink" href="#upstream-pull" title="Permanent link">&para;</a></h3>
986
+<p>Pull updates from a remote Fossil server into your local instance:</p>
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
988
+</code></pre></div>
989
+<div class="admonition warning">
990
+<p class="admonition-title">Direction matters</p>
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>
992
+</div>
993
+
994
+
995
+
996
+
997
+
998
+
999
+
1000
+
1001
+
1002
+
1003
+
1004
+
1005
+
1006
+ </article>
1007
+ </div>
1008
+
1009
+
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>
1011
+
1012
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1013
+ </div>
1014
+
1015
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1016
+
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>
1018
+ Back to top
1019
+</button>
1020
+
1021
+ </main>
1022
+
1023
+ <footer class="md-footer">
1024
+
1025
+ <div class="md-footer-meta md-typeset">
1026
+ <div class="md-footer-meta__inner md-grid">
1027
+ <div class="md-copyright">
1028
+
1029
+ <div class="md-copyright__highlight">
1030
+ Copyright &copy; 2026 CONFLICT LLC
1031
+ </div>
1032
+
1033
+
1034
+ Made with
1035
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1036
+ Material for MkDocs
1037
+ </a>
1038
+
1039
+</div>
1040
+
1041
+
1042
+<div class="md-social">
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
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>
1053
+ </a>
1054
+
1055
+</div>
1056
+
1057
+ </div>
1058
+ </div>
1059
+</footer>
1060
+
1061
+ </div>
1062
+ <div class="md-dialog" data-md-component="dialog">
1063
+ <div class="md-dialog__inner md-typeset"></div>
1064
+ </div>
1065
+
1066
+
1067
+
1068
+
1069
+
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>
1071
+
1072
+
1073
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1074
+
1075
+
1076
+ </body>
1077
+</html>
--- a/site/architecture/sync-bridge/index.html
+++ b/site/architecture/sync-bridge/index.html
@@ -0,0 +1,1077 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/architecture/sync-bridge/index.html
+++ b/site/architecture/sync-bridge/index.html
@@ -0,0 +1,1077 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/architecture/sync-bridge/">
16
17
18 <link rel="prev" href="../overview/">
19
20
21
22
23
24
25 <link rel="icon" href="../../assets/images/favicon.png">
26 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
27
28
29
30 <title>Sync Bridge - Fossilrepo</title>
31
32
33
34 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
35
36
37 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
38
39
40
41
42
43
44
45
46
47
48
49
50 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
52 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
53
54
55
56 <link rel="stylesheet" href="../../assets/css/custom.css">
57
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>
59
60
61
62
63
64 </head>
65
66
67
68
69
70
71
72
73
74 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
76
77 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
78 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
79 <label class="md-overlay" for="__drawer"></label>
80 <div data-md-component="skip">
81
82
83 <a href="#sync-bridge" class="md-skip">
84 Skip to content
85 </a>
86
87 </div>
88 <div data-md-component="announce">
89
90 </div>
91
92
93
94
95 <header class="md-header" data-md-component="header">
96 <nav class="md-header__inner md-grid" aria-label="Header">
97 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
98 <div style="display: flex; align-items: center; gap: 0.6rem;">
99 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
100 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
101 </div>
102 </a>
103 <label class="md-header__button md-icon" for="__drawer">
104
105 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
106 </label>
107 <div class="md-header__title" data-md-component="header-title">
108 <div class="md-header__ellipsis">
109 <div class="md-header__topic">
110 <span class="md-ellipsis">
111 Fossilrepo
112 </span>
113 </div>
114 <div class="md-header__topic" data-md-component="header-topic">
115 <span class="md-ellipsis">
116
117 Sync Bridge
118
119 </span>
120 </div>
121 </div>
122 </div>
123
124
125 <form class="md-header__option" data-md-component="palette">
126
127
128
129
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">
131
132 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
134 </label>
135
136
137
138
139
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">
141
142 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
144 </label>
145
146
147 </form>
148
149
150
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>
152
153
154
155
156
157 <label class="md-header__button md-icon" for="__search">
158
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>
160 </label>
161 <div class="md-search" data-md-component="search" role="dialog">
162 <label class="md-search__overlay" for="__search"></label>
163 <div class="md-search__inner" role="search">
164 <form class="md-search__form" name="search">
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>
166 <label class="md-search__icon md-icon" for="__search">
167
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>
169
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>
171 </label>
172 <nav class="md-search__options" aria-label="Search">
173
174 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
175
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>
177 </button>
178 </nav>
179
180 <div class="md-search__suggest" data-md-component="search-suggest"></div>
181
182 </form>
183 <div class="md-search__output">
184 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
185 <div class="md-search-result" data-md-component="search-result">
186 <div class="md-search-result__meta">
187 Initializing search
188 </div>
189 <ol class="md-search-result__list" role="presentation"></ol>
190 </div>
191 </div>
192 </div>
193 </div>
194 </div>
195
196
197
198 <div class="md-header__source">
199 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
200 <div class="md-source__icon md-icon">
201
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>
203 </div>
204 <div class="md-source__repository">
205 ConflictHQ/fossilrepo
206 </div>
207 </a>
208 </div>
209
210 </nav>
211
212 </header>
213
214 <div class="md-container" data-md-component="container">
215
216
217
218
219
220 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
221 <div class="md-grid">
222 <ul class="md-tabs__list">
223
224
225
226
227
228
229 <li class="md-tabs__item">
230 <a href="../.." class="md-tabs__link">
231
232
233
234
235
236 Home
237
238 </a>
239 </li>
240
241
242
243
244
245
246
247
248
249
250 <li class="md-tabs__item">
251 <a href="../../getting-started/prerequisites/" class="md-tabs__link">
252
253
254
255 Getting Started
256
257 </a>
258 </li>
259
260
261
262
263
264
265
266
267
268
269
270
271
272 <li class="md-tabs__item md-tabs__item--active">
273 <a href="../overview/" class="md-tabs__link">
274
275
276
277 Architecture
278
279 </a>
280 </li>
281
282
283
284
285 </ul>
286 </div>
287 </nav>
288
289
290
291 <main class="md-main" data-md-component="main">
292 <div class="md-main__inner md-grid">
293
294
295
296 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
297 <div class="md-sidebar__scrollwrap">
298 <div class="md-sidebar__inner">
299
300
301
302
303
304
305 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
306 <label class="md-nav__title" for="__drawer">
307 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
308 <div style="display: flex; align-items: center; gap: 0.6rem;">
309 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
310 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
311 </div>
312 </a>
313 Fossilrepo
314 </label>
315
316 <div class="md-nav__source">
317 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
318 <div class="md-source__icon md-icon">
319
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>
321 </div>
322 <div class="md-source__repository">
323 ConflictHQ/fossilrepo
324 </div>
325 </a>
326 </div>
327
328 <ul class="md-nav__list" data-md-scrollfix>
329
330
331
332
333
334
335
336 <li class="md-nav__item">
337 <a href="../.." class="md-nav__link">
338
339
340
341 <span class="md-ellipsis">
342
343
344 Home
345
346
347
348 </span>
349
350
351
352 </a>
353 </li>
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373 <li class="md-nav__item md-nav__item--nested">
374
375
376
377
378
379 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
380
381
382 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
383
384
385
386 <span class="md-ellipsis">
387
388
389 Getting Started
390
391
392
393 </span>
394
395
396
397 <span class="md-nav__icon md-icon"></span>
398 </label>
399
400 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
401 <label class="md-nav__title" for="__nav_2">
402 <span class="md-nav__icon md-icon"></span>
403
404
405 Getting Started
406
407
408 </label>
409 <ul class="md-nav__list" data-md-scrollfix>
410
411
412
413
414
415
416
417 <li class="md-nav__item">
418 <a href="../../getting-started/prerequisites/" class="md-nav__link">
419
420
421
422 <span class="md-ellipsis">
423
424
425 Prerequisites
426
427
428
429 </span>
430
431
432
433 </a>
434 </li>
435
436
437
438
439
440
441
442
443
444
445 <li class="md-nav__item">
446 <a href="../../getting-started/installation/" class="md-nav__link">
447
448
449
450 <span class="md-ellipsis">
451
452
453 Installation
454
455
456
457 </span>
458
459
460
461 </a>
462 </li>
463
464
465
466
467
468
469
470
471
472
473 <li class="md-nav__item">
474 <a href="../../getting-started/configuration/" class="md-nav__link">
475
476
477
478 <span class="md-ellipsis">
479
480
481 Configuration
482
483
484
485 </span>
486
487
488
489 </a>
490 </li>
491
492
493
494
495
496
497
498
499
500
501 <li class="md-nav__item">
502 <a href="../../getting-started/first-repo/" class="md-nav__link">
503
504
505
506 <span class="md-ellipsis">
507
508
509 First Repository
510
511
512
513 </span>
514
515
516
517 </a>
518 </li>
519
520
521
522
523 </ul>
524 </nav>
525
526 </li>
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
552
553
554
555 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
556
557
558 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
559
560
561
562 <span class="md-ellipsis">
563
564
565 Architecture
566
567
568
569 </span>
570
571
572
573 <span class="md-nav__icon md-icon"></span>
574 </label>
575
576 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
577 <label class="md-nav__title" for="__nav_3">
578 <span class="md-nav__icon md-icon"></span>
579
580
581 Architecture
582
583
584 </label>
585 <ul class="md-nav__list" data-md-scrollfix>
586
587
588
589
590
591
592
593 <li class="md-nav__item">
594 <a href="../overview/" class="md-nav__link">
595
596
597
598 <span class="md-ellipsis">
599
600
601 Overview
602
603
604
605 </span>
606
607
608
609 </a>
610 </li>
611
612
613
614
615
616
617
618
619
620
621
622
623 <li class="md-nav__item md-nav__item--active">
624
625 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
626
627
628
629
630
631 <label class="md-nav__link md-nav__link--active" for="__toc">
632
633
634
635 <span class="md-ellipsis">
636
637
638 Sync Bridge
639
640
641
642 </span>
643
644
645
646 <span class="md-nav__icon md-icon"></span>
647 </label>
648
649 <a href="./" class="md-nav__link md-nav__link--active">
650
651
652
653 <span class="md-ellipsis">
654
655
656 Sync Bridge
657
658
659
660 </span>
661
662
663
664 </a>
665
666
667
668 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
669
670
671
672
673
674
675 <label class="md-nav__title" for="__toc">
676 <span class="md-nav__icon md-icon"></span>
677 Table of contents
678 </label>
679 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
680
681 <li class="md-nav__item">
682 <a href="#how-it-works" class="md-nav__link">
683 <span class="md-ellipsis">
684
685 How It Works
686
687 </span>
688 </a>
689
690 </li>
691
692 <li class="md-nav__item">
693 <a href="#what-gets-synced" class="md-nav__link">
694 <span class="md-ellipsis">
695
696 What Gets Synced
697
698 </span>
699 </a>
700
701 </li>
702
703 <li class="md-nav__item">
704 <a href="#configuration" class="md-nav__link">
705 <span class="md-ellipsis">
706
707 Configuration
708
709 </span>
710 </a>
711
712 </li>
713
714 <li class="md-nav__item">
715 <a href="#sync-modes" class="md-nav__link">
716 <span class="md-ellipsis">
717
718 Sync Modes
719
720 </span>
721 </a>
722
723 <nav class="md-nav" aria-label="Sync Modes">
724 <ul class="md-nav__list">
725
726 <li class="md-nav__item">
727 <a href="#on-demand" class="md-nav__link">
728 <span class="md-ellipsis">
729
730 On-Demand
731
732 </span>
733 </a>
734
735 </li>
736
737 <li class="md-nav__item">
738 <a href="#scheduled" class="md-nav__link">
739 <span class="md-ellipsis">
740
741 Scheduled
742
743 </span>
744 </a>
745
746 </li>
747
748 <li class="md-nav__item">
749 <a href="#upstream-pull" class="md-nav__link">
750 <span class="md-ellipsis">
751
752 Upstream Pull
753
754 </span>
755 </a>
756
757 </li>
758
759 </ul>
760 </nav>
761
762 </li>
763
764 </ul>
765
766 </nav>
767
768 </li>
769
770
771
772
773 </ul>
774 </nav>
775
776 </li>
777
778
779
780 </ul>
781 </nav>
782 </div>
783 </div>
784 </div>
785
786
787
788 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
789 <div class="md-sidebar__scrollwrap">
790 <div class="md-sidebar__inner">
791
792
793 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
794
795
796
797
798
799
800 <label class="md-nav__title" for="__toc">
801 <span class="md-nav__icon md-icon"></span>
802 Table of contents
803 </label>
804 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
805
806 <li class="md-nav__item">
807 <a href="#how-it-works" class="md-nav__link">
808 <span class="md-ellipsis">
809
810 How It Works
811
812 </span>
813 </a>
814
815 </li>
816
817 <li class="md-nav__item">
818 <a href="#what-gets-synced" class="md-nav__link">
819 <span class="md-ellipsis">
820
821 What Gets Synced
822
823 </span>
824 </a>
825
826 </li>
827
828 <li class="md-nav__item">
829 <a href="#configuration" class="md-nav__link">
830 <span class="md-ellipsis">
831
832 Configuration
833
834 </span>
835 </a>
836
837 </li>
838
839 <li class="md-nav__item">
840 <a href="#sync-modes" class="md-nav__link">
841 <span class="md-ellipsis">
842
843 Sync Modes
844
845 </span>
846 </a>
847
848 <nav class="md-nav" aria-label="Sync Modes">
849 <ul class="md-nav__list">
850
851 <li class="md-nav__item">
852 <a href="#on-demand" class="md-nav__link">
853 <span class="md-ellipsis">
854
855 On-Demand
856
857 </span>
858 </a>
859
860 </li>
861
862 <li class="md-nav__item">
863 <a href="#scheduled" class="md-nav__link">
864 <span class="md-ellipsis">
865
866 Scheduled
867
868 </span>
869 </a>
870
871 </li>
872
873 <li class="md-nav__item">
874 <a href="#upstream-pull" class="md-nav__link">
875 <span class="md-ellipsis">
876
877 Upstream Pull
878
879 </span>
880 </a>
881
882 </li>
883
884 </ul>
885 </nav>
886
887 </li>
888
889 </ul>
890
891 </nav>
892 </div>
893 </div>
894 </div>
895
896
897
898 <div class="md-content" data-md-component="content">
899
900 <article class="md-content__inner md-typeset">
901
902
903
904
905
906
907
908
909 <h1 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">&para;</a></h1>
910 <p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>
911 <h2 id="how-it-works">How It Works<a class="headerlink" href="#how-it-works" title="Permanent link">&para;</a></h2>
912 <pre class="mermaid"><code>flowchart LR
913 Fossil["Fossil Repo&lt;br/&gt;(source of truth)"] --&gt; Bridge["Sync Bridge&lt;br/&gt;(Celery task)"]
914 Bridge --&gt; Git["Git Export"]
915 Git --&gt; GitHub["GitHub Mirror"]
916 Git --&gt; GitLab["GitLab Mirror"]</code></pre>
917 <p>The bridge:</p>
918 <ol>
919 <li>Exports Fossil commits as Git commits</li>
920 <li>Pushes to configured Git remotes</li>
921 <li>Optionally syncs tickets to GitHub/GitLab Issues</li>
922 <li>Optionally syncs wiki pages to repo docs</li>
923 </ol>
924 <h2 id="what-gets-synced">What Gets Synced<a class="headerlink" href="#what-gets-synced" title="Permanent link">&para;</a></h2>
925 <table>
926 <thead>
927 <tr>
928 <th>Fossil Artifact</th>
929 <th>Git Target</th>
930 <th>Configurable</th>
931 </tr>
932 </thead>
933 <tbody>
934 <tr>
935 <td>Commits</td>
936 <td>Git commits</td>
937 <td>Always</td>
938 </tr>
939 <tr>
940 <td>Tags</td>
941 <td>Git tags</td>
942 <td>Always</td>
943 </tr>
944 <tr>
945 <td>Branches</td>
946 <td>Git branches</td>
947 <td>Always</td>
948 </tr>
949 <tr>
950 <td>Tickets</td>
951 <td>GitHub/GitLab Issues</td>
952 <td>Optional</td>
953 </tr>
954 <tr>
955 <td>Wiki</td>
956 <td>Repository docs</td>
957 <td>Optional</td>
958 </tr>
959 </tbody>
960 </table>
961 <h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h2>
962 <p>Set up mirroring through the Django management UI or environment variables:</p>
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>
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
965 <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
966 <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># GitLab mirror</span>
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
968 </code></pre></div>
969 <p>Per-repository mirror configuration is managed in the dashboard under <strong>Repository Settings &gt; Sync</strong>.</p>
970 <h2 id="sync-modes">Sync Modes<a class="headerlink" href="#sync-modes" title="Permanent link">&para;</a></h2>
971 <h3 id="on-demand">On-Demand<a class="headerlink" href="#on-demand" title="Permanent link">&para;</a></h3>
972 <p>Trigger a sync manually from the dashboard or CLI:</p>
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
974 </code></pre></div>
975 <h3 id="scheduled">Scheduled<a class="headerlink" href="#scheduled" title="Permanent link">&para;</a></h3>
976 <p>Configure a Celery Beat schedule to sync at regular intervals:</p>
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>
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>
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>
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>
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>
982 <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="p">},</span>
983 <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="p">}</span>
984 </code></pre></div>
985 <h3 id="upstream-pull">Upstream Pull<a class="headerlink" href="#upstream-pull" title="Permanent link">&para;</a></h3>
986 <p>Pull updates from a remote Fossil server into your local instance:</p>
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
988 </code></pre></div>
989 <div class="admonition warning">
990 <p class="admonition-title">Direction matters</p>
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>
992 </div>
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006 </article>
1007 </div>
1008
1009
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>
1011
1012 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1013 </div>
1014
1015 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1016
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>
1018 Back to top
1019 </button>
1020
1021 </main>
1022
1023 <footer class="md-footer">
1024
1025 <div class="md-footer-meta md-typeset">
1026 <div class="md-footer-meta__inner md-grid">
1027 <div class="md-copyright">
1028
1029 <div class="md-copyright__highlight">
1030 Copyright &copy; 2026 CONFLICT LLC
1031 </div>
1032
1033
1034 Made with
1035 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1036 Material for MkDocs
1037 </a>
1038
1039 </div>
1040
1041
1042 <div class="md-social">
1043
1044
1045
1046
1047
1048
1049
1050
1051 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
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>
1053 </a>
1054
1055 </div>
1056
1057 </div>
1058 </div>
1059 </footer>
1060
1061 </div>
1062 <div class="md-dialog" data-md-component="dialog">
1063 <div class="md-dialog__inner md-typeset"></div>
1064 </div>
1065
1066
1067
1068
1069
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>
1071
1072
1073 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1074
1075
1076 </body>
1077 </html>
--- a/site/getting-started/configuration/index.html
+++ b/site/getting-started/configuration/index.html
@@ -0,0 +1,1288 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/getting-started/configuration/">
16
+
17
+
18
+ <link rel="prev" href="../installation/">
19
+
20
+
21
+ <link rel="next" href="../first-repo/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>Configuration - Fossilrepo</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
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>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#configuration" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
101
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103
+</div>
104
+ </a>
105
+ <label class="md-header__button md-icon" for="__drawer">
106
+
107
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108
+ </label>
109
+ <div class="md-header__title" data-md-component="header-title">
110
+ <div class="md-header__ellipsis">
111
+ <div class="md-header__topic">
112
+ <span class="md-ellipsis">
113
+ Fossilrepo
114
+ </span>
115
+ </div>
116
+ <div class="md-header__topic" data-md-component="header-topic">
117
+ <span class="md-ellipsis">
118
+
119
+ Configuration
120
+
121
+ </span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+
127
+ <form class="md-header__option" data-md-component="palette">
128
+
129
+
130
+
131
+
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">
133
+
134
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136
+ </label>
137
+
138
+
139
+
140
+
141
+
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">
143
+
144
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146
+ </label>
147
+
148
+
149
+</form>
150
+
151
+
152
+
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>
154
+
155
+
156
+
157
+
158
+
159
+ <label class="md-header__button md-icon" for="__search">
160
+
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>
162
+ </label>
163
+ <div class="md-search" data-md-component="search" role="dialog">
164
+ <label class="md-search__overlay" for="__search"></label>
165
+ <div class="md-search__inner" role="search">
166
+ <form class="md-search__form" name="search">
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>
168
+ <label class="md-search__icon md-icon" for="__search">
169
+
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>
171
+
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>
173
+ </label>
174
+ <nav class="md-search__options" aria-label="Search">
175
+
176
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
+
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>
179
+ </button>
180
+ </nav>
181
+
182
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
+
184
+ </form>
185
+ <div class="md-search__output">
186
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187
+ <div class="md-search-result" data-md-component="search-result">
188
+ <div class="md-search-result__meta">
189
+ Initializing search
190
+ </div>
191
+ <ol class="md-search-result__list" role="presentation"></ol>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+</div>
197
+
198
+
199
+
200
+ <div class="md-header__source">
201
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202
+ <div class="md-source__icon md-icon">
203
+
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>
205
+ </div>
206
+ <div class="md-source__repository">
207
+ ConflictHQ/fossilrepo
208
+ </div>
209
+</a>
210
+ </div>
211
+
212
+ </nav>
213
+
214
+</header>
215
+
216
+ <div class="md-container" data-md-component="container">
217
+
218
+
219
+
220
+
221
+
222
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223
+ <div class="md-grid">
224
+ <ul class="md-tabs__list">
225
+
226
+
227
+
228
+
229
+
230
+
231
+ <li class="md-tabs__item">
232
+ <a href="../.." class="md-tabs__link">
233
+
234
+
235
+
236
+
237
+
238
+ Home
239
+
240
+ </a>
241
+ </li>
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+ <li class="md-tabs__item md-tabs__item--active">
255
+ <a href="../prerequisites/" class="md-tabs__link">
256
+
257
+
258
+
259
+ Getting Started
260
+
261
+ </a>
262
+ </li>
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item">
275
+ <a href="../../architecture/overview/" class="md-tabs__link">
276
+
277
+
278
+
279
+ Architecture
280
+
281
+ </a>
282
+ </li>
283
+
284
+
285
+
286
+
287
+ </ul>
288
+ </div>
289
+</nav>
290
+
291
+
292
+
293
+ <main class="md-main" data-md-component="main">
294
+ <div class="md-main__inner md-grid">
295
+
296
+
297
+
298
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299
+ <div class="md-sidebar__scrollwrap">
300
+ <div class="md-sidebar__inner">
301
+
302
+
303
+
304
+
305
+
306
+
307
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308
+ <label class="md-nav__title" for="__drawer">
309
+ <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
311
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313
+</div>
314
+ </a>
315
+ Fossilrepo
316
+ </label>
317
+
318
+ <div class="md-nav__source">
319
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320
+ <div class="md-source__icon md-icon">
321
+
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>
323
+ </div>
324
+ <div class="md-source__repository">
325
+ ConflictHQ/fossilrepo
326
+ </div>
327
+</a>
328
+ </div>
329
+
330
+ <ul class="md-nav__list" data-md-scrollfix>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item">
339
+ <a href="../.." class="md-nav__link">
340
+
341
+
342
+
343
+ <span class="md-ellipsis">
344
+
345
+
346
+ Home
347
+
348
+
349
+
350
+ </span>
351
+
352
+
353
+
354
+ </a>
355
+ </li>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
+
382
+
383
+
384
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
+
386
+
387
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
+
389
+
390
+
391
+ <span class="md-ellipsis">
392
+
393
+
394
+ Getting Started
395
+
396
+
397
+
398
+ </span>
399
+
400
+
401
+
402
+ <span class="md-nav__icon md-icon"></span>
403
+ </label>
404
+
405
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406
+ <label class="md-nav__title" for="__nav_2">
407
+ <span class="md-nav__icon md-icon"></span>
408
+
409
+
410
+ Getting Started
411
+
412
+
413
+ </label>
414
+ <ul class="md-nav__list" data-md-scrollfix>
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+ <li class="md-nav__item">
423
+ <a href="../prerequisites/" class="md-nav__link">
424
+
425
+
426
+
427
+ <span class="md-ellipsis">
428
+
429
+
430
+ Prerequisites
431
+
432
+
433
+
434
+ </span>
435
+
436
+
437
+
438
+ </a>
439
+ </li>
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+ <li class="md-nav__item">
451
+ <a href="../installation/" class="md-nav__link">
452
+
453
+
454
+
455
+ <span class="md-ellipsis">
456
+
457
+
458
+ Installation
459
+
460
+
461
+
462
+ </span>
463
+
464
+
465
+
466
+ </a>
467
+ </li>
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+
478
+
479
+
480
+ <li class="md-nav__item md-nav__item--active">
481
+
482
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
483
+
484
+
485
+
486
+
487
+
488
+ <label class="md-nav__link md-nav__link--active" for="__toc">
489
+
490
+
491
+
492
+ <span class="md-ellipsis">
493
+
494
+
495
+ Configuration
496
+
497
+
498
+
499
+ </span>
500
+
501
+
502
+
503
+ <span class="md-nav__icon md-icon"></span>
504
+ </label>
505
+
506
+ <a href="./" class="md-nav__link md-nav__link--active">
507
+
508
+
509
+
510
+ <span class="md-ellipsis">
511
+
512
+
513
+ Configuration
514
+
515
+
516
+
517
+ </span>
518
+
519
+
520
+
521
+ </a>
522
+
523
+
524
+
525
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
526
+
527
+
528
+
529
+
530
+
531
+
532
+ <label class="md-nav__title" for="__toc">
533
+ <span class="md-nav__icon md-icon"></span>
534
+ Table of contents
535
+ </label>
536
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
537
+
538
+ <li class="md-nav__item">
539
+ <a href="#environment-variables" class="md-nav__link">
540
+ <span class="md-ellipsis">
541
+
542
+ Environment Variables
543
+
544
+ </span>
545
+ </a>
546
+
547
+ <nav class="md-nav" aria-label="Environment Variables">
548
+ <ul class="md-nav__list">
549
+
550
+ <li class="md-nav__item">
551
+ <a href="#django-settings" class="md-nav__link">
552
+ <span class="md-ellipsis">
553
+
554
+ Django Settings
555
+
556
+ </span>
557
+ </a>
558
+
559
+</li>
560
+
561
+ <li class="md-nav__item">
562
+ <a href="#database" class="md-nav__link">
563
+ <span class="md-ellipsis">
564
+
565
+ Database
566
+
567
+ </span>
568
+ </a>
569
+
570
+</li>
571
+
572
+ <li class="md-nav__item">
573
+ <a href="#redis-celery" class="md-nav__link">
574
+ <span class="md-ellipsis">
575
+
576
+ Redis &amp; Celery
577
+
578
+ </span>
579
+ </a>
580
+
581
+</li>
582
+
583
+ <li class="md-nav__item">
584
+ <a href="#fossil" class="md-nav__link">
585
+ <span class="md-ellipsis">
586
+
587
+ Fossil
588
+
589
+ </span>
590
+ </a>
591
+
592
+</li>
593
+
594
+ <li class="md-nav__item">
595
+ <a href="#caddy-production" class="md-nav__link">
596
+ <span class="md-ellipsis">
597
+
598
+ Caddy (Production)
599
+
600
+ </span>
601
+ </a>
602
+
603
+</li>
604
+
605
+ <li class="md-nav__item">
606
+ <a href="#litestream-backups" class="md-nav__link">
607
+ <span class="md-ellipsis">
608
+
609
+ Litestream (Backups)
610
+
611
+ </span>
612
+ </a>
613
+
614
+</li>
615
+
616
+ <li class="md-nav__item">
617
+ <a href="#sync-bridge" class="md-nav__link">
618
+ <span class="md-ellipsis">
619
+
620
+ Sync Bridge
621
+
622
+ </span>
623
+ </a>
624
+
625
+</li>
626
+
627
+ </ul>
628
+ </nav>
629
+
630
+</li>
631
+
632
+ <li class="md-nav__item">
633
+ <a href="#caddy-configuration" class="md-nav__link">
634
+ <span class="md-ellipsis">
635
+
636
+ Caddy Configuration
637
+
638
+ </span>
639
+ </a>
640
+
641
+</li>
642
+
643
+ <li class="md-nav__item">
644
+ <a href="#litestream-configuration" class="md-nav__link">
645
+ <span class="md-ellipsis">
646
+
647
+ Litestream Configuration
648
+
649
+ </span>
650
+ </a>
651
+
652
+</li>
653
+
654
+ </ul>
655
+
656
+</nav>
657
+
658
+ </li>
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+ <li class="md-nav__item">
670
+ <a href="../first-repo/" class="md-nav__link">
671
+
672
+
673
+
674
+ <span class="md-ellipsis">
675
+
676
+
677
+ First Repository
678
+
679
+
680
+
681
+ </span>
682
+
683
+
684
+
685
+ </a>
686
+ </li>
687
+
688
+
689
+
690
+
691
+ </ul>
692
+ </nav>
693
+
694
+ </li>
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+ <li class="md-nav__item md-nav__item--nested">
715
+
716
+
717
+
718
+
719
+
720
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
721
+
722
+
723
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
724
+
725
+
726
+
727
+ <span class="md-ellipsis">
728
+
729
+
730
+ Architecture
731
+
732
+
733
+
734
+ </span>
735
+
736
+
737
+
738
+ <span class="md-nav__icon md-icon"></span>
739
+ </label>
740
+
741
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
742
+ <label class="md-nav__title" for="__nav_3">
743
+ <span class="md-nav__icon md-icon"></span>
744
+
745
+
746
+ Architecture
747
+
748
+
749
+ </label>
750
+ <ul class="md-nav__list" data-md-scrollfix>
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+ <li class="md-nav__item">
759
+ <a href="../../architecture/overview/" class="md-nav__link">
760
+
761
+
762
+
763
+ <span class="md-ellipsis">
764
+
765
+
766
+ Overview
767
+
768
+
769
+
770
+ </span>
771
+
772
+
773
+
774
+ </a>
775
+ </li>
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+
784
+
785
+
786
+ <li class="md-nav__item">
787
+ <a href="../../architecture/sync-bridge/" class="md-nav__link">
788
+
789
+
790
+
791
+ <span class="md-ellipsis">
792
+
793
+
794
+ Sync Bridge
795
+
796
+
797
+
798
+ </span>
799
+
800
+
801
+
802
+ </a>
803
+ </li>
804
+
805
+
806
+
807
+
808
+ </ul>
809
+ </nav>
810
+
811
+ </li>
812
+
813
+
814
+
815
+ </ul>
816
+</nav>
817
+ </div>
818
+ </div>
819
+ </div>
820
+
821
+
822
+
823
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
824
+ <div class="md-sidebar__scrollwrap">
825
+ <div class="md-sidebar__inner">
826
+
827
+
828
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
829
+
830
+
831
+
832
+
833
+
834
+
835
+ <label class="md-nav__title" for="__toc">
836
+ <span class="md-nav__icon md-icon"></span>
837
+ Table of contents
838
+ </label>
839
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
840
+
841
+ <li class="md-nav__item">
842
+ <a href="#environment-variables" class="md-nav__link">
843
+ <span class="md-ellipsis">
844
+
845
+ Environment Variables
846
+
847
+ </span>
848
+ </a>
849
+
850
+ <nav class="md-nav" aria-label="Environment Variables">
851
+ <ul class="md-nav__list">
852
+
853
+ <li class="md-nav__item">
854
+ <a href="#django-settings" class="md-nav__link">
855
+ <span class="md-ellipsis">
856
+
857
+ Django Settings
858
+
859
+ </span>
860
+ </a>
861
+
862
+</li>
863
+
864
+ <li class="md-nav__item">
865
+ <a href="#database" class="md-nav__link">
866
+ <span class="md-ellipsis">
867
+
868
+ Database
869
+
870
+ </span>
871
+ </a>
872
+
873
+</li>
874
+
875
+ <li class="md-nav__item">
876
+ <a href="#redis-celery" class="md-nav__link">
877
+ <span class="md-ellipsis">
878
+
879
+ Redis &amp; Celery
880
+
881
+ </span>
882
+ </a>
883
+
884
+</li>
885
+
886
+ <li class="md-nav__item">
887
+ <a href="#fossil" class="md-nav__link">
888
+ <span class="md-ellipsis">
889
+
890
+ Fossil
891
+
892
+ </span>
893
+ </a>
894
+
895
+</li>
896
+
897
+ <li class="md-nav__item">
898
+ <a href="#caddy-production" class="md-nav__link">
899
+ <span class="md-ellipsis">
900
+
901
+ Caddy (Production)
902
+
903
+ </span>
904
+ </a>
905
+
906
+</li>
907
+
908
+ <li class="md-nav__item">
909
+ <a href="#litestream-backups" class="md-nav__link">
910
+ <span class="md-ellipsis">
911
+
912
+ Litestream (Backups)
913
+
914
+ </span>
915
+ </a>
916
+
917
+</li>
918
+
919
+ <li class="md-nav__item">
920
+ <a href="#sync-bridge" class="md-nav__link">
921
+ <span class="md-ellipsis">
922
+
923
+ Sync Bridge
924
+
925
+ </span>
926
+ </a>
927
+
928
+</li>
929
+
930
+ </ul>
931
+ </nav>
932
+
933
+</li>
934
+
935
+ <li class="md-nav__item">
936
+ <a href="#caddy-configuration" class="md-nav__link">
937
+ <span class="md-ellipsis">
938
+
939
+ Caddy Configuration
940
+
941
+ </span>
942
+ </a>
943
+
944
+</li>
945
+
946
+ <li class="md-nav__item">
947
+ <a href="#litestream-configuration" class="md-nav__link">
948
+ <span class="md-ellipsis">
949
+
950
+ Litestream Configuration
951
+
952
+ </span>
953
+ </a>
954
+
955
+</li>
956
+
957
+ </ul>
958
+
959
+</nav>
960
+ </div>
961
+ </div>
962
+ </div>
963
+
964
+
965
+
966
+ <div class="md-content" data-md-component="content">
967
+
968
+ <article class="md-content__inner md-typeset">
969
+
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+<h1 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h1>
978
+<h2 id="environment-variables">Environment Variables<a class="headerlink" href="#environment-variables" title="Permanent link">&para;</a></h2>
979
+<p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p>
980
+<h3 id="django-settings">Django Settings<a class="headerlink" href="#django-settings" title="Permanent link">&para;</a></h3>
981
+<table>
982
+<thead>
983
+<tr>
984
+<th>Variable</th>
985
+<th>Default</th>
986
+<th>Description</th>
987
+</tr>
988
+</thead>
989
+<tbody>
990
+<tr>
991
+<td><code>SECRET_KEY</code></td>
992
+<td>--</td>
993
+<td>Django secret key (required)</td>
994
+</tr>
995
+<tr>
996
+<td><code>DEBUG</code></td>
997
+<td><code>False</code></td>
998
+<td>Enable debug mode</td>
999
+</tr>
1000
+<tr>
1001
+<td><code>ALLOWED_HOSTS</code></td>
1002
+<td><code>localhost</code></td>
1003
+<td>Comma-separated list of allowed hosts</td>
1004
+</tr>
1005
+<tr>
1006
+<td><code>TIME_ZONE</code></td>
1007
+<td><code>UTC</code></td>
1008
+<td>Server timezone</td>
1009
+</tr>
1010
+</tbody>
1011
+</table>
1012
+<h3 id="database">Database<a class="headerlink" href="#database" title="Permanent link">&para;</a></h3>
1013
+<table>
1014
+<thead>
1015
+<tr>
1016
+<th>Variable</th>
1017
+<th>Default</th>
1018
+<th>Description</th>
1019
+</tr>
1020
+</thead>
1021
+<tbody>
1022
+<tr>
1023
+<td><code>POSTGRES_DB</code></td>
1024
+<td><code>fossilrepo</code></td>
1025
+<td>Database name</td>
1026
+</tr>
1027
+<tr>
1028
+<td><code>POSTGRES_USER</code></td>
1029
+<td><code>fossilrepo</code></td>
1030
+<td>Database user</td>
1031
+</tr>
1032
+<tr>
1033
+<td><code>POSTGRES_PASSWORD</code></td>
1034
+<td>--</td>
1035
+<td>Database password (required)</td>
1036
+</tr>
1037
+<tr>
1038
+<td><code>POSTGRES_HOST</code></td>
1039
+<td><code>postgres</code></td>
1040
+<td>Database host</td>
1041
+</tr>
1042
+<tr>
1043
+<td><code>POSTGRES_PORT</code></td>
1044
+<td><code>5432</code></td>
1045
+<td>Database port</td>
1046
+</tr>
1047
+</tbody>
1048
+</table>
1049
+<h3 id="redis-celery">Redis &amp; Celery<a class="headerlink" href="#redis-celery" title="Permanent link">&para;</a></h3>
1050
+<table>
1051
+<thead>
1052
+<tr>
1053
+<th>Variable</th>
1054
+<th>Default</th>
1055
+<th>Description</th>
1056
+</tr>
1057
+</thead>
1058
+<tbody>
1059
+<tr>
1060
+<td><code>REDIS_URL</code></td>
1061
+<td><code>redis://redis:6379/0</code></td>
1062
+<td>Redis connection URL</td>
1063
+</tr>
1064
+<tr>
1065
+<td><code>CELERY_BROKER_URL</code></td>
1066
+<td><code>$REDIS_URL</code></td>
1067
+<td>Celery broker (defaults to Redis URL)</td>
1068
+</tr>
1069
+</tbody>
1070
+</table>
1071
+<h3 id="fossil">Fossil<a class="headerlink" href="#fossil" title="Permanent link">&para;</a></h3>
1072
+<table>
1073
+<thead>
1074
+<tr>
1075
+<th>Variable</th>
1076
+<th>Default</th>
1077
+<th>Description</th>
1078
+</tr>
1079
+</thead>
1080
+<tbody>
1081
+<tr>
1082
+<td><code>FOSSIL_REPO_DIR</code></td>
1083
+<td><code>/data/repos</code></td>
1084
+<td>Directory where <code>.fossil</code> files are stored</td>
1085
+</tr>
1086
+<tr>
1087
+<td><code>FOSSIL_BASE_URL</code></td>
1088
+<td>--</td>
1089
+<td>Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>)</td>
1090
+</tr>
1091
+<tr>
1092
+<td><code>FOSSIL_BINARY</code></td>
1093
+<td><code>fossil</code></td>
1094
+<td>Path to the Fossil binary</td>
1095
+</tr>
1096
+</tbody>
1097
+</table>
1098
+<h3 id="caddy-production">Caddy (Production)<a class="headerlink" href="#caddy-production" title="Permanent link">&para;</a></h3>
1099
+<table>
1100
+<thead>
1101
+<tr>
1102
+<th>Variable</th>
1103
+<th>Default</th>
1104
+<th>Description</th>
1105
+</tr>
1106
+</thead>
1107
+<tbody>
1108
+<tr>
1109
+<td><code>CADDY_DOMAIN</code></td>
1110
+<td>--</td>
1111
+<td>Your domain (e.g., <code>example.com</code>)</td>
1112
+</tr>
1113
+<tr>
1114
+<td><code>CADDY_EMAIL</code></td>
1115
+<td>--</td>
1116
+<td>Email for Let's Encrypt certificates</td>
1117
+</tr>
1118
+</tbody>
1119
+</table>
1120
+<h3 id="litestream-backups">Litestream (Backups)<a class="headerlink" href="#litestream-backups" title="Permanent link">&para;</a></h3>
1121
+<table>
1122
+<thead>
1123
+<tr>
1124
+<th>Variable</th>
1125
+<th>Default</th>
1126
+<th>Description</th>
1127
+</tr>
1128
+</thead>
1129
+<tbody>
1130
+<tr>
1131
+<td><code>LITESTREAM_ACCESS_KEY_ID</code></td>
1132
+<td>--</td>
1133
+<td>S3 access key</td>
1134
+</tr>
1135
+<tr>
1136
+<td><code>LITESTREAM_SECRET_ACCESS_KEY</code></td>
1137
+<td>--</td>
1138
+<td>S3 secret key</td>
1139
+</tr>
1140
+<tr>
1141
+<td><code>LITESTREAM_BUCKET</code></td>
1142
+<td>--</td>
1143
+<td>S3 bucket name</td>
1144
+</tr>
1145
+<tr>
1146
+<td><code>LITESTREAM_ENDPOINT</code></td>
1147
+<td>--</td>
1148
+<td>S3 endpoint (for MinIO/B2)</td>
1149
+</tr>
1150
+<tr>
1151
+<td><code>LITESTREAM_REGION</code></td>
1152
+<td><code>us-east-1</code></td>
1153
+<td>S3 region</td>
1154
+</tr>
1155
+</tbody>
1156
+</table>
1157
+<h3 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">&para;</a></h3>
1158
+<table>
1159
+<thead>
1160
+<tr>
1161
+<th>Variable</th>
1162
+<th>Default</th>
1163
+<th>Description</th>
1164
+</tr>
1165
+</thead>
1166
+<tbody>
1167
+<tr>
1168
+<td><code>GITHUB_TOKEN</code></td>
1169
+<td>--</td>
1170
+<td>GitHub personal access token (for mirroring)</td>
1171
+</tr>
1172
+<tr>
1173
+<td><code>GITLAB_TOKEN</code></td>
1174
+<td>--</td>
1175
+<td>GitLab personal access token (for mirroring)</td>
1176
+</tr>
1177
+</tbody>
1178
+</table>
1179
+<h2 id="caddy-configuration">Caddy Configuration<a class="headerlink" href="#caddy-configuration" title="Permanent link">&para;</a></h2>
1180
+<p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p>
1181
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>{$CADDY_DOMAIN} {
1182
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> reverse_proxy django:8000
1183
+<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>}
1184
+<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
1185
+<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>*.{$CADDY_DOMAIN} {
1186
+<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> reverse_proxy fossil:8080
1187
+<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>}
1188
+</code></pre></div>
1189
+<p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p>
1190
+<h2 id="litestream-configuration">Litestream Configuration<a class="headerlink" href="#litestream-configuration" title="Permanent link">&para;</a></h2>
1191
+<p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p>
1192
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nt">dbs</span><span class="p">:</span>
1193
+<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/data/repos/*.fossil</span>
1194
+<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="nt">replicas</span><span class="p">:</span>
1195
+<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">s3</span>
1196
+<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="nt">bucket</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_BUCKET}</span>
1197
+<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_ENDPOINT}</span>
1198
+<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_REGION}</span>
1199
+</code></pre></div>
1200
+<div class="admonition tip">
1201
+<p class="admonition-title">Point-in-time recovery</p>
1202
+<p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p>
1203
+</div>
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+ </article>
1218
+ </div>
1219
+
1220
+
1221
+ <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>
1222
+
1223
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1224
+ </div>
1225
+
1226
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1227
+
1228
+ <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>
1229
+ Back to top
1230
+</button>
1231
+
1232
+ </main>
1233
+
1234
+ <footer class="md-footer">
1235
+
1236
+ <div class="md-footer-meta md-typeset">
1237
+ <div class="md-footer-meta__inner md-grid">
1238
+ <div class="md-copyright">
1239
+
1240
+ <div class="md-copyright__highlight">
1241
+ Copyright &copy; 2026 CONFLICT LLC
1242
+ </div>
1243
+
1244
+
1245
+ Made with
1246
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1247
+ Material for MkDocs
1248
+ </a>
1249
+
1250
+</div>
1251
+
1252
+
1253
+<div class="md-social">
1254
+
1255
+
1256
+
1257
+
1258
+
1259
+
1260
+
1261
+
1262
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1263
+ <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>
1264
+ </a>
1265
+
1266
+</div>
1267
+
1268
+ </div>
1269
+ </div>
1270
+</footer>
1271
+
1272
+ </div>
1273
+ <div class="md-dialog" data-md-component="dialog">
1274
+ <div class="md-dialog__inner md-typeset"></div>
1275
+ </div>
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+ <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>
1282
+
1283
+
1284
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1285
+
1286
+
1287
+ </body>
1288
+</html>
--- a/site/getting-started/configuration/index.html
+++ b/site/getting-started/configuration/index.html
@@ -0,0 +1,1288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/getting-started/configuration/index.html
+++ b/site/getting-started/configuration/index.html
@@ -0,0 +1,1288 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/getting-started/configuration/">
16
17
18 <link rel="prev" href="../installation/">
19
20
21 <link rel="next" href="../first-repo/">
22
23
24
25
26
27 <link rel="icon" href="../../assets/images/favicon.png">
28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
30
31
32 <title>Configuration - Fossilrepo</title>
33
34
35
36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
38
39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
41
42
43
44
45
46
47
48
49
50
51
52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
56
57
58 <link rel="stylesheet" href="../../assets/css/custom.css">
59
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>
61
62
63
64
65
66 </head>
67
68
69
70
71
72
73
74
75
76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
78
79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81 <label class="md-overlay" for="__drawer"></label>
82 <div data-md-component="skip">
83
84
85 <a href="#configuration" class="md-skip">
86 Skip to content
87 </a>
88
89 </div>
90 <div data-md-component="announce">
91
92 </div>
93
94
95
96
97 <header class="md-header" data-md-component="header">
98 <nav class="md-header__inner md-grid" aria-label="Header">
99 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100 <div style="display: flex; align-items: center; gap: 0.6rem;">
101 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103 </div>
104 </a>
105 <label class="md-header__button md-icon" for="__drawer">
106
107 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108 </label>
109 <div class="md-header__title" data-md-component="header-title">
110 <div class="md-header__ellipsis">
111 <div class="md-header__topic">
112 <span class="md-ellipsis">
113 Fossilrepo
114 </span>
115 </div>
116 <div class="md-header__topic" data-md-component="header-topic">
117 <span class="md-ellipsis">
118
119 Configuration
120
121 </span>
122 </div>
123 </div>
124 </div>
125
126
127 <form class="md-header__option" data-md-component="palette">
128
129
130
131
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">
133
134 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136 </label>
137
138
139
140
141
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">
143
144 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146 </label>
147
148
149 </form>
150
151
152
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>
154
155
156
157
158
159 <label class="md-header__button md-icon" for="__search">
160
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>
162 </label>
163 <div class="md-search" data-md-component="search" role="dialog">
164 <label class="md-search__overlay" for="__search"></label>
165 <div class="md-search__inner" role="search">
166 <form class="md-search__form" name="search">
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>
168 <label class="md-search__icon md-icon" for="__search">
169
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>
171
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>
173 </label>
174 <nav class="md-search__options" aria-label="Search">
175
176 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
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>
179 </button>
180 </nav>
181
182 <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
184 </form>
185 <div class="md-search__output">
186 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187 <div class="md-search-result" data-md-component="search-result">
188 <div class="md-search-result__meta">
189 Initializing search
190 </div>
191 <ol class="md-search-result__list" role="presentation"></ol>
192 </div>
193 </div>
194 </div>
195 </div>
196 </div>
197
198
199
200 <div class="md-header__source">
201 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
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>
205 </div>
206 <div class="md-source__repository">
207 ConflictHQ/fossilrepo
208 </div>
209 </a>
210 </div>
211
212 </nav>
213
214 </header>
215
216 <div class="md-container" data-md-component="container">
217
218
219
220
221
222 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223 <div class="md-grid">
224 <ul class="md-tabs__list">
225
226
227
228
229
230
231 <li class="md-tabs__item">
232 <a href="../.." class="md-tabs__link">
233
234
235
236
237
238 Home
239
240 </a>
241 </li>
242
243
244
245
246
247
248
249
250
251
252
253
254 <li class="md-tabs__item md-tabs__item--active">
255 <a href="../prerequisites/" class="md-tabs__link">
256
257
258
259 Getting Started
260
261 </a>
262 </li>
263
264
265
266
267
268
269
270
271
272
273
274 <li class="md-tabs__item">
275 <a href="../../architecture/overview/" class="md-tabs__link">
276
277
278
279 Architecture
280
281 </a>
282 </li>
283
284
285
286
287 </ul>
288 </div>
289 </nav>
290
291
292
293 <main class="md-main" data-md-component="main">
294 <div class="md-main__inner md-grid">
295
296
297
298 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299 <div class="md-sidebar__scrollwrap">
300 <div class="md-sidebar__inner">
301
302
303
304
305
306
307 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308 <label class="md-nav__title" for="__drawer">
309 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310 <div style="display: flex; align-items: center; gap: 0.6rem;">
311 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313 </div>
314 </a>
315 Fossilrepo
316 </label>
317
318 <div class="md-nav__source">
319 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320 <div class="md-source__icon md-icon">
321
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>
323 </div>
324 <div class="md-source__repository">
325 ConflictHQ/fossilrepo
326 </div>
327 </a>
328 </div>
329
330 <ul class="md-nav__list" data-md-scrollfix>
331
332
333
334
335
336
337
338 <li class="md-nav__item">
339 <a href="../.." class="md-nav__link">
340
341
342
343 <span class="md-ellipsis">
344
345
346 Home
347
348
349
350 </span>
351
352
353
354 </a>
355 </li>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
382
383
384 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
386
387 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
389
390
391 <span class="md-ellipsis">
392
393
394 Getting Started
395
396
397
398 </span>
399
400
401
402 <span class="md-nav__icon md-icon"></span>
403 </label>
404
405 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406 <label class="md-nav__title" for="__nav_2">
407 <span class="md-nav__icon md-icon"></span>
408
409
410 Getting Started
411
412
413 </label>
414 <ul class="md-nav__list" data-md-scrollfix>
415
416
417
418
419
420
421
422 <li class="md-nav__item">
423 <a href="../prerequisites/" class="md-nav__link">
424
425
426
427 <span class="md-ellipsis">
428
429
430 Prerequisites
431
432
433
434 </span>
435
436
437
438 </a>
439 </li>
440
441
442
443
444
445
446
447
448
449
450 <li class="md-nav__item">
451 <a href="../installation/" class="md-nav__link">
452
453
454
455 <span class="md-ellipsis">
456
457
458 Installation
459
460
461
462 </span>
463
464
465
466 </a>
467 </li>
468
469
470
471
472
473
474
475
476
477
478
479
480 <li class="md-nav__item md-nav__item--active">
481
482 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
483
484
485
486
487
488 <label class="md-nav__link md-nav__link--active" for="__toc">
489
490
491
492 <span class="md-ellipsis">
493
494
495 Configuration
496
497
498
499 </span>
500
501
502
503 <span class="md-nav__icon md-icon"></span>
504 </label>
505
506 <a href="./" class="md-nav__link md-nav__link--active">
507
508
509
510 <span class="md-ellipsis">
511
512
513 Configuration
514
515
516
517 </span>
518
519
520
521 </a>
522
523
524
525 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
526
527
528
529
530
531
532 <label class="md-nav__title" for="__toc">
533 <span class="md-nav__icon md-icon"></span>
534 Table of contents
535 </label>
536 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
537
538 <li class="md-nav__item">
539 <a href="#environment-variables" class="md-nav__link">
540 <span class="md-ellipsis">
541
542 Environment Variables
543
544 </span>
545 </a>
546
547 <nav class="md-nav" aria-label="Environment Variables">
548 <ul class="md-nav__list">
549
550 <li class="md-nav__item">
551 <a href="#django-settings" class="md-nav__link">
552 <span class="md-ellipsis">
553
554 Django Settings
555
556 </span>
557 </a>
558
559 </li>
560
561 <li class="md-nav__item">
562 <a href="#database" class="md-nav__link">
563 <span class="md-ellipsis">
564
565 Database
566
567 </span>
568 </a>
569
570 </li>
571
572 <li class="md-nav__item">
573 <a href="#redis-celery" class="md-nav__link">
574 <span class="md-ellipsis">
575
576 Redis &amp; Celery
577
578 </span>
579 </a>
580
581 </li>
582
583 <li class="md-nav__item">
584 <a href="#fossil" class="md-nav__link">
585 <span class="md-ellipsis">
586
587 Fossil
588
589 </span>
590 </a>
591
592 </li>
593
594 <li class="md-nav__item">
595 <a href="#caddy-production" class="md-nav__link">
596 <span class="md-ellipsis">
597
598 Caddy (Production)
599
600 </span>
601 </a>
602
603 </li>
604
605 <li class="md-nav__item">
606 <a href="#litestream-backups" class="md-nav__link">
607 <span class="md-ellipsis">
608
609 Litestream (Backups)
610
611 </span>
612 </a>
613
614 </li>
615
616 <li class="md-nav__item">
617 <a href="#sync-bridge" class="md-nav__link">
618 <span class="md-ellipsis">
619
620 Sync Bridge
621
622 </span>
623 </a>
624
625 </li>
626
627 </ul>
628 </nav>
629
630 </li>
631
632 <li class="md-nav__item">
633 <a href="#caddy-configuration" class="md-nav__link">
634 <span class="md-ellipsis">
635
636 Caddy Configuration
637
638 </span>
639 </a>
640
641 </li>
642
643 <li class="md-nav__item">
644 <a href="#litestream-configuration" class="md-nav__link">
645 <span class="md-ellipsis">
646
647 Litestream Configuration
648
649 </span>
650 </a>
651
652 </li>
653
654 </ul>
655
656 </nav>
657
658 </li>
659
660
661
662
663
664
665
666
667
668
669 <li class="md-nav__item">
670 <a href="../first-repo/" class="md-nav__link">
671
672
673
674 <span class="md-ellipsis">
675
676
677 First Repository
678
679
680
681 </span>
682
683
684
685 </a>
686 </li>
687
688
689
690
691 </ul>
692 </nav>
693
694 </li>
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714 <li class="md-nav__item md-nav__item--nested">
715
716
717
718
719
720 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
721
722
723 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
724
725
726
727 <span class="md-ellipsis">
728
729
730 Architecture
731
732
733
734 </span>
735
736
737
738 <span class="md-nav__icon md-icon"></span>
739 </label>
740
741 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
742 <label class="md-nav__title" for="__nav_3">
743 <span class="md-nav__icon md-icon"></span>
744
745
746 Architecture
747
748
749 </label>
750 <ul class="md-nav__list" data-md-scrollfix>
751
752
753
754
755
756
757
758 <li class="md-nav__item">
759 <a href="../../architecture/overview/" class="md-nav__link">
760
761
762
763 <span class="md-ellipsis">
764
765
766 Overview
767
768
769
770 </span>
771
772
773
774 </a>
775 </li>
776
777
778
779
780
781
782
783
784
785
786 <li class="md-nav__item">
787 <a href="../../architecture/sync-bridge/" class="md-nav__link">
788
789
790
791 <span class="md-ellipsis">
792
793
794 Sync Bridge
795
796
797
798 </span>
799
800
801
802 </a>
803 </li>
804
805
806
807
808 </ul>
809 </nav>
810
811 </li>
812
813
814
815 </ul>
816 </nav>
817 </div>
818 </div>
819 </div>
820
821
822
823 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
824 <div class="md-sidebar__scrollwrap">
825 <div class="md-sidebar__inner">
826
827
828 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
829
830
831
832
833
834
835 <label class="md-nav__title" for="__toc">
836 <span class="md-nav__icon md-icon"></span>
837 Table of contents
838 </label>
839 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
840
841 <li class="md-nav__item">
842 <a href="#environment-variables" class="md-nav__link">
843 <span class="md-ellipsis">
844
845 Environment Variables
846
847 </span>
848 </a>
849
850 <nav class="md-nav" aria-label="Environment Variables">
851 <ul class="md-nav__list">
852
853 <li class="md-nav__item">
854 <a href="#django-settings" class="md-nav__link">
855 <span class="md-ellipsis">
856
857 Django Settings
858
859 </span>
860 </a>
861
862 </li>
863
864 <li class="md-nav__item">
865 <a href="#database" class="md-nav__link">
866 <span class="md-ellipsis">
867
868 Database
869
870 </span>
871 </a>
872
873 </li>
874
875 <li class="md-nav__item">
876 <a href="#redis-celery" class="md-nav__link">
877 <span class="md-ellipsis">
878
879 Redis &amp; Celery
880
881 </span>
882 </a>
883
884 </li>
885
886 <li class="md-nav__item">
887 <a href="#fossil" class="md-nav__link">
888 <span class="md-ellipsis">
889
890 Fossil
891
892 </span>
893 </a>
894
895 </li>
896
897 <li class="md-nav__item">
898 <a href="#caddy-production" class="md-nav__link">
899 <span class="md-ellipsis">
900
901 Caddy (Production)
902
903 </span>
904 </a>
905
906 </li>
907
908 <li class="md-nav__item">
909 <a href="#litestream-backups" class="md-nav__link">
910 <span class="md-ellipsis">
911
912 Litestream (Backups)
913
914 </span>
915 </a>
916
917 </li>
918
919 <li class="md-nav__item">
920 <a href="#sync-bridge" class="md-nav__link">
921 <span class="md-ellipsis">
922
923 Sync Bridge
924
925 </span>
926 </a>
927
928 </li>
929
930 </ul>
931 </nav>
932
933 </li>
934
935 <li class="md-nav__item">
936 <a href="#caddy-configuration" class="md-nav__link">
937 <span class="md-ellipsis">
938
939 Caddy Configuration
940
941 </span>
942 </a>
943
944 </li>
945
946 <li class="md-nav__item">
947 <a href="#litestream-configuration" class="md-nav__link">
948 <span class="md-ellipsis">
949
950 Litestream Configuration
951
952 </span>
953 </a>
954
955 </li>
956
957 </ul>
958
959 </nav>
960 </div>
961 </div>
962 </div>
963
964
965
966 <div class="md-content" data-md-component="content">
967
968 <article class="md-content__inner md-typeset">
969
970
971
972
973
974
975
976
977 <h1 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h1>
978 <h2 id="environment-variables">Environment Variables<a class="headerlink" href="#environment-variables" title="Permanent link">&para;</a></h2>
979 <p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p>
980 <h3 id="django-settings">Django Settings<a class="headerlink" href="#django-settings" title="Permanent link">&para;</a></h3>
981 <table>
982 <thead>
983 <tr>
984 <th>Variable</th>
985 <th>Default</th>
986 <th>Description</th>
987 </tr>
988 </thead>
989 <tbody>
990 <tr>
991 <td><code>SECRET_KEY</code></td>
992 <td>--</td>
993 <td>Django secret key (required)</td>
994 </tr>
995 <tr>
996 <td><code>DEBUG</code></td>
997 <td><code>False</code></td>
998 <td>Enable debug mode</td>
999 </tr>
1000 <tr>
1001 <td><code>ALLOWED_HOSTS</code></td>
1002 <td><code>localhost</code></td>
1003 <td>Comma-separated list of allowed hosts</td>
1004 </tr>
1005 <tr>
1006 <td><code>TIME_ZONE</code></td>
1007 <td><code>UTC</code></td>
1008 <td>Server timezone</td>
1009 </tr>
1010 </tbody>
1011 </table>
1012 <h3 id="database">Database<a class="headerlink" href="#database" title="Permanent link">&para;</a></h3>
1013 <table>
1014 <thead>
1015 <tr>
1016 <th>Variable</th>
1017 <th>Default</th>
1018 <th>Description</th>
1019 </tr>
1020 </thead>
1021 <tbody>
1022 <tr>
1023 <td><code>POSTGRES_DB</code></td>
1024 <td><code>fossilrepo</code></td>
1025 <td>Database name</td>
1026 </tr>
1027 <tr>
1028 <td><code>POSTGRES_USER</code></td>
1029 <td><code>fossilrepo</code></td>
1030 <td>Database user</td>
1031 </tr>
1032 <tr>
1033 <td><code>POSTGRES_PASSWORD</code></td>
1034 <td>--</td>
1035 <td>Database password (required)</td>
1036 </tr>
1037 <tr>
1038 <td><code>POSTGRES_HOST</code></td>
1039 <td><code>postgres</code></td>
1040 <td>Database host</td>
1041 </tr>
1042 <tr>
1043 <td><code>POSTGRES_PORT</code></td>
1044 <td><code>5432</code></td>
1045 <td>Database port</td>
1046 </tr>
1047 </tbody>
1048 </table>
1049 <h3 id="redis-celery">Redis &amp; Celery<a class="headerlink" href="#redis-celery" title="Permanent link">&para;</a></h3>
1050 <table>
1051 <thead>
1052 <tr>
1053 <th>Variable</th>
1054 <th>Default</th>
1055 <th>Description</th>
1056 </tr>
1057 </thead>
1058 <tbody>
1059 <tr>
1060 <td><code>REDIS_URL</code></td>
1061 <td><code>redis://redis:6379/0</code></td>
1062 <td>Redis connection URL</td>
1063 </tr>
1064 <tr>
1065 <td><code>CELERY_BROKER_URL</code></td>
1066 <td><code>$REDIS_URL</code></td>
1067 <td>Celery broker (defaults to Redis URL)</td>
1068 </tr>
1069 </tbody>
1070 </table>
1071 <h3 id="fossil">Fossil<a class="headerlink" href="#fossil" title="Permanent link">&para;</a></h3>
1072 <table>
1073 <thead>
1074 <tr>
1075 <th>Variable</th>
1076 <th>Default</th>
1077 <th>Description</th>
1078 </tr>
1079 </thead>
1080 <tbody>
1081 <tr>
1082 <td><code>FOSSIL_REPO_DIR</code></td>
1083 <td><code>/data/repos</code></td>
1084 <td>Directory where <code>.fossil</code> files are stored</td>
1085 </tr>
1086 <tr>
1087 <td><code>FOSSIL_BASE_URL</code></td>
1088 <td>--</td>
1089 <td>Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>)</td>
1090 </tr>
1091 <tr>
1092 <td><code>FOSSIL_BINARY</code></td>
1093 <td><code>fossil</code></td>
1094 <td>Path to the Fossil binary</td>
1095 </tr>
1096 </tbody>
1097 </table>
1098 <h3 id="caddy-production">Caddy (Production)<a class="headerlink" href="#caddy-production" title="Permanent link">&para;</a></h3>
1099 <table>
1100 <thead>
1101 <tr>
1102 <th>Variable</th>
1103 <th>Default</th>
1104 <th>Description</th>
1105 </tr>
1106 </thead>
1107 <tbody>
1108 <tr>
1109 <td><code>CADDY_DOMAIN</code></td>
1110 <td>--</td>
1111 <td>Your domain (e.g., <code>example.com</code>)</td>
1112 </tr>
1113 <tr>
1114 <td><code>CADDY_EMAIL</code></td>
1115 <td>--</td>
1116 <td>Email for Let's Encrypt certificates</td>
1117 </tr>
1118 </tbody>
1119 </table>
1120 <h3 id="litestream-backups">Litestream (Backups)<a class="headerlink" href="#litestream-backups" title="Permanent link">&para;</a></h3>
1121 <table>
1122 <thead>
1123 <tr>
1124 <th>Variable</th>
1125 <th>Default</th>
1126 <th>Description</th>
1127 </tr>
1128 </thead>
1129 <tbody>
1130 <tr>
1131 <td><code>LITESTREAM_ACCESS_KEY_ID</code></td>
1132 <td>--</td>
1133 <td>S3 access key</td>
1134 </tr>
1135 <tr>
1136 <td><code>LITESTREAM_SECRET_ACCESS_KEY</code></td>
1137 <td>--</td>
1138 <td>S3 secret key</td>
1139 </tr>
1140 <tr>
1141 <td><code>LITESTREAM_BUCKET</code></td>
1142 <td>--</td>
1143 <td>S3 bucket name</td>
1144 </tr>
1145 <tr>
1146 <td><code>LITESTREAM_ENDPOINT</code></td>
1147 <td>--</td>
1148 <td>S3 endpoint (for MinIO/B2)</td>
1149 </tr>
1150 <tr>
1151 <td><code>LITESTREAM_REGION</code></td>
1152 <td><code>us-east-1</code></td>
1153 <td>S3 region</td>
1154 </tr>
1155 </tbody>
1156 </table>
1157 <h3 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">&para;</a></h3>
1158 <table>
1159 <thead>
1160 <tr>
1161 <th>Variable</th>
1162 <th>Default</th>
1163 <th>Description</th>
1164 </tr>
1165 </thead>
1166 <tbody>
1167 <tr>
1168 <td><code>GITHUB_TOKEN</code></td>
1169 <td>--</td>
1170 <td>GitHub personal access token (for mirroring)</td>
1171 </tr>
1172 <tr>
1173 <td><code>GITLAB_TOKEN</code></td>
1174 <td>--</td>
1175 <td>GitLab personal access token (for mirroring)</td>
1176 </tr>
1177 </tbody>
1178 </table>
1179 <h2 id="caddy-configuration">Caddy Configuration<a class="headerlink" href="#caddy-configuration" title="Permanent link">&para;</a></h2>
1180 <p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p>
1181 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>{$CADDY_DOMAIN} {
1182 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> reverse_proxy django:8000
1183 <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>}
1184 <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
1185 <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>*.{$CADDY_DOMAIN} {
1186 <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> reverse_proxy fossil:8080
1187 <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>}
1188 </code></pre></div>
1189 <p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p>
1190 <h2 id="litestream-configuration">Litestream Configuration<a class="headerlink" href="#litestream-configuration" title="Permanent link">&para;</a></h2>
1191 <p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p>
1192 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nt">dbs</span><span class="p">:</span>
1193 <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/data/repos/*.fossil</span>
1194 <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="nt">replicas</span><span class="p">:</span>
1195 <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">s3</span>
1196 <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="nt">bucket</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_BUCKET}</span>
1197 <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_ENDPOINT}</span>
1198 <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_REGION}</span>
1199 </code></pre></div>
1200 <div class="admonition tip">
1201 <p class="admonition-title">Point-in-time recovery</p>
1202 <p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p>
1203 </div>
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217 </article>
1218 </div>
1219
1220
1221 <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>
1222
1223 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1224 </div>
1225
1226 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1227
1228 <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>
1229 Back to top
1230 </button>
1231
1232 </main>
1233
1234 <footer class="md-footer">
1235
1236 <div class="md-footer-meta md-typeset">
1237 <div class="md-footer-meta__inner md-grid">
1238 <div class="md-copyright">
1239
1240 <div class="md-copyright__highlight">
1241 Copyright &copy; 2026 CONFLICT LLC
1242 </div>
1243
1244
1245 Made with
1246 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1247 Material for MkDocs
1248 </a>
1249
1250 </div>
1251
1252
1253 <div class="md-social">
1254
1255
1256
1257
1258
1259
1260
1261
1262 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1263 <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>
1264 </a>
1265
1266 </div>
1267
1268 </div>
1269 </div>
1270 </footer>
1271
1272 </div>
1273 <div class="md-dialog" data-md-component="dialog">
1274 <div class="md-dialog__inner md-typeset"></div>
1275 </div>
1276
1277
1278
1279
1280
1281 <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>
1282
1283
1284 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1285
1286
1287 </body>
1288 </html>
--- a/site/getting-started/first-repo/index.html
+++ b/site/getting-started/first-repo/index.html
@@ -0,0 +1,1074 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/getting-started/first-repo/">
16
+
17
+
18
+ <link rel="prev" href="../configuration/">
19
+
20
+
21
+ <link rel="next" href="../../architecture/overview/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>First Repository - Fossilrepo</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
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>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#creating-your-first-repository" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
101
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103
+</div>
104
+ </a>
105
+ <label class="md-header__button md-icon" for="__drawer">
106
+
107
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108
+ </label>
109
+ <div class="md-header__title" data-md-component="header-title">
110
+ <div class="md-header__ellipsis">
111
+ <div class="md-header__topic">
112
+ <span class="md-ellipsis">
113
+ Fossilrepo
114
+ </span>
115
+ </div>
116
+ <div class="md-header__topic" data-md-component="header-topic">
117
+ <span class="md-ellipsis">
118
+
119
+ First Repository
120
+
121
+ </span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+
127
+ <form class="md-header__option" data-md-component="palette">
128
+
129
+
130
+
131
+
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">
133
+
134
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136
+ </label>
137
+
138
+
139
+
140
+
141
+
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">
143
+
144
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146
+ </label>
147
+
148
+
149
+</form>
150
+
151
+
152
+
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>
154
+
155
+
156
+
157
+
158
+
159
+ <label class="md-header__button md-icon" for="__search">
160
+
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>
162
+ </label>
163
+ <div class="md-search" data-md-component="search" role="dialog">
164
+ <label class="md-search__overlay" for="__search"></label>
165
+ <div class="md-search__inner" role="search">
166
+ <form class="md-search__form" name="search">
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>
168
+ <label class="md-search__icon md-icon" for="__search">
169
+
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>
171
+
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>
173
+ </label>
174
+ <nav class="md-search__options" aria-label="Search">
175
+
176
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
+
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>
179
+ </button>
180
+ </nav>
181
+
182
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
+
184
+ </form>
185
+ <div class="md-search__output">
186
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187
+ <div class="md-search-result" data-md-component="search-result">
188
+ <div class="md-search-result__meta">
189
+ Initializing search
190
+ </div>
191
+ <ol class="md-search-result__list" role="presentation"></ol>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+</div>
197
+
198
+
199
+
200
+ <div class="md-header__source">
201
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202
+ <div class="md-source__icon md-icon">
203
+
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>
205
+ </div>
206
+ <div class="md-source__repository">
207
+ ConflictHQ/fossilrepo
208
+ </div>
209
+</a>
210
+ </div>
211
+
212
+ </nav>
213
+
214
+</header>
215
+
216
+ <div class="md-container" data-md-component="container">
217
+
218
+
219
+
220
+
221
+
222
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223
+ <div class="md-grid">
224
+ <ul class="md-tabs__list">
225
+
226
+
227
+
228
+
229
+
230
+
231
+ <li class="md-tabs__item">
232
+ <a href="../.." class="md-tabs__link">
233
+
234
+
235
+
236
+
237
+
238
+ Home
239
+
240
+ </a>
241
+ </li>
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+ <li class="md-tabs__item md-tabs__item--active">
255
+ <a href="../prerequisites/" class="md-tabs__link">
256
+
257
+
258
+
259
+ Getting Started
260
+
261
+ </a>
262
+ </li>
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item">
275
+ <a href="../../architecture/overview/" class="md-tabs__link">
276
+
277
+
278
+
279
+ Architecture
280
+
281
+ </a>
282
+ </li>
283
+
284
+
285
+
286
+
287
+ </ul>
288
+ </div>
289
+</nav>
290
+
291
+
292
+
293
+ <main class="md-main" data-md-component="main">
294
+ <div class="md-main__inner md-grid">
295
+
296
+
297
+
298
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299
+ <div class="md-sidebar__scrollwrap">
300
+ <div class="md-sidebar__inner">
301
+
302
+
303
+
304
+
305
+
306
+
307
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308
+ <label class="md-nav__title" for="__drawer">
309
+ <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
311
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313
+</div>
314
+ </a>
315
+ Fossilrepo
316
+ </label>
317
+
318
+ <div class="md-nav__source">
319
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320
+ <div class="md-source__icon md-icon">
321
+
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>
323
+ </div>
324
+ <div class="md-source__repository">
325
+ ConflictHQ/fossilrepo
326
+ </div>
327
+</a>
328
+ </div>
329
+
330
+ <ul class="md-nav__list" data-md-scrollfix>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item">
339
+ <a href="../.." class="md-nav__link">
340
+
341
+
342
+
343
+ <span class="md-ellipsis">
344
+
345
+
346
+ Home
347
+
348
+
349
+
350
+ </span>
351
+
352
+
353
+
354
+ </a>
355
+ </li>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
+
382
+
383
+
384
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
+
386
+
387
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
+
389
+
390
+
391
+ <span class="md-ellipsis">
392
+
393
+
394
+ Getting Started
395
+
396
+
397
+
398
+ </span>
399
+
400
+
401
+
402
+ <span class="md-nav__icon md-icon"></span>
403
+ </label>
404
+
405
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406
+ <label class="md-nav__title" for="__nav_2">
407
+ <span class="md-nav__icon md-icon"></span>
408
+
409
+
410
+ Getting Started
411
+
412
+
413
+ </label>
414
+ <ul class="md-nav__list" data-md-scrollfix>
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+ <li class="md-nav__item">
423
+ <a href="../prerequisites/" class="md-nav__link">
424
+
425
+
426
+
427
+ <span class="md-ellipsis">
428
+
429
+
430
+ Prerequisites
431
+
432
+
433
+
434
+ </span>
435
+
436
+
437
+
438
+ </a>
439
+ </li>
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+ <li class="md-nav__item">
451
+ <a href="../installation/" class="md-nav__link">
452
+
453
+
454
+
455
+ <span class="md-ellipsis">
456
+
457
+
458
+ Installation
459
+
460
+
461
+
462
+ </span>
463
+
464
+
465
+
466
+ </a>
467
+ </li>
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+
478
+ <li class="md-nav__item">
479
+ <a href="../configuration/" class="md-nav__link">
480
+
481
+
482
+
483
+ <span class="md-ellipsis">
484
+
485
+
486
+ Configuration
487
+
488
+
489
+
490
+ </span>
491
+
492
+
493
+
494
+ </a>
495
+ </li>
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+
506
+
507
+
508
+ <li class="md-nav__item md-nav__item--active">
509
+
510
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
511
+
512
+
513
+
514
+
515
+
516
+ <label class="md-nav__link md-nav__link--active" for="__toc">
517
+
518
+
519
+
520
+ <span class="md-ellipsis">
521
+
522
+
523
+ First Repository
524
+
525
+
526
+
527
+ </span>
528
+
529
+
530
+
531
+ <span class="md-nav__icon md-icon"></span>
532
+ </label>
533
+
534
+ <a href="./" class="md-nav__link md-nav__link--active">
535
+
536
+
537
+
538
+ <span class="md-ellipsis">
539
+
540
+
541
+ First Repository
542
+
543
+
544
+
545
+ </span>
546
+
547
+
548
+
549
+ </a>
550
+
551
+
552
+
553
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
554
+
555
+
556
+
557
+
558
+
559
+
560
+ <label class="md-nav__title" for="__toc">
561
+ <span class="md-nav__icon md-icon"></span>
562
+ Table of contents
563
+ </label>
564
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
565
+
566
+ <li class="md-nav__item">
567
+ <a href="#via-the-dashboard" class="md-nav__link">
568
+ <span class="md-ellipsis">
569
+
570
+ Via the Dashboard
571
+
572
+ </span>
573
+ </a>
574
+
575
+</li>
576
+
577
+ <li class="md-nav__item">
578
+ <a href="#via-the-cli" class="md-nav__link">
579
+ <span class="md-ellipsis">
580
+
581
+ Via the CLI
582
+
583
+ </span>
584
+ </a>
585
+
586
+</li>
587
+
588
+ <li class="md-nav__item">
589
+ <a href="#what-happens-under-the-hood" class="md-nav__link">
590
+ <span class="md-ellipsis">
591
+
592
+ What Happens Under the Hood
593
+
594
+ </span>
595
+ </a>
596
+
597
+</li>
598
+
599
+ <li class="md-nav__item">
600
+ <a href="#accessing-your-repository" class="md-nav__link">
601
+ <span class="md-ellipsis">
602
+
603
+ Accessing Your Repository
604
+
605
+ </span>
606
+ </a>
607
+
608
+ <nav class="md-nav" aria-label="Accessing Your Repository">
609
+ <ul class="md-nav__list">
610
+
611
+ <li class="md-nav__item">
612
+ <a href="#web-ui" class="md-nav__link">
613
+ <span class="md-ellipsis">
614
+
615
+ Web UI
616
+
617
+ </span>
618
+ </a>
619
+
620
+</li>
621
+
622
+ <li class="md-nav__item">
623
+ <a href="#clone-via-fossil" class="md-nav__link">
624
+ <span class="md-ellipsis">
625
+
626
+ Clone via Fossil
627
+
628
+ </span>
629
+ </a>
630
+
631
+</li>
632
+
633
+ <li class="md-nav__item">
634
+ <a href="#clone-via-git-mirror" class="md-nav__link">
635
+ <span class="md-ellipsis">
636
+
637
+ Clone via Git (Mirror)
638
+
639
+ </span>
640
+ </a>
641
+
642
+</li>
643
+
644
+ </ul>
645
+ </nav>
646
+
647
+</li>
648
+
649
+ <li class="md-nav__item">
650
+ <a href="#next-steps" class="md-nav__link">
651
+ <span class="md-ellipsis">
652
+
653
+ Next Steps
654
+
655
+ </span>
656
+ </a>
657
+
658
+</li>
659
+
660
+ </ul>
661
+
662
+</nav>
663
+
664
+ </li>
665
+
666
+
667
+
668
+
669
+ </ul>
670
+ </nav>
671
+
672
+ </li>
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+ <li class="md-nav__item md-nav__item--nested">
693
+
694
+
695
+
696
+
697
+
698
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
699
+
700
+
701
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
702
+
703
+
704
+
705
+ <span class="md-ellipsis">
706
+
707
+
708
+ Architecture
709
+
710
+
711
+
712
+ </span>
713
+
714
+
715
+
716
+ <span class="md-nav__icon md-icon"></span>
717
+ </label>
718
+
719
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
720
+ <label class="md-nav__title" for="__nav_3">
721
+ <span class="md-nav__icon md-icon"></span>
722
+
723
+
724
+ Architecture
725
+
726
+
727
+ </label>
728
+ <ul class="md-nav__list" data-md-scrollfix>
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+ <li class="md-nav__item">
737
+ <a href="../../architecture/overview/" class="md-nav__link">
738
+
739
+
740
+
741
+ <span class="md-ellipsis">
742
+
743
+
744
+ Overview
745
+
746
+
747
+
748
+ </span>
749
+
750
+
751
+
752
+ </a>
753
+ </li>
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+
762
+
763
+
764
+ <li class="md-nav__item">
765
+ <a href="../../architecture/sync-bridge/" class="md-nav__link">
766
+
767
+
768
+
769
+ <span class="md-ellipsis">
770
+
771
+
772
+ Sync Bridge
773
+
774
+
775
+
776
+ </span>
777
+
778
+
779
+
780
+ </a>
781
+ </li>
782
+
783
+
784
+
785
+
786
+ </ul>
787
+ </nav>
788
+
789
+ </li>
790
+
791
+
792
+
793
+ </ul>
794
+</nav>
795
+ </div>
796
+ </div>
797
+ </div>
798
+
799
+
800
+
801
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
802
+ <div class="md-sidebar__scrollwrap">
803
+ <div class="md-sidebar__inner">
804
+
805
+
806
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
807
+
808
+
809
+
810
+
811
+
812
+
813
+ <label class="md-nav__title" for="__toc">
814
+ <span class="md-nav__icon md-icon"></span>
815
+ Table of contents
816
+ </label>
817
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
818
+
819
+ <li class="md-nav__item">
820
+ <a href="#via-the-dashboard" class="md-nav__link">
821
+ <span class="md-ellipsis">
822
+
823
+ Via the Dashboard
824
+
825
+ </span>
826
+ </a>
827
+
828
+</li>
829
+
830
+ <li class="md-nav__item">
831
+ <a href="#via-the-cli" class="md-nav__link">
832
+ <span class="md-ellipsis">
833
+
834
+ Via the CLI
835
+
836
+ </span>
837
+ </a>
838
+
839
+</li>
840
+
841
+ <li class="md-nav__item">
842
+ <a href="#what-happens-under-the-hood" class="md-nav__link">
843
+ <span class="md-ellipsis">
844
+
845
+ What Happens Under the Hood
846
+
847
+ </span>
848
+ </a>
849
+
850
+</li>
851
+
852
+ <li class="md-nav__item">
853
+ <a href="#accessing-your-repository" class="md-nav__link">
854
+ <span class="md-ellipsis">
855
+
856
+ Accessing Your Repository
857
+
858
+ </span>
859
+ </a>
860
+
861
+ <nav class="md-nav" aria-label="Accessing Your Repository">
862
+ <ul class="md-nav__list">
863
+
864
+ <li class="md-nav__item">
865
+ <a href="#web-ui" class="md-nav__link">
866
+ <span class="md-ellipsis">
867
+
868
+ Web UI
869
+
870
+ </span>
871
+ </a>
872
+
873
+</li>
874
+
875
+ <li class="md-nav__item">
876
+ <a href="#clone-via-fossil" class="md-nav__link">
877
+ <span class="md-ellipsis">
878
+
879
+ Clone via Fossil
880
+
881
+ </span>
882
+ </a>
883
+
884
+</li>
885
+
886
+ <li class="md-nav__item">
887
+ <a href="#clone-via-git-mirror" class="md-nav__link">
888
+ <span class="md-ellipsis">
889
+
890
+ Clone via Git (Mirror)
891
+
892
+ </span>
893
+ </a>
894
+
895
+</li>
896
+
897
+ </ul>
898
+ </nav>
899
+
900
+</li>
901
+
902
+ <li class="md-nav__item">
903
+ <a href="#next-steps" class="md-nav__link">
904
+ <span class="md-ellipsis">
905
+
906
+ Next Steps
907
+
908
+ </span>
909
+ </a>
910
+
911
+</li>
912
+
913
+ </ul>
914
+
915
+</nav>
916
+ </div>
917
+ </div>
918
+ </div>
919
+
920
+
921
+
922
+ <div class="md-content" data-md-component="content">
923
+
924
+ <article class="md-content__inner md-typeset">
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+<h1 id="creating-your-first-repository">Creating Your First Repository<a class="headerlink" href="#creating-your-first-repository" title="Permanent link">&para;</a></h1>
934
+<p>Once fossilrepo is running, you can create your first Fossil repository.</p>
935
+<h2 id="via-the-dashboard">Via the Dashboard<a class="headerlink" href="#via-the-dashboard" title="Permanent link">&para;</a></h2>
936
+<ol>
937
+<li>Log in at <code>http://localhost:8000</code></li>
938
+<li>Navigate to <strong>Repositories</strong> in the sidebar</li>
939
+<li>Click <strong>Create Repository</strong></li>
940
+<li>Enter a name (e.g., <code>my-project</code>)</li>
941
+<li>Click <strong>Create</strong></li>
942
+</ol>
943
+<p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p>
944
+<h2 id="via-the-cli">Via the CLI<a class="headerlink" href="#via-the-cli" title="Permanent link">&para;</a></h2>
945
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Inside the fossilrepo container</span>
946
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></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_create<span class="w"> </span>my-project
947
+</code></pre></div>
948
+<p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p>
949
+<h2 id="what-happens-under-the-hood">What Happens Under the Hood<a class="headerlink" href="#what-happens-under-the-hood" title="Permanent link">&para;</a></h2>
950
+<pre class="mermaid"><code>sequenceDiagram
951
+ participant User
952
+ participant Django
953
+ participant Fossil
954
+ participant Litestream
955
+ participant S3
956
+
957
+ User-&gt;&gt;Django: Create repo "my-project"
958
+ Django-&gt;&gt;Fossil: fossil init /data/repos/my-project.fossil
959
+ Fossil--&gt;&gt;Django: Repository created
960
+ Django-&gt;&gt;Django: Register in database
961
+ Litestream-&gt;&gt;S3: Begin replicating my-project.fossil
962
+ Django--&gt;&gt;User: Repository ready</code></pre>
963
+<h2 id="accessing-your-repository">Accessing Your Repository<a class="headerlink" href="#accessing-your-repository" title="Permanent link">&para;</a></h2>
964
+<h3 id="web-ui">Web UI<a class="headerlink" href="#web-ui" title="Permanent link">&para;</a></h3>
965
+<p>Fossil includes a built-in web interface with:</p>
966
+<ul>
967
+<li><strong>Timeline</strong> -- commit history with diffs</li>
968
+<li><strong>Tickets</strong> -- issue tracker</li>
969
+<li><strong>Wiki</strong> -- project documentation</li>
970
+<li><strong>Forum</strong> -- discussions</li>
971
+</ul>
972
+<h3 id="clone-via-fossil">Clone via Fossil<a class="headerlink" href="#clone-via-fossil" title="Permanent link">&para;</a></h3>
973
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>fossil<span class="w"> </span>clone<span class="w"> </span>https://my-project.your-domain.com<span class="w"> </span>my-project.fossil
974
+<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>fossil<span class="w"> </span>open<span class="w"> </span>my-project.fossil
975
+</code></pre></div>
976
+<h3 id="clone-via-git-mirror">Clone via Git (Mirror)<a class="headerlink" href="#clone-via-git-mirror" title="Permanent link">&para;</a></h3>
977
+<p>If you've configured the sync bridge:</p>
978
+<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/your-org/my-project.git
979
+</code></pre></div>
980
+<div class="admonition warning">
981
+<p class="admonition-title">Read-only mirror</p>
982
+<p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p>
983
+</div>
984
+<h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
985
+<ul>
986
+<li><a href="../../architecture/sync-bridge/">Configure the sync bridge</a> to mirror to GitHub/GitLab</li>
987
+<li><a href="../configuration/#litestream-backups">Set up backups</a> with Litestream</li>
988
+<li>Explore the <a href="../../architecture/overview/">architecture overview</a></li>
989
+</ul>
990
+
991
+
992
+
993
+
994
+
995
+
996
+
997
+
998
+
999
+
1000
+
1001
+
1002
+
1003
+ </article>
1004
+ </div>
1005
+
1006
+
1007
+ <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>
1008
+
1009
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1010
+ </div>
1011
+
1012
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1013
+
1014
+ <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>
1015
+ Back to top
1016
+</button>
1017
+
1018
+ </main>
1019
+
1020
+ <footer class="md-footer">
1021
+
1022
+ <div class="md-footer-meta md-typeset">
1023
+ <div class="md-footer-meta__inner md-grid">
1024
+ <div class="md-copyright">
1025
+
1026
+ <div class="md-copyright__highlight">
1027
+ Copyright &copy; 2026 CONFLICT LLC
1028
+ </div>
1029
+
1030
+
1031
+ Made with
1032
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1033
+ Material for MkDocs
1034
+ </a>
1035
+
1036
+</div>
1037
+
1038
+
1039
+<div class="md-social">
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1049
+ <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>
1050
+ </a>
1051
+
1052
+</div>
1053
+
1054
+ </div>
1055
+ </div>
1056
+</footer>
1057
+
1058
+ </div>
1059
+ <div class="md-dialog" data-md-component="dialog">
1060
+ <div class="md-dialog__inner md-typeset"></div>
1061
+ </div>
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+ <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>
1068
+
1069
+
1070
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1071
+
1072
+
1073
+ </body>
1074
+</html>
--- a/site/getting-started/first-repo/index.html
+++ b/site/getting-started/first-repo/index.html
@@ -0,0 +1,1074 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/getting-started/first-repo/index.html
+++ b/site/getting-started/first-repo/index.html
@@ -0,0 +1,1074 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/getting-started/first-repo/">
16
17
18 <link rel="prev" href="../configuration/">
19
20
21 <link rel="next" href="../../architecture/overview/">
22
23
24
25
26
27 <link rel="icon" href="../../assets/images/favicon.png">
28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
30
31
32 <title>First Repository - Fossilrepo</title>
33
34
35
36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
38
39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
41
42
43
44
45
46
47
48
49
50
51
52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
56
57
58 <link rel="stylesheet" href="../../assets/css/custom.css">
59
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>
61
62
63
64
65
66 </head>
67
68
69
70
71
72
73
74
75
76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
78
79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81 <label class="md-overlay" for="__drawer"></label>
82 <div data-md-component="skip">
83
84
85 <a href="#creating-your-first-repository" class="md-skip">
86 Skip to content
87 </a>
88
89 </div>
90 <div data-md-component="announce">
91
92 </div>
93
94
95
96
97 <header class="md-header" data-md-component="header">
98 <nav class="md-header__inner md-grid" aria-label="Header">
99 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100 <div style="display: flex; align-items: center; gap: 0.6rem;">
101 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103 </div>
104 </a>
105 <label class="md-header__button md-icon" for="__drawer">
106
107 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108 </label>
109 <div class="md-header__title" data-md-component="header-title">
110 <div class="md-header__ellipsis">
111 <div class="md-header__topic">
112 <span class="md-ellipsis">
113 Fossilrepo
114 </span>
115 </div>
116 <div class="md-header__topic" data-md-component="header-topic">
117 <span class="md-ellipsis">
118
119 First Repository
120
121 </span>
122 </div>
123 </div>
124 </div>
125
126
127 <form class="md-header__option" data-md-component="palette">
128
129
130
131
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">
133
134 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136 </label>
137
138
139
140
141
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">
143
144 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146 </label>
147
148
149 </form>
150
151
152
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>
154
155
156
157
158
159 <label class="md-header__button md-icon" for="__search">
160
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>
162 </label>
163 <div class="md-search" data-md-component="search" role="dialog">
164 <label class="md-search__overlay" for="__search"></label>
165 <div class="md-search__inner" role="search">
166 <form class="md-search__form" name="search">
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>
168 <label class="md-search__icon md-icon" for="__search">
169
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>
171
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>
173 </label>
174 <nav class="md-search__options" aria-label="Search">
175
176 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
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>
179 </button>
180 </nav>
181
182 <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
184 </form>
185 <div class="md-search__output">
186 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187 <div class="md-search-result" data-md-component="search-result">
188 <div class="md-search-result__meta">
189 Initializing search
190 </div>
191 <ol class="md-search-result__list" role="presentation"></ol>
192 </div>
193 </div>
194 </div>
195 </div>
196 </div>
197
198
199
200 <div class="md-header__source">
201 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
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>
205 </div>
206 <div class="md-source__repository">
207 ConflictHQ/fossilrepo
208 </div>
209 </a>
210 </div>
211
212 </nav>
213
214 </header>
215
216 <div class="md-container" data-md-component="container">
217
218
219
220
221
222 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223 <div class="md-grid">
224 <ul class="md-tabs__list">
225
226
227
228
229
230
231 <li class="md-tabs__item">
232 <a href="../.." class="md-tabs__link">
233
234
235
236
237
238 Home
239
240 </a>
241 </li>
242
243
244
245
246
247
248
249
250
251
252
253
254 <li class="md-tabs__item md-tabs__item--active">
255 <a href="../prerequisites/" class="md-tabs__link">
256
257
258
259 Getting Started
260
261 </a>
262 </li>
263
264
265
266
267
268
269
270
271
272
273
274 <li class="md-tabs__item">
275 <a href="../../architecture/overview/" class="md-tabs__link">
276
277
278
279 Architecture
280
281 </a>
282 </li>
283
284
285
286
287 </ul>
288 </div>
289 </nav>
290
291
292
293 <main class="md-main" data-md-component="main">
294 <div class="md-main__inner md-grid">
295
296
297
298 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299 <div class="md-sidebar__scrollwrap">
300 <div class="md-sidebar__inner">
301
302
303
304
305
306
307 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308 <label class="md-nav__title" for="__drawer">
309 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310 <div style="display: flex; align-items: center; gap: 0.6rem;">
311 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313 </div>
314 </a>
315 Fossilrepo
316 </label>
317
318 <div class="md-nav__source">
319 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320 <div class="md-source__icon md-icon">
321
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>
323 </div>
324 <div class="md-source__repository">
325 ConflictHQ/fossilrepo
326 </div>
327 </a>
328 </div>
329
330 <ul class="md-nav__list" data-md-scrollfix>
331
332
333
334
335
336
337
338 <li class="md-nav__item">
339 <a href="../.." class="md-nav__link">
340
341
342
343 <span class="md-ellipsis">
344
345
346 Home
347
348
349
350 </span>
351
352
353
354 </a>
355 </li>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
382
383
384 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
386
387 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
389
390
391 <span class="md-ellipsis">
392
393
394 Getting Started
395
396
397
398 </span>
399
400
401
402 <span class="md-nav__icon md-icon"></span>
403 </label>
404
405 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406 <label class="md-nav__title" for="__nav_2">
407 <span class="md-nav__icon md-icon"></span>
408
409
410 Getting Started
411
412
413 </label>
414 <ul class="md-nav__list" data-md-scrollfix>
415
416
417
418
419
420
421
422 <li class="md-nav__item">
423 <a href="../prerequisites/" class="md-nav__link">
424
425
426
427 <span class="md-ellipsis">
428
429
430 Prerequisites
431
432
433
434 </span>
435
436
437
438 </a>
439 </li>
440
441
442
443
444
445
446
447
448
449
450 <li class="md-nav__item">
451 <a href="../installation/" class="md-nav__link">
452
453
454
455 <span class="md-ellipsis">
456
457
458 Installation
459
460
461
462 </span>
463
464
465
466 </a>
467 </li>
468
469
470
471
472
473
474
475
476
477
478 <li class="md-nav__item">
479 <a href="../configuration/" class="md-nav__link">
480
481
482
483 <span class="md-ellipsis">
484
485
486 Configuration
487
488
489
490 </span>
491
492
493
494 </a>
495 </li>
496
497
498
499
500
501
502
503
504
505
506
507
508 <li class="md-nav__item md-nav__item--active">
509
510 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
511
512
513
514
515
516 <label class="md-nav__link md-nav__link--active" for="__toc">
517
518
519
520 <span class="md-ellipsis">
521
522
523 First Repository
524
525
526
527 </span>
528
529
530
531 <span class="md-nav__icon md-icon"></span>
532 </label>
533
534 <a href="./" class="md-nav__link md-nav__link--active">
535
536
537
538 <span class="md-ellipsis">
539
540
541 First Repository
542
543
544
545 </span>
546
547
548
549 </a>
550
551
552
553 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
554
555
556
557
558
559
560 <label class="md-nav__title" for="__toc">
561 <span class="md-nav__icon md-icon"></span>
562 Table of contents
563 </label>
564 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
565
566 <li class="md-nav__item">
567 <a href="#via-the-dashboard" class="md-nav__link">
568 <span class="md-ellipsis">
569
570 Via the Dashboard
571
572 </span>
573 </a>
574
575 </li>
576
577 <li class="md-nav__item">
578 <a href="#via-the-cli" class="md-nav__link">
579 <span class="md-ellipsis">
580
581 Via the CLI
582
583 </span>
584 </a>
585
586 </li>
587
588 <li class="md-nav__item">
589 <a href="#what-happens-under-the-hood" class="md-nav__link">
590 <span class="md-ellipsis">
591
592 What Happens Under the Hood
593
594 </span>
595 </a>
596
597 </li>
598
599 <li class="md-nav__item">
600 <a href="#accessing-your-repository" class="md-nav__link">
601 <span class="md-ellipsis">
602
603 Accessing Your Repository
604
605 </span>
606 </a>
607
608 <nav class="md-nav" aria-label="Accessing Your Repository">
609 <ul class="md-nav__list">
610
611 <li class="md-nav__item">
612 <a href="#web-ui" class="md-nav__link">
613 <span class="md-ellipsis">
614
615 Web UI
616
617 </span>
618 </a>
619
620 </li>
621
622 <li class="md-nav__item">
623 <a href="#clone-via-fossil" class="md-nav__link">
624 <span class="md-ellipsis">
625
626 Clone via Fossil
627
628 </span>
629 </a>
630
631 </li>
632
633 <li class="md-nav__item">
634 <a href="#clone-via-git-mirror" class="md-nav__link">
635 <span class="md-ellipsis">
636
637 Clone via Git (Mirror)
638
639 </span>
640 </a>
641
642 </li>
643
644 </ul>
645 </nav>
646
647 </li>
648
649 <li class="md-nav__item">
650 <a href="#next-steps" class="md-nav__link">
651 <span class="md-ellipsis">
652
653 Next Steps
654
655 </span>
656 </a>
657
658 </li>
659
660 </ul>
661
662 </nav>
663
664 </li>
665
666
667
668
669 </ul>
670 </nav>
671
672 </li>
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692 <li class="md-nav__item md-nav__item--nested">
693
694
695
696
697
698 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
699
700
701 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
702
703
704
705 <span class="md-ellipsis">
706
707
708 Architecture
709
710
711
712 </span>
713
714
715
716 <span class="md-nav__icon md-icon"></span>
717 </label>
718
719 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
720 <label class="md-nav__title" for="__nav_3">
721 <span class="md-nav__icon md-icon"></span>
722
723
724 Architecture
725
726
727 </label>
728 <ul class="md-nav__list" data-md-scrollfix>
729
730
731
732
733
734
735
736 <li class="md-nav__item">
737 <a href="../../architecture/overview/" class="md-nav__link">
738
739
740
741 <span class="md-ellipsis">
742
743
744 Overview
745
746
747
748 </span>
749
750
751
752 </a>
753 </li>
754
755
756
757
758
759
760
761
762
763
764 <li class="md-nav__item">
765 <a href="../../architecture/sync-bridge/" class="md-nav__link">
766
767
768
769 <span class="md-ellipsis">
770
771
772 Sync Bridge
773
774
775
776 </span>
777
778
779
780 </a>
781 </li>
782
783
784
785
786 </ul>
787 </nav>
788
789 </li>
790
791
792
793 </ul>
794 </nav>
795 </div>
796 </div>
797 </div>
798
799
800
801 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
802 <div class="md-sidebar__scrollwrap">
803 <div class="md-sidebar__inner">
804
805
806 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
807
808
809
810
811
812
813 <label class="md-nav__title" for="__toc">
814 <span class="md-nav__icon md-icon"></span>
815 Table of contents
816 </label>
817 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
818
819 <li class="md-nav__item">
820 <a href="#via-the-dashboard" class="md-nav__link">
821 <span class="md-ellipsis">
822
823 Via the Dashboard
824
825 </span>
826 </a>
827
828 </li>
829
830 <li class="md-nav__item">
831 <a href="#via-the-cli" class="md-nav__link">
832 <span class="md-ellipsis">
833
834 Via the CLI
835
836 </span>
837 </a>
838
839 </li>
840
841 <li class="md-nav__item">
842 <a href="#what-happens-under-the-hood" class="md-nav__link">
843 <span class="md-ellipsis">
844
845 What Happens Under the Hood
846
847 </span>
848 </a>
849
850 </li>
851
852 <li class="md-nav__item">
853 <a href="#accessing-your-repository" class="md-nav__link">
854 <span class="md-ellipsis">
855
856 Accessing Your Repository
857
858 </span>
859 </a>
860
861 <nav class="md-nav" aria-label="Accessing Your Repository">
862 <ul class="md-nav__list">
863
864 <li class="md-nav__item">
865 <a href="#web-ui" class="md-nav__link">
866 <span class="md-ellipsis">
867
868 Web UI
869
870 </span>
871 </a>
872
873 </li>
874
875 <li class="md-nav__item">
876 <a href="#clone-via-fossil" class="md-nav__link">
877 <span class="md-ellipsis">
878
879 Clone via Fossil
880
881 </span>
882 </a>
883
884 </li>
885
886 <li class="md-nav__item">
887 <a href="#clone-via-git-mirror" class="md-nav__link">
888 <span class="md-ellipsis">
889
890 Clone via Git (Mirror)
891
892 </span>
893 </a>
894
895 </li>
896
897 </ul>
898 </nav>
899
900 </li>
901
902 <li class="md-nav__item">
903 <a href="#next-steps" class="md-nav__link">
904 <span class="md-ellipsis">
905
906 Next Steps
907
908 </span>
909 </a>
910
911 </li>
912
913 </ul>
914
915 </nav>
916 </div>
917 </div>
918 </div>
919
920
921
922 <div class="md-content" data-md-component="content">
923
924 <article class="md-content__inner md-typeset">
925
926
927
928
929
930
931
932
933 <h1 id="creating-your-first-repository">Creating Your First Repository<a class="headerlink" href="#creating-your-first-repository" title="Permanent link">&para;</a></h1>
934 <p>Once fossilrepo is running, you can create your first Fossil repository.</p>
935 <h2 id="via-the-dashboard">Via the Dashboard<a class="headerlink" href="#via-the-dashboard" title="Permanent link">&para;</a></h2>
936 <ol>
937 <li>Log in at <code>http://localhost:8000</code></li>
938 <li>Navigate to <strong>Repositories</strong> in the sidebar</li>
939 <li>Click <strong>Create Repository</strong></li>
940 <li>Enter a name (e.g., <code>my-project</code>)</li>
941 <li>Click <strong>Create</strong></li>
942 </ol>
943 <p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p>
944 <h2 id="via-the-cli">Via the CLI<a class="headerlink" href="#via-the-cli" title="Permanent link">&para;</a></h2>
945 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Inside the fossilrepo container</span>
946 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></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_create<span class="w"> </span>my-project
947 </code></pre></div>
948 <p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p>
949 <h2 id="what-happens-under-the-hood">What Happens Under the Hood<a class="headerlink" href="#what-happens-under-the-hood" title="Permanent link">&para;</a></h2>
950 <pre class="mermaid"><code>sequenceDiagram
951 participant User
952 participant Django
953 participant Fossil
954 participant Litestream
955 participant S3
956
957 User-&gt;&gt;Django: Create repo "my-project"
958 Django-&gt;&gt;Fossil: fossil init /data/repos/my-project.fossil
959 Fossil--&gt;&gt;Django: Repository created
960 Django-&gt;&gt;Django: Register in database
961 Litestream-&gt;&gt;S3: Begin replicating my-project.fossil
962 Django--&gt;&gt;User: Repository ready</code></pre>
963 <h2 id="accessing-your-repository">Accessing Your Repository<a class="headerlink" href="#accessing-your-repository" title="Permanent link">&para;</a></h2>
964 <h3 id="web-ui">Web UI<a class="headerlink" href="#web-ui" title="Permanent link">&para;</a></h3>
965 <p>Fossil includes a built-in web interface with:</p>
966 <ul>
967 <li><strong>Timeline</strong> -- commit history with diffs</li>
968 <li><strong>Tickets</strong> -- issue tracker</li>
969 <li><strong>Wiki</strong> -- project documentation</li>
970 <li><strong>Forum</strong> -- discussions</li>
971 </ul>
972 <h3 id="clone-via-fossil">Clone via Fossil<a class="headerlink" href="#clone-via-fossil" title="Permanent link">&para;</a></h3>
973 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>fossil<span class="w"> </span>clone<span class="w"> </span>https://my-project.your-domain.com<span class="w"> </span>my-project.fossil
974 <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>fossil<span class="w"> </span>open<span class="w"> </span>my-project.fossil
975 </code></pre></div>
976 <h3 id="clone-via-git-mirror">Clone via Git (Mirror)<a class="headerlink" href="#clone-via-git-mirror" title="Permanent link">&para;</a></h3>
977 <p>If you've configured the sync bridge:</p>
978 <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/your-org/my-project.git
979 </code></pre></div>
980 <div class="admonition warning">
981 <p class="admonition-title">Read-only mirror</p>
982 <p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p>
983 </div>
984 <h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
985 <ul>
986 <li><a href="../../architecture/sync-bridge/">Configure the sync bridge</a> to mirror to GitHub/GitLab</li>
987 <li><a href="../configuration/#litestream-backups">Set up backups</a> with Litestream</li>
988 <li>Explore the <a href="../../architecture/overview/">architecture overview</a></li>
989 </ul>
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003 </article>
1004 </div>
1005
1006
1007 <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>
1008
1009 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1010 </div>
1011
1012 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1013
1014 <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>
1015 Back to top
1016 </button>
1017
1018 </main>
1019
1020 <footer class="md-footer">
1021
1022 <div class="md-footer-meta md-typeset">
1023 <div class="md-footer-meta__inner md-grid">
1024 <div class="md-copyright">
1025
1026 <div class="md-copyright__highlight">
1027 Copyright &copy; 2026 CONFLICT LLC
1028 </div>
1029
1030
1031 Made with
1032 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1033 Material for MkDocs
1034 </a>
1035
1036 </div>
1037
1038
1039 <div class="md-social">
1040
1041
1042
1043
1044
1045
1046
1047
1048 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1049 <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>
1050 </a>
1051
1052 </div>
1053
1054 </div>
1055 </div>
1056 </footer>
1057
1058 </div>
1059 <div class="md-dialog" data-md-component="dialog">
1060 <div class="md-dialog__inner md-typeset"></div>
1061 </div>
1062
1063
1064
1065
1066
1067 <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>
1068
1069
1070 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1071
1072
1073 </body>
1074 </html>
--- a/site/getting-started/installation/index.html
+++ b/site/getting-started/installation/index.html
@@ -0,0 +1,1089 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/getting-started/installation/">
16
+
17
+
18
+ <link rel="prev" href="../prerequisites/">
19
+
20
+
21
+ <link rel="next" href="../configuration/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>Installation - Fossilrepo</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
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>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#installation" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
101
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103
+</div>
104
+ </a>
105
+ <label class="md-header__button md-icon" for="__drawer">
106
+
107
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108
+ </label>
109
+ <div class="md-header__title" data-md-component="header-title">
110
+ <div class="md-header__ellipsis">
111
+ <div class="md-header__topic">
112
+ <span class="md-ellipsis">
113
+ Fossilrepo
114
+ </span>
115
+ </div>
116
+ <div class="md-header__topic" data-md-component="header-topic">
117
+ <span class="md-ellipsis">
118
+
119
+ Installation
120
+
121
+ </span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+
127
+ <form class="md-header__option" data-md-component="palette">
128
+
129
+
130
+
131
+
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">
133
+
134
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136
+ </label>
137
+
138
+
139
+
140
+
141
+
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">
143
+
144
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146
+ </label>
147
+
148
+
149
+</form>
150
+
151
+
152
+
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>
154
+
155
+
156
+
157
+
158
+
159
+ <label class="md-header__button md-icon" for="__search">
160
+
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>
162
+ </label>
163
+ <div class="md-search" data-md-component="search" role="dialog">
164
+ <label class="md-search__overlay" for="__search"></label>
165
+ <div class="md-search__inner" role="search">
166
+ <form class="md-search__form" name="search">
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>
168
+ <label class="md-search__icon md-icon" for="__search">
169
+
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>
171
+
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>
173
+ </label>
174
+ <nav class="md-search__options" aria-label="Search">
175
+
176
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
+
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>
179
+ </button>
180
+ </nav>
181
+
182
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
+
184
+ </form>
185
+ <div class="md-search__output">
186
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187
+ <div class="md-search-result" data-md-component="search-result">
188
+ <div class="md-search-result__meta">
189
+ Initializing search
190
+ </div>
191
+ <ol class="md-search-result__list" role="presentation"></ol>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+</div>
197
+
198
+
199
+
200
+ <div class="md-header__source">
201
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202
+ <div class="md-source__icon md-icon">
203
+
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>
205
+ </div>
206
+ <div class="md-source__repository">
207
+ ConflictHQ/fossilrepo
208
+ </div>
209
+</a>
210
+ </div>
211
+
212
+ </nav>
213
+
214
+</header>
215
+
216
+ <div class="md-container" data-md-component="container">
217
+
218
+
219
+
220
+
221
+
222
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223
+ <div class="md-grid">
224
+ <ul class="md-tabs__list">
225
+
226
+
227
+
228
+
229
+
230
+
231
+ <li class="md-tabs__item">
232
+ <a href="../.." class="md-tabs__link">
233
+
234
+
235
+
236
+
237
+
238
+ Home
239
+
240
+ </a>
241
+ </li>
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+ <li class="md-tabs__item md-tabs__item--active">
255
+ <a href="../prerequisites/" class="md-tabs__link">
256
+
257
+
258
+
259
+ Getting Started
260
+
261
+ </a>
262
+ </li>
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item">
275
+ <a href="../../architecture/overview/" class="md-tabs__link">
276
+
277
+
278
+
279
+ Architecture
280
+
281
+ </a>
282
+ </li>
283
+
284
+
285
+
286
+
287
+ </ul>
288
+ </div>
289
+</nav>
290
+
291
+
292
+
293
+ <main class="md-main" data-md-component="main">
294
+ <div class="md-main__inner md-grid">
295
+
296
+
297
+
298
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299
+ <div class="md-sidebar__scrollwrap">
300
+ <div class="md-sidebar__inner">
301
+
302
+
303
+
304
+
305
+
306
+
307
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308
+ <label class="md-nav__title" for="__drawer">
309
+ <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
311
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313
+</div>
314
+ </a>
315
+ Fossilrepo
316
+ </label>
317
+
318
+ <div class="md-nav__source">
319
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320
+ <div class="md-source__icon md-icon">
321
+
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>
323
+ </div>
324
+ <div class="md-source__repository">
325
+ ConflictHQ/fossilrepo
326
+ </div>
327
+</a>
328
+ </div>
329
+
330
+ <ul class="md-nav__list" data-md-scrollfix>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item">
339
+ <a href="../.." class="md-nav__link">
340
+
341
+
342
+
343
+ <span class="md-ellipsis">
344
+
345
+
346
+ Home
347
+
348
+
349
+
350
+ </span>
351
+
352
+
353
+
354
+ </a>
355
+ </li>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
+
382
+
383
+
384
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
+
386
+
387
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
+
389
+
390
+
391
+ <span class="md-ellipsis">
392
+
393
+
394
+ Getting Started
395
+
396
+
397
+
398
+ </span>
399
+
400
+
401
+
402
+ <span class="md-nav__icon md-icon"></span>
403
+ </label>
404
+
405
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406
+ <label class="md-nav__title" for="__nav_2">
407
+ <span class="md-nav__icon md-icon"></span>
408
+
409
+
410
+ Getting Started
411
+
412
+
413
+ </label>
414
+ <ul class="md-nav__list" data-md-scrollfix>
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+ <li class="md-nav__item">
423
+ <a href="../prerequisites/" class="md-nav__link">
424
+
425
+
426
+
427
+ <span class="md-ellipsis">
428
+
429
+
430
+ Prerequisites
431
+
432
+
433
+
434
+ </span>
435
+
436
+
437
+
438
+ </a>
439
+ </li>
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+
451
+
452
+ <li class="md-nav__item md-nav__item--active">
453
+
454
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
455
+
456
+
457
+
458
+
459
+
460
+ <label class="md-nav__link md-nav__link--active" for="__toc">
461
+
462
+
463
+
464
+ <span class="md-ellipsis">
465
+
466
+
467
+ Installation
468
+
469
+
470
+
471
+ </span>
472
+
473
+
474
+
475
+ <span class="md-nav__icon md-icon"></span>
476
+ </label>
477
+
478
+ <a href="./" class="md-nav__link md-nav__link--active">
479
+
480
+
481
+
482
+ <span class="md-ellipsis">
483
+
484
+
485
+ Installation
486
+
487
+
488
+
489
+ </span>
490
+
491
+
492
+
493
+ </a>
494
+
495
+
496
+
497
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
498
+
499
+
500
+
501
+
502
+
503
+
504
+ <label class="md-nav__title" for="__toc">
505
+ <span class="md-nav__icon md-icon"></span>
506
+ Table of contents
507
+ </label>
508
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
509
+
510
+ <li class="md-nav__item">
511
+ <a href="#clone-the-repository" class="md-nav__link">
512
+ <span class="md-ellipsis">
513
+
514
+ Clone the Repository
515
+
516
+ </span>
517
+ </a>
518
+
519
+</li>
520
+
521
+ <li class="md-nav__item">
522
+ <a href="#environment-configuration" class="md-nav__link">
523
+ <span class="md-ellipsis">
524
+
525
+ Environment Configuration
526
+
527
+ </span>
528
+ </a>
529
+
530
+</li>
531
+
532
+ <li class="md-nav__item">
533
+ <a href="#start-the-stack" class="md-nav__link">
534
+ <span class="md-ellipsis">
535
+
536
+ Start the Stack
537
+
538
+ </span>
539
+ </a>
540
+
541
+ <nav class="md-nav" aria-label="Start the Stack">
542
+ <ul class="md-nav__list">
543
+
544
+ <li class="md-nav__item">
545
+ <a href="#development" class="md-nav__link">
546
+ <span class="md-ellipsis">
547
+
548
+ Development
549
+
550
+ </span>
551
+ </a>
552
+
553
+</li>
554
+
555
+ <li class="md-nav__item">
556
+ <a href="#production" class="md-nav__link">
557
+ <span class="md-ellipsis">
558
+
559
+ Production
560
+
561
+ </span>
562
+ </a>
563
+
564
+</li>
565
+
566
+ </ul>
567
+ </nav>
568
+
569
+</li>
570
+
571
+ <li class="md-nav__item">
572
+ <a href="#verify-installation" class="md-nav__link">
573
+ <span class="md-ellipsis">
574
+
575
+ Verify Installation
576
+
577
+ </span>
578
+ </a>
579
+
580
+</li>
581
+
582
+ <li class="md-nav__item">
583
+ <a href="#common-issues" class="md-nav__link">
584
+ <span class="md-ellipsis">
585
+
586
+ Common Issues
587
+
588
+ </span>
589
+ </a>
590
+
591
+</li>
592
+
593
+ </ul>
594
+
595
+</nav>
596
+
597
+ </li>
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+ <li class="md-nav__item">
609
+ <a href="../configuration/" class="md-nav__link">
610
+
611
+
612
+
613
+ <span class="md-ellipsis">
614
+
615
+
616
+ Configuration
617
+
618
+
619
+
620
+ </span>
621
+
622
+
623
+
624
+ </a>
625
+ </li>
626
+
627
+
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+ <li class="md-nav__item">
637
+ <a href="../first-repo/" class="md-nav__link">
638
+
639
+
640
+
641
+ <span class="md-ellipsis">
642
+
643
+
644
+ First Repository
645
+
646
+
647
+
648
+ </span>
649
+
650
+
651
+
652
+ </a>
653
+ </li>
654
+
655
+
656
+
657
+
658
+ </ul>
659
+ </nav>
660
+
661
+ </li>
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+ <li class="md-nav__item md-nav__item--nested">
682
+
683
+
684
+
685
+
686
+
687
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
688
+
689
+
690
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
691
+
692
+
693
+
694
+ <span class="md-ellipsis">
695
+
696
+
697
+ Architecture
698
+
699
+
700
+
701
+ </span>
702
+
703
+
704
+
705
+ <span class="md-nav__icon md-icon"></span>
706
+ </label>
707
+
708
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
709
+ <label class="md-nav__title" for="__nav_3">
710
+ <span class="md-nav__icon md-icon"></span>
711
+
712
+
713
+ Architecture
714
+
715
+
716
+ </label>
717
+ <ul class="md-nav__list" data-md-scrollfix>
718
+
719
+
720
+
721
+
722
+
723
+
724
+
725
+ <li class="md-nav__item">
726
+ <a href="../../architecture/overview/" class="md-nav__link">
727
+
728
+
729
+
730
+ <span class="md-ellipsis">
731
+
732
+
733
+ Overview
734
+
735
+
736
+
737
+ </span>
738
+
739
+
740
+
741
+ </a>
742
+ </li>
743
+
744
+
745
+
746
+
747
+
748
+
749
+
750
+
751
+
752
+
753
+ <li class="md-nav__item">
754
+ <a href="../../architecture/sync-bridge/" class="md-nav__link">
755
+
756
+
757
+
758
+ <span class="md-ellipsis">
759
+
760
+
761
+ Sync Bridge
762
+
763
+
764
+
765
+ </span>
766
+
767
+
768
+
769
+ </a>
770
+ </li>
771
+
772
+
773
+
774
+
775
+ </ul>
776
+ </nav>
777
+
778
+ </li>
779
+
780
+
781
+
782
+ </ul>
783
+</nav>
784
+ </div>
785
+ </div>
786
+ </div>
787
+
788
+
789
+
790
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
791
+ <div class="md-sidebar__scrollwrap">
792
+ <div class="md-sidebar__inner">
793
+
794
+
795
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
796
+
797
+
798
+
799
+
800
+
801
+
802
+ <label class="md-nav__title" for="__toc">
803
+ <span class="md-nav__icon md-icon"></span>
804
+ Table of contents
805
+ </label>
806
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
807
+
808
+ <li class="md-nav__item">
809
+ <a href="#clone-the-repository" class="md-nav__link">
810
+ <span class="md-ellipsis">
811
+
812
+ Clone the Repository
813
+
814
+ </span>
815
+ </a>
816
+
817
+</li>
818
+
819
+ <li class="md-nav__item">
820
+ <a href="#environment-configuration" class="md-nav__link">
821
+ <span class="md-ellipsis">
822
+
823
+ Environment Configuration
824
+
825
+ </span>
826
+ </a>
827
+
828
+</li>
829
+
830
+ <li class="md-nav__item">
831
+ <a href="#start-the-stack" class="md-nav__link">
832
+ <span class="md-ellipsis">
833
+
834
+ Start the Stack
835
+
836
+ </span>
837
+ </a>
838
+
839
+ <nav class="md-nav" aria-label="Start the Stack">
840
+ <ul class="md-nav__list">
841
+
842
+ <li class="md-nav__item">
843
+ <a href="#development" class="md-nav__link">
844
+ <span class="md-ellipsis">
845
+
846
+ Development
847
+
848
+ </span>
849
+ </a>
850
+
851
+</li>
852
+
853
+ <li class="md-nav__item">
854
+ <a href="#production" class="md-nav__link">
855
+ <span class="md-ellipsis">
856
+
857
+ Production
858
+
859
+ </span>
860
+ </a>
861
+
862
+</li>
863
+
864
+ </ul>
865
+ </nav>
866
+
867
+</li>
868
+
869
+ <li class="md-nav__item">
870
+ <a href="#verify-installation" class="md-nav__link">
871
+ <span class="md-ellipsis">
872
+
873
+ Verify Installation
874
+
875
+ </span>
876
+ </a>
877
+
878
+</li>
879
+
880
+ <li class="md-nav__item">
881
+ <a href="#common-issues" class="md-nav__link">
882
+ <span class="md-ellipsis">
883
+
884
+ Common Issues
885
+
886
+ </span>
887
+ </a>
888
+
889
+</li>
890
+
891
+ </ul>
892
+
893
+</nav>
894
+ </div>
895
+ </div>
896
+ </div>
897
+
898
+
899
+
900
+ <div class="md-content" data-md-component="content">
901
+
902
+ <article class="md-content__inner md-typeset">
903
+
904
+
905
+
906
+
907
+
908
+
909
+
910
+
911
+<h1 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">&para;</a></h1>
912
+<h2 id="clone-the-repository">Clone the Repository<a class="headerlink" href="#clone-the-repository" title="Permanent link">&para;</a></h2>
913
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git
914
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo
915
+</code></pre></div>
916
+<h2 id="environment-configuration">Environment Configuration<a class="headerlink" href="#environment-configuration" title="Permanent link">&para;</a></h2>
917
+<p>Copy the example environment file and configure it:</p>
918
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env
919
+</code></pre></div>
920
+<p>Edit <code>.env</code> with your settings:</p>
921
+<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Django</span>
922
+<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="na">SECRET_KEY</span><span class="o">=</span><span class="s">your-secret-key-here</span>
923
+<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="na">DEBUG</span><span class="o">=</span><span class="s">True</span>
924
+<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="na">ALLOWED_HOSTS</span><span class="o">=</span><span class="s">localhost,127.0.0.1</span>
925
+<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>
926
+<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="c1"># Database</span>
927
+<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="na">POSTGRES_DB</span><span class="o">=</span><span class="s">fossilrepo</span>
928
+<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="na">POSTGRES_USER</span><span class="o">=</span><span class="s">fossilrepo</span>
929
+<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="na">POSTGRES_PASSWORD</span><span class="o">=</span><span class="s">your-db-password</span>
930
+<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>
931
+<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="c1"># Redis</span>
932
+<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="na">REDIS_URL</span><span class="o">=</span><span class="s">redis://redis:6379/0</span>
933
+<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>
934
+<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a><span class="c1"># Fossil</span>
935
+<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="na">FOSSIL_REPO_DIR</span><span class="o">=</span><span class="s">/data/repos</span>
936
+<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="na">FOSSIL_BASE_URL</span><span class="o">=</span><span class="s">https://your-domain.com</span>
937
+</code></pre></div>
938
+<h2 id="start-the-stack">Start the Stack<a class="headerlink" href="#start-the-stack" title="Permanent link">&para;</a></h2>
939
+<h3 id="development">Development<a class="headerlink" href="#development" title="Permanent link">&para;</a></h3>
940
+<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># Build and start all services</span>
941
+<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>make<span class="w"> </span>build
942
+<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>
943
+<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># Run database migrations</span>
944
+<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>make<span class="w"> </span>migrate
945
+<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a>
946
+<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="c1"># Create an admin user</span>
947
+<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>make<span class="w"> </span>superuser
948
+<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a>
949
+<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="c1"># Load sample data (optional)</span>
950
+<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a>make<span class="w"> </span>seed
951
+</code></pre></div>
952
+<p>The development stack includes:</p>
953
+<ul>
954
+<li>Django dev server on <code>http://localhost:8000</code></li>
955
+<li>PostgreSQL 16</li>
956
+<li>Redis</li>
957
+<li>Celery worker + beat</li>
958
+<li>Mailpit on <code>http://localhost:8025</code></li>
959
+</ul>
960
+<h3 id="production">Production<a class="headerlink" href="#production" title="Permanent link">&para;</a></h3>
961
+<p>For production, you'll also configure Caddy and Litestream:</p>
962
+<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Copy production configs</span>
963
+<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>cp<span class="w"> </span>docker/Caddyfile.example<span class="w"> </span>docker/Caddyfile
964
+<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>cp<span class="w"> </span>docker/litestream.yml.example<span class="w"> </span>docker/litestream.yml
965
+<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>
966
+<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="c1"># Edit with your domain and S3 credentials</span>
967
+<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="c1"># Then start with the production compose file</span>
968
+<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>docker<span class="w"> </span>compose<span class="w"> </span>-f<span class="w"> </span>docker-compose.yml<span class="w"> </span>-f<span class="w"> </span>docker-compose.prod.yml<span class="w"> </span>up<span class="w"> </span>-d
969
+</code></pre></div>
970
+<h2 id="verify-installation">Verify Installation<a class="headerlink" href="#verify-installation" title="Permanent link">&para;</a></h2>
971
+<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># Check all services are running</span>
972
+<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps
973
+<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
974
+<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># Hit the health endpoint</span>
975
+<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>curl<span class="w"> </span>http://localhost:8000/health/
976
+<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>
977
+<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1"># Open the dashboard</span>
978
+<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>open<span class="w"> </span>http://localhost:8000
979
+</code></pre></div>
980
+<div class="admonition success">
981
+<p class="admonition-title">You should see</p>
982
+<p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p>
983
+</div>
984
+<h2 id="common-issues">Common Issues<a class="headerlink" href="#common-issues" title="Permanent link">&para;</a></h2>
985
+<details class="question">
986
+<summary>Port 8000 already in use</summary>
987
+<p>Change the Django port mapping in <code>docker-compose.yml</code>:
988
+<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nt">ports</span><span class="p">:</span>
989
+<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;8001:8000&quot;</span>
990
+</code></pre></div></p>
991
+</details>
992
+<details class="question">
993
+<summary>Database connection refused</summary>
994
+<p>Ensure PostgreSQL has started before Django:
995
+<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>postgres
996
+</code></pre></div>
997
+The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down &amp;&amp; make up</code>.</p>
998
+</details>
999
+<details class="question">
1000
+<summary>Permission denied on /data/repos</summary>
1001
+<p>The Fossil repo directory needs to be writable by the container user:
1002
+<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>sudo<span class="w"> </span>chown<span class="w"> </span>-R<span class="w"> </span><span class="m">1000</span>:1000<span class="w"> </span>/data/repos
1003
+</code></pre></div></p>
1004
+</details>
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+
1014
+
1015
+
1016
+
1017
+
1018
+ </article>
1019
+ </div>
1020
+
1021
+
1022
+ <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>
1023
+
1024
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1025
+ </div>
1026
+
1027
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1028
+
1029
+ <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>
1030
+ Back to top
1031
+</button>
1032
+
1033
+ </main>
1034
+
1035
+ <footer class="md-footer">
1036
+
1037
+ <div class="md-footer-meta md-typeset">
1038
+ <div class="md-footer-meta__inner md-grid">
1039
+ <div class="md-copyright">
1040
+
1041
+ <div class="md-copyright__highlight">
1042
+ Copyright &copy; 2026 CONFLICT LLC
1043
+ </div>
1044
+
1045
+
1046
+ Made with
1047
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1048
+ Material for MkDocs
1049
+ </a>
1050
+
1051
+</div>
1052
+
1053
+
1054
+<div class="md-social">
1055
+
1056
+
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1064
+ <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>
1065
+ </a>
1066
+
1067
+</div>
1068
+
1069
+ </div>
1070
+ </div>
1071
+</footer>
1072
+
1073
+ </div>
1074
+ <div class="md-dialog" data-md-component="dialog">
1075
+ <div class="md-dialog__inner md-typeset"></div>
1076
+ </div>
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+ <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>
1083
+
1084
+
1085
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1086
+
1087
+
1088
+ </body>
1089
+</html>
--- a/site/getting-started/installation/index.html
+++ b/site/getting-started/installation/index.html
@@ -0,0 +1,1089 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/getting-started/installation/index.html
+++ b/site/getting-started/installation/index.html
@@ -0,0 +1,1089 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/getting-started/installation/">
16
17
18 <link rel="prev" href="../prerequisites/">
19
20
21 <link rel="next" href="../configuration/">
22
23
24
25
26
27 <link rel="icon" href="../../assets/images/favicon.png">
28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
30
31
32 <title>Installation - Fossilrepo</title>
33
34
35
36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
38
39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
41
42
43
44
45
46
47
48
49
50
51
52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
56
57
58 <link rel="stylesheet" href="../../assets/css/custom.css">
59
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>
61
62
63
64
65
66 </head>
67
68
69
70
71
72
73
74
75
76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
78
79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81 <label class="md-overlay" for="__drawer"></label>
82 <div data-md-component="skip">
83
84
85 <a href="#installation" class="md-skip">
86 Skip to content
87 </a>
88
89 </div>
90 <div data-md-component="announce">
91
92 </div>
93
94
95
96
97 <header class="md-header" data-md-component="header">
98 <nav class="md-header__inner md-grid" aria-label="Header">
99 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100 <div style="display: flex; align-items: center; gap: 0.6rem;">
101 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103 </div>
104 </a>
105 <label class="md-header__button md-icon" for="__drawer">
106
107 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108 </label>
109 <div class="md-header__title" data-md-component="header-title">
110 <div class="md-header__ellipsis">
111 <div class="md-header__topic">
112 <span class="md-ellipsis">
113 Fossilrepo
114 </span>
115 </div>
116 <div class="md-header__topic" data-md-component="header-topic">
117 <span class="md-ellipsis">
118
119 Installation
120
121 </span>
122 </div>
123 </div>
124 </div>
125
126
127 <form class="md-header__option" data-md-component="palette">
128
129
130
131
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">
133
134 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136 </label>
137
138
139
140
141
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">
143
144 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146 </label>
147
148
149 </form>
150
151
152
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>
154
155
156
157
158
159 <label class="md-header__button md-icon" for="__search">
160
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>
162 </label>
163 <div class="md-search" data-md-component="search" role="dialog">
164 <label class="md-search__overlay" for="__search"></label>
165 <div class="md-search__inner" role="search">
166 <form class="md-search__form" name="search">
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>
168 <label class="md-search__icon md-icon" for="__search">
169
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>
171
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>
173 </label>
174 <nav class="md-search__options" aria-label="Search">
175
176 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
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>
179 </button>
180 </nav>
181
182 <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
184 </form>
185 <div class="md-search__output">
186 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187 <div class="md-search-result" data-md-component="search-result">
188 <div class="md-search-result__meta">
189 Initializing search
190 </div>
191 <ol class="md-search-result__list" role="presentation"></ol>
192 </div>
193 </div>
194 </div>
195 </div>
196 </div>
197
198
199
200 <div class="md-header__source">
201 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
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>
205 </div>
206 <div class="md-source__repository">
207 ConflictHQ/fossilrepo
208 </div>
209 </a>
210 </div>
211
212 </nav>
213
214 </header>
215
216 <div class="md-container" data-md-component="container">
217
218
219
220
221
222 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223 <div class="md-grid">
224 <ul class="md-tabs__list">
225
226
227
228
229
230
231 <li class="md-tabs__item">
232 <a href="../.." class="md-tabs__link">
233
234
235
236
237
238 Home
239
240 </a>
241 </li>
242
243
244
245
246
247
248
249
250
251
252
253
254 <li class="md-tabs__item md-tabs__item--active">
255 <a href="../prerequisites/" class="md-tabs__link">
256
257
258
259 Getting Started
260
261 </a>
262 </li>
263
264
265
266
267
268
269
270
271
272
273
274 <li class="md-tabs__item">
275 <a href="../../architecture/overview/" class="md-tabs__link">
276
277
278
279 Architecture
280
281 </a>
282 </li>
283
284
285
286
287 </ul>
288 </div>
289 </nav>
290
291
292
293 <main class="md-main" data-md-component="main">
294 <div class="md-main__inner md-grid">
295
296
297
298 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299 <div class="md-sidebar__scrollwrap">
300 <div class="md-sidebar__inner">
301
302
303
304
305
306
307 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308 <label class="md-nav__title" for="__drawer">
309 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310 <div style="display: flex; align-items: center; gap: 0.6rem;">
311 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313 </div>
314 </a>
315 Fossilrepo
316 </label>
317
318 <div class="md-nav__source">
319 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320 <div class="md-source__icon md-icon">
321
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>
323 </div>
324 <div class="md-source__repository">
325 ConflictHQ/fossilrepo
326 </div>
327 </a>
328 </div>
329
330 <ul class="md-nav__list" data-md-scrollfix>
331
332
333
334
335
336
337
338 <li class="md-nav__item">
339 <a href="../.." class="md-nav__link">
340
341
342
343 <span class="md-ellipsis">
344
345
346 Home
347
348
349
350 </span>
351
352
353
354 </a>
355 </li>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
382
383
384 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
386
387 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
389
390
391 <span class="md-ellipsis">
392
393
394 Getting Started
395
396
397
398 </span>
399
400
401
402 <span class="md-nav__icon md-icon"></span>
403 </label>
404
405 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406 <label class="md-nav__title" for="__nav_2">
407 <span class="md-nav__icon md-icon"></span>
408
409
410 Getting Started
411
412
413 </label>
414 <ul class="md-nav__list" data-md-scrollfix>
415
416
417
418
419
420
421
422 <li class="md-nav__item">
423 <a href="../prerequisites/" class="md-nav__link">
424
425
426
427 <span class="md-ellipsis">
428
429
430 Prerequisites
431
432
433
434 </span>
435
436
437
438 </a>
439 </li>
440
441
442
443
444
445
446
447
448
449
450
451
452 <li class="md-nav__item md-nav__item--active">
453
454 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
455
456
457
458
459
460 <label class="md-nav__link md-nav__link--active" for="__toc">
461
462
463
464 <span class="md-ellipsis">
465
466
467 Installation
468
469
470
471 </span>
472
473
474
475 <span class="md-nav__icon md-icon"></span>
476 </label>
477
478 <a href="./" class="md-nav__link md-nav__link--active">
479
480
481
482 <span class="md-ellipsis">
483
484
485 Installation
486
487
488
489 </span>
490
491
492
493 </a>
494
495
496
497 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
498
499
500
501
502
503
504 <label class="md-nav__title" for="__toc">
505 <span class="md-nav__icon md-icon"></span>
506 Table of contents
507 </label>
508 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
509
510 <li class="md-nav__item">
511 <a href="#clone-the-repository" class="md-nav__link">
512 <span class="md-ellipsis">
513
514 Clone the Repository
515
516 </span>
517 </a>
518
519 </li>
520
521 <li class="md-nav__item">
522 <a href="#environment-configuration" class="md-nav__link">
523 <span class="md-ellipsis">
524
525 Environment Configuration
526
527 </span>
528 </a>
529
530 </li>
531
532 <li class="md-nav__item">
533 <a href="#start-the-stack" class="md-nav__link">
534 <span class="md-ellipsis">
535
536 Start the Stack
537
538 </span>
539 </a>
540
541 <nav class="md-nav" aria-label="Start the Stack">
542 <ul class="md-nav__list">
543
544 <li class="md-nav__item">
545 <a href="#development" class="md-nav__link">
546 <span class="md-ellipsis">
547
548 Development
549
550 </span>
551 </a>
552
553 </li>
554
555 <li class="md-nav__item">
556 <a href="#production" class="md-nav__link">
557 <span class="md-ellipsis">
558
559 Production
560
561 </span>
562 </a>
563
564 </li>
565
566 </ul>
567 </nav>
568
569 </li>
570
571 <li class="md-nav__item">
572 <a href="#verify-installation" class="md-nav__link">
573 <span class="md-ellipsis">
574
575 Verify Installation
576
577 </span>
578 </a>
579
580 </li>
581
582 <li class="md-nav__item">
583 <a href="#common-issues" class="md-nav__link">
584 <span class="md-ellipsis">
585
586 Common Issues
587
588 </span>
589 </a>
590
591 </li>
592
593 </ul>
594
595 </nav>
596
597 </li>
598
599
600
601
602
603
604
605
606
607
608 <li class="md-nav__item">
609 <a href="../configuration/" class="md-nav__link">
610
611
612
613 <span class="md-ellipsis">
614
615
616 Configuration
617
618
619
620 </span>
621
622
623
624 </a>
625 </li>
626
627
628
629
630
631
632
633
634
635
636 <li class="md-nav__item">
637 <a href="../first-repo/" class="md-nav__link">
638
639
640
641 <span class="md-ellipsis">
642
643
644 First Repository
645
646
647
648 </span>
649
650
651
652 </a>
653 </li>
654
655
656
657
658 </ul>
659 </nav>
660
661 </li>
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681 <li class="md-nav__item md-nav__item--nested">
682
683
684
685
686
687 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
688
689
690 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
691
692
693
694 <span class="md-ellipsis">
695
696
697 Architecture
698
699
700
701 </span>
702
703
704
705 <span class="md-nav__icon md-icon"></span>
706 </label>
707
708 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
709 <label class="md-nav__title" for="__nav_3">
710 <span class="md-nav__icon md-icon"></span>
711
712
713 Architecture
714
715
716 </label>
717 <ul class="md-nav__list" data-md-scrollfix>
718
719
720
721
722
723
724
725 <li class="md-nav__item">
726 <a href="../../architecture/overview/" class="md-nav__link">
727
728
729
730 <span class="md-ellipsis">
731
732
733 Overview
734
735
736
737 </span>
738
739
740
741 </a>
742 </li>
743
744
745
746
747
748
749
750
751
752
753 <li class="md-nav__item">
754 <a href="../../architecture/sync-bridge/" class="md-nav__link">
755
756
757
758 <span class="md-ellipsis">
759
760
761 Sync Bridge
762
763
764
765 </span>
766
767
768
769 </a>
770 </li>
771
772
773
774
775 </ul>
776 </nav>
777
778 </li>
779
780
781
782 </ul>
783 </nav>
784 </div>
785 </div>
786 </div>
787
788
789
790 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
791 <div class="md-sidebar__scrollwrap">
792 <div class="md-sidebar__inner">
793
794
795 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
796
797
798
799
800
801
802 <label class="md-nav__title" for="__toc">
803 <span class="md-nav__icon md-icon"></span>
804 Table of contents
805 </label>
806 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
807
808 <li class="md-nav__item">
809 <a href="#clone-the-repository" class="md-nav__link">
810 <span class="md-ellipsis">
811
812 Clone the Repository
813
814 </span>
815 </a>
816
817 </li>
818
819 <li class="md-nav__item">
820 <a href="#environment-configuration" class="md-nav__link">
821 <span class="md-ellipsis">
822
823 Environment Configuration
824
825 </span>
826 </a>
827
828 </li>
829
830 <li class="md-nav__item">
831 <a href="#start-the-stack" class="md-nav__link">
832 <span class="md-ellipsis">
833
834 Start the Stack
835
836 </span>
837 </a>
838
839 <nav class="md-nav" aria-label="Start the Stack">
840 <ul class="md-nav__list">
841
842 <li class="md-nav__item">
843 <a href="#development" class="md-nav__link">
844 <span class="md-ellipsis">
845
846 Development
847
848 </span>
849 </a>
850
851 </li>
852
853 <li class="md-nav__item">
854 <a href="#production" class="md-nav__link">
855 <span class="md-ellipsis">
856
857 Production
858
859 </span>
860 </a>
861
862 </li>
863
864 </ul>
865 </nav>
866
867 </li>
868
869 <li class="md-nav__item">
870 <a href="#verify-installation" class="md-nav__link">
871 <span class="md-ellipsis">
872
873 Verify Installation
874
875 </span>
876 </a>
877
878 </li>
879
880 <li class="md-nav__item">
881 <a href="#common-issues" class="md-nav__link">
882 <span class="md-ellipsis">
883
884 Common Issues
885
886 </span>
887 </a>
888
889 </li>
890
891 </ul>
892
893 </nav>
894 </div>
895 </div>
896 </div>
897
898
899
900 <div class="md-content" data-md-component="content">
901
902 <article class="md-content__inner md-typeset">
903
904
905
906
907
908
909
910
911 <h1 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">&para;</a></h1>
912 <h2 id="clone-the-repository">Clone the Repository<a class="headerlink" href="#clone-the-repository" title="Permanent link">&para;</a></h2>
913 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git
914 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo
915 </code></pre></div>
916 <h2 id="environment-configuration">Environment Configuration<a class="headerlink" href="#environment-configuration" title="Permanent link">&para;</a></h2>
917 <p>Copy the example environment file and configure it:</p>
918 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env
919 </code></pre></div>
920 <p>Edit <code>.env</code> with your settings:</p>
921 <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Django</span>
922 <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="na">SECRET_KEY</span><span class="o">=</span><span class="s">your-secret-key-here</span>
923 <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="na">DEBUG</span><span class="o">=</span><span class="s">True</span>
924 <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="na">ALLOWED_HOSTS</span><span class="o">=</span><span class="s">localhost,127.0.0.1</span>
925 <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>
926 <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="c1"># Database</span>
927 <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="na">POSTGRES_DB</span><span class="o">=</span><span class="s">fossilrepo</span>
928 <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="na">POSTGRES_USER</span><span class="o">=</span><span class="s">fossilrepo</span>
929 <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="na">POSTGRES_PASSWORD</span><span class="o">=</span><span class="s">your-db-password</span>
930 <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>
931 <a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="c1"># Redis</span>
932 <a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="na">REDIS_URL</span><span class="o">=</span><span class="s">redis://redis:6379/0</span>
933 <a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>
934 <a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a><span class="c1"># Fossil</span>
935 <a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="na">FOSSIL_REPO_DIR</span><span class="o">=</span><span class="s">/data/repos</span>
936 <a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="na">FOSSIL_BASE_URL</span><span class="o">=</span><span class="s">https://your-domain.com</span>
937 </code></pre></div>
938 <h2 id="start-the-stack">Start the Stack<a class="headerlink" href="#start-the-stack" title="Permanent link">&para;</a></h2>
939 <h3 id="development">Development<a class="headerlink" href="#development" title="Permanent link">&para;</a></h3>
940 <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># Build and start all services</span>
941 <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>make<span class="w"> </span>build
942 <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>
943 <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># Run database migrations</span>
944 <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>make<span class="w"> </span>migrate
945 <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a>
946 <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="c1"># Create an admin user</span>
947 <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>make<span class="w"> </span>superuser
948 <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a>
949 <a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="c1"># Load sample data (optional)</span>
950 <a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a>make<span class="w"> </span>seed
951 </code></pre></div>
952 <p>The development stack includes:</p>
953 <ul>
954 <li>Django dev server on <code>http://localhost:8000</code></li>
955 <li>PostgreSQL 16</li>
956 <li>Redis</li>
957 <li>Celery worker + beat</li>
958 <li>Mailpit on <code>http://localhost:8025</code></li>
959 </ul>
960 <h3 id="production">Production<a class="headerlink" href="#production" title="Permanent link">&para;</a></h3>
961 <p>For production, you'll also configure Caddy and Litestream:</p>
962 <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Copy production configs</span>
963 <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>cp<span class="w"> </span>docker/Caddyfile.example<span class="w"> </span>docker/Caddyfile
964 <a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>cp<span class="w"> </span>docker/litestream.yml.example<span class="w"> </span>docker/litestream.yml
965 <a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>
966 <a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="c1"># Edit with your domain and S3 credentials</span>
967 <a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="c1"># Then start with the production compose file</span>
968 <a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>docker<span class="w"> </span>compose<span class="w"> </span>-f<span class="w"> </span>docker-compose.yml<span class="w"> </span>-f<span class="w"> </span>docker-compose.prod.yml<span class="w"> </span>up<span class="w"> </span>-d
969 </code></pre></div>
970 <h2 id="verify-installation">Verify Installation<a class="headerlink" href="#verify-installation" title="Permanent link">&para;</a></h2>
971 <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># Check all services are running</span>
972 <a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps
973 <a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
974 <a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># Hit the health endpoint</span>
975 <a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>curl<span class="w"> </span>http://localhost:8000/health/
976 <a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>
977 <a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1"># Open the dashboard</span>
978 <a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>open<span class="w"> </span>http://localhost:8000
979 </code></pre></div>
980 <div class="admonition success">
981 <p class="admonition-title">You should see</p>
982 <p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p>
983 </div>
984 <h2 id="common-issues">Common Issues<a class="headerlink" href="#common-issues" title="Permanent link">&para;</a></h2>
985 <details class="question">
986 <summary>Port 8000 already in use</summary>
987 <p>Change the Django port mapping in <code>docker-compose.yml</code>:
988 <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nt">ports</span><span class="p">:</span>
989 <a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;8001:8000&quot;</span>
990 </code></pre></div></p>
991 </details>
992 <details class="question">
993 <summary>Database connection refused</summary>
994 <p>Ensure PostgreSQL has started before Django:
995 <div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>postgres
996 </code></pre></div>
997 The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down &amp;&amp; make up</code>.</p>
998 </details>
999 <details class="question">
1000 <summary>Permission denied on /data/repos</summary>
1001 <p>The Fossil repo directory needs to be writable by the container user:
1002 <div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>sudo<span class="w"> </span>chown<span class="w"> </span>-R<span class="w"> </span><span class="m">1000</span>:1000<span class="w"> </span>/data/repos
1003 </code></pre></div></p>
1004 </details>
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018 </article>
1019 </div>
1020
1021
1022 <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>
1023
1024 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1025 </div>
1026
1027 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1028
1029 <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>
1030 Back to top
1031 </button>
1032
1033 </main>
1034
1035 <footer class="md-footer">
1036
1037 <div class="md-footer-meta md-typeset">
1038 <div class="md-footer-meta__inner md-grid">
1039 <div class="md-copyright">
1040
1041 <div class="md-copyright__highlight">
1042 Copyright &copy; 2026 CONFLICT LLC
1043 </div>
1044
1045
1046 Made with
1047 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1048 Material for MkDocs
1049 </a>
1050
1051 </div>
1052
1053
1054 <div class="md-social">
1055
1056
1057
1058
1059
1060
1061
1062
1063 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1064 <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>
1065 </a>
1066
1067 </div>
1068
1069 </div>
1070 </div>
1071 </footer>
1072
1073 </div>
1074 <div class="md-dialog" data-md-component="dialog">
1075 <div class="md-dialog__inner md-typeset"></div>
1076 </div>
1077
1078
1079
1080
1081
1082 <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>
1083
1084
1085 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1086
1087
1088 </body>
1089 </html>
--- a/site/getting-started/prerequisites/index.html
+++ b/site/getting-started/prerequisites/index.html
@@ -0,0 +1,1108 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/getting-started/prerequisites/">
16
+
17
+
18
+ <link rel="prev" href="../..">
19
+
20
+
21
+ <link rel="next" href="../installation/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>Prerequisites - Fossilrepo</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
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>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#prerequisites" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
101
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103
+</div>
104
+ </a>
105
+ <label class="md-header__button md-icon" for="__drawer">
106
+
107
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108
+ </label>
109
+ <div class="md-header__title" data-md-component="header-title">
110
+ <div class="md-header__ellipsis">
111
+ <div class="md-header__topic">
112
+ <span class="md-ellipsis">
113
+ Fossilrepo
114
+ </span>
115
+ </div>
116
+ <div class="md-header__topic" data-md-component="header-topic">
117
+ <span class="md-ellipsis">
118
+
119
+ Prerequisites
120
+
121
+ </span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+
127
+ <form class="md-header__option" data-md-component="palette">
128
+
129
+
130
+
131
+
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">
133
+
134
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136
+ </label>
137
+
138
+
139
+
140
+
141
+
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">
143
+
144
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146
+ </label>
147
+
148
+
149
+</form>
150
+
151
+
152
+
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>
154
+
155
+
156
+
157
+
158
+
159
+ <label class="md-header__button md-icon" for="__search">
160
+
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>
162
+ </label>
163
+ <div class="md-search" data-md-component="search" role="dialog">
164
+ <label class="md-search__overlay" for="__search"></label>
165
+ <div class="md-search__inner" role="search">
166
+ <form class="md-search__form" name="search">
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>
168
+ <label class="md-search__icon md-icon" for="__search">
169
+
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>
171
+
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>
173
+ </label>
174
+ <nav class="md-search__options" aria-label="Search">
175
+
176
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
+
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>
179
+ </button>
180
+ </nav>
181
+
182
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
+
184
+ </form>
185
+ <div class="md-search__output">
186
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187
+ <div class="md-search-result" data-md-component="search-result">
188
+ <div class="md-search-result__meta">
189
+ Initializing search
190
+ </div>
191
+ <ol class="md-search-result__list" role="presentation"></ol>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+</div>
197
+
198
+
199
+
200
+ <div class="md-header__source">
201
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202
+ <div class="md-source__icon md-icon">
203
+
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>
205
+ </div>
206
+ <div class="md-source__repository">
207
+ ConflictHQ/fossilrepo
208
+ </div>
209
+</a>
210
+ </div>
211
+
212
+ </nav>
213
+
214
+</header>
215
+
216
+ <div class="md-container" data-md-component="container">
217
+
218
+
219
+
220
+
221
+
222
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223
+ <div class="md-grid">
224
+ <ul class="md-tabs__list">
225
+
226
+
227
+
228
+
229
+
230
+
231
+ <li class="md-tabs__item">
232
+ <a href="../.." class="md-tabs__link">
233
+
234
+
235
+
236
+
237
+
238
+ Home
239
+
240
+ </a>
241
+ </li>
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+ <li class="md-tabs__item md-tabs__item--active">
255
+ <a href="./" class="md-tabs__link">
256
+
257
+
258
+
259
+ Getting Started
260
+
261
+ </a>
262
+ </li>
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item">
275
+ <a href="../../architecture/overview/" class="md-tabs__link">
276
+
277
+
278
+
279
+ Architecture
280
+
281
+ </a>
282
+ </li>
283
+
284
+
285
+
286
+
287
+ </ul>
288
+ </div>
289
+</nav>
290
+
291
+
292
+
293
+ <main class="md-main" data-md-component="main">
294
+ <div class="md-main__inner md-grid">
295
+
296
+
297
+
298
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299
+ <div class="md-sidebar__scrollwrap">
300
+ <div class="md-sidebar__inner">
301
+
302
+
303
+
304
+
305
+
306
+
307
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308
+ <label class="md-nav__title" for="__drawer">
309
+ <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
311
+ <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312
+ <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313
+</div>
314
+ </a>
315
+ Fossilrepo
316
+ </label>
317
+
318
+ <div class="md-nav__source">
319
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320
+ <div class="md-source__icon md-icon">
321
+
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>
323
+ </div>
324
+ <div class="md-source__repository">
325
+ ConflictHQ/fossilrepo
326
+ </div>
327
+</a>
328
+ </div>
329
+
330
+ <ul class="md-nav__list" data-md-scrollfix>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item">
339
+ <a href="../.." class="md-nav__link">
340
+
341
+
342
+
343
+ <span class="md-ellipsis">
344
+
345
+
346
+ Home
347
+
348
+
349
+
350
+ </span>
351
+
352
+
353
+
354
+ </a>
355
+ </li>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
+
382
+
383
+
384
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
+
386
+
387
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
+
389
+
390
+
391
+ <span class="md-ellipsis">
392
+
393
+
394
+ Getting Started
395
+
396
+
397
+
398
+ </span>
399
+
400
+
401
+
402
+ <span class="md-nav__icon md-icon"></span>
403
+ </label>
404
+
405
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406
+ <label class="md-nav__title" for="__nav_2">
407
+ <span class="md-nav__icon md-icon"></span>
408
+
409
+
410
+ Getting Started
411
+
412
+
413
+ </label>
414
+ <ul class="md-nav__list" data-md-scrollfix>
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+ <li class="md-nav__item md-nav__item--active">
425
+
426
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
427
+
428
+
429
+
430
+
431
+
432
+ <label class="md-nav__link md-nav__link--active" for="__toc">
433
+
434
+
435
+
436
+ <span class="md-ellipsis">
437
+
438
+
439
+ Prerequisites
440
+
441
+
442
+
443
+ </span>
444
+
445
+
446
+
447
+ <span class="md-nav__icon md-icon"></span>
448
+ </label>
449
+
450
+ <a href="./" class="md-nav__link md-nav__link--active">
451
+
452
+
453
+
454
+ <span class="md-ellipsis">
455
+
456
+
457
+ Prerequisites
458
+
459
+
460
+
461
+ </span>
462
+
463
+
464
+
465
+ </a>
466
+
467
+
468
+
469
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
470
+
471
+
472
+
473
+
474
+
475
+
476
+ <label class="md-nav__title" for="__toc">
477
+ <span class="md-nav__icon md-icon"></span>
478
+ Table of contents
479
+ </label>
480
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
481
+
482
+ <li class="md-nav__item">
483
+ <a href="#system-requirements" class="md-nav__link">
484
+ <span class="md-ellipsis">
485
+
486
+ System Requirements
487
+
488
+ </span>
489
+ </a>
490
+
491
+</li>
492
+
493
+ <li class="md-nav__item">
494
+ <a href="#required-software" class="md-nav__link">
495
+ <span class="md-ellipsis">
496
+
497
+ Required Software
498
+
499
+ </span>
500
+ </a>
501
+
502
+ <nav class="md-nav" aria-label="Required Software">
503
+ <ul class="md-nav__list">
504
+
505
+ <li class="md-nav__item">
506
+ <a href="#docker-docker-compose" class="md-nav__link">
507
+ <span class="md-ellipsis">
508
+
509
+ Docker &amp; Docker Compose
510
+
511
+ </span>
512
+ </a>
513
+
514
+</li>
515
+
516
+ <li class="md-nav__item">
517
+ <a href="#git" class="md-nav__link">
518
+ <span class="md-ellipsis">
519
+
520
+ Git
521
+
522
+ </span>
523
+ </a>
524
+
525
+</li>
526
+
527
+ <li class="md-nav__item">
528
+ <a href="#make" class="md-nav__link">
529
+ <span class="md-ellipsis">
530
+
531
+ Make
532
+
533
+ </span>
534
+ </a>
535
+
536
+</li>
537
+
538
+ </ul>
539
+ </nav>
540
+
541
+</li>
542
+
543
+ <li class="md-nav__item">
544
+ <a href="#optional-s3-compatible-storage" class="md-nav__link">
545
+ <span class="md-ellipsis">
546
+
547
+ Optional: S3-Compatible Storage
548
+
549
+ </span>
550
+ </a>
551
+
552
+</li>
553
+
554
+ <li class="md-nav__item">
555
+ <a href="#ports" class="md-nav__link">
556
+ <span class="md-ellipsis">
557
+
558
+ Ports
559
+
560
+ </span>
561
+ </a>
562
+
563
+</li>
564
+
565
+ </ul>
566
+
567
+</nav>
568
+
569
+ </li>
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+
580
+ <li class="md-nav__item">
581
+ <a href="../installation/" class="md-nav__link">
582
+
583
+
584
+
585
+ <span class="md-ellipsis">
586
+
587
+
588
+ Installation
589
+
590
+
591
+
592
+ </span>
593
+
594
+
595
+
596
+ </a>
597
+ </li>
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+ <li class="md-nav__item">
609
+ <a href="../configuration/" class="md-nav__link">
610
+
611
+
612
+
613
+ <span class="md-ellipsis">
614
+
615
+
616
+ Configuration
617
+
618
+
619
+
620
+ </span>
621
+
622
+
623
+
624
+ </a>
625
+ </li>
626
+
627
+
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+ <li class="md-nav__item">
637
+ <a href="../first-repo/" class="md-nav__link">
638
+
639
+
640
+
641
+ <span class="md-ellipsis">
642
+
643
+
644
+ First Repository
645
+
646
+
647
+
648
+ </span>
649
+
650
+
651
+
652
+ </a>
653
+ </li>
654
+
655
+
656
+
657
+
658
+ </ul>
659
+ </nav>
660
+
661
+ </li>
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+ <li class="md-nav__item md-nav__item--nested">
682
+
683
+
684
+
685
+
686
+
687
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
688
+
689
+
690
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
691
+
692
+
693
+
694
+ <span class="md-ellipsis">
695
+
696
+
697
+ Architecture
698
+
699
+
700
+
701
+ </span>
702
+
703
+
704
+
705
+ <span class="md-nav__icon md-icon"></span>
706
+ </label>
707
+
708
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
709
+ <label class="md-nav__title" for="__nav_3">
710
+ <span class="md-nav__icon md-icon"></span>
711
+
712
+
713
+ Architecture
714
+
715
+
716
+ </label>
717
+ <ul class="md-nav__list" data-md-scrollfix>
718
+
719
+
720
+
721
+
722
+
723
+
724
+
725
+ <li class="md-nav__item">
726
+ <a href="../../architecture/overview/" class="md-nav__link">
727
+
728
+
729
+
730
+ <span class="md-ellipsis">
731
+
732
+
733
+ Overview
734
+
735
+
736
+
737
+ </span>
738
+
739
+
740
+
741
+ </a>
742
+ </li>
743
+
744
+
745
+
746
+
747
+
748
+
749
+
750
+
751
+
752
+
753
+ <li class="md-nav__item">
754
+ <a href="../../architecture/sync-bridge/" class="md-nav__link">
755
+
756
+
757
+
758
+ <span class="md-ellipsis">
759
+
760
+
761
+ Sync Bridge
762
+
763
+
764
+
765
+ </span>
766
+
767
+
768
+
769
+ </a>
770
+ </li>
771
+
772
+
773
+
774
+
775
+ </ul>
776
+ </nav>
777
+
778
+ </li>
779
+
780
+
781
+
782
+ </ul>
783
+</nav>
784
+ </div>
785
+ </div>
786
+ </div>
787
+
788
+
789
+
790
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
791
+ <div class="md-sidebar__scrollwrap">
792
+ <div class="md-sidebar__inner">
793
+
794
+
795
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
796
+
797
+
798
+
799
+
800
+
801
+
802
+ <label class="md-nav__title" for="__toc">
803
+ <span class="md-nav__icon md-icon"></span>
804
+ Table of contents
805
+ </label>
806
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
807
+
808
+ <li class="md-nav__item">
809
+ <a href="#system-requirements" class="md-nav__link">
810
+ <span class="md-ellipsis">
811
+
812
+ System Requirements
813
+
814
+ </span>
815
+ </a>
816
+
817
+</li>
818
+
819
+ <li class="md-nav__item">
820
+ <a href="#required-software" class="md-nav__link">
821
+ <span class="md-ellipsis">
822
+
823
+ Required Software
824
+
825
+ </span>
826
+ </a>
827
+
828
+ <nav class="md-nav" aria-label="Required Software">
829
+ <ul class="md-nav__list">
830
+
831
+ <li class="md-nav__item">
832
+ <a href="#docker-docker-compose" class="md-nav__link">
833
+ <span class="md-ellipsis">
834
+
835
+ Docker &amp; Docker Compose
836
+
837
+ </span>
838
+ </a>
839
+
840
+</li>
841
+
842
+ <li class="md-nav__item">
843
+ <a href="#git" class="md-nav__link">
844
+ <span class="md-ellipsis">
845
+
846
+ Git
847
+
848
+ </span>
849
+ </a>
850
+
851
+</li>
852
+
853
+ <li class="md-nav__item">
854
+ <a href="#make" class="md-nav__link">
855
+ <span class="md-ellipsis">
856
+
857
+ Make
858
+
859
+ </span>
860
+ </a>
861
+
862
+</li>
863
+
864
+ </ul>
865
+ </nav>
866
+
867
+</li>
868
+
869
+ <li class="md-nav__item">
870
+ <a href="#optional-s3-compatible-storage" class="md-nav__link">
871
+ <span class="md-ellipsis">
872
+
873
+ Optional: S3-Compatible Storage
874
+
875
+ </span>
876
+ </a>
877
+
878
+</li>
879
+
880
+ <li class="md-nav__item">
881
+ <a href="#ports" class="md-nav__link">
882
+ <span class="md-ellipsis">
883
+
884
+ Ports
885
+
886
+ </span>
887
+ </a>
888
+
889
+</li>
890
+
891
+ </ul>
892
+
893
+</nav>
894
+ </div>
895
+ </div>
896
+ </div>
897
+
898
+
899
+
900
+ <div class="md-content" data-md-component="content">
901
+
902
+ <article class="md-content__inner md-typeset">
903
+
904
+
905
+
906
+
907
+
908
+
909
+
910
+
911
+<h1 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link">&para;</a></h1>
912
+<p>Before installing fossilrepo, ensure your server meets these requirements.</p>
913
+<h2 id="system-requirements">System Requirements<a class="headerlink" href="#system-requirements" title="Permanent link">&para;</a></h2>
914
+<table>
915
+<thead>
916
+<tr>
917
+<th>Requirement</th>
918
+<th>Minimum</th>
919
+</tr>
920
+</thead>
921
+<tbody>
922
+<tr>
923
+<td><strong>OS</strong></td>
924
+<td>Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+</td>
925
+</tr>
926
+<tr>
927
+<td><strong>CPU</strong></td>
928
+<td>1 vCPU</td>
929
+</tr>
930
+<tr>
931
+<td><strong>RAM</strong></td>
932
+<td>1 GB</td>
933
+</tr>
934
+<tr>
935
+<td><strong>Disk</strong></td>
936
+<td>10 GB (scales with repo count)</td>
937
+</tr>
938
+<tr>
939
+<td><strong>Python</strong></td>
940
+<td>3.12+</td>
941
+</tr>
942
+</tbody>
943
+</table>
944
+<h2 id="required-software">Required Software<a class="headerlink" href="#required-software" title="Permanent link">&para;</a></h2>
945
+<h3 id="docker-docker-compose">Docker &amp; Docker Compose<a class="headerlink" href="#docker-docker-compose" title="Permanent link">&para;</a></h3>
946
+<p>Fossilrepo runs its infrastructure stack via Docker Compose.</p>
947
+<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Ubuntu/Debian</label><label for="__tabbed_1_2">macOS</label></div>
948
+<div class="tabbed-content">
949
+<div class="tabbed-block">
950
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Install Docker</span>
951
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>curl<span class="w"> </span>-fsSL<span class="w"> </span>https://get.docker.com<span class="w"> </span><span class="p">|</span><span class="w"> </span>sh
952
+<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>sudo<span class="w"> </span>usermod<span class="w"> </span>-aG<span class="w"> </span>docker<span class="w"> </span><span class="nv">$USER</span>
953
+<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
954
+<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Verify</span>
955
+<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>version
956
+</code></pre></div>
957
+</div>
958
+<div class="tabbed-block">
959
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="c1"># Install Docker Desktop</span>
960
+<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>brew<span class="w"> </span>install<span class="w"> </span>--cask<span class="w"> </span>docker
961
+<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
962
+<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="c1"># Verify</span>
963
+<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>version
964
+</code></pre></div>
965
+</div>
966
+</div>
967
+</div>
968
+<h3 id="git">Git<a class="headerlink" href="#git" title="Permanent link">&para;</a></h3>
969
+<p>Required for the sync bridge (mirroring to GitHub/GitLab).</p>
970
+<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>--version<span class="w"> </span><span class="c1"># 2.30+</span>
971
+</code></pre></div>
972
+<h3 id="make">Make<a class="headerlink" href="#make" title="Permanent link">&para;</a></h3>
973
+<p>Used for running common commands.</p>
974
+<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>make<span class="w"> </span>--version
975
+</code></pre></div>
976
+<h2 id="optional-s3-compatible-storage">Optional: S3-Compatible Storage<a class="headerlink" href="#optional-s3-compatible-storage" title="Permanent link">&para;</a></h2>
977
+<p>For continuous backups via Litestream, you need an S3-compatible bucket:</p>
978
+<ul>
979
+<li><strong>AWS S3</strong></li>
980
+<li><strong>MinIO</strong> (self-hosted)</li>
981
+<li><strong>Backblaze B2</strong></li>
982
+<li><strong>DigitalOcean Spaces</strong></li>
983
+</ul>
984
+<div class="admonition info">
985
+<p class="admonition-title">Local development</p>
986
+<p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p>
987
+</div>
988
+<h2 id="ports">Ports<a class="headerlink" href="#ports" title="Permanent link">&para;</a></h2>
989
+<p>The following ports are used by the stack:</p>
990
+<table>
991
+<thead>
992
+<tr>
993
+<th>Port</th>
994
+<th>Service</th>
995
+</tr>
996
+</thead>
997
+<tbody>
998
+<tr>
999
+<td><code>8000</code></td>
1000
+<td>Django (management UI)</td>
1001
+</tr>
1002
+<tr>
1003
+<td><code>443</code></td>
1004
+<td>Caddy (HTTPS, production)</td>
1005
+</tr>
1006
+<tr>
1007
+<td><code>80</code></td>
1008
+<td>Caddy (HTTP redirect, production)</td>
1009
+</tr>
1010
+<tr>
1011
+<td><code>5432</code></td>
1012
+<td>PostgreSQL</td>
1013
+</tr>
1014
+<tr>
1015
+<td><code>6379</code></td>
1016
+<td>Redis</td>
1017
+</tr>
1018
+<tr>
1019
+<td><code>8025</code></td>
1020
+<td>Mailpit (dev only)</td>
1021
+</tr>
1022
+</tbody>
1023
+</table>
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+ </article>
1038
+ </div>
1039
+
1040
+
1041
+ <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>
1042
+
1043
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1044
+ </div>
1045
+
1046
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1047
+
1048
+ <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>
1049
+ Back to top
1050
+</button>
1051
+
1052
+ </main>
1053
+
1054
+ <footer class="md-footer">
1055
+
1056
+ <div class="md-footer-meta md-typeset">
1057
+ <div class="md-footer-meta__inner md-grid">
1058
+ <div class="md-copyright">
1059
+
1060
+ <div class="md-copyright__highlight">
1061
+ Copyright &copy; 2026 CONFLICT LLC
1062
+ </div>
1063
+
1064
+
1065
+ Made with
1066
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1067
+ Material for MkDocs
1068
+ </a>
1069
+
1070
+</div>
1071
+
1072
+
1073
+<div class="md-social">
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1083
+ <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>
1084
+ </a>
1085
+
1086
+</div>
1087
+
1088
+ </div>
1089
+ </div>
1090
+</footer>
1091
+
1092
+ </div>
1093
+ <div class="md-dialog" data-md-component="dialog">
1094
+ <div class="md-dialog__inner md-typeset"></div>
1095
+ </div>
1096
+
1097
+
1098
+
1099
+
1100
+
1101
+ <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>
1102
+
1103
+
1104
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1105
+
1106
+
1107
+ </body>
1108
+</html>
--- a/site/getting-started/prerequisites/index.html
+++ b/site/getting-started/prerequisites/index.html
@@ -0,0 +1,1108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/getting-started/prerequisites/index.html
+++ b/site/getting-started/prerequisites/index.html
@@ -0,0 +1,1108 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/getting-started/prerequisites/">
16
17
18 <link rel="prev" href="../..">
19
20
21 <link rel="next" href="../installation/">
22
23
24
25
26
27 <link rel="icon" href="../../assets/images/favicon.png">
28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
30
31
32 <title>Prerequisites - Fossilrepo</title>
33
34
35
36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
38
39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
41
42
43
44
45
46
47
48
49
50
51
52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
56
57
58 <link rel="stylesheet" href="../../assets/css/custom.css">
59
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>
61
62
63
64
65
66 </head>
67
68
69
70
71
72
73
74
75
76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
78
79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81 <label class="md-overlay" for="__drawer"></label>
82 <div data-md-component="skip">
83
84
85 <a href="#prerequisites" class="md-skip">
86 Skip to content
87 </a>
88
89 </div>
90 <div data-md-component="announce">
91
92 </div>
93
94
95
96
97 <header class="md-header" data-md-component="header">
98 <nav class="md-header__inner md-grid" aria-label="Header">
99 <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
100 <div style="display: flex; align-items: center; gap: 0.6rem;">
101 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
102 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
103 </div>
104 </a>
105 <label class="md-header__button md-icon" for="__drawer">
106
107 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
108 </label>
109 <div class="md-header__title" data-md-component="header-title">
110 <div class="md-header__ellipsis">
111 <div class="md-header__topic">
112 <span class="md-ellipsis">
113 Fossilrepo
114 </span>
115 </div>
116 <div class="md-header__topic" data-md-component="header-topic">
117 <span class="md-ellipsis">
118
119 Prerequisites
120
121 </span>
122 </div>
123 </div>
124 </div>
125
126
127 <form class="md-header__option" data-md-component="palette">
128
129
130
131
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">
133
134 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
136 </label>
137
138
139
140
141
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">
143
144 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
146 </label>
147
148
149 </form>
150
151
152
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>
154
155
156
157
158
159 <label class="md-header__button md-icon" for="__search">
160
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>
162 </label>
163 <div class="md-search" data-md-component="search" role="dialog">
164 <label class="md-search__overlay" for="__search"></label>
165 <div class="md-search__inner" role="search">
166 <form class="md-search__form" name="search">
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>
168 <label class="md-search__icon md-icon" for="__search">
169
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>
171
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>
173 </label>
174 <nav class="md-search__options" aria-label="Search">
175
176 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
177
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>
179 </button>
180 </nav>
181
182 <div class="md-search__suggest" data-md-component="search-suggest"></div>
183
184 </form>
185 <div class="md-search__output">
186 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
187 <div class="md-search-result" data-md-component="search-result">
188 <div class="md-search-result__meta">
189 Initializing search
190 </div>
191 <ol class="md-search-result__list" role="presentation"></ol>
192 </div>
193 </div>
194 </div>
195 </div>
196 </div>
197
198
199
200 <div class="md-header__source">
201 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
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>
205 </div>
206 <div class="md-source__repository">
207 ConflictHQ/fossilrepo
208 </div>
209 </a>
210 </div>
211
212 </nav>
213
214 </header>
215
216 <div class="md-container" data-md-component="container">
217
218
219
220
221
222 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
223 <div class="md-grid">
224 <ul class="md-tabs__list">
225
226
227
228
229
230
231 <li class="md-tabs__item">
232 <a href="../.." class="md-tabs__link">
233
234
235
236
237
238 Home
239
240 </a>
241 </li>
242
243
244
245
246
247
248
249
250
251
252
253
254 <li class="md-tabs__item md-tabs__item--active">
255 <a href="./" class="md-tabs__link">
256
257
258
259 Getting Started
260
261 </a>
262 </li>
263
264
265
266
267
268
269
270
271
272
273
274 <li class="md-tabs__item">
275 <a href="../../architecture/overview/" class="md-tabs__link">
276
277
278
279 Architecture
280
281 </a>
282 </li>
283
284
285
286
287 </ul>
288 </div>
289 </nav>
290
291
292
293 <main class="md-main" data-md-component="main">
294 <div class="md-main__inner md-grid">
295
296
297
298 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
299 <div class="md-sidebar__scrollwrap">
300 <div class="md-sidebar__inner">
301
302
303
304
305
306
307 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
308 <label class="md-nav__title" for="__drawer">
309 <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
310 <div style="display: flex; align-items: center; gap: 0.6rem;">
311 <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
312 <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
313 </div>
314 </a>
315 Fossilrepo
316 </label>
317
318 <div class="md-nav__source">
319 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
320 <div class="md-source__icon md-icon">
321
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>
323 </div>
324 <div class="md-source__repository">
325 ConflictHQ/fossilrepo
326 </div>
327 </a>
328 </div>
329
330 <ul class="md-nav__list" data-md-scrollfix>
331
332
333
334
335
336
337
338 <li class="md-nav__item">
339 <a href="../.." class="md-nav__link">
340
341
342
343 <span class="md-ellipsis">
344
345
346 Home
347
348
349
350 </span>
351
352
353
354 </a>
355 </li>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
381
382
383
384 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
385
386
387 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
388
389
390
391 <span class="md-ellipsis">
392
393
394 Getting Started
395
396
397
398 </span>
399
400
401
402 <span class="md-nav__icon md-icon"></span>
403 </label>
404
405 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
406 <label class="md-nav__title" for="__nav_2">
407 <span class="md-nav__icon md-icon"></span>
408
409
410 Getting Started
411
412
413 </label>
414 <ul class="md-nav__list" data-md-scrollfix>
415
416
417
418
419
420
421
422
423
424 <li class="md-nav__item md-nav__item--active">
425
426 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
427
428
429
430
431
432 <label class="md-nav__link md-nav__link--active" for="__toc">
433
434
435
436 <span class="md-ellipsis">
437
438
439 Prerequisites
440
441
442
443 </span>
444
445
446
447 <span class="md-nav__icon md-icon"></span>
448 </label>
449
450 <a href="./" class="md-nav__link md-nav__link--active">
451
452
453
454 <span class="md-ellipsis">
455
456
457 Prerequisites
458
459
460
461 </span>
462
463
464
465 </a>
466
467
468
469 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
470
471
472
473
474
475
476 <label class="md-nav__title" for="__toc">
477 <span class="md-nav__icon md-icon"></span>
478 Table of contents
479 </label>
480 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
481
482 <li class="md-nav__item">
483 <a href="#system-requirements" class="md-nav__link">
484 <span class="md-ellipsis">
485
486 System Requirements
487
488 </span>
489 </a>
490
491 </li>
492
493 <li class="md-nav__item">
494 <a href="#required-software" class="md-nav__link">
495 <span class="md-ellipsis">
496
497 Required Software
498
499 </span>
500 </a>
501
502 <nav class="md-nav" aria-label="Required Software">
503 <ul class="md-nav__list">
504
505 <li class="md-nav__item">
506 <a href="#docker-docker-compose" class="md-nav__link">
507 <span class="md-ellipsis">
508
509 Docker &amp; Docker Compose
510
511 </span>
512 </a>
513
514 </li>
515
516 <li class="md-nav__item">
517 <a href="#git" class="md-nav__link">
518 <span class="md-ellipsis">
519
520 Git
521
522 </span>
523 </a>
524
525 </li>
526
527 <li class="md-nav__item">
528 <a href="#make" class="md-nav__link">
529 <span class="md-ellipsis">
530
531 Make
532
533 </span>
534 </a>
535
536 </li>
537
538 </ul>
539 </nav>
540
541 </li>
542
543 <li class="md-nav__item">
544 <a href="#optional-s3-compatible-storage" class="md-nav__link">
545 <span class="md-ellipsis">
546
547 Optional: S3-Compatible Storage
548
549 </span>
550 </a>
551
552 </li>
553
554 <li class="md-nav__item">
555 <a href="#ports" class="md-nav__link">
556 <span class="md-ellipsis">
557
558 Ports
559
560 </span>
561 </a>
562
563 </li>
564
565 </ul>
566
567 </nav>
568
569 </li>
570
571
572
573
574
575
576
577
578
579
580 <li class="md-nav__item">
581 <a href="../installation/" class="md-nav__link">
582
583
584
585 <span class="md-ellipsis">
586
587
588 Installation
589
590
591
592 </span>
593
594
595
596 </a>
597 </li>
598
599
600
601
602
603
604
605
606
607
608 <li class="md-nav__item">
609 <a href="../configuration/" class="md-nav__link">
610
611
612
613 <span class="md-ellipsis">
614
615
616 Configuration
617
618
619
620 </span>
621
622
623
624 </a>
625 </li>
626
627
628
629
630
631
632
633
634
635
636 <li class="md-nav__item">
637 <a href="../first-repo/" class="md-nav__link">
638
639
640
641 <span class="md-ellipsis">
642
643
644 First Repository
645
646
647
648 </span>
649
650
651
652 </a>
653 </li>
654
655
656
657
658 </ul>
659 </nav>
660
661 </li>
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681 <li class="md-nav__item md-nav__item--nested">
682
683
684
685
686
687 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
688
689
690 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
691
692
693
694 <span class="md-ellipsis">
695
696
697 Architecture
698
699
700
701 </span>
702
703
704
705 <span class="md-nav__icon md-icon"></span>
706 </label>
707
708 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
709 <label class="md-nav__title" for="__nav_3">
710 <span class="md-nav__icon md-icon"></span>
711
712
713 Architecture
714
715
716 </label>
717 <ul class="md-nav__list" data-md-scrollfix>
718
719
720
721
722
723
724
725 <li class="md-nav__item">
726 <a href="../../architecture/overview/" class="md-nav__link">
727
728
729
730 <span class="md-ellipsis">
731
732
733 Overview
734
735
736
737 </span>
738
739
740
741 </a>
742 </li>
743
744
745
746
747
748
749
750
751
752
753 <li class="md-nav__item">
754 <a href="../../architecture/sync-bridge/" class="md-nav__link">
755
756
757
758 <span class="md-ellipsis">
759
760
761 Sync Bridge
762
763
764
765 </span>
766
767
768
769 </a>
770 </li>
771
772
773
774
775 </ul>
776 </nav>
777
778 </li>
779
780
781
782 </ul>
783 </nav>
784 </div>
785 </div>
786 </div>
787
788
789
790 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
791 <div class="md-sidebar__scrollwrap">
792 <div class="md-sidebar__inner">
793
794
795 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
796
797
798
799
800
801
802 <label class="md-nav__title" for="__toc">
803 <span class="md-nav__icon md-icon"></span>
804 Table of contents
805 </label>
806 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
807
808 <li class="md-nav__item">
809 <a href="#system-requirements" class="md-nav__link">
810 <span class="md-ellipsis">
811
812 System Requirements
813
814 </span>
815 </a>
816
817 </li>
818
819 <li class="md-nav__item">
820 <a href="#required-software" class="md-nav__link">
821 <span class="md-ellipsis">
822
823 Required Software
824
825 </span>
826 </a>
827
828 <nav class="md-nav" aria-label="Required Software">
829 <ul class="md-nav__list">
830
831 <li class="md-nav__item">
832 <a href="#docker-docker-compose" class="md-nav__link">
833 <span class="md-ellipsis">
834
835 Docker &amp; Docker Compose
836
837 </span>
838 </a>
839
840 </li>
841
842 <li class="md-nav__item">
843 <a href="#git" class="md-nav__link">
844 <span class="md-ellipsis">
845
846 Git
847
848 </span>
849 </a>
850
851 </li>
852
853 <li class="md-nav__item">
854 <a href="#make" class="md-nav__link">
855 <span class="md-ellipsis">
856
857 Make
858
859 </span>
860 </a>
861
862 </li>
863
864 </ul>
865 </nav>
866
867 </li>
868
869 <li class="md-nav__item">
870 <a href="#optional-s3-compatible-storage" class="md-nav__link">
871 <span class="md-ellipsis">
872
873 Optional: S3-Compatible Storage
874
875 </span>
876 </a>
877
878 </li>
879
880 <li class="md-nav__item">
881 <a href="#ports" class="md-nav__link">
882 <span class="md-ellipsis">
883
884 Ports
885
886 </span>
887 </a>
888
889 </li>
890
891 </ul>
892
893 </nav>
894 </div>
895 </div>
896 </div>
897
898
899
900 <div class="md-content" data-md-component="content">
901
902 <article class="md-content__inner md-typeset">
903
904
905
906
907
908
909
910
911 <h1 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link">&para;</a></h1>
912 <p>Before installing fossilrepo, ensure your server meets these requirements.</p>
913 <h2 id="system-requirements">System Requirements<a class="headerlink" href="#system-requirements" title="Permanent link">&para;</a></h2>
914 <table>
915 <thead>
916 <tr>
917 <th>Requirement</th>
918 <th>Minimum</th>
919 </tr>
920 </thead>
921 <tbody>
922 <tr>
923 <td><strong>OS</strong></td>
924 <td>Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+</td>
925 </tr>
926 <tr>
927 <td><strong>CPU</strong></td>
928 <td>1 vCPU</td>
929 </tr>
930 <tr>
931 <td><strong>RAM</strong></td>
932 <td>1 GB</td>
933 </tr>
934 <tr>
935 <td><strong>Disk</strong></td>
936 <td>10 GB (scales with repo count)</td>
937 </tr>
938 <tr>
939 <td><strong>Python</strong></td>
940 <td>3.12+</td>
941 </tr>
942 </tbody>
943 </table>
944 <h2 id="required-software">Required Software<a class="headerlink" href="#required-software" title="Permanent link">&para;</a></h2>
945 <h3 id="docker-docker-compose">Docker &amp; Docker Compose<a class="headerlink" href="#docker-docker-compose" title="Permanent link">&para;</a></h3>
946 <p>Fossilrepo runs its infrastructure stack via Docker Compose.</p>
947 <div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Ubuntu/Debian</label><label for="__tabbed_1_2">macOS</label></div>
948 <div class="tabbed-content">
949 <div class="tabbed-block">
950 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Install Docker</span>
951 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>curl<span class="w"> </span>-fsSL<span class="w"> </span>https://get.docker.com<span class="w"> </span><span class="p">|</span><span class="w"> </span>sh
952 <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>sudo<span class="w"> </span>usermod<span class="w"> </span>-aG<span class="w"> </span>docker<span class="w"> </span><span class="nv">$USER</span>
953 <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
954 <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Verify</span>
955 <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>version
956 </code></pre></div>
957 </div>
958 <div class="tabbed-block">
959 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="c1"># Install Docker Desktop</span>
960 <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>brew<span class="w"> </span>install<span class="w"> </span>--cask<span class="w"> </span>docker
961 <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
962 <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="c1"># Verify</span>
963 <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>version
964 </code></pre></div>
965 </div>
966 </div>
967 </div>
968 <h3 id="git">Git<a class="headerlink" href="#git" title="Permanent link">&para;</a></h3>
969 <p>Required for the sync bridge (mirroring to GitHub/GitLab).</p>
970 <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>--version<span class="w"> </span><span class="c1"># 2.30+</span>
971 </code></pre></div>
972 <h3 id="make">Make<a class="headerlink" href="#make" title="Permanent link">&para;</a></h3>
973 <p>Used for running common commands.</p>
974 <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>make<span class="w"> </span>--version
975 </code></pre></div>
976 <h2 id="optional-s3-compatible-storage">Optional: S3-Compatible Storage<a class="headerlink" href="#optional-s3-compatible-storage" title="Permanent link">&para;</a></h2>
977 <p>For continuous backups via Litestream, you need an S3-compatible bucket:</p>
978 <ul>
979 <li><strong>AWS S3</strong></li>
980 <li><strong>MinIO</strong> (self-hosted)</li>
981 <li><strong>Backblaze B2</strong></li>
982 <li><strong>DigitalOcean Spaces</strong></li>
983 </ul>
984 <div class="admonition info">
985 <p class="admonition-title">Local development</p>
986 <p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p>
987 </div>
988 <h2 id="ports">Ports<a class="headerlink" href="#ports" title="Permanent link">&para;</a></h2>
989 <p>The following ports are used by the stack:</p>
990 <table>
991 <thead>
992 <tr>
993 <th>Port</th>
994 <th>Service</th>
995 </tr>
996 </thead>
997 <tbody>
998 <tr>
999 <td><code>8000</code></td>
1000 <td>Django (management UI)</td>
1001 </tr>
1002 <tr>
1003 <td><code>443</code></td>
1004 <td>Caddy (HTTPS, production)</td>
1005 </tr>
1006 <tr>
1007 <td><code>80</code></td>
1008 <td>Caddy (HTTP redirect, production)</td>
1009 </tr>
1010 <tr>
1011 <td><code>5432</code></td>
1012 <td>PostgreSQL</td>
1013 </tr>
1014 <tr>
1015 <td><code>6379</code></td>
1016 <td>Redis</td>
1017 </tr>
1018 <tr>
1019 <td><code>8025</code></td>
1020 <td>Mailpit (dev only)</td>
1021 </tr>
1022 </tbody>
1023 </table>
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037 </article>
1038 </div>
1039
1040
1041 <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>
1042
1043 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1044 </div>
1045
1046 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1047
1048 <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>
1049 Back to top
1050 </button>
1051
1052 </main>
1053
1054 <footer class="md-footer">
1055
1056 <div class="md-footer-meta md-typeset">
1057 <div class="md-footer-meta__inner md-grid">
1058 <div class="md-copyright">
1059
1060 <div class="md-copyright__highlight">
1061 Copyright &copy; 2026 CONFLICT LLC
1062 </div>
1063
1064
1065 Made with
1066 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1067 Material for MkDocs
1068 </a>
1069
1070 </div>
1071
1072
1073 <div class="md-social">
1074
1075
1076
1077
1078
1079
1080
1081
1082 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1083 <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>
1084 </a>
1085
1086 </div>
1087
1088 </div>
1089 </div>
1090 </footer>
1091
1092 </div>
1093 <div class="md-dialog" data-md-component="dialog">
1094 <div class="md-dialog__inner md-typeset"></div>
1095 </div>
1096
1097
1098
1099
1100
1101 <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>
1102
1103
1104 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1105
1106
1107 </body>
1108 </html>
+1008
--- a/site/index.html
+++ b/site/index.html
@@ -0,0 +1,1008 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://fossilrepo.dev/">
16
+
17
+
18
+
19
+ <link rel="next" href="getting-started/prerequisites/">
20
+
21
+
22
+
23
+
24
+
25
+ <link rel="icon" href="assets/images/favicon.png">
26
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
27
+
28
+
29
+
30
+ <title>Fossilrepo</title>
31
+
32
+
33
+
34
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
35
+
36
+
37
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
52
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
53
+
54
+
55
+
56
+ <link rel="stylesheet" href="assets/css/custom.css">
57
+
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>
59
+
60
+
61
+
62
+
63
+
64
+ </head>
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
+
76
+
77
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
78
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
79
+ <label class="md-overlay" for="__drawer"></label>
80
+ <div data-md-component="skip">
81
+
82
+
83
+ <a href="#fossilrepo" class="md-skip">
84
+ Skip to content
85
+ </a>
86
+
87
+ </div>
88
+ <div data-md-component="announce">
89
+
90
+ </div>
91
+
92
+
93
+
94
+
95
+<header class="md-header" data-md-component="header">
96
+ <nav class="md-header__inner md-grid" aria-label="Header">
97
+ <a href="." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
98
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
99
+ <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
100
+ <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
101
+</div>
102
+ </a>
103
+ <label class="md-header__button md-icon" for="__drawer">
104
+
105
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
106
+ </label>
107
+ <div class="md-header__title" data-md-component="header-title">
108
+ <div class="md-header__ellipsis">
109
+ <div class="md-header__topic">
110
+ <span class="md-ellipsis">
111
+ Fossilrepo
112
+ </span>
113
+ </div>
114
+ <div class="md-header__topic" data-md-component="header-topic">
115
+ <span class="md-ellipsis">
116
+
117
+ Home
118
+
119
+ </span>
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+
125
+ <form class="md-header__option" data-md-component="palette">
126
+
127
+
128
+
129
+
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">
131
+
132
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
134
+ </label>
135
+
136
+
137
+
138
+
139
+
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">
141
+
142
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
144
+ </label>
145
+
146
+
147
+</form>
148
+
149
+
150
+
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>
152
+
153
+
154
+
155
+
156
+
157
+ <label class="md-header__button md-icon" for="__search">
158
+
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>
160
+ </label>
161
+ <div class="md-search" data-md-component="search" role="dialog">
162
+ <label class="md-search__overlay" for="__search"></label>
163
+ <div class="md-search__inner" role="search">
164
+ <form class="md-search__form" name="search">
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>
166
+ <label class="md-search__icon md-icon" for="__search">
167
+
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>
169
+
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>
171
+ </label>
172
+ <nav class="md-search__options" aria-label="Search">
173
+
174
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
175
+
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>
177
+ </button>
178
+ </nav>
179
+
180
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
181
+
182
+ </form>
183
+ <div class="md-search__output">
184
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
185
+ <div class="md-search-result" data-md-component="search-result">
186
+ <div class="md-search-result__meta">
187
+ Initializing search
188
+ </div>
189
+ <ol class="md-search-result__list" role="presentation"></ol>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </div>
194
+</div>
195
+
196
+
197
+
198
+ <div class="md-header__source">
199
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
200
+ <div class="md-source__icon md-icon">
201
+
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>
203
+ </div>
204
+ <div class="md-source__repository">
205
+ ConflictHQ/fossilrepo
206
+ </div>
207
+</a>
208
+ </div>
209
+
210
+ </nav>
211
+
212
+</header>
213
+
214
+ <div class="md-container" data-md-component="container">
215
+
216
+
217
+
218
+
219
+
220
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
221
+ <div class="md-grid">
222
+ <ul class="md-tabs__list">
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+ <li class="md-tabs__item md-tabs__item--active">
232
+ <a href="." class="md-tabs__link">
233
+
234
+
235
+
236
+
237
+
238
+ Home
239
+
240
+ </a>
241
+ </li>
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+ <li class="md-tabs__item">
253
+ <a href="getting-started/prerequisites/" class="md-tabs__link">
254
+
255
+
256
+
257
+ Getting Started
258
+
259
+ </a>
260
+ </li>
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+ <li class="md-tabs__item">
273
+ <a href="architecture/overview/" class="md-tabs__link">
274
+
275
+
276
+
277
+ Architecture
278
+
279
+ </a>
280
+ </li>
281
+
282
+
283
+
284
+
285
+ </ul>
286
+ </div>
287
+</nav>
288
+
289
+
290
+
291
+ <main class="md-main" data-md-component="main">
292
+ <div class="md-main__inner md-grid">
293
+
294
+
295
+
296
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
297
+ <div class="md-sidebar__scrollwrap">
298
+ <div class="md-sidebar__inner">
299
+
300
+
301
+
302
+
303
+
304
+
305
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
306
+ <label class="md-nav__title" for="__drawer">
307
+ <a href="." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
308
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
309
+ <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
310
+ <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
311
+</div>
312
+ </a>
313
+ Fossilrepo
314
+ </label>
315
+
316
+ <div class="md-nav__source">
317
+ <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
318
+ <div class="md-source__icon md-icon">
319
+
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>
321
+ </div>
322
+ <div class="md-source__repository">
323
+ ConflictHQ/fossilrepo
324
+ </div>
325
+</a>
326
+ </div>
327
+
328
+ <ul class="md-nav__list" data-md-scrollfix>
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item md-nav__item--active">
339
+
340
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
341
+
342
+
343
+
344
+
345
+
346
+ <label class="md-nav__link md-nav__link--active" for="__toc">
347
+
348
+
349
+
350
+ <span class="md-ellipsis">
351
+
352
+
353
+ Home
354
+
355
+
356
+
357
+ </span>
358
+
359
+
360
+
361
+ <span class="md-nav__icon md-icon"></span>
362
+ </label>
363
+
364
+ <a href="." class="md-nav__link md-nav__link--active">
365
+
366
+
367
+
368
+ <span class="md-ellipsis">
369
+
370
+
371
+ Home
372
+
373
+
374
+
375
+ </span>
376
+
377
+
378
+
379
+ </a>
380
+
381
+
382
+
383
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
384
+
385
+
386
+
387
+
388
+
389
+
390
+ <label class="md-nav__title" for="__toc">
391
+ <span class="md-nav__icon md-icon"></span>
392
+ Table of contents
393
+ </label>
394
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
395
+
396
+ <li class="md-nav__item">
397
+ <a href="#why-fossil" class="md-nav__link">
398
+ <span class="md-ellipsis">
399
+
400
+ Why Fossil?
401
+
402
+ </span>
403
+ </a>
404
+
405
+</li>
406
+
407
+ <li class="md-nav__item">
408
+ <a href="#what-you-get" class="md-nav__link">
409
+ <span class="md-ellipsis">
410
+
411
+ What You Get
412
+
413
+ </span>
414
+ </a>
415
+
416
+</li>
417
+
418
+ <li class="md-nav__item">
419
+ <a href="#quick-start" class="md-nav__link">
420
+ <span class="md-ellipsis">
421
+
422
+ Quick Start
423
+
424
+ </span>
425
+ </a>
426
+
427
+</li>
428
+
429
+ <li class="md-nav__item">
430
+ <a href="#architecture" class="md-nav__link">
431
+ <span class="md-ellipsis">
432
+
433
+ Architecture
434
+
435
+ </span>
436
+ </a>
437
+
438
+</li>
439
+
440
+ <li class="md-nav__item">
441
+ <a href="#license" class="md-nav__link">
442
+ <span class="md-ellipsis">
443
+
444
+ License
445
+
446
+ </span>
447
+ </a>
448
+
449
+</li>
450
+
451
+ </ul>
452
+
453
+</nav>
454
+
455
+ </li>
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+ <li class="md-nav__item md-nav__item--nested">
476
+
477
+
478
+
479
+
480
+
481
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
482
+
483
+
484
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
485
+
486
+
487
+
488
+ <span class="md-ellipsis">
489
+
490
+
491
+ Getting Started
492
+
493
+
494
+
495
+ </span>
496
+
497
+
498
+
499
+ <span class="md-nav__icon md-icon"></span>
500
+ </label>
501
+
502
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
503
+ <label class="md-nav__title" for="__nav_2">
504
+ <span class="md-nav__icon md-icon"></span>
505
+
506
+
507
+ Getting Started
508
+
509
+
510
+ </label>
511
+ <ul class="md-nav__list" data-md-scrollfix>
512
+
513
+
514
+
515
+
516
+
517
+
518
+
519
+ <li class="md-nav__item">
520
+ <a href="getting-started/prerequisites/" class="md-nav__link">
521
+
522
+
523
+
524
+ <span class="md-ellipsis">
525
+
526
+
527
+ Prerequisites
528
+
529
+
530
+
531
+ </span>
532
+
533
+
534
+
535
+ </a>
536
+ </li>
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+ <li class="md-nav__item">
548
+ <a href="getting-started/installation/" class="md-nav__link">
549
+
550
+
551
+
552
+ <span class="md-ellipsis">
553
+
554
+
555
+ Installation
556
+
557
+
558
+
559
+ </span>
560
+
561
+
562
+
563
+ </a>
564
+ </li>
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+ <li class="md-nav__item">
576
+ <a href="getting-started/configuration/" class="md-nav__link">
577
+
578
+
579
+
580
+ <span class="md-ellipsis">
581
+
582
+
583
+ Configuration
584
+
585
+
586
+
587
+ </span>
588
+
589
+
590
+
591
+ </a>
592
+ </li>
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+ <li class="md-nav__item">
604
+ <a href="getting-started/first-repo/" class="md-nav__link">
605
+
606
+
607
+
608
+ <span class="md-ellipsis">
609
+
610
+
611
+ First Repository
612
+
613
+
614
+
615
+ </span>
616
+
617
+
618
+
619
+ </a>
620
+ </li>
621
+
622
+
623
+
624
+
625
+ </ul>
626
+ </nav>
627
+
628
+ </li>
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+
647
+
648
+ <li class="md-nav__item md-nav__item--nested">
649
+
650
+
651
+
652
+
653
+
654
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
655
+
656
+
657
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
658
+
659
+
660
+
661
+ <span class="md-ellipsis">
662
+
663
+
664
+ Architecture
665
+
666
+
667
+
668
+ </span>
669
+
670
+
671
+
672
+ <span class="md-nav__icon md-icon"></span>
673
+ </label>
674
+
675
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
676
+ <label class="md-nav__title" for="__nav_3">
677
+ <span class="md-nav__icon md-icon"></span>
678
+
679
+
680
+ Architecture
681
+
682
+
683
+ </label>
684
+ <ul class="md-nav__list" data-md-scrollfix>
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+ <li class="md-nav__item">
693
+ <a href="architecture/overview/" class="md-nav__link">
694
+
695
+
696
+
697
+ <span class="md-ellipsis">
698
+
699
+
700
+ Overview
701
+
702
+
703
+
704
+ </span>
705
+
706
+
707
+
708
+ </a>
709
+ </li>
710
+
711
+
712
+
713
+
714
+
715
+
716
+
717
+
718
+
719
+
720
+ <li class="md-nav__item">
721
+ <a href="architecture/sync-bridge/" class="md-nav__link">
722
+
723
+
724
+
725
+ <span class="md-ellipsis">
726
+
727
+
728
+ Sync Bridge
729
+
730
+
731
+
732
+ </span>
733
+
734
+
735
+
736
+ </a>
737
+ </li>
738
+
739
+
740
+
741
+
742
+ </ul>
743
+ </nav>
744
+
745
+ </li>
746
+
747
+
748
+
749
+ </ul>
750
+</nav>
751
+ </div>
752
+ </div>
753
+ </div>
754
+
755
+
756
+
757
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
758
+ <div class="md-sidebar__scrollwrap">
759
+ <div class="md-sidebar__inner">
760
+
761
+
762
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
763
+
764
+
765
+
766
+
767
+
768
+
769
+ <label class="md-nav__title" for="__toc">
770
+ <span class="md-nav__icon md-icon"></span>
771
+ Table of contents
772
+ </label>
773
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
774
+
775
+ <li class="md-nav__item">
776
+ <a href="#why-fossil" class="md-nav__link">
777
+ <span class="md-ellipsis">
778
+
779
+ Why Fossil?
780
+
781
+ </span>
782
+ </a>
783
+
784
+</li>
785
+
786
+ <li class="md-nav__item">
787
+ <a href="#what-you-get" class="md-nav__link">
788
+ <span class="md-ellipsis">
789
+
790
+ What You Get
791
+
792
+ </span>
793
+ </a>
794
+
795
+</li>
796
+
797
+ <li class="md-nav__item">
798
+ <a href="#quick-start" class="md-nav__link">
799
+ <span class="md-ellipsis">
800
+
801
+ Quick Start
802
+
803
+ </span>
804
+ </a>
805
+
806
+</li>
807
+
808
+ <li class="md-nav__item">
809
+ <a href="#architecture" class="md-nav__link">
810
+ <span class="md-ellipsis">
811
+
812
+ Architecture
813
+
814
+ </span>
815
+ </a>
816
+
817
+</li>
818
+
819
+ <li class="md-nav__item">
820
+ <a href="#license" class="md-nav__link">
821
+ <span class="md-ellipsis">
822
+
823
+ License
824
+
825
+ </span>
826
+ </a>
827
+
828
+</li>
829
+
830
+ </ul>
831
+
832
+</nav>
833
+ </div>
834
+ </div>
835
+ </div>
836
+
837
+
838
+
839
+ <div class="md-content" data-md-component="content">
840
+
841
+ <article class="md-content__inner md-typeset">
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+<h1 id="fossilrepo">Fossilrepo<a class="headerlink" href="#fossilrepo" title="Permanent link">&para;</a></h1>
851
+<p><strong>Self-hosted Fossil forge. One command, full-stack code hosting.</strong></p>
852
+<p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p>
853
+<p>Think GitLab Omnibus, but for Fossil.</p>
854
+<h2 id="why-fossil">Why Fossil?<a class="headerlink" href="#why-fossil" title="Permanent link">&para;</a></h2>
855
+<p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p>
856
+<ul>
857
+<li><strong>Single-file repos</strong> -- each <code>.fossil</code> file is the entire project</li>
858
+<li><strong>Built-in everything</strong> -- issues, wiki, forum, timeline, web UI</li>
859
+<li><strong>No API rate limits</strong> -- ideal for CI agents and automation</li>
860
+<li><strong>Litestream replication</strong> -- continuous backup to S3 for free</li>
861
+</ul>
862
+<h2 id="what-you-get">What You Get<a class="headerlink" href="#what-you-get" title="Permanent link">&para;</a></h2>
863
+<table>
864
+<thead>
865
+<tr>
866
+<th>Component</th>
867
+<th>Role</th>
868
+</tr>
869
+</thead>
870
+<tbody>
871
+<tr>
872
+<td><strong>Fossil server</strong></td>
873
+<td>Serves all repos from a single process</td>
874
+</tr>
875
+<tr>
876
+<td><strong>Caddy</strong></td>
877
+<td>SSL termination, subdomain-per-repo routing</td>
878
+</tr>
879
+<tr>
880
+<td><strong>Litestream</strong></td>
881
+<td>Continuous SQLite replication to S3/MinIO</td>
882
+</tr>
883
+<tr>
884
+<td><strong>Django management UI</strong></td>
885
+<td>Repository lifecycle, user management, dashboards</td>
886
+</tr>
887
+<tr>
888
+<td><strong>Sync bridge</strong></td>
889
+<td>Mirror Fossil repos to GitHub/GitLab (read-only)</td>
890
+</tr>
891
+<tr>
892
+<td><strong>Celery workers</strong></td>
893
+<td>Background sync, scheduled tasks</td>
894
+</tr>
895
+</tbody>
896
+</table>
897
+<h2 id="quick-start">Quick Start<a class="headerlink" href="#quick-start" title="Permanent link">&para;</a></h2>
898
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Clone the repo</span>
899
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git
900
+<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo
901
+<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
902
+<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Start the full stack</span>
903
+<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>make<span class="w"> </span>build
904
+<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
905
+<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="c1"># Seed development data</span>
906
+<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>make<span class="w"> </span>seed
907
+<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>
908
+<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="c1"># Open the dashboard</span>
909
+<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>open<span class="w"> </span>http://localhost:8000
910
+</code></pre></div>
911
+<h2 id="architecture">Architecture<a class="headerlink" href="#architecture" title="Permanent link">&para;</a></h2>
912
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Caddy (SSL termination, routing, subdomain per repo)
913
+<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> +-- fossil server --repolist /data/repos/
914
+<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> +-- /data/repos/
915
+<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> |-- projecta.fossil
916
+<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> |-- projectb.fossil
917
+<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> +-- ...
918
+<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>
919
+<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>Litestream -&gt; S3/MinIO (continuous replication, point-in-time recovery)
920
+</code></pre></div>
921
+<p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p>
922
+<h2 id="license">License<a class="headerlink" href="#license" title="Permanent link">&para;</a></h2>
923
+<p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p>
924
+
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+
934
+
935
+
936
+
937
+ </article>
938
+ </div>
939
+
940
+
941
+ <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>
942
+
943
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
944
+ </div>
945
+
946
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
947
+
948
+ <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>
949
+ Back to top
950
+</button>
951
+
952
+ </main>
953
+
954
+ <footer class="md-footer">
955
+
956
+ <div class="md-footer-meta md-typeset">
957
+ <div class="md-footer-meta__inner md-grid">
958
+ <div class="md-copyright">
959
+
960
+ <div class="md-copyright__highlight">
961
+ Copyright &copy; 2026 CONFLICT LLC
962
+ </div>
963
+
964
+
965
+ Made with
966
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
967
+ Material for MkDocs
968
+ </a>
969
+
970
+</div>
971
+
972
+
973
+<div class="md-social">
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+ <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
983
+ <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>
984
+ </a>
985
+
986
+</div>
987
+
988
+ </div>
989
+ </div>
990
+</footer>
991
+
992
+ </div>
993
+ <div class="md-dialog" data-md-component="dialog">
994
+ <div class="md-dialog__inner md-typeset"></div>
995
+ </div>
996
+
997
+
998
+
999
+
1000
+
1001
+ <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>
1002
+
1003
+
1004
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
1005
+
1006
+
1007
+ </body>
1008
+</html>
--- a/site/index.html
+++ b/site/index.html
@@ -0,0 +1,1008 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/index.html
+++ b/site/index.html
@@ -0,0 +1,1008 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://fossilrepo.dev/">
16
17
18
19 <link rel="next" href="getting-started/prerequisites/">
20
21
22
23
24
25 <link rel="icon" href="assets/images/favicon.png">
26 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
27
28
29
30 <title>Fossilrepo</title>
31
32
33
34 <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
35
36
37 <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
38
39
40
41
42
43
44
45
46
47
48
49
50 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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">
52 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
53
54
55
56 <link rel="stylesheet" href="assets/css/custom.css">
57
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>
59
60
61
62
63
64 </head>
65
66
67
68
69
70
71
72
73
74 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
76
77 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
78 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
79 <label class="md-overlay" for="__drawer"></label>
80 <div data-md-component="skip">
81
82
83 <a href="#fossilrepo" class="md-skip">
84 Skip to content
85 </a>
86
87 </div>
88 <div data-md-component="announce">
89
90 </div>
91
92
93
94
95 <header class="md-header" data-md-component="header">
96 <nav class="md-header__inner md-grid" aria-label="Header">
97 <a href="." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
98 <div style="display: flex; align-items: center; gap: 0.6rem;">
99 <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
100 <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
101 </div>
102 </a>
103 <label class="md-header__button md-icon" for="__drawer">
104
105 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
106 </label>
107 <div class="md-header__title" data-md-component="header-title">
108 <div class="md-header__ellipsis">
109 <div class="md-header__topic">
110 <span class="md-ellipsis">
111 Fossilrepo
112 </span>
113 </div>
114 <div class="md-header__topic" data-md-component="header-topic">
115 <span class="md-ellipsis">
116
117 Home
118
119 </span>
120 </div>
121 </div>
122 </div>
123
124
125 <form class="md-header__option" data-md-component="palette">
126
127
128
129
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">
131
132 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
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>
134 </label>
135
136
137
138
139
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">
141
142 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
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>
144 </label>
145
146
147 </form>
148
149
150
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>
152
153
154
155
156
157 <label class="md-header__button md-icon" for="__search">
158
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>
160 </label>
161 <div class="md-search" data-md-component="search" role="dialog">
162 <label class="md-search__overlay" for="__search"></label>
163 <div class="md-search__inner" role="search">
164 <form class="md-search__form" name="search">
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>
166 <label class="md-search__icon md-icon" for="__search">
167
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>
169
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>
171 </label>
172 <nav class="md-search__options" aria-label="Search">
173
174 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
175
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>
177 </button>
178 </nav>
179
180 <div class="md-search__suggest" data-md-component="search-suggest"></div>
181
182 </form>
183 <div class="md-search__output">
184 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
185 <div class="md-search-result" data-md-component="search-result">
186 <div class="md-search-result__meta">
187 Initializing search
188 </div>
189 <ol class="md-search-result__list" role="presentation"></ol>
190 </div>
191 </div>
192 </div>
193 </div>
194 </div>
195
196
197
198 <div class="md-header__source">
199 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
200 <div class="md-source__icon md-icon">
201
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>
203 </div>
204 <div class="md-source__repository">
205 ConflictHQ/fossilrepo
206 </div>
207 </a>
208 </div>
209
210 </nav>
211
212 </header>
213
214 <div class="md-container" data-md-component="container">
215
216
217
218
219
220 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
221 <div class="md-grid">
222 <ul class="md-tabs__list">
223
224
225
226
227
228
229
230
231 <li class="md-tabs__item md-tabs__item--active">
232 <a href="." class="md-tabs__link">
233
234
235
236
237
238 Home
239
240 </a>
241 </li>
242
243
244
245
246
247
248
249
250
251
252 <li class="md-tabs__item">
253 <a href="getting-started/prerequisites/" class="md-tabs__link">
254
255
256
257 Getting Started
258
259 </a>
260 </li>
261
262
263
264
265
266
267
268
269
270
271
272 <li class="md-tabs__item">
273 <a href="architecture/overview/" class="md-tabs__link">
274
275
276
277 Architecture
278
279 </a>
280 </li>
281
282
283
284
285 </ul>
286 </div>
287 </nav>
288
289
290
291 <main class="md-main" data-md-component="main">
292 <div class="md-main__inner md-grid">
293
294
295
296 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
297 <div class="md-sidebar__scrollwrap">
298 <div class="md-sidebar__inner">
299
300
301
302
303
304
305 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
306 <label class="md-nav__title" for="__drawer">
307 <a href="." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo">
308 <div style="display: flex; align-items: center; gap: 0.6rem;">
309 <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;">
310 <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
311 </div>
312 </a>
313 Fossilrepo
314 </label>
315
316 <div class="md-nav__source">
317 <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source">
318 <div class="md-source__icon md-icon">
319
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>
321 </div>
322 <div class="md-source__repository">
323 ConflictHQ/fossilrepo
324 </div>
325 </a>
326 </div>
327
328 <ul class="md-nav__list" data-md-scrollfix>
329
330
331
332
333
334
335
336
337
338 <li class="md-nav__item md-nav__item--active">
339
340 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
341
342
343
344
345
346 <label class="md-nav__link md-nav__link--active" for="__toc">
347
348
349
350 <span class="md-ellipsis">
351
352
353 Home
354
355
356
357 </span>
358
359
360
361 <span class="md-nav__icon md-icon"></span>
362 </label>
363
364 <a href="." class="md-nav__link md-nav__link--active">
365
366
367
368 <span class="md-ellipsis">
369
370
371 Home
372
373
374
375 </span>
376
377
378
379 </a>
380
381
382
383 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
384
385
386
387
388
389
390 <label class="md-nav__title" for="__toc">
391 <span class="md-nav__icon md-icon"></span>
392 Table of contents
393 </label>
394 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
395
396 <li class="md-nav__item">
397 <a href="#why-fossil" class="md-nav__link">
398 <span class="md-ellipsis">
399
400 Why Fossil?
401
402 </span>
403 </a>
404
405 </li>
406
407 <li class="md-nav__item">
408 <a href="#what-you-get" class="md-nav__link">
409 <span class="md-ellipsis">
410
411 What You Get
412
413 </span>
414 </a>
415
416 </li>
417
418 <li class="md-nav__item">
419 <a href="#quick-start" class="md-nav__link">
420 <span class="md-ellipsis">
421
422 Quick Start
423
424 </span>
425 </a>
426
427 </li>
428
429 <li class="md-nav__item">
430 <a href="#architecture" class="md-nav__link">
431 <span class="md-ellipsis">
432
433 Architecture
434
435 </span>
436 </a>
437
438 </li>
439
440 <li class="md-nav__item">
441 <a href="#license" class="md-nav__link">
442 <span class="md-ellipsis">
443
444 License
445
446 </span>
447 </a>
448
449 </li>
450
451 </ul>
452
453 </nav>
454
455 </li>
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475 <li class="md-nav__item md-nav__item--nested">
476
477
478
479
480
481 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
482
483
484 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
485
486
487
488 <span class="md-ellipsis">
489
490
491 Getting Started
492
493
494
495 </span>
496
497
498
499 <span class="md-nav__icon md-icon"></span>
500 </label>
501
502 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
503 <label class="md-nav__title" for="__nav_2">
504 <span class="md-nav__icon md-icon"></span>
505
506
507 Getting Started
508
509
510 </label>
511 <ul class="md-nav__list" data-md-scrollfix>
512
513
514
515
516
517
518
519 <li class="md-nav__item">
520 <a href="getting-started/prerequisites/" class="md-nav__link">
521
522
523
524 <span class="md-ellipsis">
525
526
527 Prerequisites
528
529
530
531 </span>
532
533
534
535 </a>
536 </li>
537
538
539
540
541
542
543
544
545
546
547 <li class="md-nav__item">
548 <a href="getting-started/installation/" class="md-nav__link">
549
550
551
552 <span class="md-ellipsis">
553
554
555 Installation
556
557
558
559 </span>
560
561
562
563 </a>
564 </li>
565
566
567
568
569
570
571
572
573
574
575 <li class="md-nav__item">
576 <a href="getting-started/configuration/" class="md-nav__link">
577
578
579
580 <span class="md-ellipsis">
581
582
583 Configuration
584
585
586
587 </span>
588
589
590
591 </a>
592 </li>
593
594
595
596
597
598
599
600
601
602
603 <li class="md-nav__item">
604 <a href="getting-started/first-repo/" class="md-nav__link">
605
606
607
608 <span class="md-ellipsis">
609
610
611 First Repository
612
613
614
615 </span>
616
617
618
619 </a>
620 </li>
621
622
623
624
625 </ul>
626 </nav>
627
628 </li>
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648 <li class="md-nav__item md-nav__item--nested">
649
650
651
652
653
654 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
655
656
657 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
658
659
660
661 <span class="md-ellipsis">
662
663
664 Architecture
665
666
667
668 </span>
669
670
671
672 <span class="md-nav__icon md-icon"></span>
673 </label>
674
675 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
676 <label class="md-nav__title" for="__nav_3">
677 <span class="md-nav__icon md-icon"></span>
678
679
680 Architecture
681
682
683 </label>
684 <ul class="md-nav__list" data-md-scrollfix>
685
686
687
688
689
690
691
692 <li class="md-nav__item">
693 <a href="architecture/overview/" class="md-nav__link">
694
695
696
697 <span class="md-ellipsis">
698
699
700 Overview
701
702
703
704 </span>
705
706
707
708 </a>
709 </li>
710
711
712
713
714
715
716
717
718
719
720 <li class="md-nav__item">
721 <a href="architecture/sync-bridge/" class="md-nav__link">
722
723
724
725 <span class="md-ellipsis">
726
727
728 Sync Bridge
729
730
731
732 </span>
733
734
735
736 </a>
737 </li>
738
739
740
741
742 </ul>
743 </nav>
744
745 </li>
746
747
748
749 </ul>
750 </nav>
751 </div>
752 </div>
753 </div>
754
755
756
757 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
758 <div class="md-sidebar__scrollwrap">
759 <div class="md-sidebar__inner">
760
761
762 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
763
764
765
766
767
768
769 <label class="md-nav__title" for="__toc">
770 <span class="md-nav__icon md-icon"></span>
771 Table of contents
772 </label>
773 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
774
775 <li class="md-nav__item">
776 <a href="#why-fossil" class="md-nav__link">
777 <span class="md-ellipsis">
778
779 Why Fossil?
780
781 </span>
782 </a>
783
784 </li>
785
786 <li class="md-nav__item">
787 <a href="#what-you-get" class="md-nav__link">
788 <span class="md-ellipsis">
789
790 What You Get
791
792 </span>
793 </a>
794
795 </li>
796
797 <li class="md-nav__item">
798 <a href="#quick-start" class="md-nav__link">
799 <span class="md-ellipsis">
800
801 Quick Start
802
803 </span>
804 </a>
805
806 </li>
807
808 <li class="md-nav__item">
809 <a href="#architecture" class="md-nav__link">
810 <span class="md-ellipsis">
811
812 Architecture
813
814 </span>
815 </a>
816
817 </li>
818
819 <li class="md-nav__item">
820 <a href="#license" class="md-nav__link">
821 <span class="md-ellipsis">
822
823 License
824
825 </span>
826 </a>
827
828 </li>
829
830 </ul>
831
832 </nav>
833 </div>
834 </div>
835 </div>
836
837
838
839 <div class="md-content" data-md-component="content">
840
841 <article class="md-content__inner md-typeset">
842
843
844
845
846
847
848
849
850 <h1 id="fossilrepo">Fossilrepo<a class="headerlink" href="#fossilrepo" title="Permanent link">&para;</a></h1>
851 <p><strong>Self-hosted Fossil forge. One command, full-stack code hosting.</strong></p>
852 <p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p>
853 <p>Think GitLab Omnibus, but for Fossil.</p>
854 <h2 id="why-fossil">Why Fossil?<a class="headerlink" href="#why-fossil" title="Permanent link">&para;</a></h2>
855 <p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p>
856 <ul>
857 <li><strong>Single-file repos</strong> -- each <code>.fossil</code> file is the entire project</li>
858 <li><strong>Built-in everything</strong> -- issues, wiki, forum, timeline, web UI</li>
859 <li><strong>No API rate limits</strong> -- ideal for CI agents and automation</li>
860 <li><strong>Litestream replication</strong> -- continuous backup to S3 for free</li>
861 </ul>
862 <h2 id="what-you-get">What You Get<a class="headerlink" href="#what-you-get" title="Permanent link">&para;</a></h2>
863 <table>
864 <thead>
865 <tr>
866 <th>Component</th>
867 <th>Role</th>
868 </tr>
869 </thead>
870 <tbody>
871 <tr>
872 <td><strong>Fossil server</strong></td>
873 <td>Serves all repos from a single process</td>
874 </tr>
875 <tr>
876 <td><strong>Caddy</strong></td>
877 <td>SSL termination, subdomain-per-repo routing</td>
878 </tr>
879 <tr>
880 <td><strong>Litestream</strong></td>
881 <td>Continuous SQLite replication to S3/MinIO</td>
882 </tr>
883 <tr>
884 <td><strong>Django management UI</strong></td>
885 <td>Repository lifecycle, user management, dashboards</td>
886 </tr>
887 <tr>
888 <td><strong>Sync bridge</strong></td>
889 <td>Mirror Fossil repos to GitHub/GitLab (read-only)</td>
890 </tr>
891 <tr>
892 <td><strong>Celery workers</strong></td>
893 <td>Background sync, scheduled tasks</td>
894 </tr>
895 </tbody>
896 </table>
897 <h2 id="quick-start">Quick Start<a class="headerlink" href="#quick-start" title="Permanent link">&para;</a></h2>
898 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Clone the repo</span>
899 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git
900 <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo
901 <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
902 <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Start the full stack</span>
903 <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>make<span class="w"> </span>build
904 <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
905 <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="c1"># Seed development data</span>
906 <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>make<span class="w"> </span>seed
907 <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>
908 <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="c1"># Open the dashboard</span>
909 <a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>open<span class="w"> </span>http://localhost:8000
910 </code></pre></div>
911 <h2 id="architecture">Architecture<a class="headerlink" href="#architecture" title="Permanent link">&para;</a></h2>
912 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Caddy (SSL termination, routing, subdomain per repo)
913 <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> +-- fossil server --repolist /data/repos/
914 <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> +-- /data/repos/
915 <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> |-- projecta.fossil
916 <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> |-- projectb.fossil
917 <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> +-- ...
918 <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>
919 <a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>Litestream -&gt; S3/MinIO (continuous replication, point-in-time recovery)
920 </code></pre></div>
921 <p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p>
922 <h2 id="license">License<a class="headerlink" href="#license" title="Permanent link">&para;</a></h2>
923 <p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p>
924
925
926
927
928
929
930
931
932
933
934
935
936
937 </article>
938 </div>
939
940
941 <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>
942
943 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
944 </div>
945
946 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
947
948 <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>
949 Back to top
950 </button>
951
952 </main>
953
954 <footer class="md-footer">
955
956 <div class="md-footer-meta md-typeset">
957 <div class="md-footer-meta__inner md-grid">
958 <div class="md-copyright">
959
960 <div class="md-copyright__highlight">
961 Copyright &copy; 2026 CONFLICT LLC
962 </div>
963
964
965 Made with
966 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
967 Material for MkDocs
968 </a>
969
970 </div>
971
972
973 <div class="md-social">
974
975
976
977
978
979
980
981
982 <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
983 <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>
984 </a>
985
986 </div>
987
988 </div>
989 </div>
990 </footer>
991
992 </div>
993 <div class="md-dialog" data-md-component="dialog">
994 <div class="md-dialog__inner md-typeset"></div>
995 </div>
996
997
998
999
1000
1001 <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>
1002
1003
1004 <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
1005
1006
1007 </body>
1008 </html>
--- a/site/overrides/partials/logo.html
+++ b/site/overrides/partials/logo.html
@@ -0,0 +1,4 @@
1
+<div style="display: flex; align-items: center; gap: 0.6rem;">
2
+ <img src="{{ 'assets/images/conflict-logo.svg' | url }}" alt="CONFLICT" style="height: 1.4rem; width: auto;">
3
+ <img src="{{ 'assets/images/fossilrepo-logo.svg' | url }}" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
4
+</div>
--- a/site/overrides/partials/logo.html
+++ b/site/overrides/partials/logo.html
@@ -0,0 +1,4 @@
 
 
 
 
--- a/site/overrides/partials/logo.html
+++ b/site/overrides/partials/logo.html
@@ -0,0 +1,4 @@
1 <div style="display: flex; align-items: center; gap: 0.6rem;">
2 <img src="{{ 'assets/images/conflict-logo.svg' | url }}" alt="CONFLICT" style="height: 1.4rem; width: auto;">
3 <img src="{{ 'assets/images/fossilrepo-logo.svg' | url }}" alt="Fossilrepo" style="height: 1.2rem; width: auto;">
4 </div>
--- a/site/search/search_index.json
+++ b/site/search/search_index.json
@@ -0,0 +1 @@
1
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Fossilrepo","text":"<p>Self-hosted Fossil forge. One command, full-stack code hosting.</p> <p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p> <p>Think GitLab Omnibus, but for Fossil.</p>"},{"location":"#why-fossil","title":"Why Fossil?","text":"<p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p> <ul> <li>Single-file repos -- each <code>.fossil</code> file is the entire project</li> <li>Built-in everything -- issues, wiki, forum, timeline, web UI</li> <li>No API rate limits -- ideal for CI agents and automation</li> <li>Litestream replication -- continuous backup to S3 for free</li> </ul>"},{"location":"#what-you-get","title":"What You Get","text":"Component Role Fossil server Serves all repos from a single process Caddy SSL termination, subdomain-per-repo routing Litestream Continuous SQLite replication to S3/MinIO Django management UI Repository lifecycle, user management, dashboards Sync bridge Mirror Fossil repos to GitHub/GitLab (read-only) Celery workers Background sync, scheduled tasks"},{"location":"#quick-start","title":"Quick Start","text":"<pre><code># Clone the repo\ngit clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n\n# Start the full stack\nmake build\n\n# Seed development data\nmake seed\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre>"},{"location":"#architecture","title":"Architecture","text":"<pre><code>Caddy (SSL termination, routing, subdomain per repo)\n +-- fossil server --repolist /data/repos/\n +-- /data/repos/\n |-- projecta.fossil\n |-- projectb.fossil\n +-- ...\n\nLitestream -&gt; S3/MinIO (continuous replication, point-in-time recovery)\n</code></pre> <p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p>"},{"location":"#license","title":"License","text":"<p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p>"},{"location":"architecture/overview/","title":"Architecture Overview","text":"<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>"},{"location":"architecture/overview/#system-diagram","title":"System Diagram","text":"<pre><code>graph TB\n subgraph Internet\n User[User / Browser]\n end\n\n subgraph Fossilrepo Server\n Caddy[Caddy&lt;br/&gt;SSL + Routing]\n Django[Django&lt;br/&gt;Management UI]\n Fossil[Fossil Server&lt;br/&gt;--repolist]\n Celery[Celery Workers]\n Redis[Redis]\n Postgres[(PostgreSQL)]\n Litestream[Litestream]\n end\n\n subgraph Storage\n Repos[\"/data/repos/&lt;br/&gt;*.fossil files\"]\n S3[(S3 / MinIO)]\n end\n\n subgraph Mirrors\n GitHub[GitHub]\n GitLab[GitLab]\n end\n\n User --&gt; Caddy\n Caddy --&gt;|\"app.domain.com\"| Django\n Caddy --&gt;|\"repo.domain.com\"| Fossil\n Django --&gt; Postgres\n Django --&gt; Redis\n Celery --&gt; Redis\n Celery --&gt;|sync bridge| GitHub\n Celery --&gt;|sync bridge| GitLab\n Fossil --&gt; Repos\n Litestream --&gt; Repos\n Litestream --&gt; S3</code></pre>"},{"location":"architecture/overview/#components","title":"Components","text":""},{"location":"architecture/overview/#fossil-server","title":"Fossil Server","text":"<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> <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>"},{"location":"architecture/overview/#caddy","title":"Caddy","text":"<p>Handles SSL termination and subdomain routing:</p> <ul> <li><code>your-domain.com</code> routes to the Django management UI</li> <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li> </ul> <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>"},{"location":"architecture/overview/#django-management-layer","title":"Django Management Layer","text":"<p>Provides the administrative interface:</p> <ul> <li>Repository lifecycle (create, configure, archive)</li> <li>User and organization management</li> <li>Dashboard and analytics</li> <li>Sync bridge configuration</li> </ul> <p>Django uses HTMX for interactive UI without a JavaScript framework.</p>"},{"location":"architecture/overview/#litestream","title":"Litestream","text":"<p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p> <ul> <li>Continuous backup -- WAL frames replicated in near-real-time</li> <li>Point-in-time recovery -- restore to any moment, not just snapshots</li> <li>Zero-config per repo -- new <code>.fossil</code> files are picked up automatically</li> </ul>"},{"location":"architecture/overview/#celery-workers","title":"Celery Workers","text":"<p>Handle background tasks:</p> <ul> <li>Sync bridge execution (Fossil to Git mirroring)</li> <li>Scheduled sync jobs</li> <li>Upstream pull operations</li> </ul>"},{"location":"architecture/overview/#data-flow","title":"Data Flow","text":"<ol> <li>User pushes to Fossil -- standard <code>fossil push</code> or <code>fossil sync</code></li> <li>Fossil writes to <code>.fossil</code> file -- SQLite transactions</li> <li>Litestream replicates -- WAL frames streamed to S3</li> <li>Sync bridge runs -- Celery task mirrors changes to Git remotes</li> <li>Django reflects state -- reads from Fossil SQLite for dashboards</li> </ol> <p>Fossil is always the source of truth. Everything else is derived.</p>"},{"location":"architecture/sync-bridge/","title":"Sync Bridge","text":"<p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>"},{"location":"architecture/sync-bridge/#how-it-works","title":"How It Works","text":"<pre><code>flowchart LR\n Fossil[\"Fossil Repo&lt;br/&gt;(source of truth)\"] --&gt; Bridge[\"Sync Bridge&lt;br/&gt;(Celery task)\"]\n Bridge --&gt; Git[\"Git Export\"]\n Git --&gt; GitHub[\"GitHub Mirror\"]\n Git --&gt; GitLab[\"GitLab Mirror\"]</code></pre> <p>The bridge:</p> <ol> <li>Exports Fossil commits as Git commits</li> <li>Pushes to configured Git remotes</li> <li>Optionally syncs tickets to GitHub/GitLab Issues</li> <li>Optionally syncs wiki pages to repo docs</li> </ol>"},{"location":"architecture/sync-bridge/#what-gets-synced","title":"What Gets Synced","text":"Fossil Artifact Git Target Configurable Commits Git commits Always Tags Git tags Always Branches Git branches Always Tickets GitHub/GitLab Issues Optional Wiki Repository docs Optional"},{"location":"architecture/sync-bridge/#configuration","title":"Configuration","text":"<p>Set up mirroring through the Django management UI or environment variables:</p> <pre><code># GitHub mirror\nGITHUB_TOKEN=ghp_xxxxxxxxxxxx\n\n# GitLab mirror\nGITLAB_TOKEN=glpat-xxxxxxxxxxxx\n</code></pre> <p>Per-repository mirror configuration is managed in the dashboard under Repository Settings &gt; Sync.</p>"},{"location":"architecture/sync-bridge/#sync-modes","title":"Sync Modes","text":""},{"location":"architecture/sync-bridge/#on-demand","title":"On-Demand","text":"<p>Trigger a sync manually from the dashboard or CLI:</p> <pre><code>docker compose exec django python manage.py fossil_sync my-project\n</code></pre>"},{"location":"architecture/sync-bridge/#scheduled","title":"Scheduled","text":"<p>Configure a Celery Beat schedule to sync at regular intervals:</p> <pre><code># Runs every 15 minutes\nCELERY_BEAT_SCHEDULE = {\n 'sync-all-repos': {\n 'task': 'fossil.tasks.sync_all',\n 'schedule': 900.0,\n },\n}\n</code></pre>"},{"location":"architecture/sync-bridge/#upstream-pull","title":"Upstream Pull","text":"<p>Pull updates from a remote Fossil server into your local instance:</p> <pre><code>docker compose exec django python manage.py fossil_pull my-project\n</code></pre> <p>Direction matters</p> <p>The sync bridge is one-way: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p>"},{"location":"getting-started/configuration/","title":"Configuration","text":""},{"location":"getting-started/configuration/#environment-variables","title":"Environment Variables","text":"<p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p>"},{"location":"getting-started/configuration/#django-settings","title":"Django Settings","text":"Variable Default Description <code>SECRET_KEY</code> -- Django secret key (required) <code>DEBUG</code> <code>False</code> Enable debug mode <code>ALLOWED_HOSTS</code> <code>localhost</code> Comma-separated list of allowed hosts <code>TIME_ZONE</code> <code>UTC</code> Server timezone"},{"location":"getting-started/configuration/#database","title":"Database","text":"Variable Default Description <code>POSTGRES_DB</code> <code>fossilrepo</code> Database name <code>POSTGRES_USER</code> <code>fossilrepo</code> Database user <code>POSTGRES_PASSWORD</code> -- Database password (required) <code>POSTGRES_HOST</code> <code>postgres</code> Database host <code>POSTGRES_PORT</code> <code>5432</code> Database port"},{"location":"getting-started/configuration/#redis-celery","title":"Redis &amp; Celery","text":"Variable Default Description <code>REDIS_URL</code> <code>redis://redis:6379/0</code> Redis connection URL <code>CELERY_BROKER_URL</code> <code>$REDIS_URL</code> Celery broker (defaults to Redis URL)"},{"location":"getting-started/configuration/#fossil","title":"Fossil","text":"Variable Default Description <code>FOSSIL_REPO_DIR</code> <code>/data/repos</code> Directory where <code>.fossil</code> files are stored <code>FOSSIL_BASE_URL</code> -- Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>) <code>FOSSIL_BINARY</code> <code>fossil</code> Path to the Fossil binary"},{"location":"getting-started/configuration/#caddy-production","title":"Caddy (Production)","text":"Variable Default Description <code>CADDY_DOMAIN</code> -- Your domain (e.g., <code>example.com</code>) <code>CADDY_EMAIL</code> -- Email for Let's Encrypt certificates"},{"location":"getting-started/configuration/#litestream-backups","title":"Litestream (Backups)","text":"Variable Default Description <code>LITESTREAM_ACCESS_KEY_ID</code> -- S3 access key <code>LITESTREAM_SECRET_ACCESS_KEY</code> -- S3 secret key <code>LITESTREAM_BUCKET</code> -- S3 bucket name <code>LITESTREAM_ENDPOINT</code> -- S3 endpoint (for MinIO/B2) <code>LITESTREAM_REGION</code> <code>us-east-1</code> S3 region"},{"location":"getting-started/configuration/#sync-bridge","title":"Sync Bridge","text":"Variable Default Description <code>GITHUB_TOKEN</code> -- GitHub personal access token (for mirroring) <code>GITLAB_TOKEN</code> -- GitLab personal access token (for mirroring)"},{"location":"getting-started/configuration/#caddy-configuration","title":"Caddy Configuration","text":"<p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p> <pre><code>{$CADDY_DOMAIN} {\n reverse_proxy django:8000\n}\n\n*.{$CADDY_DOMAIN} {\n reverse_proxy fossil:8080\n}\n</code></pre> <p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p>"},{"location":"getting-started/configuration/#litestream-configuration","title":"Litestream Configuration","text":"<p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p> <pre><code>dbs:\n - path: /data/repos/*.fossil\n replicas:\n - type: s3\n bucket: ${LITESTREAM_BUCKET}\n endpoint: ${LITESTREAM_ENDPOINT}\n region: ${LITESTREAM_REGION}\n</code></pre> <p>Point-in-time recovery</p> <p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p>"},{"location":"getting-started/first-repo/","title":"Creating Your First Repository","text":"<p>Once fossilrepo is running, you can create your first Fossil repository.</p>"},{"location":"getting-started/first-repo/#via-the-dashboard","title":"Via the Dashboard","text":"<ol> <li>Log in at <code>http://localhost:8000</code></li> <li>Navigate to Repositories in the sidebar</li> <li>Click Create Repository</li> <li>Enter a name (e.g., <code>my-project</code>)</li> <li>Click Create</li> </ol> <p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p>"},{"location":"getting-started/first-repo/#via-the-cli","title":"Via the CLI","text":"<pre><code># Inside the fossilrepo container\ndocker compose exec django python manage.py fossil_create my-project\n</code></pre> <p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p>"},{"location":"getting-started/first-repo/#what-happens-under-the-hood","title":"What Happens Under the Hood","text":"<pre><code>sequenceDiagram\n participant User\n participant Django\n participant Fossil\n participant Litestream\n participant S3\n\n User-&gt;&gt;Django: Create repo \"my-project\"\n Django-&gt;&gt;Fossil: fossil init /data/repos/my-project.fossil\n Fossil--&gt;&gt;Django: Repository created\n Django-&gt;&gt;Django: Register in database\n Litestream-&gt;&gt;S3: Begin replicating my-project.fossil\n Django--&gt;&gt;User: Repository ready</code></pre>"},{"location":"getting-started/first-repo/#accessing-your-repository","title":"Accessing Your Repository","text":""},{"location":"getting-started/first-repo/#web-ui","title":"Web UI","text":"<p>Fossil includes a built-in web interface with:</p> <ul> <li>Timeline -- commit history with diffs</li> <li>Tickets -- issue tracker</li> <li>Wiki -- project documentation</li> <li>Forum -- discussions</li> </ul>"},{"location":"getting-started/first-repo/#clone-via-fossil","title":"Clone via Fossil","text":"<pre><code>fossil clone https://my-project.your-domain.com my-project.fossil\nfossil open my-project.fossil\n</code></pre>"},{"location":"getting-started/first-repo/#clone-via-git-mirror","title":"Clone via Git (Mirror)","text":"<p>If you've configured the sync bridge:</p> <pre><code>git clone https://github.com/your-org/my-project.git\n</code></pre> <p>Read-only mirror</p> <p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p>"},{"location":"getting-started/first-repo/#next-steps","title":"Next Steps","text":"<ul> <li>Configure the sync bridge to mirror to GitHub/GitLab</li> <li>Set up backups with Litestream</li> <li>Explore the architecture overview</li> </ul>"},{"location":"getting-started/installation/","title":"Installation","text":""},{"location":"getting-started/installation/#clone-the-repository","title":"Clone the Repository","text":"<pre><code>git clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n</code></pre>"},{"location":"getting-started/installation/#environment-configuration","title":"Environment Configuration","text":"<p>Copy the example environment file and configure it:</p> <pre><code>cp .env.example .env\n</code></pre> <p>Edit <code>.env</code> with your settings:</p> <pre><code># Django\nSECRET_KEY=your-secret-key-here\nDEBUG=True\nALLOWED_HOSTS=localhost,127.0.0.1\n\n# Database\nPOSTGRES_DB=fossilrepo\nPOSTGRES_USER=fossilrepo\nPOSTGRES_PASSWORD=your-db-password\n\n# Redis\nREDIS_URL=redis://redis:6379/0\n\n# Fossil\nFOSSIL_REPO_DIR=/data/repos\nFOSSIL_BASE_URL=https://your-domain.com\n</code></pre>"},{"location":"getting-started/installation/#start-the-stack","title":"Start the Stack","text":""},{"location":"getting-started/installation/#development","title":"Development","text":"<pre><code># Build and start all services\nmake build\n\n# Run database migrations\nmake migrate\n\n# Create an admin user\nmake superuser\n\n# Load sample data (optional)\nmake seed\n</code></pre> <p>The development stack includes:</p> <ul> <li>Django dev server on <code>http://localhost:8000</code></li> <li>PostgreSQL 16</li> <li>Redis</li> <li>Celery worker + beat</li> <li>Mailpit on <code>http://localhost:8025</code></li> </ul>"},{"location":"getting-started/installation/#production","title":"Production","text":"<p>For production, you'll also configure Caddy and Litestream:</p> <pre><code># Copy production configs\ncp docker/Caddyfile.example docker/Caddyfile\ncp docker/litestream.yml.example docker/litestream.yml\n\n# Edit with your domain and S3 credentials\n# Then start with the production compose file\ndocker compose -f docker-compose.yml -f docker-compose.prod.yml up -d\n</code></pre>"},{"location":"getting-started/installation/#verify-installation","title":"Verify Installation","text":"<pre><code># Check all services are running\ndocker compose ps\n\n# Hit the health endpoint\ncurl http://localhost:8000/health/\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre> <p>You should see</p> <p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p>"},{"location":"getting-started/installation/#common-issues","title":"Common Issues","text":"Port 8000 already in use <p>Change the Django port mapping in <code>docker-compose.yml</code>: <pre><code>ports:\n - \"8001:8000\"\n</code></pre></p> Database connection refused <p>Ensure PostgreSQL has started before Django: <pre><code>docker compose logs postgres\n</code></pre> The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down &amp;&amp; make up</code>.</p> Permission denied on /data/repos <p>The Fossil repo directory needs to be writable by the container user: <pre><code>sudo chown -R 1000:1000 /data/repos\n</code></pre></p>"},{"location":"getting-started/prerequisites/","title":"Prerequisites","text":"<p>Before installing fossilrepo, ensure your server meets these requirements.</p>"},{"location":"getting-started/prerequisites/#system-requirements","title":"System Requirements","text":"Requirement Minimum OS Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+ CPU 1 vCPU RAM 1 GB Disk 10 GB (scales with repo count) Python 3.12+"},{"location":"getting-started/prerequisites/#required-software","title":"Required Software","text":""},{"location":"getting-started/prerequisites/#docker-docker-compose","title":"Docker &amp; Docker Compose","text":"<p>Fossilrepo runs its infrastructure stack via Docker Compose.</p> Ubuntu/DebianmacOS <pre><code># Install Docker\ncurl -fsSL https://get.docker.com | sh\nsudo usermod -aG docker $USER\n\n# Verify\ndocker compose version\n</code></pre> <pre><code># Install Docker Desktop\nbrew install --cask docker\n\n# Verify\ndocker compose version\n</code></pre>"},{"location":"getting-started/prerequisites/#git","title":"Git","text":"<p>Required for the sync bridge (mirroring to GitHub/GitLab).</p> <pre><code>git --version # 2.30+\n</code></pre>"},{"location":"getting-started/prerequisites/#make","title":"Make","text":"<p>Used for running common commands.</p> <pre><code>make --version\n</code></pre>"},{"location":"getting-started/prerequisites/#optional-s3-compatible-storage","title":"Optional: S3-Compatible Storage","text":"<p>For continuous backups via Litestream, you need an S3-compatible bucket:</p> <ul> <li>AWS S3</li> <li>MinIO (self-hosted)</li> <li>Backblaze B2</li> <li>DigitalOcean Spaces</li> </ul> <p>Local development</p> <p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p>"},{"location":"getting-started/prerequisites/#ports","title":"Ports","text":"<p>The following ports are used by the stack:</p> Port Service <code>8000</code> Django (management UI) <code>443</code> Caddy (HTTPS, production) <code>80</code> Caddy (HTTP redirect, production) <code>5432</code> PostgreSQL <code>6379</code> Redis <code>8025</code> Mailpit (dev only)"}]}
--- a/site/search/search_index.json
+++ b/site/search/search_index.json
@@ -0,0 +1 @@
 
--- a/site/search/search_index.json
+++ b/site/search/search_index.json
@@ -0,0 +1 @@
1 {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Fossilrepo","text":"<p>Self-hosted Fossil forge. One command, full-stack code hosting.</p> <p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p> <p>Think GitLab Omnibus, but for Fossil.</p>"},{"location":"#why-fossil","title":"Why Fossil?","text":"<p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p> <ul> <li>Single-file repos -- each <code>.fossil</code> file is the entire project</li> <li>Built-in everything -- issues, wiki, forum, timeline, web UI</li> <li>No API rate limits -- ideal for CI agents and automation</li> <li>Litestream replication -- continuous backup to S3 for free</li> </ul>"},{"location":"#what-you-get","title":"What You Get","text":"Component Role Fossil server Serves all repos from a single process Caddy SSL termination, subdomain-per-repo routing Litestream Continuous SQLite replication to S3/MinIO Django management UI Repository lifecycle, user management, dashboards Sync bridge Mirror Fossil repos to GitHub/GitLab (read-only) Celery workers Background sync, scheduled tasks"},{"location":"#quick-start","title":"Quick Start","text":"<pre><code># Clone the repo\ngit clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n\n# Start the full stack\nmake build\n\n# Seed development data\nmake seed\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre>"},{"location":"#architecture","title":"Architecture","text":"<pre><code>Caddy (SSL termination, routing, subdomain per repo)\n +-- fossil server --repolist /data/repos/\n +-- /data/repos/\n |-- projecta.fossil\n |-- projectb.fossil\n +-- ...\n\nLitestream -&gt; S3/MinIO (continuous replication, point-in-time recovery)\n</code></pre> <p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p>"},{"location":"#license","title":"License","text":"<p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p>"},{"location":"architecture/overview/","title":"Architecture Overview","text":"<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>"},{"location":"architecture/overview/#system-diagram","title":"System Diagram","text":"<pre><code>graph TB\n subgraph Internet\n User[User / Browser]\n end\n\n subgraph Fossilrepo Server\n Caddy[Caddy&lt;br/&gt;SSL + Routing]\n Django[Django&lt;br/&gt;Management UI]\n Fossil[Fossil Server&lt;br/&gt;--repolist]\n Celery[Celery Workers]\n Redis[Redis]\n Postgres[(PostgreSQL)]\n Litestream[Litestream]\n end\n\n subgraph Storage\n Repos[\"/data/repos/&lt;br/&gt;*.fossil files\"]\n S3[(S3 / MinIO)]\n end\n\n subgraph Mirrors\n GitHub[GitHub]\n GitLab[GitLab]\n end\n\n User --&gt; Caddy\n Caddy --&gt;|\"app.domain.com\"| Django\n Caddy --&gt;|\"repo.domain.com\"| Fossil\n Django --&gt; Postgres\n Django --&gt; Redis\n Celery --&gt; Redis\n Celery --&gt;|sync bridge| GitHub\n Celery --&gt;|sync bridge| GitLab\n Fossil --&gt; Repos\n Litestream --&gt; Repos\n Litestream --&gt; S3</code></pre>"},{"location":"architecture/overview/#components","title":"Components","text":""},{"location":"architecture/overview/#fossil-server","title":"Fossil Server","text":"<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> <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>"},{"location":"architecture/overview/#caddy","title":"Caddy","text":"<p>Handles SSL termination and subdomain routing:</p> <ul> <li><code>your-domain.com</code> routes to the Django management UI</li> <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li> </ul> <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>"},{"location":"architecture/overview/#django-management-layer","title":"Django Management Layer","text":"<p>Provides the administrative interface:</p> <ul> <li>Repository lifecycle (create, configure, archive)</li> <li>User and organization management</li> <li>Dashboard and analytics</li> <li>Sync bridge configuration</li> </ul> <p>Django uses HTMX for interactive UI without a JavaScript framework.</p>"},{"location":"architecture/overview/#litestream","title":"Litestream","text":"<p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p> <ul> <li>Continuous backup -- WAL frames replicated in near-real-time</li> <li>Point-in-time recovery -- restore to any moment, not just snapshots</li> <li>Zero-config per repo -- new <code>.fossil</code> files are picked up automatically</li> </ul>"},{"location":"architecture/overview/#celery-workers","title":"Celery Workers","text":"<p>Handle background tasks:</p> <ul> <li>Sync bridge execution (Fossil to Git mirroring)</li> <li>Scheduled sync jobs</li> <li>Upstream pull operations</li> </ul>"},{"location":"architecture/overview/#data-flow","title":"Data Flow","text":"<ol> <li>User pushes to Fossil -- standard <code>fossil push</code> or <code>fossil sync</code></li> <li>Fossil writes to <code>.fossil</code> file -- SQLite transactions</li> <li>Litestream replicates -- WAL frames streamed to S3</li> <li>Sync bridge runs -- Celery task mirrors changes to Git remotes</li> <li>Django reflects state -- reads from Fossil SQLite for dashboards</li> </ol> <p>Fossil is always the source of truth. Everything else is derived.</p>"},{"location":"architecture/sync-bridge/","title":"Sync Bridge","text":"<p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>"},{"location":"architecture/sync-bridge/#how-it-works","title":"How It Works","text":"<pre><code>flowchart LR\n Fossil[\"Fossil Repo&lt;br/&gt;(source of truth)\"] --&gt; Bridge[\"Sync Bridge&lt;br/&gt;(Celery task)\"]\n Bridge --&gt; Git[\"Git Export\"]\n Git --&gt; GitHub[\"GitHub Mirror\"]\n Git --&gt; GitLab[\"GitLab Mirror\"]</code></pre> <p>The bridge:</p> <ol> <li>Exports Fossil commits as Git commits</li> <li>Pushes to configured Git remotes</li> <li>Optionally syncs tickets to GitHub/GitLab Issues</li> <li>Optionally syncs wiki pages to repo docs</li> </ol>"},{"location":"architecture/sync-bridge/#what-gets-synced","title":"What Gets Synced","text":"Fossil Artifact Git Target Configurable Commits Git commits Always Tags Git tags Always Branches Git branches Always Tickets GitHub/GitLab Issues Optional Wiki Repository docs Optional"},{"location":"architecture/sync-bridge/#configuration","title":"Configuration","text":"<p>Set up mirroring through the Django management UI or environment variables:</p> <pre><code># GitHub mirror\nGITHUB_TOKEN=ghp_xxxxxxxxxxxx\n\n# GitLab mirror\nGITLAB_TOKEN=glpat-xxxxxxxxxxxx\n</code></pre> <p>Per-repository mirror configuration is managed in the dashboard under Repository Settings &gt; Sync.</p>"},{"location":"architecture/sync-bridge/#sync-modes","title":"Sync Modes","text":""},{"location":"architecture/sync-bridge/#on-demand","title":"On-Demand","text":"<p>Trigger a sync manually from the dashboard or CLI:</p> <pre><code>docker compose exec django python manage.py fossil_sync my-project\n</code></pre>"},{"location":"architecture/sync-bridge/#scheduled","title":"Scheduled","text":"<p>Configure a Celery Beat schedule to sync at regular intervals:</p> <pre><code># Runs every 15 minutes\nCELERY_BEAT_SCHEDULE = {\n 'sync-all-repos': {\n 'task': 'fossil.tasks.sync_all',\n 'schedule': 900.0,\n },\n}\n</code></pre>"},{"location":"architecture/sync-bridge/#upstream-pull","title":"Upstream Pull","text":"<p>Pull updates from a remote Fossil server into your local instance:</p> <pre><code>docker compose exec django python manage.py fossil_pull my-project\n</code></pre> <p>Direction matters</p> <p>The sync bridge is one-way: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p>"},{"location":"getting-started/configuration/","title":"Configuration","text":""},{"location":"getting-started/configuration/#environment-variables","title":"Environment Variables","text":"<p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p>"},{"location":"getting-started/configuration/#django-settings","title":"Django Settings","text":"Variable Default Description <code>SECRET_KEY</code> -- Django secret key (required) <code>DEBUG</code> <code>False</code> Enable debug mode <code>ALLOWED_HOSTS</code> <code>localhost</code> Comma-separated list of allowed hosts <code>TIME_ZONE</code> <code>UTC</code> Server timezone"},{"location":"getting-started/configuration/#database","title":"Database","text":"Variable Default Description <code>POSTGRES_DB</code> <code>fossilrepo</code> Database name <code>POSTGRES_USER</code> <code>fossilrepo</code> Database user <code>POSTGRES_PASSWORD</code> -- Database password (required) <code>POSTGRES_HOST</code> <code>postgres</code> Database host <code>POSTGRES_PORT</code> <code>5432</code> Database port"},{"location":"getting-started/configuration/#redis-celery","title":"Redis &amp; Celery","text":"Variable Default Description <code>REDIS_URL</code> <code>redis://redis:6379/0</code> Redis connection URL <code>CELERY_BROKER_URL</code> <code>$REDIS_URL</code> Celery broker (defaults to Redis URL)"},{"location":"getting-started/configuration/#fossil","title":"Fossil","text":"Variable Default Description <code>FOSSIL_REPO_DIR</code> <code>/data/repos</code> Directory where <code>.fossil</code> files are stored <code>FOSSIL_BASE_URL</code> -- Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>) <code>FOSSIL_BINARY</code> <code>fossil</code> Path to the Fossil binary"},{"location":"getting-started/configuration/#caddy-production","title":"Caddy (Production)","text":"Variable Default Description <code>CADDY_DOMAIN</code> -- Your domain (e.g., <code>example.com</code>) <code>CADDY_EMAIL</code> -- Email for Let's Encrypt certificates"},{"location":"getting-started/configuration/#litestream-backups","title":"Litestream (Backups)","text":"Variable Default Description <code>LITESTREAM_ACCESS_KEY_ID</code> -- S3 access key <code>LITESTREAM_SECRET_ACCESS_KEY</code> -- S3 secret key <code>LITESTREAM_BUCKET</code> -- S3 bucket name <code>LITESTREAM_ENDPOINT</code> -- S3 endpoint (for MinIO/B2) <code>LITESTREAM_REGION</code> <code>us-east-1</code> S3 region"},{"location":"getting-started/configuration/#sync-bridge","title":"Sync Bridge","text":"Variable Default Description <code>GITHUB_TOKEN</code> -- GitHub personal access token (for mirroring) <code>GITLAB_TOKEN</code> -- GitLab personal access token (for mirroring)"},{"location":"getting-started/configuration/#caddy-configuration","title":"Caddy Configuration","text":"<p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p> <pre><code>{$CADDY_DOMAIN} {\n reverse_proxy django:8000\n}\n\n*.{$CADDY_DOMAIN} {\n reverse_proxy fossil:8080\n}\n</code></pre> <p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p>"},{"location":"getting-started/configuration/#litestream-configuration","title":"Litestream Configuration","text":"<p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p> <pre><code>dbs:\n - path: /data/repos/*.fossil\n replicas:\n - type: s3\n bucket: ${LITESTREAM_BUCKET}\n endpoint: ${LITESTREAM_ENDPOINT}\n region: ${LITESTREAM_REGION}\n</code></pre> <p>Point-in-time recovery</p> <p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p>"},{"location":"getting-started/first-repo/","title":"Creating Your First Repository","text":"<p>Once fossilrepo is running, you can create your first Fossil repository.</p>"},{"location":"getting-started/first-repo/#via-the-dashboard","title":"Via the Dashboard","text":"<ol> <li>Log in at <code>http://localhost:8000</code></li> <li>Navigate to Repositories in the sidebar</li> <li>Click Create Repository</li> <li>Enter a name (e.g., <code>my-project</code>)</li> <li>Click Create</li> </ol> <p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p>"},{"location":"getting-started/first-repo/#via-the-cli","title":"Via the CLI","text":"<pre><code># Inside the fossilrepo container\ndocker compose exec django python manage.py fossil_create my-project\n</code></pre> <p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p>"},{"location":"getting-started/first-repo/#what-happens-under-the-hood","title":"What Happens Under the Hood","text":"<pre><code>sequenceDiagram\n participant User\n participant Django\n participant Fossil\n participant Litestream\n participant S3\n\n User-&gt;&gt;Django: Create repo \"my-project\"\n Django-&gt;&gt;Fossil: fossil init /data/repos/my-project.fossil\n Fossil--&gt;&gt;Django: Repository created\n Django-&gt;&gt;Django: Register in database\n Litestream-&gt;&gt;S3: Begin replicating my-project.fossil\n Django--&gt;&gt;User: Repository ready</code></pre>"},{"location":"getting-started/first-repo/#accessing-your-repository","title":"Accessing Your Repository","text":""},{"location":"getting-started/first-repo/#web-ui","title":"Web UI","text":"<p>Fossil includes a built-in web interface with:</p> <ul> <li>Timeline -- commit history with diffs</li> <li>Tickets -- issue tracker</li> <li>Wiki -- project documentation</li> <li>Forum -- discussions</li> </ul>"},{"location":"getting-started/first-repo/#clone-via-fossil","title":"Clone via Fossil","text":"<pre><code>fossil clone https://my-project.your-domain.com my-project.fossil\nfossil open my-project.fossil\n</code></pre>"},{"location":"getting-started/first-repo/#clone-via-git-mirror","title":"Clone via Git (Mirror)","text":"<p>If you've configured the sync bridge:</p> <pre><code>git clone https://github.com/your-org/my-project.git\n</code></pre> <p>Read-only mirror</p> <p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p>"},{"location":"getting-started/first-repo/#next-steps","title":"Next Steps","text":"<ul> <li>Configure the sync bridge to mirror to GitHub/GitLab</li> <li>Set up backups with Litestream</li> <li>Explore the architecture overview</li> </ul>"},{"location":"getting-started/installation/","title":"Installation","text":""},{"location":"getting-started/installation/#clone-the-repository","title":"Clone the Repository","text":"<pre><code>git clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n</code></pre>"},{"location":"getting-started/installation/#environment-configuration","title":"Environment Configuration","text":"<p>Copy the example environment file and configure it:</p> <pre><code>cp .env.example .env\n</code></pre> <p>Edit <code>.env</code> with your settings:</p> <pre><code># Django\nSECRET_KEY=your-secret-key-here\nDEBUG=True\nALLOWED_HOSTS=localhost,127.0.0.1\n\n# Database\nPOSTGRES_DB=fossilrepo\nPOSTGRES_USER=fossilrepo\nPOSTGRES_PASSWORD=your-db-password\n\n# Redis\nREDIS_URL=redis://redis:6379/0\n\n# Fossil\nFOSSIL_REPO_DIR=/data/repos\nFOSSIL_BASE_URL=https://your-domain.com\n</code></pre>"},{"location":"getting-started/installation/#start-the-stack","title":"Start the Stack","text":""},{"location":"getting-started/installation/#development","title":"Development","text":"<pre><code># Build and start all services\nmake build\n\n# Run database migrations\nmake migrate\n\n# Create an admin user\nmake superuser\n\n# Load sample data (optional)\nmake seed\n</code></pre> <p>The development stack includes:</p> <ul> <li>Django dev server on <code>http://localhost:8000</code></li> <li>PostgreSQL 16</li> <li>Redis</li> <li>Celery worker + beat</li> <li>Mailpit on <code>http://localhost:8025</code></li> </ul>"},{"location":"getting-started/installation/#production","title":"Production","text":"<p>For production, you'll also configure Caddy and Litestream:</p> <pre><code># Copy production configs\ncp docker/Caddyfile.example docker/Caddyfile\ncp docker/litestream.yml.example docker/litestream.yml\n\n# Edit with your domain and S3 credentials\n# Then start with the production compose file\ndocker compose -f docker-compose.yml -f docker-compose.prod.yml up -d\n</code></pre>"},{"location":"getting-started/installation/#verify-installation","title":"Verify Installation","text":"<pre><code># Check all services are running\ndocker compose ps\n\n# Hit the health endpoint\ncurl http://localhost:8000/health/\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre> <p>You should see</p> <p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p>"},{"location":"getting-started/installation/#common-issues","title":"Common Issues","text":"Port 8000 already in use <p>Change the Django port mapping in <code>docker-compose.yml</code>: <pre><code>ports:\n - \"8001:8000\"\n</code></pre></p> Database connection refused <p>Ensure PostgreSQL has started before Django: <pre><code>docker compose logs postgres\n</code></pre> The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down &amp;&amp; make up</code>.</p> Permission denied on /data/repos <p>The Fossil repo directory needs to be writable by the container user: <pre><code>sudo chown -R 1000:1000 /data/repos\n</code></pre></p>"},{"location":"getting-started/prerequisites/","title":"Prerequisites","text":"<p>Before installing fossilrepo, ensure your server meets these requirements.</p>"},{"location":"getting-started/prerequisites/#system-requirements","title":"System Requirements","text":"Requirement Minimum OS Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+ CPU 1 vCPU RAM 1 GB Disk 10 GB (scales with repo count) Python 3.12+"},{"location":"getting-started/prerequisites/#required-software","title":"Required Software","text":""},{"location":"getting-started/prerequisites/#docker-docker-compose","title":"Docker &amp; Docker Compose","text":"<p>Fossilrepo runs its infrastructure stack via Docker Compose.</p> Ubuntu/DebianmacOS <pre><code># Install Docker\ncurl -fsSL https://get.docker.com | sh\nsudo usermod -aG docker $USER\n\n# Verify\ndocker compose version\n</code></pre> <pre><code># Install Docker Desktop\nbrew install --cask docker\n\n# Verify\ndocker compose version\n</code></pre>"},{"location":"getting-started/prerequisites/#git","title":"Git","text":"<p>Required for the sync bridge (mirroring to GitHub/GitLab).</p> <pre><code>git --version # 2.30+\n</code></pre>"},{"location":"getting-started/prerequisites/#make","title":"Make","text":"<p>Used for running common commands.</p> <pre><code>make --version\n</code></pre>"},{"location":"getting-started/prerequisites/#optional-s3-compatible-storage","title":"Optional: S3-Compatible Storage","text":"<p>For continuous backups via Litestream, you need an S3-compatible bucket:</p> <ul> <li>AWS S3</li> <li>MinIO (self-hosted)</li> <li>Backblaze B2</li> <li>DigitalOcean Spaces</li> </ul> <p>Local development</p> <p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p>"},{"location":"getting-started/prerequisites/#ports","title":"Ports","text":"<p>The following ports are used by the stack:</p> Port Service <code>8000</code> Django (management UI) <code>443</code> Caddy (HTTPS, production) <code>80</code> Caddy (HTTP redirect, production) <code>5432</code> PostgreSQL <code>6379</code> Redis <code>8025</code> Mailpit (dev only)"}]}
--- a/site/sitemap.xml
+++ b/site/sitemap.xml
@@ -0,0 +1,31 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://fossilrepo.dev/</loc>
5
+ <lastmod>2026-04-07</lastmod>
6
+ </url>
7
+ <url>
8
+ <loc>https://fossilrepo.dev/architecture/overview/</loc>
9
+ <lastmod>2026-04-07</lastmod>
10
+ </url>
11
+ <url>
12
+ <loc>https://fossilrepo.dev/architecture/sync-bridge/</loc>
13
+ <lastmod>2026-04-07</lastmod>
14
+ </url>
15
+ <url>
16
+ <loc>https://fossilrepo.dev/getting-started/configuration/</loc>
17
+ <lastmod>2026-04-07</lastmod>
18
+ </url>
19
+ <url>
20
+ <loc>https://fossilrepo.dev/getting-started/first-repo/</loc>
21
+ <lastmod>2026-04-07</lastmod>
22
+ </url>
23
+ <url>
24
+ <loc>https://fossilrepo.dev/getting-started/installation/</loc>
25
+ <lastmod>2026-04-07</lastmod>
26
+ </url>
27
+ <url>
28
+ <loc>https://fossilrepo.dev/getting-started/prerequisites/</loc>
29
+ <lastmod>2026-04-07</lastmod>
30
+ </url>
31
+</urlset>
--- a/site/sitemap.xml
+++ b/site/sitemap.xml
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/site/sitemap.xml
+++ b/site/sitemap.xml
@@ -0,0 +1,31 @@
1 <?xml version="1.0" encoding="UTF-8"?>
2 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3 <url>
4 <loc>https://fossilrepo.dev/</loc>
5 <lastmod>2026-04-07</lastmod>
6 </url>
7 <url>
8 <loc>https://fossilrepo.dev/architecture/overview/</loc>
9 <lastmod>2026-04-07</lastmod>
10 </url>
11 <url>
12 <loc>https://fossilrepo.dev/architecture/sync-bridge/</loc>
13 <lastmod>2026-04-07</lastmod>
14 </url>
15 <url>
16 <loc>https://fossilrepo.dev/getting-started/configuration/</loc>
17 <lastmod>2026-04-07</lastmod>
18 </url>
19 <url>
20 <loc>https://fossilrepo.dev/getting-started/first-repo/</loc>
21 <lastmod>2026-04-07</lastmod>
22 </url>
23 <url>
24 <loc>https://fossilrepo.dev/getting-started/installation/</loc>
25 <lastmod>2026-04-07</lastmod>
26 </url>
27 <url>
28 <loc>https://fossilrepo.dev/getting-started/prerequisites/</loc>
29 <lastmod>2026-04-07</lastmod>
30 </url>
31 </urlset>

Binary file

Keyboard Shortcuts

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