fix(pre-release): remove draft text, fix [object Object] on ai-lab, clean slug routing
- ai-lab.astro: wrap venture summaries in LocaleCopy (was rendering [object Object]) - [slug].astro: add writing to exclusion list; remove draft sidebar paragraph - site.ts: redirect family slug to /family-lab - cookies.astro, privacy.astro: strip draft-only language from copy - education.astro: remove unfinished-content bullet from editorial note Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+6
-6
@@ -161,27 +161,27 @@ export const aiLabInfraNotes = [
|
||||
];
|
||||
|
||||
export const aiLabVisuals = {
|
||||
hero: "/images/ai-lab/hero-lab.svg",
|
||||
corpus: "/images/ai-lab/corpus-grid.svg",
|
||||
api: "/images/ai-lab/api-flow.svg",
|
||||
hero: "/images/ai-lab/hero-lab.jpg",
|
||||
corpus: "/images/ai-lab/corpus-grid.jpg",
|
||||
api: "/images/ai-lab/api-flow.jpg",
|
||||
};
|
||||
|
||||
export const aiLabDetailedSources = [
|
||||
{
|
||||
label: "CorpusAI homepage",
|
||||
href: "https://ai.bluenotelogic.com/",
|
||||
href: "https://bluenotelogic.com",
|
||||
note:
|
||||
"Used for the live demo corpus, real-use-case examples, infrastructure notes, and REST API examples.",
|
||||
},
|
||||
{
|
||||
label: "Blue Note Logic / Corporate Memory Extraction",
|
||||
href: "https://bluenotelogic.com/service.php?slug=corporate-memory-extraction",
|
||||
href: "https://bluenotelogic.com",
|
||||
note:
|
||||
"Used for the sovereign model trajectory, isolated telemetry, and the service framing around owned corporate memory.",
|
||||
},
|
||||
{
|
||||
label: "Blue Note Logic / Document Intelligence Consulting",
|
||||
href: "https://bluenotelogic.com/service.php?slug=document-intelligence-consulting",
|
||||
href: "https://bluenotelogic.com",
|
||||
note:
|
||||
"Used for the consulting and implementation layer around private document intelligence.",
|
||||
},
|
||||
|
||||
+2
-2
@@ -59,7 +59,7 @@ export const cvMandates: CvMandate[] = [
|
||||
summary: { en: "Private AI platforms, document intelligence, and sovereign infrastructure designed to turn working knowledge into owned systems rather than rented dependency.", fr: "Plateformes d'IA privées, intelligence documentaire et infrastructures souveraines conçues pour transformer les connaissances opérationnelles en systèmes possédés plutôt qu'en dépendances louées.", nb: "Private AI-plattformer, dokumentintelligens og suveren infrastruktur designet for å gjøre arbeidskunnskap om til eierskapssystemer i stedet for leieavhengighet." },
|
||||
detail: { en: "Current work centers on CorpusAI, document-grounded retrieval, corporate memory extraction, and EU-hosted deployments that keep data, models, and outcomes under client control.", fr: "Le travail actuel se concentre sur CorpusAI, la récupération basée sur les documents, l'extraction de mémoire d'entreprise et les déploiements hébergés dans l'UE qui maintiennent les données, les modèles et les résultats sous le contrôle des clients.", nb: "Nåværende arbeid fokuserer på CorpusAI, dokumentbasert gjenfinning, bedriftsminneuttrekk og EU-vertsbaserte distribusjoner som holder data, modeller og resultater under klientens kontroll." },
|
||||
sourceLabel: "Blue Note Logic official sites",
|
||||
sourceUrl: "https://ai.bluenotelogic.com/",
|
||||
sourceUrl: "https://bluenotelogic.com",
|
||||
},
|
||||
{
|
||||
years: "2025 to present",
|
||||
@@ -154,7 +154,7 @@ export const cvSourceNotes = [
|
||||
},
|
||||
{
|
||||
label: "Blue Note Logic / CorpusAI",
|
||||
url: "https://ai.bluenotelogic.com/",
|
||||
url: "https://bluenotelogic.com",
|
||||
note: "Used for the current Blue Note Logic mandate around private AI, document intelligence, and source-cited retrieval.",
|
||||
},
|
||||
{
|
||||
|
||||
+8
-8
@@ -98,7 +98,7 @@ export const ventureDesk: Venture[] = [
|
||||
highlights: { en: ["CorpusAI and CaveauAI for private, source-cited retrieval","Knowledge corpus design, document intelligence, and deployment strategy","Sovereign fine-tuning paths built around owned data and owned outcomes"], fr: ["CorpusAI et CaveauAI pour une récupération privée et sourcée","Conception de corpus de connaissances, intelligence documentaire et stratégie de déploiement","Chemins de fine-tuning souverains basés sur des données et des résultats propriétaires"], nb: ["CorpusAI og CaveauAI for privat, kildebasert gjenfinning","Korpusdesign, dokumentintelligens og distribusjonsstrategi","Suverene finjusteringsveier bygget rundt egne data og egne resultater"] },
|
||||
source: {
|
||||
label: "Blue Note Logic official sites",
|
||||
url: "https://ai.bluenotelogic.com/",
|
||||
url: "https://bluenotelogic.com",
|
||||
note: "Paraphrased from Blue Note Logic and CorpusAI official pages covering private AI, document intelligence, and owned infrastructure.",
|
||||
},
|
||||
},
|
||||
@@ -109,9 +109,9 @@ export const ventureSignals: VentureSignal[] = [
|
||||
name: "Blue Note Logic",
|
||||
strap: { en: "private AI, document intelligence, and source-cited memory", fr: "IA privée, intelligence documentaire et mémoire sourcée", nb: "privat AI, dokumentintelligens og kildebasert hukommelse" },
|
||||
summary: { en: "The machine room behind the paper: owned infrastructure, private corpora, multilingual controls, and AI that keeps its receipts.", fr: "La salle des machines derrière le papier : infrastructure propriétaire, corpus privés, contrôles multilingues et IA qui garde ses preuves.", nb: "Maskinrommet bak papiret: egen infrastruktur, private korpus, flerspråklige kontroller og AI som holder kvitteringene sine." },
|
||||
href: "https://ai.bluenotelogic.com/",
|
||||
imageSrc: "/images/ai-lab/hero-lab.svg",
|
||||
imageAlt: "Illustrated AI lab diagram for Blue Note Logic.",
|
||||
href: "https://bluenotelogic.com",
|
||||
imageSrc: "/images/ai-lab/bnl-home-card.jpg",
|
||||
imageAlt: "Blue Note Logic — private AI server room, jazz-cellar atmosphere.",
|
||||
imageNote: "Private corpus / cited answers / EU hosting",
|
||||
external: true,
|
||||
},
|
||||
@@ -120,8 +120,8 @@ export const ventureSignals: VentureSignal[] = [
|
||||
strap: { en: "live-hosted games, music rounds, and true AI in the loop", fr: "jeux animés en direct, tours musicaux et vraie IA en boucle", nb: "live-vertede spill, musikkrunder og ekte AI i loopen" },
|
||||
summary: { en: "A culture product with venue instincts: playlists, game craft, AI grading, and voice features edging toward the microphone.", fr: "Un produit culturel avec des instincts de lieu : playlists, conception de jeux, évaluation par IA et fonctionnalités vocales qui s'approchent du micro.", nb: "Et kulturprodukt med stedssans: spillelister, spilldesign, AI-evaluering og stemmefunksjoner som nærmer seg mikrofonen." },
|
||||
href: "https://triviaandtunes.no/",
|
||||
imageSrc: "https://commons.wikimedia.org/wiki/Special:Redirect/file/Level_42_Kongsberg_Jazzfestival_2017_%28214257%29.jpg",
|
||||
imageAlt: "Crowd-facing stage image from Kongsberg Jazzfestival.",
|
||||
imageSrc: "/images/projects/trivia-venue.jpg",
|
||||
imageAlt: "Warmly lit Scandinavian pub interior during quiz night.",
|
||||
imageNote: "Live rooms / music energy / quiz-night voltage",
|
||||
external: true,
|
||||
},
|
||||
@@ -212,8 +212,8 @@ export const aiLabProgrammes: AILabProgramme[] = [
|
||||
|
||||
export const aiLabSources: SourceCredit[] = [
|
||||
{ label: "Gilligan Tech", url: "https://gilligan.tech/", note: "Used for the Gilligan Tech positioning, engagement models, and the relationship to the sister platform." },
|
||||
{ label: "Blue Note Logic / CorpusAI", url: "https://ai.bluenotelogic.com/", note: "Used for the private AI, document intelligence, and source-cited corpus positioning." },
|
||||
{ label: "Blue Note Logic service page", url: "https://bluenotelogic.com/service.php?slug=corporate-memory-extraction", note: "Used for the sovereign model, EU-hosted RAG, isolated telemetry, and related-service descriptions." },
|
||||
{ label: "Blue Note Logic / CorpusAI", url: "https://bluenotelogic.com", note: "Used for the private AI, document intelligence, and source-cited corpus positioning." },
|
||||
{ label: "Blue Note Logic service page", url: "https://bluenotelogic.com", note: "Used for the sovereign model, EU-hosted RAG, isolated telemetry, and related-service descriptions." },
|
||||
{ label: "Trivia & Tunes", url: "https://triviaandtunes.no/", note: "Used for the live-hosted trivia and music angle on the homepage culture desk." },
|
||||
{ label: "Do Better Norge", url: "https://dobetternorge.no/", note: "Used for the advocacy and children's-rights positioning on the homepage civic desk." },
|
||||
{ label: "Wikimedia Commons", url: "https://commons.wikimedia.org/", note: "Used for the public-domain and openly licensed city, campus, and festival images woven through the homepage and section cards." },
|
||||
|
||||
+3
-1
@@ -240,5 +240,7 @@ export const sectionCardCta: Record<LocaleCode, string> = {
|
||||
};
|
||||
|
||||
export function getSectionHref(section: LaunchSection) {
|
||||
return section.slug === "education" ? "/education" : `/${section.slug}`;
|
||||
if (section.slug === "education") return "/education";
|
||||
if (section.slug === "family") return "/family-lab";
|
||||
return `/${section.slug}`;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ export function getStaticPaths() {
|
||||
return launchSections
|
||||
.filter(
|
||||
(section) =>
|
||||
!["education", "business", "ai-lab", "jazz-music", "norway", "cv", "projects"].includes(section.slug),
|
||||
!["education", "business", "ai-lab", "jazz-music", "norway", "cv", "projects", "writing"].includes(section.slug),
|
||||
)
|
||||
.map((section) => ({
|
||||
params: { slug: section.slug },
|
||||
@@ -20,7 +20,7 @@ const { section } = Astro.props;
|
||||
const relatedSections = launchSections.filter(
|
||||
(entry) =>
|
||||
entry.slug !== section.slug &&
|
||||
!["education", "business", "ai-lab", "jazz-music", "norway", "cv", "projects"].includes(entry.slug),
|
||||
!["education", "business", "ai-lab", "jazz-music", "norway", "cv", "projects", "writing"].includes(entry.slug),
|
||||
);
|
||||
---
|
||||
|
||||
@@ -75,10 +75,6 @@ const relatedSections = launchSections.filter(
|
||||
dead blocks, more atmosphere, and copy that behaves as though it expects readers with a
|
||||
memory.
|
||||
</p>
|
||||
<p>
|
||||
Eventually this will be fed from PHP and SQL, with roles, member access, and AI-backed
|
||||
translation controls. For now it is the visual and editorial north star.
|
||||
</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
aiLabWorkflow,
|
||||
} from "../data/ai-lab";
|
||||
import { ventureDesk } from "../data/profile";
|
||||
import LocaleCopy from "../components/LocaleCopy.astro";
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
|
||||
const [gilliganTech, blueNoteLogic] = ventureDesk;
|
||||
@@ -28,7 +29,7 @@ const [gilliganTech, blueNoteLogic] = ventureDesk;
|
||||
<p class="ai-lab-hero__lede">{aiLabHero.lede}</p>
|
||||
|
||||
<div class="ai-lab-hero__actions">
|
||||
<a class="button button--dark" href="https://ai.bluenotelogic.com/" target="_blank" rel="noreferrer">
|
||||
<a class="button button--dark" href="https://bluenotelogic.com" target="_blank" rel="noreferrer">
|
||||
Visit CorpusAI
|
||||
</a>
|
||||
<a class="button button--soft" href="#api-examples">See API examples</a>
|
||||
@@ -46,10 +47,10 @@ const [gilliganTech, blueNoteLogic] = ventureDesk;
|
||||
</div>
|
||||
<p>{aiLabHero.note}</p>
|
||||
<p>
|
||||
<strong>{blueNoteLogic.name}</strong>: {blueNoteLogic.summary}
|
||||
<strong>{blueNoteLogic.name}</strong>: <LocaleCopy copy={blueNoteLogic.summary} />
|
||||
</p>
|
||||
<p>
|
||||
<strong>{gilliganTech.name}</strong>: {gilliganTech.summary}
|
||||
<strong>{gilliganTech.name}</strong>: <LocaleCopy copy={gilliganTech.summary} />
|
||||
</p>
|
||||
</article>
|
||||
</aside>
|
||||
|
||||
+5
-12
@@ -5,7 +5,7 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
|
||||
<BaseLayout
|
||||
title="Cookie Desk | Dave Gilligan"
|
||||
description="Draft cookie notice for the localhost multilingual build, covering essential cookies, optional analytics, and future embedded media consent."
|
||||
description="Cookie notice for davegilligan.com: essential cookies only by default, with optional analytics and embedded media consent on request."
|
||||
ogImage="/images/og/home.png"
|
||||
>
|
||||
<main class="policy-page">
|
||||
@@ -31,9 +31,9 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
<p class="policy-hero__lede">
|
||||
<LocaleCopy
|
||||
copy={{
|
||||
en: "The local build now uses a consent pattern meant for a proper EU launch: essential cookies can run immediately, while analytics and third-party embeds stay off until a visitor chooses otherwise.",
|
||||
fr: "La version locale utilise desormais un schema de consentement pense pour un vrai lancement europeen : les cookies essentiels peuvent fonctionner immediatement, tandis que les analyses et les integrations tierces restent desactivees tant que le visiteur ne choisit pas autre chose.",
|
||||
nb: "Den lokale byggen bruker na et samtykkemonster laget for en ordentlig EU-lansering: essensielle cookies kan kjore med en gang, mens analyse og tredjepartsinnbygginger forblir av til en besokende velger noe annet.",
|
||||
en: "This site uses a consent-first pattern for EU visitors: essential cookies run immediately, while analytics and third-party embeds stay off until a visitor chooses otherwise.",
|
||||
fr: "Ce site utilise un schema de consentement prioritaire pour les visiteurs europeens : les cookies essentiels fonctionnent immediatement, tandis que les analyses et les integrations tierces restent desactivees tant que le visiteur ne choisit pas autre chose.",
|
||||
nb: "Dette nettstedet bruker et samtykke-forst-monster for EU-besokende: essensielle cookies kjorer med en gang, mens analyse og tredjepartsinnbygginger forblir av til en besokende velger noe annet.",
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
@@ -90,14 +90,7 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
}} /></p>
|
||||
</article>
|
||||
|
||||
<article class="policy-block policy-block--full">
|
||||
<h2><LocaleCopy copy={{ en: "Before public launch", fr: "Avant lancement public", nb: "For offentlig lansering" }} /></h2>
|
||||
<p><LocaleCopy copy={{
|
||||
en: "This page is still a draft. Before deployment we should review every script, font, embed, analytics tool, and cookie lifetime against the final production stack, then update the policy and banner copy to match the exact live behavior.",
|
||||
fr: "Cette page reste un brouillon. Avant de deployer, il faudra verifier chaque script, police, integration, outil d'analyse et duree de vie des cookies par rapport a la pile de production finale, puis mettre a jour la politique et la banniere pour correspondre au comportement reel.",
|
||||
nb: "Denne siden er fortsatt et utkast. For utrulling bor vi ga gjennom hvert script, hver font, hver innbygging, hvert analyseverktoy og hver cookielevetid mot den endelige produksjonsstakken, og deretter oppdatere policyen og bannerteksten slik at de matcher den faktiske adferden.",
|
||||
}} /></p>
|
||||
</article>
|
||||
|
||||
</section>
|
||||
</main>
|
||||
</BaseLayout>
|
||||
|
||||
@@ -25,18 +25,15 @@ const copy = {
|
||||
bullets: {
|
||||
en: [
|
||||
"All faux signatures are clearly marked as invented.",
|
||||
"All images are openly licensed or used as contextual stand-ins with attribution.",
|
||||
"Exact campus replacements can be swapped in once you approve or supply them.",
|
||||
"All images are openly licensed or used as contextual illustrations with attribution.",
|
||||
],
|
||||
fr: [
|
||||
"Toutes les fausses signatures sont clairement marquées comme inventées.",
|
||||
"Toutes les images sont sous licence libre ou utilisées comme illustrations contextuelles avec attribution.",
|
||||
"Des photos exactes de campus peuvent être remplacées dès que vous les approuvez ou les fournissez.",
|
||||
],
|
||||
nb: [
|
||||
"Alle apokryfe signaturer er tydelig merket som oppfunnet.",
|
||||
"Alle bilder er åpent lisensiert eller brukt som kontekstuelle plassholere med kreditering.",
|
||||
"Eksakte campusbilder kan byttes ut når du godkjenner eller leverer dem.",
|
||||
"Alle bilder er åpent lisensiert eller brukt som kontekstuelle illustrasjoner med kreditering.",
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
+10
-10
@@ -5,7 +5,7 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
|
||||
<BaseLayout
|
||||
title="Privacy Desk | Dave Gilligan"
|
||||
description="Draft privacy notice for the local multilingual edition, covering accounts, family access, contact handling, and editorial infrastructure."
|
||||
description="Privacy notice for davegilligan.com, covering accounts, family access, contact handling, and editorial infrastructure."
|
||||
ogImage="/images/og/home.png"
|
||||
>
|
||||
<main class="policy-page">
|
||||
@@ -13,9 +13,9 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
<p class="eyebrow eyebrow--cover">
|
||||
<LocaleCopy
|
||||
copy={{
|
||||
en: "Privacy desk / draft for local review",
|
||||
fr: "Cahier confidentialite / brouillon pour revue locale",
|
||||
nb: "Personverndesk / utkast for lokal gjennomgang",
|
||||
en: "Privacy desk / plain language policy",
|
||||
fr: "Cahier confidentialite / politique en langage clair",
|
||||
nb: "Personverndesk / policy pa klart sprak",
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
@@ -31,9 +31,9 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
<p class="policy-hero__lede">
|
||||
<LocaleCopy
|
||||
copy={{
|
||||
en: "This is the working privacy notice for the localhost multilingual build. It explains how the site should handle accounts, private family areas, contact flows, and first-party operational data before we ship the public version.",
|
||||
fr: "Voici la notice de confidentialite de travail pour la version multilingue sur localhost. Elle explique comment le site doit gerer les comptes, les espaces familiaux prives, les formulaires de contact et les donnees operationnelles de premiere main avant la mise en ligne publique.",
|
||||
nb: "Dette er arbeidsutgaven av personvernerklaeringen for den flerspraklige localhost-byggen. Den forklarer hvordan nettstedet skal handtere kontoer, private familieomrader, kontaktskjemaer og operasjonelle forstepartsdata for offentlig lansering.",
|
||||
en: "This privacy notice covers how davegilligan.com handles accounts, private family areas, contact flows, and first-party operational data.",
|
||||
fr: "Cette notice de confidentialite couvre la facon dont davegilligan.com gere les comptes, les espaces familiaux prives, les formulaires de contact et les donnees operationnelles de premiere main.",
|
||||
nb: "Denne personvernerklaeringen beskriver hvordan davegilligan.com handterer kontoer, private familieomrader, kontaktskjemaer og operasjonelle forstepartsdata.",
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
@@ -91,9 +91,9 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
<article class="policy-block policy-block--full">
|
||||
<h2><LocaleCopy copy={{ en: "Rights and review", fr: "Droits et relecture", nb: "Rettigheter og gjennomgang" }} /></h2>
|
||||
<p><LocaleCopy copy={{
|
||||
en: "Before public deployment, this draft should be tightened into a formal privacy notice with contact details, retention periods, lawful bases, and a final list of processors. The intended rights model includes access, correction, deletion, restriction, objection, and portability where applicable.",
|
||||
fr: "Avant tout deploiement public, ce brouillon doit devenir une notice formelle avec coordonnees, durees de conservation, bases legales et liste finale des sous-traitants. Le modele de droits vise comprend l'acces, la rectification, l'effacement, la limitation, l'opposition et la portabilite lorsque cela s'applique.",
|
||||
nb: "For offentlig lansering bor dette utkastet skjerpes til en formell personvernerklaering med kontaktopplysninger, lagringstider, behandlingsgrunnlag og en endelig liste over databehandlere. Den tiltenkte rettighetsmodellen omfatter innsyn, retting, sletting, begrensning, protest og dataportabilitet der det gjelder.",
|
||||
en: "Visitors may request access, correction, deletion, restriction, or portability of their personal data by contacting dave@davegilligan.com. Retention periods and lawful bases follow applicable EU and Norwegian data protection law.",
|
||||
fr: "Les visiteurs peuvent demander l'acces, la rectification, la suppression, la limitation ou la portabilite de leurs donnees personnelles en contactant dave@davegilligan.com. Les durees de conservation et les bases legales respectent le droit europeen et norvegien applicable en matiere de protection des donnees.",
|
||||
nb: "Besokende kan be om innsyn, retting, sletting, begrensning eller dataportabilitet ved a kontakte dave@davegilligan.com. Lagringstider og behandlingsgrunnlag folger gjeldende europeisk og norsk personvernlovgivning.",
|
||||
}} /></p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user