# Changelog

# Changelog

All notable changes to Geoffrey are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

`### Site impact` says what an existing `goff` install or `geoffrey-server` deployment must change. When nothing must change, the subsection says so.

When you cut a release, rename `[Unreleased]` to `[X.Y.Z] - YYYY-MM-DD` and add a new `[Unreleased]` section. Every section needs `### Site impact`. Do not keep a second copy of this file under `site/`. `scripts/render-docs-changelog.sh` writes the changelog page.

Versions through 0.12.0 were written from the release commits when this file was added.

## [Unreleased]

### Site impact

Nothing for an existing `goff` install or `geoffrey-server` deployment.

## [0.13.1] - 2026-11-04

### Fixed

- The documentation image is built from `benson:v0.16.1`. The registry tag is the git tag, so `benson:0.16.1` is not an image.

### Site impact

Nothing for an existing `goff` install or `geoffrey-server` deployment. The documentation site starts serving when this release is tagged.

## [0.13.0] - 2026-11-04

### Added

- Documentation site in `site/`, built with Benson and published as `gitea.galiath.net/greg-hewett/geoffrey-docs`. The public host is https://geoffrey.strand3.com.
- This changelog. The site renders it. Each version has a `### Site impact` subsection.

### Site impact

Nothing for an existing `goff` install or `geoffrey-server` deployment. The documentation site is a separate image. It starts serving when this release is tagged.

## [0.12.0] - 2026-10-22

### Added

- OpenAPI 3.1 document committed as `openapi.json`, served at `GET /openapi.json`, and rendered at `GET /docs` on the server.

### Fixed

- Integration tests wait longer for the server to become healthy, and the wait is configurable with `GEOFFREY_TEST_HEALTH_TIMEOUT_SECS`.

### Site impact

Nothing for a deployment that mounts its own `/etc/geoffrey.toml`. Existing clients keep using the same routes. `GET /openapi.json` and `GET /docs` are new and unauthenticated. The file baked into the image is the local example (`replace-me`, 100 MiB, one hour). Do not expose that image without replacing the key.

## [0.11.0] - 2026-10-07

### Added

- `goff watch` publishes each new macOS screenshot as its own unlocked rental.

### Changed

- The client packaged in the image at this tag allows 5 GiB and 31 days.

### Site impact

`goff watch` is optional. A deployment that mounts its own `/etc/geoffrey.toml` and sets `GEOFFREY_MAX_DISK_BYTES` keeps those values. A deployment that uses the image's packaged client list picks up the 5 GiB allowance and 31-day maximum duration.

## [0.10.0] - 2026-10-03

### Added

- `goff list` shows stored bytes for each rental.

### Fixed

- Public file URLs percent-encode each path segment, so names that contain a space or U+202F download.
- An upload streams to a temp file outside the rental and replaces the destination only after the body is accepted.

### Site impact

Use the `file_url` the server returns. A link built with a raw space, or with an ASCII space in place of U+202F, does not match the stored name.

## [0.9.0] - 2026-09-27

### Added

- `goff` uploads a directory as the files inside it.
- Storage is the sum of uploaded bytes for the client key and for the host.

### Site impact

Nothing is required to keep uploading single files. A directory argument now stores the files inside it, not the directory as one object.

## [0.8.1] - 2026-09-24

### Fixed

- Republish so `cargo install geoffrey --registry gitea` can resolve 0.8.0's contents. The 0.8.0 registry publish failed.

### Site impact

Nothing if `goff` 0.8.0 is already installed. Otherwise install 0.8.1.

## [0.8.0] - 2026-09-24

### Changed

- The client command and binary are `goff`. The package name stays `geoffrey`.
- Owner lifecycle commands cover enable, disable, revive, lock, unlock, get, and purge.
- `_layout.html` accepts `{{created_at}}`, `{{expires_at}}`, `{{age}}`, and `{{root_link}}` in addition to `{{content}}`.

### Site impact

Call `goff` instead of `geoffrey`. A layout that only uses `{{content}}` keeps working.

## [0.7.0] - 2026-09-08

### Changed

- A rental is `inactive`, `active`, or `expired`. The lease starts at enable. There is no background sweeper. Purge is explicit.

### Site impact

Expired rentals stay on disk until purge. Public downloads stop when an unlocked lease ends. Enable is what starts the clock.

## [0.6.0] - 2026-09-08

### Added

- `GEOFFREY_HOST`, `GEOFFREY_API_KEY`, and a `.env` file supply `--host` and `--api-key`.
- Public directory listings and root Markdown rendering.
- `goff list` for the calling API key.
- Lock and unlock. A locked rental does not expire and cannot be purged.

### Site impact

Nothing is required. Flags still override the environment. Public files are served only after enable.

## [0.5.0] - 2026-08-25

### Removed

- The local Caddy compose stack and the leftover repo artifacts that went with it.

### Site impact

Nothing for a deployment that already terminates TLS in front of `geoffrey-server`. This repository no longer publishes a Caddy proxy.

## [0.4.0] - 2026-08-25

### Changed

- API keys and per-key caps come from `[[clients]]` in config. The image carries `/etc/geoffrey.toml`.

### Site impact

A key created in the database no longer authenticates. Add a `[[clients]]` entry with `id`, `key`, `max_disk_bytes`, and `max_duration_seconds`, and restart the server.

## [0.3.0] - 2026-08-20

### Changed

- The published CLI package and binary are `geoffrey`. `cargo install geoffrey --registry gitea` replaces `geoffrey-cli`.

### Site impact

Install `geoffrey` instead of `geoffrey-cli`. The binary name in this release is `geoffrey`. Version 0.8.0 renames that binary to `goff`.

## [0.2.0] - 2026-08-20

### Added

- `geoffrey-server` is its own crate. `geoffrey-api` is the shared library. A version tag publishes `geoffrey-api`, then the CLI, to the Gitea cargo registry.

### Site impact

First published split of the server and the CLI. Nothing to upgrade.

