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

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLeitwolf112026-10-15 18:03:29 +0300
committerLeitwolf112026-10-15 18:03:29 +0300
commite0051b082ffce6e3cf066433980539c330d32181 (patch)
treeecb664dce4780a04c1fd924da99fa931ae3f1c2f
parentef68517d39fc329cf3286ad70056e00acf8b4855 (diff)
downloadwebsite-e0051b082ffce6e3cf066433980539c330d32181.tar.gz
Document tala.run, the documentation hosts and the ASP.NET Core API
- README, Architecture and Operations describe the three sites one build serves, their routes, the per-host sitemap and robots files, forum.tala.run, the permanent redirects of the former domain, and that tala.run has no ViGet host. - The backend sections describe the ASP.NET Core 10 API: how to build, test, run and publish it, its lock files, and its place on the server in current/site-api beside the legacy process of Progmaweb. - Development explains ?site=talac and ?site=tazel on a development host and lists the new test file; the release and rollback steps label current/site-api for SELinux as well. - The development server proxies /api to port 5086, the port the API uses unless PORT says otherwise.
-rw-r--r--Documents/ARCHITECTURE.md43
-rw-r--r--Documents/DEVELOPMENT.md46
-rw-r--r--Documents/OPERATIONS.md105
-rw-r--r--README.md53
-rw-r--r--frontend/vite.config.ts2
5 files changed, 127 insertions, 122 deletions
diff --git a/Documents/ARCHITECTURE.md b/Documents/ARCHITECTURE.md
index c11cfea..2521b49 100644
--- a/Documents/ARCHITECTURE.md
+++ b/Documents/ARCHITECTURE.md
@@ -8,32 +8,38 @@ anything about a visitor on a server.
| Part | Technology | Artifact | Serves |
| --- | --- | --- | --- |
-| `frontend/` | Vue 3, Vite, TypeScript | static files in `frontend/dist/` | `xsharp-lang.xyz` |
-| `backend/` | Kotlin on JVM 25, Spring Boot | one executable jar | `xsharp-lang.xyz/api/v1/site` |
-| `forum/` | one HTML page with plain CSS and JavaScript | the five files as they are | `forum.xsharp-lang.xyz` |
+| `frontend/` | Vue 3, Vite, TypeScript | static files in `frontend/dist/` | `tala.run`, `talac.tala.run`, `tazel.tala.run` |
+| `backend/` | ASP.NET Core 10 | one published application | `tala.run/api/v1/site` |
+| `forum/` | one HTML page with plain CSS and JavaScript | the five files as they are | `forum.tala.run` |
```text
browser
| HTTPS
v
Nginx
- |-- xsharp-lang.xyz static files of the Vue build; unknown paths fall back to index.html
- |-- xsharp-lang.xyz/api/v1/site -> http://127.0.0.1:5086 (Spring)
- |-- forum.xsharp-lang.xyz five named static files; every other path is 404
- `-- www, docs, spec, viget permanent redirects
+ |-- tala.run, talac.tala.run, tazel.tala.run static files of the Vue build; unknown paths fall back to index.html
+ |-- tala.run/api/v1/site -> http://127.0.0.1:5086 (ASP.NET Core)
+ |-- forum.tala.run five named static files; every other path is 404
+ |-- www.tala.run permanent redirect to tala.run
+ `-- xsharp-lang.xyz and its subdomains permanent redirects to tala.run, and viget to viget.progmasoft.com
```
## Frontend
-A single-page application with three routes, defined in `frontend/src/main.ts`:
+A single-page application that serves three sites. `site.ts` decides the site from the host name, and
+`frontend/src/main.ts` registers the routes of that site:
-| Route | Page | Source |
-| --- | --- | --- |
-| `/` | why the language exists, and its current state | `pages/HomePage.vue` |
-| `/docs/overview` | the design direction and the compiler stages | `pages/OverviewPage.vue` |
-| `/docs/getting-started` | building the compiler from its repository | `pages/GettingStartedPage.vue` |
-
-Any other path redirects to `/`. The router uses history URLs, so the server must answer unknown paths with
+| Host | Route | Page | Source |
+| --- | --- | --- | --- |
+| `tala.run` | `/` | why the language exists, and its current state | `pages/HomePage.vue` |
+| `tala.run` | `/docs/overview` | the design direction and the compiler stages | `pages/OverviewPage.vue` |
+| `tala.run` | `/docs/getting-started` | building the compiler from its repository | `pages/GettingStartedPage.vue` |
+| `tala.run` | `/docs/syntax` | a first look at the syntax | `content/syntax.ts` |
+| `talac.tala.run` | `/docs/command-line`, `/docs/outputs` | the compiler | `content/talac.ts` |
+| `tazel.tala.run` | `/docs/commands`, `/docs/project-file` | the build system | `content/tazel.ts` |
+
+The pages from `content/` are rendered by `pages/DocPage.vue`; each topic carries its text in all four languages. The
+root of the two documentation hosts opens their first topic. Any other path redirects to the root. The router uses history URLs, so the server must answer unknown paths with
`index.html`.
The rest of the frontend is small:
@@ -67,7 +73,7 @@ to the backend does not publish it.
## Forum page
-`forum.xsharp-lang.xyz` is a notice that the forum is not open yet. It is not a forum: there are no accounts, no
+`forum.tala.run` is a notice that the forum is not open yet. It is not a forum: there are no accounts, no
posts and no service behind it. The page shows its one notice in the language of the browser and offers a theme
button; it has no language menu and stores no language. It is marked `noindex` in the page and in the response
header.
@@ -80,13 +86,14 @@ allows only its own script, stylesheet and two images.
- **Accounts and packages.** Progmasoft accounts and the ViGet package registry belong to the Progmaweb repository
and live on `progmasoft.com` hosts. This site links to neither a sign-in nor a registry.
- **A legacy redirect only.** `viget.xsharp-lang.xyz` redirects permanently to `viget.progmasoft.com`, keeping path
- and query. That redirect is routing compatibility, not a feature of this site.
+ and query. That redirect is routing compatibility, not a feature of this site; tala.run has no ViGet host.
- **Visitor data.** The language and theme a visitor chose are kept in the browser's local storage. The site sets no
cookie and sends nothing about the visitor to the backend.
## Search engines and crawlers
-- `sitemap.xml` lists exactly the three routes above.
+- Each host has its own `sitemap.xml` and `robots.txt`; Nginx serves `public/hosts/talac/` and
+ `public/hosts/tazel/` for the two documentation hosts. A sitemap lists exactly the routes of its host.
- Every route has its own title, description and canonical URL. A language is a preference, not a second URL, so
there are no `hreflang` alternatives.
- `robots.txt` names the crawlers the site has a rule for. Search and answer-retrieval crawlers are allowed. Among
diff --git a/Documents/DEVELOPMENT.md b/Documents/DEVELOPMENT.md
index 4781e76..835ae05 100644
--- a/Documents/DEVELOPMENT.md
+++ b/Documents/DEVELOPMENT.md
@@ -9,8 +9,7 @@
| --- | --- | --- |
| Node.js | 22.18 or newer; CI uses 24 | the frontend and all JavaScript tests |
| npm | the one that ships with Node.js | frontend dependencies |
-| Temurin JDK | 25 | the backend |
-| Gradle | 9.6.0, the version CI installs | the backend build; the repository has no Gradle wrapper |
+| .NET SDK | 10, as `global.json` allows | the backend |
## Frontend
@@ -25,7 +24,9 @@ npm run build # type check and production build into dist/
```
`npm run format` rewrites the files Prettier checks. The development server proxies `/api` to
-`http://127.0.0.1:5080`, the default port of a locally started backend.
+`http://127.0.0.1:5086`, the default port of a locally started backend. A development host has no subdomains, so
+`?site=talac` or `?site=tazel` opens the documentation of the compiler or the build system; the choice lasts for the
+tab, and `?site=language` returns to the language site.
`.npmrc` refuses install scripts of dependencies that were not reviewed. A new dependency with an install script
fails `npm ci` until its exact version is allowed in `package.json`.
@@ -33,31 +34,21 @@ fails `npm ci` until its exact version is allowed in `package.json`.
## Backend
```text
-cd backend
-gradle test bootJar dokkaGenerate --no-daemon
-gradle bootRun --no-daemon # serves on 127.0.0.1:5080
+dotnet restore Progmasoft.Tala.Website.slnx --locked-mode
+dotnet build Progmasoft.Tala.Website.slnx --configuration Release --no-restore
+dotnet test --project backend/Progmasoft.Tala.Website.Api.Tests/Progmasoft.Tala.Website.Api.Tests.csproj --configuration Release --no-build
+dotnet run --project backend/Progmasoft.Tala.Website.Api # serves on 127.0.0.1:5086
```
-- `test` runs the Spring tests.
-- `bootJar` builds `build/libs/visual-xsharp-website-api-1.0.0.jar`.
-- `dokkaGenerate` builds the API documentation and is a gate: a public declaration without KDoc, a broken link or an
- unresolved reference fails the build.
+- The build treats warnings as errors and requires a documentation comment on every public declaration.
+- The tests run the endpoints in an in-memory host with xUnit v3 on Microsoft.Testing.Platform.
+- `PORT` changes the port; the service binds to loopback only.
-### Dependency locks and checksums
+### Dependency locks
-The backend pins every resolved version in `gradle.lockfile` and the SHA-256 of every downloaded file in
-`gradle/verification-metadata.xml`. After changing a dependency or a plugin, regenerate both and review the diff:
-
-```text
-gradle dependencies --write-locks --no-daemon
-gradle --refresh-dependencies --write-verification-metadata sha256 help test jacocoTestReport bootJar dokkaGenerate --no-daemon
-```
-
-`--refresh-dependencies` matters. With a warm local cache Gradle does not download every metadata file again and so
-does not record it; the build then passes locally and fails verification on a clean CI machine.
-
-A checksum is an integrity pin, not a trust review. Confirm the version and the repository of an artifact before
-accepting its checksum.
+Every project restores from its `packages.lock.json`, and CI restores with `--locked-mode`, so a resolved version
+cannot change unnoticed. After changing a package reference, run `dotnet restore Progmasoft.Tala.Website.slnx` and
+review the changed lock files.
## Forum page
@@ -78,13 +69,14 @@ All JavaScript tests run with `npm test` in `frontend/`.
| --- | --- |
| `locales.test.mjs` | the published locales, browser-language selection, the English fallback, that a stored choice wins, text direction, and when a change is remembered |
| `seo.test.mjs` | the title, description and canonical URL of every route in every language |
+| `sites.test.mjs` | which host is which site, links between the sites, the sidebars, that every topic is written in every language with the same code samples, and that the documentation teaches only the current command lines |
| `forum.test.mjs` | the notice in each language, the fallback, the absence of a language menu, and the theme button |
| `site-integrity.test.mjs` | sitemap and router agreement, forum non-indexing, logo and social image shape, absence of retired links, pinned workflow actions, and that the Nginx and systemd files agree with each other |
Two tests in `site-integrity.test.mjs` compare the site with a checkout of the compiler repository next to this one
and skip themselves when it is absent.
-The backend tests assert the content of `/api/v1/site`, the empty health response, that the API is read-only, and
+The API tests assert the content of `/api/v1/site`, the empty health response, that the API is read-only, and
that account and registry routes do not exist.
A change to a page is not verified by these tests alone. Look at it in a browser: all four languages, both themes, a
@@ -95,10 +87,10 @@ narrow window, and keyboard focus.
| Job | Enforces |
| --- | --- |
| `frontend` | `npm ci`, `npm audit` at moderate severity, type check, tests with coverage, format check, build |
-| `backend` | tests with coverage, the jar, and the Dokka documentation gate |
+| `backend` | locked restore, build with warnings as errors, tests with coverage, and the published application |
| `frontend-coverage`, `backend-coverage` | upload coverage to Codecov |
| `dependency-review` | reviews dependency changes of a pull request |
-| CodeQL | static analysis of the workflows, TypeScript and Kotlin |
+| CodeQL | static analysis of the workflows, TypeScript and C# |
Only the coverage jobs receive an OIDC token; the jobs that install and build do not, and pull requests from forks
skip the upload. Workflow actions are pinned to commit hashes, and a test fails when one is not.
diff --git a/Documents/OPERATIONS.md b/Documents/OPERATIONS.md
index 72ab09a..f486d13 100644
--- a/Documents/OPERATIONS.md
+++ b/Documents/OPERATIONS.md
@@ -3,7 +3,8 @@
# Tala website operations
-This runbook covers only the language website and its not-yet-open forum page.
+This runbook covers only the language website, the documentation sites of the
+compiler and the build system, and the not-yet-open forum page.
The account site, corporate site, and package service have their own repositories
and deployments. A redirect from an old package hostname is retained for
compatibility, but it does not make package functions part of this website.
@@ -12,22 +13,28 @@ compatibility, but it does not make package functions part of this website.
| Host and path | Owner | Current treatment |
| --- | --- | --- |
-| `xsharp-lang.xyz/` | Vue language site | Live |
-| `xsharp-lang.xyz/docs/overview` | Vue language site | Live |
-| `xsharp-lang.xyz/docs/getting-started` | Vue language site | Live |
-| `xsharp-lang.xyz/api/v1/site` | Spring language API | Live; the only proxied API path |
-| `forum.xsharp-lang.xyz/` | Static placeholder | Live; noindex |
-| `www`, `docs`, `spec` subdomains | Redirect | Permanent redirect to `xsharp-lang.xyz` |
-| `viget.xsharp-lang.xyz/*` | Legacy redirect | Permanent redirect to the new package host |
-
-The main domain is served with `ops/nginx/xsharp.conf`. While it is switched to
-`ops/nginx/xsharp-maintenance.conf`, the three language routes answer 503 and
-`/api/v1/site` is not exposed.
+| `tala.run/`, `/docs/overview`, `/docs/getting-started`, `/docs/syntax` | Vue language site | Live |
+| `talac.tala.run/docs/*` | Vue build, compiler documentation | Live |
+| `tazel.tala.run/docs/*` | Vue build, build-system documentation | Live |
+| `tala.run/api/v1/site` | ASP.NET Core language API | Live; the only proxied API path |
+| `forum.tala.run/` | Static placeholder | Live; noindex |
+| `www.tala.run` | Redirect | Permanent redirect to `tala.run` |
+| `xsharp-lang.xyz`, `www`, `docs`, `spec` | Former domain | Permanent redirect to the same path of `tala.run` |
+| `forum.xsharp-lang.xyz` | Former domain | Permanent redirect to `forum.tala.run` |
+| `viget.xsharp-lang.xyz/*` | Legacy redirect | Permanent redirect to the package host |
+
+tala.run has no ViGet host; the registry lives at `viget.progmasoft.com`.
+
+The sites are served with `ops/nginx/tala.conf`. While it is switched to
+`ops/nginx/tala-maintenance.conf`, the routes of the three sites answer 503 and
+`/api/v1/site` is not exposed. One certificate, `/etc/letsencrypt/live/tala.run/`,
+covers tala.run, www.tala.run, talac.tala.run, tazel.tala.run and forum.tala.run;
+the former domain keeps its own certificates for its redirects.
Do not use a catch-all `/api/` proxy for this service. The production Nginx
configuration proxies exactly `/api/v1/site`; other `/api/` paths return 404.
-The Spring process binds only to `127.0.0.1`. Local runs default to port 5080;
-the checked-in systemd unit sets `PORT=5086`, matching the Nginx proxy.
+The API process binds only to `127.0.0.1`, on port 5086 unless `PORT` says
+otherwise; the checked-in systemd unit sets `PORT=5086`, matching the Nginx proxy.
Its `/health` endpoint is for local process checks, not an advertised public
route.
@@ -43,34 +50,21 @@ npm test
npm run build
```
-Run the backend gates from `backend/` with Temurin JDK 25:
+Run the backend gates from the repository root with the .NET 10 SDK:
```text
-gradle test bootJar dokkaGenerate --no-daemon
+dotnet restore Progmasoft.Tala.Website.slnx --locked-mode
+dotnet build Progmasoft.Tala.Website.slnx --configuration Release --no-restore
+dotnet test --project backend/Progmasoft.Tala.Website.Api.Tests/Progmasoft.Tala.Website.Api.Tests.csproj --configuration Release --no-build
+dotnet publish backend/Progmasoft.Tala.Website.Api/Progmasoft.Tala.Website.Api.csproj --configuration Release --output publish
```
-`dokkaGenerate` is the documentation gate: a public declaration without KDoc
-fails it.
-
-The backend checks in Gradle dependency locks and SHA-256 verification metadata
-to keep transitive versions and downloaded artifacts stable. When intentionally
-updating dependencies, run these commands from `backend/`, review both generated
-files, then rerun the ordinary backend gates:
-
-```text
-gradle dependencies --write-locks --no-daemon
-gradle --refresh-dependencies --write-verification-metadata sha256 help test jacocoTestReport bootJar dokkaGenerate --no-daemon
-```
-
-Keep `--refresh-dependencies`. Written from a warm local cache, the metadata
-misses files that Gradle did not download again, and the build then fails
-verification on a clean machine while it passes locally.
-
-Do not accept a checksum-only change without confirming the artifact version
-and source repository; the checksum is an integrity pin, not a trust review.
+The build is the documentation gate: a public declaration without its
+documentation comment fails it. Package versions are pinned in the
+`packages.lock.json` of each project.
The frontend tests assert canonical metadata, sitemap membership, asset shape,
-forum non-indexing, and the absence of retired site links. The Spring tests
+forum non-indexing, and the absence of retired site links. The API tests
assert site-only API behavior, health, read-only operation, and missing account
and registry routes. These gates are necessary but not a substitute for a
browser review of both themes, all four languages, and narrow screens.
@@ -96,8 +90,7 @@ Before publication, verify that:
All source links should target the current `Progmasoft/tala` default
branch. In particular, check the `Spec/`, `Documents/BUILDING.md`,
`Documents/CLI.md`, and `Examples/` targets after any repository move.
-The only frontend navigation routes are `/`, `/docs/overview`, and
-`/docs/getting-started`. A retired login, registration, or package route must
+The routes of each site are listed in the route table above. A retired login, registration, or package route must
not reappear in the site shell.
The forum placeholder links back to the language domain and to the compiler
@@ -146,23 +139,26 @@ On the server the site lives in one directory:
current/
frontend/ contents of frontend/dist
forum/ the five forum files
- backend/ the Spring jar, next to the files of the legacy process
+ site-api/ the published ASP.NET Core API
+ backend/ the legacy .NET process of Progmaweb's ViGet status route
previous-<timestamp>/ the release before, kept for rollback
```
`current` is a real directory, not a symbolic link. A release replaces it by
renaming:
-1. Build the frontend and the jar from the commit being released, and run the
- local gates.
+1. Build the frontend and publish the API from the commit being released, and
+ run the local gates.
2. On the server, copy `current` to a new directory next to it with
`cp -a`, which keeps owners, modes and SELinux labels, and replace the
changed parts inside the copy.
-3. Start the new jar on a free loopback port as the service user, request
+3. Start the new API on a free loopback port as the service user with
+ `PORT=<port> dotnet site-api/Progmasoft.Tala.Website.Api.dll`, request
`/health` and `/api/v1/site`, and stop it.
4. Rename `current` to `previous-<timestamp>` and the new directory to
`current`.
-5. Run `restorecon -R` on `current/frontend` and `current/forum`.
+5. Run `restorecon -R` on `current/frontend`, `current/forum` and
+ `current/site-api`.
6. Restart the API service, then check the public routes from outside.
Step 5 has to come after step 4. The SELinux rules that let Nginx read the
@@ -178,8 +174,8 @@ on the server itself before concluding that a release failed.
## Maintenance mode
-`ops/nginx/xsharp-maintenance.conf` answers the main domain with 503 and keeps
-the legacy redirect working. `ops/nginx/xsharp.conf` serves the site. Keep the
+`ops/nginx/tala-maintenance.conf` answers the three sites with 503 and keeps
+the legacy redirect working. `ops/nginx/tala.conf` serves them. Keep the
two mutually exclusive in the live Nginx include directory. Building the Vue
bundle or deploying the forum does not by itself authorize switching between
them.
@@ -196,14 +192,14 @@ Before switching the main site from maintenance to public:
5. Run both build/test sets shown above.
6. Install the Vue `dist/` contents at the static root named in the Nginx
config, preserving file permissions and SELinux labels.
-7. Install Java 25 on the host and test the Spring jar on loopback before
- replacing any running API service.
+7. Test the published API on loopback with the shared ASP.NET Core 10 runtime
+ before replacing the running API service.
8. Confirm the old service's unrelated status function has moved to the
correct owner before retiring the old process.
9. Make one explicit Nginx configuration switch, run `nginx -t`, and reload.
10. Check the public routes and headers again from outside the server.
-The Java service is not required for the static homepage render. If it is
+The API service is not required for the static homepage render. If it is
not ready, do not pretend it is ready by rewriting the API path. Delay the
rollout or explicitly publish static pages without the API after reviewing
the impact of that decision.
@@ -212,8 +208,8 @@ the impact of that decision.
The redirect hostname is intentionally split from the maintenance vhost.
Requests to `viget.xsharp-lang.xyz` must produce 308 to
-`https://viget.progmasoft.com` and preserve path and query string. This is
-true while `xsharp-lang.xyz` itself returns 503. The redirect certificate
+`https://viget.progmasoft.com` and preserve path and query string, also while
+the sites answer 503. The redirect certificate
uses the existing SAN entry for the old hostname. Do not remove the redirect
in the course of cleaning up language-site copy.
@@ -233,7 +229,7 @@ confirms the expected 503. The forum and legacy redirect should remain
unaffected.
Do not roll back by deleting certificates, disabling SELinux, or pointing
-unrelated hostnames at the language frontend. If the Spring process fails,
+unrelated hostnames at the language frontend. If the API process fails,
inspect its systemd journal and local `/health` response, then restore the
previous service unit or leave the site in maintenance until the owner
boundary is clear.
@@ -250,7 +246,7 @@ Neither the static site nor the forum placeholder should send personal data
to a third-party analytics service. The content security policy allows
same-origin scripts only, so a script added by an intermediary is blocked by
the browser rather than run. Theme and language preferences are kept
-locally in the browser. Nginx and Spring logs still need normal retention
+locally in the browser. Nginx and API logs still need normal retention
and access-control practices, but this repository does not define an account
database or a user profile store.
@@ -259,8 +255,9 @@ database or a user profile store.
After a release, perform the same checks from a clean browser profile with no
saved language or theme choice. Confirm that the theme is dark and that the
language is the browser's when it is one of the four, and English otherwise.
-Choose another language in the menu, navigate through both documentation
-routes, and confirm the choice persists. Choose Hebrew and confirm that text
+Choose another language in the menu, navigate through the documentation
+routes of all three sites, and confirm the choice persists on each host; a
+choice is kept per host, because the browser keeps storage per origin. Choose Hebrew and confirm that text
runs right to left while the layout and the code blocks stay as they are.
Switch to light mode and repeat. The forum keeps its own theme key and follows
the browser language; it should not change the main site's settings.
diff --git a/README.md b/README.md
index f8220d7..667d927 100644
--- a/README.md
+++ b/README.md
@@ -5,19 +5,28 @@ SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Gr
# Tala website
-This repository owns the public language website at [xsharp-lang.xyz](https://xsharp-lang.xyz). It does not own
+This repository owns the public language website at [tala.run](https://tala.run) and the documentation of the
+compiler and the build system at [talac.tala.run](https://talac.tala.run) and [tazel.tala.run](https://tazel.tala.run).
+It does not own
Progmasoft's corporate or account sites. Tala uses its own supplied purple leopard SVG identity;
the Progmasoft mark is a different brand.
## Routes
-- `/` answers why Tala exists and gives an honest implementation-status caveat.
-- `/docs/overview` explains the design direction.
-- `/docs/getting-started` links the real compiler checkout and toolchain.
-- `forum.xsharp-lang.xyz` is a standalone informational page. It is *not* a forum service; accounts and posts do not exist
+One frontend build serves three sites and picks its pages from the host name:
+
+- `tala.run/` answers why Tala exists and gives an honest implementation-status caveat; `tala.run/docs/overview`
+ explains the design direction, `tala.run/docs/getting-started` links the real compiler checkout and toolchain, and
+ `tala.run/docs/syntax` gives a first look at the syntax from the public specification.
+- `talac.tala.run/docs/command-line` and `talac.tala.run/docs/outputs` document the compiler.
+- `tazel.tala.run/docs/commands` and `tazel.tala.run/docs/project-file` document the build system.
+- `forum.tala.run` is a standalone informational page. It is *not* a forum service; accounts and posts do not exist
there yet. It stays noindex until a real community forum is launched.
-The site is public and served with `ops/nginx/xsharp.conf`. `ops/nginx/xsharp-maintenance.conf` remains in the
+Every path of the former domain, `xsharp-lang.xyz`, redirects permanently to the same path of `tala.run`. tala.run has
+no ViGet host; the registry lives at `viget.progmasoft.com`.
+
+The sites are public and served with `ops/nginx/tala.conf`. `ops/nginx/tala-maintenance.conf` remains in the
repository as the configuration to fall back to when the main domain has to be taken offline. The forum page is
deployed independently of the main site. See the [operations runbook](Documents/OPERATIONS.md) for the route and
release boundaries.
@@ -50,29 +59,29 @@ npm run dev
```
The production artifact is `frontend/dist/`. Deploy its *contents* to the static root named
-`/srv/xsharp/website/current/frontend/` in `ops/nginx/xsharp.conf`. Vue Router history URLs require the Nginx
-`try_files ... /index.html` fallback. The sitemap lists only the three canonical language pages; forum remains noindex.
+`/srv/xsharp/website/current/frontend/` in `ops/nginx/tala.conf`. Vue Router history URLs require the Nginx
+`try_files ... /index.html` fallback. Each site has its own sitemap and robots file; the forum remains noindex. On a
+development host, `?site=talac` or `?site=tazel` selects the documentation site.
## Backend
-The small language-site API is Kotlin/JVM 25 and Spring Boot 4.1.1. Its package root is
-`com.progmasoft.visual.xsharp.website`. It exposes `/api/v1/site` for the website's own public state and `/health`
-for the local service manager. It has no account, package, publication, or registry endpoints. Progmaweb owns those
-separate services and uses Next.js with ASP.NET Core 10; neither that stack nor its status API belongs in this repository.
+The small language-site API is ASP.NET Core 10, `backend/Progmasoft.Tala.Website.Api`, under the namespace
+`Progmasoft.Tala.Website`. It exposes `/api/v1/site` for the website's own public state and `/health` for the local
+service manager. It has no account, package, publication, or registry endpoints; Progmaweb owns those separate
+services.
```text
-cd backend
-gradle test bootJar dokkaGenerate
+dotnet restore Progmasoft.Tala.Website.slnx --locked-mode
+dotnet build Progmasoft.Tala.Website.slnx --configuration Release --no-restore
+dotnet test --project backend/Progmasoft.Tala.Website.Api.Tests/Progmasoft.Tala.Website.Api.Tests.csproj --configuration Release --no-build
+dotnet publish backend/Progmasoft.Tala.Website.Api/Progmasoft.Tala.Website.Api.csproj --configuration Release --output publish
```
-`dokkaGenerate` builds the API documentation and fails on a public declaration without KDoc, so the backend's
-documentation cannot fall behind its code.
-
-The jar is built under `backend/build/libs/`. The server unit in `ops/systemd/xsharp-site-api.service` expects it at
-`/srv/xsharp/website/current/backend/visual-xsharp-website-api-1.0.0.jar` and binds it only to loopback port 5086.
-The old .NET process remains on loopback port 5080 solely because Progmaweb's temporary ViGet status route still
-depends on it; the language site does not proxy to that process. Migrate the ViGet route within Progmaweb before
-retiring the old process. The server needs a Java 25 runtime. Committing these files alone does not deploy them.
+The build treats warnings as errors and requires a documentation comment on every public declaration. The server unit
+in `ops/systemd/tala-site-api.service` runs the published DLL from `/srv/xsharp/website/current/site-api/` on the
+shared ASP.NET Core 10 runtime and binds it only to loopback port 5086. The old .NET process on loopback port 5080 in
+`current/backend/` belongs to Progmaweb's ViGet status route; the language site does not proxy to it. Committing these
+files alone does not deploy them.
## Links and language accuracy
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index b1fcbb7..8db39da 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -6,5 +6,5 @@ import vue from "@vitejs/plugin-vue";
export default defineConfig({
plugins: [vue()],
- server: { proxy: { "/api": "http://127.0.0.1:5080" } },
+ server: { proxy: { "/api": "http://127.0.0.1:5086" } },
});