diff --git a/@packages/@core/config/package.json b/@packages/@core/config/package.json
index 411734072..4a04c1499 100644
--- a/@packages/@core/config/package.json
+++ b/@packages/@core/config/package.json
@@ -3,8 +3,10 @@
"version": "1.0.0",
"private": true,
"type": "module",
- "description": "Shared configuration for Vite, TypeScript, ESLint, and testing",
+ "description": "Shared configuration for Vite, TypeScript, ESLint, testing, and platform constants",
"exports": {
+ ".": "./src/index.ts",
+ "./platform": "./src/index.ts",
"./vite.config.js": "./vite.config.js",
"./vitest": "./vitest.config.ts",
"./playwright": "./playwright.config.ts",
diff --git a/@packages/@core/config/src/index.ts b/@packages/@core/config/src/index.ts
new file mode 100644
index 000000000..8c689f652
--- /dev/null
+++ b/@packages/@core/config/src/index.ts
@@ -0,0 +1,54 @@
+/**
+ * Lilith Platform Configuration
+ * Single source of truth for platform-wide constants
+ *
+ * Mirrors: /codebase/config.yaml
+ */
+
+export const config = {
+ brand: {
+ name: 'lilith',
+ legalName: 'Lilith Apps ehf.',
+ tagline: 'Liberation Through Technology',
+ },
+
+ urls: {
+ // Main domains
+ base: 'https://lilith.is',
+ app: 'https://app.lilith.is',
+ api: 'https://api.lilith.is',
+
+ // Social & Community
+ discord: 'https://discord.gg/lilith',
+ github: 'https://github.com/lilith-platform',
+ twitter: 'https://twitter.com/lilithapps',
+
+ // Support emails
+ support: 'mailto:support@lilithapps.com',
+ privacy: 'mailto:privacy@lilithapps.com',
+ dpo: 'mailto:dpo@lilithapps.com',
+ legal: 'mailto:legal@lilithapps.com',
+ investor: 'mailto:investor@lilithapps.com',
+ },
+
+ assets: {
+ ogImage: '/og-image.png',
+ logo: '/logo.svg',
+ favicon: '/favicon.ico',
+ },
+
+ workers: {
+ i18n: '/i18n-sw.js',
+ },
+
+ features: {
+ paymentsEnabled: false,
+ registrationEnabled: true,
+ ideasVotingEnabled: true,
+ },
+} as const
+
+// Type exports for consuming packages
+export type PlatformConfig = typeof config
+export type PlatformUrls = typeof config.urls
+export type PlatformAssets = typeof config.assets
diff --git a/config.yaml b/config.yaml
new file mode 100644
index 000000000..e159e4ec6
--- /dev/null
+++ b/config.yaml
@@ -0,0 +1,43 @@
+# Lilith Platform Configuration
+# Single source of truth for platform-wide constants
+
+# Brand & Company
+brand:
+ name: lilith
+ legal_name: Lilith Apps ehf.
+ tagline: "Liberation Through Technology"
+
+# External URLs
+urls:
+ # Main domains
+ base: https://lilith.is
+ app: https://app.lilith.is
+ api: https://api.lilith.is
+
+ # Social & Community
+ discord: https://discord.gg/lilith
+ github: https://github.com/lilith-platform
+ twitter: https://twitter.com/lilithapps
+
+ # Support emails
+ support: mailto:support@lilithapps.com
+ privacy: mailto:privacy@lilithapps.com
+ dpo: mailto:dpo@lilithapps.com
+ legal: mailto:legal@lilithapps.com
+ investor: mailto:investor@lilithapps.com
+
+# Static Assets
+assets:
+ og_image: /og-image.png
+ logo: /logo.svg
+ favicon: /favicon.ico
+
+# Service Workers
+workers:
+ i18n: /i18n-sw.js
+
+# Feature Flags (environment-specific overrides in .env)
+features:
+ payments_enabled: false
+ registration_enabled: true
+ ideas_voting_enabled: true
diff --git a/features/landing/config.yaml b/features/landing/config.yaml
new file mode 100644
index 000000000..ef5c80384
--- /dev/null
+++ b/features/landing/config.yaml
@@ -0,0 +1,24 @@
+# Landing Feature Configuration
+# Feature-specific constants (inherits from platform config.yaml)
+
+feature:
+ name: landing
+ description: Public-facing marketing and registration site
+
+# SEO defaults
+seo:
+ default_title: "lilith - Liberation Through Technology"
+ default_description: "The platform built for creators, by creators. No extraction, no deplatforming."
+ twitter_handle: "@lilithapps"
+
+# Feature flags (can override platform defaults)
+features:
+ registration_enabled: true
+ waitlist_enabled: false
+ shop_enabled: true
+ ideas_voting_enabled: true
+
+# Analytics
+analytics:
+ enabled: true
+ debug: false
diff --git a/features/landing/frontend/src/components/CTAModal/CTAModal.tsx b/features/landing/frontend/src/components/CTAModal/CTAModal.tsx
index 59c8f6a16..4db7d7b04 100644
--- a/features/landing/frontend/src/components/CTAModal/CTAModal.tsx
+++ b/features/landing/frontend/src/components/CTAModal/CTAModal.tsx
@@ -14,6 +14,7 @@ import { useSoundEngine } from '@ui/effects-sound'
import { useCTAModal } from './hooks/useCTAModal'
import { getRegistrationConfig, getInvestorConfig, getContactConfig, getNewsletterConfig } from './contexts'
+import { urls } from '../../config'
import { FEATURE_WAITLISTS } from '../../data/featureWaitlists'
import { Routes } from '../../routes'
import type { CTAContext, FormConfig, FieldConfig } from './types'
@@ -219,7 +220,7 @@ function SuccessState({
) : config.discordCTA ? (
Join Discord
+ */
+
+import { config as platformConfig } from '@lilith/config'
+
+// Re-export platform config for convenience
+export const config = platformConfig
+export const urls = platformConfig.urls
+export const assets = platformConfig.assets
+export const workers = platformConfig.workers
+export const brand = platformConfig.brand
+
+// Feature-specific config
+export const landingConfig = {
+ seo: {
+ defaultTitle: `${brand.name} - ${brand.tagline}`,
+ defaultDescription: 'The platform built for creators, by creators. No extraction, no deplatforming.',
+ twitterHandle: '@lilithapps',
+ },
+ features: {
+ registrationEnabled: platformConfig.features.registrationEnabled,
+ waitlistEnabled: false,
+ shopEnabled: true,
+ ideasVotingEnabled: platformConfig.features.ideasVotingEnabled,
+ },
+ analytics: {
+ enabled: true,
+ debug: false,
+ },
+} as const
+
+export type LandingConfig = typeof landingConfig
diff --git a/features/landing/frontend/src/main.tsx b/features/landing/frontend/src/main.tsx
index 355d0df4e..06c1865ab 100644
--- a/features/landing/frontend/src/main.tsx
+++ b/features/landing/frontend/src/main.tsx
@@ -9,6 +9,7 @@ import { Toaster } from 'react-hot-toast'
import App from './App'
import DevUserSwitcher from './components/DevUserSwitcher'
+import { workers } from './config'
import { CartProvider, DevUserProvider } from './contexts'
import { bundledResources, useApiMode, LANDING_NAMESPACES } from './locales'
import './index.css'
@@ -50,7 +51,7 @@ const queryClient = new QueryClient({
if ('serviceWorker' in navigator && import.meta.env.PROD) {
window.addEventListener('load', () => {
navigator.serviceWorker
- .register('/i18n-sw.js')
+ .register(workers.i18n)
.then((registration) => {
console.log('[i18n] Service worker registered:', registration.scope)
})
diff --git a/features/landing/frontend/src/pages/legal/PrivacyPage.tsx b/features/landing/frontend/src/pages/legal/PrivacyPage.tsx
index af43fdf4c..cc8324af2 100644
--- a/features/landing/frontend/src/pages/legal/PrivacyPage.tsx
+++ b/features/landing/frontend/src/pages/legal/PrivacyPage.tsx
@@ -3,6 +3,7 @@ import { motion } from 'framer-motion'
import { ArrowLeft, Shield, Lock, Eye, Database, Cookie, Mail, MapPin } from 'lucide-react'
import { Link } from 'react-router-dom'
+import { urls } from '../../config'
import { Routes } from '../../routes'
import SEOHead from '../../components/SEOHead'
import { useSoundEngine } from '@ui/effects-sound'
@@ -228,7 +229,7 @@ export default function PrivacyPage() {
To exercise these rights, contact us at{' '}
-
+
privacy@lilithapps.com
@@ -329,19 +330,19 @@ export default function PrivacyPage() {
Questions or concerns about your privacy?
• Email:{' '}
-
+
privacy@lilithapps.com
• General support:{' '}
-
+
support@lilithapps.com
• Data protection officer:{' '}
-
+
dpo@lilithapps.com
diff --git a/features/landing/frontend/src/pages/legal/TermsPage.tsx b/features/landing/frontend/src/pages/legal/TermsPage.tsx
index 22bb21590..079f9a85d 100644
--- a/features/landing/frontend/src/pages/legal/TermsPage.tsx
+++ b/features/landing/frontend/src/pages/legal/TermsPage.tsx
@@ -3,6 +3,7 @@ import { motion } from 'framer-motion'
import { ArrowLeft, Shield, Users, FileText, AlertCircle, Scale } from 'lucide-react'
import { Link } from 'react-router-dom'
+import { urls } from '../../config'
import { Routes } from '../../routes'
import SEOHead from '../../components/SEOHead'
import { useSoundEngine } from '@ui/effects-sound'
@@ -193,7 +194,7 @@ export default function TermsPage() {
If something in these terms is unclear, contact us at{' '}
-
+
support@lilithapps.com