# Forge

Forge is a small self-hosted Git forge built with ASP.NET Core, Blazor, SQLite, and Git Smart HTTP.

## Features

- Browse repositories, trees, blobs, commits, and branches
- Create repositories from the web UI
- Push over HTTP to auto-create a missing repository on first push
- Cookie-based web login with Basic auth support for Git operations
- Repository visibility controls with private/public settings
- README rendering on the repository page
- Syntax highlighting for source files and fenced code blocks

## Running Locally

```bash
nix run .#run-forge
```

Open `http://localhost:5128`.

The bootstrap admin username is `admin`.

For local runtime, the app now expects a decrypted password file path, which matches the Home Manager agenix pattern. By default the flake looks for:

`$XDG_RUNTIME_DIR/agenix/forge-admin-password`

Override it with:

```bash
export FORGE_ADMIN_PASSWORD_FILE=/path/to/decrypted/password-file
```

After signing in as the bootstrap admin, open `Settings` to add additional Forge users. Those users can log in to the web UI and use Git HTTP with their own credentials.

## Fly.io Deployment

This repo includes:

- [Dockerfile](/home/nandi/code/forge/Dockerfile) for Fly builds
- [fly.toml](/home/nandi/code/forge/fly.toml) app and volume mount config
- [flake.nix](/home/nandi/code/forge/flake.nix) apps `run-forge` and `deploy-fly`
- [justfile](/home/nandi/code/forge/justfile) helpers for deploy, secrets, and volume setup

Recommended setup:

```bash
cp .env.example .env
# edit .env and set FLY_APP / FLY_REGION
fly apps create "$FLY_APP"
just fly-volume
just fly-secrets
just deploy
```

What each step does:

- `just fly-volume` creates the `forge_data` volume mounted at `/data`
- `just fly-secrets` reads the admin password from `FORGE_ADMIN_PASSWORD_FILE` and sets:
  `Auth__Username`, `Auth__Password`, `Database__Path`, `Repositories__Root`, and `ASPNETCORE_ENVIRONMENT`
- `just deploy` runs `nix run .#deploy-fly`, which calls `fly deploy -a "$FLY_APP"`

Fly volume note:

- The app expects persistent storage at `/data`
- `forge.db` is stored at `/data/forge.db`
- bare Git repositories are stored under `/data/repositories`

## Push This Repo To Forge

```bash
git remote add forge "http://admin:$(cat ${FORGE_ADMIN_PASSWORD_FILE:-${XDG_RUNTIME_DIR}/agenix/forge-admin-password})@localhost:5128/admin/forge.git"
git push -u forge main
```
An unhandled error has occurred. Reload 🗙