a7f2fbecf512743f4eac6dffc4ddfab05cbc5079

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

chore: bump dependencies and use charm.land modules

Diff

This diff is truncated to protect this page.

   1diff --git a/cmd/soft/browse/browse.go b/cmd/soft/browse/browse.go
   2index ecb3d5302d44aebee5147d5540477bd79d4ba6c6..799907b026585b3efce26a1a4ec23a3ba20f392c 100644
   3--- a/cmd/soft/browse/browse.go
   4+++ b/cmd/soft/browse/browse.go
   5@@ -5,9 +5,9 @@ import (
   6 	"path/filepath"
   7 	"time"
   8 
   9-	"github.com/charmbracelet/bubbles/v2/key"
  10-	tea "github.com/charmbracelet/bubbletea/v2"
  11-	"github.com/charmbracelet/lipgloss/v2"
  12+	"charm.land/bubbles/v2/key"
  13+	tea "charm.land/bubbletea/v2"
  14+	"charm.land/lipgloss/v2"
  15 	"github.com/charmbracelet/soft-serve/git"
  16 	"github.com/charmbracelet/soft-serve/pkg/proto"
  17 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
  18@@ -58,10 +58,7 @@ var Command = &cobra.Command{
  19 		}
  20 
  21 		m.footer = footer.New(c, m)
  22-		p := tea.NewProgram(m,
  23-			tea.WithAltScreen(),
  24-			tea.WithMouseCellMotion(),
  25-		)
  26+		p := tea.NewProgram(m)
  27 
  28 		_, err = p.Run()
  29 		return err
  30@@ -202,7 +199,11 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  31 }
  32 
  33 // View implements tea.Model.
  34-func (m *model) View() string {
  35+func (m *model) View() tea.View {
  36+	var v tea.View
  37+	v.AltScreen = true
  38+	v.MouseMode = tea.MouseModeCellMotion
  39+
  40 	style := m.common.Styles.App
  41 	wm, hm := style.GetHorizontalFrameSize(), style.GetVerticalFrameSize()
  42 	if m.showFooter {
  43@@ -230,7 +231,8 @@ func (m *model) View() string {
  44 		view = lipgloss.JoinVertical(lipgloss.Left, view, m.footer.View())
  45 	}
  46 
  47-	return m.common.Zone.Scan(style.Render(view))
  48+	v.Content = m.common.Zone.Scan(style.Render(view))
  49+	return v
  50 }
  51 
  52 type repository struct {
  53diff --git a/cmd/soft/hook/hook.go b/cmd/soft/hook/hook.go
  54index 8a6fb87dc4ca64a9eaf0da1a1ef7fdaf5a8c7faa..a16cad6d6728886df7de26be436170b28b6ec350 100644
  55--- a/cmd/soft/hook/hook.go
  56+++ b/cmd/soft/hook/hook.go
  57@@ -12,7 +12,7 @@ import (
  58 	"path/filepath"
  59 	"strings"
  60 
  61-	"github.com/charmbracelet/log/v2"
  62+	"charm.land/log/v2"
  63 	"github.com/charmbracelet/soft-serve/cmd"
  64 	"github.com/charmbracelet/soft-serve/pkg/backend"
  65 	"github.com/charmbracelet/soft-serve/pkg/config"
  66diff --git a/cmd/soft/main.go b/cmd/soft/main.go
  67index 9b248fd37aa641d6d0707004413bf53ad959b4aa..14fdcd6b63286d12e8365f62bb69e003c2fd75a7 100644
  68--- a/cmd/soft/main.go
  69+++ b/cmd/soft/main.go
  70@@ -8,7 +8,7 @@ import (
  71 	"strconv"
  72 
  73 	"github.com/charmbracelet/colorprofile"
  74-	"github.com/charmbracelet/log/v2"
  75+	"charm.land/log/v2"
  76 	"github.com/charmbracelet/soft-serve/cmd/soft/admin"
  77 	"github.com/charmbracelet/soft-serve/cmd/soft/browse"
  78 	"github.com/charmbracelet/soft-serve/cmd/soft/hook"
  79diff --git a/cmd/soft/serve/server.go b/cmd/soft/serve/server.go
  80index 56402f13e0182a0a5e9c0b089727cd398174a731..4260f7576da3fccc12f5b296255f70490ed72682 100644
  81--- a/cmd/soft/serve/server.go
  82+++ b/cmd/soft/serve/server.go
  83@@ -6,7 +6,7 @@ import (
  84 	"fmt"
  85 	"net/http"
  86 
  87-	"github.com/charmbracelet/log/v2"
  88+	"charm.land/log/v2"
  89 
  90 	"github.com/charmbracelet/soft-serve/pkg/backend"
  91 	"github.com/charmbracelet/soft-serve/pkg/config"
  92diff --git a/go.mod b/go.mod
  93index 04363831c13ef507340525c5fb893b552a399e75..0cc5c4317393a011ca2f1dfb2184955e545f3da6 100644
  94--- a/go.mod
  95+++ b/go.mod
  96@@ -1,24 +1,24 @@
  97 module github.com/charmbracelet/soft-serve
  98 
  99-go 1.24.0
 100+go 1.24.2
 101 
 102 require (
 103+	charm.land/bubbles/v2 v2.0.0-rc.1.0.20251208171859-93a004ab70c8
 104+	charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e
 105+	charm.land/glamour/v2 v2.0.0-20251110203732-69649f93d3b1
 106+	charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251205162909-7869489d8971
 107+	charm.land/log/v2 v2.0.0-20251110204020-529bb77f35da
 108+	charm.land/wish/v2 v2.0.0-20251118130305-6cd7463a7b97
 109 	github.com/alecthomas/chroma/v2 v2.20.0
 110-	github.com/aymanbagabas/bubblezone/v2 v2.0.0-20250319214444-bb232f16d5e3
 111+	github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be
 112 	github.com/aymanbagabas/git-module v1.8.4-0.20250826192401-1f81c5471e53
 113 	github.com/caarlos0/duration v0.0.0-20240108180406-5d492514f3c7
 114 	github.com/caarlos0/env/v11 v11.3.1
 115-	github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250603123720-56bbc4a1ba66
 116-	github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3.0.20250617194119-3f1d09f7d826
 117-	github.com/charmbracelet/colorprofile v0.3.2
 118+	github.com/charmbracelet/colorprofile v0.4.1
 119 	github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92
 120-	github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe
 121-	github.com/charmbracelet/keygen v0.5.3
 122-	github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71
 123-	github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
 124-	github.com/charmbracelet/ssh v0.0.0-20250128164007-98fd5ae11894
 125-	github.com/charmbracelet/wish/v2 v2.0.0-20250505151211-5996fc7c1f33
 126-	github.com/charmbracelet/x/ansi v0.10.1
 127+	github.com/charmbracelet/keygen v0.5.4
 128+	github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309
 129+	github.com/charmbracelet/x/ansi v0.11.3
 130 	github.com/dustin/go-humanize v1.0.1
 131 	github.com/go-git/go-git/v5 v5.16.2
 132 	github.com/go-jose/go-jose/v3 v3.0.4
 133@@ -31,6 +31,7 @@ require (
 134 	github.com/hashicorp/golang-lru/v2 v2.0.7
 135 	github.com/jmoiron/sqlx v1.4.0
 136 	github.com/lib/pq v1.10.9
 137+	github.com/lrstanley/bubblezone/v2 v2.0.0-alpha.3
 138 	github.com/matryer/is v1.4.1
 139 	github.com/muesli/mango-cobra v1.2.0
 140 	github.com/muesli/reflow v0.3.0
 141@@ -40,6 +41,7 @@ require (
 142 	github.com/rogpeppe/go-internal v1.14.1
 143 	github.com/sergi/go-diff v1.4.0
 144 	github.com/spf13/cobra v1.9.1
 145+	github.com/stretchr/testify v1.10.0
 146 	go.uber.org/automaxprocs v1.6.0
 147 	golang.org/x/crypto v0.45.0
 148 	golang.org/x/sync v0.18.0
 149@@ -48,30 +50,32 @@ require (
 150 )
 151 
 152 require (
 153-	github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
 154 	github.com/atotto/clipboard v0.1.4 // indirect
 155 	github.com/aymerick/douceur v0.2.0 // indirect
 156 	github.com/beorn7/perks v1.0.1 // indirect
 157 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 158-	github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa // indirect
 159-	github.com/charmbracelet/x/conpty v0.1.0 // indirect
 160-	github.com/charmbracelet/x/errors v0.0.0-20240725160154-f9f6568126ec // indirect
 161+	github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560 // indirect
 162+	github.com/charmbracelet/x/conpty v0.1.1 // indirect
 163+	github.com/charmbracelet/x/errors v0.0.0-20251110184232-6ab307057ac7 // indirect
 164 	github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect
 165-	github.com/charmbracelet/x/input v0.3.5-0.20250509021451-13796e822d86 // indirect
 166-	github.com/charmbracelet/x/term v0.2.1 // indirect
 167-	github.com/charmbracelet/x/termios v0.1.0 // indirect
 168-	github.com/charmbracelet/x/windows v0.2.1 // indirect
 169-	github.com/creack/pty v1.1.21 // indirect
 170+	github.com/charmbracelet/x/term v0.2.2 // indirect
 171+	github.com/charmbracelet/x/termios v0.1.1 // indirect
 172+	github.com/charmbracelet/x/windows v0.2.2 // indirect
 173+	github.com/clipperhouse/displaywidth v0.6.1 // indirect
 174+	github.com/clipperhouse/stringish v0.1.1 // indirect
 175+	github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
 176+	github.com/creack/pty v1.1.24 // indirect
 177+	github.com/davecgh/go-spew v1.1.1 // indirect
 178 	github.com/dlclark/regexp2 v1.11.5 // indirect
 179 	github.com/felixge/httpsnoop v1.0.4 // indirect
 180 	github.com/git-lfs/pktline v0.0.0-20230103162542-ca444d533ef1 // indirect
 181 	github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
 182-	github.com/go-logfmt/logfmt v0.6.0 // indirect
 183+	github.com/go-logfmt/logfmt v0.6.1 // indirect
 184 	github.com/gorilla/css v1.0.1 // indirect
 185 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 186-	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
 187+	github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
 188 	github.com/mattn/go-isatty v0.0.20 // indirect
 189-	github.com/mattn/go-runewidth v0.0.16 // indirect
 190+	github.com/mattn/go-runewidth v0.0.19 // indirect
 191 	github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 // indirect
 192 	github.com/microcosm-cc/bluemonday v1.0.27 // indirect
 193 	github.com/muesli/cancelreader v0.2.2 // indirect
 194@@ -79,6 +83,7 @@ require (
 195 	github.com/muesli/mango-pflag v0.1.0 // indirect
 196diff --git a/go.sum b/go.sum
 197index ec6a1d3bb84833de60f35a1a95d44f56ae53b034..afcfbffbe5e8cd3e22b7bc32f05835bc73665f4f 100644
 198--- a/go.sum
 199+++ b/go.sum
 200@@ -1,3 +1,15 @@
 201+charm.land/bubbles/v2 v2.0.0-rc.1.0.20251208171859-93a004ab70c8 h1:mBFNMn9ABYmHqHhYlaWugfFET6mZs2w8tD9/cDlUqeQ=
 202+charm.land/bubbles/v2 v2.0.0-rc.1.0.20251208171859-93a004ab70c8/go.mod h1:5AbN6cEd/47gkEf8TgiQ2O3RZ5QxMS14l9W+7F9fPC4=
 203+charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e h1:tXwTmgGpwZT7ParKF5xbEQBVjM2e1uKhKi/GpfU3mYQ=
 204+charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e/go.mod h1:pDM18flq3Z4njKZPA3zCvyVSSIJbMcoqlE82BdGUtL8=
 205+charm.land/glamour/v2 v2.0.0-20251110203732-69649f93d3b1 h1:9q4+yyU7105T3OrOx0csMyKnw89yMSijJ+rVld/Z2ek=
 206+charm.land/glamour/v2 v2.0.0-20251110203732-69649f93d3b1/go.mod h1:J3kVhY6oHXZq5f+8vC3hmDO95fEvbqj3z7xDwxrfzU8=
 207+charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251205162909-7869489d8971 h1:xZFcNsJMiIDbFtWRyDmkKNk1sjojfaom4Zoe0cyH/8c=
 208+charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251205162909-7869489d8971/go.mod h1:i61Y3FmdbcBNSKa+pKB3DaE4uVQmBLMs/xlvRyHcXAE=
 209+charm.land/log/v2 v2.0.0-20251110204020-529bb77f35da h1:vZa/Ow0uLclpfaDY0ubjzE+B0eLQqi2zanmpeALanow=
 210+charm.land/log/v2 v2.0.0-20251110204020-529bb77f35da/go.mod h1:Tj12StbPc4GwksDF6XwhC9wdXouinIVxRGKKmmmzdSU=
 211+charm.land/wish/v2 v2.0.0-20251118130305-6cd7463a7b97 h1:71lxKLcPBqntp/99s+nD2/UHyd7GIzOOW9TFIzy1y9A=
 212+charm.land/wish/v2 v2.0.0-20251118130305-6cd7463a7b97/go.mod h1:FsbVEDgo+gQ86lu5Aqe8D1V6UtOF7U1J8iKQKycdbc0=
 213 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
 214 filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
 215 github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
 216@@ -10,12 +22,10 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI
 217 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
 218 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
 219 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
 220-github.com/aymanbagabas/bubblezone/v2 v2.0.0-20250319214444-bb232f16d5e3 h1:1z2ihw0YUYUhNmRaavyXvG9ZU/9Tj0vj6sA3z5DFIJ8=
 221-github.com/aymanbagabas/bubblezone/v2 v2.0.0-20250319214444-bb232f16d5e3/go.mod h1:sJwqZoo/BSKSizmr0pSJ758RuRsnjlkrOaxPtwlWtOs=
 222 github.com/aymanbagabas/git-module v1.8.4-0.20250826192401-1f81c5471e53 h1:KfKp+gVsQtuM9qb8Putvkx1jjAWqlvI1vdv5x9hdFoQ=
 223 github.com/aymanbagabas/git-module v1.8.4-0.20250826192401-1f81c5471e53/go.mod h1:d4gQ7/3/S2sPq4NnKdtAgUOVr6XtLpWFtxyVV5/+76U=
 224-github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8=
 225-github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA=
 226+github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
 227+github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
 228 github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
 229 github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
 230 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 231@@ -26,49 +36,41 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m
 232 github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U=
 233 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 234 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 235-github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250603123720-56bbc4a1ba66 h1:LDUnLzW0DZ4riy4juBAXJWeE94vvVChgZwzhZL/4wuk=
 236-github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250603123720-56bbc4a1ba66/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
 237-github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3.0.20250617194119-3f1d09f7d826 h1:pQxCWMojVjHePqGzWsANhplourZYsD6AuR6eR2Hi5yc=
 238-github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3.0.20250617194119-3f1d09f7d826/go.mod h1:bfzSaUDPMKrWDjD6wo/ato9lfDdEX83rZgwcXHYWJ98=
 239-github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
 240-github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
 241+github.com/charmbracelet/colorprofile v0.4.1 h1:a1lO03qTrSIRaK8c3JRxJDZOvhvIeSco3ej+ngLk1kk=
 242+github.com/charmbracelet/colorprofile v0.4.1/go.mod h1:U1d9Dljmdf9DLegaJ0nGZNJvoXAhayhmidOdcBwAvKk=
 243 github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92 h1:KtQlsiHfY3K4AoIEh0yUE/wCLHteZ9EzV1hKmx+p7U8=
 244 github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92/go.mod h1:UrXUCm3xLQkq15fu7qlXHUMlrhdlXHoi13KH2Dfiits=
 245-github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe h1:i6ce4CcAlPpTj2ER69m1DBeLZ3RRcHnKExuwhKa3GfY=
 246-github.com/charmbracelet/glamour/v2 v2.0.0-20250516160903-6f1e2c8f9ebe/go.mod h1:p3Q+aN4eQKeM5jhrmXPMgPrlKbmc59rWSnMsSA3udhk=
 247-github.com/charmbracelet/keygen v0.5.3 h1:2MSDC62OUbDy6VmjIE2jM24LuXUvKywLCmaJDmr/Z/4=
 248-github.com/charmbracelet/keygen v0.5.3/go.mod h1:TcpNoMAO5GSmhx3SgcEMqCrtn8BahKhB8AlwnLjRUpk=
 249-github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71 h1:X0tsNa2UHCKNw+illiavosasVzqioRo32SRV35iwr2I=
 250-github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.2.0.20250703152125-8e1c474f8a71/go.mod h1:EJWvaCrhOhNGVZMvcjc0yVryl4qqpMs8tz0r9WyEkdQ=
 251-github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE=
 252-github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706/go.mod h1:mjJGp00cxcfvD5xdCa+bso251Jt4owrQvuimJtVmEmM=
 253-github.com/charmbracelet/ssh v0.0.0-20250128164007-98fd5ae11894 h1:Ffon9TbltLGBsT6XE//YvNuu4OAaThXioqalhH11xEw=
 254-github.com/charmbracelet/ssh v0.0.0-20250128164007-98fd5ae11894/go.mod h1:hg+I6gvlMl16nS9ZzQNgBIrrCasGwEw0QiLsDcP01Ko=
 255-github.com/charmbracelet/wish/v2 v2.0.0-20250505151211-5996fc7c1f33 h1:/TlxP6Lw9Z7NJCQ7TSbuvfO3/AL0UXGDPwH1zO9pV8U=
 256-github.com/charmbracelet/wish/v2 v2.0.0-20250505151211-5996fc7c1f33/go.mod h1:Tssk2d4IKqV3tNiPgwrYSvJMQu+nN9J4JlGmYaXpiR4=
 257-github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ=
 258-github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
 259-github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa h1:lphz0Z3rsiOtMYiz8axkT24i9yFiueDhJbzyNUADmME=
 260-github.com/charmbracelet/x/cellbuf v0.0.14-0.20250516160309-24eee56f89fa/go.mod h1:xBlh2Yi3DL3zy/2n15kITpg0YZardf/aa/hgUaIM6Rk=
 261-github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U=
 262-github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ=
 263-github.com/charmbracelet/x/errors v0.0.0-20240725160154-f9f6568126ec h1:O8c7pFFK0imuHH5JBqv5smlbVoFn4CZKGjtvCQKu1WE=
 264-github.com/charmbracelet/x/errors v0.0.0-20240725160154-f9f6568126ec/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0=
 265-github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw=
 266-github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
 267+github.com/charmbracelet/keygen v0.5.4 h1:XQYgf6UEaTGgQSSmiPpIQ78WfseNQp4Pz8N/c1OsrdA=
 268+github.com/charmbracelet/keygen v0.5.4/go.mod h1:t4oBRr41bvK7FaJsAaAQhhkUuHslzFXVjOBwA55CZNM=
 269+github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309 h1:dCVbCRRtg9+tsfiTXTp0WupDlHruAXyp+YoxGVofHHc=
 270+github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309/go.mod h1:R9cISUs5kAH4Cq/rguNbSwcR+slE5Dfm8FEs//uoIGE=
 271+github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560 h1:j3PW2hypGoPKBy3ooKzW0TFxaxhyHK3NbkLLn4KeRFc=
 272+github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560/go.mod h1:VWATWLRwYP06VYCEur7FsNR2B1xAo7Y+xl1PTbd1ePc=
 273+github.com/charmbracelet/x/ansi v0.11.3 h1:6DcVaqWI82BBVM/atTyq6yBoRLZFBsnoDoX9GCu2YOI=
 274+github.com/charmbracelet/x/ansi v0.11.3/go.mod h1:yI7Zslym9tCJcedxz5+WBq+eUGMJT0bM06Fqy1/Y4dI=
 275+github.com/charmbracelet/x/conpty v0.1.1 h1:s1bUxjoi7EpqiXysVtC+a8RrvPPNcNvAjfi4jxsAuEs=
 276+github.com/charmbracelet/x/conpty v0.1.1/go.mod h1:OmtR77VODEFbiTzGE9G1XiRJAga6011PIm4u5fTNZpk=
 277+github.com/charmbracelet/x/errors v0.0.0-20251110184232-6ab307057ac7 h1:4EG8pCHK5fa8dIxv97VHC8hdkJAz6QNm1WB9BuD/WhY=
 278+github.com/charmbracelet/x/errors v0.0.0-20251110184232-6ab307057ac7/go.mod h1:O2BTD/aMVQDmrvqroIO3fB6zXUuU07ZpVt21QTmZjRg=
 279+github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f h1:pk6gmGpCE7F3FcjaOEKYriCvpmIN4+6OS/RD0vm4uIA=
 280+github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f/go.mod h1:IfZAMTHB6XkZSeXUqriemErjAWCCzT0LwjKFYCZyw0I=
 281 github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI=
 282 github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU=
 283-github.com/charmbracelet/x/input v0.3.5-0.20250509021451-13796e822d86 h1:BxAEmOBIDajkgao3EsbBxKQCYvgYPGdT62WASLvtf4Y=
 284-github.com/charmbracelet/x/input v0.3.5-0.20250509021451-13796e822d86/go.mod h1:62Rp/6EtTxoeJDSdtpA3tJp3y3ZRpsiekBSje+K8htA=
 285-github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
 286-github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
 287-github.com/charmbracelet/x/termios v0.1.0 h1:y4rjAHeFksBAfGbkRDmVinMg7x7DELIGAFbdNvxg97k=
 288-github.com/charmbracelet/x/termios v0.1.0/go.mod h1:H/EVv/KRnrYjz+fCYa9bsKdqF3S8ouDK0AZEbG7r+/U=
 289-github.com/charmbracelet/x/windows v0.2.1 h1:3x7vnbpQrjpuq/4L+I4gNsG5htYoCiA5oe9hLjAij5I=
 290-github.com/charmbracelet/x/windows v0.2.1/go.mod h1:ptZp16h40gDYqs5TSawSVW+yiLB13j4kSMA0lSCHL0M=
 291+github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
 292+github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
 293+github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY=
 294+github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo=
 295+github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM=
 296+github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k=
 297+github.com/clipperhouse/displaywidth v0.6.1 h1:/zMlAezfDzT2xy6acHBzwIfyu2ic0hgkT83UX5EY2gY=
 298+github.com/clipperhouse/displaywidth v0.6.1/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o=
 299+github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
 300diff --git a/pkg/backend/auth.go b/pkg/backend/auth.go
 301index 7c8158f6d1ad67a580c2f6216b4ad02664f3a94b..5309e410e588ebda1fff86563afcd058794ac1b9 100644
 302--- a/pkg/backend/auth.go
 303+++ b/pkg/backend/auth.go
 304@@ -5,7 +5,7 @@ import (
 305 	"crypto/sha256"
 306 	"encoding/hex"
 307 
 308-	"github.com/charmbracelet/log/v2"
 309+	"charm.land/log/v2"
 310 	"golang.org/x/crypto/bcrypt"
 311 )
 312 
 313diff --git a/pkg/backend/backend.go b/pkg/backend/backend.go
 314index 579d4cecbbc95118b8af451fdd8c9069d3c29e63..95d45ec2d90a0749ad7028c4b9a164f64694752a 100644
 315--- a/pkg/backend/backend.go
 316+++ b/pkg/backend/backend.go
 317@@ -3,7 +3,7 @@ package backend
 318 import (
 319 	"context"
 320 
 321-	"github.com/charmbracelet/log/v2"
 322+	"charm.land/log/v2"
 323 	"github.com/charmbracelet/soft-serve/pkg/config"
 324 	"github.com/charmbracelet/soft-serve/pkg/db"
 325 	"github.com/charmbracelet/soft-serve/pkg/store"
 326diff --git a/pkg/backend/webhooks.go b/pkg/backend/webhooks.go
 327index d25d1cf6ec9ddd307d96ba3683ea25ff62882ff6..2fd90c2a505cd0e5b4f9526f6f685f5dae7f6ae0 100644
 328--- a/pkg/backend/webhooks.go
 329+++ b/pkg/backend/webhooks.go
 330@@ -4,7 +4,7 @@ import (
 331 	"context"
 332 	"encoding/json"
 333 
 334-	"github.com/charmbracelet/log/v2"
 335+	"charm.land/log/v2"
 336 	"github.com/charmbracelet/soft-serve/pkg/db"
 337 	"github.com/charmbracelet/soft-serve/pkg/db/models"
 338 	"github.com/charmbracelet/soft-serve/pkg/proto"
 339diff --git a/pkg/cron/cron.go b/pkg/cron/cron.go
 340index fa290a33e1e826515aeae2fbcd24e78b5a68e95d..fa5fbb2a38a9773a2aa5d108b9764763d313e0ce 100644
 341--- a/pkg/cron/cron.go
 342+++ b/pkg/cron/cron.go
 343@@ -4,7 +4,7 @@ import (
 344 	"context"
 345 	"time"
 346 
 347-	"github.com/charmbracelet/log/v2"
 348+	"charm.land/log/v2"
 349 	"github.com/robfig/cron/v3"
 350 )
 351 
 352diff --git a/pkg/cron/cron_test.go b/pkg/cron/cron_test.go
 353index b8151db55fbbacb7444a87ad67e3f83ba87e6343..b67666b17c9628673b38ff885370f2de55dd8b1f 100644
 354--- a/pkg/cron/cron_test.go
 355+++ b/pkg/cron/cron_test.go
 356@@ -6,7 +6,7 @@ import (
 357 	"fmt"
 358 	"testing"
 359 
 360-	"github.com/charmbracelet/log/v2"
 361+	"charm.land/log/v2"
 362 )
 363 
 364 func TestCronLogger(t *testing.T) {
 365diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go
 366index 30faadd7aac103ccf7110b36f402908f3ee67ed1..a8fcd0c91cc8188897b1fc85d6acc4f98e6007af 100644
 367--- a/pkg/daemon/daemon.go
 368+++ b/pkg/daemon/daemon.go
 369@@ -12,7 +12,7 @@ import (
 370 	"sync/atomic"
 371 	"time"
 372 
 373-	"github.com/charmbracelet/log/v2"
 374+	"charm.land/log/v2"
 375 	"github.com/charmbracelet/soft-serve/pkg/access"
 376 	"github.com/charmbracelet/soft-serve/pkg/backend"
 377 	"github.com/charmbracelet/soft-serve/pkg/config"
 378diff --git a/pkg/db/db.go b/pkg/db/db.go
 379index 7d5fc2ebea59141c5f40ff83341303792709eebf..2d27ae0ecc227324f5e2dbf32446a7f8ada818a0 100644
 380--- a/pkg/db/db.go
 381+++ b/pkg/db/db.go
 382@@ -6,7 +6,7 @@ import (
 383 	"errors"
 384 	"fmt"
 385 
 386-	"github.com/charmbracelet/log/v2"
 387+	"charm.land/log/v2"
 388 	"github.com/charmbracelet/soft-serve/pkg/config"
 389 	"github.com/jmoiron/sqlx"
 390 	_ "github.com/lib/pq"  // postgres driver
 391diff --git a/pkg/db/logger.go b/pkg/db/logger.go
 392index 605ec133a82c7676c3a7315904bb09a5fb219e5b..aef9a8e17985b1c2402d75f9d4c5ca0f93dcf1f7 100644
 393--- a/pkg/db/logger.go
 394+++ b/pkg/db/logger.go
 395@@ -5,7 +5,7 @@ import (
 396 	"database/sql"
 397 	"strings"
 398 
 399-	"github.com/charmbracelet/log/v2"
 400+	"charm.land/log/v2"
 401 	"github.com/jmoiron/sqlx"
 402 )
 403 
 404diff --git a/pkg/db/migrate/0003_migrate_lfs_objects.go b/pkg/db/migrate/0003_migrate_lfs_objects.go
 405index c89775d8ed0b5fc0f0d414179ff6c3c8f6fc4d4c..8477f23f103639ec5b944a33adaccc9c9a0177e3 100644
 406--- a/pkg/db/migrate/0003_migrate_lfs_objects.go
 407+++ b/pkg/db/migrate/0003_migrate_lfs_objects.go
 408@@ -6,7 +6,7 @@ import (
 409 	"path/filepath"
 410 	"strconv"
 411 
 412-	"github.com/charmbracelet/log/v2"
 413+	"charm.land/log/v2"
 414 	"github.com/charmbracelet/soft-serve/pkg/config"
 415 	"github.com/charmbracelet/soft-serve/pkg/db"
 416 	"github.com/charmbracelet/soft-serve/pkg/db/models"
 417diff --git a/pkg/db/migrate/migrate.go b/pkg/db/migrate/migrate.go
 418index 8273e454c9b5a8b1ac28edef580147be04dcafee..8ba8260370d5dfeaa883895444bb2cae0d19b8a3 100644
 419--- a/pkg/db/migrate/migrate.go
 420+++ b/pkg/db/migrate/migrate.go
 421@@ -6,7 +6,7 @@ import (
 422 	"errors"
 423 	"fmt"
 424 
 425-	"github.com/charmbracelet/log/v2"
 426+	"charm.land/log/v2"
 427 	"github.com/charmbracelet/soft-serve/pkg/db"
 428 )
 429 
 430diff --git a/pkg/git/git.go b/pkg/git/git.go
 431index 7b18cf22d562ebb638520501309a196a04a86cdb..301640a14c2421c39644e7866ae0227f8b5698f4 100644
 432--- a/pkg/git/git.go
 433+++ b/pkg/git/git.go
 434@@ -9,7 +9,7 @@ import (
 435 	"strings"
 436 
 437 	gitm "github.com/aymanbagabas/git-module"
 438-	"github.com/charmbracelet/log/v2"
 439+	"charm.land/log/v2"
 440 	"github.com/charmbracelet/soft-serve/git"
 441 	"github.com/go-git/go-git/v5/plumbing/format/pktline"
 442 )
 443diff --git a/pkg/git/lfs.go b/pkg/git/lfs.go
 444index 212ad08041a14b20d54acbd50bf8da942f3e4c9a..6a8809bd740aa3972fb3b878cfbbb70afdf6c899 100644
 445--- a/pkg/git/lfs.go
 446+++ b/pkg/git/lfs.go
 447@@ -12,7 +12,7 @@ import (
 448 	"time"
 449 
 450 	"github.com/charmbracelet/git-lfs-transfer/transfer"
 451-	"github.com/charmbracelet/log/v2"
 452+	"charm.land/log/v2"
 453 	"github.com/charmbracelet/soft-serve/pkg/config"
 454 	"github.com/charmbracelet/soft-serve/pkg/db"
 455 	"github.com/charmbracelet/soft-serve/pkg/db/models"
 456diff --git a/pkg/git/lfs_auth.go b/pkg/git/lfs_auth.go
 457index 32a8e6cba7abbc50d7499ba858bdb4ddffc9e83b..ae03a70cee80368b530d472714631024bec73ee4 100644
 458--- a/pkg/git/lfs_auth.go
 459+++ b/pkg/git/lfs_auth.go
 460@@ -7,7 +7,7 @@ import (
 461 	"fmt"
 462 	"time"
 463 
 464-	"github.com/charmbracelet/log/v2"
 465+	"charm.land/log/v2"
 466 	"github.com/charmbracelet/soft-serve/pkg/config"
 467 	"github.com/charmbracelet/soft-serve/pkg/jwk"
 468 	"github.com/charmbracelet/soft-serve/pkg/lfs"
 469diff --git a/pkg/git/lfs_log.go b/pkg/git/lfs_log.go
 470index fed14ba440aacc986c99e646fbef90e455c266b2..c9e6ac6413165e798b6bab064f9eba0c1b5dd237 100644
 471--- a/pkg/git/lfs_log.go
 472+++ b/pkg/git/lfs_log.go
 473@@ -2,7 +2,7 @@ package git
 474 
 475 import (
 476 	"github.com/charmbracelet/git-lfs-transfer/transfer"
 477-	"github.com/charmbracelet/log/v2"
 478+	"charm.land/log/v2"
 479 )
 480 
 481 type lfsLogger struct {
 482diff --git a/pkg/git/service.go b/pkg/git/service.go
 483index af589c25719320f4c2d8581fe375de32158346b9..94253b798d7911d56b1c0379b154da2a908a376e 100644
 484--- a/pkg/git/service.go
 485+++ b/pkg/git/service.go
 486@@ -10,7 +10,7 @@ import (
 487 	"strings"
 488 	"sync"
 489 
 490-	"github.com/charmbracelet/log/v2"
 491+	"charm.land/log/v2"
 492 )
 493 
 494 // Service is a Git daemon service.
 495diff --git a/pkg/hooks/gen.go b/pkg/hooks/gen.go
 496index d06661be6010efa7ae6acc94e296fd072bae50b1..24415a7888be6c2eedf2b6aaa4b91aab846afb62 100644
 497--- a/pkg/hooks/gen.go
 498+++ b/pkg/hooks/gen.go
 499@@ -7,7 +7,7 @@ import (
 500 	"path/filepath"
 501 	"text/template"
 502 
 503-	"github.com/charmbracelet/log/v2"
 504+	"charm.land/log/v2"
 505 	"github.com/charmbracelet/soft-serve/pkg/config"
 506 	"github.com/charmbracelet/soft-serve/pkg/utils"
 507 )
 508diff --git a/pkg/jobs/mirror.go b/pkg/jobs/mirror.go
 509index 9ebfdd864e76494b5081bb9ba244947989b591ee..4642e72b1508888b7aac6e902bb8eda68e748f40 100644
 510--- a/pkg/jobs/mirror.go
 511+++ b/pkg/jobs/mirror.go
 512@@ -7,7 +7,7 @@ import (
 513 	"runtime"
 514 	"strings"
 515 
 516-	"github.com/charmbracelet/log/v2"
 517+	"charm.land/log/v2"
 518 	"github.com/charmbracelet/soft-serve/git"
 519 	"github.com/charmbracelet/soft-serve/pkg/backend"
 520 	"github.com/charmbracelet/soft-serve/pkg/config"
 521diff --git a/pkg/lfs/basic_transfer.go b/pkg/lfs/basic_transfer.go
 522index d3e4100cd3477d77b3fe8a5953882f847336fd53..ddec8b350e81f273029b855908dcecfd37bdd966 100644
 523--- a/pkg/lfs/basic_transfer.go
 524+++ b/pkg/lfs/basic_transfer.go
 525@@ -9,7 +9,7 @@ import (
 526 	"io"
 527 	"net/http"
 528 
 529-	"github.com/charmbracelet/log/v2"
 530+	"charm.land/log/v2"
 531 )
 532 
 533 // BasicTransferAdapter implements the "basic" adapter
 534diff --git a/pkg/lfs/http_client.go b/pkg/lfs/http_client.go
 535index c78a2e4b2e061a3f8b9c4a675b4f97226ee209bb..e35b930cc7844191aa074a6a0b9e2def13c27260 100644
 536--- a/pkg/lfs/http_client.go
 537+++ b/pkg/lfs/http_client.go
 538@@ -8,7 +8,7 @@ import (
 539 	"fmt"
 540 	"net/http"
 541 
 542-	"github.com/charmbracelet/log/v2"
 543+	"charm.land/log/v2"
 544 )
 545 
 546 // httpClient is a Git LFS client to communicate with a LFS source API.
 547diff --git a/pkg/log/log.go b/pkg/log/log.go
 548index 0c1552589506a2cd82ae11aa77e300218e47d4d6..a4db7e1db2c8f5672b5b2dcc76912d194d2e06a2 100644
 549--- a/pkg/log/log.go
 550+++ b/pkg/log/log.go
 551@@ -5,7 +5,7 @@ import (
 552 	"strings"
 553 	"time"
 554 
 555-	"github.com/charmbracelet/log/v2"
 556+	"charm.land/log/v2"
 557 	"github.com/charmbracelet/soft-serve/pkg/config"
 558 )
 559 
 560diff --git a/pkg/ssh/cmd/commit.go b/pkg/ssh/cmd/commit.go
 561index 2dceace252e1552700926ccbb1d6b256465d416c..f8b1b2285a744837788a4ff59964f5bc66bad843 100644
 562--- a/pkg/ssh/cmd/commit.go
 563+++ b/pkg/ssh/cmd/commit.go
 564@@ -5,7 +5,7 @@ import (
 565 	"strings"
 566 	"time"
 567 
 568-	gansi "github.com/charmbracelet/glamour/v2/ansi"
 569+	gansi "charm.land/glamour/v2/ansi"
 570 	"github.com/charmbracelet/soft-serve/git"
 571 	"github.com/charmbracelet/soft-serve/pkg/backend"
 572 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 573diff --git a/pkg/ssh/cmd/git.go b/pkg/ssh/cmd/git.go
 574index 620b9f0890e2ee4c19b202f9e97eee7ecab325b2..ee5852a87d32d1d1f04a3fcd7217d2298b6781f1 100644
 575--- a/pkg/ssh/cmd/git.go
 576+++ b/pkg/ssh/cmd/git.go
 577@@ -6,7 +6,7 @@ import (
 578 	"strings"
 579 	"time"
 580 
 581-	"github.com/charmbracelet/log/v2"
 582+	"charm.land/log/v2"
 583 	"github.com/charmbracelet/soft-serve/pkg/access"
 584 	"github.com/charmbracelet/soft-serve/pkg/backend"
 585 	"github.com/charmbracelet/soft-serve/pkg/config"
 586diff --git a/pkg/ssh/cmd/tag.go b/pkg/ssh/cmd/tag.go
 587index fc21ce0e4f73a2a340d61ade327ecfd157c1af0e..70f8ff4557c9cd693c7d5c1387c6c2fcf8649100 100644
 588--- a/pkg/ssh/cmd/tag.go
 589+++ b/pkg/ssh/cmd/tag.go
 590@@ -3,7 +3,7 @@ package cmd
 591 import (
 592 	"strings"
 593 
 594-	"github.com/charmbracelet/log/v2"
 595+	"charm.land/log/v2"
 596 	"github.com/charmbracelet/soft-serve/git"
 597 	"github.com/charmbracelet/soft-serve/pkg/backend"
 598 	"github.com/charmbracelet/soft-serve/pkg/proto"
 599diff --git a/pkg/ssh/cmd/token.go b/pkg/ssh/cmd/token.go
 600index 6a11ebfcedbc9a5a3f2aa07ffb4cfb5f997002ad..f95c37f25c430a65b00b038818adcaf6044c75eb 100644
 601--- a/pkg/ssh/cmd/token.go
 602+++ b/pkg/ssh/cmd/token.go
 603@@ -6,7 +6,7 @@ import (
 604 	"time"
 605 
 606 	"github.com/caarlos0/duration"
 607-	"github.com/charmbracelet/lipgloss/v2/table"
 608+	"charm.land/lipgloss/v2/table"
 609 	"github.com/charmbracelet/soft-serve/pkg/backend"
 610 	"github.com/charmbracelet/soft-serve/pkg/proto"
 611 	"github.com/dustin/go-humanize"
 612diff --git a/pkg/ssh/cmd/webhooks.go b/pkg/ssh/cmd/webhooks.go
 613index 742127052107d2a8bd99f904d5e132e718e0a685..5f156672651d74d356ee5297d15c5679d034674e 100644
 614--- a/pkg/ssh/cmd/webhooks.go
 615+++ b/pkg/ssh/cmd/webhooks.go
 616@@ -5,7 +5,7 @@ import (
 617 	"strconv"
 618 	"strings"
 619 
 620-	"github.com/charmbracelet/lipgloss/v2/table"
 621+	"charm.land/lipgloss/v2/table"
 622 	"github.com/charmbracelet/soft-serve/pkg/backend"
 623 	"github.com/charmbracelet/soft-serve/pkg/utils"
 624 	"github.com/charmbracelet/soft-serve/pkg/webhook"
 625diff --git a/pkg/ssh/middleware.go b/pkg/ssh/middleware.go
 626index 32c31af933a807bef2de20dd37e53778a7cb91aa..a0a578e33684ba06e653bd6b961be6348d93e1dc 100644
 627--- a/pkg/ssh/middleware.go
 628+++ b/pkg/ssh/middleware.go
 629@@ -4,7 +4,7 @@ import (
 630 	"fmt"
 631 	"time"
 632 
 633-	"github.com/charmbracelet/log/v2"
 634+	"charm.land/log/v2"
 635 	"github.com/charmbracelet/soft-serve/pkg/backend"
 636 	"github.com/charmbracelet/soft-serve/pkg/config"
 637 	"github.com/charmbracelet/soft-serve/pkg/db"
 638@@ -13,7 +13,7 @@ import (
 639 	"github.com/charmbracelet/soft-serve/pkg/sshutils"
 640 	"github.com/charmbracelet/soft-serve/pkg/store"
 641 	"github.com/charmbracelet/ssh"
 642-	"github.com/charmbracelet/wish/v2"
 643+	"charm.land/wish/v2"
 644 	"github.com/prometheus/client_golang/prometheus"
 645 	"github.com/prometheus/client_golang/prometheus/promauto"
 646 	"github.com/spf13/cobra"
 647diff --git a/pkg/ssh/session.go b/pkg/ssh/session.go
 648index 892da8bba0de8330c6761e0e30a76adbd80afe12..c89d913f24d85cf804910a5aef206f84ad394833 100644
 649--- a/pkg/ssh/session.go
 650+++ b/pkg/ssh/session.go
 651@@ -3,15 +3,15 @@ package ssh
 652 import (
 653 	"time"
 654 
 655-	tea "github.com/charmbracelet/bubbletea/v2"
 656+	tea "charm.land/bubbletea/v2"
 657+	"charm.land/wish/v2"
 658+	bm "charm.land/wish/v2/bubbletea"
 659 	"github.com/charmbracelet/soft-serve/pkg/access"
 660 	"github.com/charmbracelet/soft-serve/pkg/backend"
 661 	"github.com/charmbracelet/soft-serve/pkg/config"
 662 	"github.com/charmbracelet/soft-serve/pkg/proto"
 663 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 664 	"github.com/charmbracelet/ssh"
 665-	"github.com/charmbracelet/wish/v2"
 666-	bm "github.com/charmbracelet/wish/v2/bubbletea"
 667 	"github.com/prometheus/client_golang/prometheus"
 668 	"github.com/prometheus/client_golang/prometheus/promauto"
 669 )
 670@@ -54,9 +54,7 @@ func SessionHandler(s ssh.Session) *tea.Program {
 671 
 672 	opts := bm.MakeOptions(s)
 673 	opts = append(opts,
 674-		tea.WithAltScreen(),
 675 		tea.WithoutCatchPanics(),
 676-		tea.WithMouseCellMotion(),
 677 		tea.WithContext(ctx),
 678 		tea.WithColorProfile(common.DefaultColorProfile),
 679 	)
 680diff --git a/pkg/ssh/session_test.go b/pkg/ssh/session_test.go
 681index f831327450cf92c32188bde1096473274c57e78e..dab5b8e0722958e7836acdab7fc20ea7fb21ffb2 100644
 682--- a/pkg/ssh/session_test.go
 683+++ b/pkg/ssh/session_test.go
 684@@ -8,7 +8,7 @@ import (
 685 	"testing"
 686 	"time"
 687 
 688-	"github.com/charmbracelet/log/v2"
 689+	"charm.land/log/v2"
 690 	"github.com/charmbracelet/soft-serve/pkg/backend"
 691 	"github.com/charmbracelet/soft-serve/pkg/config"
 692 	"github.com/charmbracelet/soft-serve/pkg/db"
 693@@ -17,8 +17,8 @@ import (
 694 	"github.com/charmbracelet/soft-serve/pkg/store/database"
 695 	"github.com/charmbracelet/soft-serve/pkg/test"
 696 	"github.com/charmbracelet/ssh"
 697-	bm "github.com/charmbracelet/wish/v2/bubbletea"
 698-	"github.com/charmbracelet/wish/v2/testsession"
 699+	bm "charm.land/wish/v2/bubbletea"
 700+	"charm.land/wish/v2/testsession"
 701 	"github.com/matryer/is"
 702 	gossh "golang.org/x/crypto/ssh"
 703 	_ "modernc.org/sqlite" // sqlite driver
 704diff --git a/pkg/ssh/ssh.go b/pkg/ssh/ssh.go
 705index 10d5edee632048c98e83fdfb9609c0426e57f2a0..274c63e971cc5be3d383a15ce827e9dc364541ec 100644
 706--- a/pkg/ssh/ssh.go
 707+++ b/pkg/ssh/ssh.go
 708@@ -9,16 +9,16 @@ import (
 709 	"time"
 710 
 711 	"github.com/charmbracelet/keygen"
 712-	"github.com/charmbracelet/log/v2"
 713+	"charm.land/log/v2"
 714 	"github.com/charmbracelet/soft-serve/pkg/backend"
 715 	"github.com/charmbracelet/soft-serve/pkg/config"
 716 	"github.com/charmbracelet/soft-serve/pkg/db"
 717 	"github.com/charmbracelet/soft-serve/pkg/proto"
 718 	"github.com/charmbracelet/soft-serve/pkg/store"
 719 	"github.com/charmbracelet/ssh"
 720-	"github.com/charmbracelet/wish/v2"
 721-	bm "github.com/charmbracelet/wish/v2/bubbletea"
 722-	rm "github.com/charmbracelet/wish/v2/recover"
 723+	"charm.land/wish/v2"
 724+	bm "charm.land/wish/v2/bubbletea"
 725+	rm "charm.land/wish/v2/recover"
 726 	"github.com/prometheus/client_golang/prometheus"
 727 	"github.com/prometheus/client_golang/prometheus/promauto"
 728 	gossh "golang.org/x/crypto/ssh"
 729diff --git a/pkg/ssh/ui.go b/pkg/ssh/ui.go
 730index e08cc89a31f110b56a1f9b28da3b95ea518eac46..2e7d7b61523cdac5a2cfe310c1f0b1ff895a2c17 100644
 731--- a/pkg/ssh/ui.go
 732+++ b/pkg/ssh/ui.go
 733@@ -3,10 +3,10 @@ package ssh
 734 import (
 735 	"errors"
 736 
 737-	"github.com/charmbracelet/bubbles/v2/key"
 738-	"github.com/charmbracelet/bubbles/v2/list"
 739-	tea "github.com/charmbracelet/bubbletea/v2"
 740-	"github.com/charmbracelet/lipgloss/v2"
 741+	"charm.land/bubbles/v2/key"
 742+	"charm.land/bubbles/v2/list"
 743+	tea "charm.land/bubbletea/v2"
 744+	"charm.land/lipgloss/v2"
 745 	"github.com/charmbracelet/soft-serve/git"
 746 	"github.com/charmbracelet/soft-serve/pkg/proto"
 747 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 748@@ -256,7 +256,11 @@ func (ui *UI) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 749 }
 750 
 751 // View implements tea.Model.
 752-func (ui *UI) View() string {
 753+func (ui *UI) View() tea.View {
 754+	var v tea.View
 755+	v.AltScreen = true
 756+	v.MouseMode = tea.MouseModeCellMotion
 757+
 758 	var view string
 759 	wm, hm := ui.getMargins()
 760 	switch ui.state {
 761@@ -284,9 +288,10 @@ func (ui *UI) View() string {
 762 	if ui.showFooter {
 763 		view = lipgloss.JoinVertical(lipgloss.Left, view, ui.footer.View())
 764 	}
 765-	return ui.common.Zone.Scan(
 766+	v.Content = ui.common.Zone.Scan(
 767 		ui.common.Styles.App.Render(view),
 768 	)
 769+	return v
 770 }
 771 
 772 func (ui *UI) openRepo(rn string) (proto.Repository, error) {
 773diff --git a/pkg/store/database/database.go b/pkg/store/database/database.go
 774index e41087c7a8dfaa8f14da34715425c0f761d380ba..9e56ab646d8be37368388d6e9d1dace61c328cc2 100644
 775--- a/pkg/store/database/database.go
 776+++ b/pkg/store/database/database.go
 777@@ -3,7 +3,7 @@ package database
 778 import (
 779 	"context"
 780 
 781-	"github.com/charmbracelet/log/v2"
 782+	"charm.land/log/v2"
 783 	"github.com/charmbracelet/soft-serve/pkg/config"
 784 	"github.com/charmbracelet/soft-serve/pkg/db"
 785 	"github.com/charmbracelet/soft-serve/pkg/store"
 786diff --git a/pkg/ui/common/common.go b/pkg/ui/common/common.go
 787index d6e0a778474698ede31c66bad607789164c24499..7412a8f07e469b5b6e06838c575072dd9a782dd6 100644
 788--- a/pkg/ui/common/common.go
 789+++ b/pkg/ui/common/common.go
 790@@ -4,15 +4,15 @@ import (
 791 	"context"
 792 	"fmt"
 793 
 794+	"charm.land/log/v2"
 795 	"github.com/alecthomas/chroma/v2/lexers"
 796-	zone "github.com/aymanbagabas/bubblezone/v2"
 797-	"github.com/charmbracelet/log/v2"
 798 	"github.com/charmbracelet/soft-serve/git"
 799 	"github.com/charmbracelet/soft-serve/pkg/backend"
 800 	"github.com/charmbracelet/soft-serve/pkg/config"
 801 	"github.com/charmbracelet/soft-serve/pkg/ui/keymap"
 802 	"github.com/charmbracelet/soft-serve/pkg/ui/styles"
 803 	"github.com/charmbracelet/ssh"
 804+	zone "github.com/lrstanley/bubblezone/v2"
 805 )
 806 
 807 type contextKey struct {
 808diff --git a/pkg/ui/common/component.go b/pkg/ui/common/component.go
 809index 4b152a4ba81080af791446601d06133847d80102..510914136f1d896aa5590dddafdc67439153d44d 100644
 810--- a/pkg/ui/common/component.go
 811+++ b/pkg/ui/common/component.go
 812@@ -1,14 +1,20 @@
 813 package common
 814 
 815 import (
 816-	"github.com/charmbracelet/bubbles/v2/help"
 817-	tea "github.com/charmbracelet/bubbletea/v2"
 818+	"charm.land/bubbles/v2/help"
 819+	tea "charm.land/bubbletea/v2"
 820 )
 821 
 822+// Model represents a simple UI model.
 823+type Model interface {
 824+	Init() tea.Cmd
 825+	Update(tea.Msg) (Model, tea.Cmd)
 826+	View() string
 827+}
 828+
 829 // Component represents a Bubble Tea model that implements a SetSize function.
 830 type Component interface {
 831-	tea.Model
 832-	tea.ViewModel
 833+	Model
 834 	help.KeyMap
 835 	SetSize(width, height int)
 836 }
 837diff --git a/pkg/ui/common/error.go b/pkg/ui/common/error.go
 838index 926df1d9ac7610b2a34648290e62c28a7d9d9629..e855273b01074012f9fb49f36739de3713214021 100644
 839--- a/pkg/ui/common/error.go
 840+++ b/pkg/ui/common/error.go
 841@@ -3,7 +3,7 @@ package common
 842 import (
 843 	"errors"
 844 
 845-	tea "github.com/charmbracelet/bubbletea/v2"
 846+	tea "charm.land/bubbletea/v2"
 847 )
 848 
 849 // ErrMissingRepo indicates that the requested repository could not be found.
 850diff --git a/pkg/ui/common/format.go b/pkg/ui/common/format.go
 851index f82c71aec65d6366f3f4d6da770979c94a4d18e4..d7a14bfb777b42918904b9bbd49721af9eadd57c 100644
 852--- a/pkg/ui/common/format.go
 853+++ b/pkg/ui/common/format.go
 854@@ -6,7 +6,7 @@ import (
 855 	"strings"
 856 
 857 	"github.com/alecthomas/chroma/v2/lexers"
 858-	gansi "github.com/charmbracelet/glamour/v2/ansi"
 859+	gansi "charm.land/glamour/v2/ansi"
 860 	"github.com/charmbracelet/soft-serve/pkg/ui/styles"
 861 )
 862 
 863diff --git a/pkg/ui/common/style.go b/pkg/ui/common/style.go
 864index 1f2032f8b5e0ffbb12c067427c397e34dc55944b..a8e8d1d5161e1eda9ccbac08c3d584ee89c01131 100644
 865--- a/pkg/ui/common/style.go
 866+++ b/pkg/ui/common/style.go
 867@@ -2,8 +2,8 @@ package common
 868 
 869 import (
 870 	"github.com/charmbracelet/colorprofile"
 871-	gansi "github.com/charmbracelet/glamour/v2/ansi"
 872-	"github.com/charmbracelet/glamour/v2/styles"
 873+	gansi "charm.land/glamour/v2/ansi"
 874+	"charm.land/glamour/v2/styles"
 875 )
 876 
 877 // DefaultColorProfile is the default color profile used by the SSH server.
 878diff --git a/pkg/ui/components/code/code.go b/pkg/ui/components/code/code.go
 879index 6da77c65fe8040f9bf21c266eafbcf78328613c5..085151a79a607e09b27a68ef957030410e233f2e 100644
 880--- a/pkg/ui/components/code/code.go
 881+++ b/pkg/ui/components/code/code.go
 882@@ -5,11 +5,11 @@ import (
 883 	"strings"
 884 	"sync"
 885 
 886+	tea "charm.land/bubbletea/v2"
 887+	"charm.land/glamour/v2"
 888+	gansi "charm.land/glamour/v2/ansi"
 889+	"charm.land/lipgloss/v2"
 890 	"github.com/alecthomas/chroma/v2/lexers"
 891-	tea "github.com/charmbracelet/bubbletea/v2"
 892-	"github.com/charmbracelet/glamour/v2"
 893-	gansi "github.com/charmbracelet/glamour/v2/ansi"
 894-	"github.com/charmbracelet/lipgloss/v2"
 895 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 896 	vp "github.com/charmbracelet/soft-serve/pkg/ui/components/viewport"
 897 )
 898@@ -132,7 +132,7 @@ func (r *Code) Init() tea.Cmd {
 899 }
 900 
 901 // Update implements tea.Model.
 902-func (r *Code) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 903+func (r *Code) Update(msg tea.Msg) (common.Model, tea.Cmd) {
 904 	cmds := make([]tea.Cmd, 0)
 905 	switch msg.(type) {
 906 	case tea.WindowSizeMsg:
 907diff --git a/pkg/ui/components/footer/footer.go b/pkg/ui/components/footer/footer.go
 908index 05e1160dedbe717a213de8907fbbb65dccc5bd4e..77bc2a9b8cbe3496a23803890a0e54c34a585cb2 100644
 909--- a/pkg/ui/components/footer/footer.go
 910+++ b/pkg/ui/components/footer/footer.go
 911@@ -1,10 +1,10 @@
 912 package footer
 913 
 914 import (
 915-	"github.com/charmbracelet/bubbles/v2/help"
 916-	"github.com/charmbracelet/bubbles/v2/key"
 917-	tea "github.com/charmbracelet/bubbletea/v2"
 918-	"github.com/charmbracelet/lipgloss/v2"
 919+	"charm.land/bubbles/v2/help"
 920+	"charm.land/bubbles/v2/key"
 921+	tea "charm.land/bubbletea/v2"
 922+	"charm.land/lipgloss/v2"
 923 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 924 )
 925 
 926@@ -37,8 +37,8 @@ func New(c common.Common, keymap help.KeyMap) *Footer {
 927 // SetSize implements common.Component.
 928 func (f *Footer) SetSize(width, height int) {
 929 	f.common.SetSize(width, height)
 930-	f.help.Width = width -
 931-		f.common.Styles.Footer.GetHorizontalFrameSize()
 932+	f.help.SetWidth(width -
 933+		f.common.Styles.Footer.GetHorizontalFrameSize())
 934 }
 935 
 936 // Init implements tea.Model.
 937@@ -47,7 +47,7 @@ func (f *Footer) Init() tea.Cmd {
 938 }
 939 
 940 // Update implements tea.Model.
 941-func (f *Footer) Update(_ tea.Msg) (tea.Model, tea.Cmd) {
 942+func (f *Footer) Update(_ tea.Msg) (common.Model, tea.Cmd) {
 943 	return f, nil
 944 }
 945 
 946diff --git a/pkg/ui/components/header/header.go b/pkg/ui/components/header/header.go
 947index 63e47a4911f6618c31448cdbc8c902e80314be11..76ff89fda1d85ece13a2dc391120e2913c06dc63 100644
 948--- a/pkg/ui/components/header/header.go
 949+++ b/pkg/ui/components/header/header.go
 950@@ -3,7 +3,7 @@ package header
 951 import (
 952 	"strings"
 953 
 954-	tea "github.com/charmbracelet/bubbletea/v2"
 955+	tea "charm.land/bubbletea/v2"
 956 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 957 )
 958 
 959@@ -32,7 +32,7 @@ func (h *Header) Init() tea.Cmd {
 960 }
 961 
 962 // Update implements tea.Model.
 963-func (h *Header) Update(_ tea.Msg) (tea.Model, tea.Cmd) {
 964+func (h *Header) Update(_ tea.Msg) (common.Model, tea.Cmd) {
 965 	return h, nil
 966 }
 967 
 968diff --git a/pkg/ui/components/selector/selector.go b/pkg/ui/components/selector/selector.go
 969index e42ee3507a674a36561ae9255a7b6ea5f2e25c86..b796d44ef2f2a58ed434e1d3c8df464008d94e1e 100644
 970--- a/pkg/ui/components/selector/selector.go
 971+++ b/pkg/ui/components/selector/selector.go
 972@@ -3,9 +3,9 @@ package selector
 973 import (
 974 	"sync"
 975 
 976-	"github.com/charmbracelet/bubbles/v2/key"
 977-	"github.com/charmbracelet/bubbles/v2/list"
 978-	tea "github.com/charmbracelet/bubbletea/v2"
 979+	"charm.land/bubbles/v2/key"
 980+	"charm.land/bubbles/v2/list"
 981+	tea "charm.land/bubbletea/v2"
 982 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 983 )
 984 
 985@@ -227,7 +227,7 @@ func (s *Selector) Init() tea.Cmd {
 986 }
 987 
 988 // Update implements tea.Model.
 989-func (s *Selector) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 990+func (s *Selector) Update(msg tea.Msg) (common.Model, tea.Cmd) {
 991 	cmds := make([]tea.Cmd, 0)
 992 	switch msg := msg.(type) {
 993 	case tea.MouseClickMsg:
 994diff --git a/pkg/ui/components/statusbar/statusbar.go b/pkg/ui/components/statusbar/statusbar.go
 995index f913e644a2230ea4a3d6f1b46f9e7850de45a02e..ef6c6acfdcc2437906a2869e0c1e9aed5cba7407 100644
 996--- a/pkg/ui/components/statusbar/statusbar.go
 997+++ b/pkg/ui/components/statusbar/statusbar.go
 998@@ -1,8 +1,8 @@
 999 package statusbar
1000 
1001 import (
1002-	tea "github.com/charmbracelet/bubbletea/v2"
1003-	"github.com/charmbracelet/lipgloss/v2"
1004+	tea "charm.land/bubbletea/v2"
1005+	"charm.land/lipgloss/v2"
1006 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
1007 	"github.com/charmbracelet/x/ansi"
1008 )
1009@@ -52,7 +52,7 @@ func (s *Model) Init() tea.Cmd {
1010 }
1011 
1012 // Update implements tea.Model.
1013-func (s *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
1014+func (s *Model) Update(msg tea.Msg) (common.Model, tea.Cmd) {
1015 	switch msg := msg.(type) {
1016 	case tea.WindowSizeMsg:
1017 		s.SetSize(msg.Width, msg.Height)
1018diff --git a/pkg/ui/components/tabs/tabs.go b/pkg/ui/components/tabs/tabs.go
1019index 36f0a19e85c2bda3dc172e02d8b5bb5b70919ad4..ec49404d377b9d0831d8c7a29fda2fda8a8e33c0 100644
1020--- a/pkg/ui/components/tabs/tabs.go
1021+++ b/pkg/ui/components/tabs/tabs.go
1022@@ -3,8 +3,8 @@ package tabs
1023 import (
1024 	"strings"
1025 
1026-	tea "github.com/charmbracelet/bubbletea/v2"
1027-	"github.com/charmbracelet/lipgloss/v2"
1028+	tea "charm.land/bubbletea/v2"
1029+	"charm.land/lipgloss/v2"
1030 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
1031 )
1032 
1033@@ -51,7 +51,7 @@ func (t *Tabs) Init() tea.Cmd {
1034 }
1035 
1036 // Update implements tea.Model.
1037-func (t *Tabs) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
1038+func (t *Tabs) Update(msg tea.Msg) (common.Model, tea.Cmd) {
1039 	cmds := make([]tea.Cmd, 0)
1040 	switch msg := msg.(type) {
1041 	case tea.KeyPressMsg:
1042diff --git a/pkg/ui/components/viewport/viewport.go b/pkg/ui/components/viewport/viewport.go
1043index 95bd06bdb8beca22e9f6abda9efba40d4cfbc5b6..814672d2865d85c22664704104d65461f8bc19ef 100644
1044--- a/pkg/ui/components/viewport/viewport.go
1045+++ b/pkg/ui/components/viewport/viewport.go
1046@@ -1,9 +1,9 @@
1047 package viewport
1048 
1049 import (
1050-	"github.com/charmbracelet/bubbles/v2/key"
1051-	"github.com/charmbracelet/bubbles/v2/viewport"
1052-	tea "github.com/charmbracelet/bubbletea/v2"
1053+	"charm.land/bubbles/v2/key"
1054+	"charm.land/bubbles/v2/viewport"
1055+	tea "charm.land/bubbletea/v2"
1056 	"github.com/charmbracelet/soft-serve/pkg/ui/common"
1057 )
1058 
1059@@ -38,7 +38,7 @@ func (v *Viewport) Init() tea.Cmd {
1060 }
1061 
1062 // Update implements tea.Model.
1063-func (v *Viewport) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
1064+func (v *Viewport) Update(msg tea.Msg) (common.Model, tea.Cmd) {
1065 	switch msg := msg.(type) {
1066 	case tea.KeyPressMsg:
1067 		switch {
1068diff --git a/pkg/ui/keymap/keymap.go b/pkg/ui/keymap/keymap.go
1069index 707a558616cec72ec85e1a07cde964e25930ce4d..2839e307e52b88eaff205ebb6665d94e5e2e85eb 100644
1070--- a/pkg/ui/keymap/keymap.go
1071+++ b/pkg/ui/keymap/keymap.go
1072@@ -1,6 +1,6 @@
1073 package keymap
1074 
1075-import "github.com/charmbracelet/bubbles/v2/key"
1076+import "charm.land/bubbles/v2/key"
1077 
1078 // KeyMap is a map of key bindings for the UI.
1079 type KeyMap struct {