Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLeitwolf112026-08-30 17:08:01 +0300
committerLeitwolf112026-08-30 17:08:01 +0300
commit4bdd99b35493631aa4171753aa66d208c018f320 (patch)
tree7025ddd07efd7d5491f996d32c97f66042522021
parent178f97b44da88d8653d1f942a993d06aad9b48cf (diff)
downloadwebsite-4bdd99b35493631aa4171753aa66d208c018f320.tar.gz
Move ViGet to its canonical Progmasoft domain. Update registry navigation, authentication redirects, allowed hosts, Google OAuth callback documentation, and catalog identity to viget.progmasoft.com. Publish distinct honest empty-state roots for Visual X# .vipkg packages and Kotlin DSL plugin JARs without inventing unavailable package endpoints. Add production Nginx routing for the new host, preserve path and query strings through permanent redirects from viget.xsharp-lang.xyz, retain both ACME renewal surfaces, and exclude reproducible local publish output.
-rw-r--r--.gitignore1
-rw-r--r--README.md12
-rw-r--r--backend/Auth/AuthEndpoints.cs6
-rw-r--r--backend/appsettings.json2
-rw-r--r--frontend/public/scripts/auth-flow.v3.js6
-rw-r--r--frontend/public/scripts/dashboard.v1.js6
-rw-r--r--frontend/src/components/AuthPanel.astro10
-rw-r--r--frontend/src/components/RepositoryHeader.astro11
-rw-r--r--frontend/src/pages/index.astro2
-rw-r--r--frontend/src/pages/repo/dashboard/index.astro4
-rw-r--r--frontend/src/pages/repo/dslplugins/index.astro54
-rw-r--r--frontend/src/pages/repo/index.astro4
-rw-r--r--ops/nginx/xsharp.conf53
13 files changed, 141 insertions, 30 deletions
diff --git a/.gitignore b/.gitignore
index c46e512..8e1aa4c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
.astro/
+.build/
.idea/
.vscode/
bin/
diff --git a/README.md b/README.md
index 6057fbf..8318bcd 100644
--- a/README.md
+++ b/README.md
@@ -14,18 +14,26 @@ This repository contains the public web surface for the Visual X# programming la
- `backend/` is the ASP.NET Core Identity and package-registry API. It owns password and Google authentication,
verification/recovery mail, secure session cookies, PostgreSQL persistence, and digest-only CLI tokens.
The registry account dashboard is available at
-[`viget.xsharp-lang.xyz/dashboard`](https://viget.xsharp-lang.xyz/dashboard/). Package publication remains closed while
+[`viget.progmasoft.com/dashboard`](https://viget.progmasoft.com/dashboard/). Package publication remains closed while
the compiler package contract is completed. Registry tokens follow the Cargo model: the plaintext is returned once,
only a SHA-256 digest is retained, and a user can revoke each token independently. Account deletion permanently
removes the Identity account, external logins, verification records, and registry tokens.
+ViGet keeps DSL plugins and Visual X# packages in separate canonical catalogs:
+
+- `https://viget.progmasoft.com/dslplugins/<Publisher>/<Name>/` contains Kotlin DSL plugin JARs.
+- `https://viget.progmasoft.com/<Publisher>/<Name>/` contains Visual X# `.vipkg` packages.
+
+These paths reserve catalog identity; they do not imply that publishing or downloading is available before the registry
+HTTP contract is implemented.
+
The PostgreSQL provider is selected solely by `ConnectionStrings__Registry`. Production uses the PostgreSQL instance on
the project-owned server over a local Unix socket; the database is not delegated to a hosted database service or exposed
to the browser. Google OAuth client credentials, the database connection, auth-code pepper, and data-protection
certificate stay in host-managed secrets.
The Google OAuth web client callback is
-`https://viget.xsharp-lang.xyz/api/v1/auth/google/callback`. Configure it through
+`https://viget.progmasoft.com/api/v1/auth/google/callback`. Configure it through
`Authentication__Google__ClientId` and `Authentication__Google__ClientSecret`. Until both values exist, the frontend
keeps the Google button visible but disabled and email/password authentication remains available.
Every completed Google authorization still requires the short-lived Visual X# email code before a registry session is issued.
diff --git a/backend/Auth/AuthEndpoints.cs b/backend/Auth/AuthEndpoints.cs
index 077d673..9b490d0 100644
--- a/backend/Auth/AuthEndpoints.cs
+++ b/backend/Auth/AuthEndpoints.cs
@@ -15,9 +15,9 @@ namespace XSharp.Web.Api.Auth;
internal static class AuthEndpoints
{
- private const string DashboardUrl = "https://viget.xsharp-lang.xyz/dashboard/";
- private const string LoginUrl = "https://viget.xsharp-lang.xyz/login/";
- private const string RegisterUrl = "https://viget.xsharp-lang.xyz/register/";
+ private const string DashboardUrl = "https://viget.progmasoft.com/dashboard/";
+ private const string LoginUrl = "https://viget.progmasoft.com/login/";
+ private const string RegisterUrl = "https://viget.progmasoft.com/register/";
public static void MapAuthEndpoints(this WebApplication app)
{
diff --git a/backend/appsettings.json b/backend/appsettings.json
index 9dc0107..735b2bc 100644
--- a/backend/appsettings.json
+++ b/backend/appsettings.json
@@ -5,7 +5,7 @@
"Microsoft.AspNetCore": "Warning"
}
},
- "AllowedHosts": "localhost;api.xsharp-lang.xyz;viget.xsharp-lang.xyz",
+ "AllowedHosts": "localhost;api.xsharp-lang.xyz;viget.progmasoft.com",
"ConnectionStrings": {
"Registry": "Host=127.0.0.1;Port=5432;Database=xs_registry;Username=xsharp_web"
},
diff --git a/frontend/public/scripts/auth-flow.v3.js b/frontend/public/scripts/auth-flow.v3.js
index 8f4af1f..6c16437 100644
--- a/frontend/public/scripts/auth-flow.v3.js
+++ b/frontend/public/scripts/auth-flow.v3.js
@@ -133,7 +133,7 @@ form?.addEventListener("submit", async (event) => {
}
const response = await request("login", { email, password });
if (!response.ok) return explainFailure(response);
- window.location.assign("https://viget.xsharp-lang.xyz/dashboard/");
+ window.location.assign("https://viget.progmasoft.com/dashboard/");
return;
}
@@ -165,7 +165,7 @@ form?.addEventListener("submit", async (event) => {
}
const response = await request("verify-email", { email, code, publisherName });
if (!response.ok) return explainFailure(response);
- window.location.assign("https://viget.xsharp-lang.xyz/dashboard/");
+ window.location.assign("https://viget.progmasoft.com/dashboard/");
return;
}
@@ -176,7 +176,7 @@ form?.addEventListener("submit", async (event) => {
}
const response = await request("recovery/complete", { email, code: recoveryCode, password });
if (!response.ok) return explainFailure(response);
- window.location.assign("https://viget.xsharp-lang.xyz/dashboard/");
+ window.location.assign("https://viget.progmasoft.com/dashboard/");
});
initializeGoogleVerification();
diff --git a/frontend/public/scripts/dashboard.v1.js b/frontend/public/scripts/dashboard.v1.js
index efb5019..3337df3 100644
--- a/frontend/public/scripts/dashboard.v1.js
+++ b/frontend/public/scripts/dashboard.v1.js
@@ -67,7 +67,7 @@ async function revokeToken(id) {
async function initialize() {
const response = await fetch("/api/v1/auth/me", { credentials: "include" });
if (response.status === 401) {
- window.location.replace("https://viget.xsharp-lang.xyz/login/");
+ window.location.replace("https://viget.progmasoft.com/login/");
return;
}
if (!response.ok) return showAlert("Account information could not be loaded.", true);
@@ -90,7 +90,7 @@ async function initialize() {
root?.querySelector("[data-signout]")?.addEventListener("click", async () => {
await fetch("/api/v1/auth/logout", { method: "POST", credentials: "include" });
- window.location.assign("https://viget.xsharp-lang.xyz/login/");
+ window.location.assign("https://viget.progmasoft.com/login/");
});
root?.querySelector("[data-token-open]")?.addEventListener("click", () => dialog?.showModal());
dialog?.querySelector("[data-token-close]")?.addEventListener("click", () => dialog?.close());
@@ -122,7 +122,7 @@ deleteForm?.addEventListener("submit", async (event) => {
showAlert("The account could not be deleted.", true);
return;
}
- window.location.replace("https://viget.xsharp-lang.xyz/?account=deleted");
+ window.location.replace("https://viget.progmasoft.com/?account=deleted");
});
tokenForm?.addEventListener("submit", async (event) => {
diff --git a/frontend/src/components/AuthPanel.astro b/frontend/src/components/AuthPanel.astro
index 9480562..96ad487 100644
--- a/frontend/src/components/AuthPanel.astro
+++ b/frontend/src/components/AuthPanel.astro
@@ -14,7 +14,7 @@ const copy = {
submit: "Next",
switchText: "New to the registry?",
switchLabel: "Create an account",
- switchHref: "https://viget.xsharp-lang.xyz/register/",
+ switchHref: "https://viget.progmasoft.com/register/",
},
register: {
title: "Create account",
@@ -22,7 +22,7 @@ const copy = {
submit: "Next",
switchText: "Already have an account?",
switchLabel: "Sign in",
- switchHref: "https://viget.xsharp-lang.xyz/login/",
+ switchHref: "https://viget.progmasoft.com/login/",
},
recover: {
title: "Recover account",
@@ -30,7 +30,7 @@ const copy = {
submit: "Send code",
switchText: "Remembered your password?",
switchLabel: "Sign in",
- switchHref: "https://viget.xsharp-lang.xyz/login/",
+ switchHref: "https://viget.progmasoft.com/login/",
},
} as const;
const content = copy[mode];
@@ -38,7 +38,7 @@ const content = copy[mode];
<main class="auth-main" data-auth-flow data-mode={mode}>
<section class="auth-card glass-panel">
- <a class="auth-brand" href="https://viget.xsharp-lang.xyz/" aria-label="Visual X# package registry">
+ <a class="auth-brand" href="https://viget.progmasoft.com/" aria-label="Visual X# package registry">
<img src="/xsharp-logo.webp" width="44" height="44" alt="" />
<span>Visual X# Registry</span>
</a>
@@ -99,7 +99,7 @@ const content = copy[mode];
<button class="auth-submit" type="submit">{mode === "register" ? "Create account" : "Sign in"}</button>
{
mode === "login" && (
- <a class="auth-recovery" href="https://viget.xsharp-lang.xyz/recover/">Forgot password?</a>
+ <a class="auth-recovery" href="https://viget.progmasoft.com/recover/">Forgot password?</a>
)
}
</div>
diff --git a/frontend/src/components/RepositoryHeader.astro b/frontend/src/components/RepositoryHeader.astro
index ac04dfa..4732ca4 100644
--- a/frontend/src/components/RepositoryHeader.astro
+++ b/frontend/src/components/RepositoryHeader.astro
@@ -12,20 +12,21 @@ const { authenticated = false } = Astro.props;
---
<header class="repository-header glass-panel">
- <a class="brand" href="https://viget.xsharp-lang.xyz/" aria-label="Visual X# package registry home">
+ <a class="brand" href="https://viget.progmasoft.com/" aria-label="Visual X# package registry home">
<img class="brand-mark" src="/xsharp-logo.webp" width="38" height="38" alt="" />
<span class="brand-name">Visual X#</span>
<span class="brand-channel">package registry</span>
</a>
<nav class="repository-navigation" aria-label="Registry navigation">
- <a href="https://viget.xsharp-lang.xyz/">Packages</a>
+ <a href="https://viget.progmasoft.com/">Packages</a>
+ <a href="https://viget.progmasoft.com/dslplugins/">DSL plugins</a>
{
authenticated ? (
- <a href="https://viget.xsharp-lang.xyz/dashboard/">Dashboard</a>
+ <a href="https://viget.progmasoft.com/dashboard/">Dashboard</a>
) : (
<>
- <a href="https://viget.xsharp-lang.xyz/login/">Log in</a>
- <a class="repository-register" href="https://viget.xsharp-lang.xyz/register/">Register</a>
+ <a href="https://viget.progmasoft.com/login/">Log in</a>
+ <a class="repository-register" href="https://viget.progmasoft.com/register/">Register</a>
</>
)
}
diff --git a/frontend/src/pages/index.astro b/frontend/src/pages/index.astro
index 642b4ea..742fdf5 100644
--- a/frontend/src/pages/index.astro
+++ b/frontend/src/pages/index.astro
@@ -63,7 +63,7 @@ const capabilities = [
</a>
<nav aria-label="Primary navigation">
<a href="#pipeline">Pipeline</a>
- <a href="https://viget.xsharp-lang.xyz/">Packages</a>
+ <a href="https://viget.progmasoft.com/">Packages</a>
<a href="https://github.com/Progmasoft/visual-xsharp/tree/main/Spec" target="_blank" rel="noreferrer">Specification</a>
<a class="nav-source" href="https://github.com/Progmasoft/visual-xsharp" target="_blank" rel="noreferrer">
<Icon name="github" />
diff --git a/frontend/src/pages/repo/dashboard/index.astro b/frontend/src/pages/repo/dashboard/index.astro
index a031a4a..a004b92 100644
--- a/frontend/src/pages/repo/dashboard/index.astro
+++ b/frontend/src/pages/repo/dashboard/index.astro
@@ -44,7 +44,7 @@ import SiteLayout from "../../../layouts/SiteLayout.astro";
<article class="dashboard-panel glass-panel">
<span>Published packages</span>
<strong>0</strong>
- <small>The registry does not contain public xspkg releases yet.</small>
+ <small>The registry does not contain public .vipkg releases yet.</small>
</article>
<article class="dashboard-panel glass-panel">
<span>Email status</span>
@@ -106,7 +106,7 @@ import SiteLayout from "../../../layouts/SiteLayout.astro";
<strong>Password</strong>
<span>Change your password through a verified recovery email.</span>
</div>
- <a class="button secondary glass-panel" href="https://viget.xsharp-lang.xyz/recover/">Reset password</a>
+ <a class="button secondary glass-panel" href="https://viget.progmasoft.com/recover/">Reset password</a>
</div>
</section>
</div>
diff --git a/frontend/src/pages/repo/dslplugins/index.astro b/frontend/src/pages/repo/dslplugins/index.astro
new file mode 100644
index 0000000..10eb985
--- /dev/null
+++ b/frontend/src/pages/repo/dslplugins/index.astro
@@ -0,0 +1,54 @@
+---
+// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+
+import Icon from "../../../components/Icon.astro";
+import RepositoryHeader from "../../../components/RepositoryHeader.astro";
+import SiteLayout from "../../../layouts/SiteLayout.astro";
+---
+
+<SiteLayout
+ title="DSL Plugins · ViGet Package Registry by Progmasoft"
+ description="The ViGet Kotlin DSL plugin catalog is online, but no plugins have been published yet."
+>
+ <section class="repository-surface">
+ <div class="ambient" aria-hidden="true">
+ <span class="ambient-orb ambient-orb-a"></span>
+ <span class="ambient-orb ambient-orb-b"></span>
+ </div>
+ <RepositoryHeader />
+ <main class="repository-main">
+ <div class="repository-status glass-panel">
+ <span class="repository-status-icon"><Icon name="modules" /></span>
+ DSL plugin catalog online
+ </div>
+ <p class="eyebrow">Kotlin DSL plugins</p>
+ <h1>No DSL plugins<br /><em>published yet.</em></h1>
+ <p class="repository-lede">
+ Kotlin DSL plugins are distributed as JAR artifacts under
+ <code>/dslplugins/&lt;Publisher&gt;/&lt;Name&gt;/</code>. The catalog is ready, but it does not contain any public
+ plugin releases yet.
+ </p>
+ <div class="repository-actions">
+ <a class="button primary" href="https://viget.progmasoft.com/">
+ Browse Visual X# packages
+ <Icon name="arrow" />
+ </a>
+ <a class="button secondary glass-panel" href="https://github.com/Progmasoft/visual-xsharp" target="_blank" rel="noreferrer">
+ Follow development
+ </a>
+ </div>
+ <div class="repository-note glass-panel">
+ <Icon name="terminal" />
+ <div>
+ <strong>Publishing is not available yet</strong>
+ <span>No placeholder artifacts or package identities are shown before real plugins are published.</span>
+ </div>
+ </div>
+ </main>
+ <footer class="repository-footer">
+ <span>viget.progmasoft.com/dslplugins</span>
+ <span>Kotlin DSL plugin catalog</span>
+ </footer>
+ </section>
+</SiteLayout>
diff --git a/frontend/src/pages/repo/index.astro b/frontend/src/pages/repo/index.astro
index 065ac27..014aa5b 100644
--- a/frontend/src/pages/repo/index.astro
+++ b/frontend/src/pages/repo/index.astro
@@ -41,12 +41,12 @@ import SiteLayout from "../../layouts/SiteLayout.astro";
<Icon name="terminal" />
<div>
<strong>Publishing is not available yet</strong>
- <span>The future registry will use the native Visual X# package format and verified package metadata.</span>
+ <span>Visual X# packages use .vipkg coordinates; Kotlin DSL plugins have a separate JAR catalog under /dslplugins.</span>
</div>
</div>
</main>
<footer class="repository-footer">
- <span>viget.xsharp-lang.xyz</span>
+ <span>viget.progmasoft.com</span>
<span>Package registry preview</span>
</footer>
</section>
diff --git a/ops/nginx/xsharp.conf b/ops/nginx/xsharp.conf
index 4fbf5b6..4216c68 100644
--- a/ops/nginx/xsharp.conf
+++ b/ops/nginx/xsharp.conf
@@ -31,16 +31,48 @@ server {
}
server {
+ listen 80;
+ listen [::]:80;
+ server_name viget.progmasoft.com;
+ server_tokens off;
+
+ location ^~ /.well-known/acme-challenge/ {
+ root /var/lib/letsencrypt;
+ default_type text/plain;
+ }
+
+ location / {
+ return 301 https://viget.progmasoft.com$request_uri;
+ }
+}
+
+server {
+ listen 80;
+ listen [::]:80;
+ server_name viget.xsharp-lang.xyz;
+ server_tokens off;
+
+ location ^~ /.well-known/acme-challenge/ {
+ root /var/lib/letsencrypt;
+ default_type text/plain;
+ }
+
+ location / {
+ return 308 https://viget.progmasoft.com$request_uri;
+ }
+}
+
+server {
listen 443 ssl;
listen [::]:443 ssl;
- server_name viget.xsharp-lang.xyz;
+ server_name viget.progmasoft.com;
root /srv/xsharp/website/current/frontend/repo;
index index.html;
server_tokens off;
- ssl_certificate /etc/letsencrypt/live/xsharp-lang.xyz/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/xsharp-lang.xyz/privkey.pem;
+ ssl_certificate /etc/letsencrypt/live/progmasoft.com/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/progmasoft.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
@@ -96,6 +128,21 @@ server {
server {
listen 443 ssl;
listen [::]:443 ssl;
+ server_name viget.xsharp-lang.xyz;
+ server_tokens off;
+
+ ssl_certificate /etc/letsencrypt/live/xsharp-lang.xyz/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/xsharp-lang.xyz/privkey.pem;
+ include /etc/letsencrypt/options-ssl-nginx.conf;
+ ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
+
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
+ return 308 https://viget.progmasoft.com$request_uri;
+}
+
+server {
+ listen 443 ssl;
+ listen [::]:443 ssl;
server_name www.xsharp-lang.xyz;
server_tokens off;