Commit log

ee1a53f chore: fix deps, fmt, lint, etc.

Amolith created

3033a28 fix(webui): move script to file because csp

Amolith created

c304fdd feat(webui): allow data URIs in img-src CSP

Click to expand commit body
Assisted-by: Claude Sonnet 4.5 via Crush

Amolith created

ad140da feat(webui): allow details and summary tags

Click to expand commit body
The Markdown sanitizer now preserves <details> and <summary> tags,
enabling collapsible sections in README files and blob views.

Added test coverage to verify these tags are properly preserved through
the sanitization process.

Closes: bug-f881844
Assisted-by: Claude Sonnet 4.5 via Crush

Amolith created

aa1049e feat(webui): rewrite README links without proxy

Click to expand commit body
Implement rendering of images and links in README files without
requiring an image proxy. Relative URLs are rewritten to point to
repository files pinned to specific commits.

Relative images and files are served through the blob endpoint with
?raw=1 query parameter. Links to markdown files render the formatted
view, while other files download raw. Directory links go to tree view.

Assisted-by: Claude Sonnet 4.5 via Crush

Amolith created

5b2c6f9 feat(webui): add individual tag detail pages

Click to expand commit body
Implement /{repo}/tag/{tag} route displaying tag metadata including
name, authorship, creation date, optional annotation message, and links
to file tree and commit.

Tag dates use tagger date for annotated tags, falling back to commit
author date for lightweight tags, matching the tags list behavior for
consistency.

Implements: a0daef3
Assisted-by: Claude Sonnet 4.5 via Crush

Amolith created

b764757 feat(webui): add patch/diff links on commit page

Click to expand commit body
Implements: bug-05a795c
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

433dcd1 chore(crush): yeet mcp

Amolith created

3cc6544 feat(webui): preload css, syntax is only for blobs

Click to expand commit body
Implements: bug-0fb4c59
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

07b2ccf feat(webui): render co-authors on branches/tags

Click to expand commit body
Branches and tags pages now extract and display co-authors
from commit message trailers using the attributionNames
template function. This replicates the existing commits page
behavior, showing &#34;Author, Co1, and Co2 created time&#34; format.

Implements: bug-f5cf6b5
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

357b90f feat(webui): add og tags

Amolith created

3f83739 feat(web): add meta descriptions to pages

Click to expand commit body
Adds Description field to BaseData and populates it across
all web UI pages (home, about, blob, tree, branches, commits,
tags). Descriptions are derived from:
- Repository descriptions (truncated to 200 chars)
- Server README content (converted to plain text)
- Context-appropriate fallbacks

New helper functions in webui_helpers.go:
- extractPlainTextFromMarkdown: strips markdown formatting
- truncateText: truncates text at word boundaries
- getRepoDescriptionOrFallback: repo desc or fallback

Implements: bug-7b97785
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

9aab64b fix(web): add Repo field to AboutData struct

Click to expand commit body
The base.html template checks for .Repo to conditionally render
repository navigation. AboutData was missing this field, causing
template execution to fail with "can't evaluate field Repo".

Adding the nil Repo field allows the {{if .Repo}} check to work
correctly, skipping repository navigation on the about page.

Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

ab601bd feat(web): display co-authors in commit views

Click to expand commit body
Parse Co-authored-by trailers from commit messages and display
all contributors with proper grammar in commit and commits
pages. Authorship now reads "Author and Co-author" for one
co-author or "Author, Co1, Co2, and Co3" for multiple.

Implements: bug-7e8823e
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

a4f4cd6 feat(web/commit): use name@hash format in title

Click to expand commit body
Change commit page title from 'subject | Commit hash | name'
to 'subject | name@hash' for consistency with git conventions.

Implements: bug-4758ff9
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

7a7f489 feat(web/tree): show path and ref in page title

Click to expand commit body
Display 'repo-name/path at ref | Project name' format in tree
view titles for better browser tab/history identification.
Shows shortened commit hash when viewing specific commits.

Implements: bug-45e898a
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

0f10420 feat: use consistent tooltip pattern for time

Click to expand commit body
Modify the author/time info on the home page to follow the same
tooltip pattern as the commits page, displaying "Updated {time}".

- Change HomeRepository.UpdatedAt from string to time.Time
- Convert timestamps to UTC for consistency
- Clean up tooltip format to show timezone only once
- Remove unused humanize import

Implements: bug-af63a29
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

977d679 feat: add page titles and meta descriptions

Click to expand commit body
Add Title and Description fields to BaseData for proper
HTML title and meta description support. Update base.html
template to use these fields instead of deriving them from
Repo and ServerName.

Implement page-specific titles:
- About: "About | {server name}"
- Home: "{server name}"
- Overview: "{project name or repo}" with description
- Commits: "Commits in {ref} | {project or repo}"
- Commit: "{subject} | Commit {hash} | {project or repo}"
- Tags: "Tags | {project or repo}"
- Branches: "Branches | {project or repo}"
- Files: "Files | {project or repo}"
- Blob: "{filename} | {project or repo}"

Fix shortHash template function to use 7 characters
instead of 8 for consistency with git standards.

Implements: bug-972b30b
Implements: bug-7778d23
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

2548902 chore: web UI polish

Click to expand commit body
Fixes: bug-45aeed6
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

8c9797c chore: improve web UI styling

Amolith created

94fcf3c feat: implement CSS cache-busting for web assets

Click to expand commit body
Add version query parameters to CSS URLs to force browsers to fetch
newer versions after edits. This ensures users see updated styles
without manually clearing browser cache.

Changes:
- Add ?v=1 to overrides.css and syntax.css URLs
- Document version increment process in AGENTS.md

Implements: bug-9b0a200
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

4e4c348 feat(blob): better content-type detection

Click to expand commit body
Improve file content detection and syntax highlighting in the web UI:
- Better MIME type detection for files without extensions
- Content-based markdown detection for extensionless files
- Enhanced lexer selection prioritizing content analysis
- Added Chroma import for improved language detection

Implements: bug-147d490
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

bae1621 feat(web): add .patch and .diff for commit URLs

Click to expand commit body
Add route handlers to serve raw git patches and diffs when accessing
commit URLs with .patch or .diff extensions. This allows users to
download patches directly using curl and pipe them to git apply.

Implements: bug-d552262
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

d41a3b6 refactor(web): extract shared fields from structs

Click to expand commit body
Consolidates common data fields across web UI pages into reusable
BaseData, RepoBaseData, and PaginationData structs to reduce code
duplication and improve maintainability.

Implements: bug-7dfe278
Co-authored-by: Crush <crush@charm.land>

Amolith and Crush created

8624ca2 fix: display full branch names in breadcrumbs

Click to expand commit body
Previously, the breadcrumb navigation would truncate all refs using
shortHash, causing branch names like "generate-promo-codes" to display
as just "generate".

This change adds an IsCommitHash field to template data structures and
updates the templates to conditionally apply shortHash only for actual
commit hashes while showing full names for branches and tags.

Implements: bug-bf0175a
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

5acf52c fix: detect MIME type for raw blob responses

Click to expand commit body
Replace hardcoded text/plain content-type with proper MIME type
detection using mime.TypeByExtension and http.DetectContentType
as fallback. Ensures binary files are served with correct types
while maintaining UTF-8 charset for text files.

Fixes: bug-74a99e4

Amolith created

98239dd feat: add anchor links to file headings

Click to expand commit body
Fixes: bug-dddb40e
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

c1f46b3 fix(tree): don't link current item in breadcrumb navigation

Click to expand commit body
Prevent the last breadcrumb item from being linked when viewing
a directory or file in the tree view. Follows the same pattern
already used in blob.html.

Fixes: bug-d8ce4b4

Amolith created

bef4c71 feat: link to my fork REMOVE ME BEFORE PR

Amolith created

708054f feat: prefer custom fonts

Click to expand commit body
- Use Atkinson Hyperlegible as sans
- Use 0xProto first, JetBrains Mono second as mono
- Preserve existing Pico CSS fallbacks

Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

b2f3659 feat: introduce Pico ✨

Amolith created

68c2383 feat: introduce web UI

Click to expand commit body
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

eb9ccfe chore: ignore built binary

Amolith created

a966ccc docs: add AGENTS.md

Click to expand commit body
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

64249d3 chore: add justfile

Amolith created

063b4bf feat: add crush config

Click to expand commit body
Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

86d4c48 feat: prioritize latest commit time for repo UpdatedAt

Click to expand commit body
Change the order of operations in UpdatedAt() to first try getting
the timestamp from the latest commit before falling back to the
last-modified file. This ensures more accurate update timestamps.

Co-Authored-By: Crush <crush@charm.land>

Amolith and Crush created

8539f9a fix: authentication bypass

Ayman Bagabas created

91e4b2b chore(deps): bump the all group with 4 updates (#776)

Click to expand commit body
Bumps the all group with 4 updates: [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma), [github.com/charmbracelet/x/ansi](https://github.com/charmbracelet/x), [golang.org/x/crypto](https://github.com/golang/crypto) and [modernc.org/sqlite](https://gitlab.com/cznic/sqlite).


Updates `github.com/alecthomas/chroma/v2` from 2.22.0 to 2.23.0
- [Release notes](https://github.com/alecthomas/chroma/releases)
- [Commits](https://github.com/alecthomas/chroma/compare/v2.22.0...v2.23.0)

Updates `github.com/charmbracelet/x/ansi` from 0.11.3 to 0.11.4
- [Commits](https://github.com/charmbracelet/x/compare/ansi/v0.11.3...ansi/v0.11.4)

Updates `golang.org/x/crypto` from 0.46.0 to 0.47.0
- [Commits](https://github.com/golang/crypto/compare/v0.46.0...v0.47.0)

Updates `modernc.org/sqlite` from 1.43.0 to 1.44.2
- [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.43.0...v1.44.2)

---
updated-dependencies:
- dependency-name: github.com/alecthomas/chroma/v2
  dependency-version: 2.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: github.com/charmbracelet/x/ansi
  dependency-version: 0.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: all
- dependency-name: golang.org/x/crypto
  dependency-version: 0.47.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: modernc.org/sqlite
  dependency-version: 1.44.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

dependabot[bot] and dependabot[bot] created

2368256 chore(deps): bump the all group with 3 updates (#775)

Click to expand commit body
Bumps the all group with 3 updates: [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma), [github.com/spf13/cobra](https://github.com/spf13/cobra) and [modernc.org/sqlite](https://gitlab.com/cznic/sqlite).


Updates `github.com/alecthomas/chroma/v2` from 2.21.1 to 2.22.0
- [Release notes](https://github.com/alecthomas/chroma/releases)
- [Commits](https://github.com/alecthomas/chroma/compare/v2.21.1...v2.22.0)

Updates `github.com/spf13/cobra` from 1.10.1 to 1.10.2
- [Release notes](https://github.com/spf13/cobra/releases)
- [Commits](https://github.com/spf13/cobra/compare/v1.10.1...v1.10.2)

Updates `modernc.org/sqlite` from 1.42.2 to 1.43.0
- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.42.2...v1.43.0)

---
updated-dependencies:
- dependency-name: github.com/alecthomas/chroma/v2
  dependency-version: 2.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: github.com/spf13/cobra
  dependency-version: 1.10.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: all
- dependency-name: modernc.org/sqlite
  dependency-version: 1.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

dependabot[bot] and dependabot[bot] created

28c4854 feat: add support for certificate reloading upon SIGHUP (#710)

Click to expand commit body
* feat: add support for certificate reloading upon SIGHUP

* fix: support certificate reloading for unix and add test

* fix(cmd): move cert reloader logic to the serve package

---------

Co-authored-by: Ayman Bagabas <ayman.bagabas@gmail.com>

Harsh Mantri and Ayman Bagabas created

0758e66 chore(ci): update linting workflow

Ayman Bagabas created

1249f9b chore(lint): remove unused nolint directive

Ayman Bagabas created

2d0e48f chore(lint): fix lint issues

Ayman Bagabas created

0f573f4 chore: update golangci-lint config

Ayman Bagabas created

000ab51 Merge commit from fork

Click to expand commit body
* fix: require admin privileges for force delete of LFS locks

Move user context retrieval before the force flag check to ensure
proper authorization. Force deletions now require admin privileges,
preventing non-admin users from deleting locks owned by others.

Fixes GHSA-6jm8-x3g6-r33j (CVE-2026-22253)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: improve comment clarity for force delete path

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

Tomer Fichman and Claude Opus 4.5 created

62e2d5c fix(ssh): ui: respect anon-access setting for the ui

Click to expand commit body
Fixes: https://github.com/charmbracelet/soft-serve/issues/759

Ayman Bagabas created

ba7d415 ci: sync golangci-lint config (#767)

Click to expand commit body
Co-authored-by: aymanbagabas <3187948+aymanbagabas@users.noreply.github.com>

github-actions[bot] and aymanbagabas created

c8779b1 chore(deps): bump the all group across 1 directory with 9 updates (#772)

Click to expand commit body
Bumps the all group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) | `2.20.0` | `2.21.1` |
| [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) | `5.16.2` | `5.16.4` |
| [github.com/google/go-querystring](https://github.com/google/go-querystring) | `1.1.0` | `1.2.0` |
| [github.com/muesli/mango-cobra](https://github.com/muesli/mango-cobra) | `1.2.0` | `1.3.0` |
| [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) | `1.23.0` | `1.23.2` |
| [golang.org/x/crypto](https://github.com/golang/crypto) | `0.45.0` | `0.46.0` |
| [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | `1.38.2` | `1.42.2` |



Updates `github.com/alecthomas/chroma/v2` from 2.20.0 to 2.21.1
- [Release notes](https://github.com/alecthomas/chroma/releases)
- [Commits](https://github.com/alecthomas/chroma/compare/v2.20.0...v2.21.1)

Updates `github.com/go-git/go-git/v5` from 5.16.2 to 5.16.4
- [Release notes](https://github.com/go-git/go-git/releases)
- [Commits](https://github.com/go-git/go-git/compare/v5.16.2...v5.16.4)

Updates `github.com/google/go-querystring` from 1.1.0 to 1.2.0
- [Release notes](https://github.com/google/go-querystring/releases)
- [Commits](https://github.com/google/go-querystring/compare/v1.1.0...v1.2.0)

Updates `github.com/muesli/mango-cobra` from 1.2.0 to 1.3.0
- [Release notes](https://github.com/muesli/mango-cobra/releases)
- [Commits](https://github.com/muesli/mango-cobra/compare/v1.2.0...v1.3.0)

Updates `github.com/prometheus/client_golang` from 1.23.0 to 1.23.2
- [Release notes](https://github.com/prometheus/client_golang/releases)
- [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/client_golang/compare/v1.23.0...v1.23.2)

Updates `github.com/spf13/cobra` from 1.9.1 to 1.10.1
- [Release notes](https://github.com/spf13/cobra/releases)
- [Commits](https://github.com/spf13/cobra/compare/v1.9.1...v1.10.1)

Updates `golang.org/x/crypto` from 0.45.0 to 0.46.0
- [Commits](https://github.com/golang/crypto/compare/v0.45.0...v0.46.0)

Updates `golang.org/x/sync` from 0.18.0 to 0.19.0
- [Commits](https://github.com/golang/sync/compare/v0.18.0...v0.19.0)

Updates `modernc.org/sqlite` from 1.38.2 to 1.42.2
- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.38.2...v1.42.2)

---
updated-dependencies:
- dependency-name: github.com/alecthomas/chroma/v2
  dependency-version: 2.21.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: github.com/go-git/go-git/v5
  dependency-version: 5.16.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: all
- dependency-name: github.com/google/go-querystring
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: github.com/muesli/mango-cobra
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: github.com/prometheus/client_golang
  dependency-version: 1.23.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: all
- dependency-name: github.com/spf13/cobra
  dependency-version: 1.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: golang.org/x/crypto
  dependency-version: 0.46.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: golang.org/x/sync
  dependency-version: 0.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
- dependency-name: modernc.org/sqlite
  dependency-version: 1.42.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: all
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

dependabot[bot] and dependabot[bot] created

2447a96 fix(tests): ignore stderr output in SSRF webhook test

Ayman Bagabas created