Adds the ability to organize proxy resources into named groups/folders on the resources page.
Changes:
DB: New resourceGroups table with orgId, name, sortOrder; groupId FK added to resources (ON DELETE set null); migrations for PostgreSQL and SQLite (1.17.0)
API: CRUD endpoints for resource groups (GET/PUT/POST/DELETE /org/:orgId/resource-group[s]); groupId added to listResources response and updateResource body
UI: Collapsible group headers in the proxy resources table; "Create Group" toolbar button; "Move to group..." action in the resource row menu; group delete (resources become ungrouped, not deleted)
Description
Add support for grouping proxy resources to improve organization and management. This includes database schema updates to introduce a new resourceGroups table and a groupId foreign key in the resources table, along with migration scripts for PostgreSQL and SQLite. New API endpoints for CRUD operations on resource groups (create, list, update, delete) have been added. The frontend now features collapsible group headers in the resources table, dialogs for creating groups and moving resources between groups, and updates to resource listing and update logic to handle group assignments.
How to test?
Changes:
DB: New resourceGroups table with orgId, name, sortOrder; groupId FK added to resources (ON DELETE set null); migrations for PostgreSQL and SQLite (1.17.0)
API: CRUD endpoints for resource groups (GET/PUT/POST/DELETE /org/:orgId/resource-group[s]); groupId added to listResources response and updateResource body
UI: Collapsible group headers in the proxy resources table; "Create Group" toolbar button; "Move to group..." action in the resource row menu; group delete (resources become ungrouped, not deleted)
Community Contribution License Agreement
By creating this pull request, I grant the project maintainers an unlimited,
perpetual license to use, modify, and redistribute these contributions under any terms they
choose, including both the AGPLv3 and the Fossorial Commercial license terms. I
represent that I have the right to grant this license for all contributed content.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/fosrl/pangolin/pull/2651
**Author:** [@centopw](https://github.com/centopw)
**Created:** 3/15/2026
**Status:** ❌ Closed
**Base:** `main` ← **Head:** `main`
---
### 📝 Commits (1)
- [`9d09c7b`](https://github.com/fosrl/pangolin/commit/9d09c7bfad9c749a4668f8dc5827e5e197b6eeee) feat(resources): add resource groups for organizing proxy resources
### 📊 Changes
**19 files changed** (+1048 additions, -61 deletions)
<details>
<summary>View changed files</summary>
📝 `server/db/pg/schema/schema.ts` (+13 -1)
📝 `server/db/sqlite/schema/schema.ts` (+13 -1)
📝 `server/routers/external.ts` (+28 -0)
➕ `server/routers/resource/createResourceGroup.ts` (+77 -0)
➕ `server/routers/resource/deleteResourceGroup.ts` (+75 -0)
📝 `server/routers/resource/index.ts` (+4 -0)
➕ `server/routers/resource/listResourceGroups.ts` (+62 -0)
📝 `server/routers/resource/listResources.ts` (+7 -2)
📝 `server/routers/resource/updateResource.ts` (+4 -2)
➕ `server/routers/resource/updateResourceGroup.ts` (+104 -0)
📝 `server/setup/migrationsPg.ts` (+3 -1)
📝 `server/setup/migrationsSqlite.ts` (+3 -1)
➕ `server/setup/scriptsPg/1.17.0.ts` (+41 -0)
➕ `server/setup/scriptsSqlite/1.17.0.ts` (+42 -0)
📝 `src/app/[orgId]/settings/resources/proxy/page.tsx` (+15 -2)
➕ `src/components/CreateResourceGroupDialog.tsx` (+111 -0)
➕ `src/components/MoveResourceToGroupDialog.tsx` (+122 -0)
📝 `src/components/ProxyResourcesTable.tsx` (+240 -3)
📝 `src/components/ui/controlled-data-table.tsx` (+84 -48)
</details>
### 📄 Description
Adds the ability to organize proxy resources into named groups/folders on the resources page.
**Changes:**
- **DB**: New `resourceGroups` table with `orgId`, `name`, `sortOrder`; `groupId` FK added to `resources` (ON DELETE set null); migrations for PostgreSQL and SQLite (1.17.0)
- **API**: CRUD endpoints for resource groups (`GET/PUT/POST/DELETE /org/:orgId/resource-group[s]`); `groupId` added to `listResources` response and `updateResource` body
- **UI**: Collapsible group headers in the proxy resources table; "Create Group" toolbar button; "Move to group..." action in the resource row menu; group delete (resources become ungrouped, not deleted)
<img width="1549" height="924" alt="image" src="https://github.com/user-attachments/assets/0390ee87-eeee-4c56-b4b3-316dcc706726" />
## Description
Add support for grouping proxy resources to improve organization and management. This includes database schema updates to introduce a new `resourceGroups` table and a `groupId` foreign key in the `resources` table, along with migration scripts for PostgreSQL and SQLite. New API endpoints for CRUD operations on resource groups (create, list, update, delete) have been added. The frontend now features collapsible group headers in the resources table, dialogs for creating groups and moving resources between groups, and updates to resource listing and update logic to handle group assignments.
## How to test?
**Changes:**
- **DB**: New `resourceGroups` table with `orgId`, `name`, `sortOrder`; `groupId` FK added to `resources` (ON DELETE set null); migrations for PostgreSQL and SQLite (1.17.0)
- **API**: CRUD endpoints for resource groups (`GET/PUT/POST/DELETE /org/:orgId/resource-group[s]`); `groupId` added to `listResources` response and `updateResource` body
- **UI**: Collapsible group headers in the proxy resources table; "Create Group" toolbar button; "Move to group..." action in the resource row menu; group delete (resources become ungrouped, not deleted)
## Community Contribution License Agreement
By creating this pull request, I grant the project maintainers an unlimited,
perpetual license to use, modify, and redistribute these contributions under any terms they
choose, including both the AGPLv3 and the Fossorial Commercial license terms. I
represent that I have the right to grant this license for all contributed content.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/fosrl/pangolin/pull/2651
Author: @centopw
Created: 3/15/2026
Status: ❌ Closed
Base:
main← Head:main📝 Commits (1)
9d09c7bfeat(resources): add resource groups for organizing proxy resources📊 Changes
19 files changed (+1048 additions, -61 deletions)
View changed files
📝
server/db/pg/schema/schema.ts(+13 -1)📝
server/db/sqlite/schema/schema.ts(+13 -1)📝
server/routers/external.ts(+28 -0)➕
server/routers/resource/createResourceGroup.ts(+77 -0)➕
server/routers/resource/deleteResourceGroup.ts(+75 -0)📝
server/routers/resource/index.ts(+4 -0)➕
server/routers/resource/listResourceGroups.ts(+62 -0)📝
server/routers/resource/listResources.ts(+7 -2)📝
server/routers/resource/updateResource.ts(+4 -2)➕
server/routers/resource/updateResourceGroup.ts(+104 -0)📝
server/setup/migrationsPg.ts(+3 -1)📝
server/setup/migrationsSqlite.ts(+3 -1)➕
server/setup/scriptsPg/1.17.0.ts(+41 -0)➕
server/setup/scriptsSqlite/1.17.0.ts(+42 -0)📝
src/app/[orgId]/settings/resources/proxy/page.tsx(+15 -2)➕
src/components/CreateResourceGroupDialog.tsx(+111 -0)➕
src/components/MoveResourceToGroupDialog.tsx(+122 -0)📝
src/components/ProxyResourcesTable.tsx(+240 -3)📝
src/components/ui/controlled-data-table.tsx(+84 -48)📄 Description
Adds the ability to organize proxy resources into named groups/folders on the resources page.
Changes:
resourceGroupstable withorgId,name,sortOrder;groupIdFK added toresources(ON DELETE set null); migrations for PostgreSQL and SQLite (1.17.0)GET/PUT/POST/DELETE /org/:orgId/resource-group[s]);groupIdadded tolistResourcesresponse andupdateResourcebodyDescription
Add support for grouping proxy resources to improve organization and management. This includes database schema updates to introduce a new
resourceGroupstable and agroupIdforeign key in theresourcestable, along with migration scripts for PostgreSQL and SQLite. New API endpoints for CRUD operations on resource groups (create, list, update, delete) have been added. The frontend now features collapsible group headers in the resources table, dialogs for creating groups and moving resources between groups, and updates to resource listing and update logic to handle group assignments.How to test?
Changes:
resourceGroupstable withorgId,name,sortOrder;groupIdFK added toresources(ON DELETE set null); migrations for PostgreSQL and SQLite (1.17.0)GET/PUT/POST/DELETE /org/:orgId/resource-group[s]);groupIdadded tolistResourcesresponse andupdateResourcebodyCommunity Contribution License Agreement
By creating this pull request, I grant the project maintainers an unlimited,
perpetual license to use, modify, and redistribute these contributions under any terms they
choose, including both the AGPLv3 and the Fossorial Commercial license terms. I
represent that I have the right to grant this license for all contributed content.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.