33 Commits

Author SHA1 Message Date
af971b7b83 fix(sync): normalize username to lowercase for Mattermost and Gitea password sync
All checks were successful
Build and Deploy / deploy (push) Successful in 42s
Mattermost and Gitea store usernames as lowercase but SilverDESK passes
the original case (e.g. "Merlin" instead of "merlin"), causing 404/400
errors on case-sensitive API lookups.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 22:32:11 +00:00
4a087a4f24 fix(sync): log Mattermost user lookup response body on failure
All checks were successful
Build and Deploy / deploy (push) Successful in 43s
Adds response body to the warning log when Mattermost user lookup fails,
making it easier to diagnose token/permission issues from logs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 22:03:02 +00:00
502d48da99 app update
All checks were successful
Build and Deploy / deploy (push) Successful in 42s
2026-02-24 14:48:02 +00:00
cd2994d7eb fix(developers): add Mattermost team membership and role-aware Gitea provisioning
All checks were successful
Build and Deploy / deploy (push) Successful in 18s
New users are now added to the SilverLABS Mattermost team after account
creation. Gitea provisioning is skipped for Testers (only Developers get
repo access). Role is parsed from ticket description and threaded through
the entire approval/confirmation flow. Gitea API token is now configured.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:10:45 +00:00
dc9a60a7a2 feat(developers): simplify timezone dropdown and make email optional
All checks were successful
Build and Deploy / deploy (push) Successful in 42s
Replace 100+ raw system timezones with curated list of 26 major zones
with browser auto-detection via Intl API. Remove email requirement since
applicants receive a @silverlabs.uk address — fallback to username@silverlabs.uk
when no personal email is provided.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 23:55:08 +00:00
44e3ad94e0 feat(developers): add service URLs and onboarding guide to provisioning reply and success page
All checks were successful
Build and Deploy / deploy (push) Successful in 41s
Ticket replies now include full onboarding info (webmail, IMAP/SMTP, Mattermost, Gitea, SilverDESK URLs) instead of raw provisioning status. Confirmation success page uses clickable service links with email client config details.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:57:51 +00:00
296c7fefc5 fix(developers): use fresh HttpClient for ticket creation to authenticate as applicant
All checks were successful
Build and Deploy / deploy (push) Successful in 41s
The typed HttpClient has X-API-Key set as a default header, which caused
SilverDESK's MultiAuth policy to route to ApiKey auth instead of Bearer/JWT.
This made tickets owned by the MCP system user instead of the applicant.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:07:21 +00:00
9cbbd2d4f2 feat(developers): add password-synced provisioning and deployment confirmation flow
All checks were successful
Build and Deploy / deploy (push) Successful in 41s
Replace random unrecoverable passwords with a confirmation-based flow:
admin approval generates a secure token and sends a ticket reply with a
confirmation link; the developer clicks the link, enters their SilverDESK
password, and all services (Mattermost, Mailcow, Gitea) are provisioned
with that password. Adds password sync endpoint for SilverDESK resets and
updates the post-signup success panel to redirect to SilverDESK login with
the username pre-populated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 21:16:13 +00:00
c4febd7036 fix(developers): fix application record creation and approval flow
All checks were successful
Build and Deploy / deploy (push) Successful in 18s
Fix two bugs preventing developer applications from appearing in SilverDESK:

1. Application creation payload used wrong types - ticketId was parsed as
   int (GetInt32) but SilverDESK expects a Guid string, and appliedRole
   was cast to int but the DTO expects "Tester"/"Developer" strings.

2. Approval provisioning now updates the DeveloperApplication record in
   SilverDESK after Mattermost/Mailcow provisioning, setting status to
   Approved and the correct provisioning flags.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 19:40:42 +00:00
324ce141d0 feat(developers): add timezone dropdown and rework skills section
All checks were successful
Build and Deploy / deploy (push) Successful in 16s
Replace free-text timezone input with a dropdown populated from system
timezones. Replace "Why SilverLabs?" motivation section with a
skills-focused "What You Bring" section that collects what candidates
can contribute to the team, with role-specific placeholders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 18:44:04 +00:00
e5eacd8725 fix(developers): check username on blur instead of keystroke to avoid rate limiting
All checks were successful
Build and Deploy / deploy (push) Successful in 20s
SilverDESK rate-limits /api/auth/check-username after ~2 requests with a
5-minute cooldown. The old 500ms debounce per keystroke quickly exhausted
this limit, breaking the form. Now checks only on field blur, validates
format client-side while typing, and caches results to skip redundant calls.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 18:10:04 +00:00
33b21959d8 fix(developers): distinguish API errors from taken usernames in availability check
All checks were successful
Build and Deploy / deploy (push) Successful in 40s
CheckUsernameAsync returned false (taken) on any API failure, making every
username appear taken when SilverDESK was unreachable. Now returns nullable
bool so errors show a warning instead of blocking submission.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 18:00:46 +00:00
a8d827eace feat(developers): create DeveloperApplication record on signup
All checks were successful
Build and Deploy / deploy (push) Successful in 42s
After registering the user and creating the ticket, call the
SilverDESK developer-program API to create a proper application
record linking the user and ticket. This ensures applications
appear in the /developer-program/applications dashboard.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 16:03:32 +00:00
d0785e04e1 feat(developers): overhaul signup to auto-register SilverDESK accounts
All checks were successful
Build and Deploy / deploy (push) Successful in 41s
Users now pick a password and get a SilverDESK account immediately on
submit. The form includes debounced username availability checking,
password fields with validation, and a post-submit link to SilverDESK.
The approval flow no longer creates a SilverDESK user (already exists)
and only provisions Mattermost + Mailcow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 11:03:16 +00:00
a4d2e571d5 fix(developers): return 200 on partial provisioning failure
All checks were successful
Build and Deploy / deploy (push) Successful in 17s
The approval endpoint now always returns 200 when provisioning was
attempted, with success/failure details in the response body. This
allows the SilverDESK webhook step to proceed with remaining actions
(note, reply, status change) even when individual services fail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 01:43:49 +00:00
008ca7f65d fix(developers): configure Mailcow API key and fix password2 field
All checks were successful
Build and Deploy / deploy (push) Successful in 18s
Add the Mailcow read/write API key so mailbox provisioning actually
authenticates. Also set password2 to match password as required by
the Mailcow API.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 00:49:36 +00:00
587467321d fix(developers): correct SilverDESK provisioning payload fields
All checks were successful
Build and Deploy / deploy (push) Successful in 41s
The CreateUserDto expects `fullName` and `password` but the payload
was sending `name` (wrong property name) and omitting password
entirely, causing 400 BadRequest validation errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 23:49:37 +00:00
ed5d14989a feat(developers): fix approval webhook flow and add ticket parsing service
All checks were successful
Build and Deploy / deploy (push) Successful in 16s
Change approve endpoint from int to string ticketId to match SilverDESK
GUIDs. Remove body parameter requirement so the endpoint works as a
webhook target. Add DeveloperTicketParsingService to fetch and parse
applicant details from ticket descriptions. Remove redundant ticket
status update from ProvisioningService since SilverDESK action engine
now handles SetStatus/AddNote/AddReply steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 23:10:46 +00:00
a8b7cc2ffd chore: migrate CI/CD from GitLab to Gitea Actions
All checks were successful
Build and Deploy / deploy (push) Successful in 19s
Replace .gitlab-ci.yml with .gitea/workflows/deploy.yml for build and
deploy pipeline. Deploy target updated to 10.0.0.247.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 20:59:11 +00:00
21c07adf54 feat(developers): add developer program signup with SilverDESK integration
Add developer application page with form submission that creates tickets
in SilverDESK. Includes provisioning service scaffolding for Mattermost,
Mailcow, and Gitea account creation. Fixes API key header casing
(X-API-Key) and ticket payload to match SilverDESK's CreateTicketDto
contract.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 20:51:36 +00:00
d2780e9295 feat: Update SDK page to use single NuGet templates package
Changed from two separate tar.gz download links to a single NuGet package:
- Updated Quick Start to use 'dotnet new install SilverLabs.SilverSHELL.Templates'
- Replaced dual download cards with single templates package card
- Link now points to https://nuget.silverlabs.uk/packages/silverlabs.silvershell.templates/
- Simplified installation process for users

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-20 21:28:35 +01:00
62dc7bd93f fix: Change Dockerfile to run ASP.NET Core instead of static nginx
The Blazor Web App requires the ASP.NET runtime to function properly,
as it uses interactive server components. Changed from nginx serving
static files to running the full .NET application.

Changes:
- Updated Dockerfile to use aspnet:9.0 runtime image
- Removed nginx configuration (no longer needed)
- Disabled HTTPS redirection (running behind reverse proxy)
- Added publish/ folder to .gitignore

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-20 19:28:01 +01:00
3aa191cd3d feat: Convert website from static HTML to .NET 9.0 Blazor Web App
Major architectural upgrade from static HTML site to modern Blazor Web App:

- Migrated to .NET 9.0 Blazor Web App framework
- Converted home page with 4 gateway cards (Help Desk, App Store, Cloud, SDK)
- Added new SDK card linking to comprehensive SDK documentation
- Converted SDK documentation page to Blazor component
- Updated template download links to nuget.silverlabs.uk repository
- Implemented multi-stage Docker build with .NET SDK 9.0
- Created Blazor-optimized nginx configuration
- Preserved all original styling and animations
- Added .gitignore for Blazor build artifacts

Technical changes:
- New BlazorApp/ project structure with Components architecture
- MainLayout simplified (no default navigation)
- CSS ported to wwwroot (styles.css + sdk-styles.css)
- Multi-stage Dockerfile: Build with dotnet SDK, serve with nginx
- GitLab CI/CD pipeline compatible (auto-detects new Dockerfile)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-20 19:11:53 +01:00
a7fd925187 feat: Update templates to use wildcard NuGet versions
Updated both templates to always fetch the latest package versions:
- SilverSHELL packages now use Version="*"
- Microsoft .NET 9 packages use Version="9.*"

This ensures users always get the latest features and fixes without
needing to manually update template versions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 23:20:45 +01:00
ce0f5a3a20 fix: Update starter template with MSBuild-compatible XML directives
Updated starter template package with fixed .csproj file that wraps
template preprocessor directives in XML comments for MSBuild/Rider
compatibility.

This resolves the error: "The element #text> beneath element is unrecognized"

Users can now open and work with the template in IDEs without errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 23:11:16 +01:00
a160fb835a fix: SDK page not displaying content
Removed script.js include that was causing errors (no loading screen
on SDK page) and added 'visible' class directly to main-content div
so content displays immediately without JavaScript dependency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 22:37:00 +01:00
7ed6f13a30 fix: Reduce aggressive browser caching for static assets
Changed cache expiry from 1 year to 1 hour and removed immutable flag
to allow browser cache updates. The 1-year cache was preventing logo
updates from being visible without clearing browser cache.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 22:24:17 +01:00
add81d6d4a fix: Correct CI/CD deployment script variable expansion
Fixed the deployment script to properly expand variables in the SSH
session by removing single quotes from the heredoc delimiter. Also
added error handling with 'set -e' and removed dependency on
/opt/silverlabs/website directory that doesn't exist.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 22:20:46 +01:00
b34efb8c1c feat: Replace logo with transparent background version
Updated the SilverLabs logo to use a transparent background for better
visual appearance against the gradient background. Removed the old logo.jpg
file and updated the Dockerfile to reflect this change.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 22:16:37 +01:00
0ccf6de896 fix: Include SDK directory in Docker image
The SDK directory was not being copied to the Docker image, causing
404 errors when accessing /sdk. Added COPY statement to include the
entire sdk/ directory with its subdirectories and downloadable templates.

Also added logo.jpg to the copy list for completeness.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 21:52:21 +01:00
fae14a5083 fix: Nginx routing for subdirectory index.html files
Updated try_files directive to check for index.html in subdirectories
before falling back to root index.html. This fixes /sdk routing.

Before: try_files $uri $uri/ /index.html;
After: try_files $uri $uri/index.html /index.html;

Now /sdk correctly serves /sdk/index.html instead of root index.html

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 21:48:22 +01:00
b998ea4205 ci: Add GitLab CI/CD pipeline for automated Docker deployment
Added CI/CD pipeline with:
- Build stage: Creates Docker image from website files
- Deploy stage: Deploys to production server (PORTAINER-01)
- Automatic deployment on master/main branch
- Container runs on port 8100 mapped to internal port 80
- Available at https://silverlabs.uk

Pipeline deploys to:
- Server: 10.0.0.51 (PORTAINER-01)
- Port: 8100
- Docker container: silverlabs-website

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 21:37:51 +01:00
cf01a75179 feat: Add SilverSHELL SDK documentation page with downloadable templates
Added comprehensive SDK page at /sdk with:
- Downloadable SilverSHELL starter template (6.3 KB)
- Downloadable SilverSHELL module template (14 KB)
- Quick start guide with step-by-step instructions
- Creating applications guide (configuration, UI, manual install)
- Creating modules guide with template options
- Publishing modules guide (automated CI/CD + manual)
- Available modules list from library.silverlabs.uk
- Resources and support links

Initial commit includes:
- Complete static website with Docker deployment
- SilverLabs branding and styling
- Nginx configuration for production serving

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 21:36:57 +01:00