Features
- Refresh sizes on the Storage page (#483). The Storage page no longer has to wait for every mirror to sync before it fills in. Refresh sizes measures every mirror now, with its progress on the button. It only reads your destination: one repository listing per owner, the single repository lookup for a mirror the listing does not have, and the release listing of repositories that mirror releases. Nothing is requested from GitHub. The same refresh is available as
POST /api/storage/refresh.
Changes
- Pages keep their data (#484). Dashboard, Repositories, Organizations, Storage and Activity Log keep what they last showed in this browser tab. Going back to one shows its data at once and refreshes it in the background, instead of starting from a skeleton and loading the whole list again. Nothing is written to browser storage; a reload or a new tab starts fresh.
- Large libraries stay light (#484). The Repositories page built a card for every repository even on desktop, where the cards are hidden, and the Storage table rendered every row. Only the layout on screen renders now, and both lists only draw the rows near the viewport. With 3,000 repositories the Repositories page went from about 124,000 elements to under 1,000.
- Smoother table scrolling (#484). Scrolling the desktop Repositories table re-rendered the filters and every visible row on each step. Only the rows coming into view render now. With the CPU slowed 4x, a scroll frame went from about 31 ms to about 13 ms.
Fixed
-
Destination release listings stopped after 30 releases (#483). Gitea and Forgejo ignore
per_pageand return 30 releases a page, and the listing treated that short page as the end. Because of that:- the release limit only trimmed within the newest 30 releases on each sync;
- the Storage page counted at most 30 releases per repository;
- the release filter preview listed only the newest 30 tags.
Listings now page with
limituntil they reach the total the destination reports. -
The sync button on an archived repository says Sync like the other rows, instead of Manual Sync, which pushed the status badge out of line (#482). Hovering it explains that automatic syncs are off for archived mirrors.
Security
- zod 4.6.7 (#481, GHSA-mrhx-c7xc-m3w5). Older zod validated every element of an array longer than its
.max(), so an oversized list could run the process out of memory. In this app that list is the MCP tools'repositoryIds, which needs an API key.
Notes
- The next sync can delete older releases. Retention and the release filters used to see only the newest 30 releases in the destination. They now see all of them, so a repository with more releases than its release limit, or with older releases your filters exclude, has those removed on its next sync. A release limit of 30 or more never trimmed anything before.
No action needed. As always, back up your Gitea before upgrading.
Full Changelog: v3.47.0...v3.48.0