diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..4e61a4c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,7 @@
+node_modules
+.next
+.git
+.gitignore
+Dockerfile
+docker-compose.yml
+*.md
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..45b5c26
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,27 @@
+FROM node:22-alpine AS base
+
+FROM base AS deps
+RUN apk add --no-cache libc6-compat
+WORKDIR /app
+COPY package.json package-lock.json ./
+RUN npm ci
+
+FROM base AS builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+RUN npm run build
+
+FROM base AS runner
+WORKDIR /app
+ENV NODE_ENV=production
+RUN addgroup --system --gid 1001 nodejs
+RUN adduser --system --uid 1001 nextjs
+COPY --from=builder /app/public ./public
+COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+USER nextjs
+EXPOSE 3000
+ENV PORT=3000
+ENV HOSTNAME="0.0.0.0"
+CMD ["node", "server.js"]
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..99d9653
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,15 @@
+services:
+ cosmolocal-website:
+ build: .
+ container_name: cosmolocal-website
+ restart: unless-stopped
+ labels:
+ - "traefik.enable=true"
+ - "traefik.http.routers.cosmolocal.rule=Host(`cosmolocal.world`) || Host(`www.cosmolocal.world`)"
+ - "traefik.http.services.cosmolocal.loadbalancer.server.port=3000"
+ networks:
+ - traefik-public
+
+networks:
+ traefik-public:
+ external: true
diff --git a/next.config.ts b/next.config.ts
index e9ffa30..68a6c64 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,7 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- /* config options here */
+ output: "standalone",
};
export default nextConfig;
diff --git a/public/file.svg b/public/file.svg
deleted file mode 100644
index 004145c..0000000
--- a/public/file.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/globe.svg b/public/globe.svg
deleted file mode 100644
index 567f17b..0000000
--- a/public/globe.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/next.svg b/public/next.svg
deleted file mode 100644
index 5174b28..0000000
--- a/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/vercel.svg b/public/vercel.svg
deleted file mode 100644
index 7705396..0000000
--- a/public/vercel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/window.svg b/public/window.svg
deleted file mode 100644
index b2b2a44..0000000
--- a/public/window.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/app/globals.css b/src/app/globals.css
index a2dc41e..1744fdd 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,26 +1,37 @@
@import "tailwindcss";
:root {
- --background: #ffffff;
- --foreground: #171717;
+ --background: #fafaf9;
+ --foreground: #1c1917;
+ --accent: #4f7942;
+ --accent-light: #6b9f5b;
+ --muted: #78716c;
+ --border: #e7e5e4;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
+ --color-accent: var(--accent);
+ --color-accent-light: var(--accent-light);
+ --color-muted: var(--muted);
+ --color-border: var(--border);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
}
@media (prefers-color-scheme: dark) {
:root {
- --background: #0a0a0a;
- --foreground: #ededed;
+ --background: #0c0a09;
+ --foreground: #e7e5e4;
+ --accent: #6b9f5b;
+ --accent-light: #4f7942;
+ --muted: #a8a29e;
+ --border: #292524;
}
}
body {
background: var(--background);
color: var(--foreground);
- font-family: Arial, Helvetica, sans-serif;
}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index f7fa87e..cd92216 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -13,8 +13,17 @@ const geistMono = Geist_Mono({
});
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "Cosmolocal Foundation",
+ description:
+ "Bridging cosmic perspective with local action. The Cosmolocal Foundation supports projects at the intersection of global coordination and community resilience.",
+ openGraph: {
+ title: "Cosmolocal Foundation",
+ description:
+ "Bridging cosmic perspective with local action.",
+ url: "https://cosmolocal.world",
+ siteName: "Cosmolocal Foundation",
+ type: "website",
+ },
};
export default function RootLayout({
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 295f8fd..33c0ff0 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,65 +1,143 @@
-import Image from "next/image";
-
export default function Home() {
return (
-
-
-
-
-
- To get started, edit the page.tsx file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
+
+ {/* Nav */}
+
+
+
+
+ {/* Hero */}
+
+
+ Bridging cosmic perspective
+
+ with local action
+
+
+ The Cosmolocal Foundation supports projects at the intersection of
+ global coordination and community resilience — designing tools,
+ frameworks, and networks for a thriving world.
+
+ The Cosmolocal Foundation is a home for projects working toward
+ planetary coordination, commons-based governance, and regenerative
+ systems. We believe in designing from both the cosmic and the local
+ scale simultaneously — thinking globally while acting in service of
+ real communities.
+
+
+
+
Coordination Tools
+
+ Building open-source tools for collective decision-making,
+ resource allocation, and collaborative governance.
+
+
+
+
Research & Frameworks
+
+ Developing theoretical frameworks that bridge systems thinking,
+ network science, and indigenous knowledge systems.
+
+
+
+
Community Networks
+
+ Connecting practitioners, researchers, and communities working
+ on cosmolocal approaches to shared challenges.
+
+
+
+
+
+
+ {/* Mission */}
+
+
+
Mission
+
+ Our mission is to catalyze the emergence of cosmolocal
+ infrastructure — systems that are globally coordinated yet locally
+ adapted, open-source yet contextually meaningful, and
+ technologically sophisticated yet ecologically grounded.
+
+
+
+
+ {/* Contact */}
+
+
+
+ Get in Touch
+
+
+ Interested in collaborating or learning more about the Cosmolocal
+ Foundation? Reach out to us.
+