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 ( -
-
- Next.js logo -
-

- 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. +

+ -
+ + + {/* About */} +
+
+

+ About the Foundation +

+

+ 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. +

+ + ***REDACTED_EMAIL*** + +
+
+ + {/* Footer */} +
); }