Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
177a684
content(blog): what "the ontology is the software" means — the pillar…
claude Oct 5, 2026
ae4eabb
content(blog): re-slot the pillar definition post to Thursday 2026-10-15
claude Oct 15, 2026
5643fde
Merge remote-tracking branch 'origin/main' into ff/issue-216
claude Oct 15, 2026
9cce2db
site: correct seven claims that contradict the docs
claude Oct 6, 2026
34ea66c
Merge remote-tracking branch 'origin/main' into ff/issue-213
claude Oct 15, 2026
51e704d
fix(layout): phone-width tables, code blocks and body diagrams
claude Oct 6, 2026
435313e
fix(layout): state the overflowing-table bound with its border
claude Oct 6, 2026
0e5d9c8
fix(layout): focusable artifact code block, phone-width security table
claude Oct 6, 2026
e0ee9ba
Merge remote-tracking branch 'origin/main' into ff/issue-217
claude Oct 15, 2026
83d1088
site: fix the layout breaks, add 404 pages, gate internal links on th…
claude Oct 6, 2026
6b4409c
site: localize the rest of the header chrome
claude Oct 6, 2026
4909604
Merge remote-tracking branch 'origin/main' into ff/issue-221
claude Oct 15, 2026
5066537
content(blog/svg): fit 11 overflowing lines to their cards, lift .non…
claude Oct 6, 2026
be727dc
content(blog): describe the five decorative concept illustrations in …
claude Oct 6, 2026
b58839f
build: gate blog SVG text against the shape under it and shapes paint…
claude Oct 6, 2026
ab03e67
content(blog/svg): leave room for wider faces in two refitted lines
claude Oct 6, 2026
1023019
Merge remote-tracking branch 'origin/main' into ff/issue-209-sweep
claude Oct 15, 2026
310e45e
content(blog): README agent path CTA, canonical ObjectOS descriptor, …
claude Oct 6, 2026
2d9f5e4
content(blog): extend-existing-systems-with-ai — the data-residency b…
claude Oct 6, 2026
add901e
Merge remote-tracking branch 'origin/main' into ff/issue-218
claude Oct 15, 2026
92a9640
site(a11y): AA contrast tokens in both themes, drawer focus, disclosu…
claude Oct 6, 2026
cdff04e
Merge remote-tracking branch 'origin/main' into ff/issue-219
claude Oct 15, 2026
cbea2ee
content(blog): link the locale home, not the bare www root, from two …
claude Oct 6, 2026
25c933b
fix(seo): indexing hygiene — fallback rule, sitemap, lang, clusters, …
claude Oct 6, 2026
bab25b3
test(seo): seo-smoke guards the sitemap, body language and redirects;…
claude Oct 6, 2026
a688c3a
fix(seo): no SoftwareApplication offers until the headline price is r…
claude Oct 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 42 additions & 2 deletions astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { readFileSync } from 'node:fs';
import { readdir, rename, rmdir } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import { defineConfig } from 'astro/config';
Expand All @@ -16,6 +17,43 @@ const POST_LASTMOD = readPostLastmods(fileURLToPath(new URL('.', import.meta.url
// `/<locale>/404/`, the per-locale 404 route before `locale404` renames it.
const LOCALE_404 = /^\/[^/]+\/404\/$/;

// Where `astro build` writes pages: the default `outDir`, which this config
// does not override. The sitemap filter below reads the built pages from here.
const OUT_DIR = new URL('./dist/', import.meta.url);

/**
* Whether a built page may be listed in the sitemap: it must be indexable and
* its own canonical. A sitemap entry tells a crawler "index this URL"; listing
* a `noindex` page is the "Submitted URL marked noindex" error, and listing a
* page that canonicalizes elsewhere submits a duplicate.
*
* The answer is read from the built page itself rather than re-derived here
* from the registries, because the fallback rule has many producers — the
* marketing and glossary registries, pricing/legal/security
* (src/lib/fallback.ts), the templated cluster pages, thin topic hubs and
* archived posts — and a second copy of each would drift from the page that
* actually ships. The integration calls `filter` from its `astro:build:done`
* hook, after every page is written. `pnpm seo:smoke` asserts the result: no
* sitemap URL is noindexed or canonicalizes elsewhere.
*/
function isSelfCanonicalAndIndexable(pageUrl) {
const { pathname } = new URL(pageUrl);
if (!pathname.endsWith('/')) {
throw new Error(`sitemap filter: ${pageUrl} is not a directory URL; cannot locate its built page`);
}
let html;
try {
html = readFileSync(new URL(`.${decodeURIComponent(pathname)}index.html`, OUT_DIR), 'utf8');
} catch (error) {
// Failing loudly: a page this cannot read would otherwise be listed or
// dropped on a guess.
throw new Error(`sitemap filter: cannot read the built page for ${pageUrl}: ${error.message}`);
}
const head = html.slice(0, html.indexOf('</head>'));
if (/<meta name="robots" content="[^"]*\bnoindex\b/.test(head)) return false;
return /<link rel="canonical" href="([^"]*)"/.exec(head)?.[1] === pageUrl;
}

/**
* Astro names only the top-level `/404` route `404.html`; `src/pages/[lang]/404.astro`
* is emitted as `<locale>/404/index.html`. Cloudflare Pages serves the nearest
Expand Down Expand Up @@ -61,10 +99,12 @@ export default defineConfig({
mdx(),
sitemap({
// The root language redirect and the per-locale 404 pages are not
// content (the top-level /404 the integration drops by itself).
// content (the top-level /404 the integration drops by itself); every
// other page is listed only if it is indexable and self-canonical.
filter: (page) => {
const { pathname } = new URL(page);
return pathname !== '/' && !LOCALE_404.test(pathname);
if (pathname === '/' || LOCALE_404.test(pathname)) return false;
return isSelfCanonicalAndIndexable(page);
},
// Spread the item through: the integration also fills `links`,
// `priority` and `changefreq`, and returning a fresh object would drop
Expand Down
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.de.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # die App läuft — beschreiben Sie Ihrem Agent die nächste Änderung
```

Lieber Browser statt Repository? [ObjectOS](https://www.objectos.ai) ist dieselbe Idee als betriebene Plattform — online bauen &amp; fragen, mit AI Builder, Rechten und Audit eingebaut.
Lieber Browser statt Repository? [ObjectOS](/de/) ist dieselbe Idee als betriebene Plattform — online bauen &amp; fragen, mit AI Builder, Rechten und Audit eingebaut.
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.es.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # la app, funcionando — descríbele el siguiente cambio a tu agente
```

¿Prefieres el navegador antes que un repositorio? [ObjectOS](https://www.objectos.ai) es la misma idea operada para ti — construye y pregunta online, con AI Builder, permisos y auditoría integrados.
¿Prefieres el navegador antes que un repositorio? [ObjectOS](/es/) es la misma idea operada para ti — construye y pregunta online, con AI Builder, permisos y auditoría integrados.
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.fr.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # l’app tourne — décrivez le prochain changement à votre agent
```

Vous préférez le navigateur à un dépôt ? [ObjectOS](https://www.objectos.ai) est la même idée, opérée pour vous — construire et interroger en ligne, avec l’AI Builder, les permissions et l’audit intégrés.
Vous préférez le navigateur à un dépôt ? [ObjectOS](/fr/) est la même idée, opérée pour vous — construire et interroger en ligne, avec l’AI Builder, les permissions et l’audit intégrés.
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.ja.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # アプリはもう動いています — 次の変更をエージェントに伝えるだけ
```

リポジトリよりブラウザ派なら、[ObjectOS](https://www.objectos.ai) が同じ考え方の運用型です — オンラインで構築と問い合わせ、AI Builder・権限・監査を内蔵しています。
リポジトリよりブラウザ派なら、[ObjectOS](/ja/) が同じ考え方の運用型です — オンラインで構築と問い合わせ、AI Builder・権限・監査を内蔵しています。
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.ko.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # 앱은 이미 실행 중 — 다음 변경을 에이전트에게 말하기만 하면 됩니다
```

저장소보다 브라우저가 좋다면, [ObjectOS](https://www.objectos.ai)가 같은 아이디어의 운영형입니다 — 온라인으로 만들고 질문하기, AI Builder·권한·감사 내장.
저장소보다 브라우저가 좋다면, [ObjectOS](/ko/)가 같은 아이디어의 운영형입니다 — 온라인으로 만들고 질문하기, AI Builder·권한·감사 내장.
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # the app, running — describe the next change to your agent
```

Prefer the browser instead of a repo? [ObjectOS](https://www.objectos.ai) is the same idea operated for you — build &amp; ask online, with the AI Builder, permissions, and audit built in.
Prefer the browser instead of a repo? [ObjectOS](/en/) is the same idea operated for you — build &amp; ask online, with the AI Builder, permissions, and audit built in.
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.zh-Hans.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # 应用已运行——把下一个需求直接告诉你的智能体
```

更想在浏览器里完成?[ObjectOS](https://www.objectos.ai) 是同一个思路的托管形态——在线构建与问询,内置 AI Builder、权限与审计。
更想在浏览器里完成?[ObjectOS](/zh-Hans/) 是同一个思路的托管形态——在线构建与问询,内置 AI Builder、权限与审计。
2 changes: 1 addition & 1 deletion content/blog/business-app-in-16k-tokens/index.zh-Hant.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,4 @@ npm create objectstack@latest my-app && cd my-app
npx os dev --ui # 應用已執行——把下一個需求直接告訴你的智慧體
```

更想在瀏覽器裡完成?[ObjectOS](https://www.objectos.ai) 是同一個思路的託管形態——線上構建與問詢,內建 AI Builder、權限與審計。
更想在瀏覽器裡完成?[ObjectOS](/zh-Hant/) 是同一個思路的託管形態——線上構建與問詢,內建 AI Builder、權限與審計。
4 changes: 2 additions & 2 deletions content/blog/forward-deployed-engineer-tools/index.de.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Der Freigabeketten-Code von Kunde A lässt sich nicht in die Codebasis von Kunde

Jedes Engagement endet, und heute endet es schlecht — auf eine von zwei Arten. Übergeben Sie eine Plattform, mietet der Kunde seine eigene Ontologie für immer zurück — Sie sind zum Vertriebskanal geworden, und der Kunde hat gelernt, erfolgreiche Piloten zu fürchten: je besser die Ontologie, desto tiefer der Lock-in. Übergeben Sie eine Spezial-Codebasis, kann sein Team sie nicht warten; sie verrottet, und achtzehn Monate später trägt die Fäulnis Ihren Namen.

**Was der Stack ändert:** Das ist **die Ontologie-Übergabe** — das Ende, das das FDE-Playbook nie gelöst hat. Was Sie übergeben, ist das Repo des Kunden: typisierte Objekte, Flows und Berechtigungen unter Apache-2.0, dazu das kompilierte Artefakt und eine Review-Checkliste. Sein Security-Team kann die gesamte Definition prüfen — das mitgelieferte Referenzbeispiel hat 16k Tokens, selbst das vollständige HotCRM weniger als 150k, nicht 300.000 Codezeilen. Seine eigenen Coding-Agents warten das System mit derselben Schleife, die Sie benutzt haben, denn das Format wurde agentenschreibbar gebaut. Will der Kunde die Plattform betrieben haben — Browser-AI-Builder, Cloud oder Self-Managed — gibt es [ObjectOS](https://www.objectos.ai), auf derselben offenen Definition; er kann gehen, ohne die Ontologie zu verlieren. Ihren nächsten Vertrag verdienen Sie mit neuer Arbeit, nicht mit Lock-in. Dieser Unterschied ist Ihre Reputation — mit Zinseszins.
**Was der Stack ändert:** Das ist **die Ontologie-Übergabe** — das Ende, das das FDE-Playbook nie gelöst hat. Was Sie übergeben, ist das Repo des Kunden: typisierte Objekte, Flows und Berechtigungen unter Apache-2.0, dazu das kompilierte Artefakt und eine Review-Checkliste. Sein Security-Team kann die gesamte Definition prüfen — das mitgelieferte Referenzbeispiel hat 16k Tokens, selbst das vollständige HotCRM weniger als 150k, nicht 300.000 Codezeilen. Seine eigenen Coding-Agents warten das System mit derselben Schleife, die Sie benutzt haben, denn das Format wurde agentenschreibbar gebaut. Will der Kunde die Plattform betrieben haben — Browser-AI-Builder, Cloud oder Self-Managed — gibt es [ObjectOS](/de/), auf derselben offenen Definition; er kann gehen, ohne die Ontologie zu verlieren. Ihren nächsten Vertrag verdienen Sie mit neuer Arbeit, nicht mit Lock-in. Dieser Unterschied ist Ihre Reputation — mit Zinseszins.

## Das komplette Metadaten-Toolkit des FDE

Expand Down Expand Up @@ -183,4 +183,4 @@ npm create objectstack@latest client-app && cd client-app
npx os dev --ui # die App läuft — modellieren Sie das erste Objekt mit Ihrem Agent
```

Für Kunden, die die Plattform betrieben haben wollen, ist [ObjectOS](https://www.objectos.ai) die kommerzielle Laufzeitumgebung auf Basis von ObjectStack — online bauen &amp; fragen, mit verwaltetem oder privatem Deployment und integrierter Governance.
Für Kunden, die die Plattform betrieben haben wollen, ist [ObjectOS](/de/) die kommerzielle Laufzeitumgebung auf Basis von ObjectStack — online bauen &amp; fragen, mit verwaltetem oder privatem Deployment und integrierter Governance.
4 changes: 2 additions & 2 deletions content/blog/forward-deployed-engineer-tools/index.es.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ El código de la cadena de aprobación del cliente A no se puede levantar hacia

Todo engagement termina, y hoy termina mal de una de dos maneras. Entrega una plataforma y el cliente alquila su propia ontología para siempre — te has convertido en canal de ventas de otro, y él ha aprendido a temer los pilotos exitosos: cuanto mejor la ontología, más profundo el lock-in. Entrega una base de código a medida y su equipo no puede mantenerla; se pudre, y dieciocho meses después esa podredumbre lleva tu nombre.

**Lo que cambia el stack:** esto es **la entrega de la ontología** — el final que el playbook FDE nunca resolvió. Lo que entregas es el repo del cliente: objetos, flujos y permisos tipados bajo Apache-2.0, más el artefacto compilado y una checklist de revisión. Su equipo de seguridad puede inspeccionar la definición entera — la referencia incluida son 16k tokens y hasta el HotCRM completo queda bajo 150k, no 300.000 líneas de código. Sus propios agentes de código lo mantienen con el mismo bucle que tú usaste, porque el formato nació para ser escrito por agentes. Si quieren la plataforma operada — AI Builder en el navegador, cloud o self-managed — está [ObjectOS](https://www.objectos.ai), sobre la misma definición abierta; pueden irse sin perder la ontología. Tu siguiente contrato se gana con trabajo nuevo, no se extrae con lock-in. Esa diferencia es tu reputación, capitalizando.
**Lo que cambia el stack:** esto es **la entrega de la ontología** — el final que el playbook FDE nunca resolvió. Lo que entregas es el repo del cliente: objetos, flujos y permisos tipados bajo Apache-2.0, más el artefacto compilado y una checklist de revisión. Su equipo de seguridad puede inspeccionar la definición entera — la referencia incluida son 16k tokens y hasta el HotCRM completo queda bajo 150k, no 300.000 líneas de código. Sus propios agentes de código lo mantienen con el mismo bucle que tú usaste, porque el formato nació para ser escrito por agentes. Si quieren la plataforma operada — AI Builder en el navegador, cloud o self-managed — está [ObjectOS](/es/), sobre la misma definición abierta; pueden irse sin perder la ontología. Tu siguiente contrato se gana con trabajo nuevo, no se extrae con lock-in. Esa diferencia es tu reputación, capitalizando.

## El kit completo de metadatos del FDE

Expand Down Expand Up @@ -183,4 +183,4 @@ npm create objectstack@latest client-app && cd client-app
npx os dev --ui # la app funcionando — modela el primer objeto con tu agente
```

Para clientes que quieren la plataforma operada, [ObjectOS](https://www.objectos.ai) es el entorno de ejecución comercial construido sobre ObjectStack — construye y pregunta online, con despliegue gestionado o privado y gobernanza incluida.
Para clientes que quieren la plataforma operada, [ObjectOS](/es/) es el entorno de ejecución comercial construido sobre ObjectStack — construye y pregunta online, con despliegue gestionado o privado y gobernanza incluida.
4 changes: 2 additions & 2 deletions content/blog/forward-deployed-engineer-tools/index.fr.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Le code de chaîne de validation du client A ne se transporte pas dans la base d

Tout engagement se termine, et aujourd’hui il se termine mal, d’une de deux façons. Livrez une plateforme, et le client loue sa propre ontologie pour toujours — vous êtes devenu le canal de vente d’un autre, et il a appris à craindre les pilotes réussis : meilleure est l’ontologie, plus profond est le verrouillage. Livrez une base de code sur mesure, et son équipe ne peut pas la maintenir ; elle pourrit, et dix-huit mois plus tard cette pourriture porte votre nom.

**Ce que le stack change :** c’est **la passation d’ontologie** — la fin que le playbook FDE n’a jamais résolue. Ce que vous transmettez, c’est le dépôt du client : objets, flux et permissions typés sous Apache-2.0, plus l’artefact compilé et une checklist de revue. Son équipe sécurité peut inspecter la définition entière — la référence fournie fait 16k tokens et même le HotCRM complet reste sous 150k, pas 300 000 lignes de code. Ses propres agents de code entretiennent le système avec la même boucle que vous, parce que le format est né pour être écrit par des agents. S’il veut la plateforme opérée — AI Builder dans le navigateur, cloud ou self-managed — il y a [ObjectOS](https://www.objectos.ai), sur la même définition ouverte ; il peut partir sans perdre l’ontologie. Votre prochain contrat se gagne par du travail nouveau, il ne s’extrait pas par le verrouillage. Cette différence, c’est votre réputation qui capitalise.
**Ce que le stack change :** c’est **la passation d’ontologie** — la fin que le playbook FDE n’a jamais résolue. Ce que vous transmettez, c’est le dépôt du client : objets, flux et permissions typés sous Apache-2.0, plus l’artefact compilé et une checklist de revue. Son équipe sécurité peut inspecter la définition entière — la référence fournie fait 16k tokens et même le HotCRM complet reste sous 150k, pas 300 000 lignes de code. Ses propres agents de code entretiennent le système avec la même boucle que vous, parce que le format est né pour être écrit par des agents. S’il veut la plateforme opérée — AI Builder dans le navigateur, cloud ou self-managed — il y a [ObjectOS](/fr/), sur la même définition ouverte ; il peut partir sans perdre l’ontologie. Votre prochain contrat se gagne par du travail nouveau, il ne s’extrait pas par le verrouillage. Cette différence, c’est votre réputation qui capitalise.

## La boîte à outils métadonnées complète du FDE

Expand Down Expand Up @@ -183,4 +183,4 @@ npm create objectstack@latest client-app && cd client-app
npx os dev --ui # l’app tourne — modélisez le premier objet avec votre agent
```

Pour les clients qui veulent la plateforme opérée, [ObjectOS](https://www.objectos.ai) est l’environnement d’exécution commercial construit sur ObjectStack — construire et interroger en ligne, avec déploiement géré ou privé et gouvernance incluse.
Pour les clients qui veulent la plateforme opérée, [ObjectOS](/fr/) est l’environnement d’exécution commercial construit sur ObjectStack — construire et interroger en ligne, avec déploiement géré ou privé et gouvernance incluse.
Loading
Loading