Skip to content

Commit 570ce6d

Browse files
committed
feat(apps): add Morphogenesis — a reaction-diffusion culture
A microscopy-bench toy that grows living Turing patterns from a Gray-Scott reaction-diffusion model. Pick a recipe (Coral, Mitosis, Maze, Spots, Fingerprints, Flow) to set feed/kill rates, choose a stain, and watch the culture evolve in a glass petri dish. Drag to inoculate; Grow/Pause, Reseed, Clear, and Capture a 4× PNG. An empty dish shows an inoculate hint. Engine is a pure Gray-Scott simulation on a wrapped grid (Float32Array, conservative Laplacian) with unit tests. Includes route wiring and a Generators registry entry.
1 parent 48a8e55 commit 570ce6d

5 files changed

Lines changed: 768 additions & 0 deletions

File tree

public/apps/apps.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,14 @@
481481
"icon": "MagicWandIcon",
482482
"order": 3,
483483
"apps": [
484+
{
485+
"slug": "morphogenesis",
486+
"to": "/apps/morphogenesis",
487+
"title": "Morphogenesis",
488+
"description": "Grow living Turing patterns — spots, coral, mazes, fingerprints — from a Gray-Scott reaction-diffusion culture. Inoculate the dish and watch it unfold.",
489+
"icon": "CirclesThreeIcon",
490+
"created_at": "2026-06-08T12:00:00+03:00"
491+
},
484492
{
485493
"slug": "chladni-plate",
486494
"to": "/apps/chladni-plate",

src/components/AnimatedRoutes.jsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const CozyAppPage = lazy(() => import('../pages/apps/CozyAppPage'));
169169
const SpirographPage = lazy(() => import('../pages/apps/SpirographPage'));
170170
const FractalFloraPage = lazy(() => import('../pages/apps/FractalFloraPage'));
171171
const EbruPage = lazy(() => import('../pages/apps/EbruPage'));
172+
const MorphogenesisLabPage = lazy(() => import('../pages/apps/MorphogenesisLabPage'));
172173
const AlchemyLabPage = lazy(() => import('../pages/apps/AlchemyLabPage'));
173174
const CloudMusicPlayerPage = lazy(
174175
() => import('../pages/apps/CloudMusicPlayerPage'),
@@ -3157,6 +3158,22 @@ const AnimatedRoutes = ({
31573158
</motion.div>
31583159
}
31593160
/>
3161+
<Route
3162+
path="/apps/morphogenesis"
3163+
element={
3164+
<motion.div
3165+
initial="initial"
3166+
animate="in"
3167+
exit="out"
3168+
variants={pageVariants}
3169+
transition={pageTransition}
3170+
>
3171+
<Suspense fallback={<Loading />}>
3172+
<MorphogenesisLabPage />
3173+
</Suspense>
3174+
</motion.div>
3175+
}
3176+
/>
31603177
<Route
31613178
path="/apps/alchemy-lab"
31623179
element={

0 commit comments

Comments
 (0)