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

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLeitwolf112026-11-09 01:18:34 +0300
committerLeitwolf112026-11-09 01:18:34 +0300
commitc0bafe9050161ea6ca0c49f54897f908ca16ce84 (patch)
tree7496e782c0a82a9ff5ea9b59b85e3607fd7794d6
parent66f3cc196a9b91d471a90e021b12630100181c4a (diff)
parent3ac256e69f10a3bb78d394c77d03a88a72261597 (diff)
downloadprogmaweb-c0bafe9050161ea6ca0c49f54897f908ca16ce84.tar.gz
Merge remote-tracking branch 'origin/main' into security/cloudflare-real-ipsecurity/cloudflare-real-ip
-rw-r--r--apps/web/app/ides/layout.tsx11
-rw-r--r--apps/web/app/ides/page.tsx53
-rw-r--r--apps/web/app/ides/xide/page.tsx93
-rw-r--r--apps/web/lib/product-sites.ts174
-rw-r--r--apps/web/lib/products.ts63
-rw-r--r--apps/web/lib/sites.ts9
-rw-r--r--apps/web/proxy.ts3
-rw-r--r--apps/web/tests/sites.test.mjs9
-rw-r--r--ops/README.md3
-rw-r--r--ops/nginx/progmaweb.conf50
10 files changed, 13 insertions, 455 deletions
diff --git a/apps/web/app/ides/layout.tsx b/apps/web/app/ides/layout.tsx
deleted file mode 100644
index 8b1c6b7..0000000
--- a/apps/web/app/ides/layout.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
-
-import type { ReactNode } from "react";
-import "../site.css";
-
-export default function IdesLayout({
- children,
-}: Readonly<{ children: ReactNode }>) {
- return children;
-}
diff --git a/apps/web/app/ides/page.tsx b/apps/web/app/ides/page.tsx
deleted file mode 100644
index 3a832a8..0000000
--- a/apps/web/app/ides/page.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
-
-import type { Metadata } from "next";
-import { Footer } from "@/components/Footer";
-import { SiteHeader } from "@/components/SiteHeader";
-import { getLocale } from "@/lib/locale.server";
-import { forwardArrow } from "@/lib/localization";
-import { getCatalogMessages, products } from "@/lib/products";
-import { getSitesMessages } from "@/lib/product-sites";
-
-export async function generateMetadata(): Promise<Metadata> {
- const { ides } = getSitesMessages(await getLocale());
- return {
- title: ides.title,
- description: ides.description,
- alternates: { canonical: "https://ides.progmasoft.com/" },
- };
-}
-
-/** ides.progmasoft.com: the development environments of Progmasoft. */
-export default async function IdesPage() {
- const locale = await getLocale();
- const { ides } = getSitesMessages(locale);
- const xide = getCatalogMessages(locale).products.xide;
- return (
- <div className="pm-page">
- <SiteHeader locale={locale} />
- <main>
- <section className="pm-hero">
- <div className="pm-shell pm-product-hero">
- <h1>{ides.title}</h1>
- <p className="pm-lede">{ides.description}</p>
- </div>
- </section>
- <section className="pm-section">
- <div className="pm-shell pm-product-grid">
- <a className="pm-card pm-product-card" href="/xide">
- <span className={`pm-accent pm-accent-${products.xide.accent}`} />
- <span className="pm-tag">{xide.category}</span>
- <h3>{products.xide.name}</h3>
- <p>{xide.tagline}</p>
- <span className="pm-more">
- {ides.open} {forwardArrow(locale)}
- </span>
- </a>
- </div>
- </section>
- </main>
- <Footer locale={locale} />
- </div>
- );
-}
diff --git a/apps/web/app/ides/xide/page.tsx b/apps/web/app/ides/xide/page.tsx
deleted file mode 100644
index 86022e0..0000000
--- a/apps/web/app/ides/xide/page.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
-
-import type { Metadata } from "next";
-import { Footer } from "@/components/Footer";
-import { SiteHeader } from "@/components/SiteHeader";
-import { getLocale } from "@/lib/locale.server";
-import { products } from "@/lib/products";
-import { getSitesMessages } from "@/lib/product-sites";
-
-export async function generateMetadata(): Promise<Metadata> {
- const { xide } = getSitesMessages(await getLocale());
- return {
- title: `Xide · ${xide.tagline}`,
- description: xide.description,
- alternates: { canonical: "https://ides.progmasoft.com/xide" },
- };
-}
-
-/** ides.progmasoft.com/xide: the site of Xide. */
-export default async function XidePage() {
- const locale = await getLocale();
- const { xide, common } = getSitesMessages(locale);
- return (
- <div className="pm-page">
- <SiteHeader locale={locale} />
- <main>
- <section className="pm-hero">
- <div className="pm-shell pm-hero-inner">
- <div>
- <p className="eyebrow">{xide.eyebrow}</p>
- <h1>
- Xide <span>{xide.tagline}</span>
- </h1>
- <p className="pm-lede">{xide.description}</p>
- <div className="pm-actions">
- <a className="button" href={products.xide.source}>
- {common.source}
- </a>
- <a
- className="button button-secondary"
- href="https://product.progmasoft.com/xide"
- >
- {common.productPage}
- </a>
- </div>
- </div>
- <aside className="pm-aside">
- <span className="pm-tag">{common.status}</span>
- <p>{xide.status}</p>
- </aside>
- </div>
- </section>
-
- <section className="pm-section">
- <div className="pm-shell">
- <div className="pm-heading">
- <h2>{xide.layoutTitle}</h2>
- </div>
- <div className="pm-bento">
- {xide.layout.map(([title, description]) => (
- <article className="pm-card" key={title}>
- <h3>{title}</h3>
- <p>{description}</p>
- </article>
- ))}
- </div>
- </div>
- </section>
-
- <section className="pm-section pm-section-muted">
- <div className="pm-shell pm-detail">
- <div className="pm-heading">
- <h2>{xide.languagesTitle}</h2>
- <p>{xide.languagesDescription}</p>
- </div>
- <div>
- <div className="pm-heading">
- <h2>{xide.architectureTitle}</h2>
- </div>
- <ul className="pm-features">
- {xide.architecture.map((item) => (
- <li key={item}>{item}</li>
- ))}
- </ul>
- </div>
- </div>
- </section>
- </main>
- <Footer locale={locale} />
- </div>
- );
-}
diff --git a/apps/web/lib/product-sites.ts b/apps/web/lib/product-sites.ts
index f88ecda..d6c5af3 100644
--- a/apps/web/lib/product-sites.ts
+++ b/apps/web/lib/product-sites.ts
@@ -4,9 +4,8 @@
import type { Locale } from "./localization";
/**
- * The text of the product sites Progmaweb serves itself: ides.progmasoft.com
- * (with Xide at /xide) and catch3.progmasoft.com. The facts follow the
- * READMEs and documentation of the product repositories.
+ * The text of the product site Progmaweb serves itself, catch3.progmasoft.com.
+ * The facts follow the READMEs and documentation of the product repositories.
*/
interface SitesMessages {
common: {
@@ -14,23 +13,6 @@ interface SitesMessages {
productPage: string;
status: string;
};
- ides: {
- title: string;
- description: string;
- open: string;
- };
- xide: {
- eyebrow: string;
- tagline: string;
- description: string;
- status: string;
- layoutTitle: string;
- layout: [title: string, description: string][];
- languagesTitle: string;
- languagesDescription: string;
- architectureTitle: string;
- architecture: string[];
- };
catch3: {
eyebrow: string;
tagline: string;
@@ -51,44 +33,6 @@ export const sitesMessages: Record<Locale, SitesMessages> = {
productPage: "Product page",
status: "Status",
},
- ides: {
- title: "Progmasoft IDEs",
- description:
- "Development environments by Progmasoft, built around the Tala tools and the languages next to them.",
- open: "Open",
- },
- xide: {
- eyebrow: "Progmasoft IDEs",
- tagline: "The planned IDE for Tala.",
- description:
- "Xide is an integrated development environment written in Kotlin with Compose Multiplatform. It brings the editor, the project and the Tala compiler's diagnostics into one window.",
- status:
- "Early work: Xide is not ready for daily use. Today it lays the foundation that keeps the architecture coherent.",
- layoutTitle: "A familiar layout",
- layout: [
- [
- "Project",
- "Open a folder as a tree; directories load one level at a time and symbolic links are never followed.",
- ],
- [
- "Editor",
- "A tab per document, line numbers, a marker on each line with a problem, and no silent closing of modified files.",
- ],
- [
- "Problems",
- "Diagnostics bound to the exact document version that was checked; results that went stale are dropped.",
- ],
- ],
- languagesTitle: "Languages",
- languagesDescription:
- "Tala, Kotlin, Java, Groovy and Python open, edit and save, with syntax colouring for all five. Checking is connected for Tala: Xide runs talac and reads its structured diagnostics instead of scraping terminal text.",
- architectureTitle: "Architecture",
- architecture: [
- "Kotlin/JVM components with a Compose Multiplatform desktop interface",
- "A minimized Java runtime ships with Xide; no separate JDK to install",
- "Extensions are Kotlin/JVM JARs loaded from the extension directory",
- ],
- },
catch3: {
eyebrow: "Progmasoft Catch3",
tagline: "C++ testing beyond assertions.",
@@ -141,44 +85,6 @@ export const sitesMessages: Record<Locale, SitesMessages> = {
productPage: "Produktseite",
status: "Status",
},
- ides: {
- title: "Progmasoft-IDEs",
- description:
- "Entwicklungsumgebungen von Progmasoft, gebaut um die Tala-Werkzeuge und die Sprachen daneben.",
- open: "Öffnen",
- },
- xide: {
- eyebrow: "Progmasoft-IDEs",
- tagline: "Die geplante IDE für Tala.",
- description:
- "Xide ist eine integrierte Entwicklungsumgebung in Kotlin mit Compose Multiplatform. Sie vereint Editor, Projekt und die Diagnosen des Tala-Compilers in einem Fenster.",
- status:
- "Frühes Stadium: Xide ist noch nicht für den täglichen Einsatz bereit. Derzeit entsteht das Fundament, das die Architektur zusammenhält.",
- layoutTitle: "Eine vertraute Anordnung",
- layout: [
- [
- "Projekt",
- "Einen Ordner als Baum öffnen; Verzeichnisse laden Ebene für Ebene, symbolischen Links wird nie gefolgt.",
- ],
- [
- "Editor",
- "Ein Tab pro Dokument, Zeilennummern, eine Markierung an jeder Zeile mit einem Problem und kein stilles Schließen geänderter Dateien.",
- ],
- [
- "Probleme",
- "Diagnosen gehören genau zu der geprüften Dokumentversion; veraltete Ergebnisse werden verworfen.",
- ],
- ],
- languagesTitle: "Sprachen",
- languagesDescription:
- "Tala, Kotlin, Java, Groovy und Python lassen sich öffnen, bearbeiten und speichern, alle fünf mit Syntaxhervorhebung. Die Prüfung ist für Tala angebunden: Xide startet talac und liest seine strukturierten Diagnosen, statt Terminaltext auszuwerten.",
- architectureTitle: "Architektur",
- architecture: [
- "Kotlin/JVM-Komponenten mit einer Desktop-Oberfläche in Compose Multiplatform",
- "Xide bringt eine minimierte Java-Laufzeit mit; kein separates JDK nötig",
- "Erweiterungen sind Kotlin/JVM-JARs aus dem Erweiterungsverzeichnis",
- ],
- },
catch3: {
eyebrow: "Progmasoft Catch3",
tagline: "C++-Tests jenseits von Assertions.",
@@ -231,44 +137,6 @@ export const sitesMessages: Record<Locale, SitesMessages> = {
productPage: "Страница продукта",
status: "Статус",
},
- ides: {
- title: "Среды разработки Progmasoft",
- description:
- "Среды разработки Progmasoft, построенные вокруг инструментов Tala и соседних языков.",
- open: "Открыть",
- },
- xide: {
- eyebrow: "Среды разработки Progmasoft",
- tagline: "Будущая среда разработки для Tala.",
- description:
- "Xide — интегрированная среда разработки на Kotlin и Compose Multiplatform. Она объединяет редактор, проект и диагностику компилятора Tala в одном окне.",
- status:
- "Ранняя стадия: Xide ещё не готова к повседневной работе. Сейчас закладывается основа, которая сохраняет архитектуру цельной.",
- layoutTitle: "Привычная компоновка",
- layout: [
- [
- "Проект",
- "Папка открывается деревом; каталоги загружаются по одному уровню, по символическим ссылкам переход не выполняется.",
- ],
- [
- "Редактор",
- "Вкладка на каждый документ, номера строк, отметка у каждой строки с проблемой и никакого тихого закрытия изменённых файлов.",
- ],
- [
- "Проблемы",
- "Диагностика привязана к той версии документа, которая проверялась; устаревшие результаты отбрасываются.",
- ],
- ],
- languagesTitle: "Языки",
- languagesDescription:
- "Tala, Kotlin, Java, Groovy и Python открываются, редактируются и сохраняются, все пять — с подсветкой синтаксиса. Проверка подключена для Tala: Xide запускает talac и читает его структурированную диагностику, а не разбирает текст терминала.",
- architectureTitle: "Архитектура",
- architecture: [
- "Компоненты на Kotlin/JVM с настольным интерфейсом на Compose Multiplatform",
- "Вместе с Xide поставляется минимальная среда Java; отдельный JDK не нужен",
- "Расширения — это JAR для Kotlin/JVM из каталога расширений",
- ],
- },
catch3: {
eyebrow: "Progmasoft Catch3",
tagline: "Тестирование C++ за пределами утверждений.",
@@ -321,44 +189,6 @@ export const sitesMessages: Record<Locale, SitesMessages> = {
productPage: "דף המוצר",
status: "מצב",
},
- ides: {
- title: "סביבות הפיתוח של Progmasoft",
- description:
- "סביבות פיתוח של Progmasoft, שנבנות סביב כלי Tala והשפות שלצידם.",
- open: "לפתוח",
- },
- xide: {
- eyebrow: "סביבות הפיתוח של Progmasoft",
- tagline: "סביבת הפיתוח המתוכננת ל־Tala.",
- description:
- "Xide היא סביבת פיתוח משולבת שנכתבת ב־Kotlin עם Compose Multiplatform. היא מביאה את העורך, הפרויקט והאבחונים של מהדר Tala לחלון אחד.",
- status:
- "שלב מוקדם: Xide עדיין לא מוכנה לשימוש יומיומי. כרגע נבנה הבסיס ששומר על ארכיטקטורה עקבית.",
- layoutTitle: "פריסה מוכרת",
- layout: [
- [
- "פרויקט",
- "פתיחת תיקייה כעץ; תיקיות נטענות רמה אחר רמה, וקישורים סימבוליים לא נעקבים לעולם.",
- ],
- [
- "עורך",
- "לשונית לכל מסמך, מספרי שורות, סימון בכל שורה עם בעיה, ואין סגירה שקטה של קבצים שהשתנו.",
- ],
- [
- "בעיות",
- "האבחונים קשורים לגרסת המסמך המדויקת שנבדקה; תוצאות שהתיישנו נזרקות.",
- ],
- ],
- languagesTitle: "שפות",
- languagesDescription:
- "Tala,‏ Kotlin,‏ Java,‏ Groovy ו־Python נפתחות, נערכות ונשמרות, כולן עם צביעת תחביר. הבדיקה מחוברת ל־Tala: ‏Xide מריצה את talac וקוראת את האבחונים המובנים שלו במקום לפענח טקסט מהמסוף.",
- architectureTitle: "ארכיטקטורה",
- architecture: [
- "רכיבי Kotlin/JVM עם ממשק לשולחן העבודה ב־Compose Multiplatform",
- "סביבת Java מצומצמת מגיעה עם Xide; אין צורך להתקין JDK נפרד",
- "הרחבות הן קובצי JAR של Kotlin/JVM מתיקיית ההרחבות",
- ],
- },
catch3: {
eyebrow: "Progmasoft Catch3",
tagline: "בדיקות C++‎ מעבר לטענות.",
diff --git a/apps/web/lib/products.ts b/apps/web/lib/products.ts
index db7a08f..4fe8dfd 100644
--- a/apps/web/lib/products.ts
+++ b/apps/web/lib/products.ts
@@ -13,7 +13,6 @@ export const productSlugs = [
"talafmt",
"talalint",
"tazel",
- "xide",
"catch3",
] as const;
export type ProductSlug = (typeof productSlugs)[number];
@@ -62,12 +61,6 @@ export const products: Record<ProductSlug, ProductFacts> = {
source: "https://github.com/Progmasoft/tazel",
accent: "orange",
},
- xide: {
- name: "Xide",
- site: "https://ides.progmasoft.com/xide",
- source: "https://github.com/Progmasoft/xide",
- accent: "slate",
- },
catch3: {
name: "Catch3",
site: "https://catch3.progmasoft.com/",
@@ -101,7 +94,7 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"en-US": {
metadataTitle: "Products",
metadataDescription:
- "The products of Progmasoft: the Tala language and its tools, the Xide IDE and the Catch3 testing toolkit.",
+ "The products of Progmasoft: the Tala language with its tools, and the Catch3 testing toolkit.",
eyebrow: "Progmasoft products",
title: "Products",
description:
@@ -172,18 +165,6 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"Extensible with DSL plugins",
],
},
- xide: {
- category: "Integrated development environment",
- tagline: "The planned IDE for Tala.",
- description:
- "Xide is the integrated development environment for Tala, written in Kotlin with Compose Multiplatform. It is early work and not yet ready for daily use.",
- features: [
- "A desktop shell with a project tree, tabbed editor and problems view",
- "Tala, Kotlin, Java, Groovy and Python with syntax colouring",
- "Checks Tala files with the structured diagnostics of talac",
- "Extensions as Kotlin/JVM JARs",
- ],
- },
catch3: {
category: "Testing toolkit",
tagline: "C++ testing beyond assertions.",
@@ -201,7 +182,7 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"de-DE": {
metadataTitle: "Produkte",
metadataDescription:
- "Die Produkte von Progmasoft: die Sprache Tala und ihre Werkzeuge, die IDE Xide und das Testwerkzeug Catch3.",
+ "Die Produkte von Progmasoft: die Sprache Tala mit ihren Werkzeugen und das Testwerkzeug Catch3.",
eyebrow: "Progmasoft-Produkte",
title: "Produkte",
description:
@@ -272,18 +253,6 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"Erweiterbar mit DSL-Plugins",
],
},
- xide: {
- category: "Integrierte Entwicklungsumgebung",
- tagline: "Die geplante IDE für Tala.",
- description:
- "Xide ist die integrierte Entwicklungsumgebung für Tala, geschrieben in Kotlin mit Compose Multiplatform. Sie ist in einem frühen Stadium und noch nicht für den täglichen Einsatz bereit.",
- features: [
- "Eine Desktop-Oberfläche mit Projektbaum, Editor-Tabs und Problemansicht",
- "Tala, Kotlin, Java, Groovy und Python mit Syntaxhervorhebung",
- "Prüft Tala-Dateien mit den strukturierten Diagnosen von talac",
- "Erweiterungen als Kotlin/JVM-JARs",
- ],
- },
catch3: {
category: "Testwerkzeug",
tagline: "C++-Tests jenseits von Assertions.",
@@ -301,7 +270,7 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"ru-RU": {
metadataTitle: "Продукты",
metadataDescription:
- "Продукты Progmasoft: язык Tala и его инструменты, среда разработки Xide и набор для тестирования Catch3.",
+ "Продукты Progmasoft: язык Tala с его инструментами и набор для тестирования Catch3.",
eyebrow: "Продукты Progmasoft",
title: "Продукты",
description:
@@ -372,18 +341,6 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"Расширяется DSL-плагинами",
],
},
- xide: {
- category: "Интегрированная среда разработки",
- tagline: "Будущая среда разработки для Tala.",
- description:
- "Xide — интегрированная среда разработки для Tala на Kotlin и Compose Multiplatform. Это ранняя стадия, ещё не готовая к повседневной работе.",
- features: [
- "Настольная оболочка с деревом проекта, вкладками редактора и окном проблем",
- "Tala, Kotlin, Java, Groovy и Python с подсветкой синтаксиса",
- "Проверка файлов Tala через структурированную диагностику talac",
- "Расширения в виде JAR для Kotlin/JVM",
- ],
- },
catch3: {
category: "Набор для тестирования",
tagline: "Тестирование C++ за пределами утверждений.",
@@ -401,7 +358,7 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"he-IL": {
metadataTitle: "מוצרים",
metadataDescription:
- "המוצרים של Progmasoft: שפת Tala והכלים שלה, סביבת הפיתוח Xide וערכת הבדיקות Catch3.",
+ "המוצרים של Progmasoft: שפת Tala עם הכלים שלה וערכת הבדיקות Catch3.",
eyebrow: "המוצרים של Progmasoft",
title: "מוצרים",
description:
@@ -472,18 +429,6 @@ export const catalogMessages: Record<Locale, CatalogMessages> = {
"ניתן להרחבה בתוספי DSL",
],
},
- xide: {
- category: "סביבת פיתוח משולבת",
- tagline: "סביבת הפיתוח המתוכננת ל־Tala.",
- description:
- "Xide היא סביבת הפיתוח המשולבת ל־Tala, שנכתבת ב־Kotlin עם Compose Multiplatform. היא בשלב מוקדם ועדיין לא מוכנה לשימוש יומיומי.",
- features: [
- "מעטפת לשולחן העבודה עם עץ פרויקט, לשוניות עורך ותצוגת בעיות",
- "Tala,‏ Kotlin,‏ Java,‏ Groovy ו־Python עם צביעת תחביר",
- "בודקת קובצי Tala עם האבחונים המובנים של talac",
- "הרחבות כקובצי JAR של Kotlin/JVM",
- ],
- },
catch3: {
category: "ערכת בדיקות",
tagline: "בדיקות C++‎ מעבר לטענות.",
diff --git a/apps/web/lib/sites.ts b/apps/web/lib/sites.ts
index bcfc358..9f456fc 100644
--- a/apps/web/lib/sites.ts
+++ b/apps/web/lib/sites.ts
@@ -23,15 +23,6 @@ export function productRoute(pathname: string): string | null {
: null;
}
-/** The public pages of ides.progmasoft.com: the list and Xide. */
-export function idesRoute(pathname: string): string | null {
- const path = trimmed(pathname);
- if (path === "/") {
- return "/ides";
- }
- return path === "/xide" ? "/ides/xide" : null;
-}
-
/** The public page of catch3.progmasoft.com. */
export function catch3Route(pathname: string): string | null {
return trimmed(pathname) === "/" ? "/catch3" : null;
diff --git a/apps/web/proxy.ts b/apps/web/proxy.ts
index 4c09ce4..17a34da 100644
--- a/apps/web/proxy.ts
+++ b/apps/web/proxy.ts
@@ -10,7 +10,7 @@ import {
requestHost,
} from "@/lib/localization";
import { authorizeRoute, consoleRoute, issuerRoute } from "@/lib/credentials";
-import { catch3Route, idesRoute, productRoute } from "@/lib/sites";
+import { catch3Route, productRoute } from "@/lib/sites";
import {
contentSecurityPolicy,
createNonce,
@@ -57,7 +57,6 @@ const ownSites: OwnSite[] = [
route: productRoute,
api: false,
},
- { hosts: hostsOf("ides"), root: "/ides", route: idesRoute, api: false },
{ hosts: hostsOf("catch3"), root: "/catch3", route: catch3Route, api: false },
];
diff --git a/apps/web/tests/sites.test.mjs b/apps/web/tests/sites.test.mjs
index 7aa2b5a..c366c11 100644
--- a/apps/web/tests/sites.test.mjs
+++ b/apps/web/tests/sites.test.mjs
@@ -12,7 +12,7 @@ import {
productSlugs,
products,
} from "../lib/products.ts";
-import { catch3Route, idesRoute, productRoute } from "../lib/sites.ts";
+import { catch3Route, productRoute } from "../lib/sites.ts";
function shape(value) {
if (Array.isArray(value)) {
@@ -40,7 +40,7 @@ test("every language has the same home, catalog and product-site text", () => {
test("the catalog lists the products the user named, each with a site", () => {
assert.deepEqual(
[...productSlugs],
- ["tala-lang", "talac", "talafmt", "talalint", "tazel", "xide", "catch3"],
+ ["tala-lang", "talac", "talafmt", "talalint", "tazel", "catch3"],
);
for (const slug of productSlugs) {
assert.match(products[slug].site, /^https:\/\//, slug);
@@ -50,9 +50,9 @@ test("the catalog lists the products the user named, each with a site", () => {
slug,
);
}
- assert.equal(products.xide.site, "https://ides.progmasoft.com/xide");
assert.equal(products.catch3.site, "https://catch3.progmasoft.com/");
assert.equal(isProductSlug("viget"), false);
+ assert.equal(isProductSlug("xide"), false);
});
test("the home page names areas, not products", () => {
@@ -73,9 +73,6 @@ test("the product hosts map to their internal routes", () => {
assert.equal(productRoute("/tala-lang/"), "/products/tala-lang");
assert.equal(productRoute("/talac/extra"), null);
assert.equal(productRoute("/../x"), null);
- assert.equal(idesRoute("/"), "/ides");
- assert.equal(idesRoute("/xide"), "/ides/xide");
- assert.equal(idesRoute("/other"), null);
assert.equal(catch3Route("/"), "/catch3");
assert.equal(catch3Route("/docs"), null);
});
diff --git a/ops/README.md b/ops/README.md
index 554f085..0457499 100644
--- a/ops/README.md
+++ b/ops/README.md
@@ -192,8 +192,7 @@ clients still hold; replacing the encryption key invalidates every access token,
token, so every application has to ask again. Back up both files with the database.
The certificate of `progmasoft.com` must name `credentials.progmasoft.com`, `authorize.progmasoft.com`,
-`console.progmasoft.com`, `product.progmasoft.com`, `ides.progmasoft.com` and `catch3.progmasoft.com` as well; expand
-it with certbot's webroot plugin before the vhosts are enabled, then check
+`console.progmasoft.com`, `product.progmasoft.com` and `catch3.progmasoft.com` as well; expand it with certbot's webroot plugin before the vhosts are enabled, then check
`/.well-known/openid-configuration`, the sign-in page and the console from outside.
## Reserved accounts
diff --git a/ops/nginx/progmaweb.conf b/ops/nginx/progmaweb.conf
index daa81ef..f752b80 100644
--- a/ops/nginx/progmaweb.conf
+++ b/ops/nginx/progmaweb.conf
@@ -418,9 +418,8 @@ server {
}
}
-# The product catalog (product.progmasoft.com) and the product sites Progmaweb
-# serves itself (ides.progmasoft.com, catch3.progmasoft.com): pages of the
-# Next.js site only.
+# The product catalog (product.progmasoft.com) and the product site Progmaweb
+# serves itself (catch3.progmasoft.com): pages of the Next.js site only.
server {
listen 80;
listen [::]:80;
@@ -469,51 +468,6 @@ server {
server {
listen 80;
listen [::]:80;
- server_name ides.progmasoft.com;
-
- location ^~ /.well-known/acme-challenge/ {
- root /var/lib/letsencrypt;
- default_type text/plain;
- }
-
- location / {
- return 308 https://ides.progmasoft.com$request_uri;
- }
-}
-
-server {
- listen 443 ssl;
- listen [::]:443 ssl;
- http2 on;
- server_name ides.progmasoft.com;
-
- 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;
-
- client_max_body_size 1m;
-
- add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
- add_header X-Content-Type-Options "nosniff" always;
- add_header X-Frame-Options "DENY" always;
- add_header Referrer-Policy "strict-origin-when-cross-origin" always;
- add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
-
- location / {
- proxy_pass http://127.0.0.1:3010;
- proxy_http_version 1.1;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_set_header X-Forwarded-Host $host;
- proxy_read_timeout 60s;
- }
-}
-
-server {
- listen 80;
- listen [::]:80;
server_name catch3.progmasoft.com;
location ^~ /.well-known/acme-challenge/ {