1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Claude -- fossilrepo
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Primary conventions doc: [`bootstrap.md`](bootstrap.md)
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Read it before writing any code.
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Project Overview
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
fossilrepo is an omnibus-style installer for a self-hosted Fossil forge. Django+HTMX management layer wrapping Fossil SCM server infrastructure with Caddy (SSL/routing), Litestream (S3 backups), and a sync bridge to GitHub/GitLab. Open source (MIT).
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Stack
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Backend**: Django 5 (Python 3.12+)
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Frontend**: HTMX 2.0 + Alpine.js 3 + Tailwind CSS (CDN)
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **API**: Django views returning HTML (full pages + HTMX partials)
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **ORM**: Django ORM with `Tracking` and `BaseCoreModel` base classes
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Auth**: Session-based (Django native, httpOnly cookies)
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Permissions**: Group-based via `P` enum (`core/permissions.py`)
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Jobs**: Celery + Redis
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Database**: PostgreSQL 16
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Linter**: Ruff (check + format), max line length 140
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Fossil SCM**: C binary, serves repos (each repo is a single .fossil SQLite file)
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Caddy**: SSL termination + subdomain routing to Fossil instances
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Litestream**: Continuous SQLite-to-S3 replication for backups
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Repository Structure
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
fossilrepo/
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── core/ # Base models, permissions, shared utilities
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── accounts/ # Authentication
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── organization/ # Org/team management
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── config/ # Django settings
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── templates/ # Django + HTMX templates
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── static/ # Static assets
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── docker/ # Caddy, Litestream container configs
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── fossil-platform/ # Old exploration (Flask + React), kept for reference
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── tests/ # pytest
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── docs/ # Architecture, guides
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└── bootstrap.md # Project bootstrap doc -- read first
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Claude-specific notes
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Prefer `Edit` over rewriting whole files.
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Run `ruff check .` and `ruff format --check .` before committing.
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Never expose integer PKs in URLs or templates -- use `slug` or `guid`.
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Auth check at the top of every view -- use `@login_required` + `P.PERMISSION.check(request.user)`.
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Soft-delete only: call `obj.soft_delete(user=request.user)`, never `.delete()`.
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- HTMX partials: check `request.headers.get("HX-Request")` to return partial vs full page.
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- CSRF: HTMX requests include CSRF token via `htmx:configRequest` event in `base.html`.
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Tests: pytest + real Postgres, assert against DB state. Both allowed and denied permission cases.
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Fossil is the source of truth; Git remotes are downstream mirrors.
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!