+
{v.name}
{v.pitch}
+ {/* Visible label for the card-wide link below. */} + + Explore venture + +diff --git a/Dockerfile b/Dockerfile
index eae7533..07c4d23 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,8 @@
+# Node 24 to match local development: package-lock.json written by a local `npm install`
+# (npm 11) must also pass `npm ci` here, or the build fails with "lock file out of sync".
+
# 1. Build Stage
-FROM node:22-alpine AS build
+FROM node:24-alpine AS build
WORKDIR /app
@@ -7,7 +10,7 @@ WORKDIR /app
COPY package*.json ./
# Install dependencies
-RUN npm ci
+RUN npm ci --no-audit --no-fund
# Copy source code
COPY . .
@@ -16,17 +19,24 @@ COPY . .
RUN NITRO_PRESET=node-server npm run build
# 2. Production Stage
-FROM node:22-alpine
+FROM node:24-alpine
WORKDIR /app
-# Copy built output from build stage
-COPY --from=build /app/.output ./.output
-
-EXPOSE 3000
-
ENV NODE_ENV=production
ENV PORT=3000
ENV HOST=0.0.0.0
+# The Nitro output is self-contained (dependencies are bundled), so nothing else is copied.
+COPY --from=build --chown=node:node /app/.output ./.output
+
+# Run as the image's unprivileged user rather than root.
+USER node
+
+EXPOSE 3000
+
+# Lets Dokploy/Docker see when the server is actually answering requests.
+HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
+ CMD wget -qO- http://127.0.0.1:3000/ >/dev/null || exit 1
+
CMD ["node", ".output/server/index.mjs"]
diff --git a/src/assets/cards/CREDITS.md b/src/assets/cards/CREDITS.md
index 64bf069..9dde0a4 100644
--- a/src/assets/cards/CREDITS.md
+++ b/src/assets/cards/CREDITS.md
@@ -4,16 +4,16 @@ All photos are from [Unsplash](https://unsplash.com) under the
[Unsplash License](https://unsplash.com/license) (free for commercial use, no attribution
required; credited here anyway). Resized to 1200px WebP.
-| File | Photographer | Unsplash photo |
-| ---------------------- | ------------------ | --------------------------------------- |
-| `studio-foundry.webp` | Morteza Mohammadi | https://unsplash.com/photos/ZLzkwU49BdY |
-| `holding-tower.webp` | Verne Ho | https://unsplash.com/photos/0LAJfSNa-xQ |
-| `compound-spiral.webp` | Jean-Luc Benazet | https://unsplash.com/photos/dLpP34ADQPI |
-| `ai-vision.webp` | Yael Yañez | https://unsplash.com/photos/jw245ZR2lz4 |
-| `ai-agentic.webp` | Gabriele Malaspina | https://unsplash.com/photos/CjWsslYVnPI |
-| `ai-enterprise.webp` | Winston Chen | https://unsplash.com/photos/iZe21DzHnUg |
-| `ai-predictive.webp` | Tötös Ádám | https://unsplash.com/photos/3r8rcSy0Ffg |
-| `ai-llm.webp` | Andrew Seaman | https://unsplash.com/photos/-m88z7ily-w |
-| `ai-automation.webp` | Simon Kadula | https://unsplash.com/photos/8gr6bObQLOI |
-| `ai-multiagent.webp` | James Wainscoat | https://unsplash.com/photos/b7MZ6iGIoSI |
-| `ai-decision.webp` | Hassan Pasha | https://unsplash.com/photos/7SjEuEF06Zw |
+| File | Photographer | Unsplash photo |
+| ----------------------------- | ------------------ | --------------------------------------- |
+| `pillar-studio-team.webp` | Annie Spratt | https://unsplash.com/photos/MChSQHxGZrQ |
+| `pillar-holding-hq.webp` | Juzzepo | https://unsplash.com/photos/vcee2hRsjl0 |
+| `pillar-compound-growth.webp` | Carlos Muza | https://unsplash.com/photos/hpjSkU2UYSU |
+| `ai-vision.webp` | Yael Yañez | https://unsplash.com/photos/jw245ZR2lz4 |
+| `ai-agentic.webp` | Gabriele Malaspina | https://unsplash.com/photos/CjWsslYVnPI |
+| `ai-enterprise.webp` | Winston Chen | https://unsplash.com/photos/iZe21DzHnUg |
+| `ai-predictive.webp` | Tötös Ádám | https://unsplash.com/photos/3r8rcSy0Ffg |
+| `ai-llm.webp` | Andrew Seaman | https://unsplash.com/photos/-m88z7ily-w |
+| `ai-automation.webp` | Simon Kadula | https://unsplash.com/photos/8gr6bObQLOI |
+| `ai-multiagent.webp` | James Wainscoat | https://unsplash.com/photos/b7MZ6iGIoSI |
+| `ai-decision.webp` | Hassan Pasha | https://unsplash.com/photos/7SjEuEF06Zw |
diff --git a/src/assets/cards/compound-spiral.webp b/src/assets/cards/compound-spiral.webp
deleted file mode 100644
index d8b1d80..0000000
Binary files a/src/assets/cards/compound-spiral.webp and /dev/null differ
diff --git a/src/assets/cards/holding-tower.webp b/src/assets/cards/holding-tower.webp
deleted file mode 100644
index 0f04194..0000000
Binary files a/src/assets/cards/holding-tower.webp and /dev/null differ
diff --git a/src/assets/cards/pillar-compound-growth.webp b/src/assets/cards/pillar-compound-growth.webp
new file mode 100644
index 0000000..4044ddd
Binary files /dev/null and b/src/assets/cards/pillar-compound-growth.webp differ
diff --git a/src/assets/cards/pillar-holding-hq.webp b/src/assets/cards/pillar-holding-hq.webp
new file mode 100644
index 0000000..ce9973c
Binary files /dev/null and b/src/assets/cards/pillar-holding-hq.webp differ
diff --git a/src/assets/cards/pillar-studio-team.webp b/src/assets/cards/pillar-studio-team.webp
new file mode 100644
index 0000000..b15c903
Binary files /dev/null and b/src/assets/cards/pillar-studio-team.webp differ
diff --git a/src/assets/cards/studio-foundry.webp b/src/assets/cards/studio-foundry.webp
deleted file mode 100644
index 6aea158..0000000
Binary files a/src/assets/cards/studio-foundry.webp and /dev/null differ
diff --git a/src/assets/sections/CREDITS.md b/src/assets/sections/CREDITS.md
index 6d5f095..bcd4f88 100644
--- a/src/assets/sections/CREDITS.md
+++ b/src/assets/sections/CREDITS.md
@@ -12,21 +12,21 @@ required; credited here anyway). Resized WebP.
| `stage-launch.webp` | SpaceX | https://unsplash.com/photos/TV2gg2kZD1o |
| `stage-scale.webp` | Mara F | https://unsplash.com/photos/tZdFQvqJuQQ |
| `stage-spinoff.webp` | Curioso Photography | https://unsplash.com/photos/OOiygaquXZs |
-| `stack-engineering.webp` | Manuel | https://unsplash.com/photos/CANL3bzp6wU |
+| `stack-engineering.webp` | Peaky Frames | https://unsplash.com/photos/GAoGLvYLt3c |
| `stack-design.webp` | Amélie Mourichon | https://unsplash.com/photos/sv8oOQaUb-o |
-| `stack-cloud.webp` | Rebecca Campbell | https://unsplash.com/photos/5nN9NX6dJxc |
+| `stack-cloud.webp` | Eric Stoynov | https://unsplash.com/photos/UfR_yqIcd4g |
| `stack-legal.webp` | Sasun Bughdaryan | https://unsplash.com/photos/qVOJqYI37qE |
| `stack-finance.webp` | Kelly Sikkema | https://unsplash.com/photos/M98NRBuzbpc |
| `stack-marketing.webp` | Kayle Kaupanger | https://unsplash.com/photos/GVi0ijl8ExM |
| `stack-sales.webp` | Rock Staar | https://unsplash.com/photos/NzIV4vOBA7s |
| `stack-growth.webp` | Sable Flow | https://unsplash.com/photos/T74mVg__F_k |
-| `stack-data.webp` | Luke Chesser | https://unsplash.com/photos/JKUTrJ4vK00 |
+| `stack-data.webp` | Resource Database | https://unsplash.com/photos/TIUyoNGM0no |
| `stack-governance.webp` | Danielle Cerullo | https://unsplash.com/photos/bIZJRVBLfOM |
| `vision-city.webp` | Pradeep Gopal (Bengaluru) | https://unsplash.com/photos/4J3CHmrFiIg |
| `investors-skyline.webp` | Himmel S | https://unsplash.com/photos/Io1lz5bZ0as |
| `principle-evidence.webp` | Mika Baumeister | https://unsplash.com/photos/Wpnoqo2plFA |
| `principle-engine.webp` | Nikita Turkovich | https://unsplash.com/photos/ioxS2dYRiJw |
| `principle-standalone.webp` | Nathan Jennings | https://unsplash.com/photos/VsPsf4F5Pi0 |
-| `model-build.webp` | Art Institute of Chicago | https://unsplash.com/photos/sAlWjm2huck |
+| `model-build.webp` | Lucas Kepner | https://unsplash.com/photos/Yn8D5B8C-eY |
| `model-spinoff.webp` | Markus Spiske | https://unsplash.com/photos/vrbZVyX2k4I |
| `model-compound.webp` | Marek Studzinski | https://unsplash.com/photos/tnT54YSnlL0 |
diff --git a/src/assets/sections/model-build.webp b/src/assets/sections/model-build.webp
index ba0a400..f2e5a99 100644
Binary files a/src/assets/sections/model-build.webp and b/src/assets/sections/model-build.webp differ
diff --git a/src/assets/sections/stack-cloud.webp b/src/assets/sections/stack-cloud.webp
index 4f8d6c3..2dcc95f 100644
Binary files a/src/assets/sections/stack-cloud.webp and b/src/assets/sections/stack-cloud.webp differ
diff --git a/src/assets/sections/stack-data.webp b/src/assets/sections/stack-data.webp
index f651675..2e1954f 100644
Binary files a/src/assets/sections/stack-data.webp and b/src/assets/sections/stack-data.webp differ
diff --git a/src/assets/sections/stack-engineering.webp b/src/assets/sections/stack-engineering.webp
index 55886b4..6c64ef5 100644
Binary files a/src/assets/sections/stack-engineering.webp and b/src/assets/sections/stack-engineering.webp differ
diff --git a/src/components/site/cropsphere.tsx b/src/components/site/cropsphere.tsx
new file mode 100644
index 0000000..d1b6c7d
--- /dev/null
+++ b/src/components/site/cropsphere.tsx
@@ -0,0 +1,766 @@
+import { useEffect, useRef, useState, type CSSProperties, type ReactNode } from "react";
+import {
+ ArrowDown,
+ ArrowRight,
+ BrainCircuit,
+ Coins,
+ Database,
+ Globe,
+ Recycle,
+ ShoppingBasket,
+ Sprout,
+ Store,
+ User,
+ Wheat,
+ type LucideIcon,
+} from "lucide-react";
+import {
+ Accent,
+ EASE_STAGE,
+ FillWords,
+ SectionHeader,
+ reveal,
+ usePinnedLayout,
+} from "@/components/site/sections";
+
+// Cropsphere's story, adapted from the founding team's own description. Plans and potential
+// revenue are worded as such; nothing here claims traction.
+
+const CHAIN = ["Farm", "Food", "Consumer", "Regeneration"];
+
+const LAYERS: { layer: string; product: string; role: string; icon: LucideIcon }[] = [
+ {
+ layer: "Agriculture",
+ product: "HarvestHQ",
+ role: "An AI + IoT agricultural operating system.",
+ icon: Sprout,
+ },
+ {
+ layer: "Commerce",
+ product: "Cropsphere Produce",
+ role: "A traceable farm-to-consumer marketplace.",
+ icon: ShoppingBasket,
+ },
+ {
+ layer: "Regeneration",
+ product: "O-Points",
+ role: "Rewards and measures regenerative actions.",
+ icon: Recycle,
+ },
+ {
+ layer: "Consumer",
+ product: "Living",
+ role: "The physical consumer and retail experience layer.",
+ icon: Store,
+ },
+];
+
+/** Section 1: what Cropsphere is, and the four layers it connects. */
+function Overview() {
+ return (
+
+ Cropsphere is an integrated regenerative-agriculture operating ecosystem. It connects
+ four things that operate separately today:
+
+ {l.role}
+
+ {CHAIN.map((c, i) => (
+
+
+
+ Use technology to make farming more intelligent, make food more traceable, and make
+ regenerative actions economically valuable.
+
+
+
+ Four layers, one system.
+
+
+ Regenerative Agri Operating Ecosystem (RAOE)
+
+
+ {LAYERS.map((l, i) => {
+ const Icon = l.icon;
+ return (
+
+
+ Farmers and landowners join the Cropsphere network. HarvestHQ gathers what each farm needs + to be understood, combining AI, IoT, satellite and farm-level data to support agricultural + decisions. +
+The intelligence layer, across the whole season:
++ A farmer has two acres. Instead of only asking “What should I grow?”, HarvestHQ can + analyse the farm's information and help work out{" "} + + what to grow, how to grow it, how much input to use, the expected yield and the likely + market demand. + +
++ The long-term vision is to move from advice alone to an operating system that connects + recommendations with execution and automation. +
+ > + ), + }, + { + n: "03", + title: "Cropsphere Produce takes it to market", + product: "Cropsphere Produce", + body: ( + <> +Once production is connected, the next question is where the produce goes.
++ With digital traceability, a consumer could see which farm, what was grown and how, right + through to purchase. The marketplace can support subscriptions, quick commerce, standard + e-commerce, farm experiences and institutional or B2B supply. +
+ > + ), + }, + { + n: "04", + title: "O-Points rewards regeneration", + product: "O-Points", + body: ( + <> ++ Whenever people take part in regenerative activity, they can earn O-Points, turning + otherwise invisible environmental actions into a measurable, digital layer of + participation. +
++ Behind it: reward logic, verification, a ledger and wallet, and over time a mechanism for + aggregating carbon value. +
+ > + ), + }, + { + n: "05", + title: "Living brings it to the consumer", + product: "Living", + body: ( + <> ++ Living is Cropsphere's physical, offline layer: hubs, product sampling, farm experiences, + wellness and consumer engagement. Its first touchpoint is a vending-machine network in + tier-1 and tier-2 cities. +
++ Not merely a vending machine: revenue, brand, customer acquisition and an entry point to + the ecosystem, in one. +
+ > + ), + }, +]; + +/** Section 2: the five steps, each pinned beside its number as you scroll. */ +function HowItWorks() { + return ( +Four products, one flywheel. Here is the path from a farm to a consumer and back.
++ Cropsphere is a flywheel, not four separate products. Better farming creates better + food; engaged consumers create data and revenue; regenerative activity creates + measurable environmental value, and all of it brings more farms in. +
+ {pinned ? ( ++ {current.desc} +
++ A multi-layer revenue architecture rather than a business that depends on selling + software alone. Potential revenue streams: +
+
+
+ The result is a closed loop: better farming creates better food, better consumer + engagement creates more data and revenue, and regenerative activity creates measurable + environmental value. +
+A first look at companies being engineered on the KapFoundry engine.
-{v.pitch}
+ {/* Visible label for the card-wide link below. */} + + Explore venture + ++ {v.name} is being built for a market held back by the same problems, again and + again. +
++ Where KapFoundry focuses in {v.vertical.toLowerCase()}, and the ground {v.name} is + built on. +
++ Like every venture in the studio, {v.name} moves through the same six stages and + launches with a mature company's stack. +
+{f.body}
++ Partners, investors and operators: we'd like to hear from you. +
+ + Speak with our team +{next.pitch}
+