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.
Description
Main changes:
Implemented the ability to apply blueprints from the UI (screenshots attached below)
Implemented saving of blueprints runs in the database, wether they are triggered from newt, API or the UI
Updated the existing applyBlueprint function to save the result of a blueprint run in the database, to not break the existing the logic, the blueprint json contents is parsed to yaml when saving its content in the database, and a name is generated with faker if not provided
Other changes:
Added a topbar navigation for feedback when you navigate across pages (screenshots below)
Renamed applyBlueprint from the integration API to applyJSONBlueprint and put all the blueprint API endpoints into blueprints/ folder
Added logging for SQL queries for debugging in development for sqlite driver
Added turbopack to the next server start script for faster compile time in DEV
Added a custom not-found.tsx page at the settings layout level to not hide the sidebar if there is a 404.
Updated the button component to accept asChild (asChild require only a single child component)
Fixed an alignment UI bug where the header wouldn't be aligned with table rows
Warning
You might notice formatting changes across files, I applied prettier with the existing .prettierrc config file in the repo. It's applied on save, so the formatting changes are caused by when I visit the file then hit save.
Screenshots
-
-
List blueprint
Create blueprint
Blueprint details
Top loader navigation
------
------
Header misaligned
Header alignment fixed
🔄 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/1733
**Author:** [@Fredkiss3](https://github.com/Fredkiss3)
**Created:** 10/22/2025
**Status:** ✅ Merged
**Merged:** 10/30/2025
**Merged by:** [@oschwartz10612](https://github.com/oschwartz10612)
**Base:** `dev` ← **Head:** `feat-blueprint-ui-on-dashboard`
---
### 📝 Commits (10+)
- [`3633e02`](https://github.com/fosrl/pangolin/commit/3633e02ff770ff7509a3d8c45b3829133e13e011) 🔨 run next server with turbopack (easy win)
- [`5fd104b`](https://github.com/fosrl/pangolin/commit/5fd104bb30c285091803828bea6fc45943769d2f) 🗃️ add `bluePrintRuns` model
- [`ba74558`](https://github.com/fosrl/pangolin/commit/ba745588e9457ea8dc2fd1d277f33c18958fbf10) 🎨 format with prettier
- [`d84ee3d`](https://github.com/fosrl/pangolin/commit/d84ee3d03d45c8abfce341562e83317306035f8b) 🌐 add blueprint section title in the sidebar in messages (`en-US` for now)
- [`e575fae`](https://github.com/fosrl/pangolin/commit/e575fae73b835a25a9a88f0fcf0dfc23ac04cdeb) 🚧 SQLite database schema with modes (is it okay ?)
- [`202d207`](https://github.com/fosrl/pangolin/commit/202d2075a692fdb9db6dc8884767f39404dd4ae7) 🚧 add blueprint to the sidebar and scaffold page
- [`6521b66`](https://github.com/fosrl/pangolin/commit/6521b66b7cbb141770384eb0a770c30a1872dec6) 🍱 add jsonschema for blueprint yaml validation
- [`9024b2a`](https://github.com/fosrl/pangolin/commit/9024b2a974fdf2e032f44446c09446d565e5a3c2) 🗃️ finish db schemas for blueprints
- [`259cea1`](https://github.com/fosrl/pangolin/commit/259cea1c42efe748bd3c0aa800598d7e35fb9b14) ✨ add API endpoint for listing blueprints
- [`a5b48ab`](https://github.com/fosrl/pangolin/commit/a5b48ab3924f48a914b12e6ed51056f0480ca693) 🚧 blueprints page
### 📊 Changes
**45 files changed** (+1695 additions, -142 deletions)
<details>
<summary>View changed files</summary>
➕ `docker-compose.drizzle.yml` (+15 -0)
📝 `docker-compose.pgr.yml` (+1 -1)
📝 `messages/en-US.json` (+19 -0)
📝 `next.config.mjs` (+2 -1)
📝 `package-lock.json` (+114 -0)
📝 `package.json` (+6 -0)
📝 `server/auth/actions.ts` (+2 -1)
📝 `server/db/pg/schema/schema.ts` (+17 -2)
📝 `server/db/sqlite/driver.ts` (+7 -2)
📝 `server/db/sqlite/schema/schema.ts` (+18 -0)
📝 `server/lib/blueprints/applyBlueprint.ts` (+59 -11)
📝 `server/lib/blueprints/applyNewtDockerBlueprint.ts` (+6 -1)
📝 `server/nextServer.ts` (+1 -1)
📝 `server/openApi.ts` (+2 -1)
📝 `server/routers/blueprints/applyJSONBlueprint.ts` (+9 -23)
➕ `server/routers/blueprints/applyYAMLBlueprint.ts` (+146 -0)
➕ `server/routers/blueprints/getBlueprint.ts` (+110 -0)
➕ `server/routers/blueprints/index.ts` (+4 -0)
➕ `server/routers/blueprints/listBlueprints.ts` (+144 -0)
➕ `server/routers/blueprints/types.ts` (+7 -0)
_...and 25 more files_
</details>
### 📄 Description
## 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.
## Description
**Main changes:**
- Implemented the ability to apply blueprints from the UI (screenshots attached below)
- Implemented saving of blueprints runs in the database, wether they are triggered from newt, API or the UI
- Updated the existing `applyBlueprint` function to save the result of a blueprint run in the database, to not break the existing the logic, the blueprint json contents is parsed to yaml when saving its content in the database, and a name is generated with [faker](https://fakerjs.dev/api/word.html#adjective) if not provided
**Other changes:**
- Added a topbar navigation for feedback when you navigate across pages (screenshots below)
- Renamed `applyBlueprint` from the integration API to `applyJSONBlueprint` and put all the blueprint API endpoints into `blueprints/` folder
- Added logging for SQL queries for debugging in `development` for sqlite driver
- Added turbopack to the next server start script for faster compile time in DEV
- Added an openapi Tag for Blueprints
- Proposed a change to the way `cache(getOrg)` is called, the current way it's done doesn't cache (or technically deduplicate) anything, it's just executing the function everytime it's caleld. `cache` needs to be declared on the top level to actually deduplicate function calls, this way the function `getOrg` only gets executed once if called at multiple places during the processing of a request
https://github.com/Fredkiss3/pangolin/blob/c7df70143e65b45fb5dfb10c75f7cbe4a436b097/src/app/%5BorgId%5D/settings/domains/page.tsx#L41
https://github.com/Fredkiss3/pangolin/blob/c7df70143e65b45fb5dfb10c75f7cbe4a436b097/src/lib/api/getCachedOrg.ts#L1-L12
- Added a custom `not-found.tsx` page at the settings layout level to not hide the sidebar if there is a 404.
- Updated the button component to accept `asChild` (`asChild` require only a single child component)
- Fixed an alignment UI bug where the header wouldn't be aligned with table rows
> [!WARNING]
> You might notice formatting changes across files, I applied prettier with the existing `.prettierrc` config file in the repo. It's applied on save, so the formatting changes are caused by when I visit the file then hit save.
## Screenshots
| - | - |
| ------ | ------ |
| List blueprint | <img width="3248" height="2120" alt="Screenshot 2025-10-25 at 02 54 22" src="https://github.com/user-attachments/assets/77c20ba8-ff3b-40b6-af52-cc8bfd93ba4e" /> |
| Create blueprint | <img width="3248" height="2120" alt="Screenshot 2025-10-25 at 03 22 17" src="https://github.com/user-attachments/assets/4123b43f-02c4-4b22-953f-c9a0b2766365" /> |
| Blueprint details | <img width="3248" height="2120" alt="Screenshot 2025-10-28 at 00 14 01" src="https://github.com/user-attachments/assets/ce38e851-874c-43a3-8d64-3c781505c050" /> |
| Top loader navigation | <video src="https://github.com/user-attachments/assets/d86591c3-b051-4166-a35a-497831cb3711"></video> |
| ------ | ------ |
| Header misaligned | <img width="2106" height="720" alt="image" src="https://github.com/user-attachments/assets/ec957d46-ffc8-447d-8b44-c9199dd1c650" /> |
| Header alignment fixed | <img width="2130" height="722" alt="image (1)" src="https://github.com/user-attachments/assets/3d3c4df3-e915-4fc9-8b1c-db1f770cbb48" /> |
---
<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/1733
Author: @Fredkiss3
Created: 10/22/2025
Status: ✅ Merged
Merged: 10/30/2025
Merged by: @oschwartz10612
Base:
dev← Head:feat-blueprint-ui-on-dashboard📝 Commits (10+)
3633e02🔨 run next server with turbopack (easy win)5fd104b🗃️ addbluePrintRunsmodelba74558🎨 format with prettierd84ee3d🌐 add blueprint section title in the sidebar in messages (en-USfor now)e575fae🚧 SQLite database schema with modes (is it okay ?)202d207🚧 add blueprint to the sidebar and scaffold page6521b66🍱 add jsonschema for blueprint yaml validation9024b2a🗃️ finish db schemas for blueprints259cea1✨ add API endpoint for listing blueprintsa5b48ab🚧 blueprints page📊 Changes
45 files changed (+1695 additions, -142 deletions)
View changed files
➕
docker-compose.drizzle.yml(+15 -0)📝
docker-compose.pgr.yml(+1 -1)📝
messages/en-US.json(+19 -0)📝
next.config.mjs(+2 -1)📝
package-lock.json(+114 -0)📝
package.json(+6 -0)📝
server/auth/actions.ts(+2 -1)📝
server/db/pg/schema/schema.ts(+17 -2)📝
server/db/sqlite/driver.ts(+7 -2)📝
server/db/sqlite/schema/schema.ts(+18 -0)📝
server/lib/blueprints/applyBlueprint.ts(+59 -11)📝
server/lib/blueprints/applyNewtDockerBlueprint.ts(+6 -1)📝
server/nextServer.ts(+1 -1)📝
server/openApi.ts(+2 -1)📝
server/routers/blueprints/applyJSONBlueprint.ts(+9 -23)➕
server/routers/blueprints/applyYAMLBlueprint.ts(+146 -0)➕
server/routers/blueprints/getBlueprint.ts(+110 -0)➕
server/routers/blueprints/index.ts(+4 -0)➕
server/routers/blueprints/listBlueprints.ts(+144 -0)➕
server/routers/blueprints/types.ts(+7 -0)...and 25 more files
📄 Description
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.
Description
Main changes:
applyBlueprintfunction to save the result of a blueprint run in the database, to not break the existing the logic, the blueprint json contents is parsed to yaml when saving its content in the database, and a name is generated with faker if not providedOther changes:
applyBlueprintfrom the integration API toapplyJSONBlueprintand put all the blueprint API endpoints intoblueprints/folderdevelopmentfor sqlite drivercache(getOrg)is called, the current way it's done doesn't cache (or technically deduplicate) anything, it's just executing the function everytime it's caleld.cacheneeds to be declared on the top level to actually deduplicate function calls, this way the functiongetOrgonly gets executed once if called at multiple places during the processing of a requesthttps://github.com/Fredkiss3/pangolin/blob/c7df70143e65b45fb5dfb10c75f7cbe4a436b097/src/app/%5BorgId%5D/settings/domains/page.tsx#L41
https://github.com/Fredkiss3/pangolin/blob/c7df70143e65b45fb5dfb10c75f7cbe4a436b097/src/lib/api/getCachedOrg.ts#L1-L12
not-found.tsxpage at the settings layout level to not hide the sidebar if there is a 404.asChild(asChildrequire only a single child component)Screenshots
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.